admin.jsx 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { I18nextProvider } from 'react-i18next';
  4. import { SWRConfig } from 'swr';
  5. import { Provider } from 'unstated';
  6. import AdminAppContainer from '~/client/services/AdminAppContainer';
  7. import AdminBasicSecurityContainer from '~/client/services/AdminBasicSecurityContainer';
  8. import AdminCustomizeContainer from '~/client/services/AdminCustomizeContainer';
  9. import AdminExternalAccountsContainer from '~/client/services/AdminExternalAccountsContainer';
  10. import AdminGeneralSecurityContainer from '~/client/services/AdminGeneralSecurityContainer';
  11. import AdminGitHubSecurityContainer from '~/client/services/AdminGitHubSecurityContainer';
  12. import AdminGoogleSecurityContainer from '~/client/services/AdminGoogleSecurityContainer';
  13. import AdminHomeContainer from '~/client/services/AdminHomeContainer';
  14. import AdminImportContainer from '~/client/services/AdminImportContainer';
  15. import AdminLdapSecurityContainer from '~/client/services/AdminLdapSecurityContainer';
  16. import AdminLocalSecurityContainer from '~/client/services/AdminLocalSecurityContainer';
  17. import AdminMarkDownContainer from '~/client/services/AdminMarkDownContainer';
  18. import AdminNotificationContainer from '~/client/services/AdminNotificationContainer';
  19. import AdminOidcSecurityContainer from '~/client/services/AdminOidcSecurityContainer';
  20. import AdminSamlSecurityContainer from '~/client/services/AdminSamlSecurityContainer';
  21. import AdminSlackIntegrationLegacyContainer from '~/client/services/AdminSlackIntegrationLegacyContainer';
  22. import AdminSocketIoContainer from '~/client/services/AdminSocketIoContainer';
  23. import AdminTwitterSecurityContainer from '~/client/services/AdminTwitterSecurityContainer';
  24. import AdminUserGroupDetailContainer from '~/client/services/AdminUserGroupDetailContainer';
  25. import AdminUsersContainer from '~/client/services/AdminUsersContainer';
  26. import ContextExtractor from '~/client/services/ContextExtractor';
  27. import loggerFactory from '~/utils/logger';
  28. import { swrGlobalConfiguration } from '~/utils/swr-utils';
  29. import AdminHome from '../components/Admin/AdminHome/AdminHome';
  30. import AppSettingsPage from '../components/Admin/App/AppSettingsPage';
  31. import { AuditLogManagement } from '../components/Admin/AuditLogManagement';
  32. import { AuditLogSettings } from '../components/Admin/AuditLogSettings';
  33. import AdminNavigation from '../components/Admin/Common/AdminNavigation';
  34. import Customize from '../components/Admin/Customize/Customize';
  35. import ExportArchiveDataPage from '../components/Admin/ExportArchiveDataPage';
  36. import FullTextSearchManagement from '../components/Admin/FullTextSearchManagement';
  37. import ImportDataPage from '../components/Admin/ImportDataPage';
  38. import LegacySlackIntegration from '../components/Admin/LegacySlackIntegration/LegacySlackIntegration';
  39. import ManageExternalAccount from '../components/Admin/ManageExternalAccount';
  40. import MarkdownSetting from '../components/Admin/MarkdownSetting/MarkDownSetting';
  41. import ManageGlobalNotification from '../components/Admin/Notification/ManageGlobalNotification';
  42. import NotificationSetting from '../components/Admin/Notification/NotificationSetting';
  43. import SecurityManagement from '../components/Admin/Security/SecurityManagement';
  44. import SlackIntegration from '../components/Admin/SlackIntegration/SlackIntegration';
  45. import UserGroupPage from '../components/Admin/UserGroup/UserGroupPage';
  46. import UserGroupDetailPage from '../components/Admin/UserGroupDetail/UserGroupDetailPage';
  47. import UserManagement from '../components/Admin/UserManagement';
  48. import ErrorBoundary from '../components/ErrorBoudary';
  49. import { appContainer, componentMappings } from './base';
  50. const logger = loggerFactory('growi:admin');
  51. appContainer.initContents();
  52. const { i18n } = appContainer;
  53. // create unstated container instance
  54. const adminAppContainer = new AdminAppContainer(appContainer);
  55. const adminImportContainer = new AdminImportContainer(appContainer);
  56. const adminSocketIoContainer = new AdminSocketIoContainer(appContainer);
  57. const adminHomeContainer = new AdminHomeContainer(appContainer);
  58. const adminCustomizeContainer = new AdminCustomizeContainer(appContainer);
  59. const adminUsersContainer = new AdminUsersContainer(appContainer);
  60. const adminExternalAccountsContainer = new AdminExternalAccountsContainer(appContainer);
  61. const adminNotificationContainer = new AdminNotificationContainer(appContainer);
  62. const adminSlackIntegrationLegacyContainer = new AdminSlackIntegrationLegacyContainer(appContainer);
  63. const adminMarkDownContainer = new AdminMarkDownContainer(appContainer);
  64. const adminUserGroupDetailContainer = new AdminUserGroupDetailContainer(appContainer);
  65. const socketIoContainer = appContainer.getContainer('SocketIoContainer');
  66. const injectableContainers = [
  67. appContainer,
  68. adminAppContainer,
  69. adminImportContainer,
  70. adminSocketIoContainer,
  71. adminHomeContainer,
  72. adminCustomizeContainer,
  73. adminUsersContainer,
  74. adminExternalAccountsContainer,
  75. adminNotificationContainer,
  76. adminSlackIntegrationLegacyContainer,
  77. adminMarkDownContainer,
  78. adminUserGroupDetailContainer,
  79. socketIoContainer,
  80. ];
  81. logger.info('unstated containers have been initialized');
  82. /**
  83. * define components
  84. * key: id of element
  85. * value: React Element
  86. */
  87. Object.assign(componentMappings, {
  88. 'admin-home': <AdminHome />,
  89. 'admin-app': <AppSettingsPage />,
  90. 'admin-markdown-setting': <MarkdownSetting />,
  91. 'admin-customize': <Customize />,
  92. 'admin-importer': <ImportDataPage />,
  93. 'admin-export-page': <ExportArchiveDataPage />,
  94. 'admin-notification-setting': <NotificationSetting />,
  95. 'admin-slack-integration': <SlackIntegration />,
  96. 'admin-slack-integration-legacy': <LegacySlackIntegration />,
  97. 'admin-global-notification-setting': <ManageGlobalNotification />,
  98. 'admin-user-page': <UserManagement />,
  99. 'admin-external-account-setting': <ManageExternalAccount />,
  100. 'admin-user-group-detail': <UserGroupDetailPage />,
  101. 'admin-full-text-search-management': <FullTextSearchManagement />,
  102. 'admin-user-group-page': <UserGroupPage />,
  103. 'admin-audit-log': <AuditLogManagement />,
  104. 'admin-audit-log-settings': <AuditLogSettings />,
  105. 'admin-navigation': <AdminNavigation />,
  106. });
  107. const renderMainComponents = () => {
  108. Object.keys(componentMappings).forEach((key) => {
  109. const elem = document.getElementById(key);
  110. if (elem) {
  111. ReactDOM.render(
  112. <I18nextProvider i18n={i18n}>
  113. <ErrorBoundary>
  114. <Provider inject={injectableContainers}>
  115. {componentMappings[key]}
  116. </Provider>
  117. </ErrorBoundary>
  118. </I18nextProvider>,
  119. elem,
  120. );
  121. }
  122. });
  123. };
  124. // extract context before rendering main components
  125. const elem = document.getElementById('growi-context-extractor');
  126. if (elem != null) {
  127. ReactDOM.render(
  128. <SWRConfig value={swrGlobalConfiguration}>
  129. <ContextExtractor></ContextExtractor>
  130. </SWRConfig>,
  131. elem,
  132. renderMainComponents,
  133. );
  134. }
  135. else {
  136. renderMainComponents();
  137. }
  138. const adminSecuritySettingElem = document.getElementById('admin-security-setting');
  139. if (adminSecuritySettingElem != null) {
  140. const adminGeneralSecurityContainer = new AdminGeneralSecurityContainer(appContainer);
  141. const adminLocalSecurityContainer = new AdminLocalSecurityContainer(appContainer);
  142. const adminLdapSecurityContainer = new AdminLdapSecurityContainer(appContainer);
  143. const adminSamlSecurityContainer = new AdminSamlSecurityContainer(appContainer);
  144. const adminOidcSecurityContainer = new AdminOidcSecurityContainer(appContainer);
  145. const adminBasicSecurityContainer = new AdminBasicSecurityContainer(appContainer);
  146. const adminGoogleSecurityContainer = new AdminGoogleSecurityContainer(appContainer);
  147. const adminGitHubSecurityContainer = new AdminGitHubSecurityContainer(appContainer);
  148. const adminTwitterSecurityContainer = new AdminTwitterSecurityContainer(appContainer);
  149. const adminSecurityContainers = [
  150. adminGeneralSecurityContainer, adminLocalSecurityContainer, adminLdapSecurityContainer, adminSamlSecurityContainer,
  151. adminOidcSecurityContainer, adminBasicSecurityContainer, adminGoogleSecurityContainer, adminGitHubSecurityContainer, adminTwitterSecurityContainer,
  152. ];
  153. ReactDOM.render(
  154. <I18nextProvider i18n={i18n}>
  155. <ErrorBoundary>
  156. <Provider inject={[...injectableContainers, ...adminSecurityContainers]}>
  157. <SecurityManagement />
  158. </Provider>
  159. </ErrorBoundary>
  160. </I18nextProvider>,
  161. adminSecuritySettingElem,
  162. );
  163. }