passbolt-styleguide 3.6.2 → 3.7.0-alpha1

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 (431) hide show
  1. package/README.md +9 -6
  2. package/build/css/help.min.css +3 -7
  3. package/build/css/public.min.css +3 -16
  4. package/build/css/themes/default/api_authentication.min.css +3 -3
  5. package/build/css/themes/default/api_cloud.min.css +3 -3
  6. package/build/css/themes/default/api_main.min.css +3 -12
  7. package/build/css/themes/default/api_reports.min.css +3 -12
  8. package/build/css/themes/default/api_webinstaller.min.css +3 -12
  9. package/build/css/themes/default/ext_app.min.css +3 -12
  10. package/build/css/themes/default/ext_authentication.min.css +3 -3
  11. package/build/css/themes/default/ext_external.min.css +2 -2
  12. package/build/css/themes/default/ext_in_form_cta.min.css +3 -3
  13. package/build/css/themes/default/ext_in_form_menu.min.css +3 -3
  14. package/build/css/themes/default/ext_quickaccess.min.css +3 -3
  15. package/build/css/themes/midgar/api_authentication.min.css +3 -3
  16. package/build/css/themes/midgar/api_main.min.css +3 -12
  17. package/build/css/themes/midgar/api_reports.min.css +3 -12
  18. package/build/css/themes/midgar/ext_app.min.css +3 -12
  19. package/build/css/themes/midgar/ext_authentication.min.css +3 -3
  20. package/build/css/themes/midgar/ext_in_form_cta.min.css +3 -3
  21. package/build/css/themes/midgar/ext_in_form_menu.min.css +3 -3
  22. package/build/css/themes/midgar/ext_quickaccess.min.css +3 -3
  23. package/build/js/dist/api-account-recovery.js +1 -1
  24. package/build/js/dist/api-app.js +1 -1
  25. package/build/js/dist/api-app.js.LICENSE.txt +25 -1
  26. package/build/js/dist/api-recover.js +1 -1
  27. package/build/js/dist/api-setup.js +1 -1
  28. package/build/js/dist/api-triage.js +1 -1
  29. package/build/js/dist/api-vendors.js +1 -1
  30. package/build/js/dist/api-vendors.js.LICENSE.txt +43 -7
  31. package/i18next-parser.config.js +22 -0
  32. package/package.json +8 -5
  33. package/src/img/og/og_image.png +0 -0
  34. package/src/locales/de-DE/common.json +308 -173
  35. package/src/locales/en-UK/common.json +155 -175
  36. package/src/locales/es-ES/common.json +955 -0
  37. package/src/locales/fr-FR/common.json +308 -174
  38. package/src/locales/ja-JP/common.json +292 -172
  39. package/src/locales/lt-LT/common.json +985 -0
  40. package/src/locales/nl-NL/common.json +329 -194
  41. package/src/locales/pl-PL/common.json +337 -172
  42. package/src/locales/sv-SE/common.json +307 -172
  43. package/src/public-website-sign-in/PublicWebsiteSignInBootstrap.js +25 -0
  44. package/src/public-website-sign-in/lib/SignIn/SignInManager.js +85 -0
  45. package/src/public-website-sign-in/lib/SignIn/SignInManager.test.data.js +45 -0
  46. package/src/public-website-sign-in/lib/SignIn/SignInManager.test.js +59 -0
  47. package/src/public-website-sign-in/lib/SignIn/SignInManager.test.page.js +67 -0
  48. package/src/react-extension/ExtBootstrapAccountRecovery.js +17 -0
  49. package/src/react-extension/ExtBootstrapApp.js +17 -0
  50. package/src/react-extension/ExtBootstrapLogin.js +17 -0
  51. package/src/react-extension/ExtBootstrapRecover.js +17 -0
  52. package/src/react-extension/ExtBootstrapSetup.js +17 -0
  53. package/src/react-extension/components/AccountRecovery/AccountRecoveryInviteUserSettingPreferenceDialog/AccountRecoveryInviteUserSettingPreferenceDialog.test.stories.js +1 -1
  54. package/src/react-extension/components/AccountRecovery/HandleAccountRecoveryUserSettingsRoute/HandleAccountRecoveryUserSettingsRoute.js +1 -9
  55. package/src/react-extension/components/AccountRecovery/HandleReviewAccountRecoveryRequestWorkflow/HandleReviewAccountRecoveryRequestWorkflow.js +1 -9
  56. package/src/react-extension/components/AccountRecovery/ManageAccountRecoveryUserSettings/ManageAccountRecoveryUserSettings.js +1 -1
  57. package/src/react-extension/components/AccountRecovery/ManageAccountRecoveryUserSettings/ManageAccountRecoveryUserSettings.test.stories.js +1 -1
  58. package/src/react-extension/components/AccountRecovery/ReviewAccountRecoveryRequest/ReviewAccountRecoveryRequest.js +1 -1
  59. package/src/react-extension/components/AccountRecovery/ReviewAccountRecoveryRequest/ReviewAccountRecoveryRequest.test.stories.js +1 -1
  60. package/src/react-extension/components/Administration/ConfirmSaveAccountRecoverySettings/ConfirmSaveAccountRecoverySettings.js +6 -3
  61. package/src/react-extension/components/Administration/ConfirmSaveAccountRecoverySettings/ConfirmSaveAccountRecoverySettings.test.data.js +10 -7
  62. package/src/react-extension/components/Administration/ConfirmSaveAccountRecoverySettings/ConfirmSaveAccountRecoverySettings.test.stories.js +1 -1
  63. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.js +2 -15
  64. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationAccountRecoveryAction/DisplayAdministrationAccountRecoveryActions.js +2 -12
  65. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.js +2 -11
  66. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.js +1 -1
  67. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.test.js +1 -1
  68. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.js +1 -9
  69. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.stories.js +1 -1
  70. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.js +1 -9
  71. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.page.js +1 -1
  72. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.stories.js +12 -6
  73. package/src/react-extension/components/Administration/DisplayLoadingDialog/DisplayLoadingDialog.js +2 -11
  74. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.js +6 -6
  75. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.stories.js +1 -1
  76. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.js +25 -1
  77. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.js +1 -1
  78. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.stories.js +1 -1
  79. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.stories.js +1 -1
  80. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.js +25 -1
  81. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.js +1 -1
  82. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.stories.js +1 -1
  83. package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.js +12 -2
  84. package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.test.js +1 -1
  85. package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.test.stories.js +1 -1
  86. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.js +24 -24
  87. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.stories.js +1 -1
  88. package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.js +1 -1
  89. package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.test.stories.js +1 -1
  90. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.js +6 -3
  91. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.test.data.js +20 -5
  92. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.test.stories.js +1 -1
  93. package/src/react-extension/components/Administration/ProvideAccountRecoveryOrganizationKey/ProvideAccountRecoveryOrganizationKey.js +1 -11
  94. package/src/react-extension/components/Administration/ProvideAccountRecoveryOrganizationKey/ProvideAccountRecoveryOrganizationKey.test.stories.js +1 -1
  95. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/DownloadOrganizationKey.js +1 -9
  96. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/DownloadOrganizationKey.test.stories.js +1 -1
  97. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.js +90 -46
  98. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.test.js +61 -17
  99. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/ImportOrganizationKey.js +1 -1
  100. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/SelectAccountRecoveryOrganizationKey.js +1 -9
  101. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/SelectAccountRecoveryOrganizationKey.test.page.js +14 -0
  102. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/SelectAccountRecoveryOrganizationKey.test.stories.js +1 -1
  103. package/src/react-extension/components/Announcement/AnnouncementWrapper/AnnouncementWrapper.js +3 -2
  104. package/src/react-extension/components/Announcement/HandleSubscriptionAnnouncement/DisplayExpiredSubscriptionAnnouncement.js +3 -3
  105. package/src/react-extension/components/Announcement/HandleSubscriptionAnnouncement/DisplayGoingToExpireSubscriptionAnnouncement.js +3 -2
  106. package/src/react-extension/components/Announcement/HandleSubscriptionAnnouncement/DisplayInvalidSubscriptionAnnouncement.js +3 -3
  107. package/src/react-extension/components/Authentication/AskForAuthenticationHelpCredentialLost/AskForAuthenticationHelpCredentialLost.js +2 -2
  108. package/src/react-extension/components/Authentication/AskForAuthenticationHelpCredentialLost/AskForAuthenticationHelpCredentialLost.test.stories.js +1 -1
  109. package/src/react-extension/components/Authentication/CheckAccountRecoveryEmail/CheckAccountRecoveryEmail.js +2 -2
  110. package/src/react-extension/components/Authentication/CheckAccountRecoveryEmail/CheckAccountRecoveryEmail.test.stories.js +1 -1
  111. package/src/react-extension/components/Authentication/CheckMailBox/CheckMailBox.js +2 -12
  112. package/src/react-extension/components/Authentication/CheckMailBox/CheckMailbox.test.stories.js +1 -1
  113. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.js +88 -41
  114. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.stories.js +1 -1
  115. package/src/react-extension/components/Authentication/ChooseAccountRecoveryPreference/ChooseAccountRecoveryPreference.js +2 -2
  116. package/src/react-extension/components/Authentication/ChooseAccountRecoveryPreference/ChooseAccountRecoveryPreference.test.stories.js +11 -1
  117. package/src/react-extension/components/Authentication/ChooseSecurityToken/ChooseSecurityToken.js +2 -2
  118. package/src/react-extension/components/Authentication/ChooseSecurityToken/ChooseSecurityToken.test.stories.js +1 -1
  119. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.js +24 -14
  120. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.js +2 -2
  121. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.stories.js +1 -1
  122. package/src/react-extension/components/Authentication/DisplayAlreadyLoggedInError/DisplayAlreadyLoggedInError.js +2 -2
  123. package/src/react-extension/components/Authentication/DisplayAlreadyLoggedInError/DisplayAlreadyLoggedInError.test.stories.js +1 -1
  124. package/src/react-extension/components/Authentication/DisplayBrowserNotSupported/DisplayBrowserNotSupported.js +2 -2
  125. package/src/react-extension/components/Authentication/DisplayBrowserNotSupported/DisplayBrowserNotSupported.test.stories.js +1 -1
  126. package/src/react-extension/components/Authentication/DisplayExpiredTokenError/DisplayExpiredTokenError.js +2 -2
  127. package/src/react-extension/components/Authentication/DisplayExpiredTokenError/DisplayExpiredTokenError.test.stories.js +1 -1
  128. package/src/react-extension/components/Authentication/DisplayRequireInvitationError/DisplayRequireInvitationError.js +2 -2
  129. package/src/react-extension/components/Authentication/DisplayRequireInvitationError/DisplayRequireInvitationError.test.stories.js +1 -1
  130. package/src/react-extension/components/Authentication/DisplayUnexpectedError/DisplayUnexpectedError.js +3 -3
  131. package/src/react-extension/components/Authentication/DisplayUnexpectedError/DisplayUnexpectedError.test.stories.js +1 -1
  132. package/src/react-extension/components/Authentication/DownloadRecoveryKit/DownloadRecoveryKit.js +2 -2
  133. package/src/react-extension/components/Authentication/DownloadRecoveryKit/DownloadRecoveryKit.test.stories.js +1 -1
  134. package/src/react-extension/components/Authentication/EnterNameForm/EnterNameForm.js +6 -6
  135. package/src/react-extension/components/Authentication/EnterNameForm/EnterNameForm.test.stories.js +1 -1
  136. package/src/react-extension/components/Authentication/EnterUsernameForm/EnterUsernameForm.js +1 -1
  137. package/src/react-extension/components/Authentication/EnterUsernameForm/EnterUsernameForm.test.stories.js +1 -1
  138. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.js +34 -7
  139. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.test.data.js +2 -1
  140. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.test.js +20 -1
  141. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.test.page.js +4 -0
  142. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.test.stories.js +1 -1
  143. package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.js +2 -2
  144. package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.test.stories.js +4 -1
  145. package/src/react-extension/components/Authentication/IntroduceExtension/IntroduceExtension.js +2 -2
  146. package/src/react-extension/components/Authentication/IntroduceExtension/IntroduceExtension.test.stories.js +1 -1
  147. package/src/react-extension/components/Authentication/NotifyExpiredSession/NotifyExpiredSession.js +1 -9
  148. package/src/react-extension/components/Authentication/NotifyExpiredSession/NotifyExpiredSession.test.stories.js +1 -1
  149. package/src/react-extension/components/Authentication/RequestAccountRecovery/RequestAccountRecovery.js +2 -2
  150. package/src/react-extension/components/Authentication/RequestAccountRecovery/RequestAccountRecovery.test.stories.js +6 -1
  151. package/src/react-extension/components/AuthenticationAccountRecovery/DisplayExpiredTokenError/DisplayExpiredTokenError.js +2 -2
  152. package/src/react-extension/components/AuthenticationAccountRecovery/DisplayExpiredTokenError/DisplayExpiredTokenError.test.stories.js +1 -1
  153. package/src/react-extension/components/AuthenticationAccountRecovery/DisplayRestartFromScratchError/DisplayRestartFromScratchError.js +2 -2
  154. package/src/react-extension/components/AuthenticationAccountRecovery/DisplayRestartFromScratchError/DisplayRestartFromScratchError.test.stories.js +1 -1
  155. package/src/react-extension/components/AuthenticationAccountRecovery/OrchestrateAccountRecovery/OrchestrateAccountRecovery.js +2 -2
  156. package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.js +2 -2
  157. package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.test.stories.js +1 -1
  158. package/src/react-extension/components/AuthenticationLogin/Login/Login.js +1 -9
  159. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.stories.js +1 -1
  160. package/src/react-extension/components/AuthenticationLogin/OrchestrateLogin/OrchestrateLoginBoxFooter.js +2 -2
  161. package/src/react-extension/components/AuthenticationLogin/OrchestrateLogin/OrchestrateLoginBoxMain.js +2 -2
  162. package/src/react-extension/components/AuthenticationPassphrase/InputPassphrase/InputPassphrase.js +1 -1
  163. package/src/react-extension/components/AuthenticationPassphrase/InputPassphrase/InputPassphrase.test.stories.js +1 -1
  164. package/src/react-extension/components/AuthenticationRecover/RecoverAuthentication/RecoverAuthentication.js +3 -2
  165. package/src/react-extension/components/AuthenticationSetup/SetupAuthentication/SetupAuthentication.js +3 -3
  166. package/src/react-extension/components/Common/ActionFeedback/DisplayActionFeedbacks.test.stories.js +1 -1
  167. package/src/react-extension/components/Common/ActionFeedback/ShareActionFeedback.js +2 -2
  168. package/src/react-extension/components/Common/Autocomplete/Autocomplete.js +8 -2
  169. package/src/react-extension/components/Common/Avatar/UserAvatar.test.data.js +6 -4
  170. package/src/react-extension/components/Common/Avatar/UserAvatar.test.stories.js +3 -2
  171. package/src/react-extension/components/Common/Button/Button.test.stories.js +5 -5
  172. package/src/react-extension/components/Common/Checkbox/Checkbox.test.stories.js +1 -1
  173. package/src/react-extension/components/Common/ContextualMenu/ContextualMenu.test.stories.js +1 -1
  174. package/src/react-extension/components/Common/ContextualMenu/ContextualMenuWrapper.js +10 -8
  175. package/src/react-extension/components/Common/Dialog/DialogCloseButton/DialogCloseButton.js +2 -1
  176. package/src/react-extension/components/Common/Dialog/DialogWrapper/DialogFooter.test.stories.js +2 -2
  177. package/src/react-extension/components/Common/Dialog/DialogWrapper/DialogWrapper.js +2 -2
  178. package/src/react-extension/components/Common/Dialog/DialogWrapper/DialogWrapper.test.stories.js +1 -1
  179. package/src/react-extension/components/Common/DragInfo/DragInfo.test.stories.js +10 -8
  180. package/src/react-extension/components/Common/Error/NotifyError/NotifyError.js +3 -11
  181. package/src/react-extension/components/Common/Error/NotifyError/NotifyError.test.stories.js +6 -1
  182. package/src/react-extension/components/Common/Footer/Footer.js +3 -13
  183. package/src/react-extension/components/Common/Inputs/Autocomplete/Autocomplete.js +16 -7
  184. package/src/react-extension/components/Common/Inputs/Autocomplete/AutocompleteItemLoading.js +4 -0
  185. package/src/react-extension/components/Common/Inputs/FormSubmitButton/FormCancelButton.js +3 -12
  186. package/src/react-extension/components/Common/Inputs/FormSubmitButton/FormSubmitButton.js +2 -2
  187. package/src/react-extension/components/Common/Internationalisation/TranslationProvider.js +0 -1
  188. package/src/react-extension/components/Common/Link/Link.test.stories.js +1 -1
  189. package/src/react-extension/components/Common/Loading/LoadingBar/LoadingBar.test.stories.js +1 -1
  190. package/src/react-extension/components/Common/Loading/LoadingSpinner/LoadingSpinner.test.stories.js +1 -1
  191. package/src/react-extension/components/Common/Menu/DisplayMainMenu.js +2 -11
  192. package/src/react-extension/components/Common/Navigation/Search/SearchBar.js +7 -7
  193. package/src/react-extension/components/Common/Navigation/Search/SearchBar.test.stories.js +1 -1
  194. package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.js +2 -11
  195. package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.test.stories.js +1 -1
  196. package/src/react-extension/components/Common/RadioButton/RadioButton.test.stories.js +1 -1
  197. package/src/react-extension/components/Common/Select/Select.js +44 -12
  198. package/src/react-extension/components/Common/Select/Select.test.stories.js +1 -1
  199. package/src/react-extension/components/Common/Text/Text.test.stories.js +1 -1
  200. package/src/react-extension/components/Common/TextField/TextField.test.stories.js +1 -1
  201. package/src/react-extension/components/Common/Toggle/Toggle.test.stories.js +1 -1
  202. package/src/react-extension/components/Common/Tooltip/Tooltip.test.stories.js +2 -2
  203. package/src/react-extension/components/Internationalisation/ChangeLocale/ChangeLocale.test.page.js +1 -1
  204. package/src/react-extension/components/Resource/CreateResource/CreateResource.js +9 -9
  205. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.stories.js +1 -1
  206. package/src/react-extension/components/Resource/DeleteResource/DeleteResource.js +3 -3
  207. package/src/react-extension/components/Resource/DeleteResource/DeleteResource.test.page.js +1 -1
  208. package/src/react-extension/components/Resource/DeleteResource/DeleteResource.test.stories.js +1 -1
  209. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.js +4 -4
  210. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.test.stories.js +1 -1
  211. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspace.js +1 -9
  212. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMainMenu.js +8 -17
  213. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMainMenu.test.js +2 -2
  214. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMainMenu.test.stories.js +1 -1
  215. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.js +6 -6
  216. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.test.stories.js +1 -1
  217. package/src/react-extension/components/Resource/EditResource/EditResource.js +8 -8
  218. package/src/react-extension/components/Resource/EditResource/EditResource.test.stories.js +1 -1
  219. package/src/react-extension/components/Resource/ExportResources/ExportResources.js +9 -10
  220. package/src/react-extension/components/Resource/ExportResources/ExportResources.test.stories.js +1 -1
  221. package/src/react-extension/components/Resource/ExportResources/ExportResourcesCredentials.js +1 -1
  222. package/src/react-extension/components/Resource/ExportResources/ExportResourcesCredentials.test.stories.js +1 -1
  223. package/src/react-extension/components/Resource/FilterResourcesByBreadcrumb/FilterResourcesByBreadcrumb.test.stories.js +1 -1
  224. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.js +2 -11
  225. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.stories.js +1 -1
  226. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItemContextualMenu.js +2 -11
  227. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByRootFolderContextualMenu.js +2 -11
  228. package/src/react-extension/components/Resource/FilterResourcesByGroups/FilterResourcesByGroups.js +2 -11
  229. package/src/react-extension/components/Resource/FilterResourcesByGroups/FilterResourcesByGroups.test.stories.js +1 -1
  230. package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.js +4 -13
  231. package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.test.js +1 -1
  232. package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.test.stories.js +1 -1
  233. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.js +1 -1
  234. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.stories.js +1 -1
  235. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTagsContextualMenu.js +2 -11
  236. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTagsList.js +2 -11
  237. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTagsListContextualMenu.js +3 -12
  238. package/src/react-extension/components/Resource/FilterResourcesByText/FilterResourcesByText.test.stories.js +1 -1
  239. package/src/react-extension/components/Resource/ImportResources/ImportResources.test.stories.js +1 -1
  240. package/src/react-extension/components/Resource/ImportResources/ImportResourcesKeyUnlock.js +1 -1
  241. package/src/react-extension/components/Resource/ImportResources/ImportResourcesKeyUnlock.test.stories.js +1 -1
  242. package/src/react-extension/components/Resource/ImportResources/ImportResourcesResult.test.stories.js +1 -1
  243. package/src/react-extension/components/ResourceComment/AddResourceComment/AddResourceComment.test.stories.js +5 -3
  244. package/src/react-extension/components/ResourceComment/ConfirmResourceCommentDeletion/ConfirmResourceCommentDeletion.js +1 -1
  245. package/src/react-extension/components/ResourceComment/ConfirmResourceCommentDeletion/ConfirmResourceCommentDeletion.test.stories.js +1 -1
  246. package/src/react-extension/components/ResourceComment/DeleteResourceComment/DeleteComment.js +2 -1
  247. package/src/react-extension/components/ResourceComment/DisplayResourceCommentList/DisplayResourceCommentList.js +1 -9
  248. package/src/react-extension/components/ResourceComment/DisplayResourceCommentList/DisplayResourceCommentList.test.stories.js +5 -3
  249. package/src/react-extension/components/ResourceDescription/EditResourceDescription/EditResourceDescription.js +2 -2
  250. package/src/react-extension/components/ResourceDescription/EditResourceDescription/EditResourceDescription.test.stories.js +5 -3
  251. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetails.js +3 -3
  252. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsActivity.test.stories.js +2 -2
  253. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsComment.js +2 -11
  254. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsDescription.js +2 -10
  255. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsDescription.test.stories.js +1 -1
  256. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsInformation.js +1 -1
  257. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsInformation.test.data.js +1 -1
  258. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsPermission.js +2 -10
  259. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsTag.js +3 -12
  260. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsTag.test.stories.js +1 -1
  261. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.js +1 -1
  262. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.stories.js +1 -1
  263. package/src/react-extension/components/ResourceFolder/DefineResourceFolderMoveStrategy/DefineResourceFolderMoveStrategy.test.stories.js +1 -1
  264. package/src/react-extension/components/ResourceFolder/DeleteResourceFolder/DeleteResourceFolder.js +1 -1
  265. package/src/react-extension/components/ResourceFolder/DeleteResourceFolder/DeleteResourceFolder.test.stories.js +1 -1
  266. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.js +1 -1
  267. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.stories.js +1 -1
  268. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetails.js +1 -1
  269. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsActivity.test.stories.js +1 -1
  270. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsInformation.js +1 -9
  271. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsInformation.test.stories.js +1 -1
  272. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsPermissions.test.stories.js +1 -1
  273. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePassphraseGenerator.js +10 -7
  274. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePassphraseGenerator.test.stories.js +1 -1
  275. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePasswordGenerator.js +12 -9
  276. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePasswordGenerator.test.stories.js +1 -1
  277. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.js +10 -7
  278. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.test.stories.js +1 -1
  279. package/src/react-extension/components/ResourceTag/DeleteResourceTag/DeleteResourceTag.js +2 -2
  280. package/src/react-extension/components/ResourceTag/DeleteResourceTag/DeleteResourceTag.test.stories.js +1 -1
  281. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.js +1 -1
  282. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.stories.js +1 -1
  283. package/src/react-extension/components/ResourceTag/EditResourceTags/EditResourceTags.js +2 -2
  284. package/src/react-extension/components/ResourceTag/EditResourceTags/EditResourceTagsItemViewer.js +2 -11
  285. package/src/react-extension/components/Share/ShareDialog.js +124 -22
  286. package/src/react-extension/components/Share/ShareDialog.test.data.js +25 -1
  287. package/src/react-extension/components/Share/ShareDialog.test.js +87 -36
  288. package/src/react-extension/components/Share/ShareDialog.test.page.js +1 -1
  289. package/src/react-extension/components/Share/ShareDialog.test.stories.js +1 -1
  290. package/src/react-extension/components/Share/SharePermissionDeleteButton.js +2 -1
  291. package/src/react-extension/components/Share/SharePermissionItem.js +56 -0
  292. package/src/react-extension/components/Share/ShareVariesDetails.js +2 -11
  293. package/src/react-extension/components/User/ConfirmDisableUserMFA/ConfirmDisableUserMFA.js +1 -1
  294. package/src/react-extension/components/User/ConfirmDisableUserMFA/ConfirmDisableUserMFA.test.stories.js +1 -1
  295. package/src/react-extension/components/User/CreateUser/CreateUser.js +9 -9
  296. package/src/react-extension/components/User/CreateUser/CreateUser.test.stories.js +1 -1
  297. package/src/react-extension/components/User/DeleteUser/DeleteUser.js +1 -1
  298. package/src/react-extension/components/User/DeleteUser/DeleteUser.test.stories.js +1 -1
  299. package/src/react-extension/components/User/DeleteUser/DeleteUserWithConflicts.js +3 -3
  300. package/src/react-extension/components/User/DeleteUser/DeleteUserWithConflicts.test.stories.js +1 -1
  301. package/src/react-extension/components/User/DisplayExpiredAccountRecovery/DisplayExpiredAccountRecovery.js +1 -9
  302. package/src/react-extension/components/User/DisplayExpiredAccountRecovery/DisplayExpiredAccountRecovery.test.stories.js +1 -1
  303. package/src/react-extension/components/User/DisplayUserBadgeMenu/DisplayUserBadgeMenu.js +8 -17
  304. package/src/react-extension/components/User/DisplayUserBadgeMenu/DisplayUserBadgeMenu.test.stories.js +1 -1
  305. package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.js +3 -3
  306. package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.test.stories.js +1 -1
  307. package/src/react-extension/components/User/DisplayUserWorkspaceMainActions/DisplayUserWorkspaceMainActions.js +8 -17
  308. package/src/react-extension/components/User/DisplayUserWorkspaceMainActions/DisplayUserWorkspaceMainActions.test.js +4 -4
  309. package/src/react-extension/components/User/DisplayUsers/DisplayUsers.js +1 -1
  310. package/src/react-extension/components/User/DisplayUsers/DisplayUsers.test.stories.js +1 -1
  311. package/src/react-extension/components/User/DisplayUsersContextualMenu/DisplayUsersContextualMenu.test.stories.js +1 -1
  312. package/src/react-extension/components/User/EditUser/EditUser.js +9 -9
  313. package/src/react-extension/components/User/EditUser/EditUser.test.stories.js +1 -1
  314. package/src/react-extension/components/User/FilterUsersByBreadcrumb/FilterUsersByBreadcrumb.test.stories.js +1 -1
  315. package/src/react-extension/components/User/FilterUsersByGroups/DisplayGroupContextualMenu.js +2 -11
  316. package/src/react-extension/components/User/FilterUsersByGroups/FilterUsersByGroup.test.stories.js +1 -1
  317. package/src/react-extension/components/User/FilterUsersByGroups/FilterUsersByGroupContextualMenu.js +2 -11
  318. package/src/react-extension/components/User/FilterUsersByShortcut/FilterUsersByShortcut.js +3 -12
  319. package/src/react-extension/components/User/FilterUsersByShortcut/FilterUsersByShortcut.test.stories.js +1 -1
  320. package/src/react-extension/components/User/FilterUsersByText/FilterUsersByText.js +1 -9
  321. package/src/react-extension/components/User/FilterUsersByText/FilterUsersByText.test.stories.js +1 -1
  322. package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.js +3 -3
  323. package/src/react-extension/components/UserDetails/DisplayUserDetailsAccountRecovery/DisplayUserDetailsAccountRecovery.js +1 -9
  324. package/src/react-extension/components/UserDetails/DisplayUserDetailsAccountRecovery/DisplayUserDetailsAccountRecovery.test.data.js +1 -1
  325. package/src/react-extension/components/UserDetails/DisplayUserDetailsAccountRecovery/DisplayUserDetailsAccountRecovery.test.stories.js +1 -1
  326. package/src/react-extension/components/UserDetails/DisplayUserDetailsActivity/DisplayUserDetailsActivity.js +1 -9
  327. package/src/react-extension/components/UserDetails/DisplayUserDetailsActivity/DisplayUserDetailsActivity.test.stories.js +1 -1
  328. package/src/react-extension/components/UserDetails/DisplayUserDetailsGroups/DisplayUserDetailsGroups.test.stories.js +1 -1
  329. package/src/react-extension/components/UserDetails/DisplayUserDetailsInformation/DisplayUserDetailsInformation.js +1 -1
  330. package/src/react-extension/components/UserDetails/DisplayUserDetailsInformation/DisplayUserDetailsInformation.test.stories.js +22 -83
  331. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.js +8 -1
  332. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.test.data.js +20 -2
  333. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.test.js +25 -1
  334. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.test.stories.js +28 -26
  335. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.js +85 -57
  336. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.js +21 -6
  337. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.stories.js +1 -1
  338. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroup.js +1 -1
  339. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroup.test.stories.js +1 -1
  340. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroupWithConflicts.js +2 -2
  341. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroupWithConflicts.test.stories.js +1 -1
  342. package/src/react-extension/components/UserGroup/DisplayUserGroupDetails/DisplayUserGroupDetails.js +1 -1
  343. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsInformation/DisplayUserGroupDetailsInformation.test.stories.js +1 -1
  344. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsMembers/DisplayUserGroupDetailsMembers.js +4 -13
  345. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsMembers/DisplayUserGroupDetailsMembers.test.stories.js +1 -1
  346. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsMembers/DisplayUserGroupDetailsMembersGroupMember.js +1 -9
  347. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.js +132 -151
  348. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.js +8 -1
  349. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.page.js +37 -14
  350. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.stories.js +5 -2
  351. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroupItem.js +209 -0
  352. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.js +1 -1
  353. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/DisplayChangePassphraseIntroduction.js +2 -3
  354. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/DownloadRecoveryKit.js +2 -2
  355. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.js +25 -12
  356. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.js +5 -1
  357. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.page.js +7 -0
  358. package/src/react-extension/components/UserSetting/ChangeUserSecurityToken/ChangeUserSecurityToken.js +2 -10
  359. package/src/react-extension/components/UserSetting/ChangeUserSecurityToken/ChangeUserSecurityToken.test.stories.js +1 -1
  360. package/src/react-extension/components/UserSetting/DisplayUserAccountRecovery/DisplayAccountRecoveryUserSettings.js +1 -1
  361. package/src/react-extension/components/UserSetting/DisplayUserAccountRecovery/DisplayAccountRecoveryUserSettings.test.stories.js +1 -1
  362. package/src/react-extension/components/UserSetting/DisplayUserGpgInformation/DisplayUserGpgInformation.js +9 -2
  363. package/src/react-extension/components/UserSetting/DisplayUserGpgInformation/DisplayUserGpgInformation.test.stories.js +58 -35
  364. package/src/react-extension/components/UserSetting/DisplayUserProfile/DisplayUserProfile.js +1 -1
  365. package/src/react-extension/components/UserSetting/DisplayUserProfile/DisplayUserProfile.test.stories.js +1 -1
  366. package/src/react-extension/components/UserSetting/DisplayUserSettingWorkspaceActions/DisplayUserSettingWorkspaceActions.js +2 -11
  367. package/src/react-extension/components/UserSetting/DisplayUserSettingsWorkspaceBreadcrumb/DisplayUserSettingsWorkspaceBreadcrumb.js +2 -2
  368. package/src/react-extension/components/UserSetting/DisplayUserSettingsWorkspaceBreadcrumb/DisplayUserSettingsWorkspaceBreadcrumb.test.stories.js +1 -1
  369. package/src/react-extension/components/UserSetting/DisplayUserTheme/DisplayUserTheme.js +1 -9
  370. package/src/react-extension/components/UserSetting/DisplayUserTheme/DisplayUserTheme.test.stories.js +1 -1
  371. package/src/react-extension/components/UserSetting/EditUserProfile/EditUserProfile.js +8 -8
  372. package/src/react-extension/components/UserSetting/EditUserProfile/EditUserProfile.test.stories.js +1 -1
  373. package/src/react-extension/components/UserSetting/NavigateIntoUserSettingsWorkspace/NavigateIntoUserSettingsWorkspace.js +4 -13
  374. package/src/react-extension/components/UserSetting/NavigateIntoUserSettingsWorkspace/NavigateIntoUserSettingsWorkspace.test.stories.js +1 -1
  375. package/src/react-extension/components/UserSetting/UploadUserProfileAvatar/UploadUserProfileAvatar.test.stories.js +1 -1
  376. package/src/react-extension/contexts/Authentication/AuthenticationRecoverContext.js +14 -1
  377. package/src/react-extension/test/fixture/Settings/siteSettings.js +20 -14
  378. package/src/react-extension/test/mock/components/Internationalisation/MockTranslationProvider.js +8 -1
  379. package/src/react-quickaccess/ExtQuickAccess.js +23 -9
  380. package/src/react-quickaccess/components/AnimatedSwitch/AnimatedSwitch.js +0 -1
  381. package/src/react-quickaccess/components/ExtensionSetup/SetupExtensionInProgress/SetupExtensionInProgress.js +2 -5
  382. package/src/react-quickaccess/components/ExtensionSetup/SetupExtensionInProgress/SetupExtensionInProgressPage.test.stories.js +1 -1
  383. package/src/react-quickaccess/components/FilterResourcesByFavoritePage/FilterResourcesByFavoritePage.js +2 -2
  384. package/src/react-quickaccess/components/FilterResourcesByFavoritePage/FilterResourcesByFavoritePage.test.stories.js +1 -1
  385. package/src/react-quickaccess/components/FilterResourcesByGroupPage/FilterResourcesByGroupPage.js +1 -1
  386. package/src/react-quickaccess/components/FilterResourcesByGroupPage/FilterResourcesByGroupPage.test.stories.js +1 -1
  387. package/src/react-quickaccess/components/FilterResourcesByItemsIOwnPage/FilterResourcesByItemsIOwnPage.js +1 -1
  388. package/src/react-quickaccess/components/FilterResourcesByItemsIOwnPage/FilterResourcesByItemsIOwnPage.test.stories.js +1 -1
  389. package/src/react-quickaccess/components/FilterResourcesByRecentlyModifiedPage/FilterResourcesByRecentlyModifiedPage.js +1 -1
  390. package/src/react-quickaccess/components/FilterResourcesByRecentlyModifiedPage/FilterResourcesByRecentlyModifiedPage.test.stories.js +1 -1
  391. package/src/react-quickaccess/components/FilterResourcesBySharedWithMePage/FilterResourcesBySharedWithMePage.js +1 -1
  392. package/src/react-quickaccess/components/FilterResourcesBySharedWithMePage/FilterResourcesBySharedWithMePage.test.stories.js +1 -1
  393. package/src/react-quickaccess/components/FilterResourcesByTagPage/FilterResourcesByTagPage.js +1 -1
  394. package/src/react-quickaccess/components/FilterResourcesByTagPage/FilterResourcesByTagPage.test.stories.js +1 -1
  395. package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePasswordGenerator.js +2 -3
  396. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.js +3 -3
  397. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.stories.js +1 -1
  398. package/src/react-quickaccess/components/Header/Header.test.stories.js +1 -1
  399. package/src/react-quickaccess/components/HomePage/HomePage.js +0 -8
  400. package/src/react-quickaccess/components/HomePage/HomePage.test.stories.js +1 -1
  401. package/src/react-quickaccess/components/LoginPage/LoginPage.js +1 -9
  402. package/src/react-quickaccess/components/LoginPage/LoginPage.test.stories.js +1 -1
  403. package/src/react-quickaccess/components/MoreFiltersPage/MoreFiltersPage.js +1 -1
  404. package/src/react-quickaccess/components/MoreFiltersPage/MoreFiltersPage.test.stories.js +1 -1
  405. package/src/react-quickaccess/components/PassphraseDialog/PassphraseDialog.js +5 -5
  406. package/src/react-quickaccess/components/PassphraseDialog/PassphraseDialog.test.stories.js +1 -1
  407. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.js +1 -1
  408. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.stories.js +1 -1
  409. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.js +4 -4
  410. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.stories.js +1 -1
  411. package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.js +3 -3
  412. package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.test.stories.js +1 -1
  413. package/src/react-quickaccess/components/Search/Search.js +5 -5
  414. package/src/react-quickaccess/components/Search/Search.test.stories.js +1 -1
  415. package/src/react-web-integration/BrowserIntegrationBootstrap.js +0 -17
  416. package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.test.stories.js +1 -1
  417. package/src/react-web-integration/components/DisplayInFormMenu/DisplayInFormMenu.js +2 -2
  418. package/src/react-web-integration/components/DisplayInFormMenu/DisplayInFormMenu.test.stories.js +1 -1
  419. package/src/react-web-integration/lib/InForm/InFormFieldSelector.js +11 -1
  420. package/src/react-web-integration/lib/InForm/InformManager.test.data.js +60 -0
  421. package/src/react-web-integration/lib/InForm/InformManager.test.js +151 -6
  422. package/src/react-web-integration/lib/InForm/InformManager.test.page.js +39 -0
  423. package/src/shared/components/Icons/Icon.test.stories.js +1 -1
  424. package/src/shared/components/Password/Password.js +2 -1
  425. package/src/shared/components/Password/Password.test.page.js +4 -1
  426. package/src/shared/components/Password/Password.test.stories.js +1 -1
  427. package/src/shared/components/PasswordComplexity/PasswordComplexity.js +2 -2
  428. package/src/shared/components/PasswordComplexity/PasswordComplexity.test.stories.js +5 -5
  429. package/src/stories/assets/intro/hero.png +0 -0
  430. package/src/stories/assets/intro/intro.css +47 -0
  431. package/test/jest.setup.js +2 -0
@@ -1,100 +1,39 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 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) 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 2.13.0
13
+ */
1
14
  import {MemoryRouter, Route} from "react-router-dom";
2
15
  import React from "react";
3
- import AppContext from "../../../contexts/AppContext";
4
16
  import PropTypes from "prop-types";
5
17
  import DisplayUserDetailsInformation from "./DisplayUserDetailsInformation";
6
- import MockPort from "../../../test/mock/MockPort";
7
-
18
+ import {defaultProps} from "./DisplayUserDetailsInformation.test.data";
8
19
 
9
20
  export default {
10
- title: 'Passbolt/UserDetails/DisplayUserDetailsInformation',
21
+ title: 'Passbolt Component/UserDetails/DisplayUserDetailsInformation',
11
22
  component: DisplayUserDetailsInformation
12
23
  };
13
24
 
14
- const context = {
15
- port: new MockPort(),
16
- userSettings: {
17
- getTrustedDomain: () => (new URL(window.location.href)).origin
18
- },
19
- siteSettings: {
20
- getServerTimezone: () => ""
21
- },
22
- roles: [
23
- {
24
- id: 'a58de6d3-f52c-5080-b79b-a601a647ac85',
25
- name: 'Admin'
26
- }
27
- ]
28
- };
29
-
30
-
31
-
32
25
  const Template = args =>
33
- <AppContext.Provider value={context}>
34
- <div className="panel aside">
35
- <div className="detailed-information">
36
- <MemoryRouter initialEntries={['/']}>
37
- <Route component={routerProps => <DisplayUserDetailsInformation {...args} {...routerProps}/>}></Route>
38
- </MemoryRouter>
39
- </div>
26
+ <div className="panel aside">
27
+ <div className="detailed-information">
28
+ <MemoryRouter initialEntries={['/']}>
29
+ <Route component={routerProps => <DisplayUserDetailsInformation {...args} {...routerProps}/>}></Route>
30
+ </MemoryRouter>
40
31
  </div>
41
- </AppContext.Provider>;
32
+ </div>;
42
33
 
43
34
  Template.propTypes = {
44
35
  context: PropTypes.object,
45
36
  };
46
37
 
47
38
  export const Initial = Template.bind({});
48
- Initial.args = {
49
- userWorkspaceContext: {
50
- onDetailsLocked: () => {},
51
- details: {
52
- user: {
53
- "id": "54c6278e-f824-5fda-91ff-3e946b18d994",
54
- "role_id": "a58de6d3-f52c-5080-b79b-a601a647ac85",
55
- "role": {
56
- "created": "2012-07-04T13:39:25+00:00",
57
- "description": "Logged in user",
58
- "id": "a58de6d3-f52c-5080-b79b-a601a647ac85",
59
- "modified": "2012-07-04T13:39:25+00:00",
60
- "name": "user"
61
- },
62
- "username": "dame@passbolt.com",
63
- "active": true,
64
- "deleted": false,
65
- "created": "2020-05-13T07:32:49+00:00",
66
- "modified": "2020-05-13T08:32:49+00:00",
67
- "profile": {
68
- "id": "2766ff6b-87f1-53a9-98fd-72cd32a3df69",
69
- "user_id": "54c6278e-f824-5fda-91ff-3e946b18d994",
70
- "first_name": "Dame Steve",
71
- "last_name": "Shirley",
72
- "created": "2020-05-13T09:32:49+00:00",
73
- "modified": "2020-05-13T09:32:49+00:00",
74
- "avatar": {
75
- "id": "81100609-d60d-4dc8-a8c8-de45522eee1b",
76
- "user_id": "54c6278e-f824-5fda-91ff-3e946b18d994",
77
- "foreign_key": "2766ff6b-87f1-53a9-98fd-72cd32a3df69",
78
- "model": "Avatar",
79
- "filename": "dame steve.png",
80
- "filesize": 20676,
81
- "mime_type": "image\/png",
82
- "extension": "png",
83
- "hash": "f2695972b9009970ac85aae95f907693268cd249",
84
- "path": "Avatar\/1b\/9d\/80\/81100609d60d4dc8a8c8de45522eee1b\/81100609d60d4dc8a8c8de45522eee1b.png",
85
- "adapter": "Local",
86
- "created": "2020-05-13T09:32:51+00:00",
87
- "modified": "2020-05-13T09:32:51+00:00",
88
- "url": {
89
- "medium": "img\/public\/Avatar\/1b\/9d\/80\/81100609d60d4dc8a8c8de45522eee1b\/81100609d60d4dc8a8c8de45522eee1b.a99472d5.png",
90
- "small": "img\/public\/Avatar\/1b\/9d\/80\/81100609d60d4dc8a8c8de45522eee1b\/81100609d60d4dc8a8c8de45522eee1b.65a0ba70.png"
91
- }
92
- }
93
- },
94
- "__placeholder_last_logged_in__": "",
95
- "last_logged_in": "",
96
- is_mfa_enabled: false
97
- }
98
- }
99
- }
100
- };
39
+ Initial.args = defaultProps();
@@ -91,7 +91,14 @@ class DisplayUserDetailsPublicKey extends React.Component {
91
91
  const fingerprint = gpgkeyInfo.fingerprint;
92
92
  const type = this.gpgkeyType[gpgkeyInfo.algorithm];
93
93
  const created = this.formatDate(gpgkeyInfo.created);
94
- const expires = gpgkeyInfo.expires === "Never" ? this.translate("Never") : this.formatDate(gpgkeyInfo.expires);
94
+ let expires;
95
+ if (gpgkeyInfo.expires === null) {
96
+ expires = "n/a";
97
+ } else if (gpgkeyInfo.expires === "Infinity") {
98
+ expires = this.translate("Never");
99
+ } else {
100
+ expires = this.formatDate(gpgkeyInfo.expires);
101
+ }
95
102
  const armoredKey = gpgkeyInfo.armored_key;
96
103
 
97
104
  const formatedGpgkeyInfo = {fingerprint, type, created, expires, armoredKey};
@@ -24,7 +24,6 @@ export function defaultAppContext(appContext) {
24
24
  return Object.assign(defaultAppContext, appContext || {});
25
25
  }
26
26
 
27
-
28
27
  /**
29
28
  * Default props
30
29
  * @returns {any}
@@ -99,9 +98,28 @@ export const mockGpgKey = {
99
98
  "keyId": "5D9B054F",
100
99
  "fingerprint": "03F60E958F4CB29723ACDF761353B5B15D9B054F",
101
100
  "algorithm": "rsa",
102
- "expires": null,
101
+ "expires": "Infinity",
103
102
  "key_created": "2015-08-09T12:48:31+00:00",
104
103
  "deleted": false,
105
104
  "created": "2020-08-19T14:56:54+00:00",
106
105
  "modified": "2020-08-19T14:56:54+00:00"
107
106
  };
107
+
108
+ /**
109
+ * Mocked a gpg key
110
+ */
111
+ export const mockInvalidGpgKey = {
112
+ "id": "04481719-5d9d-5e22-880a-a6b9270601d2",
113
+ "user_id": "f848277c-5398-58f8-a82a-72397af2d450",
114
+ "armored_key": "-----BEGIN PGP PRIVATE KEY BLOCK-----\nVersion: OpenPGP.js v0.3.0\nComment: https://openpgpjs.org\n\nxbYEUubX7gEBANDWhzoP+Tr/IyRSv++vl5jBesQIPTYGQBdzF4YDnGEBABEB\nAAH+CQMIfzdw4/PKNl5gVXdtfDFdSIN8yJT2rbeg3+SsWexXZNNdRaONWaiB\nZ5cG9Q6+BoXKsEshIdcYOgwsAgRxlPpRA34Vvmg2QBk7PhdrkbK7aqENsJ1w\ndIlLD6p9GmLE20yVff58/fMiUtPRgsD83SpKTAX6EM1ulpkuQQNjmrVc5qc8\n7AMdF80JdW5kZWZpbmVkwj8EEAEIABMFAlLm1+4JEBD8MASZrpALAhsDAAAs\nQgD8CUrwv7Hrp/INR0/UvAvzS52VztREQwQWTJMrgTNHBGjHtgRS5tfuAQEA\nnys9SaSgR+l6iZc/M8hGIUmbuahE2/+mtw+/l0RO+WcAEQEAAf4JAwjr39Yi\nFzjxImDN1IoYVsonA9M+BtIIJHafuQUHjyEr1paJJK5xS6KlyGgpMTXTD6y/\nqxS3ZSPPzHGRrs2CmkVEiPmurn9Ed05tb0y9OnJkWtuh3z9VVq9d8zHzuENa\nbUfli+P/v+dRaZ+1rSOxUFbFYbFB5XK/A9b/OPFrv+mb4KrtLxugwj8EGAEI\nABMFAlLm1+4JEBD8MASZrpALAhsMAAC3IgD8DnLGbMnpLtrX72RCkPW1ffLq\n71vlXMJNXvoCeuejiRw=\n-----END PGP PRIVATE KEY BLOCK-----",
115
+ "bits": 256,
116
+ "uid": "undefined \u003C\u003E",
117
+ "keyId": "99ae900b",
118
+ "fingerprint": "C694577FF69DE85C07935DF310FC300499AE900B",
119
+ "algorithm": "rsa",
120
+ "expires": null,
121
+ "key_created": "2014-01-27T22:04:30.000Z",
122
+ "deleted": false,
123
+ "created": "2020-08-19T14:56:54+00:00",
124
+ "modified": "2020-08-19T14:56:54+00:00"
125
+ };
@@ -16,13 +16,22 @@
16
16
  * Unit tests on FilterUserByShortcut in regard of specifications
17
17
  */
18
18
 
19
- import {defaultAppContext, defaultProps, mockGpgKey} from "./DisplayUserDetailsPublicKey.test.data";
19
+ import {defaultAppContext, defaultProps, mockGpgKey, mockInvalidGpgKey} from "./DisplayUserDetailsPublicKey.test.data";
20
20
  import DisplayUserDetailsPublicKeyPage from "./DisplayUserDetailsPublicKey.test.page";
21
+ import {DateTime} from "luxon";
21
22
 
22
23
  beforeEach(() => {
23
24
  jest.resetModules();
24
25
  });
25
26
 
27
+ function formatDate(data) {
28
+ try {
29
+ return DateTime.fromJSDate(new Date(data)).setLocale("en-US").toLocaleString(DateTime.DATETIME_FULL);
30
+ } catch (error) {
31
+ return "";
32
+ }
33
+ }
34
+
26
35
  describe("Display User Details Information", () => {
27
36
  let page; // The page to test against
28
37
  const context = defaultAppContext(); // The applicative context
@@ -37,10 +46,12 @@ describe("Display User Details Information", () => {
37
46
  });
38
47
 
39
48
  it('As LU I should not initially see the information area as expanded', () => {
49
+ expect.assertions(1);
40
50
  expect(page.isCollapsed).toBeTruthy();
41
51
  });
42
52
 
43
53
  it('As LU I should see the information area when I collapse the area', async() => {
54
+ expect.assertions(2);
44
55
  await page.toggleCollapse();
45
56
  expect(page.isCollapsed).toBeFalsy();
46
57
 
@@ -49,6 +60,7 @@ describe("Display User Details Information", () => {
49
60
  });
50
61
 
51
62
  it('As LU I should copy the public key', async() => {
63
+ expect.assertions(2);
52
64
  jest.spyOn(props.actionFeedbackContext, "displaySuccess").mockImplementationOnce(() => {});
53
65
  await page.toggleCollapse();
54
66
  await page.copyPublicKey();
@@ -57,8 +69,20 @@ describe("Display User Details Information", () => {
57
69
  });
58
70
 
59
71
  it('As LU I should see the appropriate detailed user fingerprint', async() => {
72
+ expect.assertions(2);
60
73
  await page.toggleCollapse();
61
74
  expect(page.fingerprint).toContain('03F6 0E95 8F4C B297 23AC<br>DF76 1353 B5B1 5D9B 054F');
62
75
  expect(page.type).toBe('RSA');
63
76
  });
77
+
78
+ it('As LU I should see the details of an invalid key', async() => {
79
+ expect.assertions(4);
80
+ jest.spyOn(context.port, 'request').mockImplementation(jest.fn(() => mockInvalidGpgKey));
81
+
82
+ await page.toggleCollapse();
83
+ expect(page.fingerprint).toContain('C694 577F F69D E85C 0793<br>5DF3 10FC 3004 99AE 900B');
84
+ expect(page.type).toBe('RSA');
85
+ expect(page.created).toBe(formatDate('2020-08-19T14:56:54+00:00'));
86
+ expect(page.expires).toBe('n/a');
87
+ });
64
88
  });
@@ -3,38 +3,23 @@ import React from "react";
3
3
  import AppContext from "../../../contexts/AppContext";
4
4
  import PropTypes from "prop-types";
5
5
  import DisplayUserDetailsPublicKey from "./DisplayUserDetailsPublicKey";
6
-
6
+ import {mockGpgKey, mockInvalidGpgKey} from "./DisplayUserDetailsPublicKey.test.data";
7
7
 
8
8
  export default {
9
- title: 'Passbolt/UserDetails/DisplayUserDetailsPublicKey',
9
+ title: 'Passbolt Component/UserDetails/DisplayUserDetailsPublicKey',
10
10
  component: DisplayUserDetailsPublicKey
11
11
  };
12
12
 
13
- const context = {
14
- port: {
15
- request: () => ({
16
- "id": "91d8a7fd-3ab3-5e98-a4a5-0d8694ff23b9",
17
- "keyId": "91d8a7fd-3ab3-5e98-a4a5-0d8694ff23b9",
18
- "user_id": "d57c10f5-639d-5160-9c81-8a0c6c4ec856",
19
- "armored_key": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFY06pcBEADjYRuq05Zatu4qYtXmexbrwtUdakNJJHPlWxcusohdTLUmSXrt\n7LegXBE3OjvV9HbdBQfbpjitFp8eJw5krYQmh1+w\/UYjb5Jy\/A7ma3oawzbVwNpL\nwuAafYma5LLLloZD\/OpYKprhWfW9FHKyq6t+AcH5CFs\/HvixdrdbAO7K1\/z6mgWc\nT6HBP5\/dGTseAlrvUDTsW1kzo6qsrOWoUunrqm31umsvcfNROtDKM16zgZl+GlYY\n1BxNcRKr1\/AcZUrp4zdSSc6IXrYjJ+1kgHz\/ZoSrKn5QiqEn7wQEveJu+jNGSv8j\nMvQgjq+AmzveJ\/4f+RQirbe9JOeDgzX7NqloRil3I0FPFoivbRU0PHi4N2q7sN8e\nYpXxXzuL+OEq1GQe5fTsSotQTRZUJxbdUS8DfPckQaK79HoybTQAgA6mgQf\/C+U0\nX2TiBUzgBuhayiW12kHmKyK02htDeRNOYs4bBMdeZhAFm+5C74LJ3FGQOHe+\/o2o\nBktk0rAZScjizijzNzJviRB\/3nAJSBW6NSNYcbnosk0ET2osg2tLvzegRI6+NQJE\nb0EpByTMypUDhCNKgg5aEDUVWcq4iucps\/1e6\/2vg2XVB7xdphT4\/K44ZeBHdFuf\nhGQvs8rkAPzpkpsEWKgpTR+hdhbMmNiL984Ywk98nNuzgfkgpcP57xawNwARAQAB\ntCtQYXNzYm9sdCBEZWZhdWx0IEFkbWluIDxhZG1pbkBwYXNzYm9sdC5jb20+iQJO\nBBMBCgA4AhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAFiEEDB0XYRENHjPJAG0a\nWxszLtBkJtMFAl0bmoYACgkQWxszLtBkJtPnxg\/\/Q9WOWUGf7VOnfbaIix3NGAON\nI7rgXuLFc1E0vG20XWT2+C6xGskFwjoJbiyDrbMYnILGn7vDIn3MSoITemLjtt97\n\/lEXK7AgbJEWQWF1lxpXm0nCvjJ6h+qatGK96ncjcua6ecUut10A\/CACpuqxfKOh\nD6CaM5l\/ksEDtwvrv2MIaVajuCvwg+yUx0I0rfAQv0YTXbJ5MRn1pvOo3c6n5Q0z\n5eu\/iiG0UNNIE3Tk5KpT02MTMv5ullpt3mtNjMHH0\/TdPxCtUKVh4q34x3syiYLe\npaddf5Ctv9CL52VWfsG3qFPHp7euOFY8lfzuemoqD9jcE7QIJnkCmwtLXLQrE0O2\nRW\/y\/oXqrETXu2sFyHMr1Xw\/\/QeJgIv63LBGmcPOj93VyHIlcUDarM2oq2+DXKxr\nDs2xfnFKVCZwpSvecIfKXUKsnX3AGrpetoZdfw0jAUVI3nt6YCu8KvczXxetfjOV\n3HHXa40gtOZk5OoKbfuTjzQlpc1oaDyLH8PT1GYsN3wWoDs4zulh6uKDpSt+4z58\nH1BfPFlrO2uhZSfk3E83uBQXZcABeXNxCdrTCJm8P90sbjLu1TlaeOnrWwVT7Yq8\ni8LE7lbAXnT1HjQlDi8GB2+2EnZZmOX+Z84a16jDElZazUNsE8zT7OmyjuB7GGDb\nQEFYzkb9dr1j1sukzty5Ag0EVjTqlwEQAJ37C9s4pq4jvcEF3bJgL+q3SBolgBIp\nN1g1\/woi9vEiOh+7e08Kr8mEhF04cpRDbhY6dcZ8OIXIQ99fgdNXfehlAWnI56NE\n\/FOIyif8TvGBfO6yE35fKSskwGNdUZWIZ0U0pxSXQvB+KEGWlq2c3Uf\/jhTZDnLN\nvfDjnYmn5ycp5sVWhtAmKFha9NJ6LGA0D1MC+jcCJCKtQRGgVvlqOESFDmQ7Pu8\/\nayr2BO0URHJ0Ob30lHluCnoKIv50qGpL9BYuGAdCfLBHXzRQhHIbfc\/cTPkK1kTX\nX5x\/MkiEl88TeGN+yjNVS7qqdxYgs+QYnDDZqevhWEvVyXVQjcCWSIHfjL1x5Ndq\nYL6+ci\/OxyIFoPs4K2umN3JPmpFi+fIPh2CexKy6BnyE8oAgNvgdDb6ZOfAtvShZ\nPM7QG4LZal2+nYp4n7gJRh6kepTQT\/4Bua0xOtRQhgcI4nGtcCxEDRMMzjqbGYlc\nnciMjsiMg9LPpWPDA+xKrRZKYwVFy8vLx\/alOz\/h1BZjx2u7YmuaGENxE62Lfyh0\nxeoCBDTdnWEOQTH6LVsomVtUO1FVap1t5jkYSdpxBuHf8\/2Ye7N3FTMRKe9n4e75\nsAJ00utnMl6P2Zca9mM4T29PK+LPFx2G2h35DQ7MbEid1cAZ8QVR3UyoiR8+u9jM\nek+9uFCm+nAxABEBAAGJAjYEGAEKACACGwwWIQQMHRdhEQ0eM8kAbRpbGzMu0GQm\n0wUCXRuamQAKCRBbGzMu0GQm004PD\/9sFmFkdoSqwU\/En77+h0gt4knlgZbgj0iR\nromnknIwLKBbJJXksHmMPXJB9b3WZ\/gGV3pPVtDWDKg3NZW4HLK13w3s3wQ2ViVV\nA6FzABDSkI3YBqkkasLRZU7oN9XajdFfph5wLhDSgTCjSncGfcjVzPugWKLqPPih\nZO6mpqxSFYEhx+p\/O80Tlj90UsOFRdot7cqn5wOhXZtKsQ0RwaA\/uq\/sFe6UNKHG\n2RBgQfoj5JbazJbvlgMiWxhBalwZKQWs8IBh\/4ag8AFwwoJN+gOtNM9C4UCHu+yt\n0Tv2\/Tu+Apcj0oyFaKJD4uQUmChQ2fDRysqJEIhee+yL29mrdcB4jG7Q2rt8HbhY\nwlsHKgas0YIHdR6dUOCiyw72i0khwrd2PDgxKRu5+cob6wMSqXbIIxFLLLACHy2s\nKd6fQcg8FxoivEiF0lRfMi32A\/YWGJ\/k1OoFCzW55KFXqqBMptYZWh2Jezhttmid\nYHPc7jas7HEPnw3SvVM0gYAcmEVWWvjKfUpOhSYYkk\/B71w9RuIpPyyI7G2XI8Db\nG2ttngDIOL8njS6ybU9Og6yTNUoHL1wWEZN1b3fznKHcC9lyr8MIg00QNeDItt9i\nILCOkjoEdUdauqlRIa+EmUu+AL+JobrlQTzyrCIm7aaT3Hp9EyaEx5xvJDWtmjgf\nFYNCFtV1fw==\n=amwR\n-----END PGP PUBLIC KEY BLOCK-----",
20
- "bits": 4096,
21
- "uid": "Passbolt Default Admin \u003Cadmin@passbolt.com\u003E",
22
- "key_id": "D06426D3",
23
- "fingerprint": "0C1D1761110D1E33C9006D1A5B1B332ED06426D3",
24
- "type": "RSA",
25
- "expires": null,
26
- "key_created": "2015-10-31T16:21:43+00:00",
27
- "deleted": false,
28
- "created": "2020-04-20T11:32:18+00:00",
29
- "modified": "2020-04-20T11:32:18+00:00",
30
- "algorithm": "rsa_encrypt_sign",
31
- "length": 4096
32
- })
33
- }
34
- };
35
-
13
+ function defaultContext(data = {}) {
14
+ const defaultData = {
15
+ port: {
16
+ request: () => mockGpgKey
17
+ }
18
+ };
19
+ return Object.assign(defaultData, data);
20
+ }
36
21
 
37
- const Template = args =>
22
+ const Template = ({context, ...args}) =>
38
23
  <AppContext.Provider value={context}>
39
24
  <div className="panel aside">
40
25
  <div className="detailed-information">
@@ -51,6 +36,23 @@ Template.propTypes = {
51
36
 
52
37
  export const Initial = Template.bind({});
53
38
  Initial.args = {
39
+ context: defaultContext(),
40
+ userWorkspaceContext: {
41
+ details: {
42
+ user: {
43
+ "id": "54c6278e-f824-5fda-91ff-3e946b18d994",
44
+ }
45
+ }
46
+ }
47
+ };
48
+
49
+ export const InvalidKey = Template.bind({});
50
+ InvalidKey.args = {
51
+ context: defaultContext({
52
+ port: {
53
+ request: () => mockInvalidGpgKey
54
+ }
55
+ }),
54
56
  userWorkspaceContext: {
55
57
  details: {
56
58
  user: {
@@ -12,6 +12,7 @@
12
12
  * @since 2.13.0
13
13
  */
14
14
  import React, {Component} from "react";
15
+ import ReactList from "react-list";
15
16
  import PropTypes from "prop-types";
16
17
 
17
18
  import FormSubmitButton from "../../Common/Inputs/FormSubmitButton/FormSubmitButton";
@@ -22,11 +23,8 @@ import Autocomplete from "../../Common/Inputs/Autocomplete/Autocomplete";
22
23
  import {withAppContext} from "../../../contexts/AppContext";
23
24
  import {withDialog} from "../../../contexts/DialogContext";
24
25
  import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
25
- import UserAvatar from "../../Common/Avatar/UserAvatar";
26
- import Icon from "../../../../shared/components/Icons/Icon";
27
26
  import {Trans, withTranslation} from "react-i18next";
28
- import Tooltip from "../../Common/Tooltip/Tooltip";
29
- import Select from "../../Common/Select/Select";
27
+ import EditUserGroupItem from "../EditUserGroup/EditUserGroupItem";
30
28
 
31
29
  class CreateUserGroup extends Component {
32
30
  /**
@@ -77,6 +75,9 @@ class CreateUserGroup extends Component {
77
75
  this.handleNameInputKeyUp = this.handleNameInputKeyUp.bind(this);
78
76
  this.handleSelectUpdate = this.handleSelectUpdate.bind(this);
79
77
  this.handleDeleteClickEvent = this.handleDeleteClickEvent.bind(this);
78
+
79
+ this.renderItem = this.renderItem.bind(this);
80
+ this.renderContainer = this.renderContainer.bind(this);
80
81
  }
81
82
 
82
83
  /**
@@ -320,7 +321,7 @@ class CreateUserGroup extends Component {
320
321
  groups_users.push({user: aro, is_admin});
321
322
  this.setState({groups_users}, () => {
322
323
  // scroll at the bottom of the group users list
323
- this.groupUsersListRef.current.scrollTop = this.groupUsersListRef.current.scrollHeight;
324
+ this.groupUsersListRef.current.scrollTo(groups_users.length - 1);
324
325
  });
325
326
  }
326
327
 
@@ -357,16 +358,26 @@ class CreateUserGroup extends Component {
357
358
  const matchUser = (word, user) => matchUsernameProperty(word, user) || matchNameProperty(word, user);
358
359
  const matchText = user => words.every(word => matchUser(word, user));
359
360
 
360
- const usersMatched = this.props.context.users.filter(user => user.active === true && !userAlreadyAdded(user))
361
- .filter(matchText);
361
+ let currentCount = 0;
362
+ const firstUsersMatched = this.props.context.users.filter(user => {
363
+ const isUserMatching = currentCount < Autocomplete.DISPLAY_LIMIT
364
+ && user.active === true
365
+ && !userAlreadyAdded(user)
366
+ && matchText(user);
367
+
368
+ if (isUserMatching) {
369
+ currentCount++;
370
+ }
371
+ return isUserMatching;
372
+ });
362
373
 
363
- return this.decorateUsersWithGpgKey(usersMatched);
374
+ return this.decorateUsersWithGpgKey(firstUsersMatched);
364
375
  }
365
376
 
366
377
  /**
367
378
  * Decorate a list of users with their gpg key.
368
379
  * @param {array} users
369
- * @returns {array}
380
+ * @returns {Promise<array}
370
381
  */
371
382
  async decorateUsersWithGpgKey(users) {
372
383
  const decorateGroupsUsersWithGpgKey = async user => Object.assign(user, {gpgkey: await this.props.context.port.request('passbolt.keyring.get-public-key-info-by-user', user.id)});
@@ -449,6 +460,44 @@ class CreateUserGroup extends Component {
449
460
  ];
450
461
  }
451
462
 
463
+ /**
464
+ * Use to render a single item of the user group list
465
+ * @param {integer} index of the item in the source list
466
+ * @param {integer} key index of the HTML element in the ReactList
467
+ * @returns {JSX.Element}
468
+ */
469
+ renderItem(index, key) {
470
+ const groupUser = this.state.groups_users[index];
471
+ const createUserGroupItemKey = groupUser.user.id;
472
+ return (
473
+ <EditUserGroupItem
474
+ key={createUserGroupItemKey}
475
+ itemKey={createUserGroupItemKey}
476
+ groupUser={groupUser}
477
+ onMemberRoleChange={event => this.handleSelectUpdate(event, groupUser.user.id)}
478
+ onMemberRemoved={event => this.handleDeleteClickEvent(event, groupUser.user.id)}
479
+ isLastItemDisplayed={key >= 2}
480
+ isMemberChanged={true}
481
+ isMemberAdded={true}
482
+ areActionsAllowed={!this.hasAllInputDisabled()}
483
+ />
484
+ );
485
+ }
486
+
487
+ /**
488
+ * Use to render the container of the list of the ReactList component
489
+ * @param {Array<JSX.Element>} items the list of the items to be rendered as children element of the conainer
490
+ * @param {*} ref the ref ReactList needs to manage the scroll
491
+ * @returns {JSX.Element}
492
+ */
493
+ renderContainer(items, ref) {
494
+ return (
495
+ <ul className="permissions groups_users" ref={ref}>
496
+ {items}
497
+ </ul>
498
+ );
499
+ }
500
+
452
501
  /**
453
502
  * Get the translate function
454
503
  * @returns {function(...[*]=)}
@@ -470,11 +519,11 @@ class CreateUserGroup extends Component {
470
519
  disabled={this.hasAllInputDisabled()}>
471
520
  <form className="group-form" onSubmit={this.handleFormSubmit} noValidate>
472
521
  <div className="form-content">
473
- <div className={`input text required ${this.state.nameError ? "error" : ""}`}>
522
+ <div className={`input text required ${this.state.nameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
474
523
  <label htmlFor="group_name"><Trans>Group name</Trans></label>
475
524
  <input id="group-name-input" name="name" className="required" maxLength="50" type="text" placeholder={this.translate("group name")}
476
525
  onKeyUp={this.handleNameInputKeyUp} onChange={this.handleInputChange}
477
- disabled={this.state.processing} ref={this.nameInputRef}/>
526
+ disabled={this.hasAllInputDisabled()} ref={this.nameInputRef}/>
478
527
  {this.state.nameError &&
479
528
  <div className="name error-message">{this.state.nameError}</div>
480
529
  }
@@ -485,55 +534,34 @@ class CreateUserGroup extends Component {
485
534
  </div>
486
535
  </div>
487
536
  <div className="group_members">
488
- <div className="form-content permission-edit">
537
+ <div className="form-content scroll permission-edit">
489
538
  {this.hasMembers() &&
490
- <ul className="permissions scroll groups_users" ref={this.groupUsersListRef}>
491
- {this.state.groups_users.map(groups_user =>
492
- <li key={groups_user.user.id} className="row">
493
- <UserAvatar user={groups_user.user} baseUrl={this.props.context.userSettings.getTrustedDomain()}/>
494
- <div className="aro">
495
- <div className="aro-name">
496
- <span className="ellipsis">{this.getUserFullname(groups_user.user)}</span>
497
- <Tooltip message={this.getTooltipMessage(groups_user)}>
498
- <Icon name="info-circle"/>
499
- </Tooltip>
500
- </div>
501
- <div className="permission_changes">
502
- <span><Trans>Will be added</Trans></span>
503
- </div>
504
- </div>
505
- <div className="rights">
506
- <Select className="inline" items={this.permissions} value={groups_user.is_admin} disabled={this.hasAllInputDisabled()}
507
- onChange={event => this.handleSelectUpdate(event, groups_user.user.id)}/>
508
- </div>
509
- <div className="actions">
510
- <a className={`remove-item button button-transparent ${this.hasAllInputDisabled() ? "disabled" : ""}`}
511
- onClick={event => this.handleDeleteClickEvent(event, groups_user.user.id)} role="button">
512
- <Icon name='close'/>
513
- <span className="visually-hidden">Remove</span>
514
- </a>
515
- </div>
516
- </li>
517
- )
518
- }
519
- </ul>
520
- }
521
- {!this.hasMembers() &&
522
- <div className="message warning">
523
- <span><Trans>The group is empty, please add a group manager.</Trans></span>
524
- </div>
525
- }
526
- {this.hasMembers() && !this.hasManager() &&
527
- <div className="message error">
528
- <span><Trans>Please make sure there is at least one group manager.</Trans></span>
529
- </div>
530
- }
531
- {this.hasManager() &&
532
- <div className="message warning">
533
- <span><Trans>You need to click save for the changes to take place.</Trans></span>
534
- </div>
539
+ <ReactList
540
+ ref={this.groupUsersListRef}
541
+ itemRenderer={this.renderItem}
542
+ itemsRenderer={this.renderContainer}
543
+ length={this.state.groups_users.length}
544
+ minSize={4}
545
+ type={this.state.groups_users.length < 3 ? "simple" : "uniform"}
546
+ threshold={30}>
547
+ </ReactList>
535
548
  }
536
549
  </div>
550
+ {!this.hasMembers() &&
551
+ <div className="message warning">
552
+ <span><Trans>The group is empty, please add a group manager.</Trans></span>
553
+ </div>
554
+ }
555
+ {this.hasMembers() && !this.hasManager() &&
556
+ <div className="message error">
557
+ <span><Trans>Please make sure there is at least one group manager.</Trans></span>
558
+ </div>
559
+ }
560
+ {this.hasManager() &&
561
+ <div className="message warning">
562
+ <span><Trans>You need to click save for the changes to take place.</Trans></span>
563
+ </div>
564
+ }
537
565
  <div className="form-content permission-add">
538
566
  <Autocomplete
539
567
  id="user-name-input"
@@ -36,6 +36,11 @@ describe("See the Create Dialog Group", () => {
36
36
  const requestGpgMockImpl = jest.fn(() => mockGpgKey);
37
37
  mockContextRequest(context, requestGpgMockImpl);
38
38
  page = new CreateUserGroupPage(context, props);
39
+ jest.useFakeTimers();
40
+ });
41
+
42
+ afterEach(() => {
43
+ jest.clearAllTimers();
39
44
  });
40
45
 
41
46
  it('As AD I see a success toaster message after adding a group with success', async() => {
@@ -52,8 +57,10 @@ describe("See the Create Dialog Group", () => {
52
57
  const requestGpgMockImpl = jest.fn(() => mockGpgKey);
53
58
  mockContextRequest(context, requestGpgMockImpl);
54
59
  page.createGroup.fillInput(page.createGroup.usernameInput, "ada");
55
- await waitFor(() => {});
60
+ jest.runOnlyPendingTimers();
61
+
56
62
  expect(context.port.request).toHaveBeenCalledWith("passbolt.keyring.get-public-key-info-by-user", mockUsers[1].id);
63
+ await waitFor(() => {});
57
64
  await page.createGroup.click(page.createGroup.userAutocomplete);
58
65
 
59
66
  await page.createGroup.selectFirstItem(2);
@@ -86,8 +93,10 @@ describe("See the Create Dialog Group", () => {
86
93
  const requestGpgMockImpl = jest.fn(() => mockGpgKey);
87
94
  mockContextRequest(context, requestGpgMockImpl);
88
95
  page.createGroup.fillInput(page.createGroup.usernameInput, "ada");
89
- await waitFor(() => {});
96
+ jest.runOnlyPendingTimers();
97
+
90
98
  expect(context.port.request).toHaveBeenCalledWith("passbolt.keyring.get-public-key-info-by-user", mockUsers[1].id);
99
+ await waitFor(() => {});
91
100
  await page.createGroup.click(page.createGroup.userAutocomplete);
92
101
 
93
102
  // Mock the request function to make it the expected result
@@ -118,10 +127,12 @@ describe("See the Create Dialog Group", () => {
118
127
  const requestGpgMockImpl = jest.fn(() => mockGpgKey);
119
128
  mockContextRequest(context, requestGpgMockImpl);
120
129
  page.createGroup.fillInput(page.createGroup.usernameInput, "ada");
121
- await waitFor(() => {});
130
+ jest.runOnlyPendingTimers();
131
+
122
132
  expect(context.port.request).toHaveBeenCalledWith("passbolt.keyring.get-public-key-info-by-user", mockUsers[1].id);
123
- await page.createGroup.click(page.createGroup.userAutocomplete);
133
+ await waitFor(() => {});
124
134
 
135
+ await page.createGroup.click(page.createGroup.userAutocomplete);
125
136
  await page.createGroup.click(page.createGroup.saveButton);
126
137
 
127
138
  // Throw error message
@@ -153,8 +164,10 @@ describe("See the Create Dialog Group", () => {
153
164
  const requestGpgMockImpl = jest.fn(() => mockGpgKey);
154
165
  mockContextRequest(context, requestGpgMockImpl);
155
166
  page.createGroup.fillInput(page.createGroup.usernameInput, "ada");
156
- await waitFor(() => {});
167
+ jest.runOnlyPendingTimers();
168
+
157
169
  expect(context.port.request).toHaveBeenCalledWith("passbolt.keyring.get-public-key-info-by-user", mockUsers[1].id);
170
+ await waitFor(() => {});
158
171
  await page.createGroup.click(page.createGroup.userAutocomplete);
159
172
 
160
173
  // Mock the request function to make it return an error.
@@ -176,8 +189,10 @@ describe("See the Create Dialog Group", () => {
176
189
  const requestGpgMockImpl = jest.fn(() => mockGpgKey);
177
190
  mockContextRequest(context, requestGpgMockImpl);
178
191
  page.createGroup.fillInput(page.createGroup.usernameInput, "ada");
179
- await waitFor(() => {});
192
+ jest.runOnlyPendingTimers();
193
+
180
194
  expect(context.port.request).toHaveBeenCalledWith("passbolt.keyring.get-public-key-info-by-user", mockUsers[1].id);
195
+ await waitFor(() => {});
181
196
  await page.createGroup.click(page.createGroup.userAutocomplete);
182
197
 
183
198
  const data = {
@@ -7,7 +7,7 @@ import {mockGpgKey, mockUsers} from "./CreateUserGroup.test.data";
7
7
 
8
8
 
9
9
  export default {
10
- title: 'Passbolt/UserGroup/CreateUserGroup',
10
+ title: 'Passbolt Component/UserGroup/CreateUserGroup',
11
11
  component: CreateUserGroup
12
12
  };
13
13
 
@@ -132,7 +132,7 @@ class DeleteUserGroup extends Component {
132
132
  Are you sure you want to delete the group <strong>{{groupName: this.group.name}}</strong>?
133
133
  </Trans>
134
134
  </p>
135
- <p><Trans>Warning: This action can’t be undone. Users in this group may lose access to the content shared with it.</Trans></p>
135
+ <p><Trans>This action can’t be undone. Users in this group may lose access to the content shared with it.</Trans></p>
136
136
  </div>
137
137
  <div className="submit-wrapper clearfix">
138
138
  <FormCancelButton disabled={this.hasAllInputDisabled()} onClick={this.handleCloseClick}/>
@@ -7,7 +7,7 @@ import MockPort from "../../../test/mock/MockPort";
7
7
 
8
8
 
9
9
  export default {
10
- title: 'Passbolt/UserGroup/DeleteUserGroup',
10
+ title: 'Passbolt Component/UserGroup/DeleteUserGroup',
11
11
  component: DeleteUserGroup
12
12
  };
13
13
 
@@ -381,7 +381,7 @@ class DeleteUserGroupWithConflicts extends Component {
381
381
  <ul className="ownership-transfer-items">
382
382
  {this.foldersErrors.map(folderError =>
383
383
  <li key={folderError.id}>
384
- <div className="select-wrapper input required">
384
+ <div className={`select-wrapper input required ${this.state.processing ? 'disabled' : ''}`}>
385
385
  <label htmlFor="transfer_folder_owner">{folderError.name} <Trans>(Folder) new owner:</Trans></label>
386
386
  <Select className="form-element" value={this.state.owners[folderError.id]} items={this.getAcoPermissionsList(folderError.id)} onChange={event => this.handleOnChangeOwner(event, folderError.id)}/>
387
387
  </div>
@@ -396,7 +396,7 @@ class DeleteUserGroupWithConflicts extends Component {
396
396
  <ul className="ownership-transfer-items">
397
397
  {this.resourcesErrors.map(resourceError =>
398
398
  <li key={resourceError.id}>
399
- <div className="select-wrapper input required">
399
+ <div className={`select-wrapper input required ${this.state.processing ? 'disabled' : ''}`}>
400
400
  <label htmlFor="transfer_resource_owner">{resourceError.name} (<Trans>Password</Trans>) <Trans>new owner</Trans>:</label>
401
401
  <Select className="form-element" value={this.state.owners[resourceError.id]} items={this.getAcoPermissionsList(resourceError.id)} onChange={event => this.handleOnChangeOwner(event, resourceError.id)}/>
402
402
  </div>