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,9 +22,6 @@ import {defaultProps, mockResource} from "./EditResource.test.data";
22
22
  import EditResourcePage from "./EditResource.test.page";
23
23
  import "../../../test/lib/crypto/cryptoGetRandomvalues";
24
24
 
25
- beforeEach(() => {
26
- jest.resetModules();
27
- });
28
25
 
29
26
  describe("See the Edit Resource", () => {
30
27
  let page; // The page to test against
@@ -36,18 +33,24 @@ describe("See the Edit Resource", () => {
36
33
  id: "8e3874ae-4b40-590b-968a-418f704b9d9a"
37
34
  };
38
35
 
39
- const mockContextRequest = implementation => jest.spyOn(props.context.port, 'request').mockImplementation(implementation);
40
36
  const truncatedWarningMessage = "Warning: this is the maximum size for this field, make sure your data was not truncated.";
41
37
 
42
38
  describe('As LU I can start adding a password', () => {
39
+ const mockContextRequest = implementation => jest.spyOn(props.context.port, 'request').mockImplementation(implementation);
43
40
  /**
44
41
  * I should see the edit password dialog
45
42
  */
46
43
  beforeEach(() => {
44
+ jest.useFakeTimers();
45
+ jest.resetModules();
47
46
  props.context.setContext({passwordEditDialogProps});
48
47
  page = new EditResourcePage(props);
49
48
  });
50
49
 
50
+ afterEach(() => {
51
+ jest.clearAllTimers();
52
+ });
53
+
51
54
  it('matches the styleguide', () => {
52
55
  // Dialog title exists and correct
53
56
  expect(page.passwordEdit.exists()).toBeTruthy();
@@ -126,7 +129,8 @@ describe("See the Edit Resource", () => {
126
129
  });
127
130
 
128
131
  it('requests the addon to edit a resource with encrypted description when clicking on the submit button.', async() => {
129
- expect(page.passwordEdit.exists()).toBeTruthy();
132
+ //Avoid to block with the beforeMount when checking current password
133
+ jest.runAllTimers();
130
134
  // edit password
131
135
  const resourceMeta = {
132
136
  name: "Password name",
@@ -143,10 +147,11 @@ describe("See the Edit Resource", () => {
143
147
  await waitFor(() => {
144
148
  expect(page.passwordEdit.password.disabled).toBeTruthy();
145
149
  });
146
- page.passwordEdit.fillInput(page.passwordEdit.password, resourceMeta.password);
147
- page.passwordEdit.blurInput(page.passwordEdit.password);
150
+ await page.passwordEdit.fillInputPassword(resourceMeta.password);
151
+ await page.passwordEdit.blurInput(page.passwordEdit.password);
148
152
  expect(page.passwordEdit.complexityText.textContent).not.toBe("Quality");
149
153
  expect(page.passwordEdit.progressBar.classList.contains("error")).toBe(false);
154
+
150
155
  page.passwordEdit.fillInput(page.passwordEdit.description, resourceMeta.description);
151
156
 
152
157
  const requestMockImpl = jest.fn();
@@ -229,7 +234,7 @@ describe("See the Edit Resource", () => {
229
234
  await waitFor(() => {
230
235
  expect(page.passwordEdit.password.classList).toContain("decrypted");
231
236
  });
232
- page.passwordEdit.fillInput(page.passwordEdit.password, "");
237
+ await page.passwordEdit.fillInputPassword("");
233
238
  page.passwordEdit.blurInput(page.passwordEdit.password);
234
239
  await page.passwordEdit.click(page.passwordEdit.saveButton);
235
240
 
@@ -262,7 +267,7 @@ describe("See the Edit Resource", () => {
262
267
  await waitFor(() => {
263
268
  expect(page.passwordEdit.password.classList).toContain("decrypted");
264
269
  });
265
- page.passwordEdit.fillInput(page.passwordEdit.password, "password");
270
+ await page.passwordEdit.fillInputPassword("password");
266
271
  page.passwordEdit.blurInput(page.passwordEdit.password);
267
272
 
268
273
  jest.spyOn(props.context.port, 'request').mockImplementationOnce(() => {
@@ -287,7 +292,7 @@ describe("See the Edit Resource", () => {
287
292
  await waitFor(() => {
288
293
  expect(page.passwordEdit.password.classList).toContain("decrypted");
289
294
  });
290
- page.passwordEdit.fillInput(page.passwordEdit.password, "password");
295
+ await page.passwordEdit.fillInputPassword("password");
291
296
  page.passwordEdit.blurInput(page.passwordEdit.password);
292
297
 
293
298
  // Mock the request function to make it the expected result
@@ -312,14 +317,41 @@ describe("See the Edit Resource", () => {
312
317
  expect(props.dialogContext.open).toBeCalled();
313
318
  });
314
319
 
315
- it("As a user I should see a feedback when the password or descriptions fields content is truncated by a field limit", async() => {
316
- expect.assertions(2);
317
- page.passwordEdit.fillInput(page.passwordEdit.password, 'a'.repeat(4097));
320
+ it("As a user I should see a feedback when the password, descriptions, name, username or uri fields content is truncated by a field limit", async() => {
321
+ expect.assertions(5);
322
+ await page.passwordEdit.fillInputPassword('a'.repeat(4097));
318
323
  page.passwordEdit.fillInput(page.passwordEdit.description, 'a'.repeat(10000));
324
+ page.passwordEdit.fillInput(page.passwordEdit.name, 'a'.repeat(256));
325
+ page.passwordEdit.fillInput(page.passwordEdit.username, 'a'.repeat(255));
326
+ page.passwordEdit.fillInput(page.passwordEdit.uri, 'a'.repeat(1025));
327
+
319
328
  await page.passwordEdit.keyUpInput(page.passwordEdit.password);
320
329
  await page.passwordEdit.keyUpInput(page.passwordEdit.description);
330
+ await page.passwordEdit.keyUpInput(page.passwordEdit.username);
331
+ await page.passwordEdit.keyUpInput(page.passwordEdit.name);
332
+ await page.passwordEdit.keyUpInput(page.passwordEdit.uri);
333
+
321
334
  expect(page.passwordEdit.passwordWarningMessage.textContent).toEqual(truncatedWarningMessage);
322
335
  expect(page.passwordEdit.descriptionWarningMessage.textContent).toEqual(truncatedWarningMessage);
336
+ expect(page.passwordEdit.nameWarningMessage.textContent).toEqual(truncatedWarningMessage);
337
+ expect(page.passwordEdit.uriWarningMessage.textContent).toEqual(truncatedWarningMessage);
338
+ expect(page.passwordEdit.usernameWarningMessage.textContent).toEqual(truncatedWarningMessage);
339
+ });
340
+
341
+ it("As a signed-in user editing a password on the application, I should get warn when I enter a pwned password and not be blocked", async() => {
342
+ expect.assertions(2);
343
+
344
+ mockContextRequest(() => Promise.resolve(2));
345
+ await page.passwordEdit.fillInputPassword('hello-world');
346
+ await waitFor(() => {});
347
+ // we expect a warning to inform about powned password
348
+ expect(page.passwordEdit.pwnedWarningMessage.textContent).toEqual("The password is part of an exposed data breach.");
349
+
350
+ mockContextRequest(() => Promise.reject());
351
+ await page.passwordEdit.fillInputPassword('another test');
352
+ await waitFor(() => {});
353
+ // we expect a warning to inform about a network issue
354
+ expect(page.passwordEdit.pwnedWarningMessage.textContent).toEqual("The pwnedpasswords service is unavailable, your password might be part of an exposed data breach");
323
355
  });
324
356
  });
325
357
  });
@@ -126,6 +126,13 @@ class PasswordEditPageObject {
126
126
  return this._container.querySelector('.dialog-close');
127
127
  }
128
128
 
129
+ /**
130
+ * Returns the pwned warning message
131
+ */
132
+ get pwnedWarningMessage() {
133
+ return this._container.querySelector('.pwned-password.warning-message');
134
+ }
135
+
129
136
  /**
130
137
  * Returns the name input element
131
138
  */
@@ -140,6 +147,13 @@ class PasswordEditPageObject {
140
147
  return this._container.querySelector('.name.error-message');
141
148
  }
142
149
 
150
+ /**
151
+ * Returns the name warning mesage input element
152
+ */
153
+ get nameWarningMessage() {
154
+ return this._container.querySelector('.name.warning-message');
155
+ }
156
+
143
157
  /**
144
158
  * Returns the uri input element
145
159
  */
@@ -147,6 +161,13 @@ class PasswordEditPageObject {
147
161
  return this._container.querySelector('#edit-password-form-uri');
148
162
  }
149
163
 
164
+ /**
165
+ * Returns the uri warning mesage input element
166
+ */
167
+ get uriWarningMessage() {
168
+ return this._container.querySelector('.uri.warning-message');
169
+ }
170
+
150
171
  /**
151
172
  * Returns the username / email input element
152
173
  */
@@ -161,6 +182,13 @@ class PasswordEditPageObject {
161
182
  return this._container.querySelector('#edit-password-form-password');
162
183
  }
163
184
 
185
+ /**
186
+ * Returns the username warning mesage input element
187
+ */
188
+ get usernameWarningMessage() {
189
+ return this._container.querySelector('.username.warning-message');
190
+ }
191
+
164
192
  /**
165
193
  * Returns the password error mesage input element
166
194
  */
@@ -255,8 +283,6 @@ class PasswordEditPageObject {
255
283
  return this._container.querySelector('.error-dialog .dialog .dialog-content .form-content');
256
284
  }
257
285
 
258
-
259
-
260
286
  /**
261
287
  * Returns true if the page object exists in the container
262
288
  */
@@ -290,6 +316,13 @@ class PasswordEditPageObject {
290
316
  fireEvent.change(element, dataInputEvent);
291
317
  }
292
318
 
319
+ /** fill the input password with data */
320
+ async fillInputPassword(data) {
321
+ const dataInputEvent = {target: {value: data}};
322
+ fireEvent.change(this.password, dataInputEvent);
323
+ jest.runAllTimers();
324
+ }
325
+
293
326
  /** focus the input element with data */
294
327
  focusInput(element) {
295
328
  fireEvent.focus(element);
@@ -24,6 +24,7 @@ import {withAppContext} from "../../../contexts/AppContext";
24
24
  import DisplayResourceDetailsActivity from "./DisplayResourceDetailsActivity";
25
25
  import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
26
26
  import {withTranslation, Trans} from "react-i18next";
27
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
27
28
 
28
29
  class DisplayResourceDetails extends React.Component {
29
30
  /**
@@ -72,7 +73,7 @@ class DisplayResourceDetails extends React.Component {
72
73
  async handlePermalinkClick() {
73
74
  const baseUrl = this.props.context.userSettings.getTrustedDomain();
74
75
  const permalink = `${baseUrl}/app/passwords/view/${this.props.resourceWorkspaceContext.details.resource.id}`;
75
- await navigator.clipboard.writeText(permalink);
76
+ await ClipBoard.copy(permalink, this.props.context.port);
76
77
  this.props.actionFeedbackContext.displaySuccess(this.translate("The permalink has been copied to clipboard"));
77
78
  }
78
79
 
@@ -25,6 +25,7 @@ import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
25
25
  import sanitizeUrl, {urlProtocols} from "../../../lib/Sanitize/sanitizeUrl";
26
26
  import {Trans, withTranslation} from "react-i18next";
27
27
  import {DateTime} from "luxon";
28
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
28
29
 
29
30
  class DisplayResourceDetailsInformation extends React.Component {
30
31
  /**
@@ -125,7 +126,7 @@ class DisplayResourceDetailsInformation extends React.Component {
125
126
  * Handle when the user select the username of the resource
126
127
  */
127
128
  async handleUsernameClickEvent() {
128
- await navigator.clipboard.writeText(this.resource.username);
129
+ await ClipBoard.copy(this.resource.username, this.props.context.port);
129
130
  this.displaySuccessNotification(this.translate("The username has been copied to clipboard"));
130
131
  }
131
132
 
@@ -211,7 +212,7 @@ class DisplayResourceDetailsInformation extends React.Component {
211
212
  return;
212
213
  }
213
214
  }
214
- await navigator.clipboard.writeText(password);
215
+ await ClipBoard.copy(password, this.props.context.port);
215
216
  await this.props.resourceWorkspaceContext.onResourceCopied();
216
217
  await this.props.actionFeedbackContext.displaySuccess(this.translate("The secret has been copied to clipboard"));
217
218
  }
@@ -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 {RESOURCE_NAME_MAX_LENGTH} from '../../../../shared/constants/inputs.const';
24
27
 
25
28
  class CreateResourceFolder extends Component {
26
29
  /**
@@ -58,7 +61,8 @@ class CreateResourceFolder extends Component {
58
61
 
59
62
  // Fields and errors
60
63
  name: this.translate("loading..."),
61
- nameError: false
64
+ nameError: false,
65
+ nameWarning: "",
62
66
  };
63
67
  }
64
68
 
@@ -78,6 +82,7 @@ class CreateResourceFolder extends Component {
78
82
  this.handleClose = this.handleClose.bind(this);
79
83
  this.handleInputChange = this.handleInputChange.bind(this);
80
84
  this.handleFormSubmit = this.handleFormSubmit.bind(this);
85
+ this.handleNameInputKeyUp = this.handleNameInputKeyUp.bind(this);
81
86
  }
82
87
 
83
88
  /**
@@ -254,6 +259,14 @@ class CreateResourceFolder extends Component {
254
259
  });
255
260
  }
256
261
 
262
+ /**
263
+ * Handle name input keyUp event.
264
+ */
265
+ handleNameInputKeyUp() {
266
+ const nameWarning = maxSizeValidation(this.state.name, RESOURCE_NAME_MAX_LENGTH, this.translate);
267
+ this.setState({nameWarning});
268
+ }
269
+
257
270
  /**
258
271
  * Return true if the form has some validation error
259
272
  * @returns {boolean}
@@ -289,18 +302,26 @@ class CreateResourceFolder extends Component {
289
302
  <form className="folder-create-form" onSubmit={this.handleFormSubmit} noValidate>
290
303
  <div className="form-content">
291
304
  <div className={`input text required ${this.state.nameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
292
- <label htmlFor="folder-name-input"><Trans>Name</Trans></label>
305
+ <label htmlFor="folder-name-input"><Trans>Name</Trans>{this.state.nameWarning &&
306
+ <Icon name="exclamation"/>
307
+ }</label>
293
308
  <input id="folder-name-input" name="name"
294
309
  ref={this.nameRef}
295
310
  type="text" value={this.state.name} placeholder={this.translate("Untitled folder")}
296
311
  maxLength="256" required="required"
297
312
  disabled={this.hasAllInputDisabled()}
298
313
  onChange={this.handleInputChange}
314
+ onKeyUp={this.handleNameInputKeyUp}
299
315
  autoComplete='off' autoFocus={true}
300
316
  />
301
317
  {this.state.nameError &&
302
318
  <div className="error-message">{this.state.nameError}</div>
303
319
  }
320
+ {this.state.nameWarning && (
321
+ <div className="name warning-message">
322
+ <strong><Trans>Warning:</Trans></strong> {this.state.nameWarning}
323
+ </div>
324
+ )}
304
325
  </div>
305
326
  </div>
306
327
  <div className="submit-wrapper clearfix">
@@ -22,6 +22,7 @@ import NotifyError from "../../Common/Error/NotifyError/NotifyError";
22
22
  beforeEach(() => {
23
23
  jest.resetModules();
24
24
  });
25
+ const truncatedWarningMessage = "Warning: this is the maximum size for this field, make sure your data was not truncated.";
25
26
 
26
27
  describe("Create Folder", () => {
27
28
  let page; // The page to test against
@@ -157,5 +158,12 @@ describe("Create Folder", () => {
157
158
  };
158
159
  await page.create({name: 'My super folder'}, inProgressFn);
159
160
  });
161
+
162
+ it("As a user I should see a feedback when name field content is truncated by a field limit", async() => {
163
+ expect.assertions(1);
164
+ page.fillInput(page.inputName, 'a'.repeat(256));
165
+ await page.keyUpInput(page.inputName);
166
+ expect(page.nameWarningMessage.textContent).toEqual(truncatedWarningMessage);
167
+ });
160
168
  });
161
169
  });
@@ -38,12 +38,18 @@ export default class CreateResourceFolderPage {
38
38
  );
39
39
  }
40
40
 
41
+ /**
42
+ * Set a name to the folder name input
43
+ */
44
+ get inputName() {
45
+ return this._page.container.querySelector('#folder-name-input');
46
+ }
47
+
41
48
  /**
42
49
  * Set a name to the folder name input
43
50
  */
44
51
  set name(value) {
45
- const input = this._page.container.querySelector('#folder-name-input');
46
- fireEvent.change(input, {target: {value}});
52
+ fireEvent.change(this.inputName, {target: {value}});
47
53
  }
48
54
 
49
55
  /**
@@ -102,6 +108,13 @@ export default class CreateResourceFolderPage {
102
108
  return this._page.container.querySelector(".dialog-close");
103
109
  }
104
110
 
111
+ /**
112
+ * Returns the name warning mesage input element
113
+ */
114
+ get nameWarningMessage() {
115
+ return this._page.container.querySelector('.name.warning-message');
116
+ }
117
+
105
118
  /**
106
119
  * Create a folder with the given information
107
120
  * @param folder The folder information to create
@@ -114,6 +127,17 @@ export default class CreateResourceFolderPage {
114
127
  await waitFor(inProgressFn);
115
128
  }
116
129
 
130
+ /** fill the input element with data */
131
+ fillInput(element, data) {
132
+ const dataInputEvent = {target: {value: data}};
133
+ fireEvent.change(element, dataInputEvent);
134
+ }
135
+
136
+ /** on keypup element */
137
+ keyUpInput(component) {
138
+ fireEvent.keyUp(component, {keyCode: 38});
139
+ }
140
+
117
141
  /**
118
142
  * Cancels the create operation
119
143
  */
@@ -22,6 +22,9 @@ import FormCancelButton from "../../Common/Inputs/FormSubmitButton/FormCancelBut
22
22
  import {withDialog} from "../../../contexts/DialogContext";
23
23
  import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
24
24
  import {Trans, withTranslation} from "react-i18next";
25
+ import Icon from "../../../../shared/components/Icons/Icon";
26
+ import {maxSizeValidation} from '../../../lib/Error/InputValidator';
27
+ import {RESOURCE_FOLDER_NAME_MAX_LENGTH} from '../../../../shared/constants/inputs.const';
25
28
 
26
29
  class RenameResourceFolder extends Component {
27
30
  /**
@@ -61,6 +64,7 @@ class RenameResourceFolder extends Component {
61
64
  // Fields and errors
62
65
  name: this.translate("loading..."),
63
66
  nameError: false,
67
+ nameWarning: "",
64
68
  };
65
69
  }
66
70
 
@@ -108,6 +112,7 @@ class RenameResourceFolder extends Component {
108
112
  this.handleClose = this.handleClose.bind(this);
109
113
  this.handleFormSubmit = this.handleFormSubmit.bind(this);
110
114
  this.handleInputChange = this.handleInputChange.bind(this);
115
+ this.handleNameInputKeyUp = this.handleNameInputKeyUp.bind(this);
111
116
  }
112
117
 
113
118
  /**
@@ -284,6 +289,14 @@ class RenameResourceFolder extends Component {
284
289
  });
285
290
  }
286
291
 
292
+ /**
293
+ * Handle name input keyUp event.
294
+ */
295
+ handleNameInputKeyUp() {
296
+ const nameWarning = maxSizeValidation(this.state.name, RESOURCE_FOLDER_NAME_MAX_LENGTH, this.translate);
297
+ this.setState({nameWarning});
298
+ }
299
+
287
300
  /**
288
301
  * Return true if the form has some validation error
289
302
  * @returns {boolean}
@@ -319,18 +332,26 @@ class RenameResourceFolder extends Component {
319
332
  <form className="folder-rename-form" onSubmit={this.handleFormSubmit} noValidate>
320
333
  <div className="form-content">
321
334
  <div className={`input text required ${this.state.nameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
322
- <label htmlFor="folder-name-input"><Trans>Folder name</Trans></label>
335
+ <label htmlFor="folder-name-input"><Trans>Folder name</Trans>{this.state.nameWarning &&
336
+ <Icon name="exclamation"/>
337
+ }</label>
323
338
  <input id="folder-name-input" name="name"
324
339
  ref={this.nameRef}
325
340
  type="text" value={this.state.name} placeholder={this.translate("Untitled folder")}
326
341
  maxLength="256" required="required"
327
342
  onChange={this.handleInputChange}
343
+ onKeyUp={this.handleNameInputKeyUp}
328
344
  disabled={this.hasAllInputDisabled()}
329
345
  autoComplete="off" autoFocus={true}
330
346
  />
331
347
  {this.state.nameError &&
332
348
  <div className="name error-message">{this.state.nameError}</div>
333
349
  }
350
+ {this.state.nameWarning && (
351
+ <div className="name warning-message">
352
+ <strong><Trans>Warning:</Trans></strong> {this.state.nameWarning}
353
+ </div>
354
+ )}
334
355
  </div>
335
356
  </div>
336
357
  <div className="submit-wrapper clearfix">
@@ -22,6 +22,7 @@ import RenameResourceFolderPage from "./RenameResourceFolder.test.page";
22
22
  beforeEach(() => {
23
23
  jest.resetModules();
24
24
  });
25
+ const truncatedWarningMessage = "Warning: this is the maximum size for this field, make sure your data was not truncated.";
25
26
 
26
27
  describe("Rename Folder", () => {
27
28
  let page; // The page to test against
@@ -157,5 +158,12 @@ describe("Rename Folder", () => {
157
158
  };
158
159
  await page.rename({name: 'My super folder'}, inProgressFn);
159
160
  });
161
+
162
+ it("As a user I should see a feedback when name field content is truncated by a field limit", async() => {
163
+ expect.assertions(1);
164
+ page.fillInput(page.inputName, 'a'.repeat(256));
165
+ await page.keyUpInput(page.inputName);
166
+ expect(page.nameWarningMessage.textContent).toEqual(truncatedWarningMessage);
167
+ });
160
168
  });
161
169
  });
@@ -38,13 +38,18 @@ export default class RenameResourceFolderPage {
38
38
  );
39
39
  }
40
40
 
41
+ /**
42
+ * Set a name to the folder name input
43
+ */
44
+ get inputName() {
45
+ return this._page.container.querySelector('#folder-name-input');
46
+ }
41
47
 
42
48
  /**
43
49
  * Set a name to the folder name input
44
50
  */
45
51
  set name(value) {
46
- const input = this._page.container.querySelector('#folder-name-input');
47
- fireEvent.change(input, {target: {value}});
52
+ fireEvent.change(this.inputName, {target: {value}});
48
53
  }
49
54
 
50
55
  /**
@@ -103,6 +108,13 @@ export default class RenameResourceFolderPage {
103
108
  return this._page.container.querySelector(".dialog-close");
104
109
  }
105
110
 
111
+ /**
112
+ * Returns the name warning mesage input element
113
+ */
114
+ get nameWarningMessage() {
115
+ return this._page.container.querySelector('.name.warning-message');
116
+ }
117
+
106
118
  /**
107
119
  * Rename a folder with the given information
108
120
  * @param folder The folder information to rename
@@ -115,6 +127,17 @@ export default class RenameResourceFolderPage {
115
127
  await waitFor(inProgressFn);
116
128
  }
117
129
 
130
+ /** fill the input element with data */
131
+ fillInput(element, data) {
132
+ const dataInputEvent = {target: {value: data}};
133
+ fireEvent.change(element, dataInputEvent);
134
+ }
135
+
136
+ /** on keypup element */
137
+ keyUpInput(component) {
138
+ fireEvent.keyUp(component, {keyCode: 38});
139
+ }
140
+
118
141
  /**
119
142
  * Cancels the create operation
120
143
  */
@@ -21,6 +21,7 @@ import {withAppContext} from "../../../contexts/AppContext";
21
21
  import {withResourceWorkspace} from "../../../contexts/ResourceWorkspaceContext";
22
22
  import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
23
23
  import {Trans, withTranslation} from "react-i18next";
24
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
24
25
 
25
26
  class DisplayResourceFolderDetails extends React.Component {
26
27
  /**
@@ -53,7 +54,7 @@ class DisplayResourceFolderDetails extends React.Component {
53
54
  async handlePermalinkClick() {
54
55
  const baseUrl = this.props.context.userSettings.getTrustedDomain();
55
56
  const permalink = `${baseUrl}/app/folders/view/${this.props.resourceWorkspaceContext.details.folder.id}`;
56
- await navigator.clipboard.writeText(permalink);
57
+ await ClipBoard.copy(permalink, this.props.context.port);
57
58
  this.props.actionFeedbackContext.displaySuccess(this.translate("The permalink has been copied to clipboard"));
58
59
  }
59
60
 
@@ -28,6 +28,7 @@ import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
28
28
  import {withResourcePasswordGeneratorContext} from "../../../contexts/ResourcePasswordGeneratorContext";
29
29
  import Password from "../../../../shared/components/Password/Password";
30
30
  import PasswordComplexity from "../../../../shared/components/PasswordComplexity/PasswordComplexity";
31
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
31
32
 
32
33
  /**
33
34
  * This component generate password or passphrase following configuration
@@ -142,7 +143,7 @@ class GenerateResourcePassword extends Component {
142
143
  * Whenever one wants to copy the password
143
144
  */
144
145
  async handleCopyPassword() {
145
- await navigator.clipboard.writeText(this.state.password);
146
+ await ClipBoard.copy(this.state.password, this.props.context.port);
146
147
  this.props.actionFeedbackContext.displaySuccess(this.translate("The password has been copied to clipboard"));
147
148
  }
148
149
 
@@ -24,6 +24,9 @@ import {withLoading} from "../../../contexts/LoadingContext";
24
24
  import {ResourceWorkspaceFilterTypes, withResourceWorkspace} from "../../../contexts/ResourceWorkspaceContext";
25
25
  import {withRouter} from "react-router-dom";
26
26
  import {Trans, withTranslation} from "react-i18next";
27
+ import Icon from "../../../../shared/components/Icons/Icon";
28
+ import {maxSizeValidation} from '../../../lib/Error/InputValidator';
29
+ import {RESOURCE_TAG_MAX_LENGTH} from "../../../../shared/constants/inputs.const";
27
30
 
28
31
  /**
29
32
  * Component allows the user to edit a tag from a dialog
@@ -40,6 +43,7 @@ class EditResourceTag extends Component {
40
43
  return {
41
44
  name: '',
42
45
  nameError: "",
46
+ nameWarning: "",
43
47
  processing: false
44
48
  };
45
49
  }
@@ -97,6 +101,8 @@ class EditResourceTag extends Component {
97
101
  handleNameInputKeyUp() {
98
102
  const state = this.validateNameInput();
99
103
  this.setState(state);
104
+ const nameWarning = maxSizeValidation(this.state.name, RESOURCE_TAG_MAX_LENGTH, this.translate);
105
+ this.setState({nameWarning});
100
106
  }
101
107
 
102
108
  /**
@@ -265,7 +271,9 @@ class EditResourceTag extends Component {
265
271
  <form onSubmit={this.handleFormSubmit} noValidate>
266
272
  <div className="form-content">
267
273
  <div className={`input text required ${this.state.nameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
268
- <label htmlFor="edit-tag-form-name"><Trans>Tag name</Trans></label>
274
+ <label htmlFor="edit-tag-form-name"><Trans>Tag name</Trans>{this.state.nameWarning &&
275
+ <Icon name="exclamation"/>
276
+ }</label>
269
277
  <input id="edit-tag-form-name" name="name" type="text" value={this.state.name}
270
278
  onKeyUp={this.handleNameInputKeyUp} onChange={this.handleInputChange}
271
279
  disabled={this.state.processing} ref={this.nameInputRef} className="required fluid"
@@ -274,6 +282,11 @@ class EditResourceTag extends Component {
274
282
  {this.state.nameError &&
275
283
  <div className="name error-message">{this.state.nameError}</div>
276
284
  }
285
+ {this.state.nameWarning && (
286
+ <div className="name warning-message">
287
+ <strong><Trans>Warning:</Trans></strong> {this.state.nameWarning}
288
+ </div>
289
+ )}
277
290
  </div>
278
291
  </div>
279
292
  <div className="submit-wrapper clearfix">
@@ -24,6 +24,7 @@ import {defaultAppContext, defaultProps} from "./EditResourceTag.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 Edit Tag Dialog", () => {
29
30
  let page; // The page to test against
@@ -148,5 +149,12 @@ describe("See the Edit Tag Dialog", () => {
148
149
  expect(page.tagEdit.errorDialog).not.toBeNull();
149
150
  expect(page.tagEdit.errorDialogMessage).not.toBeNull();
150
151
  });
152
+
153
+ it("As a user I should see a feedback when name field content is truncated by a field limit", async() => {
154
+ expect.assertions(1);
155
+ page.tagEdit.fillInput(page.tagEdit.tagName, 'a'.repeat(255));
156
+ await page.tagEdit.keyUpInput(page.tagEdit.tagName);
157
+ expect(page.tagEdit.nameWarningMessage.textContent).toEqual(truncatedWarningMessage);
158
+ });
151
159
  });
152
160
  });
@@ -154,6 +154,13 @@ class TagEditPageObject {
154
154
  return this._container.querySelector('.error-dialog .dialog .dialog-content .form-content');
155
155
  }
156
156
 
157
+ /**
158
+ * Returns the name warning mesage input element
159
+ */
160
+ get nameWarningMessage() {
161
+ return this._container.querySelector('.name.warning-message');
162
+ }
163
+
157
164
  /**
158
165
  * Returns true if the page object exists in the container
159
166
  */
@@ -186,4 +193,9 @@ class TagEditPageObject {
186
193
  const dataInputEvent = {target: {value: data}};
187
194
  fireEvent.change(element, dataInputEvent);
188
195
  }
196
+
197
+ /** on keypup element */
198
+ keyUpInput(component) {
199
+ fireEvent.keyUp(component, {keyCode: 38});
200
+ }
189
201
  }