Просмотр исходного кода

hide creating template page menu when the page is not creatable

Yuki Takei 2 лет назад
Родитель
Сommit
066ae79206

+ 23 - 22
apps/app/src/client/services/use-on-template-button-clicked.ts

@@ -5,43 +5,40 @@ import { useRouter } from 'next/router';
 
 
 import { createPage, exist } from '~/client/services/page-operation';
 import { createPage, exist } from '~/client/services/page-operation';
 import type { LabelType } from '~/interfaces/template';
 import type { LabelType } from '~/interfaces/template';
+import { EditorMode, useEditorMode } from '~/stores/ui';
 
 
 export const useOnTemplateButtonClicked = (
 export const useOnTemplateButtonClicked = (
     currentPagePath?: string,
     currentPagePath?: string,
     isLoading?: boolean,
     isLoading?: boolean,
 ): {
 ): {
-  onClickHandler: (label: LabelType) => Promise<void>,
-  isPageCreating: boolean
+  isCreatable: boolean,
+  isPageCreating: boolean,
+  onClickHandler?: (label: LabelType) => Promise<void>,
 } => {
 } => {
   const router = useRouter();
   const router = useRouter();
+
+  const { mutate: mutateEditorMode } = useEditorMode();
+
   const [isPageCreating, setIsPageCreating] = useState(false);
   const [isPageCreating, setIsPageCreating] = useState(false);
 
 
+  const isCreatable = currentPagePath != null && isCreatablePage(`${currentPagePath}/_template`);
+
   const onClickHandler = useCallback(async(label: LabelType) => {
   const onClickHandler = useCallback(async(label: LabelType) => {
-    if (isLoading) return;
+    if (isLoading || !isCreatable) return;
 
 
     try {
     try {
       setIsPageCreating(true);
       setIsPageCreating(true);
 
 
-      const targetPath = currentPagePath == null || currentPagePath === '/'
-        ? `/${label}`
-        : `${currentPagePath}/${label}`;
-
-      const path = isCreatablePage(targetPath) ? targetPath : `/${label}`;
-
-      const res = await exist(JSON.stringify([path]));
-      if (!res.pages[path]) {
-        const params = {
-          isSlackEnabled: false,
-          slackChannels: '',
-          grant: 4,
-        // grant: currentPage?.grant || 1,
-        // grantUserGroupId: currentPage?.grantedGroup?._id,
-        };
+      const templatePagePath = `${currentPagePath}/${label}`;
+      const res = await exist(JSON.stringify([templatePagePath]));
+      const isExists = res.pages[templatePagePath];
 
 
-        await createPage(path, '', params);
+      if (!isExists) {
+        await createPage({ path: templatePagePath });
       }
       }
 
 
-      router.push(`${path}#edit`);
+      router.push(`${templatePagePath}#edit`);
+      mutateEditorMode(EditorMode.Editor);
     }
     }
     catch (err) {
     catch (err) {
       throw err;
       throw err;
@@ -49,7 +46,11 @@ export const useOnTemplateButtonClicked = (
     finally {
     finally {
       setIsPageCreating(false);
       setIsPageCreating(false);
     }
     }
-  }, [currentPagePath, isLoading, router]);
+  }, [currentPagePath, isCreatable, isLoading, mutateEditorMode, router]);
 
 
-  return { onClickHandler, isPageCreating };
+  return {
+    isCreatable,
+    isPageCreating,
+    onClickHandler: isCreatable ? onClickHandler : undefined,
+  };
 };
 };

+ 8 - 4
apps/app/src/components/CreateTemplateModal.tsx

@@ -6,7 +6,7 @@ import { Modal, ModalHeader, ModalBody } from 'reactstrap';
 
 
 import { useOnTemplateButtonClicked } from '~/client/services/use-on-template-button-clicked';
 import { useOnTemplateButtonClicked } from '~/client/services/use-on-template-button-clicked';
 import { toastError } from '~/client/util/toastr';
 import { toastError } from '~/client/util/toastr';
-import { TargetType, LabelType } from '~/interfaces/template';
+import type { TargetType, LabelType } from '~/interfaces/template';
 
 
 
 
 type TemplateCardProps = {
 type TemplateCardProps = {
@@ -55,16 +55,16 @@ export const CreateTemplateModal: React.FC<CreateTemplateModalProps> = ({
 }) => {
 }) => {
   const { t } = useTranslation();
   const { t } = useTranslation();
 
 
-  const { onClickHandler: onClickTemplateButton, isPageCreating } = useOnTemplateButtonClicked(path);
+  const { onClickHandler, isPageCreating } = useOnTemplateButtonClicked(path);
 
 
   const onClickTemplateButtonHandler = useCallback(async(label: LabelType) => {
   const onClickTemplateButtonHandler = useCallback(async(label: LabelType) => {
     try {
     try {
-      await onClickTemplateButton(label);
+      await onClickHandler?.(label);
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
     }
     }
-  }, [onClickTemplateButton]);
+  }, [onClickHandler]);
 
 
   const parentPath = pathUtils.addTrailingSlash(path);
   const parentPath = pathUtils.addTrailingSlash(path);
 
 
@@ -79,6 +79,10 @@ export const CreateTemplateModal: React.FC<CreateTemplateModalProps> = ({
     </div>
     </div>
   );
   );
 
 
+  if (!isPageCreating) {
+    return <></>;
+  }
+
   return (
   return (
     <Modal isOpen={isOpen} toggle={onClose} data-testid="page-template-modal">
     <Modal isOpen={isOpen} toggle={onClose} data-testid="page-template-modal">
       <ModalHeader tag="h4" toggle={onClose} className="bg-primary text-light">
       <ModalHeader tag="h4" toggle={onClose} className="bg-primary text-light">

+ 20 - 14
apps/app/src/components/Sidebar/PageCreateButton/DropendMenu.tsx

@@ -3,13 +3,13 @@ import React from 'react';
 import { useTranslation } from 'react-i18next';
 import { useTranslation } from 'react-i18next';
 import { DropdownMenu, DropdownItem } from 'reactstrap';
 import { DropdownMenu, DropdownItem } from 'reactstrap';
 
 
-import { LabelType } from '~/interfaces/template';
+import type { LabelType } from '~/interfaces/template';
 
 
 
 
 type DropendMenuProps = {
 type DropendMenuProps = {
   onClickCreateNewPageButtonHandler: () => Promise<void>
   onClickCreateNewPageButtonHandler: () => Promise<void>
   onClickCreateTodaysButtonHandler: () => Promise<void>
   onClickCreateTodaysButtonHandler: () => Promise<void>
-  onClickTemplateButtonHandler: (label: LabelType) => Promise<void>
+  onClickTemplateButtonHandler?: (label: LabelType) => Promise<void>
   todaysPath: string | null,
   todaysPath: string | null,
 }
 }
 
 
@@ -32,6 +32,7 @@ export const DropendMenu = React.memo((props: DropendMenuProps): JSX.Element =>
       >
       >
         {t('create_page_dropdown.new_page')}
         {t('create_page_dropdown.new_page')}
       </DropdownItem>
       </DropdownItem>
+
       {todaysPath != null && (
       {todaysPath != null && (
         <>
         <>
           <DropdownItem divider />
           <DropdownItem divider />
@@ -43,18 +44,23 @@ export const DropendMenu = React.memo((props: DropendMenuProps): JSX.Element =>
           </DropdownItem>
           </DropdownItem>
         </>
         </>
       )}
       )}
-      <DropdownItem divider />
-      <li><span className="text-muted text-nowrap px-3">{t('create_page_dropdown.template.desc')}</span></li>
-      <DropdownItem
-        onClick={() => onClickTemplateButtonHandler('_template')}
-      >
-        {t('create_page_dropdown.template.children')}
-      </DropdownItem>
-      <DropdownItem
-        onClick={() => onClickTemplateButtonHandler('__template')}
-      >
-        {t('create_page_dropdown.template.descendants')}
-      </DropdownItem>
+
+      { onClickTemplateButtonHandler != null && (
+        <>
+          <DropdownItem divider />
+          <li><span className="text-muted text-nowrap px-3">{t('create_page_dropdown.template.desc')}</span></li>
+          <DropdownItem
+            onClick={() => onClickTemplateButtonHandler('_template')}
+          >
+            {t('create_page_dropdown.template.children')}
+          </DropdownItem>
+          <DropdownItem
+            onClick={() => onClickTemplateButtonHandler('__template')}
+          >
+            {t('create_page_dropdown.template.descendants')}
+          </DropdownItem>
+        </>
+      ) }
     </DropdownMenu>
     </DropdownMenu>
   );
   );
 });
 });

+ 6 - 3
apps/app/src/components/Sidebar/PageCreateButton/PageCreateButton.tsx

@@ -45,11 +45,14 @@ export const PageCreateButton = React.memo((): JSX.Element => {
   // TODO: https://redmine.weseek.co.jp/issues/138806
   // TODO: https://redmine.weseek.co.jp/issues/138806
   const { onClickHandler: onClickTodaysButton, isPageCreating: isTodaysPageCreating } = useOnTodaysButtonClicked(todaysPath);
   const { onClickHandler: onClickTodaysButton, isPageCreating: isTodaysPageCreating } = useOnTodaysButtonClicked(todaysPath);
   // TODO: https://redmine.weseek.co.jp/issues/138805
   // TODO: https://redmine.weseek.co.jp/issues/138805
-  const { onClickHandler: onClickTemplateButton, isPageCreating: isTemplatePageCreating } = useOnTemplateButtonClicked(currentPagePath, isLoadingPagePath);
+  const {
+    onClickHandler: onClickTemplateButton,
+    isPageCreating: isTemplatePageCreating, isCreatable: isTemplatePageCreatable,
+  } = useOnTemplateButtonClicked(currentPagePath, isLoadingPagePath);
 
 
   const onClickTemplateButtonHandler = useCallback(async(label: LabelType) => {
   const onClickTemplateButtonHandler = useCallback(async(label: LabelType) => {
     try {
     try {
-      await onClickTemplateButton(label);
+      await onClickTemplateButton?.(label);
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -91,7 +94,7 @@ export const PageCreateButton = React.memo((): JSX.Element => {
           <DropendMenu
           <DropendMenu
             onClickCreateNewPageButtonHandler={onClickNewButton}
             onClickCreateNewPageButtonHandler={onClickNewButton}
             onClickCreateTodaysButtonHandler={onClickTodaysButton}
             onClickCreateTodaysButtonHandler={onClickTodaysButton}
-            onClickTemplateButtonHandler={onClickTemplateButtonHandler}
+            onClickTemplateButtonHandler={isTemplatePageCreatable ? onClickTemplateButtonHandler : undefined}
             todaysPath={todaysPath}
             todaysPath={todaysPath}
           />
           />
         </Dropdown>
         </Dropdown>