1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-02 07:27:04 +00:00

Update wiki page (#6298)

* add wiki page

* delete wiki page

* update

* move wiki page

* optimize code

* update

* fix code format

change error message

---------

Co-authored-by: 孙永强 <11704063+s-yongqiang@user.noreply.gitee.com>
Co-authored-by: Michael An <2331806369@qq.com>
This commit is contained in:
awu0403
2024-07-15 13:46:05 +08:00
committed by GitHub
parent 6d4e06b571
commit f12358edd1
9 changed files with 244 additions and 53 deletions

View File

@@ -7,8 +7,8 @@ import toaster from '../../components/toast';
import Loading from '../../components/loading';
import WikiNav from './wiki-nav/index';
import PageUtils from './wiki-nav/page-utils';
import { generateUniqueId, isObjectNotEmpty } from './utils';
import Page from './models/page';
import { isObjectNotEmpty } from './utils';
import wikiAPI from '../../utils/wiki-api';
import { Utils } from '../../utils/utils';
import WikiExternalOperations from './wiki-external-operations';
@@ -36,13 +36,16 @@ class SidePanel extends Component {
confirmDeletePage = (pageId) => {
const config = deepCopy(this.props.config);
const { pages, navigation } = config;
const { pages } = config;
const index = PageUtils.getPageIndexById(pageId, pages);
config.pages.splice(index, 1);
PageUtils.deletePage(navigation, pageId);
this.props.saveWikiConfig(config);
// TODO: delete a page, then delete all subpages
wikiAPI.deleteWiki2Page(wikiId, pageId);
// TODO: To delete a page, do you need to delete all subpages at onceupdate PageUtils delete a page)
wikiAPI.deleteWiki2Page(wikiId, pageId).then((res) => {
this.props.updateWikiConfig(config);
}).catch((error) => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
});
if (config.pages.length > 0) {
this.props.setCurrentPage(config.pages[0].id);
} else {
@@ -50,19 +53,13 @@ class SidePanel extends Component {
}
};
addPageInside = async ({ parentPageId, name, icon, path, docUuid, successCallback, errorCallback }) => {
const { config } = this.props;
const navigation = config.navigation;
const pageId = generateUniqueId(navigation);
const newPage = new Page({ id: pageId, name, icon, path, docUuid });
addPageInside = async ({ parentPageId, page_id, name, icon, path, docUuid, successCallback, errorCallback}) => {
const newPage = new Page({ id: page_id, name, icon, path, docUuid });
this.addPage(newPage, parentPageId, successCallback, errorCallback);
};
onAddNewPage = async ({ name, icon, path, docUuid, successCallback, errorCallback, jumpToNewPage = true }) => {
const { config } = this.props;
const navigation = config.navigation;
const pageId = generateUniqueId(navigation);
const newPage = new Page({ id: pageId, name, icon, path, docUuid });
onAddNewPage = async ({ name, icon, path, page_id, docUuid, successCallback, errorCallback, jumpToNewPage = true }) => {
const newPage = new Page({ id: page_id, name, icon, path, docUuid });
this.addPage(newPage, '', successCallback, errorCallback, jumpToNewPage);
};
@@ -86,11 +83,10 @@ class SidePanel extends Component {
config.pages.push(page);
PageUtils.addPage(navigation, pageId, parentId);
config.navigation = navigation;
const onSuccess = () => {
jumpToNewPage && this.props.setCurrentPage(pageId, successCallback);
successCallback();
};
this.props.saveWikiConfig(config, onSuccess, errorCallback);
JSON.stringify(config);
this.props.updateWikiConfig(config);
jumpToNewPage && this.props.setCurrentPage(pageId, successCallback);
successCallback && successCallback();
};
movePage = ({ moved_page_id, target_page_id, move_position }) => {
@@ -98,7 +94,8 @@ class SidePanel extends Component {
let { navigation } = config;
PageUtils.movePage(navigation, moved_page_id, target_page_id, move_position);
config.navigation = navigation;
this.props.saveWikiConfig(config);
JSON.stringify(config);
this.props.updateWikiConfig(config);
};
renderWikiNav = () => {
@@ -115,6 +112,7 @@ class SidePanel extends Component {
onUpdatePage={onUpdatePage}
setCurrentPage={this.props.setCurrentPage}
onMovePage={this.movePage}
updateWikiConfig={this.props.updateWikiConfig}
onAddNewPage={this.onAddNewPage}
duplicatePage={this.duplicatePage}
currentPageId={this.props.currentPageId}
@@ -129,8 +127,9 @@ class SidePanel extends Component {
handleAddNewPage = (jumpToNewPage = true, pageName = 'Untitled') => {
const voidFn = () => void 0;
wikiAPI.createWiki2Page(wikiId, pageName).then(res => {
const { obj_name, parent_dir, doc_uuid, page_name } = res.data;
const { page_id, obj_name, doc_uuid, parent_dir, page_name } = res.data.file_info;
this.onAddNewPage({
page_id: page_id,
name: page_name,
icon: '',
path: parent_dir === '/' ? `/${obj_name}` : `${parent_dir}/${obj_name}`,
@@ -142,7 +141,6 @@ class SidePanel extends Component {
}).catch((error) => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
this.onError();
});
};

View File

@@ -13,6 +13,7 @@ const propTypes = {
title: PropTypes.node,
toggle: PropTypes.func.isRequired,
onAddNewPage: PropTypes.func,
currentPageId: PropTypes.string,
};
@@ -70,9 +71,10 @@ class AddNewPageDialog extends React.Component {
};
createPage = (pageName) => {
wikiAPI.createWiki2Page(wikiId, pageName).then(res => {
const { obj_name, parent_dir, doc_uuid } = res.data;
wikiAPI.createWiki2Page(wikiId, pageName, this.props.currentPageId).then(res => {
const { page_id, obj_name, doc_uuid, parent_dir } = res.data.file_info;
this.props.onAddNewPage({
page_id: page_id,
name: pageName,
icon: '',
path: parent_dir === '/' ? `/${obj_name}` : `${parent_dir}/${obj_name}`,

View File

@@ -103,11 +103,16 @@ export default class PageUtils {
}
function _insertPageRecursion(item, page_id, target_page_id, target_id, move_position) {
if (item.id === target_id) {
let insertIndex = target_page_id ? item.children.findIndex(item => item.id === target_page_id) : -1;
if (move_position === 'move_below') {
insertIndex++;
if (item.children) {
let insertIndex = target_page_id ? item.children.findIndex(item => item.id === target_page_id) : -1;
if (move_position === 'move_below') {
insertIndex++;
}
item.children.splice(insertIndex, 0, movedPage);
} else {
item.children = [];
item.children.push(movedPage);
}
item.children.splice(insertIndex, 0, movedPage);
return;
}
item.children && item.children.forEach(item => {

View File

@@ -1,5 +1,9 @@
import { DragSource, DropTarget } from 'react-dnd';
import PageItem from './page-item';
import wikiAPI from '../../../../utils/wiki-api';
import { wikiId, gettext } from '../../../../utils/constants';
import { Utils } from '../../../../utils/utils';
import toaster from '../../../../components/toast';
const dragSource = {
beginDrag: props => {
@@ -34,10 +38,19 @@ const dropTarget = {
if (draggedPageId !== targetPageId) {
const sourceIndex = dragSource.idx;
const move_position = sourceIndex > targetIndex ? 'move_above' : 'move_below';
props.onMovePage({
moved_page_id: draggedPageId,
target_page_id: targetPageId,
move_position,
wikiAPI.moveWiki2Page(wikiId, draggedPageId, targetPageId, move_position).then(res => {
props.onMovePage({
moved_page_id: draggedPageId,
target_page_id: targetPageId,
move_position,
});
}).catch((error) => {
if (error.response && error.response.status === 400 && error.response.data.error_msg === 'Internal Server Error') {
toaster.danger(gettext('Cannot move parent page to child page'));
} else {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
}
});
}
return;

View File

@@ -143,6 +143,7 @@ class PageItem extends Component {
onUpdatePage={this.props.onUpdatePage}
onDeletePage={this.props.onDeletePage}
onMovePage={this.props.onMovePage}
updateWikiConfig={this.props.updateWikiConfig}
pages={pages}
pathStr={pathStr + '-' + page.id}
currentPageId={this.props.currentPageId}
@@ -252,6 +253,7 @@ class PageItem extends Component {
{this.state.isShowInsertPage &&
<AddNewPageDialog
toggle={this.toggleInsertPage}
currentPageId={this.props.page.id}
onAddNewPage={this.onAddNewPage}
title={gettext('Add page inside')}
/>
@@ -300,6 +302,7 @@ PageItem.propTypes = {
addPageInside: PropTypes.func,
getFoldState: PropTypes.func,
toggleExpand: PropTypes.func,
updateWikiConfig: PropTypes.func,
};
export default PageItem;

View File

@@ -21,6 +21,7 @@ class WikiNav extends Component {
duplicatePage: PropTypes.func,
currentPageId: PropTypes.string,
addPageInside: PropTypes.func,
updateWikiConfig: PropTypes.func.isRequired,
};
constructor(props) {
@@ -70,6 +71,7 @@ class WikiNav extends Component {
onUpdatePage={this.props.onUpdatePage}
onDeletePage={this.props.onDeletePage}
onMovePage={this.props.onMovePage}
updateWikiConfig={this.props.updateWikiConfig}
pathStr={page.id}
currentPageId={this.props.currentPageId}
addPageInside={this.props.addPageInside}

View File

@@ -191,6 +191,16 @@ class WikiAPI {
return this.req.delete(url);
}
moveWiki2Page(wikiId, moved_id, target_id, move_position) {
const url = this.server + '/api/v2.1/wiki2/' + wikiId + '/pages/';
let params = {
'moved_id': moved_id,
'target_id': target_id,
'move_position': move_position
};
return this.req.put(url, params);
}
deleteWiki2Folder(wikiId, folderId) {
const url = this.server + '/api/v2.1/wiki2/' + wikiId + '/folder/' + folderId + '/';
return this.req.delete(url);