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

allow enabling/disabling page bulk export from admin page

Futa Arai 1 год назад
Родитель
Сommit
fb355cb487

+ 2 - 0
apps/app/public/static/locales/en_US/admin.json

@@ -362,6 +362,8 @@
     "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",
     "update": "Update",
     "mail_settings": "E-mail Settings",
     "mailer_is_not_set_up": "E-mail setting is not set up.",

+ 2 - 0
apps/app/public/static/locales/fr_FR/admin.json

@@ -362,6 +362,8 @@
     "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",
     "update": "Sauvegarder",
     "mail_settings": "Configuration e-mail",
     "mailer_is_not_set_up": "Paramètres e-mail non configurés.",

+ 2 - 0
apps/app/public/static/locales/ja_JP/admin.json

@@ -371,6 +371,8 @@
     "file_uploading": "ファイルアップロード",
     "enable_files_except_image": "画像以外のファイルアップロードを許可",
     "attach_enable": "許可をしている場合、画像以外のファイルをページに添付可能になります。",
+    "enable_page_bulk_export": "ページとその配下のページの一括エクスポートを許可",
+    "page_bulk_export_explanation": "許可している場合、個別ページのメニューから一括エクスポートが可能になります",
     "update": "更新",
     "mail_settings": "メールの設定",
     "mailer_is_not_set_up": "メール設定がセットアップされていません。",

+ 2 - 0
apps/app/public/static/locales/zh_CN/admin.json

@@ -371,6 +371,8 @@
     "file_uploading": "文件上传",
     "enable_files_except_image": "启用此选项将允许上传任何文件类型。如果没有此选项,则仅支持图像文件上载。",
     "attach_enable": "如果启用此选项,则可以附加图像文件以外的文件。",
+    "enable_page_bulk_export": "允许批量导出页面及其子页面",
+    "page_bulk_export_explanation": "如果允许,可以从各个页面的菜单中批量导出。",
     "update": "更新",
     "mail_settings": "邮件设置",
     "mailer_is_not_set_up": "邮件设置尚未完成。",

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

@@ -170,6 +170,34 @@ 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="isPageBulkExportEnabled"
+              checked={adminAppContainer.state.isPageBulkExportEnabled}
+              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>
+        </div>
+      </div>
+
       <AdminUpdateButtonRow onClick={submitHandler} disabled={adminAppContainer.state.retrieveError != null} />
     </React.Fragment>
   );

+ 0 - 1
apps/app/src/client/components/Navbar/GrowiContextualSubNavigation.tsx

@@ -145,7 +145,6 @@ const PageOperationMenuItems = (props: PageOperationMenuItemsProps): JSX.Element
       {isPageBulkExportEnabled && (
         <span id="bulkExportDropdownItem">
           <DropdownItem
-            disabled={!isPageBulkExportEnabled}
             onClick={openPageBulkExportSelectModal}
             className="grw-page-control-dropdown-item"
           >

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

@@ -23,6 +23,7 @@ export default class AdminAppContainer extends Container {
       globalLang: '',
       isEmailPublishedForNewUser: true,
       fileUpload: '',
+      isPageBulkExportEnabled: false,
 
       isV5Compatible: null,
       siteUrl: '',
@@ -100,6 +101,7 @@ export default class AdminAppContainer extends Container {
       globalLang: appSettingsParams.globalLang,
       isEmailPublishedForNewUser: appSettingsParams.isEmailPublishedForNewUser,
       fileUpload: appSettingsParams.fileUpload,
+      isPageBulkExportEnabled: appSettingsParams.isPageBulkExportEnabled,
       isV5Compatible: appSettingsParams.isV5Compatible,
       siteUrl: appSettingsParams.siteUrl,
       siteUrlUseOnlyEnvVars: appSettingsParams.siteUrlUseOnlyEnvVars,
@@ -195,6 +197,13 @@ export default class AdminAppContainer extends Container {
     this.setState({ fileUpload });
   }
 
+  /**
+   * Change isPageBulkExportEnabled
+   */
+  changeIsPageBulkExportEnabled(isPageBulkExportEnabled) {
+    this.setState({ isPageBulkExportEnabled });
+  }
+
   /**
    * Change site url
    */
@@ -397,6 +406,7 @@ export default class AdminAppContainer extends Container {
       globalLang: this.state.globalLang,
       isEmailPublishedForNewUser: this.state.isEmailPublishedForNewUser,
       fileUpload: this.state.fileUpload,
+      isPageBulkExportEnabled: this.state.isPageBulkExportEnabled,
     });
     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 { GrowiServiceType } from '~/features/questionnaire/interfaces/growi-info';
-
 export const PageBulkExportFormat = {
   md: 'md',
   pdf: 'pdf',
@@ -51,5 +49,3 @@ export interface IPageBulkExportPageSnapshot {
   path: string, // page path when export was stared
   revision: Ref<IRevision>, // page revision when export was stared
 }
-
-export const PageBulkExportEnabledServiceTypes = [GrowiServiceType.onPremise, GrowiServiceType.others] as const;

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

@@ -4,7 +4,7 @@ import { configManager } from '~/server/service/config-manager';
 import CronService from '~/server/service/cron';
 import loggerFactory from '~/utils/logger';
 
-import { PageBulkExportEnabledServiceTypes, 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';
 

+ 1 - 2
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 { PageBulkExportEnabledServiceTypes } 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';
@@ -585,7 +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();
-  props.isPageBulkExportEnabled = PageBulkExportEnabledServiceTypes.includes(configManager.getConfig('crowi', 'app:serviceType'));
+  props.isPageBulkExportEnabled = configManager.getConfig('crowi', 'app:isPageBulkExportEnabled');
 
   props.isLocalAccountRegistrationEnabled = crowi.passportService.isLocalStrategySetup
   && configManager.getConfig('crowi', 'security:registrationMode') !== RegistrationMode.CLOSED;

+ 2 - 3
apps/app/src/server/crowi/index.js

@@ -13,7 +13,7 @@ import pkg from '^/package.json';
 import { KeycloakUserGroupSyncService } from '~/features/external-user-group/server/service/keycloak-user-group-sync';
 import { LdapUserGroupSyncService } from '~/features/external-user-group/server/service/ldap-user-group-sync';
 import { startCronIfEnabled as startOpenaiCronIfEnabled } from '~/features/openai/server/services/cron';
-import { PageBulkExportEnabledServiceTypes, PageBulkExportJobInProgressStatus } from '~/features/page-bulk-export/interfaces/page-bulk-export';
+import { PageBulkExportJobInProgressStatus } from '~/features/page-bulk-export/interfaces/page-bulk-export';
 import PageBulkExportJob from '~/features/page-bulk-export/server/models/page-bulk-export-job';
 import { checkPageBulkExportJobInProgressCronService } from '~/features/page-bulk-export/server/service/check-page-bulk-export-job-in-progress-cron';
 import instanciatePageBulkExportService, { pageBulkExportService } from '~/features/page-bulk-export/server/service/page-bulk-export';
@@ -332,8 +332,7 @@ Crowi.prototype.setupSocketIoService = async function() {
 
 Crowi.prototype.setupCron = function() {
   questionnaireCronService.startCron();
-
-  const isPageBulkExportEnabled = PageBulkExportEnabledServiceTypes.includes(this.configManager.getConfig('crowi', 'app:serviceType'));
+  const isPageBulkExportEnabled = this.configManager.getConfig('crowi', 'app:isPageBulkExportEnabled');
   if (isPageBulkExportEnabled) {
     instanciatePageBulkExportJobCronService(this);
     checkPageBulkExportJobInProgressCronService.startCron();

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

@@ -435,6 +435,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'),
+      isPageBulkExportEnabled: crowi.configManager.getConfig('crowi', 'app:isPageBulkExportEnabled'),
       isV5Compatible: crowi.configManager.getConfig('crowi', 'app:isV5Compatible'),
       siteUrl: crowi.configManager.getConfig('crowi', 'app:siteUrl'),
       siteUrlUseOnlyEnvVars: crowi.configManager.getConfig('crowi', 'app:siteUrl:useOnlyEnvVars'),
@@ -531,6 +532,7 @@ module.exports = (crowi) => {
       'app:globalLang': req.body.globalLang,
       'customize:isEmailPublishedForNewUser': req.body.isEmailPublishedForNewUser,
       'app:fileUpload': req.body.fileUpload,
+      'app:isPageBulkExportEnabled': req.body.isPageBulkExportEnabled,
     };
 
     try {
@@ -541,6 +543,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'),
+        isPageBulkExportEnabled: crowi.configManager.getConfig('crowi', 'app:isPageBulkExportEnabled'),
       };
 
       const parameters = { action: SupportedAction.ACTION_ADMIN_APP_SETTINGS_UPDATE };

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

@@ -787,6 +787,12 @@ const ENV_VAR_NAME_TO_CONFIG_INFO: Record<string, EnvConfig> = {
     type: ValueType.NUMBER,
     default: 5,
   },
+  BULK_EXPORT_ENABLED: {
+    ns: 'crowi',
+    key: 'app:isPageBulkExportEnabled',
+    type: ValueType.BOOLEAN,
+    default: false,
+  },
   AI_ENABLED: {
     ns: 'crowi',
     key: 'app:aiEnabled',