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
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 3.8.0
13
+ */
14
+
15
+ import React from "react";
16
+ import PropTypes from "prop-types";
17
+ import {Trans, withTranslation} from "react-i18next";
18
+ import Icon from "../../../../../shared/components/Icons/Icon";
19
+ import DisplaySimulateSynchronizeUserDirectoryAdministration from "../../DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration";
20
+ import DisplaySynchronizeUserDirectoryAdministration from "../../DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration";
21
+ import UserDirectoryFormService from '../../../../../shared/services/forms/userDirectory/UserDirectoryFormService';
22
+ import {withAdminUserDirectory} from "../../../../contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext";
23
+ import {withActionFeedback} from "../../../../contexts/ActionFeedbackContext";
24
+ import {withDialog} from "../../../../contexts/DialogContext";
25
+ import DisplayTestUserDirectoryAdministration from "../../DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration";
26
+ import {withAppContext} from "../../../../contexts/AppContext";
27
+
28
+
29
+ /**
30
+ * This component is a container of multiple actions applicable on setting
31
+ */
32
+
33
+ class DisplayAdministrationUserDirectoryActions extends React.Component {
34
+ /**
35
+ * Constructor
36
+ * @param {Object} props
37
+ */
38
+ constructor(props) {
39
+ super(props);
40
+ this.bindCallbacks();
41
+ this.state = this.defaultState;
42
+ this.userDirectoryFormService = UserDirectoryFormService.getInstance(this.props.adminUserDirectoryContext, this.props.t);
43
+ }
44
+
45
+ /**
46
+ * Whenever the component has updated in terms of props or state
47
+ * @param prevProps
48
+ */
49
+ componentDidUpdate() {
50
+ if (this.props.adminUserDirectoryContext.mustOpenSynchronizePopUp()) {
51
+ this.props.adminUserDirectoryContext.requestSynchronization(false);
52
+ this.handleSynchronizeClick();
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Handle save settings
58
+ */
59
+ async handleSaveClick() {
60
+ const settings = this.props.adminUserDirectoryContext.getSettings();
61
+ if (settings.userDirectoryToggle) {
62
+ await this.props.adminUserDirectoryContext.save();
63
+ } else {
64
+ await this.props.adminUserDirectoryContext.delete();
65
+ }
66
+ this.handleSaveSuccess();
67
+ }
68
+
69
+
70
+ async handleFormSubmit(action) {
71
+ try {
72
+ const isValid = await this.userDirectoryFormService.validate();
73
+ if (isValid) {
74
+ switch (action) {
75
+ case 'save':
76
+ await this.handleSaveClick();
77
+ break;
78
+ case 'test':
79
+ await this.handleTestClick();
80
+ break;
81
+ }
82
+ }
83
+ } catch (error) {
84
+ this.handleSubmitError(error);
85
+ } finally {
86
+ this.props.adminUserDirectoryContext.setSubmitted(true);
87
+ this.props.adminUserDirectoryContext.setProcessing(false);
88
+ }
89
+ }
90
+
91
+ /**
92
+ * handle test settings
93
+ */
94
+ async handleTestClick() {
95
+ const result = await this.props.adminUserDirectoryContext.test();
96
+ const displayTestUserDirectoryDialogProps = {
97
+ userDirectoryTestResult: result.body
98
+ };
99
+ this.props.context.setContext({displayTestUserDirectoryDialogProps});
100
+ this.props.dialogContext.open(DisplayTestUserDirectoryAdministration);
101
+ }
102
+
103
+ /**
104
+ * Is save button enable
105
+ * @returns {boolean}
106
+ */
107
+ isSaveEnabled() {
108
+ return !this.props.adminUserDirectoryContext.isProcessing() && this.props.adminUserDirectoryContext.hasSettingsChanges();
109
+ }
110
+
111
+ /**
112
+ * Is test button is enable
113
+ * @returns {boolean}
114
+ */
115
+ isTestEnabled() {
116
+ return !this.props.adminUserDirectoryContext.isProcessing() && this.props.adminUserDirectoryContext.getSettings().userDirectoryToggle;
117
+ }
118
+
119
+
120
+ /**
121
+ * Is Synchronize button is enable
122
+ * @returns {boolean}
123
+ */
124
+ isSynchronizeEnabled() {
125
+ return !this.props.adminUserDirectoryContext.isProcessing() && this.props.adminUserDirectoryContext.getSettings().userDirectoryToggle && this.props.adminUserDirectoryContext.getCurrentSettings().userDirectoryToggle;
126
+ }
127
+
128
+ /**
129
+ * Bind callbacks methods
130
+ */
131
+ bindCallbacks() {
132
+ this.handleSaveClick = this.handleSaveClick.bind(this);
133
+ this.handleTestClick = this.handleTestClick.bind(this);
134
+ this.handleSimulateSynchronizeClick = this.handleSimulateSynchronizeClick.bind(this);
135
+ this.handleSynchronizeClick = this.handleSynchronizeClick.bind(this);
136
+ }
137
+
138
+ /**
139
+ * Handle simulate synchronize settings
140
+ */
141
+ handleSimulateSynchronizeClick() {
142
+ this.props.dialogContext.open(DisplaySimulateSynchronizeUserDirectoryAdministration);
143
+ }
144
+
145
+ /**
146
+ * Handle synchronize settings
147
+ */
148
+ handleSynchronizeClick() {
149
+ this.props.dialogContext.open(DisplaySynchronizeUserDirectoryAdministration);
150
+ }
151
+
152
+ /**
153
+ * Handle save operation success.
154
+ */
155
+ async handleSaveSuccess() {
156
+ await this.props.actionFeedbackContext.displaySuccess(this.props.t("The user directory settings for the organization were updated."));
157
+ }
158
+
159
+ /**
160
+ * Handle save operation error.
161
+ * @param {object} error The returned error
162
+ */
163
+ async handleSubmitError(error) {
164
+ // It can happen when the userx has closed the passphrase entry dialog by instance.
165
+ if (error.name !== "UserAbortsOperationError") {
166
+ // Unexpected error occurred.
167
+ console.error(error);
168
+ await this.handleError(error);
169
+ }
170
+ }
171
+
172
+ /**
173
+ * handle error to display the error dialog
174
+ * @param error
175
+ */
176
+ async handleError(error) {
177
+ await this.props.actionFeedbackContext.displayError(error.message);
178
+ }
179
+
180
+ /**
181
+ * Render the component
182
+ * @returns {JSX}
183
+ */
184
+ render() {
185
+ return (
186
+ <div className="col2_3 actions-wrapper">
187
+ <div className="actions">
188
+ <div>
189
+ <li>
190
+ <a className={`button ${this.isSaveEnabled() ? "" : "disabled"}`} onClick={() => this.handleFormSubmit('save')}>
191
+ <Icon name="save"/>
192
+ <span><Trans>Save settings</Trans></span>
193
+ </a>
194
+ </li>
195
+ <li>
196
+ <a className={`button ${this.isTestEnabled() ? "" : "disabled"}`} onClick={() => this.handleFormSubmit('test')}>
197
+ <Icon name="plug"/>
198
+ <span><Trans>Test settings</Trans></span>
199
+ </a>
200
+ </li>
201
+ <li>
202
+ <a className={`button ${this.isSynchronizeEnabled() ? "" : "disabled"}`} onClick={this.handleSimulateSynchronizeClick}>
203
+ <Icon name="magic-wand"/>
204
+ <span><Trans>Simulate synchronize</Trans></span>
205
+ </a>
206
+ </li>
207
+ <li>
208
+ <a className={`button ${this.isSynchronizeEnabled() ? "" : "disabled"}`} onClick={this.handleSynchronizeClick}>
209
+ <Icon name="refresh"/>
210
+ <span><Trans>Synchronize</Trans></span>
211
+ </a>
212
+ </li>
213
+ </div>
214
+ </div>
215
+ </div>
216
+ );
217
+ }
218
+ }
219
+
220
+ DisplayAdministrationUserDirectoryActions.propTypes = {
221
+ context: PropTypes.object, // Application context
222
+ dialogContext: PropTypes.object, // The dialog notification context
223
+ adminUserDirectoryContext: PropTypes.object, // The email notification context
224
+ actionFeedbackContext: PropTypes.object, // The action feedback context
225
+ t: PropTypes.func, // The translation function
226
+ };
227
+
228
+ export default withAppContext(withActionFeedback(withDialog(withAdminUserDirectory(withTranslation("common")(DisplayAdministrationUserDirectoryActions)))));
@@ -63,6 +63,10 @@ class DisplayAdministrationWorkspaceBreadcrumb extends Component {
63
63
  return this.translate("Account Recovery");
64
64
  case AdministrationWorkspaceMenuTypes.SMTP_SETTINGS:
65
65
  return this.translate("Email server");
66
+ case AdministrationWorkspaceMenuTypes.SELF_REGISTRATION:
67
+ return this.translate("Self Registration");
68
+ case AdministrationWorkspaceMenuTypes.SSO:
69
+ return this.translate("Single Sign-On");
66
70
  default:
67
71
  return "";
68
72
  }
@@ -93,4 +93,13 @@ describe("As AD I can see a Breadcrumb", () => {
93
93
  expect(page.item(2)).toBe("Account Recovery");
94
94
  expect(page.item(3)).toBe("Settings");
95
95
  });
96
+
97
+ it('As AD I should see a breadcrumb for self registration', () => {
98
+ const props = defaultProps(AdministrationWorkspaceMenuTypes.SELF_REGISTRATION); // The props to pass
99
+ page = new DisplayAdministrationWorkspaceBreadcrumbPage(context, props);
100
+ expect(page.count).toBe(3);
101
+ expect(page.item(1)).toBe("Administration");
102
+ expect(page.item(2)).toBe("Self Registration");
103
+ expect(page.item(3)).toBe("Settings");
104
+ });
96
105
  });
@@ -320,21 +320,21 @@ class DisplayEmailNotificationsAdministration extends React.Component {
320
320
  <input type="checkbox" className="toggle-switch-checkbox checkbox" name="accountRecoveryRequestAdmin" disabled={this.hasAllInputDisabled()}
321
321
  onChange={this.handleInputChange} checked={settings.accountRecoveryRequestAdmin} id="account-recovery-request-admin-toggle-button"/>
322
322
  <label className="text" htmlFor="account-recovery-request-admin-toggle-button">
323
- <Trans>When an account recovery is requested, notify the administrators.</Trans>
323
+ <Trans>When an account recovery is requested, notify all the administrators.</Trans>
324
324
  </label>
325
325
  </span>
326
326
  <span className="input toggle-switch form-element">
327
327
  <input type="checkbox" className="toggle-switch-checkbox checkbox" name="accountRecoveryRequestPolicyUpdate" disabled={this.hasAllInputDisabled()}
328
328
  onChange={this.handleInputChange} checked={settings.accountRecoveryRequestPolicyUpdate} id="account-recovery-policy-update-toggle-button"/>
329
329
  <label className="text" htmlFor="account-recovery-policy-update-toggle-button">
330
- <Trans>When an account recovery policy is updated, notify the administrators.</Trans>
330
+ <Trans>When an account recovery policy is updated, notify all the administrators.</Trans>
331
331
  </label>
332
332
  </span>
333
333
  <span className="input toggle-switch form-element">
334
334
  <input type="checkbox" className="toggle-switch-checkbox checkbox" name="accountRecoveryRequestCreatedAmin" disabled={this.hasAllInputDisabled()}
335
335
  onChange={this.handleInputChange} checked={settings.accountRecoveryRequestCreatedAmin} id="account-recovery-response-created-admin-toggle-button"/>
336
336
  <label className="text" htmlFor="account-recovery-response-created-admin-toggle-button">
337
- <Trans>When an administrator answered to an account recovery request, notify the administrator.</Trans>
337
+ <Trans>When an administrator answered to an account recovery request, notify the administrator at the origin of the action.</Trans>
338
338
  </label>
339
339
  </span>
340
340
  <span className="input toggle-switch form-element">
@@ -1,3 +1,17 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 3.8.0
13
+ */
14
+
1
15
  import {defaultAppContext} from "../../../contexts/ApiAppContext.test.data";
2
16
 
3
17
  /**
@@ -217,23 +217,6 @@ export default class DisplayEmailNotificationsAdministrationPage {
217
217
  });
218
218
  }
219
219
 
220
- /**
221
- * Simulates a click on the given HTML element.
222
- * The clicks is consider done when the callback returns {true}.
223
- * @param {HTMLElement} element The HTML element onto simulate the click
224
- * @param {function} callback The callback to be used in the waitFor method to ensure the click is done (returns true when it's done)
225
- * @returns {Promise<void>}
226
- */
227
- async clickOn(element, callback) {
228
- const leftClick = {button: 0};
229
- fireEvent.click(element, leftClick);
230
- await waitFor(() => {
231
- if (!callback()) {
232
- throw new Error("Page didn't react yet on the event.");
233
- }
234
- });
235
- }
236
-
237
220
  /**
238
221
  * Returns true if the save button in the toolbar is enabled.
239
222
  * @returns {boolean}
@@ -13,12 +13,13 @@
13
13
  */
14
14
  import React from "react";
15
15
  import PropTypes from "prop-types";
16
- import {withActionFeedback} from "../../../../react-extension/contexts/ActionFeedbackContext";
17
16
  import {withAdministrationWorkspace} from "../../../contexts/AdministrationWorkspaceContext";
18
17
  import {Trans, withTranslation} from "react-i18next";
19
18
  import {withAppContext} from "../../../contexts/AppContext";
20
19
  import Icon from "../../../../shared/components/Icons/Icon";
21
20
  import Select from "../../Common/Select/Select";
21
+ import DisplayAdministrationInternationalisationActions from "../DisplayAdministrationWorkspaceActions/DisplayAdministrationInternationalisationActions/DisplayAdministrationInternationalisationActions";
22
+ import {withAdminInternationalization} from "../../../contexts/Administration/AdministrationInternationalizationContext/AdministrationInternationalizationContext";
22
23
 
23
24
  /**
24
25
  * This component allows to display the internationalisation for the administration
@@ -35,28 +36,22 @@ class DisplayInternationalizationAdministration extends React.Component {
35
36
  }
36
37
 
37
38
  /**
38
- * Get default state
39
- * @returns {*}
39
+ * ComponentDidMount
40
+ * Invoked immediately after component is inserted into the tree
41
+ * @return {void}
40
42
  */
41
- get defaultState() {
42
- return {
43
- loading: true, // component is loading or not
44
- processing: false, // component is processing or not
45
-
46
- locale: "" // The default app locale
47
- };
48
- }
49
-
50
43
  async componentDidMount() {
51
- this.setState({locale: this.props.context.siteSettings.locale});
44
+ this.props.administrationWorkspaceContext.setDisplayAdministrationWorkspaceAction(DisplayAdministrationInternationalisationActions);
45
+ this.props.adminInternationalizationContext.findLocale();
52
46
  }
53
47
 
54
48
  /**
55
- * Whenever the component has updated in terms of props or state
56
- * @param prevProps
49
+ * componentWillUnmount
50
+ * Use to clear the data from the form in case the user put something that needs to be cleared.
57
51
  */
58
- async componentDidUpdate(prevProps) {
59
- await this.handleMustSave(prevProps.administrationWorkspaceContext.must.save);
52
+ componentWillUnmount() {
53
+ this.props.administrationWorkspaceContext.resetDisplayAdministrationWorkspaceAction();
54
+ this.props.adminInternationalizationContext.clearContext();
60
55
  }
61
56
 
62
57
  /**
@@ -66,108 +61,14 @@ class DisplayInternationalizationAdministration extends React.Component {
66
61
  this.handleInputChange = this.handleInputChange.bind(this);
67
62
  }
68
63
 
69
- /**
70
- * Handle the must save change
71
- * @param previousMustSaveSettings Previous must save settings
72
- */
73
- async handleMustSave(previousMustSaveSettings) {
74
- const hasMustSaveChanged = this.props.administrationWorkspaceContext.must.save !== previousMustSaveSettings;
75
- if (hasMustSaveChanged && this.props.administrationWorkspaceContext.must.save) {
76
- await this.handleFormSubmit();
77
- this.props.administrationWorkspaceContext.onResetActionsSettings();
78
- }
79
- }
80
-
81
64
  /**
82
65
  * Handle form input changes.
83
66
  * @params {ReactEvent} The react event
84
67
  * @returns {void}
85
68
  */
86
69
  handleInputChange(event) {
87
- const target = event.target;
88
- const value = target.value;
89
- const name = target.name;
90
- this.setState({[name]: value});
91
- this.handleEnabledSaveButton();
92
- }
93
-
94
- /**
95
- * Handle enabled the save button
96
- */
97
- handleEnabledSaveButton() {
98
- if (!this.props.administrationWorkspaceContext.can.save) {
99
- this.props.administrationWorkspaceContext.onSaveEnabled();
100
- }
70
+ this.props.adminInternationalizationContext.setLocale(event.target.value);
101
71
  }
102
-
103
- /**
104
- * Should input be disabled? True if state is loading or processing
105
- * @returns {boolean}
106
- */
107
- hasAllInputDisabled() {
108
- return this.state.processing || this.state.loading;
109
- }
110
-
111
- /**
112
- * Handle form submit event.
113
- * @params {ReactEvent} The react event
114
- * @returns {void}
115
- */
116
- async handleFormSubmit() {
117
- // Do not re-submit an already processing form
118
- if (!this.state.processing) {
119
- await this.toggleProcessing();
120
- try {
121
- await this.props.administrationWorkspaceContext.onSaveLocaleRequested(this.state.locale);
122
- await this.handleSaveSuccess();
123
- } catch (error) {
124
- await this.handleSaveError(error);
125
- }
126
- }
127
- }
128
-
129
- /**
130
- * Handle save operation success.
131
- */
132
- async handleSaveSuccess() {
133
- this.props.context.onRefreshLocaleRequested(this.state.locale);
134
- await this.props.actionFeedbackContext.displaySuccess(this.props.t("The internationalization settings were updated."));
135
- this.setState({processing: false});
136
- }
137
-
138
- /**
139
- * Handle save operation error.
140
- * @param {object} error The returned error
141
- */
142
- async handleSaveError(error) {
143
- // It can happen when the user has closed the passphrase entry dialog by instance.
144
- if (error.name === "UserAbortsOperationError") {
145
- this.setState({processing: false});
146
- } else {
147
- // Unexpected error occurred.
148
- console.error(error);
149
- await this.handleError(error);
150
- this.setState({processing: false});
151
- }
152
- }
153
-
154
- /**
155
- * handle error to display the error dialog
156
- * @param error
157
- */
158
- async handleError(error) {
159
- await this.props.actionFeedbackContext.displayError(error.message);
160
- }
161
-
162
- /**
163
- * Toggle processing state
164
- * @returns {Promise<void>}
165
- */
166
- async toggleProcessing() {
167
- const prev = this.state.processing;
168
- return this.setState({processing: !prev});
169
- }
170
-
171
72
  /**
172
73
  * Get the supported locales
173
74
  * @returns {array}
@@ -184,6 +85,8 @@ class DisplayInternationalizationAdministration extends React.Component {
184
85
  * @returns {JSX}
185
86
  */
186
87
  render() {
88
+ const lang = this.props.adminInternationalizationContext.getLocale();
89
+
187
90
  return (
188
91
  <div className="row">
189
92
  <div className="internationalisation-settings col7 main-column">
@@ -191,7 +94,7 @@ class DisplayInternationalizationAdministration extends React.Component {
191
94
  <form className="form">
192
95
  <div className="select-wrapper input">
193
96
  <label htmlFor="app-locale-input"><Trans>Language</Trans></label>
194
- <Select className="medium" id="locale-input" name="locale" items={this.supportedLocales} value={this.state.locale} onChange={this.handleInputChange}/>
97
+ <Select className="medium" id="locale-input" name="locale" items={this.supportedLocales} value={lang} onChange={this.handleInputChange}/>
195
98
  <p><Trans>The default language of the organisation.</Trans></p>
196
99
  </div>
197
100
  </form>
@@ -214,8 +117,8 @@ class DisplayInternationalizationAdministration extends React.Component {
214
117
  DisplayInternationalizationAdministration.propTypes = {
215
118
  context: PropTypes.object, // The application context
216
119
  administrationWorkspaceContext: PropTypes.object, // The administration workspace context
217
- actionFeedbackContext: PropTypes.any, // The action feedback context
120
+ adminInternationalizationContext: PropTypes.object, // The administration internationalization context
218
121
  t: PropTypes.func, // The translation function
219
122
  };
220
123
 
221
- export default withAppContext(withActionFeedback(withAdministrationWorkspace(withTranslation('common')(DisplayInternationalizationAdministration))));
124
+ export default withAppContext(withAdminInternationalization(withAdministrationWorkspace(withTranslation('common')(DisplayInternationalizationAdministration))));
@@ -2,24 +2,22 @@
2
2
  * Default props
3
3
  * @returns {{resource: {id: string, name: string}}}
4
4
  */
5
- import SiteSettings from "../../../../shared/lib/Settings/SiteSettings";
6
- import siteSettingsFixture from "../../../test/fixture/Settings/siteSettings";
5
+ import {defaultAppContext} from "../../../contexts/ApiAppContext.test.data";
7
6
 
8
7
 
9
8
  export function defaultProps() {
10
9
  return {
11
- context: {
12
- siteSettings: new SiteSettings(siteSettingsFixture)
13
- },
10
+ context: defaultAppContext(),
14
11
  administrationWorkspaceContext: {
15
- must: {
16
- save: false
17
- },
18
- onResetActionsSettings: jest.fn(),
19
- can: {
20
- save: false
21
- },
22
- onSaveEnabled: jest.fn(),
12
+ setDisplayAdministrationWorkspaceAction: jest.fn(),
13
+ resetDisplayAdministrationWorkspaceAction: jest.fn()
14
+ },
15
+ actionFeedbackContext: {
16
+ displaySuccess: () => jest.fn(),
17
+ displayError: jest.fn()
23
18
  }
24
19
  };
25
20
  }
21
+
22
+
23
+ export const defaultLocale = "en-UK";
@@ -21,15 +21,14 @@ import {defaultProps} from "./DisplayInternationalizationAdministration.test.dat
21
21
  import DisplayInternationalisationAdministrationPage from "./DisplayInternationalizationAdministration.test.page";
22
22
  import {waitFor} from "@testing-library/react";
23
23
  import {ActionFeedbackContext} from "../../../contexts/ActionFeedbackContext";
24
- import SiteSettings from "../../../../shared/lib/Settings/SiteSettings";
25
- import siteSettingsFixture from "../../../test/fixture/Settings/siteSettings";
26
- import PassboltApiFetchError from "../../../../shared/lib/Error/PassboltApiFetchError";
24
+ import {enableFetchMocks} from 'jest-fetch-mock';
25
+ import {mockApiResponse} from '../../../../../test/mocks/mockApiResponse';
27
26
 
28
27
  beforeEach(() => {
28
+ enableFetchMocks();
29
29
  jest.resetModules();
30
30
  });
31
31
 
32
-
33
32
  describe("As AD I should see the internationalisation page", () => {
34
33
  let page; // The page to test against
35
34
  const props = defaultProps(); // The props to pass
@@ -50,51 +49,47 @@ describe("As AD I should see the internationalisation page", () => {
50
49
  });
51
50
 
52
51
  it('As AD I should be able to see a visual feedback after I saved the internationalisation settings in the administration internationalisation page', async() => {
53
- await page.selectLanguageFr();
54
- expect(props.administrationWorkspaceContext.onSaveEnabled).toHaveBeenCalled();
55
- const propsUpdated = {
56
- context: {
57
- siteSettings: new SiteSettings(siteSettingsFixture),
58
- onRefreshLocaleRequested: jest.fn()
59
- },
60
- administrationWorkspaceContext: {
61
- must: {
62
- save: true
63
- },
64
- onResetActionsSettings: jest.fn(),
65
- onSaveLocaleRequested: jest.fn()
66
- }
67
- };
68
- jest.spyOn(propsUpdated.administrationWorkspaceContext, 'onSaveLocaleRequested').mockImplementationOnce(() => {});
52
+ //Call to save the settings
53
+ fetch.doMockOnceIf(/locale\/settings*/, () => mockApiResponse({}));
69
54
  jest.spyOn(ActionFeedbackContext._currentValue, 'displaySuccess').mockImplementation(() => {});
70
- page.rerender(propsUpdated);
55
+
56
+ //button should be disable by default
57
+ expect(page.isSaveButtonEnabled()).toBeFalsy();
58
+
59
+ await page.selectLanguageEs();
60
+ expect(page.isSaveButtonEnabled()).toBeTruthy();
61
+ await page.saveLocale();
71
62
  await waitFor(() => {});
72
- expect(propsUpdated.administrationWorkspaceContext.onSaveLocaleRequested).toHaveBeenCalledWith("fr-FR");
73
- expect(propsUpdated.administrationWorkspaceContext.onResetActionsSettings).toHaveBeenCalled();
74
- expect(propsUpdated.context.onRefreshLocaleRequested).toHaveBeenCalledWith("fr-FR");
63
+
75
64
  expect(ActionFeedbackContext._currentValue.displaySuccess).toHaveBeenCalledWith("The internationalization settings were updated.");
65
+ expect(page.isSaveButtonEnabled()).toBeFalsy();
76
66
  });
77
67
 
78
- it('As AD I should be able to see an error notification after I got an error when I saved the default language of the organisation in the administration internationalisation page', async() => {
79
- const propsUpdated = {
80
- context: {
81
- siteSettings: new SiteSettings(siteSettingsFixture)
82
- },
83
- administrationWorkspaceContext: {
84
- must: {
85
- save: true
86
- },
87
- onResetActionsSettings: jest.fn(),
88
- onSaveLocaleRequested: jest.fn(),
89
- }
90
- };
91
- jest.spyOn(propsUpdated.administrationWorkspaceContext, 'onSaveLocaleRequested').mockImplementationOnce(() => {
92
- throw new PassboltApiFetchError("Error");
93
- }); jest.spyOn(ActionFeedbackContext._currentValue, 'displayError').mockImplementation(() => {});
94
- page.rerender(propsUpdated);
68
+ it('As AD I should see an error toaster if the submit operation fails for an unexpected reason', async() => {
69
+ // Mock the request function to make it return an error.
70
+ const error = {message: "The service is unavailable"};
71
+ fetch.doMockOnceIf(/locale\/settings*/, () => Promise.reject(error));
72
+
73
+ //button should be disable by default
74
+ expect(page.isSaveButtonEnabled()).toBeFalsy();
75
+ await page.selectLanguageFr();
76
+ jest.spyOn(ActionFeedbackContext._currentValue, 'displayError').mockImplementation(() => {});
77
+ await page.saveLocale();
95
78
  await waitFor(() => {});
96
- expect(propsUpdated.administrationWorkspaceContext.onResetActionsSettings).toHaveBeenCalled();
97
- expect(ActionFeedbackContext._currentValue.displayError).toHaveBeenCalledWith("Error");
79
+
80
+ expect(page.title).toBe("Internationalisation");
81
+ // Throw general error message
82
+ expect(ActionFeedbackContext._currentValue.displayError).toHaveBeenCalledWith("The service is unavailable");
83
+ });
84
+
85
+ it('As AD I should not be able to click on save if there is no change', async() => {
86
+ //button should be disable by default
87
+ expect(page.isSaveButtonEnabled()).toBeFalsy();
88
+ await page.selectLanguageFr();
89
+ //We set the value by default
90
+ await page.selectLanguageEn();
91
+ //button should be disable by default
92
+ expect(page.isSaveButtonEnabled()).toBeFalsy();
98
93
  });
99
94
  });
100
95
  });