diff --git a/frontend/src/pages/wiki2/editor-component/page-header.jsx b/frontend/src/pages/wiki2/editor-component/page-header.jsx
index 8382a7562e..0258e2f7eb 100644
--- a/frontend/src/pages/wiki2/editor-component/page-header.jsx
+++ b/frontend/src/pages/wiki2/editor-component/page-header.jsx
@@ -17,7 +17,13 @@ const propTypes = {
const PageHeader = ({ currentPageConfig, onUpdatePage }) => {
const [isShowController, setIsShowController] = useState(false);
const [isShowIconPanel, setIsShowIconPanel] = useState(false);
+ const [isShowCoverController, setIsShowCoverController] = useState(false);
+ const [isShowCoverPanel, setIsShowCoverPanel] = useState(false);
+ const [coverImgUrl, setCoverImgUrl] = useState('');
const iconPanelPopoverRef = useRef(null);
+ const coverPanelPopoverRef = useRef(null);
+
+ // currentPageConfig.coverImgUrl = 'https://img2.baidu.com/it/u=2061573580,1495285204&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500';
console.log('currentPageConfig', currentPageConfig);
@@ -50,6 +56,7 @@ const PageHeader = ({ currentPageConfig, onUpdatePage }) => {
const handleIconPanelDisplayedChange = useCallback(() => {
setIsShowIconPanel(!isShowIconPanel);
+ setIsShowCoverPanel(false);
}, [isShowIconPanel]);
const handleClickAddIcon = useCallback(() => {
@@ -62,6 +69,16 @@ const PageHeader = ({ currentPageConfig, onUpdatePage }) => {
if (!isClickInPopover) handleIconPanelDisplayedChange();
}, [handleIconPanelDisplayedChange]);
+ const handleCoverPanelDisplayedChange = useCallback(() => {
+ setIsShowCoverPanel(!isShowCoverPanel);
+ setIsShowIconPanel(false);
+ }, [isShowCoverPanel]);
+
+ const handleCoverPanelListener = useCallback((e) => {
+ const isClickInPopover = coverPanelPopoverRef.current.contains(e.target);
+ if (!isClickInPopover) handleCoverPanelDisplayedChange();
+ }, [handleCoverPanelDisplayedChange]);
+
// Update current page favicon
useEffect(() => {
let faviconUrl = '';
@@ -82,35 +99,97 @@ const PageHeader = ({ currentPageConfig, onUpdatePage }) => {
}, 0);
}
if (!isShowIconPanel) removeEventListener('click', handleIconPanelListener);
+ if (isShowCoverPanel) {
+ setTimeout(() => {
+ // Avoid open behavior closing popover
+ addEventListener('click', handleCoverPanelListener);
+ }, 0);
+ }
+ if (!isShowCoverPanel) removeEventListener('click', handleCoverPanelListener);
return () => {
removeEventListener('click', handleIconPanelListener);
+ removeEventListener('click', handleCoverPanelListener);
};
- }, [handleIconPanelListener, isShowIconPanel]);
+ }, [handleCoverPanelListener, handleIconPanelListener, isShowCoverPanel, isShowIconPanel]);
const handleIconRemove = () => {
handleSetIcon('');
handleIconPanelDisplayedChange();
-
};
const handleAddCover = useCallback(() => { }, []);
+ const showCoverController = useCallback(() => {
+ setIsShowCoverController(true);
+ }, []);
+ const hideCoverController = useCallback(() => {
+ setIsShowCoverController(false);
+ }, []);
+
+
+
+ const handleSetCoverImage = (e) => {
+ // TODO set cover image
+ setCoverImgUrl(e.target.src);
+ handleCoverPanelDisplayedChange();
+ };
return (
-
+ {currentPageConfig.coverImgUrl && (
+
+

+ {isShowCoverController && (
+
+
{gettext('Change cover')}
+
void 0}
+ placement="bottom"
+ isOpen={isShowCoverPanel && currentPageConfig.coverImgUrl}
+ innerClassName='wiki-cover-panel'
+ hideArrow={true}
+ popperClassName='wiki-cover-popover'
+ >
+
+
+
+ )}
+
+
+ )}
-
-
+
{currentPageConfig.icon}
@@ -120,8 +199,8 @@ const PageHeader = ({ currentPageConfig, onUpdatePage }) => {
target="wiki-icon-wrapper"
toggle={() => void 0}
placement="bottom"
- isOpen={currentPageConfig.icon && isShowIconPanel}
- innerClassName='wiki-icon-panel'
+ isOpen={isShowIconPanel && currentPageConfig.icon}
+ popperClassName='wiki-icon-popover'
hideArrow={true}
>
@@ -148,13 +227,16 @@ const PageHeader = ({ currentPageConfig, onUpdatePage }) => {
{gettext('Add icon')}
)}
-
-
- {gettext('Add cover')}
-
+ {!currentPageConfig.coverImgUrl && (
+
+
+ {gettext('Add cover')}
+
+ )}
+
);
diff --git a/frontend/src/pages/wiki2/wiki.css b/frontend/src/pages/wiki2/wiki.css
index 6de7a91e07..5f90a20088 100644
--- a/frontend/src/pages/wiki2/wiki.css
+++ b/frontend/src/pages/wiki2/wiki.css
@@ -246,12 +246,6 @@ img[src=""] {
font-size: 26pt;
}
-.cur-view-content .wiki-cover {
- height: 30vh;
- width: 100%;
- background-color: aqua;
-}
-
.cur-view-content .wiki-editor-container {
display: flex;
flex-direction: column;
@@ -266,6 +260,7 @@ img[src=""] {
position: static;
}
+/* wiki page header */
.wiki-page-controller {
display: flex;
visibility: hidden;
@@ -288,12 +283,18 @@ img[src=""] {
line-height: 78px;
}
+.wiki-icon-container.gap {
+ margin-top: 60px;
+}
+
.wiki-icon-wrapper {
display: none;
margin-top: -48px;
+ position: relative;
width: 78px;
height: 78px;
font-size: 78px;
+ z-index: 1;
}
.wiki-icon-wrapper:hover {
@@ -314,9 +315,9 @@ img[src=""] {
border-radius: 4px;
}
-.wiki-icon-panel {
- width: 352px;
- height: 435px;
+/* Icon */
+.wiki-icon-popover {
+ max-width: max-content;
}
.wiki-icon-panel-header {
@@ -339,10 +340,60 @@ img[src=""] {
.wiki-icon-panel-body {
padding: 0;
- width: 352px;
background-color: #fff;
}
-.wiki-icon-panel-body div {
+/* Cover */
+.cur-view-content .wiki-cover {
+ position: relative;
+ height: 30vh;
width: 100%;
}
+
+.cur-view-content .wiki-cover .wiki-cover-img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.wiki-cover .wiki-cover-controller {
+ position: absolute;
+ top: 15px;
+ right: 20%;
+}
+
+.wiki-cover .wiki-cover-controller .wiki-cover-controller-btn {
+ padding: 4px 6px;
+ background-color: #fff;
+ border-radius: 4px;
+ font-size: 12px;
+ color: #6a6767b3;
+ cursor: pointer;
+}
+
+.wiki-cover .wiki-cover-controller .wiki-cover-controller-btn:hover {
+ color: #4d5156;
+}
+
+.wiki-cover-popover {
+ max-width: max-content !important;
+}
+
+.wiki-cover-panel-body {
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr 1fr;
+ gap: 10px;
+ background-color: #fff;
+ overflow-y: auto;
+}
+
+.wiki-cover-panel .wiki-cover-gallery-img {
+ width: 120px;
+ height: 64px;
+ cursor: pointer;
+
+}
+
+.wiki-cover-panel .wiki-cover-gallery-img:hover {
+ filter: brightness(1.1);
+}