passbolt-styleguide 3.8.4 → 3.9.0-alpha2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/build/css/help.min.css +3 -3
  2. package/build/css/public.min.css +3 -3
  3. package/build/css/themes/default/api_authentication.min.css +3 -3
  4. package/build/css/themes/default/api_cloud.min.css +3 -3
  5. package/build/css/themes/default/api_main.min.css +3 -3
  6. package/build/css/themes/default/api_reports.min.css +3 -3
  7. package/build/css/themes/default/api_webinstaller.min.css +3 -3
  8. package/build/css/themes/default/ext_app.min.css +3 -3
  9. package/build/css/themes/default/ext_authentication.min.css +3 -3
  10. package/build/css/themes/default/ext_external.min.css +2 -2
  11. package/build/css/themes/default/ext_in_form_cta.min.css +3 -3
  12. package/build/css/themes/default/ext_in_form_menu.min.css +3 -3
  13. package/build/css/themes/default/ext_quickaccess.min.css +3 -3
  14. package/build/css/themes/midgar/api_authentication.min.css +3 -3
  15. package/build/css/themes/midgar/api_main.min.css +3 -3
  16. package/build/css/themes/midgar/api_reports.min.css +3 -3
  17. package/build/css/themes/midgar/ext_app.min.css +3 -3
  18. package/build/css/themes/midgar/ext_authentication.min.css +3 -3
  19. package/build/css/themes/midgar/ext_in_form_cta.min.css +3 -3
  20. package/build/css/themes/midgar/ext_in_form_menu.min.css +3 -3
  21. package/build/css/themes/midgar/ext_quickaccess.min.css +3 -3
  22. package/build/css/themes/solarized_dark/api_authentication.min.css +1 -1
  23. package/build/css/themes/solarized_dark/api_main.min.css +1 -1
  24. package/build/css/themes/solarized_dark/api_reports.min.css +1 -1
  25. package/build/css/themes/solarized_dark/ext_app.min.css +1 -1
  26. package/build/css/themes/solarized_dark/ext_authentication.min.css +1 -1
  27. package/build/css/themes/solarized_dark/ext_in_form_cta.min.css +1 -1
  28. package/build/css/themes/solarized_dark/ext_in_form_menu.min.css +1 -1
  29. package/build/css/themes/solarized_dark/ext_quickaccess.min.css +1 -1
  30. package/build/css/themes/solarized_light/api_authentication.min.css +1 -1
  31. package/build/css/themes/solarized_light/api_main.min.css +1 -1
  32. package/build/css/themes/solarized_light/api_reports.min.css +1 -1
  33. package/build/css/themes/solarized_light/ext_app.min.css +1 -1
  34. package/build/css/themes/solarized_light/ext_authentication.min.css +1 -1
  35. package/build/css/themes/solarized_light/ext_in_form_cta.min.css +1 -1
  36. package/build/css/themes/solarized_light/ext_in_form_menu.min.css +1 -1
  37. package/build/css/themes/solarized_light/ext_quickaccess.min.css +1 -1
  38. package/build/js/dist/api-account-recovery.js +1 -1
  39. package/build/js/dist/api-app.js +1 -1
  40. package/build/js/dist/api-app.js.LICENSE.txt +75 -5
  41. package/build/js/dist/api-feedback.js +2 -0
  42. package/build/js/dist/api-feedback.js.LICENSE.txt +45 -0
  43. package/build/js/dist/api-recover.js +1 -1
  44. package/build/js/dist/api-setup.js +1 -1
  45. package/build/js/dist/api-triage.js +1 -1
  46. package/build/js/dist/api-vendors.js +1 -1
  47. package/build/js/dist/api-vendors.js.LICENSE.txt +19 -9
  48. package/build/js/dist/src/locales/de-DE/common.json +995 -0
  49. package/build/js/dist/src/locales/en-UK/common.json +1061 -0
  50. package/build/js/dist/src/locales/es-ES/common.json +995 -0
  51. package/build/js/dist/src/locales/fr-FR/common.json +995 -0
  52. package/build/js/dist/src/locales/ja-JP/common.json +980 -0
  53. package/build/js/dist/src/locales/lt-LT/common.json +1025 -0
  54. package/build/js/dist/src/locales/nl-NL/common.json +995 -0
  55. package/build/js/dist/src/locales/pl-PL/common.json +1025 -0
  56. package/build/js/dist/src/locales/sv-SE/common.json +995 -0
  57. package/package.json +18 -1
  58. package/src/img/controls/attention.svg +1 -0
  59. package/src/locales/en-UK/common.json +80 -16
  60. package/src/react-extension/ApiApp.js +17 -5
  61. package/src/react-extension/ApiFeedback.entry.js +24 -0
  62. package/src/react-extension/ExtApp.js +12 -5
  63. package/src/react-extension/ExtAuthenticationLogin.js +17 -15
  64. package/src/react-extension/ExtAuthenticationLogin.test.stories.js +59 -0
  65. package/src/react-extension/ExtBootstrapApp.js +1 -0
  66. package/src/react-extension/components/Administration/AdministrationWorkspace.js +24 -0
  67. package/src/react-extension/components/Administration/AdministrationWorkspace.test.data.js +3 -3
  68. package/src/react-extension/components/Administration/AdministrationWorkspace.test.js +13 -1
  69. package/src/react-extension/components/Administration/AdministrationWorkspace.test.page.js +7 -0
  70. package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.js +101 -0
  71. package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.test.data.js +23 -0
  72. package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.test.stories.js +27 -0
  73. package/src/react-extension/components/Administration/ConfirmSaveAccountRecoverySettings/ConfirmSaveAccountRecoverySettings.js +1 -1
  74. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.js +78 -2
  75. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.data.js +3 -1
  76. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.js +60 -0
  77. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.page.js +23 -4
  78. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationInternationalisationActions/DisplayAdministrationInternationalisationActions.js +125 -0
  79. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationMfaActions/DisplayAdministrationMfaActions.js +131 -0
  80. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSelfRegistrationActions/DisplayAdministrationSelfRegistrationActions.js +103 -0
  81. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSsoActions/DisplayAdministrationSsoActions.js +91 -0
  82. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSubscriptionActions/DisplayAdministrationSubscriptionActions.js +85 -0
  83. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationUserDirectoryActions/DisplayAdministrationUserDirectoryActions.js +228 -0
  84. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.js +4 -0
  85. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.test.js +9 -0
  86. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.js +3 -3
  87. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.data.js +14 -0
  88. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.page.js +0 -17
  89. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.js +18 -115
  90. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.data.js +11 -13
  91. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.js +38 -43
  92. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.page.js +47 -10
  93. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.stories.js +10 -43
  94. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.js +82 -367
  95. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.data.js +128 -42
  96. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.js +75 -121
  97. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.page.js +46 -16
  98. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.stories.js +18 -14
  99. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.js +103 -0
  100. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.js +53 -0
  101. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.page.js +81 -0
  102. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.stories.js +34 -0
  103. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.js +125 -0
  104. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.data.js +63 -0
  105. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.js +54 -0
  106. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.page.js +88 -0
  107. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.stories.js +35 -0
  108. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.js +381 -0
  109. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.data.js +69 -0
  110. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.js +332 -0
  111. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.page.js +247 -0
  112. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.stories.js +72 -0
  113. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.js +19 -19
  114. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.data.js +1717 -1729
  115. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.js +11 -3
  116. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.page.js +4 -1
  117. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.stories.js +11 -1784
  118. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.js +41 -140
  119. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.data.js +15 -3
  120. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.js +22 -49
  121. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.page.js +19 -11
  122. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.stories.js +9 -3
  123. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.js +5 -6
  124. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.data.js +1717 -1728
  125. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.js +11 -3
  126. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.page.js +4 -1
  127. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.stories.js +11 -1784
  128. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.js +362 -835
  129. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.data.js +427 -418
  130. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.js +134 -175
  131. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.page.js +108 -11
  132. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.stories.js +17 -25
  133. package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.js +4 -2
  134. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.js +3 -3
  135. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.test.js +1 -1
  136. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.js +32 -7
  137. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.data.js +0 -3
  138. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.js +145 -1
  139. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.page.js +52 -1
  140. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.stories.js +15 -0
  141. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.js +340 -0
  142. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.data.js +56 -0
  143. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.js +223 -0
  144. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.page.js +235 -0
  145. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.stories.js +55 -0
  146. package/src/react-extension/components/Administration/ManageSsoSettings/SsoProviders.data.js +34 -0
  147. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.js +12 -3
  148. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.test.js +27 -0
  149. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/SelectAccountRecoveryOrganizationKey.test.page.js +8 -0
  150. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.js +197 -0
  151. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.data.js +37 -0
  152. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.js +187 -0
  153. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.page.js +120 -0
  154. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.stories.js +31 -0
  155. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.js +9 -5
  156. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.data.js +4 -0
  157. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.js +11 -42
  158. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.page.js +1 -0
  159. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.js +9 -5
  160. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.data.js +4 -0
  161. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.js +16 -2
  162. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.page.js +17 -1
  163. package/src/react-extension/components/AuthenticationLogin/Login/Login.js +159 -61
  164. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.data.js +14 -11
  165. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.js +79 -0
  166. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.page.js +16 -0
  167. package/src/react-extension/components/AuthenticationLogin/OrchestrateLogin/OrchestrateLoginBoxMain.js +2 -0
  168. package/src/react-extension/components/AuthenticationSetup/SetupAuthentication/SetupAuthentication.js +4 -0
  169. package/src/react-extension/components/Common/Error/ApiError/ApiError.js +119 -0
  170. package/src/react-extension/components/Common/Error/ApiError/ApiError.test.js +43 -0
  171. package/src/react-extension/components/Common/Error/ApiError/ApiError.test.page.js +108 -0
  172. package/src/react-extension/components/Common/Error/ApiError/ApiError.test.stories.js +39 -0
  173. package/src/react-extension/components/Common/Inputs/Autocomplete/Autocomplete.test.js +12 -0
  174. package/src/react-extension/components/Common/Inputs/Autocomplete/AutocompleteItem.js +2 -2
  175. package/src/react-extension/components/Common/Legacy/HandleLegacyAppjs.js +1 -1
  176. package/src/react-extension/components/Common/Navigation/Header/Logo.js +13 -1
  177. package/src/react-extension/components/Resource/CreateResource/CreateResource.js +103 -30
  178. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.js +44 -10
  179. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.page.js +35 -7
  180. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.js +3 -3
  181. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesListContextualMenu.js +6 -5
  182. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.js +5 -4
  183. package/src/react-extension/components/Resource/EditResource/EditResource.js +95 -23
  184. package/src/react-extension/components/Resource/EditResource/EditResource.test.js +45 -13
  185. package/src/react-extension/components/Resource/EditResource/EditResource.test.page.js +35 -2
  186. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetails.js +2 -1
  187. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsInformation.js +3 -2
  188. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.js +23 -2
  189. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.js +8 -0
  190. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.page.js +26 -2
  191. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.js +22 -1
  192. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.js +8 -0
  193. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.page.js +25 -2
  194. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetails.js +2 -1
  195. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.js +2 -1
  196. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.js +14 -1
  197. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.js +8 -0
  198. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.page.js +12 -0
  199. package/src/react-extension/components/User/CreateUser/CreateUser.js +42 -3
  200. package/src/react-extension/components/User/CreateUser/CreateUser.test.js +16 -0
  201. package/src/react-extension/components/User/CreateUser/CreateUser.test.page.js +26 -0
  202. package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.js +2 -1
  203. package/src/react-extension/components/User/DisplayUsersContextualMenu/DisplayUsersContextualMenu.js +5 -5
  204. package/src/react-extension/components/User/EditUser/EditUser.js +29 -2
  205. package/src/react-extension/components/User/EditUser/EditUser.test.js +12 -0
  206. package/src/react-extension/components/User/EditUser/EditUser.test.page.js +26 -0
  207. package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.js +2 -1
  208. package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.test.data.js +1332 -1331
  209. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.js +2 -1
  210. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.js +19 -1
  211. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.js +9 -0
  212. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.page.js +12 -0
  213. package/src/react-extension/components/UserGroup/DisplayUserGroupDetails/DisplayUserGroupDetails.js +2 -1
  214. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.js +16 -1
  215. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.js +8 -0
  216. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.page.js +26 -1
  217. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.js +1 -1
  218. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.js +6 -4
  219. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.data.js +4 -1
  220. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.js +21 -11
  221. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.page.js +10 -1
  222. package/src/react-extension/contexts/AdminSmtpSettingsContext.js +2 -0
  223. package/src/react-extension/contexts/AdminSmtpSettingsContext.test.data.js +13 -0
  224. package/src/react-extension/contexts/AdminSmtpSettingsContext.test.js +3 -1
  225. package/src/react-extension/contexts/AdminSsoContext.js +558 -0
  226. package/src/react-extension/contexts/AdminSsoContext.test.data.js +51 -0
  227. package/src/react-extension/contexts/Administration/AdministrationInternationalizationContext/AdministrationInternationalizationContext.js +194 -0
  228. package/src/react-extension/contexts/Administration/AdministrationInternationalizationContext/AdministrationInternationalizationContext.test.js +111 -0
  229. package/src/react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext.js +265 -0
  230. package/src/react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext.test.js +178 -0
  231. package/src/react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext.js +453 -0
  232. package/src/react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext.test.js +218 -0
  233. package/src/react-extension/contexts/Administration/AdministrationSubscription/AdministrationSubscription.js +168 -0
  234. package/src/react-extension/contexts/Administration/AdministrationSubscription/AdministrationSubscription.test.js +73 -0
  235. package/src/react-extension/contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext.js +353 -0
  236. package/src/react-extension/contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext.test.js +220 -0
  237. package/src/react-extension/contexts/AdministrationWorkspaceContext.js +17 -178
  238. package/src/react-extension/contexts/AdministrationWorkspaceContext.test.js +0 -26
  239. package/src/react-extension/contexts/ApiAppContext.test.data.js +4 -2
  240. package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.js +54 -4
  241. package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.test.data.js +10 -1
  242. package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.test.js +92 -14
  243. package/src/react-extension/contexts/Authentication/AuthenticationSetupContext.js +1 -0
  244. package/src/react-extension/contexts/NavigationContext.js +34 -0
  245. package/src/react-extension/contexts/SsoContext.js +151 -0
  246. package/src/react-extension/contexts/SsoContext.test.data.js +36 -0
  247. package/src/react-extension/contexts/SsoContext.test.js +104 -0
  248. package/src/react-extension/lib/Domain/DomainUtil.js +70 -0
  249. package/src/react-extension/lib/Domain/DomainUtil.test.js +129 -0
  250. package/src/react-extension/lib/Domain/Domains.js +6113 -0
  251. package/src/react-extension/lib/Error/InputValidator.js +24 -0
  252. package/src/react-extension/lib/Map/DynamicRef.js +49 -0
  253. package/src/react-extension/lib/Map/DynamicRef.test.js +56 -0
  254. package/src/react-extension/lib/Map/MapObject.js +48 -0
  255. package/src/react-extension/lib/Map/MapObject.test.js +43 -0
  256. package/src/react-quickaccess/ExtQuickAccess.js +7 -4
  257. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.js +3 -1
  258. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.data.js +4 -0
  259. package/src/react-quickaccess/components/LoginPage/LoginPage.js +115 -4
  260. package/src/react-quickaccess/components/LoginPage/LoginPage.test.data.js +10 -0
  261. package/src/react-quickaccess/components/LoginPage/LoginPage.test.stories.js +30 -3
  262. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.js +33 -1
  263. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.data.js +25 -0
  264. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.js +60 -0
  265. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.page.js +60 -0
  266. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.js +33 -1
  267. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.js +36 -7
  268. package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.js +3 -2
  269. package/src/react-quickaccess/contexts/SsoContext.js +150 -0
  270. package/src/react-web-integration/lib/InForm/InFormFieldSelector.js +5 -0
  271. package/src/shared/constants/inputs.const.js +30 -0
  272. package/src/shared/lib/Browser/clipBoard.js +45 -0
  273. package/src/shared/lib/Browser/clipBoard.test.js +59 -0
  274. package/src/shared/models/Mfa/Duo.js +36 -0
  275. package/src/shared/models/Mfa/Duo.test.js +59 -0
  276. package/src/shared/models/Mfa/MfaDTO.js +51 -0
  277. package/src/shared/models/Mfa/MfaDTO.test.js +48 -0
  278. package/src/shared/models/Mfa/MfaEnumeration.js +17 -0
  279. package/src/shared/models/Mfa/MfaModel.js +48 -0
  280. package/src/shared/models/Mfa/MfaModel.test.js +37 -0
  281. package/src/shared/models/Mfa/Yubikey.js +35 -0
  282. package/src/shared/models/Mfa/Yubikey.test.js +47 -0
  283. package/src/shared/models/selfRegistration/SelfRegistrationDomainsViewModel.js +55 -0
  284. package/src/shared/models/selfRegistration/SelfRegistrationDomainsViewModel.test.js +37 -0
  285. package/src/shared/models/selfRegistration/SelfRegistrationDto.js +42 -0
  286. package/src/shared/models/selfRegistration/SelfRegistrationDto.test.js +48 -0
  287. package/src/shared/models/selfRegistration/SelfRegistrationEnumeration.js +17 -0
  288. package/src/shared/models/subscription/SubscriptionDto.js +34 -0
  289. package/src/shared/models/subscription/SubscriptionDto.test.js +31 -0
  290. package/src/shared/models/subscription/SubscriptionModel.js +33 -0
  291. package/src/shared/models/subscription/SubscriptionModel.test.js +48 -0
  292. package/src/shared/models/user/UserModel.js +37 -0
  293. package/src/shared/models/userDirectory/UserDirectoryDTO.js +57 -0
  294. package/src/shared/models/userDirectory/UserDirectoryDTO.test.js +40 -0
  295. package/src/shared/models/userDirectory/UserDirectoryEnum.js +22 -0
  296. package/src/shared/models/userDirectory/UserDirectoryModel.js +64 -0
  297. package/src/shared/models/userDirectory/UserDirectoryModel.test.js +37 -0
  298. package/src/shared/services/actions/subscription/SubscriptionActionService.js +69 -0
  299. package/src/shared/services/actions/subscription/SubscriptionActionService.test.js +73 -0
  300. package/src/shared/services/api/Internationalisation/InternationalisationService.js +46 -0
  301. package/src/shared/services/api/Mfa/MfaService.js +54 -0
  302. package/src/shared/services/{accountRecovery → api/accountRecovery}/ApiAppAccountRecoveryUserService.js +2 -2
  303. package/src/shared/services/{accountRecovery → api/accountRecovery}/ExtAppAccountRecoveryUserService.js +0 -0
  304. package/src/shared/services/api/secrets/pownedService.js +64 -0
  305. package/src/shared/services/api/secrets/pownedService.test.js +63 -0
  306. package/src/shared/services/api/selfRegistration/selfRegistrationService.js +64 -0
  307. package/src/shared/services/api/user/UserService.js +45 -0
  308. package/src/shared/services/api/userDirectory/UserDirectoryService.js +108 -0
  309. package/src/shared/services/forms/Mfa/MfaFormService.js +195 -0
  310. package/src/shared/services/forms/Mfa/MfaFormService.test.js +341 -0
  311. package/src/shared/services/forms/selfRegistration/SelfRegistrationFormService.js +92 -0
  312. package/src/shared/services/forms/selfRegistration/SelfRegistrationFormService.test.js +101 -0
  313. package/src/shared/services/forms/userDirectory/UserDirectoryFormService.js +118 -0
  314. package/src/shared/services/forms/userDirectory/UserDirectoryFormService.test.js +128 -0
  315. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.js +0 -205
  316. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.data.js +0 -37
  317. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.js +0 -197
  318. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.page.js +0 -133
@@ -13,16 +13,13 @@
13
13
  */
14
14
  import React from "react";
15
15
  import PropTypes from "prop-types";
16
- import {withAppContext} from "../../../contexts/AppContext";
17
- import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
18
16
  import Icon from "../../../../shared/components/Icons/Icon";
19
17
  import {withAdministrationWorkspace} from "../../../contexts/AdministrationWorkspaceContext";
20
- import XRegExp from "xregexp";
21
- import DisplayTestUserDirectoryAdministration
22
- from "../DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration";
23
- import {withDialog} from "../../../contexts/DialogContext";
24
18
  import {Trans, withTranslation} from "react-i18next";
25
19
  import Select from "../../Common/Select/Select";
20
+ import DisplayAdministrationUserDirectoryActions from "../DisplayAdministrationWorkspaceActions/DisplayAdministrationUserDirectoryActions/DisplayAdministrationUserDirectoryActions";
21
+ import UserDirectoryFormService from '../../../../shared/services/forms/userDirectory/UserDirectoryFormService';
22
+ import {withAdminUserDirectory} from "../../../contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext";
26
23
 
27
24
  /**
28
25
  * This component allows to display the MFA for the administration
@@ -35,312 +32,81 @@ class DisplayUserDirectoryAdministration extends React.Component {
35
32
  constructor(props) {
36
33
  super(props);
37
34
  this.state = this.defaultState;
38
- this.createRefs();
35
+ this.userDirectoryFormService = UserDirectoryFormService.getInstance(this.props.adminUserDirectoryContext, this.props.t);
39
36
  this.bindCallbacks();
40
37
  }
41
38
 
39
+
42
40
  /**
43
41
  * Get default state
44
42
  * @returns {*}
45
43
  */
46
44
  get defaultState() {
47
45
  return {
48
- loading: true, // component is loading or not
49
- processing: false, // component is processing or not
50
-
51
46
  hasFieldFocus: false, // true if the form field has focus
52
-
53
- openCredentials: true, // section credential open
54
- openDirectoryConfiguration: false, // section directory configuration open
55
- openSynchronizationOptions: false, // section synchronization options open
56
-
57
- openConnectionType: false, // select connection type
58
- openDefaultAdmin: false, // select default user admin
59
- openDefaultGroupAdmin: false, // select default group user admin
60
-
61
- // FORM FIELDS
62
- userDirectoryToggle: false, // User directory toggle value
63
- // CREDENTIALS FIELDS
64
- directoryType: "ad",
65
- connectionType: "plain",
66
- host: "",
67
- hostError: null,
68
- port: "389",
69
- portError: null,
70
- username: "",
71
- password: "",
72
- domain: "",
73
- domainError: null,
74
- baseDn: "",
75
- // DIRECTORY CONFIGURATION FIELDS
76
- groupPath: "",
77
- userPath: "",
78
- groupObjectClass: "",
79
- userObjectClass: "",
80
- useEmailPrefix: false,
81
- emailPrefix: "",
82
- emailSuffix: "",
83
- // SYNCHRONIZATION OPTIONS
84
- defaultAdmin: "",
85
- defaultGroupAdmin: "",
86
- groupsParentGroup: "",
87
- usersParentGroup: "",
88
- enabledUsersOnly: false,
89
- createUsers: true,
90
- deleteUsers: true,
91
- createGroups: true,
92
- deleteGroups: true,
93
- updateGroups: true,
94
- // The search field to select a default user
95
- defaultAdminSearch: "",
96
- defaultGroupAdminSearch: "",
97
-
98
- users: null, // all users
99
-
100
- hasAlreadyBeenValidated: false, // True if the form has already been submitted once
101
47
  };
102
48
  }
103
49
 
104
- async componentDidMount() {
105
- document.addEventListener('click', this.handleUserDirectoryClickEvent, {capture: true});
106
- this.findAllUserDirectorySettings();
107
- }
50
+ /**
51
+ * ComponentDidMount
52
+ * Invoked immediately after component is inserted into the tree
53
+ * @return {void}
54
+ */
108
55
 
109
- componentWillUnmount() {
110
- document.removeEventListener('click', this.handleUserDirectoryClickEvent, {capture: true});
56
+ async componentDidMount() {
57
+ this.props.administrationWorkspaceContext.setDisplayAdministrationWorkspaceAction(DisplayAdministrationUserDirectoryActions);
58
+ this.props.adminUserDirectoryContext.findUserDirectorySettings();
111
59
  }
112
60
 
113
61
  /**
114
- * Whenever the component has updated in terms of props or state
115
- * @param prevProps
62
+ * componentWillUnmount
63
+ * Use to clear the data from the form in case the user put something that needs to be cleared.
116
64
  */
117
- async componentDidUpdate(prevProps, prevState) {
118
- await this.handleEnabledTestButton(prevState.userDirectoryToggle);
119
- await this.handleMustSubmit(prevProps.administrationWorkspaceContext);
65
+ componentWillUnmount() {
66
+ this.props.administrationWorkspaceContext.resetDisplayAdministrationWorkspaceAction();
67
+ this.props.adminUserDirectoryContext.clearContext();
68
+ UserDirectoryFormService.killInstance();
69
+ this.userDirectoryFormService = null;
120
70
  }
121
71
 
72
+
122
73
  /**
123
74
  * Bind callbacks methods
124
75
  */
125
76
  bindCallbacks() {
126
- this.handleUserDirectoryClickEvent = this.handleUserDirectoryClickEvent.bind(this);
127
-
128
77
  this.handleCredentialTitleClicked = this.handleCredentialTitleClicked.bind(this);
129
78
  this.handleDirectoryConfigurationTitleClicked = this.handleDirectoryConfigurationTitleClicked.bind(this);
130
79
  this.handleSynchronizationOptionsTitleClicked = this.handleSynchronizationOptionsTitleClicked.bind(this);
131
- this.handleConnectionTypeClicked = this.handleConnectionTypeClicked.bind(this);
132
-
133
- this.handleInputChange = this.handleInputChange.bind(this);
134
- this.handleHostInputKeyUp = this.handleHostInputKeyUp.bind(this);
135
- this.handlePortInputKeyUp = this.handlePortInputKeyUp.bind(this);
136
- this.handleDomainInputKeyUp = this.handleDomainInputKeyUp.bind(this);
137
80
  this.handleFieldFocus = this.handleFieldFocus.bind(this);
138
81
  this.handleFieldBlur = this.handleFieldBlur.bind(this);
139
- this.stopPropagation = this.stopPropagation.bind(this);
140
- this.handleConnectionTypeChange = this.handleConnectionTypeChange.bind(this);
141
- }
142
-
143
- /**
144
- * Create DOM nodes or React elements references in order to be able to access them programmatically.
145
- */
146
- createRefs() {
147
- this.connectionTypeRef = React.createRef();
148
- }
149
-
150
- /**
151
- * Handle the userDirectoryToggle change
152
- * @param previousUserDirectoryToggle Previous userDirectoryToggle settings
153
- */
154
- handleEnabledTestButton(previousUserDirectoryToggle) {
155
- const hasPreviousUserDirectoryToggleChanged = this.state.userDirectoryToggle !== previousUserDirectoryToggle;
156
- if (hasPreviousUserDirectoryToggleChanged) {
157
- this.props.administrationWorkspaceContext.onTestEnabled(this.state.userDirectoryToggle);
158
- }
159
- }
160
-
161
- /**
162
- * Handle click events on UserDirectory component. Hide the component if the click occurred outside of the component.
163
- * @param {ReactEvent} event The event
164
- */
165
- handleUserDirectoryClickEvent(event) {
166
- // Prevent stop editing when the user click on an element of the editor
167
- if (this.connectionTypeRef.current !== null && !this.connectionTypeRef.current.contains(event.target)) {
168
- this.setState({openConnectionType: false});
169
- }
170
- }
171
-
172
- /**
173
- * Stop propagation event
174
- * @param event
175
- */
176
- stopPropagation(event) {
177
- event.stopPropagation();
178
- }
179
-
180
- /**
181
- * Handle the must submit
182
- * @param previousAdministrationWorkspaceContext Previous administration workspace context settings
183
- */
184
- async handleMustSubmit(previousAdministrationWorkspaceContext) {
185
- const hasMustSaveChanged = this.props.administrationWorkspaceContext.must.save !== previousAdministrationWorkspaceContext.must.save;
186
- const hasMustTestChanged = this.props.administrationWorkspaceContext.must.test !== previousAdministrationWorkspaceContext.must.test;
187
- if ((hasMustSaveChanged && this.props.administrationWorkspaceContext.must.save)
188
- || (hasMustTestChanged && this.props.administrationWorkspaceContext.must.test)) {
189
- await this.handleFormSubmit();
190
- this.props.administrationWorkspaceContext.onResetActionsSettings();
191
- }
192
- }
193
-
194
- /**
195
- * fetch the user directory settings
196
- */
197
- async findAllUserDirectorySettings() {
198
- // USER DIRECTORY SETTINGS
199
- const result = await this.props.administrationWorkspaceContext.onGetUsersDirectoryRequested();
200
- const userDirectory = result.body;
201
- // USERS
202
- const usersResult = await this.props.administrationWorkspaceContext.onGetUsersRequested();
203
- const users = this.sortUsers(usersResult.body);
204
- let defaultAdmin = "";
205
- let defaultGroupAdmin = "";
206
-
207
- if (userDirectory.length !== 0) {
208
- const userDirectoryToggle = true;
209
- const directoryType = userDirectory.directory_type;
210
- const connectionType = userDirectory.connection_type;
211
- const domain = userDirectory.domain_name;
212
- const username = userDirectory.username;
213
- const password = userDirectory.password;
214
- const baseDn = userDirectory.base_dn;
215
- const host = userDirectory.server;
216
- const port = userDirectory.port.toString();
217
- defaultAdmin = userDirectory.default_user;
218
- defaultGroupAdmin = userDirectory.default_group_admin_user;
219
- const createUsers = userDirectory.sync_users_create;
220
- const deleteUsers = userDirectory.sync_users_delete;
221
- const createGroups = userDirectory.sync_groups_create;
222
- const deleteGroups = userDirectory.sync_groups_delete;
223
- const updateGroups = userDirectory.sync_groups_update;
224
- const enabledUsersOnly = userDirectory.enabled_users_only === true;
225
- const groupPath = userDirectory.group_path;
226
- const userPath = userDirectory.user_path;
227
- const groupObjectClass = userDirectory.group_object_class;
228
- const userObjectClass = userDirectory.user_object_class;
229
- const useEmailPrefix = userDirectory.use_email_prefix_suffix;
230
- const emailPrefix = userDirectory.email_prefix;
231
- const emailSuffix = userDirectory.email_suffix;
232
- const groupsParentGroup = userDirectory.groups_parent_group;
233
- const usersParentGroup = userDirectory.users_parent_group;
234
-
235
- this.setState({
236
- loading: false,
237
- users,
238
- userDirectoryToggle,
239
- directoryType,
240
- connectionType,
241
- domain,
242
- username,
243
- password,
244
- baseDn,
245
- host,
246
- port,
247
- defaultAdmin,
248
- defaultGroupAdmin,
249
- enabledUsersOnly,
250
- groupPath,
251
- userPath,
252
- groupObjectClass,
253
- userObjectClass,
254
- useEmailPrefix,
255
- emailPrefix,
256
- emailSuffix,
257
- groupsParentGroup,
258
- usersParentGroup,
259
- createUsers,
260
- deleteUsers,
261
- createGroups,
262
- deleteGroups,
263
- updateGroups
264
- });
265
- this.props.administrationWorkspaceContext.onTestEnabled(userDirectoryToggle);
266
- this.props.administrationWorkspaceContext.onSynchronizeEnabled(userDirectoryToggle);
267
- } else {
268
- const userLogged = users.find(user => this.props.context.loggedInUser.id === user.id);
269
- defaultAdmin = userLogged.id;
270
- defaultGroupAdmin = userLogged.id;
271
- this.setState({
272
- loading: false,
273
- users,
274
- defaultAdmin,
275
- defaultGroupAdmin
276
- });
277
- }
278
- }
279
-
280
- sortUsers(users) {
281
- const getUserFullName = user => `${user.profile.first_name} ${user.profile.last_name}`;
282
- const nameSorter = (u1, u2) => getUserFullName(u1).localeCompare(getUserFullName(u2));
283
- return users.sort(nameSorter);
82
+ this.handleInputChange = this.handleInputChange.bind(this);
284
83
  }
285
84
 
286
85
  /**
287
86
  * Handle the click on the credential title
87
+ * @param {UserDirectory} userDirectory state
288
88
  */
289
89
  handleCredentialTitleClicked() {
290
- this.setState({openCredentials: !this.state.openCredentials});
90
+ const settings = this.props.adminUserDirectoryContext.getSettings();
91
+ this.props.adminUserDirectoryContext.setSettings("openCredentials", !settings.openCredentials);
291
92
  }
292
93
 
293
94
  /**
294
95
  * Handle the click on the credential title
96
+ * @param {UserDirectory} userDirectory state
295
97
  */
296
98
  handleDirectoryConfigurationTitleClicked() {
297
- this.setState({openDirectoryConfiguration: !this.state.openDirectoryConfiguration});
99
+ const settings = this.props.adminUserDirectoryContext.getSettings();
100
+ this.props.adminUserDirectoryContext.setSettings('openDirectoryConfiguration', !settings.openDirectoryConfiguration);
298
101
  }
299
102
 
300
103
  /**
301
104
  * Handle the click on the credential title
105
+ * @param {UserDirectory} userDirectory state
302
106
  */
303
107
  handleSynchronizationOptionsTitleClicked() {
304
- this.setState({openSynchronizationOptions: !this.state.openSynchronizationOptions});
305
- }
306
-
307
- /**
308
- * Handle the click on the connection type
309
- */
310
- handleConnectionTypeClicked() {
311
- if (!this.hasAllInputDisabled()) {
312
- this.setState({openConnectionType: !this.state.openConnectionType});
313
- }
314
- }
315
-
316
- /**
317
- * Handle host input keyUp event.
318
- */
319
- handleHostInputKeyUp() {
320
- if (this.state.hasAlreadyBeenValidated) {
321
- const state = this.validateHostInput();
322
- this.setState(state);
323
- }
324
- }
325
-
326
- /**
327
- * Handle port input keyUp event.
328
- */
329
- handlePortInputKeyUp() {
330
- if (this.state.hasAlreadyBeenValidated) {
331
- const state = this.validatePortInput();
332
- this.setState(state);
333
- }
334
- }
335
-
336
- /**
337
- * Handle host input keyUp event.
338
- */
339
- handleDomainInputKeyUp() {
340
- if (this.state.hasAlreadyBeenValidated) {
341
- const state = this.validateDomainInput();
342
- this.setState(state);
343
- }
108
+ const settings = this.props.adminUserDirectoryContext.getSettings();
109
+ this.props.adminUserDirectoryContext.setSettings('openSynchronizationOptions', !settings.openSynchronizationOptions);
344
110
  }
345
111
 
346
112
  /**
@@ -352,28 +118,42 @@ class DisplayUserDirectoryAdministration extends React.Component {
352
118
  const target = event.target;
353
119
  const value = target.type === "checkbox" ? target.checked : target.value;
354
120
  const name = target.name;
355
- this.setState({[name]: value});
356
- this.handleEnabledSaveButton();
121
+ this.props.adminUserDirectoryContext.setSettings(name, value);
122
+ this.validateInput(name, value);
357
123
  }
358
124
 
359
125
  /**
360
- * Handle connection typeclick event
361
- * @param event
126
+ * validate the input
127
+ * @params {string} The input name
128
+ * @params {string} The input valude
129
+ * @returns {void}
362
130
  */
363
- handleConnectionTypeChange(event) {
364
- const target = event.target;
365
- const connectionType = target.value;
366
- this.setState({connectionType, hasFieldFocus: false}); // Due to React < v17 onBlur is not propagated by the child
367
- this.handleEnabledSaveButton();
131
+ validateInput(name, value) {
132
+ switch (name) {
133
+ case 'host':
134
+ this.userDirectoryFormService.validateHostInput(value);
135
+ break;
136
+ case 'domain':
137
+ this.userDirectoryFormService.validateDomainInput(value);
138
+ break;
139
+ case 'port':
140
+ this.userDirectoryFormService.validatePortInput(value);
141
+ break;
142
+ }
368
143
  }
369
144
 
370
145
  /**
371
- * Handle enabled the save button
146
+ * Handle field focus
372
147
  */
373
- handleEnabledSaveButton() {
374
- if (!this.props.administrationWorkspaceContext.can.save) {
375
- this.props.administrationWorkspaceContext.onSaveEnabled();
376
- }
148
+ handleFieldFocus() {
149
+ this.setState({hasFieldFocus: true});
150
+ }
151
+
152
+ /**
153
+ * Handle field blur
154
+ */
155
+ handleFieldBlur() {
156
+ this.setState({hasFieldFocus: false});
377
157
  }
378
158
 
379
159
  /**
@@ -381,7 +161,8 @@ class DisplayUserDirectoryAdministration extends React.Component {
381
161
  * @returns {boolean}
382
162
  */
383
163
  hasAllInputDisabled() {
384
- return this.state.processing || this.state.loading;
164
+ const settings = this.props.adminUserDirectoryContext.getSettings();
165
+ return settings.processing || settings.loading;
385
166
  }
386
167
 
387
168
  /**
@@ -389,265 +170,38 @@ class DisplayUserDirectoryAdministration extends React.Component {
389
170
  * @returns {boolean}
390
171
  */
391
172
  isUserDirectoryChecked() {
392
- return this.state.userDirectoryToggle;
173
+ return this.props.adminUserDirectoryContext.getSettings().userDirectoryToggle;
393
174
  }
394
175
 
395
176
  /**
396
177
  * If active directory is checked
397
178
  */
398
179
  isActiveDirectoryChecked() {
399
- return this.state.directoryType === "ad";
180
+ return this.props.adminUserDirectoryContext.getSettings().directoryType === "ad";
400
181
  }
401
182
 
402
183
  /**
403
184
  * If open ldap is checked
404
185
  */
405
186
  isOpenLdapChecked() {
406
- return this.state.directoryType === "openldap";
187
+ return this.props.adminUserDirectoryContext.getSettings().directoryType === "openldap";
407
188
  }
408
189
 
409
190
  /**
410
191
  * If use email prefix is checked
411
192
  */
412
193
  isUseEmailPrefixChecked() {
413
- return this.state.useEmailPrefix;
414
- }
415
-
416
- /**
417
- * Validate the form.
418
- * @returns {Promise<boolean>}
419
- */
420
- async validate() {
421
- // Validate the form inputs.
422
- await Promise.all([
423
- this.validateHostInput(),
424
- this.validatePortInput(),
425
- this.validateDomainInput(),
426
- ]);
427
- }
428
-
429
- /**
430
- * Validate the host input.
431
- * @returns {Promise<void>}
432
- */
433
- async validateHostInput() {
434
- let hostError = null;
435
- const host = this.state.host.trim();
436
- if (!host.length) {
437
- hostError = this.translate("A host is required.");
438
- }
439
- return this.setState({hostError});
440
- }
441
-
442
- /**
443
- * Validate the port input.
444
- * @returns {Promise<void>}
445
- */
446
- async validatePortInput() {
447
- let portError = null;
448
- const port = this.state.port.trim();
449
- if (!port.length) {
450
- portError = this.translate("A port is required.");
451
- } else if (!XRegExp("^[0-9]+").test(port)) {
452
- portError = this.translate("Only numeric characters allowed.");
453
- }
454
- return this.setState({portError});
455
- }
456
-
457
- /**
458
- * Validate the domain input.
459
- * @returns {Promise<void>}
460
- */
461
- async validateDomainInput() {
462
- let domainError = null;
463
- const domain = this.state.domain.trim();
464
- if (!domain.length) {
465
- domainError = this.translate("A domain name is required.");
466
- }
467
- return this.setState({domainError});
468
- }
469
-
470
- /**
471
- * Return true if the form has some validation error
472
- * @returns {boolean}
473
- */
474
- hasValidationError() {
475
- return this.state.hostError !== null || this.state.portError !== null || this.state.domainError !== null;
476
- }
477
-
478
- /**
479
- * Handle form submit event.
480
- * @params {ReactEvent} The react event
481
- * @returns {void}
482
- */
483
- async handleFormSubmit() {
484
- await this.setState({hasAlreadyBeenValidated: true});
485
- // Do not re-submit an already processing form
486
- if (!this.state.processing) {
487
- await this.toggleProcessing();
488
- await this.validate();
489
- if (this.hasValidationError()) {
490
- await this.toggleProcessing();
491
- return;
492
- }
493
- try {
494
- if (this.props.administrationWorkspaceContext.must.save) {
495
- await this.saveUserDirectory();
496
- await this.handleSaveSuccess();
497
- } else if (this.props.administrationWorkspaceContext.must.test) {
498
- await this.testUserDirectory();
499
- }
500
- this.setState({processing: false});
501
- } catch (error) {
502
- await this.handleSaveError(error);
503
- }
504
- }
505
- }
506
-
507
- createUserDirectoryDTO() {
508
- const directory_type = this.state.directoryType;
509
- const domain_name = this.state.domain;
510
- const connection_type = this.state.connectionType;
511
- const server = this.state.host;
512
- const port = parseInt(this.state.port);
513
- const username = this.state.username;
514
- const password = this.state.password;
515
- const base_dn = this.state.baseDn;
516
- const group_path = this.state.groupPath;
517
- const user_path = this.state.userPath;
518
- const default_user = this.state.defaultAdmin;
519
- const default_group_admin_user = this.state.defaultGroupAdmin;
520
- const groups_parent_group = this.state.groupsParentGroup;
521
- const users_parent_group = this.state.usersParentGroup;
522
- const enabled_users_only = this.state.enabledUsersOnly;
523
- const sync_users_create = this.state.createUsers;
524
- const sync_users_delete = this.state.deleteUsers;
525
- const sync_groups_create = this.state.createGroups;
526
- const sync_groups_delete = this.state.deleteGroups;
527
- const sync_groups_update = this.state.updateGroups;
528
- const enabled = this.state.userDirectoryToggle;
529
-
530
- let group_object_class = "";
531
- let user_object_class = "";
532
- let use_email_prefix_suffix = false;
533
- let email_prefix = "";
534
- let email_suffix = "";
535
- if (directory_type == "openldap") {
536
- group_object_class = this.state.groupObjectClass;
537
- user_object_class = this.state.userObjectClass;
538
- use_email_prefix_suffix = this.state.useEmailPrefix;
539
-
540
- if (use_email_prefix_suffix) {
541
- email_prefix = this.state.emailPrefix;
542
- email_suffix = this.state.emailSuffix;
543
- }
544
- }
545
-
546
- return {
547
- directory_type,
548
- domain_name,
549
- connection_type,
550
- server,
551
- port,
552
- username,
553
- password,
554
- base_dn,
555
- group_path,
556
- user_path,
557
- group_object_class,
558
- user_object_class,
559
- default_user,
560
- default_group_admin_user,
561
- groups_parent_group,
562
- users_parent_group,
563
- enabled_users_only,
564
- sync_users_create,
565
- sync_users_delete,
566
- sync_groups_create,
567
- sync_groups_delete,
568
- sync_groups_update,
569
- enabled,
570
- use_email_prefix_suffix,
571
- email_prefix,
572
- email_suffix
573
- };
574
- }
575
-
576
- /**
577
- * save user directory settings
578
- * @returns {Promise<*>}
579
- */
580
- async saveUserDirectory() {
581
- if (this.state.userDirectoryToggle) {
582
- await this.props.administrationWorkspaceContext.onUpdateUsersDirectoryRequested(this.createUserDirectoryDTO());
583
- this.props.administrationWorkspaceContext.onSynchronizeEnabled(true);
584
- } else {
585
- this.setState(this.defaultState);
586
- await this.props.administrationWorkspaceContext.onDeleteUsersDirectoryRequested();
587
- this.props.administrationWorkspaceContext.onSynchronizeEnabled(false);
588
- this.setState({loading: false});
589
- }
590
- }
591
-
592
- /**
593
- * test user directory settings
594
- */
595
- async testUserDirectory() {
596
- const result = await this.props.administrationWorkspaceContext.onTestUsersDirectoryRequested(this.createUserDirectoryDTO());
597
- const displayTestUserDirectoryDialogProps = {
598
- userDirectoryTestResult: result.body
599
- };
600
- this.props.context.setContext({displayTestUserDirectoryDialogProps});
601
- this.props.dialogContext.open(DisplayTestUserDirectoryAdministration);
602
- }
603
-
604
- /**
605
- * Handle save operation success.
606
- */
607
- async handleSaveSuccess() {
608
- await this.props.actionFeedbackContext.displaySuccess(this.translate("The user directory settings for the organization were updated."));
609
- }
610
-
611
- /**
612
- * Handle save operation error.
613
- * @param {object} error The returned error
614
- */
615
- async handleSaveError(error) {
616
- // It can happen when the user has closed the passphrase entry dialog by instance.
617
- if (error.name === "UserAbortsOperationError") {
618
- this.setState({processing: false});
619
- } else {
620
- // Unexpected error occurred.
621
- console.error(error);
622
- await this.handleError(error);
623
- this.setState({processing: false});
624
- }
625
- }
626
-
627
- /**
628
- * handle error to display the error dialog
629
- * @param error
630
- */
631
- async handleError(error) {
632
- await this.props.actionFeedbackContext.displayError(error.message);
633
- }
634
-
635
- /**
636
- * Toggle processing state
637
- * @returns {Promise<void>}
638
- */
639
- async toggleProcessing() {
640
- const prev = this.state.processing;
641
- return this.setState({processing: !prev});
194
+ return this.props.adminUserDirectoryContext.getSettings().useEmailPrefix;
642
195
  }
643
196
 
644
197
  /**
645
198
  * Get users allowed to be default admin
646
199
  */
647
200
  getUsersAllowedToBeDefaultAdmin() {
648
- if (this.state.users !== null) {
649
- const users = this.state.users.filter(user => user.active === true && user.role.name === "admin");
650
- return users && users.map(user => ({value: user.id, label: this.displayUser(user)}));
201
+ const users = this.props.adminUserDirectoryContext.getUsers();
202
+ if (users !== null) {
203
+ const usersFiltered = users.filter(user => user.active === true && user.role.name === "admin");
204
+ return usersFiltered && usersFiltered.map(user => ({value: user.id, label: this.displayUser(user)}));
651
205
  }
652
206
  return [];
653
207
  }
@@ -656,9 +210,10 @@ class DisplayUserDirectoryAdministration extends React.Component {
656
210
  * Get users allowed to be default group admin
657
211
  */
658
212
  getUsersAllowedToBeDefaultGroupAdmin() {
659
- if (this.state.users !== null) {
660
- const users = this.state.users.filter(user => user.active === true);
661
- return users && users.map(user => ({value: user.id, label: this.displayUser(user)}));
213
+ const users = this.props.adminUserDirectoryContext.getUsers();
214
+ if (users !== null) {
215
+ const usersFiltered = users.filter(user => user.active === true);
216
+ return usersFiltered && usersFiltered.map(user => ({value: user.id, label: this.displayUser(user)}));
662
217
  }
663
218
  return [];
664
219
  }
@@ -672,17 +227,6 @@ class DisplayUserDirectoryAdministration extends React.Component {
672
227
  return `${user.profile.first_name} ${user.profile.last_name} (${user.username})`;
673
228
  }
674
229
 
675
- /**
676
- * Display default admin
677
- */
678
- displayDefaultAdmin() {
679
- if (this.state.users !== null && this.state.defaultAdmin !== "") {
680
- const user = this.state.users.find(user => user.id === this.state.defaultAdmin);
681
- return this.displayUser(user);
682
- }
683
- return "";
684
- }
685
-
686
230
  /**
687
231
  * get the connection type
688
232
  */
@@ -694,326 +238,309 @@ class DisplayUserDirectoryAdministration extends React.Component {
694
238
  ];
695
239
  }
696
240
 
697
- /**
698
- * Handle field focus
699
- */
700
- handleFieldFocus() {
701
- this.setState({hasFieldFocus: true});
702
- }
703
-
704
- /**
705
- * Handle field blur
706
- */
707
- handleFieldBlur() {
708
- this.setState({hasFieldFocus: false});
709
- }
710
-
711
- /**
712
- * Get the translate function
713
- * @returns {function(...[*]=)}
714
- */
715
- get translate() {
716
- return this.props.t;
717
- }
718
-
719
241
  /**
720
242
  * Render the component
721
243
  * @returns {JSX}
722
244
  */
723
245
  render() {
246
+ const settings = this.props.adminUserDirectoryContext.getSettings();
247
+ const errors = this.props.adminUserDirectoryContext.getErrors();
248
+ const isSubmitted = this.props.adminUserDirectoryContext.isSubmitted();
724
249
  return (
725
250
  <div className="row">
726
251
  <div className="ldap-settings col7 main-column">
727
252
  <h3>
728
253
  <span className="input toggle-switch form-element">
729
254
  <input type="checkbox" className="toggle-switch-checkbox checkbox" name="userDirectoryToggle"
730
- onChange={this.handleInputChange} checked={this.state.userDirectoryToggle} disabled={this.hasAllInputDisabled()}
255
+ onChange={this.handleInputChange} checked={settings.userDirectoryToggle} disabled={this.hasAllInputDisabled()}
731
256
  id="userDirectoryToggle"/>
732
257
  <label htmlFor="userDirectoryToggle"><Trans>Users Directory</Trans></label>
733
258
  </span>
734
259
  </h3>
735
260
  {!this.isUserDirectoryChecked() &&
736
- <p className="description">
737
- <Trans>No Users Directory is configured. Enable it to synchronise your users and groups with passbolt.</Trans>
738
- </p>
261
+ <p className="description">
262
+ <Trans>No Users Directory is configured. Enable it to synchronise your users and groups with passbolt.</Trans>
263
+ </p>
739
264
  }
740
265
  {this.isUserDirectoryChecked() &&
741
- <>
742
- <p className="description">
743
- <Trans>A Users Directory is configured. The users and groups of passbolt will synchronize with it.</Trans>
744
- </p>
745
- <div className={`accordion section-general ${this.state.openCredentials ? "" : "closed"}`}>
746
- <h4 className="accordion-header">
747
- <a onClick={this.handleCredentialTitleClicked}>
748
- {this.state.openCredentials && <Icon name="caret-down"/>}
749
- {!this.state.openCredentials && <Icon name="caret-right"/>}
750
- <Trans>Credentials</Trans>
751
- </a>
752
- </h4>
753
- <div className="accordion-content">
754
- <div className="radiolist required">
755
- <label><Trans>Directory type</Trans></label>
756
- <div className="input radio ad openldap form-element ">
757
- <div className="input radio">
758
- <input type="radio" value="ad" onChange={this.handleInputChange} name="directoryType"
759
- checked={this.state.directoryType === "ad"} id="directoryTypeAd"
760
- disabled={this.hasAllInputDisabled()}/>
761
- <label htmlFor="directoryTypeAd"><Trans>Active Directory</Trans></label>
762
- </div>
763
- <div className="input radio">
764
- <input type="radio" value="openldap" onChange={this.handleInputChange} name="directoryType"
765
- checked={this.state.directoryType === "openldap"} id="directoryTypeOpenLdap"
766
- disabled={this.hasAllInputDisabled()}/>
767
- <label htmlFor="directoryTypeOpenLdap"><Trans>Open Ldap</Trans></label>
768
- </div>
769
- </div>
770
- </div>
771
- <div className={`input text required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
772
- <label><Trans>Server url</Trans></label>
773
- <div className={`input text singleline connection_info ad openldap ${this.state.hasFieldFocus ? "no-focus" : ""}`}>
774
- <input id="server-input" type="text" className="required host ad openldap form-element" name="host"
775
- value={this.state.host} onChange={this.handleInputChange} onKeyUp={this.handleHostInputKeyUp}
776
- placeholder={this.translate("host")} disabled={this.hasAllInputDisabled()}/>
777
- <div className="protocol" onBlur={this.handleFieldBlur} onFocus={this.handleFieldFocus}>
778
- <Select className="inline" name="connectionType" items={this.connectionType} value={this.state.connectionType} onChange={this.handleConnectionTypeChange} disabled={this.hasAllInputDisabled()}/>
779
- </div>
780
- <div className="port ad openldap">
781
- <input id="port-input" type="number" className="required in-field form-element" name="port"
782
- value={this.state.port} onBlur={this.handleFieldBlur} onFocus={this.handleFieldFocus} onChange={this.handleInputChange} onKeyUp={this.handlePortInputKeyUp} placeholder={this.translate("port")}
783
- disabled={this.hasAllInputDisabled()}/>
784
- </div>
785
- </div>
786
- {this.state.hostError &&
787
- <div id="server-input-feedback" className="error-message">{this.state.hostError}</div>
788
- }
789
- {this.state.portError &&
790
- <div id="port-input-feedback" className="error-message">{this.state.portError}</div>
791
- }
792
- </div>
793
- <div className="singleline clearfix">
794
- <div className={`input text first-field ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
795
- <label><Trans>Username</Trans></label>
796
- <input id="username-input" type="text" className="fluid form-element" name="username"
797
- value={this.state.username} onChange={this.handleInputChange} placeholder={this.translate("Username")}
798
- disabled={this.hasAllInputDisabled()}/>
799
- </div>
800
- <div className={`input text last-field ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
801
- <label><Trans>Password</Trans></label>
802
- <input id="password-input" className="fluid form-element" name="password"
803
- value={this.state.password} onChange={this.handleInputChange} placeholder={this.translate("Password")} type="password"
804
- disabled={this.hasAllInputDisabled()}/>
805
- </div>
806
- </div>
807
- <div className={`input text required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
808
- <label><Trans>Domain</Trans></label>
809
- <input id="domain-name-input" type="text" name="domain" value={this.state.domain}
810
- onChange={this.handleInputChange} className="required fluid form-element" onKeyUp={this.handleDomainInputKeyUp}
811
- placeholder="domain.ext" disabled={this.hasAllInputDisabled()}/>
812
- {this.state.domainError &&
813
- <div id="domain-name-input-feedback" className="error-message">{this.state.domainError}</div>
814
- }
815
- </div>
816
- <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
817
- <label><Trans>Base DN</Trans></label>
818
- <input id="base-dn-input" type="text" name="baseDn" value={this.state.baseDn}
819
- onChange={this.handleInputChange} className="fluid form-element" placeholder="OU=OrgUsers,DC=mydomain,DC=local"
820
- disabled={this.hasAllInputDisabled()}/>
821
- <div className="help-message">
822
- <Trans>The base DN (default naming context) for the domain.</Trans> <Trans>If this is empty then it will be queried from the RootDSE.</Trans>
823
- </div>
824
- </div>
825
- </div>
826
- </div>
827
- <div
828
- className={`accordion section-directory-configuration ${this.state.openDirectoryConfiguration ? "" : "closed"}`}>
829
- <h4 className="accordion-header">
830
- <a onClick={this.handleDirectoryConfigurationTitleClicked}>
831
- {this.state.openDirectoryConfiguration && <Icon name="caret-down"/>}
832
- {!this.state.openDirectoryConfiguration && <Icon name="caret-right"/>}
833
- <Trans>Directory configuration</Trans>
834
- </a>
835
- </h4>
836
- <div className="accordion-content">
837
- <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
838
- <label><Trans>Group path</Trans></label>
839
- <input id="group-path-input" type="text" name="groupPath" value={this.state.groupPath}
840
- onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.translate("Group path")}
841
- disabled={this.hasAllInputDisabled()}/>
842
- <div className="help-message">
843
- <Trans>Group path is used in addition to the base DN while searching groups.</Trans> <Trans>Leave empty if users and groups are in the same DN.</Trans>
844
- </div>
845
- </div>
846
- <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
847
- <label><Trans>User path</Trans></label>
848
- <input id="user-path-input" type="text" name="userPath" value={this.state.userPath}
849
- onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.translate("User path")}
850
- disabled={this.hasAllInputDisabled()}/>
851
- <div className="help-message"><Trans>User path is used in addition to base DN while searching users.</Trans></div>
852
- </div>
853
- {this.isOpenLdapChecked() &&
854
- <div>
855
- <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
856
- <label><Trans>Group object class</Trans></label>
857
- <input id="group-object-class-input" type="text" name="groupObjectClass"
858
- value={this.state.groupObjectClass} onChange={this.handleInputChange} className="required fluid"
859
- placeholder="GroupObjectClass" disabled={this.hasAllInputDisabled()}/>
860
- <div className="help-message">
861
- <Trans>For Openldap only. Defines which group object to use.</Trans> (<Trans>Default</Trans>: posixGroup)
862
- </div>
863
- </div>
864
- <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
865
- <label><Trans>User object class</Trans></label>
866
- <input id="user-object-class-input" type="text" name="userObjectClass"
867
- value={this.state.userObjectClass} onChange={this.handleInputChange} className="required fluid form-element"
868
- placeholder="UserObjectClass" disabled={this.hasAllInputDisabled()}/>
869
- <div className="help-message"><Trans>For Openldap only. Defines which user object to use.</Trans> (<Trans>Default</Trans>: inetOrgPerson)
870
- </div>
871
- </div>
872
- <div className={`input text openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
873
- <label><Trans>Use email prefix / suffix?</Trans></label>
874
- <div className="input toggle-switch openldap form-element">
875
- <input type="checkbox" className="toggle-switch-checkbox checkbox" name="useEmailPrefix"
876
- value={this.state.useEmailPrefix} onChange={this.handleInputChange} id="use-email-prefix-suffix-toggle-button"
877
- disabled={this.hasAllInputDisabled()}/>
878
- <label className="text" htmlFor="use-email-prefix-suffix-toggle-button">
879
- <Trans>Build email based on a prefix and suffix?</Trans>
880
- </label>
881
- </div>
882
- <div className="help-message">
883
- <Trans>Use this option when user entries do not include an email address by default</Trans>
884
- </div>
885
- </div>
886
- {this.isUseEmailPrefixChecked() &&
887
- <div className="singleline clearfix" id="use-email-prefix-suffix-options">
888
- <div className={`input text first-field openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
889
- <label><Trans>Email prefix</Trans></label>
890
- <input id="email-prefix-input" type="text" name="emailPrefix" checked={this.state.emailPrefix}
891
- onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.translate("Username")}
892
- disabled={this.hasAllInputDisabled()}/>
893
- <div className="help-message">
894
- <Trans>The attribute you would like to use for the first part of the email (usually username).</Trans>
895
- </div>
896
- </div>
897
- <div className={`input text last-field openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
898
- <label><Trans>Email suffix</Trans></label>
899
- <input id="email-suffix-input" type="text" name="emailSuffix" value={this.state.emailSuffix}
900
- onChange={this.handleInputChange} className="required form-element"
901
- placeholder={this.translate("@your-domain.com")} disabled={this.hasAllInputDisabled()}/>
902
- <div className="help-message">
903
- <Trans>The domain name part of the email (@your-domain-name).</Trans>
904
- </div>
905
- </div>
906
- </div>
907
- }
908
- </div>
909
- }
910
- </div>
911
- </div>
912
- <div
913
- className={`accordion section-sync-options ${this.state.openSynchronizationOptions ? "" : "closed"}`}>
914
- <h4 className="accordion-header">
915
- <a onClick={this.handleSynchronizationOptionsTitleClicked}>
916
- {this.state.openSynchronizationOptions && <Icon name="caret-down"/>}
917
- {!this.state.openSynchronizationOptions && <Icon name="caret-right"/>}
918
- <Trans>Synchronization options</Trans>
919
- </a>
920
- </h4>
921
- <div className="accordion-content">
922
- <div className={`select-wrapper input required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
923
- <label><Trans>Default admin</Trans></label>
924
- <Select items={this.getUsersAllowedToBeDefaultAdmin()}
925
- id="default-user-select"
926
- name="defaultAdmin"
927
- value={this.state.defaultAdmin}
928
- onChange={this.handleInputChange}
929
- disabled={this.hasAllInputDisabled()}
930
- search={true}/>
931
- <div className="help-message">
932
- <Trans>The default admin user is the user that will perform the operations for the the directory.</Trans>
933
- </div>
934
- </div>
935
- <div className={`select-wrapper input required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
936
- <label><Trans>Default group admin</Trans></label>
937
- <Select items={this.getUsersAllowedToBeDefaultGroupAdmin()}
938
- id="default-group-admin-user-select"
939
- name="defaultGroupAdmin"
940
- value={this.state.defaultGroupAdmin}
941
- onChange={this.handleInputChange}
942
- disabled={this.hasAllInputDisabled()}
943
- search={true}/>
944
- <div className="help-message">
945
- <Trans>The default group manager is the user that will be the group manager of newly created groups.</Trans>
946
- </div>
947
- </div>
948
- <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
949
- <label><Trans>Groups parent group</Trans></label>
950
- <input id="groups-parent-group-input" type="text" name="groupsParentGroup"
951
- value={this.state.groupsParentGroup} onChange={this.handleInputChange} className="fluid form-element" placeholder={this.translate("Group name")}
952
- disabled={this.hasAllInputDisabled()}/>
953
- <div className="help-message">
954
- <Trans>Synchronize only the groups which are members of this group.</Trans>
955
- </div>
956
- </div>
957
- <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
958
- <label><Trans>Users parent group</Trans></label>
959
- <input id="users-parent-group-input" type="text" name="usersParentGroup"
960
- value={this.state.usersParentGroup} onChange={this.handleInputChange} className="fluid form-element" placeholder={this.translate("Group name")}
961
- disabled={this.hasAllInputDisabled()}/>
962
- <div className="help-message">
963
- <Trans>Synchronize only the users which are members of this group.</Trans>
964
- </div>
965
- </div>
966
- {this.isActiveDirectoryChecked() &&
967
- <div className={`input text clearfix ad ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
968
- <label><Trans>Enabled users only</Trans></label>
969
- <div className="input toggle-switch ad form-element">
970
- <input type="checkbox" className="toggle-switch-checkbox checkbox" name="enabledUsersOnly"
971
- checked={this.state.enabledUsersOnly} onChange={this.handleInputChange} id="enabled-users-only-toggle-button"
972
- disabled={this.hasAllInputDisabled()}/>
973
- <label className="text" htmlFor="enabled-users-only-toggle-button"><Trans>Only synchronize enabled users (AD)</Trans></label>
974
- </div>
975
- </div>
976
- }
977
- <div className="input text clearfix ad openldap">
978
- <label><Trans>Sync operations</Trans></label>
979
- <div className="col6">
980
- <div className="input toggle-switch ad openldap form-element">
981
- <input type="checkbox" className="toggle-switch-checkbox checkbox" name="createUsers"
982
- checked={this.state.createUsers} onChange={this.handleInputChange} id="sync-users-create-toggle-button"
983
- disabled={this.hasAllInputDisabled()}/>
984
- <label className="text" htmlFor="sync-users-create-toggle-button"><Trans>Create users</Trans></label>
985
- </div>
986
- <div className="input toggle-switch ad openldap form-element">
987
- <input type="checkbox" className="toggle-switch-checkbox checkbox" name="deleteUsers"
988
- checked={this.state.deleteUsers} onChange={this.handleInputChange} id="sync-users-delete-toggle-button"
989
- disabled={this.hasAllInputDisabled()}/>
990
- <label className="text" htmlFor="sync-users-delete-toggle-button"><Trans>Delete users</Trans></label>
991
- </div>
992
- </div>
993
- <div className="col6 last">
994
- <div className="input toggle-switch ad openldap form-element">
995
- <input type="checkbox" className="toggle-switch-checkbox checkbox" name="createGroups"
996
- checked={this.state.createGroups} onChange={this.handleInputChange} id="sync-groups-create-toggle-button"
997
- disabled={this.hasAllInputDisabled()}/>
998
- <label className="text" htmlFor="sync-groups-create-toggle-button"><Trans>Create groups</Trans></label>
999
- </div>
1000
- <div className="input toggle-switch ad openldap form-element">
1001
- <input type="checkbox" className="toggle-switch-checkbox checkbox" name="deleteGroups"
1002
- checked={this.state.deleteGroups} onChange={this.handleInputChange} id="sync-groups-delete-toggle-button"
1003
- disabled={this.hasAllInputDisabled()}/>
1004
- <label className="text" htmlFor="sync-groups-delete-toggle-button"><Trans>Delete groups</Trans></label>
1005
- </div>
1006
- <div className="input toggle-switch ad openldap form-element">
1007
- <input type="checkbox" className="toggle-switch-checkbox checkbox" name="updateGroups"
1008
- checked={this.state.updateGroups} onChange={this.handleInputChange} id="sync-groups-update-toggle-button"
1009
- disabled={this.hasAllInputDisabled()}/>
1010
- <label className="text" htmlFor="sync-groups-update-toggle-button"><Trans>Update groups</Trans></label>
1011
- </div>
1012
- </div>
1013
- </div>
1014
- </div>
1015
- </div>
1016
- </>
266
+ <>
267
+ <p className="description">
268
+ <Trans>A Users Directory is configured. The users and groups of passbolt will synchronize with it.</Trans>
269
+ </p>
270
+ <div className={`accordion section-general ${settings.openCredentials ? "" : "closed"}`}>
271
+ <h4 className="accordion-header">
272
+ <a onClick={this.handleCredentialTitleClicked}>
273
+ {settings.openCredentials && <Icon name="caret-down"/>}
274
+ {!settings.openCredentials && <Icon name="caret-right"/>}
275
+ <Trans>Credentials</Trans>
276
+ </a>
277
+ </h4>
278
+ <div className="accordion-content">
279
+ <div className="radiolist required">
280
+ <label><Trans>Directory type</Trans></label>
281
+ <div className="input radio ad openldap form-element ">
282
+ <div className="input radio">
283
+ <input type="radio" value="ad" onChange={this.handleInputChange} name="directoryType"
284
+ checked={this.isActiveDirectoryChecked()} id="directoryTypeAd"
285
+ disabled={this.hasAllInputDisabled()}/>
286
+ <label htmlFor="directoryTypeAd"><Trans>Active Directory</Trans></label>
287
+ </div>
288
+ <div className="input radio">
289
+ <input type="radio" value="openldap" onChange={this.handleInputChange} name="directoryType"
290
+ checked={this.isOpenLdapChecked()} id="directoryTypeOpenLdap"
291
+ disabled={this.hasAllInputDisabled()}/>
292
+ <label htmlFor="directoryTypeOpenLdap"><Trans>Open Ldap</Trans></label>
293
+ </div>
294
+ </div>
295
+ </div>
296
+ <div className={`input text required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
297
+ <label><Trans>Server url</Trans></label>
298
+ <div className={`input text singleline connection_info ad openldap ${this.state.hasFieldFocus ? "no-focus" : ""}`}>
299
+ <input id="server-input" type="text" className="required host ad openldap form-element" name="host"
300
+ value={settings.host} onChange={this.handleInputChange}
301
+ placeholder={this.props.t("host")} disabled={this.hasAllInputDisabled()}/>
302
+ <div className="protocol" onBlur={this.handleFieldBlur} onFocus={this.handleFieldFocus}>
303
+ <Select className="inline" name="connectionType" items={this.connectionType} value={settings.connectionType} onChange={this.handleInputChange} disabled={this.hasAllInputDisabled()}/>
304
+ </div>
305
+ <div className="port ad openldap">
306
+ <input id="port-input" type="number" className="required in-field form-element" name="port"
307
+ value={settings.port} onChange={this.handleInputChange}
308
+ onBlur={this.handleFieldBlur} onFocus={this.handleFieldFocus}
309
+ disabled={this.hasAllInputDisabled()}/>
310
+ </div>
311
+ </div>
312
+ {errors.hostError && isSubmitted &&
313
+ <div id="server-input-feedback" className="error-message">{errors.hostError}</div>
314
+ }
315
+ {errors.portError && isSubmitted &&
316
+ <div id="port-input-feedback" className="error-message">{errors.portError}</div>
317
+ }
318
+ </div>
319
+ <div className="singleline clearfix">
320
+ <div className={`input text first-field ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
321
+ <label><Trans>Username</Trans></label>
322
+ <input id="username-input" type="text" className="fluid form-element" name="username"
323
+ value={settings.username} onChange={this.handleInputChange} placeholder={this.props.t("Username")}
324
+ disabled={this.hasAllInputDisabled()}/>
325
+ </div>
326
+ <div className={`input text last-field ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
327
+ <label><Trans>Password</Trans></label>
328
+ <input id="password-input" className="fluid form-element" name="password"
329
+ value={settings.password} onChange={this.handleInputChange} placeholder={this.props.t("Password")} type="password"
330
+ disabled={this.hasAllInputDisabled()}/>
331
+ </div>
332
+ </div>
333
+ <div className={`input text required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
334
+ <label><Trans>Domain</Trans></label>
335
+ <input id="domain-name-input" type="text" name="domain" value={settings.domain}
336
+ onChange={this.handleInputChange} className="required fluid form-element"
337
+ placeholder="domain.ext" disabled={this.hasAllInputDisabled()}/>
338
+ {errors.domainError && isSubmitted &&
339
+ <div id="domain-name-input-feedback" className="error-message">{errors.domainError}</div>
340
+ }
341
+ </div>
342
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
343
+ <label><Trans>Base DN</Trans></label>
344
+ <input id="base-dn-input" type="text" name="baseDn" value={settings.baseDn}
345
+ onChange={this.handleInputChange} className="fluid form-element" placeholder="OU=OrgUsers,DC=mydomain,DC=local"
346
+ disabled={this.hasAllInputDisabled()}/>
347
+ <div className="help-message">
348
+ <Trans>The base DN (default naming context) for the domain.</Trans> <Trans>If this is empty then it will be queried from the RootDSE.</Trans>
349
+ </div>
350
+ </div>
351
+ </div>
352
+ </div>
353
+ <div
354
+ className={`accordion section-directory-configuration ${settings.openDirectoryConfiguration ? "" : "closed"}`}>
355
+ <h4 className="accordion-header">
356
+ <a onClick={this.handleDirectoryConfigurationTitleClicked}>
357
+ {settings.openDirectoryConfiguration && <Icon name="caret-down"/>}
358
+ {!settings.openDirectoryConfiguration && <Icon name="caret-right"/>}
359
+ <Trans>Directory configuration</Trans>
360
+ </a>
361
+ </h4>
362
+ <div className="accordion-content">
363
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
364
+ <label><Trans>Group path</Trans></label>
365
+ <input id="group-path-input" type="text" name="groupPath" value={settings.groupPath}
366
+ onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.props.t("Group path")}
367
+ disabled={this.hasAllInputDisabled()}/>
368
+ <div className="help-message">
369
+ <Trans>Group path is used in addition to the base DN while searching groups.</Trans> <Trans>Leave empty if users and groups are in the same DN.</Trans>
370
+ </div>
371
+ </div>
372
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
373
+ <label><Trans>User path</Trans></label>
374
+ <input id="user-path-input" type="text" name="userPath" value={settings.userPath}
375
+ onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.props.t("User path")}
376
+ disabled={this.hasAllInputDisabled()}/>
377
+ <div className="help-message"><Trans>User path is used in addition to base DN while searching users.</Trans></div>
378
+ </div>
379
+ {this.isOpenLdapChecked() &&
380
+ <div>
381
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
382
+ <label><Trans>Group object class</Trans></label>
383
+ <input id="group-object-class-input" type="text" name="groupObjectClass"
384
+ value={settings.groupObjectClass} onChange={this.handleInputChange} className="required fluid"
385
+ placeholder="GroupObjectClass" disabled={this.hasAllInputDisabled()}/>
386
+ <div className="help-message">
387
+ <Trans>For Openldap only. Defines which group object to use.</Trans> (<Trans>Default</Trans>: posixGroup)
388
+ </div>
389
+ </div>
390
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
391
+ <label><Trans>User object class</Trans></label>
392
+ <input id="user-object-class-input" type="text" name="userObjectClass"
393
+ value={settings.userObjectClass} onChange={this.handleInputChange} className="required fluid form-element"
394
+ placeholder="UserObjectClass" disabled={this.hasAllInputDisabled()}/>
395
+ <div className="help-message"><Trans>For Openldap only. Defines which user object to use.</Trans> (<Trans>Default</Trans>: inetOrgPerson)
396
+ </div>
397
+ </div>
398
+ <div className={`input text openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
399
+ <label><Trans>Use email prefix / suffix?</Trans></label>
400
+ <div className="input toggle-switch openldap form-element">
401
+ <input type="checkbox" className="toggle-switch-checkbox checkbox" name="useEmailPrefix"
402
+ value={settings.useEmailPrefix} onChange={this.handleInputChange} id="use-email-prefix-suffix-toggle-button"
403
+ disabled={this.hasAllInputDisabled()}/>
404
+ <label className="text" htmlFor="use-email-prefix-suffix-toggle-button">
405
+ <Trans>Build email based on a prefix and suffix?</Trans>
406
+ </label>
407
+ </div>
408
+ <div className="help-message">
409
+ <Trans>Use this option when user entries do not include an email address by default</Trans>
410
+ </div>
411
+ </div>
412
+ {this.isUseEmailPrefixChecked() &&
413
+ <div className="singleline clearfix" id="use-email-prefix-suffix-options">
414
+ <div className={`input text first-field openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
415
+ <label><Trans>Email prefix</Trans></label>
416
+ <input id="email-prefix-input" type="text" name="emailPrefix" checked={settings.emailPrefix}
417
+ onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.props.t("Username")}
418
+ disabled={this.hasAllInputDisabled()}/>
419
+ <div className="help-message">
420
+ <Trans>The attribute you would like to use for the first part of the email (usually username).</Trans>
421
+ </div>
422
+ </div>
423
+ <div className={`input text last-field openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
424
+
425
+ <label><Trans>Email suffix</Trans></label>
426
+ <input id="email-suffix-input" type="text" name="emailSuffix" value={settings.emailSuffix}
427
+ onChange={this.handleInputChange} className="required form-element"
428
+ placeholder={this.props.t("@your-domain.com")} disabled={this.hasAllInputDisabled()}/>
429
+ <div className="help-message">
430
+ <Trans>The domain name part of the email (@your-domain-name).</Trans>
431
+ </div>
432
+ </div>
433
+ </div>
434
+ }
435
+ </div>
436
+ }
437
+ </div>
438
+ </div>
439
+ <div
440
+ className={`accordion section-sync-options ${settings.openSynchronizationOptions ? "" : "closed"}`}>
441
+ <h4 className="accordion-header">
442
+ <a onClick={this.handleSynchronizationOptionsTitleClicked}>
443
+ {settings.openSynchronizationOptions && <Icon name="caret-down"/>}
444
+ {!settings.openSynchronizationOptions && <Icon name="caret-right"/>}
445
+ <Trans>Synchronization options</Trans>
446
+ </a>
447
+ </h4>
448
+ <div className="accordion-content">
449
+ <div className={`select-wrapper input required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
450
+ <label><Trans>Default admin</Trans></label>
451
+ <Select items={this.getUsersAllowedToBeDefaultAdmin()}
452
+ id="default-user-select"
453
+ name="defaultAdmin"
454
+ value={settings.defaultAdmin}
455
+ onChange={this.handleInputChange}
456
+ disabled={this.hasAllInputDisabled()}
457
+ search={true}/>
458
+ <div className="help-message">
459
+ <Trans>The default admin user is the user that will perform the operations for the the directory.</Trans>
460
+ </div>
461
+ </div>
462
+ <div className={`select-wrapper input required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
463
+ <label><Trans>Default group admin</Trans></label>
464
+ <Select items={this.getUsersAllowedToBeDefaultGroupAdmin()}
465
+ id="default-group-admin-user-select"
466
+ name="defaultGroupAdmin"
467
+ value={settings.defaultGroupAdmin}
468
+ onChange={this.handleInputChange}
469
+ disabled={this.hasAllInputDisabled()}
470
+ search={true}/>
471
+ <div className="help-message">
472
+ <Trans>The default group manager is the user that will be the group manager of newly created groups.</Trans>
473
+ </div>
474
+ </div>
475
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
476
+ <label><Trans>Groups parent group</Trans></label>
477
+ <input id="groups-parent-group-input" type="text" name="groupsParentGroup"
478
+ value={settings.groupsParentGroup} onChange={this.handleInputChange} className="fluid form-element" placeholder={this.props.t("Group name")}
479
+ disabled={this.hasAllInputDisabled()}/>
480
+ <div className="help-message">
481
+ <Trans>Synchronize only the groups which are members of this group.</Trans>
482
+ </div>
483
+ </div>
484
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
485
+ <label><Trans>Users parent group</Trans></label>
486
+ <input id="users-parent-group-input" type="text" name="usersParentGroup"
487
+ value={settings.usersParentGroup} onChange={this.handleInputChange} className="fluid form-element" placeholder={this.props.t("Group name")}
488
+ disabled={this.hasAllInputDisabled()}/>
489
+ <div className="help-message">
490
+ <Trans>Synchronize only the users which are members of this group.</Trans>
491
+ </div>
492
+ </div>
493
+ {this.isActiveDirectoryChecked() &&
494
+ <div className={`input text clearfix ad ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
495
+ <label><Trans>Enabled users only</Trans></label>
496
+ <div className="input toggle-switch ad form-element">
497
+ <input type="checkbox" className="toggle-switch-checkbox checkbox" name="enabledUsersOnly"
498
+ checked={settings.enabledUsersOnly} onChange={this.handleInputChange} id="enabled-users-only-toggle-button"
499
+ disabled={this.hasAllInputDisabled()}/>
500
+ <label className="text" htmlFor="enabled-users-only-toggle-button"><Trans>Only synchronize enabled users (AD)</Trans></label>
501
+ </div>
502
+ </div>
503
+ }
504
+ <div className="input text clearfix ad openldap">
505
+ <label><Trans>Sync operations</Trans></label>
506
+ <div className="col6">
507
+ <div className="input toggle-switch ad openldap form-element">
508
+ <input type="checkbox" className="toggle-switch-checkbox checkbox" name="createUsers"
509
+ checked={settings.createUsers} onChange={this.handleInputChange} id="sync-users-create-toggle-button"
510
+ disabled={this.hasAllInputDisabled()}/>
511
+ <label className="text" htmlFor="sync-users-create-toggle-button"><Trans>Create users</Trans></label>
512
+ </div>
513
+ <div className="input toggle-switch ad openldap form-element">
514
+ <input type="checkbox" className="toggle-switch-checkbox checkbox" name="deleteUsers"
515
+ checked={settings.deleteUsers} onChange={this.handleInputChange} id="sync-users-delete-toggle-button"
516
+ disabled={this.hasAllInputDisabled()}/>
517
+ <label className="text" htmlFor="sync-users-delete-toggle-button"><Trans>Delete users</Trans></label>
518
+ </div>
519
+ </div>
520
+ <div className="col6 last">
521
+ <div className="input toggle-switch ad openldap form-element">
522
+ <input type="checkbox" className="toggle-switch-checkbox checkbox" name="createGroups"
523
+ checked={settings.createGroups} onChange={this.handleInputChange} id="sync-groups-create-toggle-button"
524
+ disabled={this.hasAllInputDisabled()}/>
525
+ <label className="text" htmlFor="sync-groups-create-toggle-button"><Trans>Create groups</Trans></label>
526
+ </div>
527
+ <div className="input toggle-switch ad openldap form-element">
528
+ <input type="checkbox" className="toggle-switch-checkbox checkbox" name="deleteGroups"
529
+ checked={settings.deleteGroups} onChange={this.handleInputChange} id="sync-groups-delete-toggle-button"
530
+ disabled={this.hasAllInputDisabled()}/>
531
+ <label className="text" htmlFor="sync-groups-delete-toggle-button"><Trans>Delete groups</Trans></label>
532
+ </div>
533
+ <div className="input toggle-switch ad openldap form-element">
534
+ <input type="checkbox" className="toggle-switch-checkbox checkbox" name="updateGroups"
535
+ checked={settings.updateGroups} onChange={this.handleInputChange} id="sync-groups-update-toggle-button"
536
+ disabled={this.hasAllInputDisabled()}/>
537
+ <label className="text" htmlFor="sync-groups-update-toggle-button"><Trans>Update groups</Trans></label>
538
+ </div>
539
+ </div>
540
+ </div>
541
+ </div>
542
+ </div>
543
+ </>
1017
544
  }
1018
545
  </div>
1019
546
  <div className="col4 last">
@@ -1032,11 +559,11 @@ class DisplayUserDirectoryAdministration extends React.Component {
1032
559
  }
1033
560
 
1034
561
  DisplayUserDirectoryAdministration.propTypes = {
1035
- context: PropTypes.object, // Application context
562
+ adminUserDirectoryContext: PropTypes.object, // The user directory workspace context
1036
563
  administrationWorkspaceContext: PropTypes.object, // The administration workspace context
1037
- actionFeedbackContext: PropTypes.any, // The action feedback context
1038
- dialogContext: PropTypes.any, // The dialog context
1039
564
  t: PropTypes.func, // The translation function
1040
565
  };
1041
566
 
1042
- export default withAppContext(withActionFeedback(withDialog(withAdministrationWorkspace(withTranslation('common')(DisplayUserDirectoryAdministration)))));
567
+ export default withAdminUserDirectory(withAdministrationWorkspace(withTranslation('common')(DisplayUserDirectoryAdministration)));
568
+
569
+