import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import deepCopy from 'deep-copy';
import classNames from 'classnames';
import { isWiki2, wikiId, wikiPermission, gettext } from '../../utils/constants';
import toaster from '../../components/toast';
import Loading from '../../components/loading';
import WikiNav from './wiki-nav/index';
import PageUtils from './wiki-nav/page-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';
import WikiTrashDialog from './wiki-trash-dialog';
import { DEFAULT_PAGE_NAME } from './constant';
import Wiki2Search from '../../components/search/wiki2-search';
import CommonUndoTool from '../../components/common/common-undo-tool';
import './side-panel.css';
const { repoName } = window.wiki.config;
const propTypes = {
isSidePanelOpen: PropTypes.bool.isRequired,
isLoading: PropTypes.bool.isRequired,
config: PropTypes.object.isRequired,
updateWikiConfig: PropTypes.func.isRequired,
getWikiConfig: PropTypes.func.isRequired,
setCurrentPage: PropTypes.func.isRequired,
getCurrentPageId: PropTypes.func.isRequired,
onUpdatePage: PropTypes.func.isRequired,
};
class SidePanel extends PureComponent {
constructor(props) {
super(props);
this.state = {
isShowTrashDialog: false,
};
}
onDeletePage = (pageId) => {
const config = deepCopy(this.props.config);
const { pages } = config;
const index = PageUtils.getPageIndexById(pageId, pages);
const deletePageName = pages[index].name;
config.pages.splice(index, 1);
wikiAPI.deleteWiki2Page(wikiId, pageId).then((res) => {
if (res.data.success === true) {
this.props.updateWikiConfig(config);
toaster.success(
{gettext('Page xxx deleted.').replace('xxx', deletePageName)}
this.revertWikiPage(pageId)} />
);
}
}).catch((error) => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
});
if (this.props.getCurrentPageId() === pageId) {
const newPageId = config.pages.length > 0 ? config.pages[0].id : '';
this.props.setCurrentPage(newPageId);
}
};
revertWikiPage = (pageId) => {
wikiAPI.revertTrashPage(wikiId, pageId).then(res => {
if (res.data.success === true) {
this.props.getWikiConfig();
toaster.closeAll();
toaster.success(gettext('Restored 1 item'));
}
}).catch((error) => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
});
};
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, page_id, docUuid, successCallback, errorCallback, jumpToNewPage = true }) => {
const newPage = new Page({ id: page_id, name, icon, path, docUuid });
this.addPage(newPage, '', successCallback, errorCallback, jumpToNewPage);
};
duplicatePage = async (fromPageConfig, successCallback, errorCallback) => {
const { from_page_id } = fromPageConfig;
wikiAPI.duplicateWiki2Page(wikiId, from_page_id).then(res => {
const newConfig = JSON.parse(res.data.wiki_config);
this.props.updateWikiConfig(newConfig);
successCallback && successCallback();
}).catch((error) => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
errorCallback && errorCallback();
});
};
addPage = (page, parent_id, successCallback, errorCallback, jumpToNewPage = true) => {
const { config } = this.props;
const navigation = config.navigation;
const page_id = page.id;
config.pages.push(page);
PageUtils.addPage({ navigation, page_id, parent_id });
config.navigation = navigation;
JSON.stringify(config);
this.props.updateWikiConfig(config);
jumpToNewPage && this.props.setCurrentPage(page_id, successCallback);
successCallback && successCallback();
};
movePage = ({ moved_page_id, target_page_id, move_position }) => {
let config = deepCopy(this.props.config);
let { navigation } = config;
config.navigation = PageUtils.movePage(navigation, moved_page_id, target_page_id, move_position);
JSON.stringify(config);
this.props.updateWikiConfig(config);
};
addSiblingPage = (page, parent_id, insert_position, sibling_page_id, successCallback) => {
const { config } = this.props;
const navigation = config.navigation;
const page_id = page.page_id;
config.pages.push(page);
PageUtils.addPage({ navigation, page_id, parent_id, insert_position, sibling_page_id });
config.navigation = navigation;
JSON.stringify(config);
this.props.updateWikiConfig(config);
this.props.setCurrentPage(page_id, successCallback);
successCallback && successCallback();
};
toggleTrashDialog = () => {
this.setState({ isShowTrashDialog: !this.state.isShowTrashDialog });
};
renderWikiNav = () => {
const { config, onUpdatePage } = this.props;
const { pages, navigation } = config;
return (
{isObjectNotEmpty(config) &&
}
);
};
// default page name
handleAddNewPage = (jumpToNewPage = true, pageName = DEFAULT_PAGE_NAME) => {
if (this.isAddingPage === true) return;
this.isAddingPage = true;
wikiAPI.createWiki2Page(wikiId, pageName).then(res => {
this.isAddingPage = false;
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}`,
docUuid: doc_uuid,
successCallback: () => {},
errorCallback: () => {},
jumpToNewPage,
});
}).catch((error) => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
this.isAddingPage = false;
});
};
onAddWikiPage = (jumpToNewPage = true, pageName = DEFAULT_PAGE_NAME, insert_position) => {
if (this.isAddingPage === true) return;
this.isAddingPage = true;
const currentPageId = this.props.getCurrentPageId();
wikiAPI.createWiki2Page(wikiId, pageName, currentPageId, insert_position).then(res => {
this.isAddingPage = false;
const { page_id, obj_name, doc_uuid, parent_dir, page_name } = res.data.file_info;
this.addPageInside({
parentPageId: currentPageId,
page_id: page_id,
name: page_name,
icon: '',
path: parent_dir === '/' ? `/${obj_name}` : `${parent_dir}/${obj_name}`,
docUuid: doc_uuid,
successCallback: () => {},
errorCallback: () => {},
jumpToNewPage,
});
}).catch((error) => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
this.isAddingPage = false;
});
};
render() {
const { isLoading, config } = this.props;
return (
{repoName}
{isLoading ? : this.renderWikiNav()}
{this.state.isShowTrashDialog && (
)}
{wikiPermission === 'rw' &&
}
);
}
}
SidePanel.propTypes = propTypes;
export default SidePanel;