|
|
@@ -5,6 +5,7 @@ import { withUnstatedContainers } from '../UnstatedUtils';
|
|
|
import AppContainer from '~/client/services/AppContainer';
|
|
|
import NavigationContainer from '~/client/services/NavigationContainer';
|
|
|
import PageContainer from '~/client/services/PageContainer';
|
|
|
+import EditorContainer from '~/client/services/EditorContainer';
|
|
|
|
|
|
import TagLabels from '../Page/TagLabels';
|
|
|
import SubnavButtons from './SubNavButtons';
|
|
|
@@ -15,13 +16,16 @@ import DrawerToggler from './DrawerToggler';
|
|
|
|
|
|
import PagePathNav from '../PagePathNav';
|
|
|
|
|
|
+import { toastSuccess, toastError } from '~/client/util/apiNotification';
|
|
|
+import { apiPost } from '~/client/util/apiv1-client';
|
|
|
+
|
|
|
const GrowiSubNavigation = (props) => {
|
|
|
const {
|
|
|
- appContainer, navigationContainer, pageContainer, isCompactMode,
|
|
|
+ appContainer, navigationContainer, pageContainer, editorContainer, isCompactMode,
|
|
|
} = props;
|
|
|
const { isDrawerMode, editorMode, isDeviceSmallerThanMd } = navigationContainer.state;
|
|
|
const {
|
|
|
- pageId, path, createdAt, creator, updatedAt, revisionAuthor, isPageExist,
|
|
|
+ pageId, path, createdAt, creator, updatedAt, revisionAuthor, isPageExist, tags,
|
|
|
} = pageContainer.state;
|
|
|
|
|
|
const { isGuestUser } = appContainer;
|
|
|
@@ -33,6 +37,27 @@ const GrowiSubNavigation = (props) => {
|
|
|
navigationContainer.setEditorMode(viewType);
|
|
|
}
|
|
|
|
|
|
+ const tagsUpdatedHandler = async(newTags) => {
|
|
|
+ // It will not be reflected in the DB until the page is refreshed
|
|
|
+ if (editorMode === 'edit') {
|
|
|
+ return editorContainer.setState({ tags: newTags });
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ const { tags } = await apiPost('/tags.update', { pageId, tags: newTags });
|
|
|
+
|
|
|
+ // update pageContainer.state
|
|
|
+ pageContainer.setState({ tags });
|
|
|
+ // update editorContainer.state
|
|
|
+ editorContainer.setState({ tags });
|
|
|
+
|
|
|
+ toastSuccess('updated tags successfully');
|
|
|
+ }
|
|
|
+ catch (err) {
|
|
|
+ toastError(err, 'fail to update tags');
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
return (
|
|
|
<div className={`grw-subnav container-fluid d-flex align-items-center justify-content-between ${isCompactMode ? 'grw-subnav-compact d-print-none' : ''}`}>
|
|
|
|
|
|
@@ -47,7 +72,7 @@ const GrowiSubNavigation = (props) => {
|
|
|
<div className="grw-path-nav-container">
|
|
|
{ pageContainer.isAbleToShowTagLabel && !isCompactMode && !isTagLabelHidden && (
|
|
|
<div className="grw-taglabels-container">
|
|
|
- <TagLabels editorMode={editorMode} />
|
|
|
+ <TagLabels tags={tags} tagsUpdateInvoked={tagsUpdatedHandler} />
|
|
|
</div>
|
|
|
) }
|
|
|
<PagePathNav pageId={pageId} pagePath={path} isSingleLineMode={isEditorMode} isCompactMode={isCompactMode} />
|
|
|
@@ -92,13 +117,14 @@ const GrowiSubNavigation = (props) => {
|
|
|
/**
|
|
|
* Wrapper component for using unstated
|
|
|
*/
|
|
|
-const GrowiSubNavigationWrapper = withUnstatedContainers(GrowiSubNavigation, [AppContainer, NavigationContainer, PageContainer]);
|
|
|
+const GrowiSubNavigationWrapper = withUnstatedContainers(GrowiSubNavigation, [AppContainer, NavigationContainer, PageContainer, EditorContainer]);
|
|
|
|
|
|
|
|
|
GrowiSubNavigation.propTypes = {
|
|
|
appContainer: PropTypes.instanceOf(AppContainer).isRequired,
|
|
|
navigationContainer: PropTypes.instanceOf(NavigationContainer).isRequired,
|
|
|
pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
|
|
|
+ editorContainer: PropTypes.instanceOf(EditorContainer).isRequired,
|
|
|
|
|
|
isCompactMode: PropTypes.bool,
|
|
|
};
|