PageBulkExportSettings.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import {
  2. useState, useCallback, useEffect,
  3. } from 'react';
  4. import { LoadingSpinner } from '@growi/ui/dist/components';
  5. import { useTranslation } from 'next-i18next';
  6. import { apiv3Put } from '~/client/util/apiv3-client';
  7. import { toastSuccess, toastError } from '~/client/util/toastr';
  8. import { useSWRxAppSettings } from '~/stores/admin/app-settings';
  9. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  10. const PageBulkExportSettings = (): JSX.Element => {
  11. const { t } = useTranslation(['admin', 'commons']);
  12. const { data, error, mutate } = useSWRxAppSettings();
  13. const [isBulkExportPagesEnabled, setIsBulkExportPagesEnabled] = useState(data?.isBulkExportPagesEnabled);
  14. const [bulkExportDownloadExpirationSeconds, setBulkExportDownloadExpirationSeconds] = useState(data?.bulkExportDownloadExpirationSeconds);
  15. const changeBulkExportDownloadExpirationSeconds = (bulkExportDownloadExpirationDays: number) => {
  16. const bulkExportDownloadExpirationSeconds = bulkExportDownloadExpirationDays * 24 * 60 * 60;
  17. setBulkExportDownloadExpirationSeconds(bulkExportDownloadExpirationSeconds);
  18. };
  19. const onSubmitHandler = useCallback(async() => {
  20. try {
  21. await apiv3Put('/app-settings/page-bulk-export-settings', {
  22. isBulkExportPagesEnabled,
  23. bulkExportDownloadExpirationSeconds,
  24. });
  25. toastSuccess(t('commons:toaster.update_successed', { target: t('app_setting.questionnaire_settings') }));
  26. }
  27. catch (err) {
  28. toastError(err);
  29. }
  30. mutate();
  31. }, [isBulkExportPagesEnabled, bulkExportDownloadExpirationSeconds, mutate, t]);
  32. useEffect(() => {
  33. setIsBulkExportPagesEnabled(data?.isBulkExportPagesEnabled);
  34. setBulkExportDownloadExpirationSeconds(data?.bulkExportDownloadExpirationSeconds);
  35. }, [data, data?.isBulkExportPagesEnabled, data?.bulkExportDownloadExpirationSeconds]);
  36. const isLoading = data === undefined && error === undefined;
  37. return (
  38. <>
  39. {isLoading && (
  40. <div className="text-muted text-center mb-5">
  41. <LoadingSpinner className="me-1 fs-3" />
  42. </div>
  43. )}
  44. {!isLoading && (
  45. <>
  46. <p className="card custom-card bg-warning-subtle my-3">
  47. {t('admin:app_setting.page_bulk_export_explanation')} <br />
  48. <span className="text-danger mt-1">
  49. {t('admin:app_setting.page_bulk_export_warning')}
  50. </span>
  51. </p>
  52. <div className="my-4 row">
  53. <label
  54. className="text-start text-md-end col-md-3 col-form-label"
  55. >
  56. </label>
  57. <div className="col-md-6">
  58. <div className="form-check form-switch form-check-info">
  59. <input
  60. type="checkbox"
  61. className="form-check-input"
  62. id="cbIsPageBulkExportEnabled"
  63. checked={isBulkExportPagesEnabled}
  64. disabled={data?.isFixedIsBulkExportPagesEnabled}
  65. onChange={e => setIsBulkExportPagesEnabled(e.target.checked)}
  66. />
  67. <label className="form-label form-check-label" htmlFor="cbIsPageBulkExportEnabled">
  68. {t('app_setting.enable_page_bulk_export')}
  69. </label>
  70. <p className="form-text text-muted">
  71. {t('app_setting.page_bulk_export_execute_explanation')}
  72. </p>
  73. </div>
  74. </div>
  75. </div>
  76. <div className="mb-4">
  77. <div className="container">
  78. <div className="row">
  79. <label
  80. className="text-start text-md-end col-md-3 col-form-label"
  81. >
  82. {t('app_setting.page_bulk_export_expire_time')}
  83. </label>
  84. <div className="col-md-2">
  85. <select
  86. className="form-select"
  87. value={(bulkExportDownloadExpirationSeconds ?? 0) / (24 * 60 * 60)}
  88. onChange={(e) => { changeBulkExportDownloadExpirationSeconds(Number(e.target.value)) }}
  89. >
  90. {Array.from({ length: 7 }, (_, i) => i + 1).map(number => (
  91. <option key={`be-download-expiration-option-${number}`} value={number}>
  92. {number}{t('admin:days')}
  93. </option>
  94. ))}
  95. </select>
  96. </div>
  97. </div>
  98. </div>
  99. {data?.isFixedIsBulkExportPagesEnabled && (
  100. <p className="alert alert-warning mt-2 text-start">
  101. <span className="material-symbols-outlined">help</span>
  102. <b>FIXED</b><br />
  103. {/* eslint-disable-next-line react/no-danger */}
  104. <b dangerouslySetInnerHTML={{
  105. __html: t('admin:app_setting.fixed_by_env_var', {
  106. envKey: 'BULK_EXPORT_PAGES_ENABLED',
  107. envVar: isBulkExportPagesEnabled,
  108. }),
  109. }}
  110. />
  111. </p>
  112. )}
  113. </div>
  114. <AdminUpdateButtonRow onClick={onSubmitHandler} />
  115. </>
  116. )}
  117. </>
  118. );
  119. };
  120. export default PageBulkExportSettings;