AppSettingsPageContents.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import React, { useEffect } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import AdminAppContainer from '~/client/services/AdminAppContainer';
  4. import { toastError } from '~/client/util/toastr';
  5. import { useIsMaintenanceMode } from '~/stores/maintenanceMode';
  6. import { toArrayIfNot } from '~/utils/array-utils';
  7. import loggerFactory from '~/utils/logger';
  8. import { withUnstatedContainers } from '../../UnstatedUtils';
  9. import AppSetting from './AppSetting';
  10. import FileUploadSetting from './FileUploadSetting';
  11. import MailSetting from './MailSetting';
  12. import { MaintenanceMode } from './MaintenanceMode';
  13. import PageBulkExportSettings from './PageBulkExportSettings';
  14. import QuestionnaireSettings from './QuestionnaireSettings';
  15. import SiteUrlSetting from './SiteUrlSetting';
  16. import V5PageMigration from './V5PageMigration';
  17. const logger = loggerFactory('growi:appSettings');
  18. type Props = {
  19. adminAppContainer: AdminAppContainer,
  20. }
  21. const AppSettingsPageContents = (props: Props) => {
  22. const { t } = useTranslation('admin');
  23. const { adminAppContainer } = props;
  24. const { data: isMaintenanceMode } = useIsMaintenanceMode();
  25. const { isV5Compatible } = adminAppContainer.state;
  26. useEffect(() => {
  27. const fetchAppSettingsData = async() => {
  28. await adminAppContainer.retrieveAppSettingsData();
  29. };
  30. try {
  31. fetchAppSettingsData();
  32. }
  33. catch (err) {
  34. const errs = toArrayIfNot(err);
  35. toastError(errs);
  36. logger.error(errs);
  37. }
  38. }, [adminAppContainer]);
  39. return (
  40. <div data-testid="admin-app-settings">
  41. {
  42. // Alert message will be displayed in case that the GROWI is under maintenance
  43. isMaintenanceMode && (
  44. <div className="alert alert-danger alert-link" role="alert">
  45. <h3 className="alert-heading">
  46. {t('admin:maintenance_mode.maintenance_mode')}
  47. </h3>
  48. <p>
  49. {t('admin:maintenance_mode.description')}
  50. </p>
  51. <hr />
  52. <a className="btn-link" href="#maintenance-mode" rel="noopener noreferrer">
  53. <span className="material-symbols-outlined ms-1" aria-hidden="true">expand_more</span>
  54. <strong>{t('admin:maintenance_mode.end_maintenance_mode')}</strong>
  55. </a>
  56. </div>
  57. )
  58. }
  59. {
  60. !isV5Compatible
  61. && (
  62. <div className="row">
  63. <div className="col-lg-12">
  64. <h2 className="admin-setting-header" data-testid="v5-page-migration">{t('V5 Page Migration')}</h2>
  65. <V5PageMigration />
  66. </div>
  67. </div>
  68. )
  69. }
  70. <div className="row">
  71. <div className="col-lg-12">
  72. <h2 className="admin-setting-header">{t('headers.app_settings', { ns: 'commons' })}</h2>
  73. <AppSetting />
  74. </div>
  75. </div>
  76. <div className="row mt-5">
  77. <div className="col-lg-12">
  78. <h2 className="admin-setting-header">{t('app_setting.site_url.title')}</h2>
  79. <SiteUrlSetting />
  80. </div>
  81. </div>
  82. <div className="row mt-5">
  83. <div className="col-lg-12">
  84. <h2 className="admin-setting-header" id="mail-settings">{t('app_setting.mail_settings')}</h2>
  85. <MailSetting />
  86. </div>
  87. </div>
  88. <div className="row mt-5">
  89. <div className="col-lg-12">
  90. <h2 className="admin-setting-header">{t('admin:app_setting.file_upload_settings')}</h2>
  91. <FileUploadSetting />
  92. </div>
  93. </div>
  94. <div className="row mt-5">
  95. <div className="col-lg-12">
  96. <h2 className="admin-setting-header">{t('admin:app_setting.page_bulk_export_settings')}</h2>
  97. <PageBulkExportSettings />
  98. </div>
  99. </div>
  100. <div className="row mt-5">
  101. <div className="col-lg-12">
  102. <h2 className="admin-setting-header">{t('admin:app_setting.questionnaire_settings')}</h2>
  103. <QuestionnaireSettings />
  104. </div>
  105. </div>
  106. <div className="row">
  107. <div className="col-lg-12">
  108. <h2 className="admin-setting-header" id="maintenance-mode">{t('admin:maintenance_mode.maintenance_mode')}</h2>
  109. <MaintenanceMode />
  110. </div>
  111. </div>
  112. </div>
  113. );
  114. };
  115. /**
  116. * Wrapper component for using unstated
  117. */
  118. const AppSettingsPageContentsWrapper = withUnstatedContainers(AppSettingsPageContents, [AdminAppContainer]);
  119. export default AppSettingsPageContentsWrapper;