|
|
@@ -1,10 +1,11 @@
|
|
|
-import React from 'react';
|
|
|
+import React, { useCallback } from 'react';
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
|
|
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,24 +16,61 @@ 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,
|
|
|
+ revisionId,
|
|
|
+ path,
|
|
|
+ isDeletable,
|
|
|
+ isAbleToDeleteCompletely,
|
|
|
+ createdAt,
|
|
|
+ creator,
|
|
|
+ updatedAt,
|
|
|
+ revisionAuthor,
|
|
|
+ isPageExist,
|
|
|
+ isTrashPage,
|
|
|
+ tags,
|
|
|
} = pageContainer.state;
|
|
|
|
|
|
- const { isGuestUser } = appContainer;
|
|
|
+ const { isGuestUser, isSharedUser } = appContainer;
|
|
|
const isEditorMode = editorMode !== 'view';
|
|
|
// Tags cannot be edited while the new page and editorMode is view
|
|
|
const isTagLabelHidden = (editorMode !== 'edit' && !isPageExist);
|
|
|
|
|
|
+ const isAbleToShowPageManagement = isPageExist && !isTrashPage && !isSharedUser;
|
|
|
function onPageEditorModeButtonClicked(viewType) {
|
|
|
navigationContainer.setEditorMode(viewType);
|
|
|
}
|
|
|
|
|
|
+ const tagsUpdatedHandler = useCallback(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');
|
|
|
+ }
|
|
|
+ // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
|
+ }, [pageId]);
|
|
|
+
|
|
|
return (
|
|
|
<div className={`grw-subnav container-fluid d-flex align-items-center justify-content-between ${isCompactMode ? 'grw-subnav-compact d-print-none' : ''}`}>
|
|
|
|
|
|
@@ -47,7 +85,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} />
|
|
|
@@ -59,7 +97,15 @@ const GrowiSubNavigation = (props) => {
|
|
|
|
|
|
<div className="d-flex flex-column align-items-end">
|
|
|
<div className="d-flex">
|
|
|
- <SubNavButtons isCompactMode={isCompactMode} pageId={pageId} />
|
|
|
+ <SubNavButtons
|
|
|
+ isCompactMode={isCompactMode}
|
|
|
+ pageId={pageId}
|
|
|
+ revisionId={revisionId}
|
|
|
+ path={path}
|
|
|
+ isDeletable={isDeletable}
|
|
|
+ isAbleToDeleteCompletely={isAbleToDeleteCompletely}
|
|
|
+ willShowPageManagement={isAbleToShowPageManagement}
|
|
|
+ />
|
|
|
</div>
|
|
|
<div className="mt-2">
|
|
|
{pageContainer.isAbleToShowPageEditorModeManager && (
|
|
|
@@ -92,13 +138,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,
|
|
|
};
|