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
@@ -22,6 +22,9 @@ import FormCancelButton from "../../Common/Inputs/FormSubmitButton/FormCancelBut
22
22
  import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
23
23
  import {withDialog} from "../../../contexts/DialogContext";
24
24
  import {Trans, withTranslation} from "react-i18next";
25
+ import {maxSizeValidation} from "../../../lib/Error/InputValidator";
26
+ import Icon from "../../../../shared/components/Icons/Icon";
27
+ import {USER_INPUT_MAX_LENGTH} from "../../../../shared/constants/inputs.const";
25
28
 
26
29
  class CreateUser extends Component {
27
30
  /**
@@ -59,10 +62,13 @@ class CreateUser extends Component {
59
62
  // Fields and errors
60
63
  first_name: "",
61
64
  first_nameError: null,
65
+ first_nameWarning: "",
62
66
  last_name: "",
63
67
  last_nameError: null,
68
+ last_nameWarning: "",
64
69
  username: "",
65
70
  usernameError: null,
71
+ usernameWarning: "",
66
72
  is_admin: false,
67
73
  hasAlreadyBeenValidated: false // True if the form has already been submitted once
68
74
  };
@@ -131,6 +137,9 @@ class CreateUser extends Component {
131
137
  if (this.state.hasAlreadyBeenValidated) {
132
138
  const state = this.validateFirstNameInput();
133
139
  this.setState(state);
140
+ } else {
141
+ const first_nameWarning = maxSizeValidation(this.state.first_name, USER_INPUT_MAX_LENGTH, this.translate);
142
+ this.setState({first_nameWarning});
134
143
  }
135
144
  }
136
145
 
@@ -141,6 +150,9 @@ class CreateUser extends Component {
141
150
  if (this.state.hasAlreadyBeenValidated) {
142
151
  const state = this.validateLastNameInput();
143
152
  this.setState(state);
153
+ } else {
154
+ const last_nameWarning = maxSizeValidation(this.state.last_name, USER_INPUT_MAX_LENGTH, this.translate);
155
+ this.setState({last_nameWarning});
144
156
  }
145
157
  }
146
158
 
@@ -151,6 +163,9 @@ class CreateUser extends Component {
151
163
  if (this.state.hasAlreadyBeenValidated) {
152
164
  const state = this.validateUsernameInput();
153
165
  this.setState(state);
166
+ } else {
167
+ const usernameWarning = maxSizeValidation(this.state.username, USER_INPUT_MAX_LENGTH, this.translate);
168
+ this.setState({usernameWarning});
154
169
  }
155
170
  }
156
171
 
@@ -371,22 +386,33 @@ class CreateUser extends Component {
371
386
  <form className="user-create-form" onSubmit={this.handleFormSubmit} noValidate>
372
387
  <div className="form-content">
373
388
  <div className={`input text required ${this.state.first_nameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
374
- <label htmlFor="user-first-name-input"><Trans>First name</Trans></label>
389
+ <label htmlFor="user-first-name-input"><Trans>First name</Trans>{this.state.first_nameWarning &&
390
+ <Icon name="exclamation"/>
391
+ }</label>
375
392
  <input id="user-first-name-input" name="first_name"
376
393
  ref={this.firstNameRef}
377
394
  type="text" value={this.state.first_name} placeholder={this.translate("First name")}
378
395
  required="required" disabled={this.hasAllInputDisabled()}
396
+ maxLength="128"
379
397
  onKeyUp={this.handleFirstNameInputKeyUp} onChange={this.handleInputChange}
380
398
  autoComplete='off' autoFocus={true}
381
399
  />
382
400
  {this.state.first_nameError &&
383
401
  <div className="first_name error-message">{this.state.first_nameError}</div>
384
402
  }
403
+ {this.state.first_nameWarning && (
404
+ <div className="firstname warning-message">
405
+ <strong><Trans>Warning:</Trans></strong> {this.state.first_nameWarning}
406
+ </div>
407
+ )}
385
408
  </div>
386
409
  <div className={`input text required ${this.state.last_nameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
387
- <label htmlFor="user-last-name-input"><Trans>Last name</Trans></label>
410
+ <label htmlFor="user-last-name-input"><Trans>Last name</Trans>{this.state.last_nameWarning &&
411
+ <Icon name="exclamation"/>
412
+ }</label>
388
413
  <input id="user-last-name-input" name="last_name"
389
414
  ref={this.lastNameRef}
415
+ maxLength="128"
390
416
  type="text" value={this.state.last_name} placeholder={this.translate("Last name")}
391
417
  required="required" disabled={this.hasAllInputDisabled()}
392
418
  onKeyUp={this.handleLastNameInputOnKeyUp} onChange={this.handleInputChange}
@@ -395,10 +421,18 @@ class CreateUser extends Component {
395
421
  {this.state.last_nameError &&
396
422
  <div className="last_name error-message">{this.state.last_nameError}</div>
397
423
  }
424
+ {this.state.last_nameWarning && (
425
+ <div className="lastname warning-message">
426
+ <strong><Trans>Warning:</Trans></strong> {this.state.last_nameWarning}
427
+ </div>
428
+ )}
398
429
  </div>
399
430
  <div className={`input text required ${this.state.usernameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
400
- <label htmlFor="user-username-input"><Trans>Username / Email</Trans></label>
431
+ <label htmlFor="user-username-input"><Trans>Username / Email</Trans>{this.state.usernameWarning &&
432
+ <Icon name="exclamation"/>
433
+ }</label>
401
434
  <input id="user-username-input" name="username"
435
+ maxLength="128"
402
436
  ref={this.usernameRef} type="text" value={this.state.username} placeholder={this.translate("Email")}
403
437
  required="required" disabled={this.hasAllInputDisabled()}
404
438
  onKeyUp={this.handleUsernameInputOnKeyUp} onChange={this.handleInputChange}
@@ -407,6 +441,11 @@ class CreateUser extends Component {
407
441
  {this.state.usernameError &&
408
442
  <div className="username error-message">{this.state.usernameError}</div>
409
443
  }
444
+ {this.state.usernameWarning && (
445
+ <div className="username warning-message">
446
+ <strong><Trans>Warning:</Trans></strong> {this.state.usernameWarning}
447
+ </div>
448
+ )}
410
449
  </div>
411
450
  <div className={`input checkbox-wrapper ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
412
451
  <label htmlFor="is_admin_checkbox"><Trans>Role</Trans></label>
@@ -24,6 +24,7 @@ import {waitFor} from "@testing-library/react";
24
24
  beforeEach(() => {
25
25
  jest.resetModules();
26
26
  });
27
+ const truncatedWarningMessage = "Warning: this is the maximum size for this field, make sure your data was not truncated.";
27
28
 
28
29
  describe("See the Create Dialog User", () => {
29
30
  let page; // The page to test against
@@ -176,5 +177,20 @@ describe("See the Create Dialog User", () => {
176
177
  // display username error message
177
178
  expect(page.createUser.usernameErrorMessage.textContent).toBe("This username is already in use.");
178
179
  });
180
+
181
+ it("As a user I should see a feedback when firstname, username or lastname field content is truncated by a field limit", async() => {
182
+ expect.assertions(3);
183
+ page.createUser.fillInput(page.createUser.firstName, 'a'.repeat(128));
184
+ page.createUser.fillInput(page.createUser.username, 'a'.repeat(128));
185
+ page.createUser.fillInput(page.createUser.lastName, 'a'.repeat(128));
186
+
187
+ await page.createUser.keyUpInput(page.createUser.firstName);
188
+ await page.createUser.keyUpInput(page.createUser.username);
189
+ await page.createUser.keyUpInput(page.createUser.lastName);
190
+
191
+ expect(page.createUser.usernameWarningMessage.textContent).toEqual(truncatedWarningMessage);
192
+ expect(page.createUser.firstnameWarningMessage.textContent).toEqual(truncatedWarningMessage);
193
+ expect(page.createUser.lastnameWarningMessage.textContent).toEqual(truncatedWarningMessage);
194
+ });
179
195
  });
180
196
  });
@@ -186,6 +186,27 @@ class CreateUserPageObject {
186
186
  return this._container.querySelector('.error-dialog .dialog .dialog-content .form-content');
187
187
  }
188
188
 
189
+ /**
190
+ * Returns the username warning mesage input element
191
+ */
192
+ get usernameWarningMessage() {
193
+ return this._container.querySelector('.username.warning-message');
194
+ }
195
+
196
+ /**
197
+ * Returns the first name warning mesage input element
198
+ */
199
+ get firstnameWarningMessage() {
200
+ return this._container.querySelector('.firstname.warning-message');
201
+ }
202
+
203
+ /**
204
+ * Returns the last name warning mesage input element
205
+ */
206
+ get lastnameWarningMessage() {
207
+ return this._container.querySelector('.lastname.warning-message');
208
+ }
209
+
189
210
  /**
190
211
  * Returns true if the page object exists in the container
191
212
  */
@@ -218,6 +239,11 @@ class CreateUserPageObject {
218
239
  const dataInputEvent = {target: {value: data}};
219
240
  fireEvent.change(element, dataInputEvent);
220
241
  }
242
+
243
+ /** on keypup element */
244
+ keyUpInput(component) {
245
+ fireEvent.keyUp(component, {keyCode: 38});
246
+ }
221
247
  }
222
248
 
223
249
 
@@ -28,6 +28,7 @@ import {Trans, withTranslation} from "react-i18next";
28
28
  import HandleReviewAccountRecoveryRequestWorkflow
29
29
  from "../../AccountRecovery/HandleReviewAccountRecoveryRequestWorkflow/HandleReviewAccountRecoveryRequestWorkflow";
30
30
  import {withWorkflow} from "../../../contexts/WorkflowContext";
31
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
31
32
 
32
33
  /**
33
34
  * This component is a container of multiple actions applicable on user
@@ -344,7 +345,7 @@ class DisplayUserWorkspaceActions extends React.Component {
344
345
  this.closeMoreMenu();
345
346
  const baseUrl = this.props.context.userSettings.getTrustedDomain();
346
347
  const permalink = `${baseUrl}/app/users/view/${this.selectedUser.id}`;
347
- await navigator.clipboard.writeText(permalink);
348
+ await ClipBoard.copy(permalink, this.props.context.port);
348
349
  this.props.actionFeedbackContext.displaySuccess(this.translate("The permalink has been copied to clipboard"));
349
350
  }
350
351
 
@@ -24,8 +24,8 @@ import DeleteUser from "../DeleteUser/DeleteUser";
24
24
  import NotifyError from "../../Common/Error/NotifyError/NotifyError";
25
25
  import {Trans, withTranslation} from "react-i18next";
26
26
  import {withWorkflow} from "../../../contexts/WorkflowContext";
27
- import HandleReviewAccountRecoveryRequestWorkflow
28
- from "../../AccountRecovery/HandleReviewAccountRecoveryRequestWorkflow/HandleReviewAccountRecoveryRequestWorkflow";
27
+ import HandleReviewAccountRecoveryRequestWorkflow from "../../AccountRecovery/HandleReviewAccountRecoveryRequestWorkflow/HandleReviewAccountRecoveryRequestWorkflow";
28
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
29
29
 
30
30
  class DisplayUsersContextualMenu extends React.Component {
31
31
  /**
@@ -93,7 +93,7 @@ class DisplayUsersContextualMenu extends React.Component {
93
93
  async handlePermalinkCopy() {
94
94
  const baseUrl = this.props.context.userSettings.getTrustedDomain();
95
95
  const permalink = `${baseUrl}/app/users/view/${this.user.id}`;
96
- await navigator.clipboard.writeText(permalink);
96
+ await ClipBoard.copy(permalink, this.props.context.port);
97
97
  this.props.actionFeedbackContext.displaySuccess(this.translate("The permalink has been copied to clipboard"));
98
98
  this.props.hide();
99
99
  }
@@ -103,7 +103,7 @@ class DisplayUsersContextualMenu extends React.Component {
103
103
  */
104
104
  async handleUsernameCopy() {
105
105
  const username = `${this.user.username}`;
106
- await navigator.clipboard.writeText(username);
106
+ await ClipBoard.copy(username, this.props.context.port);
107
107
  this.props.actionFeedbackContext.displaySuccess(this.translate("The email has been copied to clipboard"));
108
108
  this.props.hide();
109
109
  }
@@ -113,7 +113,7 @@ class DisplayUsersContextualMenu extends React.Component {
113
113
  */
114
114
  async handlePublicKeyCopy() {
115
115
  const gpgkeyInfo = await this.props.context.port.request('passbolt.keyring.get-public-key-info-by-user', this.user.id);
116
- await navigator.clipboard.writeText(gpgkeyInfo.armored_key);
116
+ await ClipBoard.copy(gpgkeyInfo.armored_key, this.props.context.port);
117
117
  this.props.actionFeedbackContext.displaySuccess(this.translate("The public key has been copied to clipboard"));
118
118
  this.props.hide();
119
119
  }
@@ -21,6 +21,9 @@ import FormCancelButton from "../../Common/Inputs/FormSubmitButton/FormCancelBut
21
21
  import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
22
22
  import {withDialog} from "../../../contexts/DialogContext";
23
23
  import {Trans, withTranslation} from "react-i18next";
24
+ import {maxSizeValidation} from '../../../lib/Error/InputValidator';
25
+ import Icon from "../../../../shared/components/Icons/Icon";
26
+ import {USER_INPUT_MAX_LENGTH} from '../../../../shared/constants/inputs.const';
24
27
 
25
28
  class EditUser extends Component {
26
29
  /**
@@ -49,8 +52,10 @@ class EditUser extends Component {
49
52
  // Fields and errors
50
53
  first_name: user.profile.first_name,
51
54
  first_nameError: null,
55
+ first_nameWarning: "",
52
56
  last_name: user.profile.last_name,
53
57
  last_nameError: null,
58
+ last_nameWarning: "",
54
59
  username: user.username,
55
60
  is_admin: role.name === 'admin',
56
61
  hasAlreadyBeenValidated: false // True if the form has alreadt been submitted once
@@ -139,6 +144,9 @@ class EditUser extends Component {
139
144
  if (this.state.hasAlreadyBeenValidated) {
140
145
  const state = this.validateFirstNameInput();
141
146
  this.setState(state);
147
+ } else {
148
+ const first_nameWarning = maxSizeValidation(this.state.first_name, USER_INPUT_MAX_LENGTH, this.translate);
149
+ this.setState({first_nameWarning});
142
150
  }
143
151
  }
144
152
 
@@ -149,6 +157,9 @@ class EditUser extends Component {
149
157
  if (this.state.hasAlreadyBeenValidated) {
150
158
  const state = this.validateLastNameInput();
151
159
  this.setState(state);
160
+ } else {
161
+ const last_nameWarning = maxSizeValidation(this.state.last_name, USER_INPUT_MAX_LENGTH, this.translate);
162
+ this.setState({last_nameWarning});
152
163
  }
153
164
  }
154
165
 
@@ -343,7 +354,9 @@ class EditUser extends Component {
343
354
  <form className="user-edit-form" onSubmit={this.handleFormSubmit} noValidate>
344
355
  <div className="form-content">
345
356
  <div className={`input text required ${this.state.first_nameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
346
- <label htmlFor="user-first-name-input"><Trans>First name</Trans></label>
357
+ <label htmlFor="user-first-name-input"><Trans>First name</Trans>{this.state.first_nameWarning &&
358
+ <Icon name="exclamation"/>
359
+ }</label>
347
360
  <input id="user-first-name-input" name="first_name"
348
361
  ref={this.firstNameRef} type="text" value={this.state.first_name} placeholder={this.translate("First name")}
349
362
  required="required" disabled={this.hasAllInputDisabled()}
@@ -353,10 +366,16 @@ class EditUser extends Component {
353
366
  {this.state.first_nameError &&
354
367
  <div className="first_name error-message">{this.state.first_nameError}</div>
355
368
  }
369
+ {this.state.first_nameWarning && (
370
+ <div className="firstname warning-message">
371
+ <strong><Trans>Warning:</Trans></strong> {this.state.first_nameWarning}
372
+ </div>
373
+ )}
356
374
  </div>
357
375
  <div className={`input text required ${this.state.last_nameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
358
376
  <label htmlFor="user-last-name-input"><Trans>Last name</Trans></label>
359
377
  <input id="user-last-name-input" name="last_name"
378
+ maxLength="128"
360
379
  ref={this.lastNameRef} type="text" value={this.state.last_name} placeholder={this.translate("Last name")}
361
380
  required="required" disabled={this.hasAllInputDisabled()}
362
381
  onKeyUp={this.handleLastNameInputOnKeyUp} onChange={this.handleInputChange}
@@ -365,10 +384,18 @@ class EditUser extends Component {
365
384
  {this.state.last_nameError &&
366
385
  <div className="last_name error-message">{this.state.last_nameError}</div>
367
386
  }
387
+ {this.state.last_nameWarning && (
388
+ <div className="lastname warning-message">
389
+ <strong><Trans>Warning:</Trans></strong> {this.state.last_nameWarning}
390
+ </div>
391
+ )}
368
392
  </div>
369
393
  <div className="input text required disabled">
370
- <label htmlFor="user-username-input"><Trans>Username / Email</Trans></label>
394
+ <label htmlFor="user-username-input"><Trans>Username / Email</Trans>{this.state.last_nameWarning &&
395
+ <Icon name="exclamation"/>
396
+ }</label>
371
397
  <input id="user-username-input" name="username"
398
+ maxLength="128"
372
399
  type="text" value={this.state.username} placeholder={this.translate("Username")}
373
400
  required="required" disabled={true}
374
401
  autoComplete='off' autoFocus={true}
@@ -24,6 +24,7 @@ import {defaultAppContext, defaultProps} from "./EditUser.test.data";
24
24
  beforeEach(() => {
25
25
  jest.resetModules();
26
26
  });
27
+ const truncatedWarningMessage = "Warning: this is the maximum size for this field, make sure your data was not truncated.";
27
28
 
28
29
  describe("See the Create Dialog User", () => {
29
30
  let page; // The page to test against
@@ -148,5 +149,16 @@ describe("See the Create Dialog User", () => {
148
149
  expect(page.editUser.errorDialog).not.toBeNull();
149
150
  expect(page.editUser.errorDialogMessage).not.toBeNull();
150
151
  });
152
+ it("As a user I should see a feedback when firstname or lastname field content is truncated by a field limit", async() => {
153
+ expect.assertions(2);
154
+ page.editUser.fillInput(page.editUser.firstName, 'a'.repeat(128));
155
+ page.editUser.fillInput(page.editUser.lastName, 'a'.repeat(128));
156
+
157
+ await page.editUser.keyUpInput(page.editUser.firstName);
158
+ await page.editUser.keyUpInput(page.editUser.lastName);
159
+
160
+ expect(page.editUser.firstnameWarningMessage.textContent).toEqual(truncatedWarningMessage);
161
+ expect(page.editUser.lastnameWarningMessage.textContent).toEqual(truncatedWarningMessage);
162
+ });
151
163
  });
152
164
  });
@@ -179,6 +179,27 @@ class EditUserPageObject {
179
179
  return this._container.querySelector('.error-dialog .dialog .dialog-content .form-content');
180
180
  }
181
181
 
182
+ /**
183
+ * Returns the username warning mesage input element
184
+ */
185
+ get usernameWarningMessage() {
186
+ return this._container.querySelector('.username.warning-message');
187
+ }
188
+
189
+ /**
190
+ * Returns the first name warning mesage input element
191
+ */
192
+ get firstnameWarningMessage() {
193
+ return this._container.querySelector('.firstname.warning-message');
194
+ }
195
+
196
+ /**
197
+ * Returns the last name warning mesage input element
198
+ */
199
+ get lastnameWarningMessage() {
200
+ return this._container.querySelector('.lastname.warning-message');
201
+ }
202
+
182
203
  /**
183
204
  * Returns true if the page object exists in the container
184
205
  */
@@ -211,4 +232,9 @@ class EditUserPageObject {
211
232
  const dataInputEvent = {target: {value: data}};
212
233
  fireEvent.change(element, dataInputEvent);
213
234
  }
235
+
236
+ /** on keypup element */
237
+ keyUpInput(component) {
238
+ fireEvent.keyUp(component, {keyCode: 38});
239
+ }
214
240
  }
@@ -24,6 +24,7 @@ import DisplayUserDetailsPublicKey from "../DisplayUserDetailsPublicKey/DisplayU
24
24
  import UserAvatar from "../../Common/Avatar/UserAvatar";
25
25
  import {withTranslation, Trans} from "react-i18next";
26
26
  import DisplayUserDetailsAccountRecovery from "../DisplayUserDetailsAccountRecovery/DisplayUserDetailsAccountRecovery";
27
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
27
28
 
28
29
  class DisplayUserDetails extends React.Component {
29
30
  /**
@@ -67,7 +68,7 @@ class DisplayUserDetails extends React.Component {
67
68
  async handlePermalinkClick() {
68
69
  const baseUrl = this.props.context.userSettings.getTrustedDomain();
69
70
  const permalink = `${baseUrl}/app/users/view/${this.user.id}`;
70
- await navigator.clipboard.writeText(permalink);
71
+ await ClipBoard.copy(permalink, this.props.context.port);
71
72
  await this.props.actionFeedbackContext.displaySuccess(this.translate("The permalink has been copied to clipboard"));
72
73
  }
73
74