From 304efde162c136c52cc77dfb12c5f6fed9833205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=B0=B8=E5=BC=BA?= <11704063+s-yongqiang@user.noreply.gitee.com> Date: Thu, 20 Mar 2025 14:03:24 +0800 Subject: [PATCH] freeze wiki page --- frontend/src/pages/wiki2/index.js | 34 +++++ frontend/src/pages/wiki2/main-panel.js | 127 +++++++++++++++++- frontend/src/pages/wiki2/models/page.js | 1 + frontend/src/pages/wiki2/top-nav/index.js | 57 +++++++- frontend/src/pages/wiki2/utils/index.js | 6 + .../pages/wiki2/wiki-nav/pages/page-item.js | 3 +- frontend/src/pages/wiki2/wiki.css | 21 +++ frontend/src/utils/wiki-api.js | 8 ++ seahub/api2/endpoints/wiki2.py | 78 ++++++++++- 9 files changed, 322 insertions(+), 13 deletions(-) diff --git a/frontend/src/pages/wiki2/index.js b/frontend/src/pages/wiki2/index.js index a647505b24..5553ec41bd 100644 --- a/frontend/src/pages/wiki2/index.js +++ b/frontend/src/pages/wiki2/index.js @@ -40,6 +40,7 @@ class Wiki extends Component { permission: '', isConfigLoading: true, currentPageId: '', + currentPageLocked: false, config: new WikiConfig({}), repoId: '', seadoc_access_token: '', @@ -154,6 +155,34 @@ class Wiki extends Component { }); }, 1000); + updatePageLockedToServer = (pageId, locked) => { + wikiAPI.updateWiki2PageLocked(wikiId, pageId, locked).then(res => { + this.setState(prevState => { + // 更新 wikiConfig 中的 pages + const updatedPages = prevState.config.pages.map(page => { + if (page.id === pageId) { + return { + ...page, + locked: !prevState.currentPageLocked + }; + } + return page; + }); + + return { + currentPageLocked: !prevState.currentPageLocked, + config: new WikiConfig({ + ...prevState.config, + pages: updatedPages + }) + }; + }); + }).catch((error) => { + let errorMsg = Utils.getErrorMsg(error); + toaster.danger(errorMsg); + }); + }; + saveWikiConfig = (wikiConfig, isUpdateBySide = false) => { this.setState({ config: new WikiConfig(wikiConfig), @@ -215,6 +244,7 @@ class Wiki extends Component { } else { getWikiPage = wikiAPI.getWiki2Page(wikiId, pageId); } + // TODO: fix wiki2 page locked getWikiPage.then(res => { const { permission, seadoc_access_token, assets_url } = res.data; this.setState({ @@ -222,6 +252,7 @@ class Wiki extends Component { seadoc_access_token, assets_url, path: filePath, + // currentPageLocked: res.data.is_freezed, }); const docUuid = assets_url.slice(assets_url.lastIndexOf('/') + 1); this.getSdocFileContent(docUuid, seadoc_access_token); @@ -281,6 +312,7 @@ class Wiki extends Component { this.setState({ currentPageId: pageId, path: path, + currentPageLocked: currentPage.locked, }, () => { callback && callback(); eventBus.dispatch('update-wiki-current-page'); @@ -408,6 +440,8 @@ class Wiki extends Component { seadoc_access_token={this.state.seadoc_access_token} assets_url={this.state.assets_url} onUpdatePage={this.onUpdatePage} + currentPageLocked={this.state.currentPageLocked} + updatePageLockedToServer={this.updatePageLockedToServer} setCurrentPage={this.setCurrentPage} isUpdateBySide={this.state.isUpdateBySide} style={mainPanelStyle} diff --git a/frontend/src/pages/wiki2/main-panel.js b/frontend/src/pages/wiki2/main-panel.js index fc824c574e..fd81c409aa 100644 --- a/frontend/src/pages/wiki2/main-panel.js +++ b/frontend/src/pages/wiki2/main-panel.js @@ -1,12 +1,16 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import { Dropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap'; import { SdocWikiEditor, DocInfo } from '@seafile/sdoc-editor'; import { gettext, username, wikiPermission, wikiId, siteRoot } from '../../utils/constants'; +import TextTranslation from '../../utils/text-translation'; +import Switch from '../../components/switch'; +import toaster from '../../components/toast'; import Loading from '../../components/loading'; import { Utils } from '../../utils/utils'; import Account from '../../components/common/account'; import WikiTopNav from './top-nav'; -import { getCurrentPageConfig } from './utils'; +import { getCurrentPageConfig, getCurrentPageLocked } from './utils'; import RightHeader from './wiki-right-header'; const propTypes = { @@ -22,6 +26,8 @@ const propTypes = { currentPageId: PropTypes.string, isUpdateBySide: PropTypes.bool, onUpdatePage: PropTypes.func, + updatePageLockedToServer: PropTypes.func, + currentPageLocked: PropTypes.bool, onAddWikiPage: PropTypes.func, style: PropTypes.object.isRequired, mobileOpenSidePanel: PropTypes.func.isRequired @@ -34,6 +40,7 @@ class MainPanel extends Component { this.state = { docUuid: '', currentPageConfig: {}, + isDropdownMenuOpen: false, }; this.scrollRef = React.createRef(); } @@ -64,11 +71,81 @@ class MainPanel extends Component { window.location.href = `${siteRoot}wiki/file_revisions/${wikiId}/?page_id=${this.state.currentPageConfig.id}`; }; + toggleDropdownMenu = () => { + this.setState({ + isDropdownMenuOpen: !this.state.isDropdownMenuOpen + }); + }; + + getMenu = () => { + const list = []; + if (wikiPermission === 'rw' && this.state.currentPageConfig) { + const { HISTORY, FREEZE_DOCUMENT } = TextTranslation; + list.push(FREEZE_DOCUMENT); + list.push(HISTORY); + } + return list; + }; + + onMenuItemClick = (item) => { + const { key } = item; + switch (key) { + case 'History': + this.openHistory(); + break; + } + }; + + onMenuItemKeyDown = (e, item) => { + if (e.key == 'Enter' || e.key == 'Space') { + this.onMenuItemClick(item); + } + }; + + toggleFreezeStatus = () => { + // console.log(this.state.currentPageConfig.locked, '----currentPageConfig.locked') + console.log(!this.props.currentPageLocked, '----currentPageLocked'); + this.props.updatePageLockedToServer(this.state.currentPageConfig.id, !this.props.currentPageLocked); + // this.setState({ + // locked: !this.state.locked + // }, () => { + // console.log(this.state.locked, '----locked') + // }); + + }; + + toggleLockFile = () => { + // if (this.state.isLocked) { + // seafileAPI.unlockfile(repoID, filePath).then((res) => { + // this.setState({ + // isLocked: false, + // lockedByMe: false + // }); + // }).catch((error) => { + // const errorMsg = Utils.getErrorMsg(error); + // toaster.danger(errorMsg); + // }); + // } else { + // seafileAPI.lockfile(repoID, filePath).then((res) => { + // this.setState({ + // isLocked: true, + // lockedByMe: true + // }); + // }).catch((error) => { + // const errorMsg = Utils.getErrorMsg(error); + // toaster.danger(errorMsg); + // }); + // } + }; + render() { - const { permission, pathExist, isDataLoading, config, onUpdatePage, isUpdateBySide, style } = this.props; - const { currentPageConfig = {} } = this.state; + // console.log(this.state.currentPageConfig) + const menuItems = this.getMenu(); + const { permission, pathExist, isDataLoading, config, onUpdatePage, isUpdateBySide, style, currentPageLocked } = this.props; + const { currentPageConfig = {}, isDropdownMenuOpen } = this.state; const isViewingFile = pathExist && !isDataLoading; const isReadOnly = !(permission === 'rw'); + console.log(currentPageLocked, '----currentPageLocked'); return (
@@ -86,6 +163,7 @@ class MainPanel extends Component { currentPageId={this.props.currentPageId} currentPageConfig={currentPageConfig} setCurrentPage={this.props.setCurrentPage} + toggleLockFile={this.toggleLockFile} /> {isViewingFile && @@ -93,11 +171,50 @@ class MainPanel extends Component {
- {(wikiPermission === 'rw' && this.state.currentPageConfig) && + {menuItems.length > 0 && + + + + + {menuItems.map((menuItem, index) => { + if (menuItem.key === 'Freeze Document') { + return ; + } else { + return ( + {menuItem.value} + + ); + } + })} + + + } + {/* {(wikiPermission === 'rw' && this.state.currentPageConfig) &&