taikou-m пре 10 месеци
родитељ
комит
68d5ee7d41

+ 28 - 5
apps/app/src/client/components/Common/Dropdown/PageItemControl.tsx

@@ -52,6 +52,7 @@ type CommonProps = {
   additionalMenuItemRenderer?: React.FunctionComponent<AdditionalMenuItemsRendererProps>,
   isInstantRename?: boolean,
   alignEnd?: boolean,
+  isUsersHomepageDeletionEnabled?: boolean,
 }
 
 
@@ -66,11 +67,11 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
 
   const {
     pageId, isLoading, pageInfo, isEnableActions, isReadOnlyUser, forceHideMenuItems, operationProcessData,
-    onClickBookmarkMenuItem, onClickRenameMenuItem, onClickDuplicateMenuItem,
+    onClickBookmarkMenuItem, onClickRenameMenuItem, onClickDuplicateMenuItem, onClickDeleteMenuItem,
     onClickRevertMenuItem, onClickPathRecoveryMenuItem,
     additionalMenuItemOnTopRenderer: AdditionalMenuItemsOnTop,
     additionalMenuItemRenderer: AdditionalMenuItems,
-    isInstantRename, alignEnd,
+    isInstantRename, alignEnd, isUsersHomepageDeletionEnabled,
   } = props;
 
   // eslint-disable-next-line react-hooks/rules-of-hooks
@@ -109,7 +110,16 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
   }, [onClickRevertMenuItem, pageId]);
 
   // eslint-disable-next-line react-hooks/rules-of-hooks
-
+  const deleteItemClickedHandler = useCallback(async() => {
+    if (pageInfo == null || onClickDeleteMenuItem == null) {
+      return;
+    }
+    if (!pageInfo.isDeletable) {
+      logger.warn('This page could not be deleted.');
+      return;
+    }
+    await onClickDeleteMenuItem(pageId, pageInfo);
+  }, [onClickDeleteMenuItem, pageId, pageInfo]);
 
   // eslint-disable-next-line react-hooks/rules-of-hooks
   const pathRecoveryItemClickedHandler = useCallback(async() => {
@@ -131,7 +141,7 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
   else if (pageId != null && pageInfo != null) {
 
     const showDeviderBeforeAdditionalMenuItems = (forceHideMenuItems?.length ?? 0) < 3;
-
+    const showDeviderBeforeDelete = AdditionalMenuItems != null || showDeviderBeforeAdditionalMenuItems;
 
     // PathRecovery
     // Todo: It is wanted to find a better way to pass operationProcessData to PageItemControl
@@ -221,7 +231,20 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
 
         {/* divider */}
         {/* Delete */}
-
+        { !forceHideMenuItems?.includes(MenuItemType.DELETE) && isEnableActions && !isReadOnlyUser && isUsersHomepageDeletionEnabled && (
+          <>
+            { showDeviderBeforeDelete && <DropdownItem divider /> }
+            <DropdownItem
+              className={`pt-2 grw-page-control-dropdown-item ${pageInfo.isDeletable ? 'text-danger' : ''}`}
+              disabled={!pageInfo.isDeletable}
+              onClick={deleteItemClickedHandler}
+              data-testid="open-page-delete-modal-btn"
+            >
+              <span className="material-symbols-outlined me-1 grw-page-control-dropdown-icon">delete</span>
+              {t('Delete')}
+            </DropdownItem>
+          </>
+        )}
       </>
     );
   }

+ 5 - 1
apps/app/src/pages/[[...path]].page.tsx

@@ -47,7 +47,7 @@ import {
   useIsLocalAccountRegistrationEnabled,
   useIsRomUserAllowedToComment,
   useIsPdfBulkExportEnabled,
-  useIsAiEnabled, useLimitLearnablePageCountPerAssistant,
+  useIsAiEnabled, useLimitLearnablePageCountPerAssistant, useIsUsersHomepageDeletionEnabled,
 } from '~/stores-universal/context';
 import { useEditingMarkdown } from '~/stores/editor';
 import {
@@ -200,6 +200,7 @@ type Props = CommonProps & {
 
   aiEnabled: boolean,
   limitLearnablePageCountPerAssistant: number,
+  isUsersHomepageDeletionEnabled: boolean,
 };
 
 const Page: NextPageWithLayout<Props> = (props: Props) => {
@@ -258,6 +259,8 @@ const Page: NextPageWithLayout<Props> = (props: Props) => {
   useIsAiEnabled(props.aiEnabled);
   useLimitLearnablePageCountPerAssistant(props.limitLearnablePageCountPerAssistant);
 
+  useIsUsersHomepageDeletionEnabled(props.isUsersHomepageDeletionEnabled);
+
   const { pageWithMeta } = props;
 
   const pageId = pageWithMeta?.data._id;
@@ -576,6 +579,7 @@ function injectServerConfigurations(context: GetServerSidePropsContext, props: P
 
   props.aiEnabled = configManager.getConfig('app:aiEnabled');
   props.limitLearnablePageCountPerAssistant = configManager.getConfig('openai:limitLearnablePageCountPerAssistant');
+  props.isUsersHomepageDeletionEnabled = configManager.getConfig('security:user-homepage-deletion:isEnabled');
 
   props.isSearchServiceConfigured = searchService.isConfigured;
   props.isSearchServiceReachable = searchService.isReachable;

+ 4 - 0
apps/app/src/stores-universal/context.tsx

@@ -224,6 +224,10 @@ export const useLimitLearnablePageCountPerAssistant = (initialData?: number): SW
   return useContextSWR('limitLearnablePageCountPerAssistant', initialData);
 };
 
+export const useIsUsersHomepageDeletionEnabled = (initialData?: boolean): SWRResponse<boolean, false> => {
+  return useContextSWR('isUsersHomepageDeletionEnabled', initialData);
+};
+
 /** **********************************************************
  *                     Computed contexts
  *********************************************************** */