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.
- package/build/css/help.min.css +3 -3
- package/build/css/public.min.css +3 -3
- package/build/css/themes/default/api_authentication.min.css +3 -3
- package/build/css/themes/default/api_cloud.min.css +3 -3
- package/build/css/themes/default/api_main.min.css +3 -3
- package/build/css/themes/default/api_reports.min.css +3 -3
- package/build/css/themes/default/api_webinstaller.min.css +3 -3
- package/build/css/themes/default/ext_app.min.css +3 -3
- package/build/css/themes/default/ext_authentication.min.css +3 -3
- package/build/css/themes/default/ext_external.min.css +2 -2
- package/build/css/themes/default/ext_in_form_cta.min.css +3 -3
- package/build/css/themes/default/ext_in_form_menu.min.css +3 -3
- package/build/css/themes/default/ext_quickaccess.min.css +3 -3
- package/build/css/themes/midgar/api_authentication.min.css +3 -3
- package/build/css/themes/midgar/api_main.min.css +3 -3
- package/build/css/themes/midgar/api_reports.min.css +3 -3
- package/build/css/themes/midgar/ext_app.min.css +3 -3
- package/build/css/themes/midgar/ext_authentication.min.css +3 -3
- package/build/css/themes/midgar/ext_in_form_cta.min.css +3 -3
- package/build/css/themes/midgar/ext_in_form_menu.min.css +3 -3
- package/build/css/themes/midgar/ext_quickaccess.min.css +3 -3
- package/build/css/themes/solarized_dark/api_authentication.min.css +1 -1
- package/build/css/themes/solarized_dark/api_main.min.css +1 -1
- package/build/css/themes/solarized_dark/api_reports.min.css +1 -1
- package/build/css/themes/solarized_dark/ext_app.min.css +1 -1
- package/build/css/themes/solarized_dark/ext_authentication.min.css +1 -1
- package/build/css/themes/solarized_dark/ext_in_form_cta.min.css +1 -1
- package/build/css/themes/solarized_dark/ext_in_form_menu.min.css +1 -1
- package/build/css/themes/solarized_dark/ext_quickaccess.min.css +1 -1
- package/build/css/themes/solarized_light/api_authentication.min.css +1 -1
- package/build/css/themes/solarized_light/api_main.min.css +1 -1
- package/build/css/themes/solarized_light/api_reports.min.css +1 -1
- package/build/css/themes/solarized_light/ext_app.min.css +1 -1
- package/build/css/themes/solarized_light/ext_authentication.min.css +1 -1
- package/build/css/themes/solarized_light/ext_in_form_cta.min.css +1 -1
- package/build/css/themes/solarized_light/ext_in_form_menu.min.css +1 -1
- package/build/css/themes/solarized_light/ext_quickaccess.min.css +1 -1
- package/build/js/dist/api-account-recovery.js +1 -1
- package/build/js/dist/api-app.js +1 -1
- package/build/js/dist/api-app.js.LICENSE.txt +75 -5
- package/build/js/dist/api-feedback.js +2 -0
- package/build/js/dist/api-feedback.js.LICENSE.txt +45 -0
- package/build/js/dist/api-recover.js +1 -1
- package/build/js/dist/api-setup.js +1 -1
- package/build/js/dist/api-triage.js +1 -1
- package/build/js/dist/api-vendors.js +1 -1
- package/build/js/dist/api-vendors.js.LICENSE.txt +19 -9
- package/build/js/dist/src/locales/de-DE/common.json +995 -0
- package/build/js/dist/src/locales/en-UK/common.json +1061 -0
- package/build/js/dist/src/locales/es-ES/common.json +995 -0
- package/build/js/dist/src/locales/fr-FR/common.json +995 -0
- package/build/js/dist/src/locales/ja-JP/common.json +980 -0
- package/build/js/dist/src/locales/lt-LT/common.json +1025 -0
- package/build/js/dist/src/locales/nl-NL/common.json +995 -0
- package/build/js/dist/src/locales/pl-PL/common.json +1025 -0
- package/build/js/dist/src/locales/sv-SE/common.json +995 -0
- package/package.json +18 -1
- package/src/img/controls/attention.svg +1 -0
- package/src/locales/en-UK/common.json +80 -16
- package/src/react-extension/ApiApp.js +17 -5
- package/src/react-extension/ApiFeedback.entry.js +24 -0
- package/src/react-extension/ExtApp.js +12 -5
- package/src/react-extension/ExtAuthenticationLogin.js +17 -15
- package/src/react-extension/ExtAuthenticationLogin.test.stories.js +59 -0
- package/src/react-extension/ExtBootstrapApp.js +1 -0
- package/src/react-extension/components/Administration/AdministrationWorkspace.js +24 -0
- package/src/react-extension/components/Administration/AdministrationWorkspace.test.data.js +3 -3
- package/src/react-extension/components/Administration/AdministrationWorkspace.test.js +13 -1
- package/src/react-extension/components/Administration/AdministrationWorkspace.test.page.js +7 -0
- package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.js +101 -0
- package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.test.data.js +23 -0
- package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.test.stories.js +27 -0
- package/src/react-extension/components/Administration/ConfirmSaveAccountRecoverySettings/ConfirmSaveAccountRecoverySettings.js +1 -1
- package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.js +78 -2
- package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.data.js +3 -1
- package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.js +60 -0
- package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.page.js +23 -4
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationInternationalisationActions/DisplayAdministrationInternationalisationActions.js +125 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationMfaActions/DisplayAdministrationMfaActions.js +131 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSelfRegistrationActions/DisplayAdministrationSelfRegistrationActions.js +103 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSsoActions/DisplayAdministrationSsoActions.js +91 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSubscriptionActions/DisplayAdministrationSubscriptionActions.js +85 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationUserDirectoryActions/DisplayAdministrationUserDirectoryActions.js +228 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.js +4 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.test.js +9 -0
- package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.js +3 -3
- package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.data.js +14 -0
- package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.page.js +0 -17
- package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.js +18 -115
- package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.data.js +11 -13
- package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.js +38 -43
- package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.page.js +47 -10
- package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.stories.js +10 -43
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.js +82 -367
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.data.js +128 -42
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.js +75 -121
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.page.js +46 -16
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.stories.js +18 -14
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.js +103 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.js +53 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.page.js +81 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.stories.js +34 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.js +125 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.data.js +63 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.js +54 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.page.js +88 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.stories.js +35 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.js +381 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.data.js +69 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.js +332 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.page.js +247 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.stories.js +72 -0
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.js +19 -19
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.data.js +1717 -1729
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.js +11 -3
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.page.js +4 -1
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.stories.js +11 -1784
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.js +41 -140
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.data.js +15 -3
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.js +22 -49
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.page.js +19 -11
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.stories.js +9 -3
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.js +5 -6
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.data.js +1717 -1728
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.js +11 -3
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.page.js +4 -1
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.stories.js +11 -1784
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.js +362 -835
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.data.js +427 -418
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.js +134 -175
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.page.js +108 -11
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.stories.js +17 -25
- package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.js +4 -2
- package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.js +3 -3
- package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.test.js +1 -1
- package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.js +32 -7
- package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.data.js +0 -3
- package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.js +145 -1
- package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.page.js +52 -1
- package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.stories.js +15 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.js +340 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.data.js +56 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.js +223 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.page.js +235 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.stories.js +55 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/SsoProviders.data.js +34 -0
- package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.js +12 -3
- package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.test.js +27 -0
- package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/SelectAccountRecoveryOrganizationKey.test.page.js +8 -0
- package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.js +197 -0
- package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.data.js +37 -0
- package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.js +187 -0
- package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.page.js +120 -0
- package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.stories.js +31 -0
- package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.js +9 -5
- package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.data.js +4 -0
- package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.js +11 -42
- package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.page.js +1 -0
- package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.js +9 -5
- package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.data.js +4 -0
- package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.js +16 -2
- package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.page.js +17 -1
- package/src/react-extension/components/AuthenticationLogin/Login/Login.js +159 -61
- package/src/react-extension/components/AuthenticationLogin/Login/Login.test.data.js +14 -11
- package/src/react-extension/components/AuthenticationLogin/Login/Login.test.js +79 -0
- package/src/react-extension/components/AuthenticationLogin/Login/Login.test.page.js +16 -0
- package/src/react-extension/components/AuthenticationLogin/OrchestrateLogin/OrchestrateLoginBoxMain.js +2 -0
- package/src/react-extension/components/AuthenticationSetup/SetupAuthentication/SetupAuthentication.js +4 -0
- package/src/react-extension/components/Common/Error/ApiError/ApiError.js +119 -0
- package/src/react-extension/components/Common/Error/ApiError/ApiError.test.js +43 -0
- package/src/react-extension/components/Common/Error/ApiError/ApiError.test.page.js +108 -0
- package/src/react-extension/components/Common/Error/ApiError/ApiError.test.stories.js +39 -0
- package/src/react-extension/components/Common/Inputs/Autocomplete/Autocomplete.test.js +12 -0
- package/src/react-extension/components/Common/Inputs/Autocomplete/AutocompleteItem.js +2 -2
- package/src/react-extension/components/Common/Legacy/HandleLegacyAppjs.js +1 -1
- package/src/react-extension/components/Common/Navigation/Header/Logo.js +13 -1
- package/src/react-extension/components/Resource/CreateResource/CreateResource.js +103 -30
- package/src/react-extension/components/Resource/CreateResource/CreateResource.test.js +44 -10
- package/src/react-extension/components/Resource/CreateResource/CreateResource.test.page.js +35 -7
- package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.js +3 -3
- package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesListContextualMenu.js +6 -5
- package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.js +5 -4
- package/src/react-extension/components/Resource/EditResource/EditResource.js +95 -23
- package/src/react-extension/components/Resource/EditResource/EditResource.test.js +45 -13
- package/src/react-extension/components/Resource/EditResource/EditResource.test.page.js +35 -2
- package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetails.js +2 -1
- package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsInformation.js +3 -2
- package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.js +23 -2
- package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.js +8 -0
- package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.page.js +26 -2
- package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.js +22 -1
- package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.js +8 -0
- package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.page.js +25 -2
- package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetails.js +2 -1
- package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.js +2 -1
- package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.js +14 -1
- package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.js +8 -0
- package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.page.js +12 -0
- package/src/react-extension/components/User/CreateUser/CreateUser.js +42 -3
- package/src/react-extension/components/User/CreateUser/CreateUser.test.js +16 -0
- package/src/react-extension/components/User/CreateUser/CreateUser.test.page.js +26 -0
- package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.js +2 -1
- package/src/react-extension/components/User/DisplayUsersContextualMenu/DisplayUsersContextualMenu.js +5 -5
- package/src/react-extension/components/User/EditUser/EditUser.js +29 -2
- package/src/react-extension/components/User/EditUser/EditUser.test.js +12 -0
- package/src/react-extension/components/User/EditUser/EditUser.test.page.js +26 -0
- package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.js +2 -1
- package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.test.data.js +1332 -1331
- package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.js +2 -1
- package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.js +19 -1
- package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.js +9 -0
- package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.page.js +12 -0
- package/src/react-extension/components/UserGroup/DisplayUserGroupDetails/DisplayUserGroupDetails.js +2 -1
- package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.js +16 -1
- package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.js +8 -0
- package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.page.js +26 -1
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.js +1 -1
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.js +6 -4
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.data.js +4 -1
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.js +21 -11
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.page.js +10 -1
- package/src/react-extension/contexts/AdminSmtpSettingsContext.js +2 -0
- package/src/react-extension/contexts/AdminSmtpSettingsContext.test.data.js +13 -0
- package/src/react-extension/contexts/AdminSmtpSettingsContext.test.js +3 -1
- package/src/react-extension/contexts/AdminSsoContext.js +558 -0
- package/src/react-extension/contexts/AdminSsoContext.test.data.js +51 -0
- package/src/react-extension/contexts/Administration/AdministrationInternationalizationContext/AdministrationInternationalizationContext.js +194 -0
- package/src/react-extension/contexts/Administration/AdministrationInternationalizationContext/AdministrationInternationalizationContext.test.js +111 -0
- package/src/react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext.js +265 -0
- package/src/react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext.test.js +178 -0
- package/src/react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext.js +453 -0
- package/src/react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext.test.js +218 -0
- package/src/react-extension/contexts/Administration/AdministrationSubscription/AdministrationSubscription.js +168 -0
- package/src/react-extension/contexts/Administration/AdministrationSubscription/AdministrationSubscription.test.js +73 -0
- package/src/react-extension/contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext.js +353 -0
- package/src/react-extension/contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext.test.js +220 -0
- package/src/react-extension/contexts/AdministrationWorkspaceContext.js +17 -178
- package/src/react-extension/contexts/AdministrationWorkspaceContext.test.js +0 -26
- package/src/react-extension/contexts/ApiAppContext.test.data.js +4 -2
- package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.js +54 -4
- package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.test.data.js +10 -1
- package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.test.js +92 -14
- package/src/react-extension/contexts/Authentication/AuthenticationSetupContext.js +1 -0
- package/src/react-extension/contexts/NavigationContext.js +34 -0
- package/src/react-extension/contexts/SsoContext.js +151 -0
- package/src/react-extension/contexts/SsoContext.test.data.js +36 -0
- package/src/react-extension/contexts/SsoContext.test.js +104 -0
- package/src/react-extension/lib/Domain/DomainUtil.js +70 -0
- package/src/react-extension/lib/Domain/DomainUtil.test.js +129 -0
- package/src/react-extension/lib/Domain/Domains.js +6113 -0
- package/src/react-extension/lib/Error/InputValidator.js +24 -0
- package/src/react-extension/lib/Map/DynamicRef.js +49 -0
- package/src/react-extension/lib/Map/DynamicRef.test.js +56 -0
- package/src/react-extension/lib/Map/MapObject.js +48 -0
- package/src/react-extension/lib/Map/MapObject.test.js +43 -0
- package/src/react-quickaccess/ExtQuickAccess.js +7 -4
- package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.js +3 -1
- package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.data.js +4 -0
- package/src/react-quickaccess/components/LoginPage/LoginPage.js +115 -4
- package/src/react-quickaccess/components/LoginPage/LoginPage.test.data.js +10 -0
- package/src/react-quickaccess/components/LoginPage/LoginPage.test.stories.js +30 -3
- package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.js +33 -1
- package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.data.js +25 -0
- package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.js +60 -0
- package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.page.js +60 -0
- package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.js +33 -1
- package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.js +36 -7
- package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.js +3 -2
- package/src/react-quickaccess/contexts/SsoContext.js +150 -0
- package/src/react-web-integration/lib/InForm/InFormFieldSelector.js +5 -0
- package/src/shared/constants/inputs.const.js +30 -0
- package/src/shared/lib/Browser/clipBoard.js +45 -0
- package/src/shared/lib/Browser/clipBoard.test.js +59 -0
- package/src/shared/models/Mfa/Duo.js +36 -0
- package/src/shared/models/Mfa/Duo.test.js +59 -0
- package/src/shared/models/Mfa/MfaDTO.js +51 -0
- package/src/shared/models/Mfa/MfaDTO.test.js +48 -0
- package/src/shared/models/Mfa/MfaEnumeration.js +17 -0
- package/src/shared/models/Mfa/MfaModel.js +48 -0
- package/src/shared/models/Mfa/MfaModel.test.js +37 -0
- package/src/shared/models/Mfa/Yubikey.js +35 -0
- package/src/shared/models/Mfa/Yubikey.test.js +47 -0
- package/src/shared/models/selfRegistration/SelfRegistrationDomainsViewModel.js +55 -0
- package/src/shared/models/selfRegistration/SelfRegistrationDomainsViewModel.test.js +37 -0
- package/src/shared/models/selfRegistration/SelfRegistrationDto.js +42 -0
- package/src/shared/models/selfRegistration/SelfRegistrationDto.test.js +48 -0
- package/src/shared/models/selfRegistration/SelfRegistrationEnumeration.js +17 -0
- package/src/shared/models/subscription/SubscriptionDto.js +34 -0
- package/src/shared/models/subscription/SubscriptionDto.test.js +31 -0
- package/src/shared/models/subscription/SubscriptionModel.js +33 -0
- package/src/shared/models/subscription/SubscriptionModel.test.js +48 -0
- package/src/shared/models/user/UserModel.js +37 -0
- package/src/shared/models/userDirectory/UserDirectoryDTO.js +57 -0
- package/src/shared/models/userDirectory/UserDirectoryDTO.test.js +40 -0
- package/src/shared/models/userDirectory/UserDirectoryEnum.js +22 -0
- package/src/shared/models/userDirectory/UserDirectoryModel.js +64 -0
- package/src/shared/models/userDirectory/UserDirectoryModel.test.js +37 -0
- package/src/shared/services/actions/subscription/SubscriptionActionService.js +69 -0
- package/src/shared/services/actions/subscription/SubscriptionActionService.test.js +73 -0
- package/src/shared/services/api/Internationalisation/InternationalisationService.js +46 -0
- package/src/shared/services/api/Mfa/MfaService.js +54 -0
- package/src/shared/services/{accountRecovery → api/accountRecovery}/ApiAppAccountRecoveryUserService.js +2 -2
- package/src/shared/services/{accountRecovery → api/accountRecovery}/ExtAppAccountRecoveryUserService.js +0 -0
- package/src/shared/services/api/secrets/pownedService.js +64 -0
- package/src/shared/services/api/secrets/pownedService.test.js +63 -0
- package/src/shared/services/api/selfRegistration/selfRegistrationService.js +64 -0
- package/src/shared/services/api/user/UserService.js +45 -0
- package/src/shared/services/api/userDirectory/UserDirectoryService.js +108 -0
- package/src/shared/services/forms/Mfa/MfaFormService.js +195 -0
- package/src/shared/services/forms/Mfa/MfaFormService.test.js +341 -0
- package/src/shared/services/forms/selfRegistration/SelfRegistrationFormService.js +92 -0
- package/src/shared/services/forms/selfRegistration/SelfRegistrationFormService.test.js +101 -0
- package/src/shared/services/forms/userDirectory/UserDirectoryFormService.js +118 -0
- package/src/shared/services/forms/userDirectory/UserDirectoryFormService.test.js +128 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.js +0 -205
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.data.js +0 -37
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.js +0 -197
- 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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
316
|
-
expect.assertions(
|
|
317
|
-
page.passwordEdit.
|
|
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
|
|
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
|
|
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
|
|
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
|
}
|
package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
*/
|
package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
});
|
package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.page.js
CHANGED
|
@@ -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
|
}
|