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

Merge pull request #9470 from weseek/feat/15822-158280-allow-enabling-disabling-bulk-export

Feat/15822 158280 allow enabling disabling bulk export
Yuki Takei 1 год назад
Родитель
Сommit
96cb78dfdf

+ 4 - 1
apps/app/public/static/locales/en_US/admin.json

@@ -362,6 +362,9 @@
     "file_uploading": "File uploading",
     "enable_files_except_image": "Enabling this option will allow upload of any file type. Without this option, only image file upload is supported.",
     "attach_enable": "You can attach files other than image files if you enable this option.",
+    "enable_page_bulk_export": "Enable bulk exporting a page and it's child pages",
+    "page_bulk_export_explanation": "When enabled, users will be able to bulk export from the page menu.",
+    "page_bulk_export_warning": "The download period for exported results is 24 hours, and they will be deleted after that. During this period, running multiple large exports consecutively can fill up the file system.",
     "update": "Update",
     "mail_settings": "E-mail Settings",
     "mailer_is_not_set_up": "E-mail setting is not set up.",
@@ -385,7 +388,7 @@
     "file_delivery_method_relay":"Internal System Relay",
     "file_delivery_method_redirect_info":"Redirect: It redirects to a signed URL without GROWI server, it gives excellent performance.",
     "file_delivery_method_relay_info":"Internal System Relay: The GROWI server delivers to clients, it provides complete security.",
-    "fixed_by_env_var": "This is fixed by the env var <code>FILE_UPLOAD={{fileUploadType}}</code>.",
+    "fixed_by_env_var": "This is fixed by the env var <code>{{envKey}}={{envVar}}</code>.",
     "gcs_label": "GCP(GCS)",
     "aws_label": "AWS(S3)",
     "local_label": "Local",

+ 4 - 1
apps/app/public/static/locales/fr_FR/admin.json

@@ -362,6 +362,9 @@
     "file_uploading": "Téléversement de fichiers",
     "enable_files_except_image": "Autorise le téléversement de fichiers de n'importe quel type. Lorsque désactivé, seul les fichiers de type image sont autorisés.",
     "attach_enable": "Autorise le téléversement de fichiers de n'importe quel type",
+    "enable_page_bulk_export": "Autoriser l'exportation groupée de pages et de leurs pages subordonnées",
+    "page_bulk_export_explanation": "Si autorisé, l'exportation groupée sera possible à partir du menu de la page.",
+    "page_bulk_export_warning": "La période de téléchargement des résultats exportés est de 24 heures, après quoi ils seront supprimés. Pendant cette période, l’exécution consécutive de plusieurs exportations volumineuses peut remplir le système de fichiers.",
     "update": "Sauvegarder",
     "mail_settings": "Configuration e-mail",
     "mailer_is_not_set_up": "Paramètres e-mail non configurés.",
@@ -385,7 +388,7 @@
     "file_delivery_method_relay":"Relai interne du système",
     "file_delivery_method_redirect_info":"Rediriger: Redirige vers une URL signé, performance excellente.",
     "file_delivery_method_relay_info":"Relai interne du système: Le serveur GROWI sert les fichiers directement au client, sécurité complète.",
-    "fixed_by_env_var": "Défini par une variable d'environnement <code>FILE_UPLOAD={{fileUploadType}}</code>.",
+    "fixed_by_env_var": "Défini par une variable d'environnement <code>{{envKey}}={{envVar}}</code>.",
     "gcs_label": "GCP(GCS)",
     "aws_label": "AWS(S3)",
     "local_label": "Local",

+ 4 - 1
apps/app/public/static/locales/ja_JP/admin.json

@@ -371,6 +371,9 @@
     "file_uploading": "ファイルアップロード",
     "enable_files_except_image": "画像以外のファイルアップロードを許可",
     "attach_enable": "許可をしている場合、画像以外のファイルをページに添付可能になります。",
+    "enable_page_bulk_export": "ページとその配下のページの一括エクスポートを許可",
+    "page_bulk_export_explanation": "許可している場合、個別ページのメニューから一括エクスポートが可能になります。",
+    "page_bulk_export_warning": "エクスポート結果のダウンロード期限は24時間で、それを過ぎるとファイルシステムから削除されます。この間にページ数の多いエクスポートを連続で実行すると、ファイルシステムを圧迫する可能性があります。",
     "update": "更新",
     "mail_settings": "メールの設定",
     "mailer_is_not_set_up": "メール設定がセットアップされていません。",
@@ -405,7 +408,7 @@
     "azure_storage_account_name": "ストレージアカウント名",
     "azure_storage_container_name": "コンテナ名",
     "azure_note_for_the_only_env_option": "現在Azure設定は環境変数の値によって制限されています<br>この設定を変更する場合は環境変数 <code>{{env}}</code> の値をfalseに変更もしくは削除してください",
-    "fixed_by_env_var": "環境変数 <code>FILE_UPLOAD={{fileUploadType}}</code> により固定されています。",
+    "fixed_by_env_var": "環境変数 <code>{{envKey}}={{envVar}}</code> により固定されています。",
     "file_upload": "ファイルをアップロードするための設定を行います。ファイルアップロードの設定を完了させると、ファイルアップロード機能、プロフィール写真機能などが有効になります。",
     "test_connection": "接続テスト",
     "change_setting": "この設定を途中で変更すると、これまでにアップロードしたファイル等へのアクセスができなくなりますのでご注意下さい。",

+ 4 - 1
apps/app/public/static/locales/zh_CN/admin.json

@@ -371,6 +371,9 @@
     "file_uploading": "文件上传",
     "enable_files_except_image": "启用此选项将允许上传任何文件类型。如果没有此选项,则仅支持图像文件上载。",
     "attach_enable": "如果启用此选项,则可以附加图像文件以外的文件。",
+    "enable_page_bulk_export": "允许批量导出页面及其子页面",
+    "page_bulk_export_explanation": "如果允许,可以从各个页面的菜单中批量导出。",
+    "page_bulk_export_warning": "导出结果的下载期限为24小时,下载期限过后将被删除。在此期间,连续运行多个大导出可能会填满文件系统。",
     "update": "更新",
     "mail_settings": "邮件设置",
     "mailer_is_not_set_up": "邮件设置尚未完成。",
@@ -405,7 +408,7 @@
     "azure_storage_account_name": "Storage Account Name",
     "azure_storage_container_name": "Container Name",
     "azure_note_for_the_only_env_option": "The Azure Settings is limited by the value of environment variable.<br>To change this setting, please change to false or delete the value of the environment variable <code>{{env}}</code> .",
-    "fixed_by_env_var": "这是由env var 修复的 <code>{{key}}={{value}}</code>.",
+    "fixed_by_env_var": "这是由env var 修复的 <code>{{envKey}}={{envVar}}</code>.",
     "file_upload": "This is for uploading file settings. If you complete file upload settings, file upload function, profile picture function etc will be enabled.",
     "test_connection": "测试邮件服务器连接",
     "change_setting": "注意:如果你更改此设置未完成,您将无法访问迄今为止上传的文件。",

+ 48 - 0
apps/app/src/client/components/Admin/App/AppSetting.jsx

@@ -170,6 +170,54 @@ const AppSetting = (props) => {
         </div>
       </div>
 
+      <div className="row mb-2">
+        <label className="text-start text-md-end col-md-3 col-form-label"></label>
+        <div className="col-md-6">
+          <div className="form-check form-check-info">
+            <input
+              type="checkbox"
+              id="cbIsPageBulkExportEnabled"
+              className="form-check-input"
+              name="isBulkExportPagesEnabled"
+              checked={adminAppContainer.state.isBulkExportPagesEnabled}
+              disabled={adminAppContainer.state.isFixedIsBulkExportPagesEnabled}
+              onChange={(e) => {
+                adminAppContainer.changeIsPageBulkExportEnabled(e.target.checked);
+              }}
+            />
+            <label
+              className="form-label form-check-label"
+              htmlFor="cbIsPageBulkExportEnabled"
+            >
+              {t('admin:app_setting.enable_page_bulk_export')}
+            </label>
+          </div>
+
+          <p className="form-text text-muted">
+            {t('admin:app_setting.page_bulk_export_explanation')}
+          </p>
+
+          <p className="alert alert-warning mt-2">
+            {t('admin:app_setting.page_bulk_export_warning')}
+          </p>
+
+          {adminAppContainer.state.isFixedIsBulkExportPagesEnabled && (
+            <p className="alert alert-warning mt-2 text-start">
+              <span className="material-symbols-outlined">help</span>
+              <b>FIXED</b><br />
+              {/* eslint-disable-next-line react/no-danger */}
+              <b dangerouslySetInnerHTML={{
+                __html: t('admin:app_setting.fixed_by_env_var', {
+                  envKey: 'BULK_EXPORT_PAGES_ENABLED',
+                  envVar: adminAppContainer.state.isBulkExportPagesEnabled,
+                }),
+              }}
+              />
+            </p>
+          )}
+        </div>
+      </div>
+
       <AdminUpdateButtonRow onClick={submitHandler} disabled={adminAppContainer.state.retrieveError != null} />
     </React.Fragment>
   );

+ 7 - 1
apps/app/src/client/components/Admin/App/FileUploadSetting.tsx

@@ -65,7 +65,13 @@ export const FileUploadSettingMolecule = React.memo((props: FileUploadSettingMol
             <span className="material-symbols-outlined">help</span>
             <b>FIXED</b><br />
             {/* eslint-disable-next-line react/no-danger */}
-            <b dangerouslySetInnerHTML={{ __html: t('admin:app_setting.fixed_by_env_var', { fileUploadType: props.envFileUploadType }) }} />
+            <b dangerouslySetInnerHTML={{
+              __html: t('admin:app_setting.fixed_by_env_var', {
+                envKey: 'FILE_UPLOAD',
+                envVar: props.envFileUploadType,
+              }),
+            }}
+            />
           </p>
         )}
       </div>

+ 3 - 4
apps/app/src/client/components/Navbar/GrowiContextualSubNavigation.tsx

@@ -25,7 +25,7 @@ import type { OnDuplicatedFunction, OnRenamedFunction, OnDeletedFunction } from
 import { useShouldExpandContent } from '~/services/layout/use-should-expand-content';
 import {
   useCurrentPathname,
-  useCurrentUser, useIsGuestUser, useIsReadOnlyUser, useIsPageBulkExportEnabled, useIsLocalAccountRegistrationEnabled, useIsSharedUser, useShareLinkId,
+  useCurrentUser, useIsGuestUser, useIsReadOnlyUser, useIsBulkExportPagesEnabled, useIsLocalAccountRegistrationEnabled, useIsSharedUser, useShareLinkId,
 } from '~/stores-universal/context';
 import { useEditorMode } from '~/stores-universal/ui';
 import {
@@ -77,7 +77,7 @@ const PageOperationMenuItems = (props: PageOperationMenuItemsProps): JSX.Element
   const { data: isGuestUser } = useIsGuestUser();
   const { data: isReadOnlyUser } = useIsReadOnlyUser();
   const { data: isSharedUser } = useIsSharedUser();
-  const { data: isPageBulkExportEnabled } = useIsPageBulkExportEnabled();
+  const { data: isBulkExportPagesEnabled } = useIsBulkExportPagesEnabled();
 
   const { open: openPresentationModal } = usePagePresentationModal();
   const { open: openAccessoriesModal } = usePageAccessoriesModal();
@@ -142,10 +142,9 @@ const PageOperationMenuItems = (props: PageOperationMenuItemsProps): JSX.Element
       </DropdownItem>
 
       {/* Bulk export */}
-      {isPageBulkExportEnabled && (
+      {isBulkExportPagesEnabled && (
         <span id="bulkExportDropdownItem">
           <DropdownItem
-            disabled={!isPageBulkExportEnabled}
             onClick={openPageBulkExportSelectModal}
             className="grw-page-control-dropdown-item"
           >

+ 16 - 0
apps/app/src/client/services/AdminAppContainer.js

@@ -23,6 +23,8 @@ export default class AdminAppContainer extends Container {
       globalLang: '',
       isEmailPublishedForNewUser: true,
       fileUpload: '',
+      isBulkExportPagesEnabled: false,
+      isFixedIsBulkExportPagesEnabled: false,
 
       isV5Compatible: null,
       siteUrl: '',
@@ -100,6 +102,7 @@ export default class AdminAppContainer extends Container {
       globalLang: appSettingsParams.globalLang,
       isEmailPublishedForNewUser: appSettingsParams.isEmailPublishedForNewUser,
       fileUpload: appSettingsParams.fileUpload,
+      isBulkExportPagesEnabled: appSettingsParams.isBulkExportPagesEnabled,
       isV5Compatible: appSettingsParams.isV5Compatible,
       siteUrl: appSettingsParams.siteUrl,
       siteUrlUseOnlyEnvVars: appSettingsParams.siteUrlUseOnlyEnvVars,
@@ -158,6 +161,11 @@ export default class AdminAppContainer extends Container {
       this.setState({ isFixedFileUploadByEnvVar: true });
     }
 
+    if (appSettingsParams.useOnlyEnvVarsForIsBulkExportPagesEnabled) {
+      this.setState({ isBulkExportPagesEnabled: appSettingsParams.envIsBulkExportPagesEnabled });
+      this.setState({ isFixedIsBulkExportPagesEnabled: true });
+    }
+
   }
 
   /**
@@ -195,6 +203,13 @@ export default class AdminAppContainer extends Container {
     this.setState({ fileUpload });
   }
 
+  /**
+   * Change isBulkExportPagesEnabled
+   */
+  changeIsPageBulkExportEnabled(isBulkExportPagesEnabled) {
+    this.setState({ isBulkExportPagesEnabled });
+  }
+
   /**
    * Change site url
    */
@@ -397,6 +412,7 @@ export default class AdminAppContainer extends Container {
       globalLang: this.state.globalLang,
       isEmailPublishedForNewUser: this.state.isEmailPublishedForNewUser,
       fileUpload: this.state.fileUpload,
+      isBulkExportPagesEnabled: this.state.isBulkExportPagesEnabled,
     });
     const { appSettingParams } = response.data;
     return appSettingParams;

+ 0 - 4
apps/app/src/features/page-bulk-export/interfaces/page-bulk-export.ts

@@ -3,8 +3,6 @@ import type {
   IAttachment, IPage, IRevision, IUser, Ref,
 } from '@growi/core';
 
-import { FileUploadTypeForEnvVar } from '~/interfaces/file-uploader';
-
 export const PageBulkExportFormat = {
   md: 'md',
   pdf: 'pdf',
@@ -49,5 +47,3 @@ export interface IPageBulkExportPageSnapshot {
   path: string, // page path when export was stared
   revision: Ref<IRevision>, // page revision when export was stared
 }
-
-export const PageBulkExportEnabledFileUploadTypes = [FileUploadTypeForEnvVar.aws, FileUploadTypeForEnvVar.gcs, FileUploadTypeForEnvVar.gcp] as const;

+ 3 - 0
apps/app/src/features/page-bulk-export/server/service/check-page-bulk-export-job-in-progress-cron.ts

@@ -20,6 +20,9 @@ class CheckPageBulkExportJobInProgressCronService extends CronService {
   }
 
   override async executeJob(): Promise<void> {
+    const isBulkExportPagesEnabled = configManager.getConfig('crowi', 'app:isBulkExportPagesEnabled');
+    if (!isBulkExportPagesEnabled) return;
+
     const pageBulkExportJobInProgress = await PageBulkExportJob.findOne({
       $or: Object.values(PageBulkExportJobInProgressStatus).map(status => ({ status })),
     });

+ 2 - 1
apps/app/src/features/page-bulk-export/server/service/page-bulk-export-job-clean-up-cron.integ.ts

@@ -1,5 +1,6 @@
 import mongoose from 'mongoose';
 
+import type Crowi from '~/server/crowi';
 import { configManager } from '~/server/service/config-manager';
 
 import { PageBulkExportFormat, PageBulkExportJobStatus } from '../../interfaces/page-bulk-export';
@@ -27,7 +28,7 @@ vi.mock('./page-bulk-export-job-cron', () => {
 });
 
 describe('PageBulkExportJobCleanUpCronService', () => {
-  const crowi = { event: () => {} };
+  const crowi = {} as Crowi;
   let user;
 
   beforeAll(async() => {

+ 6 - 7
apps/app/src/features/page-bulk-export/server/service/page-bulk-export-job-clean-up-cron.ts

@@ -1,10 +1,11 @@
 import type { HydratedDocument } from 'mongoose';
 
+import type Crowi from '~/server/crowi';
 import { configManager } from '~/server/service/config-manager';
 import CronService from '~/server/service/cron';
 import loggerFactory from '~/utils/logger';
 
-import { PageBulkExportEnabledFileUploadTypes, PageBulkExportJobInProgressStatus, PageBulkExportJobStatus } from '../../interfaces/page-bulk-export';
+import { PageBulkExportJobInProgressStatus, PageBulkExportJobStatus } from '../../interfaces/page-bulk-export';
 import type { PageBulkExportJobDocument } from '../models/page-bulk-export-job';
 import PageBulkExportJob from '../models/page-bulk-export-job';
 
@@ -17,9 +18,9 @@ const logger = loggerFactory('growi:service:page-bulk-export-job-clean-up-cron')
  */
 class PageBulkExportJobCleanUpCronService extends CronService {
 
-  crowi: any;
+  crowi: Crowi;
 
-  constructor(crowi) {
+  constructor(crowi: Crowi) {
     super();
     this.crowi = crowi;
   }
@@ -29,9 +30,7 @@ class PageBulkExportJobCleanUpCronService extends CronService {
   }
 
   override async executeJob(): Promise<void> {
-    // TODO: allow enabling/disabling bulk export in https://redmine.weseek.co.jp/issues/158221
-    const isPageBulkExportEnabled = true;
-    if (!isPageBulkExportEnabled) return;
+    // Execute cleanup even if isBulkExportPagesEnabled is false, to cleanup jobs which were created before bulk export was disabled
 
     await this.deleteExpiredExportJobs();
     await this.deleteDownloadExpiredExportJobs();
@@ -114,6 +113,6 @@ class PageBulkExportJobCleanUpCronService extends CronService {
 
 // eslint-disable-next-line import/no-mutable-exports
 export let pageBulkExportJobCleanUpCronService: PageBulkExportJobCleanUpCronService | undefined; // singleton instance
-export default function instanciate(crowi): void {
+export default function instanciate(crowi: Crowi): void {
   pageBulkExportJobCleanUpCronService = new PageBulkExportJobCleanUpCronService(crowi);
 }

+ 4 - 6
apps/app/src/pages/[[...path]].page.tsx

@@ -23,7 +23,6 @@ import superjson from 'superjson';
 import { BasicLayout } from '~/components/Layout/BasicLayout';
 import { PageView } from '~/components/PageView/PageView';
 import { DrawioViewerScript } from '~/components/Script/DrawioViewerScript';
-import { PageBulkExportEnabledFileUploadTypes } from '~/features/page-bulk-export/interfaces/page-bulk-export';
 import { SupportedAction, type SupportedActionType } from '~/interfaces/activity';
 import type { CrowiRequest } from '~/interfaces/crowi-request';
 import { RegistrationMode } from '~/interfaces/registration-mode';
@@ -43,7 +42,7 @@ import {
   useCsrfToken, useIsSearchScopeChildrenAsDefault, useIsEnabledMarp, useCurrentPathname,
   useIsSlackConfigured, useRendererConfig, useGrowiCloudUri,
   useIsAllReplyShown, useIsContainerFluid, useIsNotCreatable,
-  useIsUploadAllFileAllowed, useIsUploadEnabled, useIsPageBulkExportEnabled,
+  useIsUploadAllFileAllowed, useIsUploadEnabled, useIsBulkExportPagesEnabled,
   useElasticsearchMaxBodyLengthToIndex,
   useIsLocalAccountRegistrationEnabled,
   useIsRomUserAllowedToComment,
@@ -182,7 +181,7 @@ type Props = CommonProps & {
   isContainerFluid: boolean,
   isUploadEnabled: boolean,
   isUploadAllFileAllowed: boolean,
-  isPageBulkExportEnabled: boolean,
+  isBulkExportPagesEnabled: boolean,
   isEnabledStaleNotification: boolean,
   isEnabledAttachTitleHeader: boolean,
   // isEnabledLinebreaks: boolean,
@@ -247,7 +246,7 @@ const Page: NextPageWithLayout<Props> = (props: Props) => {
 
   useIsUploadAllFileAllowed(props.isUploadAllFileAllowed);
   useIsUploadEnabled(props.isUploadEnabled);
-  useIsPageBulkExportEnabled(props.isPageBulkExportEnabled);
+  useIsBulkExportPagesEnabled(props.isBulkExportPagesEnabled);
 
   useIsLocalAccountRegistrationEnabled(props.isLocalAccountRegistrationEnabled);
 
@@ -585,8 +584,7 @@ function injectServerConfigurations(context: GetServerSidePropsContext, props: P
   props.disableLinkSharing = configManager.getConfig('crowi', 'security:disableLinkSharing');
   props.isUploadAllFileAllowed = crowi.fileUploadService.getFileUploadEnabled();
   props.isUploadEnabled = crowi.fileUploadService.getIsUploadable();
-  // TODO: allow enabling/disabling bulk export in https://redmine.weseek.co.jp/issues/158221
-  props.isPageBulkExportEnabled = true;
+  props.isBulkExportPagesEnabled = configManager.getConfig('crowi', 'app:isBulkExportPagesEnabled');
 
   props.isLocalAccountRegistrationEnabled = crowi.passportService.isLocalStrategySetup
   && configManager.getConfig('crowi', 'security:registrationMode') !== RegistrationMode.CLOSED;

+ 5 - 0
apps/app/src/server/routes/apiv3/app-settings.js

@@ -435,6 +435,9 @@ module.exports = (crowi) => {
       globalLang: crowi.configManager.getConfig('crowi', 'app:globalLang'),
       isEmailPublishedForNewUser: crowi.configManager.getConfig('crowi', 'customize:isEmailPublishedForNewUser'),
       fileUpload: crowi.configManager.getConfig('crowi', 'app:fileUpload'),
+      isBulkExportPagesEnabled: crowi.configManager.getConfig('crowi', 'app:isBulkExportPagesEnabled'),
+      envIsBulkExportPagesEnabled: crowi.configManager.getConfigFromEnvVars('crowi', 'app:isBulkExportPagesEnabled'),
+      useOnlyEnvVarsForIsBulkExportPagesEnabled: crowi.configManager.getConfig('crowi', 'env:useOnlyEnvVars:app:isBulkExportPagesEnabled'),
       isV5Compatible: crowi.configManager.getConfig('crowi', 'app:isV5Compatible'),
       siteUrl: crowi.configManager.getConfig('crowi', 'app:siteUrl'),
       siteUrlUseOnlyEnvVars: crowi.configManager.getConfig('crowi', 'app:siteUrl:useOnlyEnvVars'),
@@ -531,6 +534,7 @@ module.exports = (crowi) => {
       'app:globalLang': req.body.globalLang,
       'customize:isEmailPublishedForNewUser': req.body.isEmailPublishedForNewUser,
       'app:fileUpload': req.body.fileUpload,
+      'app:isBulkExportPagesEnabled': req.body.isBulkExportPagesEnabled,
     };
 
     try {
@@ -541,6 +545,7 @@ module.exports = (crowi) => {
         globalLang: crowi.configManager.getConfig('crowi', 'app:globalLang'),
         isEmailPublishedForNewUser: crowi.configManager.getConfig('crowi', 'customize:isEmailPublishedForNewUser'),
         fileUpload: crowi.configManager.getConfig('crowi', 'app:fileUpload'),
+        isBulkExportPagesEnabled: crowi.configManager.getConfig('crowi', 'app:isBulkExportPagesEnabled'),
       };
 
       const parameters = { action: SupportedAction.ACTION_ADMIN_APP_SETTINGS_UPDATE };

+ 12 - 0
apps/app/src/server/service/config-loader.ts

@@ -787,6 +787,18 @@ const ENV_VAR_NAME_TO_CONFIG_INFO: Record<string, EnvConfig> = {
     type: ValueType.NUMBER,
     default: 5,
   },
+  BULK_EXPORT_PAGES_ENABLED: {
+    ns: 'crowi',
+    key: 'app:isBulkExportPagesEnabled',
+    type: ValueType.BOOLEAN,
+    default: true,
+  },
+  BULK_EXPORT_PAGES_ENABLED_USES_ONLY_ENV_VARS: {
+    ns: 'crowi',
+    key: 'env:useOnlyEnvVars:app:isBulkExportPagesEnabled',
+    type: ValueType.BOOLEAN,
+    default: false,
+  },
   AI_ENABLED: {
     ns: 'crowi',
     key: 'app:aiEnabled',

+ 2 - 2
apps/app/src/stores-universal/context.tsx

@@ -166,8 +166,8 @@ export const useIsUploadAllFileAllowed = (initialData?: boolean): SWRResponse<bo
   return useContextSWR('isUploadAllFileAllowed', initialData);
 };
 
-export const useIsPageBulkExportEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
-  return useContextSWR('isPageBulkExportEnabled', initialData);
+export const useIsBulkExportPagesEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
+  return useContextSWR('isBulkExportPagesEnabled', initialData);
 };
 
 export const useShowPageLimitationL = (initialData?: number): SWRResponse<number, Error> => {