passbolt-styleguide 3.3.3 → 3.4.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 (485) hide show
  1. package/build/css/help.min.css +4 -4
  2. package/build/css/public.min.css +5 -6
  3. package/build/css/themes/default/api_authentication.min.css +3 -3
  4. package/build/css/themes/default/api_cloud.min.css +3 -7
  5. package/build/css/themes/default/api_main.min.css +4 -9
  6. package/build/css/themes/default/api_reports.min.css +4 -9
  7. package/build/css/themes/default/api_webinstaller.min.css +4 -9
  8. package/build/css/themes/default/ext_app.min.css +4 -9
  9. package/build/css/themes/default/ext_authentication.min.css +3 -3
  10. package/build/css/themes/default/ext_external.min.css +3 -3
  11. package/build/css/themes/default/ext_in_form_cta.min.css +9 -0
  12. package/build/css/themes/default/ext_in_form_menu.min.css +9 -0
  13. package/build/css/themes/default/ext_quickaccess.min.css +3 -3
  14. package/build/css/themes/midgar/api_authentication.min.css +9 -0
  15. package/build/css/themes/midgar/api_main.min.css +4 -9
  16. package/build/css/themes/midgar/api_reports.min.css +4 -9
  17. package/build/css/themes/midgar/ext_app.min.css +4 -9
  18. package/build/css/themes/midgar/ext_authentication.min.css +3 -3
  19. package/build/css/themes/midgar/ext_in_form_cta.min.css +9 -0
  20. package/build/css/themes/midgar/ext_in_form_menu.min.css +9 -0
  21. package/build/css/themes/midgar/ext_quickaccess.min.css +3 -3
  22. package/build/js/dist/api-app.js +1 -1
  23. package/build/js/dist/api-app.js.LICENSE.txt +5 -5
  24. package/build/js/dist/api-recover.js +1 -1
  25. package/build/js/dist/api-recover.js.LICENSE.txt +0 -28
  26. package/build/js/dist/api-setup.js +1 -1
  27. package/build/js/dist/api-setup.js.LICENSE.txt +0 -15
  28. package/build/js/dist/api-triage.js +1 -1
  29. package/build/js/dist/api-triage.js.LICENSE.txt +0 -14
  30. package/build/js/dist/api-vendors.js +1 -1
  31. package/build/js/dist/api-vendors.js.LICENSE.txt +146 -84
  32. package/package.json +31 -26
  33. package/src/img/controls/chevron-down_blue.svg +3 -0
  34. package/src/img/diagrams/functional_overview.png +0 -0
  35. package/src/img/diagrams/functional_overview.svg +4 -0
  36. package/src/img/diagrams/howitworks.svg +2797 -0
  37. package/src/img/diagrams/mobile-transfer.svg +296 -0
  38. package/src/img/diagrams/sequence_diagram_form_authenticate.png +0 -0
  39. package/src/img/diagrams/sequence_diagram_gpg_authenticate.png +0 -0
  40. package/src/img/diagrams/totp.svg +251 -0
  41. package/src/img/illustrations/pin_passbolt.gif +0 -0
  42. package/src/img/illustrations/wave-pin_my_extension.svg +1 -0
  43. package/src/img/logo/icon-32-badge-1.png +0 -0
  44. package/src/img/logo/icon-32-badge-2.png +0 -0
  45. package/src/img/logo/icon-32-badge-3.png +0 -0
  46. package/src/img/logo/icon-32-badge-4.png +0 -0
  47. package/src/img/logo/icon-32-badge-5+.png +0 -0
  48. package/src/img/logo/icon-32-badge-5.png +0 -0
  49. package/src/img/logo/icon-32-signout.png +0 -0
  50. package/src/img/logo/icon-badge-1.svg +1 -0
  51. package/src/img/logo/icon-badge-2.svg +1 -0
  52. package/src/img/logo/icon-badge-3.svg +1 -0
  53. package/src/img/logo/icon-badge-4.svg +1 -0
  54. package/src/img/logo/icon-badge-5+.svg +1 -0
  55. package/src/img/logo/icon-badge-5.svg +1 -0
  56. package/src/img/logo/icon-inactive.svg +1 -0
  57. package/src/img/logo/icon-without-badge.svg +1 -0
  58. package/src/img/third_party/ChromeWebStore_black.svg +1 -0
  59. package/src/img/third_party/ChromeWebStore_white.svg +1 -0
  60. package/src/img/third_party/edge-addon-black.svg +1 -0
  61. package/src/img/third_party/edge-addon-white.svg +1 -0
  62. package/src/locales/de-DE/common.json +820 -0
  63. package/src/locales/en-UK/common.json +86 -20
  64. package/src/locales/fr/common.json +750 -0
  65. package/src/locales/fr-FR/common.json +92 -22
  66. package/src/locales/sv-SE/common.json +820 -0
  67. package/src/react-extension/ExtApp.js +16 -10
  68. package/src/react-extension/ExtBootstrapApp.js +1 -0
  69. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.js +2 -2
  70. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.js +2 -2
  71. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.js +1 -1
  72. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.test.js +1 -1
  73. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.js +22 -8
  74. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.data.js +3 -0
  75. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.js +10 -8
  76. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.js +21 -19
  77. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.page.js +6 -6
  78. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.stories.js +0 -1
  79. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.js +1 -1
  80. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.js +1 -1
  81. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.stories.js +5 -8
  82. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.js +20 -38
  83. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.data.js +4 -1
  84. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.js +4 -4
  85. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.js +1 -1
  86. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.js +1 -1
  87. package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.test.js +2 -3
  88. package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.test.stories.js +5 -9
  89. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.js +34 -32
  90. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.js +1 -1
  91. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.stories.js +0 -3
  92. package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.js +1 -1
  93. package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.test.page.js +2 -2
  94. package/src/react-extension/components/Authentication/AskForAuthenticationHelp/AskForAuthenticationHelp.js +1 -1
  95. package/src/react-extension/components/Authentication/AskForAuthenticationHelp/AskForAuthenticationHelp.test.stories.js +12 -15
  96. package/src/react-extension/components/Authentication/CheckMailBox/CheckMailBox.js +2 -2
  97. package/src/react-extension/components/Authentication/CheckMailBox/CheckMailBox.test.js +1 -1
  98. package/src/react-extension/components/Authentication/CheckMailBox/CheckMailbox.test.stories.js +12 -14
  99. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.js +2 -1
  100. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.stories.js +12 -15
  101. package/src/react-extension/components/Authentication/ChooseSecurityToken/ChooseSecurityToken.js +1 -2
  102. package/src/react-extension/components/Authentication/ChooseSecurityToken/ChooseSecurityToken.test.stories.js +12 -15
  103. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.js +9 -19
  104. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.stories.js +12 -15
  105. package/src/react-extension/components/Authentication/DisplayBrowserNotSupported/DisplayBrowserNotSupported.test.stories.js +12 -15
  106. package/src/react-extension/components/Authentication/DisplayExpiredTokenError/DisplayExpiredTokenError.test.stories.js +12 -15
  107. package/src/react-extension/components/Authentication/DisplayRequireInvitationError/DisplayRequireInvitationError.test.stories.js +12 -15
  108. package/src/react-extension/components/Authentication/DisplayUnexpectedError/DisplayUnexpectedError.test.stories.js +12 -15
  109. package/src/react-extension/components/Authentication/DownloadRecoveryKit/DownloadRecoveryKit.js +1 -1
  110. package/src/react-extension/components/Authentication/DownloadRecoveryKit/DownloadRecoveryKit.test.stories.js +12 -15
  111. package/src/react-extension/components/Authentication/EnterNameForm/EnterNameForm.test.stories.js +12 -15
  112. package/src/react-extension/components/Authentication/EnterUsernameForm/EnterUsernameForm.test.stories.js +12 -15
  113. package/src/react-extension/components/Authentication/HandleSessionExpired/HandleSessionExpired.test.data.js +14 -0
  114. package/src/react-extension/components/Authentication/HandleSessionExpired/HandleSessionExpired.test.js +65 -0
  115. package/src/react-extension/components/Authentication/HandleSessionExpired/HandleSessionExpired.test.page.js +38 -0
  116. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.test.stories.js +12 -15
  117. package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.js +15 -6
  118. package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.test.js +27 -0
  119. package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.test.stories.js +12 -15
  120. package/src/react-extension/components/Authentication/IntroduceSetupExtension/IntroduceSetupExtension.js +107 -0
  121. package/src/react-extension/components/Authentication/IntroduceSetupExtension/IntroduceSetupExtension.test.data.js +11 -0
  122. package/src/react-extension/components/Authentication/IntroduceSetupExtension/IntroduceSetupExtension.test.js +65 -0
  123. package/src/react-extension/components/Authentication/IntroduceSetupExtension/IntroduceSetupExtension.test.page.js +73 -0
  124. package/src/react-extension/components/Authentication/IntroduceSetupExtension/IntroduceSetupExtension.test.stories.js +34 -0
  125. package/src/react-extension/components/Authentication/NotifyExpiredSession/NotifyExpiredSession.test.stories.js +8 -11
  126. package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.js +1 -1
  127. package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.test.stories.js +12 -15
  128. package/src/react-extension/components/AuthenticationLogin/DisplayLoginError/DisplayLoginError.test.stories.js +12 -15
  129. package/src/react-extension/components/AuthenticationLogin/DisplayLoginInProgress/DisplayLoginProgress.test.stories.js +12 -15
  130. package/src/react-extension/components/AuthenticationLogin/Login/Login.js +3 -1
  131. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.stories.js +12 -15
  132. package/src/react-extension/components/AuthenticationPassphrase/InputPassphrase/InputPassphrase.js +2 -1
  133. package/src/react-extension/components/AuthenticationPassphrase/InputPassphrase/InputPassphrase.test.js +1 -1
  134. package/src/react-extension/components/AuthenticationPassphrase/InputPassphrase/InputPassphrase.test.stories.js +5 -11
  135. package/src/react-extension/components/AuthenticationRecover/RecoverAuthentication/RecoverAuthentication.js +5 -1
  136. package/src/react-extension/components/AuthenticationSetup/SetupAuthentication/SetupAuthentication.js +4 -0
  137. package/src/react-extension/components/Common/ActionFeedback/DisplayActionFeedbacks.test.data.js +0 -2
  138. package/src/react-extension/components/Common/ActionFeedback/DisplayActionFeedbacks.test.js +4 -5
  139. package/src/react-extension/components/Common/ActionFeedback/DisplayActionFeedbacks.test.page.js +0 -1
  140. package/src/react-extension/components/Common/Avatar/UserAvatar.js +2 -1
  141. package/src/react-extension/components/Common/Error/ShowErrorDetails/ShowErrorDetails.js +126 -0
  142. package/src/react-extension/components/Common/Icons/AnimatedFeedback.js +58 -0
  143. package/src/react-extension/components/Common/Icons/Icon.js +16 -0
  144. package/src/react-extension/components/Common/Icons/Icon.test.stories.js +78 -0
  145. package/src/react-extension/components/Common/Inputs/FormSubmitButton/FormSubmitButton.js +4 -0
  146. package/src/react-extension/components/Common/Loading/LoadingSpinner/LoadingSpinner.js +2 -1
  147. package/src/react-extension/components/Common/Menu/DisplayMainMenu.js +2 -4
  148. package/src/react-extension/components/Common/Navigation/Search/SearchBar.js +1 -1
  149. package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.js +1 -1
  150. package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.test.js +1 -1
  151. package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.test.stories.js +34 -0
  152. package/src/react-extension/components/Common/Tab/Tab.js +65 -0
  153. package/src/react-extension/components/Common/Tab/Tabs.js +87 -0
  154. package/src/react-extension/components/Resource/CreateResource/CreateResource.js +85 -66
  155. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.data.js +80 -1
  156. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.js +18 -39
  157. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.page.js +27 -8
  158. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.stories.js +70 -4
  159. package/src/react-extension/components/Resource/DeleteResource/DeleteResource.js +1 -1
  160. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayDragResource.js +68 -0
  161. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.js +20 -47
  162. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.test.page.js +4 -1
  163. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.js +2 -2
  164. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.test.data.js +1 -7
  165. package/src/react-extension/components/Resource/EditResource/EditResource.js +93 -68
  166. package/src/react-extension/components/Resource/EditResource/EditResource.test.data.js +80 -1
  167. package/src/react-extension/components/Resource/EditResource/EditResource.test.js +10 -39
  168. package/src/react-extension/components/Resource/EditResource/EditResource.test.page.js +26 -11
  169. package/src/react-extension/components/Resource/ExportResources/ExportResources.js +1 -1
  170. package/src/react-extension/components/Resource/ExportResources/ExportResources.test.stories.js +5 -11
  171. package/src/react-extension/components/Resource/ExportResources/ExportResourcesCredentials.js +10 -12
  172. package/src/react-extension/components/Resource/ExportResources/ExportResourcesCredentials.test.stories.js +5 -11
  173. package/src/react-extension/components/Resource/FilterResourcesByBreadcrumb/FilterResourcesByBreadcrumb.js +4 -4
  174. package/src/react-extension/components/Resource/FilterResourcesByBreadcrumb/FilterResourcesByBreadcrumb.test.stories.js +0 -1
  175. package/src/react-extension/components/Resource/FilterResourcesByFolders/DisplayDragFolderItem.js +109 -0
  176. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.js +41 -193
  177. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.data.js +10 -5
  178. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.js +9 -12
  179. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.page.js +6 -2
  180. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.stories.js +0 -1
  181. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.js +83 -58
  182. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.test.data.js +52 -59
  183. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.test.js +25 -20
  184. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.test.page.js +11 -5
  185. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItemContextualMenu.js +1 -1
  186. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByRootFolderContextualMenu.js +7 -2
  187. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByRootFolderContextualMenu.test.js +3 -7
  188. package/src/react-extension/components/Resource/FilterResourcesByGroups/FilterResourcesByGroups.js +1 -1
  189. package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.js +1 -1
  190. package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.test.page.js +1 -1
  191. package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.test.stories.js +0 -1
  192. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.js +1 -1
  193. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.data.js +47 -0
  194. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.js +34 -3
  195. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.page.js +46 -9
  196. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.stories.js +0 -1
  197. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTagsList.js +124 -4
  198. package/src/react-extension/components/Resource/FilterResourcesByText/FilterResourcesByText.test.stories.js +0 -2
  199. package/src/react-extension/components/Resource/ImportResources/ImportResources.js +6 -5
  200. package/src/react-extension/components/Resource/ImportResources/ImportResourcesKeyUnlock.js +10 -12
  201. package/src/react-extension/components/Resource/ImportResources/ImportResourcesKeyUnlock.test.stories.js +5 -11
  202. package/src/react-extension/components/Resource/ImportResources/ImportResourcesResult.js +3 -3
  203. package/src/react-extension/components/Resource/ImportResources/ImportResourcesResult.test.js +3 -3
  204. package/src/react-extension/components/Resource/ImportResources/ImportResourcesResult.test.stories.js +5 -11
  205. package/src/react-extension/components/ResourceComment/AddResourceComment/AddResourceComment.js +1 -1
  206. package/src/react-extension/components/ResourceComment/AddResourceComment/AddResourceComment.test.page.object.js +1 -1
  207. package/src/react-extension/components/ResourceComment/AddResourceComment/AddResourceComment.test.stories.js +8 -14
  208. package/src/react-extension/components/ResourceComment/ConfirmResourceCommentDeletion/ConfirmResourceCommentDeletion.test.stories.js +5 -11
  209. package/src/react-extension/components/ResourceComment/DisplayResourceCommentList/DisplayResourceCommentList.test.stories.js +8 -14
  210. package/src/react-extension/components/ResourceDescription/EditResourceDescription/EditResourceDescription.js +9 -8
  211. package/src/react-extension/components/ResourceDescription/EditResourceDescription/EditResourceDescription.test.page.js +1 -1
  212. package/src/react-extension/components/ResourceDescription/EditResourceDescription/EditResourceDescription.test.stories.js +8 -15
  213. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsActivity.test.stories.js +0 -1
  214. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsDescription.js +1 -1
  215. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsDescription.test.stories.js +0 -1
  216. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsTag.test.js +1 -1
  217. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsTag.test.stories.js +0 -1
  218. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.js +2 -2
  219. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.page.js +1 -1
  220. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.stories.js +0 -3
  221. package/src/react-extension/components/ResourceFolder/DefineResourceFolderMoveStrategy/DefineResourceFolderMoveStrategy.test.stories.js +0 -6
  222. package/src/react-extension/components/ResourceFolder/DeleteResourceFolder/DeleteResourceFolder.test.stories.js +0 -5
  223. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.js +1 -1
  224. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.page.js +1 -1
  225. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.stories.js +0 -7
  226. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsActivity.test.stories.js +0 -2
  227. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsInformation.test.stories.js +0 -2
  228. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsPermissions.test.stories.js +0 -2
  229. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePassphraseGenerator.js +150 -0
  230. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePassphraseGenerator.test.stories.js +30 -0
  231. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePasswordGenerator.js +191 -0
  232. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePasswordGenerator.test.stories.js +73 -0
  233. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.js +296 -0
  234. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.test.stories.js +112 -0
  235. package/src/react-extension/components/ResourceTag/DeleteResourceTag/DeleteResourceTag.test.stories.js +0 -2
  236. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.js +1 -1
  237. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.page.js +1 -1
  238. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.stories.js +0 -4
  239. package/src/react-extension/components/ResourceTag/EditResourceTags/EditResourceTags.js +2 -2
  240. package/src/react-extension/components/ResourceTag/EditResourceTags/EditResourceTags.test.page.js +1 -1
  241. package/src/react-extension/components/ResourceTag/EditResourceTags/EditResourceTagsItemViewer.js +5 -1
  242. package/src/react-extension/components/Share/ShareDialog.test.page.js +1 -1
  243. package/src/react-extension/components/Share/ShareDialog.test.stories.js +12 -10
  244. package/src/react-extension/components/User/ConfirmDisableUserMFA/ConfirmDisableUserMFA.test.stories.js +5 -9
  245. package/src/react-extension/components/User/CreateUser/CreateUser.js +4 -4
  246. package/src/react-extension/components/User/CreateUser/CreateUser.test.page.js +3 -3
  247. package/src/react-extension/components/User/CreateUser/CreateUser.test.stories.js +3 -1
  248. package/src/react-extension/components/User/DeleteUser/DeleteUser.test.stories.js +5 -8
  249. package/src/react-extension/components/User/DeleteUser/DeleteUserWithConflicts.test.stories.js +5 -8
  250. package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.js +2 -2
  251. package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.test.page.js +1 -1
  252. package/src/react-extension/components/User/DisplayUsers/DisplayUsers.js +35 -2
  253. package/src/react-extension/components/User/DisplayUsers/DisplayUsers.test.data.js +2 -1
  254. package/src/react-extension/components/User/DisplayUsers/DisplayUsers.test.js +6 -0
  255. package/src/react-extension/components/User/DisplayUsers/DisplayUsers.test.page.js +19 -6
  256. package/src/react-extension/components/User/EditUser/EditUser.js +3 -3
  257. package/src/react-extension/components/User/EditUser/EditUser.test.page.js +2 -2
  258. package/src/react-extension/components/User/EditUser/EditUser.test.stories.js +3 -1
  259. package/src/react-extension/components/User/FilterUsersByBreadcrumb/FilterUsersByBreadcrumb.js +2 -2
  260. package/src/react-extension/components/User/FilterUsersByBreadcrumb/FilterUsersByBreadcrumb.test.js +1 -1
  261. package/src/react-extension/components/User/FilterUsersByBreadcrumb/FilterUsersByBreadcrumb.test.stories.js +5 -8
  262. package/src/react-extension/components/User/FilterUsersByGroups/FilterUsersByGroup.js +1 -1
  263. package/src/react-extension/components/User/FilterUsersByShortcut/FilterUsersByShortcut.js +1 -1
  264. package/src/react-extension/components/User/FilterUsersByShortcut/FilterUsersByShortcut.test.stories.js +0 -1
  265. package/src/react-extension/components/User/FilterUsersByText/FilterUsersByText.test.stories.js +0 -2
  266. package/src/react-extension/components/UserDetails/DisplayUserDetailsGroups/DisplayUserDetailsGroups.test.stories.js +8 -11
  267. package/src/react-extension/components/UserDetails/DisplayUserDetailsInformation/DisplayUserDetailsInformation.test.stories.js +8 -11
  268. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.test.stories.js +8 -12
  269. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.js +1 -1
  270. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.page.js +2 -2
  271. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.stories.js +5 -8
  272. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroup.test.stories.js +5 -8
  273. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroupWithConflicts.test.stories.js +5 -8
  274. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsInformation/DisplayUserGroupDetailsInformation.test.stories.js +8 -11
  275. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsMembers/DisplayUserGroupDetailsMembers.test.stories.js +8 -11
  276. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.js +11 -3
  277. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.data.js +7 -0
  278. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.page.js +1 -1
  279. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.stories.js +12 -8
  280. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.js +92 -21
  281. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.test.data.js +6 -0
  282. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.test.js +2 -2
  283. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.test.page.js +1 -1
  284. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/DisplayChangePassphraseIntroduction.js +12 -10
  285. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/DownloadRecoveryKit.js +4 -10
  286. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.js +65 -25
  287. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.data.js +6 -0
  288. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.js +1 -1
  289. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.page.js +1 -1
  290. package/src/react-extension/components/UserSetting/ChangeUserSecurityToken/ChangeUserSecurityToken.js +14 -13
  291. package/src/react-extension/components/UserSetting/ChangeUserSecurityToken/ChangeUserSecurityToken.test.stories.js +5 -8
  292. package/src/react-extension/components/UserSetting/DisplayUserGpgInformation/DisplayUserGpgInformation.js +21 -6
  293. package/src/react-extension/components/UserSetting/DisplayUserGpgInformation/DisplayUserGpgInformation.test.stories.js +5 -8
  294. package/src/react-extension/components/UserSetting/DisplayUserProfile/DisplayUserProfile.js +1 -1
  295. package/src/react-extension/components/UserSetting/DisplayUserProfile/DisplayUserProfile.test.stories.js +5 -8
  296. package/src/react-extension/components/UserSetting/DisplayUserSettingsWorkspace/DisplayUserSettingsWorkspace.js +13 -1
  297. package/src/react-extension/components/UserSetting/DisplayUserSettingsWorkspaceBreadcrumb/DisplayUserSettingsWorkspaceBreadcrumb.js +2 -1
  298. package/src/react-extension/components/UserSetting/DisplayUserSettingsWorkspaceBreadcrumb/DisplayUserSettingsWorkspaceBreadcrumb.test.stories.js +5 -8
  299. package/src/react-extension/components/UserSetting/DisplayUserTheme/DisplayUserTheme.test.stories.js +5 -8
  300. package/src/react-extension/components/UserSetting/EditUserProfile/EditUserProfile.js +3 -3
  301. package/src/react-extension/components/UserSetting/EditUserProfile/EditUserProfile.test.stories.js +5 -8
  302. package/src/react-extension/components/UserSetting/NavigateIntoUserSettingsWorkspace/NavigateIntoUserSettingsWorkspace.js +26 -4
  303. package/src/react-extension/components/UserSetting/NavigateIntoUserSettingsWorkspace/NavigateIntoUserSettingsWorkspace.test.stories.js +7 -10
  304. package/src/react-extension/components/UserSetting/TransferToMobile/TransferToMobile.js +749 -0
  305. package/src/react-extension/components/UserSetting/TransferToMobile/TransferToMobile.test.data.js +32 -0
  306. package/src/react-extension/components/UserSetting/TransferToMobile/TransferToMobile.test.js +60 -0
  307. package/src/react-extension/components/UserSetting/TransferToMobile/TransferToMobile.test.page.js +110 -0
  308. package/src/react-extension/components/UserSetting/UploadUserProfileAvatar/UploadUserProfileAvatar.js +3 -2
  309. package/src/react-extension/components/UserSetting/UploadUserProfileAvatar/UploadUserProfileAvatar.test.stories.js +5 -8
  310. package/src/react-extension/contexts/AdministrationWorkspaceContext.js +2 -2
  311. package/src/react-extension/contexts/ApiAppContext.js +1 -1
  312. package/src/react-extension/contexts/ApiRecoverContext.js +1 -1
  313. package/src/react-extension/contexts/ApiSetupContext.js +1 -1
  314. package/src/react-extension/contexts/AuthenticationContext.js +21 -2
  315. package/src/react-extension/contexts/AuthenticationContext.test.js +40 -0
  316. package/src/react-extension/contexts/DragContext.js +122 -0
  317. package/src/react-extension/contexts/DragContext.test.js +53 -0
  318. package/src/react-extension/contexts/NavigationContext.js +11 -0
  319. package/src/react-extension/contexts/ResourcePasswordGeneratorContext.js +144 -0
  320. package/src/react-extension/contexts/ResourceWorkspaceContext.js +5 -4
  321. package/src/react-extension/contexts/ResourceWorkspaceContext.test.data.js +0 -1
  322. package/src/react-extension/contexts/ResourceWorkspaceContext.test.page.js +0 -1
  323. package/src/react-extension/contexts/UserWorkspaceContext.js +31 -4
  324. package/src/react-extension/contexts/UserWorkspaceContext.test.data.js +17 -287
  325. package/src/react-extension/lib/Crypto/sha512.js +17 -0
  326. package/src/react-extension/test/fixture/Settings/siteSettings.js +6 -0
  327. package/src/react-extension/test/mock/components/Internationalisation/MockTranslationProvider.js +42 -7
  328. package/src/react-quickaccess/ExtQuickAccess.js +75 -28
  329. package/src/react-quickaccess/components/AnimatedSwitch/AnimatedSwitch.js +22 -5
  330. package/src/react-quickaccess/components/ExtensionSetup/SetupExtensionInProgress/SetupExtensionInProgress.js +41 -0
  331. package/src/react-quickaccess/components/ExtensionSetup/SetupExtensionInProgress/SetupExtensionInProgressPage.test.stories.js +23 -0
  332. package/src/react-quickaccess/components/FilterResourcesByFavoritePage/FilterResourcesByFavoritePage.js +8 -4
  333. package/src/react-quickaccess/components/FilterResourcesByFavoritePage/FilterResourcesByFavoritePage.test.stories.js +7 -7
  334. package/src/react-quickaccess/components/FilterResourcesByGroupPage/FilterResourcesByGroupPage.js +10 -6
  335. package/src/react-quickaccess/components/FilterResourcesByGroupPage/FilterResourcesByGroupPage.test.stories.js +9 -5
  336. package/src/react-quickaccess/components/FilterResourcesByItemsIOwnPage/FilterResourcesByItemsIOwnPage.js +10 -7
  337. package/src/react-quickaccess/components/FilterResourcesByItemsIOwnPage/FilterResourcesByItemsIOwnPage.test.stories.js +7 -7
  338. package/src/react-quickaccess/components/FilterResourcesByRecentlyModifiedPage/FilterResourcesByRecentlyModifiedPage.js +10 -7
  339. package/src/react-quickaccess/components/FilterResourcesByRecentlyModifiedPage/FilterResourcesByRecentlyModifiedPage.test.stories.js +7 -7
  340. package/src/react-quickaccess/components/FilterResourcesBySharedWithMePage/FilterResourcesBySharedWithMePage.js +10 -7
  341. package/src/react-quickaccess/components/FilterResourcesBySharedWithMePage/FilterResourcesBySharedWithMePage.test.stories.js +7 -7
  342. package/src/react-quickaccess/components/FilterResourcesByTagPage/FilterResourcesByTagPage.js +10 -7
  343. package/src/react-quickaccess/components/FilterResourcesByTagPage/FilterResourcesByTagPage.test.stories.js +9 -5
  344. package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePassphraseGenerator.js +150 -0
  345. package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePassphraseGenerator.test.data.js +20 -0
  346. package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePassphraseGenerator.test.js +67 -0
  347. package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePassphraseGenerator.test.page.js +109 -0
  348. package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePasswordGenerator.js +189 -0
  349. package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePasswordGenerator.test.data.js +40 -0
  350. package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePasswordGenerator.test.js +67 -0
  351. package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePasswordGenerator.test.page.js +121 -0
  352. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.js +304 -0
  353. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.data.js +102 -0
  354. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.js +76 -0
  355. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.page.js +158 -0
  356. package/src/react-quickaccess/components/Header/Header.js +10 -8
  357. package/src/react-quickaccess/components/Header/Header.test.stories.js +4 -7
  358. package/src/react-quickaccess/components/HomePage/HomePage.js +40 -11
  359. package/src/react-quickaccess/components/HomePage/HomePage.test.stories.js +14 -10
  360. package/src/react-quickaccess/components/HomePage/canSuggestUrl.js +8 -3
  361. package/src/react-quickaccess/components/HomePage/canSuggestUrl.test.js +6 -0
  362. package/src/react-quickaccess/components/LoginPage/LoginPage.js +58 -18
  363. package/src/react-quickaccess/components/LoginPage/LoginPage.test.stories.js +4 -6
  364. package/src/react-quickaccess/components/ManageQuickAccessMode/ManageQuickAccessMode.js +103 -0
  365. package/src/react-quickaccess/components/MoreFiltersPage/MoreFiltersPage.js +2 -2
  366. package/src/react-quickaccess/components/MoreFiltersPage/MoreFiltersPage.test.stories.js +4 -6
  367. package/src/react-quickaccess/components/PassphraseDialog/PassphraseDialog.js +5 -3
  368. package/src/react-quickaccess/components/PassphraseDialog/PassphraseDialog.test.stories.js +6 -6
  369. package/src/react-quickaccess/components/PrivateRoute/PrivateRoute.js +1 -0
  370. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.js +234 -0
  371. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.data.js +28 -0
  372. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.stories.js +44 -0
  373. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.js +166 -39
  374. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.data.js +108 -2
  375. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.js +28 -25
  376. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.stories.js +6 -6
  377. package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.js +6 -3
  378. package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.test.stories.js +5 -3
  379. package/src/react-quickaccess/components/Search/Search.js +13 -1
  380. package/src/react-quickaccess/components/Search/Search.test.stories.js +4 -6
  381. package/src/react-quickaccess/contexts/PrepareResourceContext.js +221 -0
  382. package/src/react-web-integration/AuthLogin/AuthLogin.js +72 -0
  383. package/src/react-web-integration/Autofill/Autofill.js +331 -0
  384. package/src/react-web-integration/BrowserIntegrationBootstrap.js +64 -0
  385. package/src/react-web-integration/Events/Quickaccess/QuickAccessEvent.js +24 -0
  386. package/src/react-web-integration/ExtInFormCallToAction.js +56 -0
  387. package/src/react-web-integration/ExtInFormMenu.js +70 -0
  388. package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.js +161 -0
  389. package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.test.data.js +39 -0
  390. package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.test.js +48 -0
  391. package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.test.page.js +42 -0
  392. package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.test.stories.js +91 -0
  393. package/src/react-web-integration/components/DisplayInFormMenu/DisplayInFormMenu.js +360 -0
  394. package/src/react-web-integration/components/DisplayInFormMenu/DisplayInFormMenu.test.stories.js +198 -0
  395. package/src/react-web-integration/components/DisplayInFormMenu/DisplayInFormMenuItem.js +103 -0
  396. package/src/react-web-integration/contexts/AppContext.js +39 -0
  397. package/src/react-web-integration/lib/Dom/DomUtils.js +94 -0
  398. package/src/react-web-integration/lib/InForm/InFormCallToActionField.js +263 -0
  399. package/src/react-web-integration/lib/InForm/InFormCredentialsFormField.js +118 -0
  400. package/src/react-web-integration/lib/InForm/InFormFieldSelector.js +77 -0
  401. package/src/react-web-integration/lib/InForm/InFormManager.js +253 -0
  402. package/src/react-web-integration/lib/InForm/InformManager.test.data.js +46 -0
  403. package/src/react-web-integration/lib/InForm/InformManager.test.js +82 -0
  404. package/src/react-web-integration/lib/InForm/InformManager.test.page.js +116 -0
  405. package/src/react-web-integration/lib/InForm/InformMenuField.js +182 -0
  406. package/src/shared/components/Internationalisation/TranslationProvider.js +145 -0
  407. package/src/shared/lib/Browser/detectBrowserName.js +2 -1
  408. package/src/shared/lib/Secret/SecretComplexity.js +2 -2
  409. package/src/shared/lib/SecretGenerator/PassphraseGenerator.js +112 -0
  410. package/src/shared/lib/SecretGenerator/PassphraseGenerator.test.js +48 -0
  411. package/src/shared/lib/SecretGenerator/PassphraseGeneratorWords.js +7789 -0
  412. package/src/shared/lib/SecretGenerator/PasswordGenerator.js +103 -0
  413. package/src/shared/lib/SecretGenerator/SecretGenerator.js +45 -0
  414. package/src/shared/lib/SecretGenerator/SecretGeneratorComplexity.js +190 -0
  415. package/src/shared/lib/SecretGenerator/SecretGeneratorComplexity.test.js +95 -0
  416. package/src/shared/lib/Settings/SiteSettings.js +8 -0
  417. package/src/shared/lib/apiClient/apiClient.test.js +1 -1
  418. package/.babelrc +0 -11
  419. package/.editorconfig +0 -13
  420. package/.eslintrc.json +0 -197
  421. package/.gitlab-ci.yml +0 -28
  422. package/.jest.config.json +0 -6
  423. package/.jest.setup.js +0 -8
  424. package/.jest.transform.js +0 -7
  425. package/.storybook/main.js +0 -15
  426. package/.storybook/preview-body.html +0 -5
  427. package/.storybook/preview.js +0 -6
  428. package/Gruntfile.js +0 -199
  429. package/build/css/themes/default/ext_config_debug.min.css +0 -13
  430. package/build/css/themes/default/ext_legacy.min.css +0 -13
  431. package/build/css/themes/midgar/ext_legacy.min.css +0 -13
  432. package/crowdin.yml +0 -4
  433. package/docker-compose-dev.yml +0 -10
  434. package/jest.config.json +0 -6
  435. package/src/img/controls/colorpicker/marker.png +0 -0
  436. package/src/img/controls/colorpicker/mask.png +0 -0
  437. package/src/img/controls/colorpicker/wheel.png +0 -0
  438. package/src/img/controls/overlay-opacity-50.png +0 -0
  439. package/src/img/third_party/ChromeWebStore_black.png +0 -0
  440. package/src/img/third_party/ChromeWebStore_white.png +0 -0
  441. package/src/js/accordion.js +0 -10
  442. package/src/js/autocomplete.js +0 -241
  443. package/src/js/autocomplete.min.js +0 -3
  444. package/src/js/bootstrap-scrollspy.js +0 -172
  445. package/src/js/chosen.jquery.js +0 -1356
  446. package/src/js/colorpicker.js +0 -32
  447. package/src/js/download.js +0 -128
  448. package/src/js/farbtastic.js +0 -345
  449. package/src/js/swiper.min.js +0 -18
  450. package/src/react-quickaccess/components/Internationalisation/TranslationProvider.js +0 -151
  451. package/storybook-static/favicon.ico +0 -0
  452. package/storybook-static/iframe.html +0 -133
  453. package/storybook-static/index.html +0 -47
  454. package/storybook-static/main.2d01924b12554c6c15af.bundle.js +0 -1
  455. package/storybook-static/main.b0c44c8759149ccf4f67.bundle.js +0 -3
  456. package/storybook-static/main.b0c44c8759149ccf4f67.bundle.js.LICENSE.txt +0 -153
  457. package/storybook-static/main.b0c44c8759149ccf4f67.bundle.js.map +0 -1
  458. package/storybook-static/runtime~main.6a9b04192e3176eff72a.bundle.js +0 -1
  459. package/storybook-static/runtime~main.b0c44c8759149ccf4f67.bundle.js +0 -2
  460. package/storybook-static/runtime~main.b0c44c8759149ccf4f67.bundle.js.map +0 -1
  461. package/storybook-static/static/media/chosen-sprite.6768c197.png +0 -0
  462. package/storybook-static/static/media/chosen-sprite@2x.a0b7f3f1.png +0 -0
  463. package/storybook-static/static/media/dot_black.a2c44078.svg +0 -6
  464. package/storybook-static/static/media/dot_red.7b34541d.svg +0 -6
  465. package/storybook-static/static/media/dot_white.f60f7331.svg +0 -6
  466. package/storybook-static/static/media/fontawesome-webfont.1e59d233.ttf +0 -0
  467. package/storybook-static/static/media/fontawesome-webfont.20fd1704.woff2 +0 -0
  468. package/storybook-static/static/media/fontawesome-webfont.8b43027f.eot +0 -0
  469. package/storybook-static/static/media/fontawesome-webfont.c1e38fd9.svg +0 -2671
  470. package/storybook-static/static/media/fontawesome-webfont.f691f37e.woff +0 -0
  471. package/storybook-static/static/media/infinite-bar.f5327dc3.gif +0 -0
  472. package/storybook-static/static/media/loading_dark.ea474c7f.svg +0 -21
  473. package/storybook-static/static/media/loading_light.061977b5.svg +0 -15
  474. package/storybook-static/static/media/logo.e2b062a5.svg +0 -1
  475. package/storybook-static/static/media/logo_white.cb32e694.svg +0 -1
  476. package/storybook-static/static/media/opensans-bold.a6b4768c.woff +0 -0
  477. package/storybook-static/static/media/opensans-regular.7812bd0b.woff +0 -0
  478. package/storybook-static/static/media/passphrase_intro.37a1ba4e.png +0 -0
  479. package/storybook-static/vendors~main.4abf29e4f956d5befb41.bundle.js +0 -2
  480. package/storybook-static/vendors~main.4abf29e4f956d5befb41.bundle.js.LICENSE.txt +0 -105
  481. package/storybook-static/vendors~main.b0c44c8759149ccf4f67.bundle.js +0 -3
  482. package/storybook-static/vendors~main.b0c44c8759149ccf4f67.bundle.js.LICENSE.txt +0 -145
  483. package/storybook-static/vendors~main.b0c44c8759149ccf4f67.bundle.js.map +0 -1
  484. package/webpack-api.config.js +0 -83
  485. package/webpack-ext.config.js +0 -84
@@ -0,0 +1,749 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 2021 Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) 2021 Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 3.3.0
13
+ */
14
+
15
+ import React from 'react';
16
+ import PropTypes from "prop-types";
17
+ import AppContext from "../../../contexts/AppContext";
18
+ import {withDialog} from "../../../contexts/DialogContext";
19
+ import QRCode from 'qrcode';
20
+ import {sha512} from "../../../lib/Crypto/sha512";
21
+ import {Trans, withTranslation} from "react-i18next";
22
+ import {withUserSettings} from "../../../contexts/UserSettingsContext";
23
+ import Icon from "../../Common/Icons/Icon";
24
+ import ShowErrorDetails from "../../Common/Error/ShowErrorDetails/ShowErrorDetails";
25
+ import AnimatedFeedback from "../../Common/Icons/AnimatedFeedback";
26
+
27
+ // Ref. http://blog.qr4.nl/page/QR-Code-Data-Capacity.aspx
28
+ const QRCODE_VERSION = 27;
29
+ const QRCODE_ERROR_CORRECTION = 'L';
30
+ const QRCODE_MAXSLICE = 1465;
31
+ const QRCODE_MARGIN = 4;
32
+ const QRCCODE_PROTOCOL_VERSION = 1;
33
+ const QRCODE_WIDTH = 325;
34
+
35
+ const FETCH_INTERVAL = 333; //in ms
36
+ const MAX_UINT8 = 255;
37
+
38
+ /**
39
+ * This component displays the user profile information
40
+ */
41
+ class TransferToMobile extends React.Component {
42
+ /**
43
+ * Default constructor
44
+ * @param props Component props
45
+ */
46
+ constructor(props) {
47
+ super(props);
48
+ this.state = this.defaultState;
49
+ this.timeout = undefined;
50
+ this.request = 0;
51
+ this.bindHandlers();
52
+ }
53
+
54
+ /**
55
+ * Returns the component default state
56
+ */
57
+ get defaultState() {
58
+ return {
59
+ step: 'start',
60
+ page: 0,
61
+ processing: false,
62
+ qrCodes: undefined, // QR code cache
63
+ debug: true,
64
+ error: undefined,
65
+ showErrorDetails: false,
66
+ transferDto: undefined
67
+ };
68
+ }
69
+
70
+ /**
71
+ * Returns the current user
72
+ */
73
+ get user() {
74
+ return this.context.loggedInUser;
75
+ }
76
+
77
+ /**
78
+ * Get the translate function
79
+ * @returns {function(...[*]=)}
80
+ */
81
+ get translate() {
82
+ return this.props.t;
83
+ }
84
+
85
+ /**
86
+ * Get current domain
87
+ * @returns {string}
88
+ */
89
+ get domain() {
90
+ return this.context.userSettings.getTrustedDomain();
91
+ }
92
+
93
+ /**
94
+ * Binds the component handlers
95
+ */
96
+ bindHandlers() {
97
+ this.handleClickStart = this.handleClickStart.bind(this);
98
+ this.handleClickCancel = this.handleClickCancel.bind(this);
99
+ this.handleClickDone = this.handleClickDone.bind(this);
100
+ }
101
+
102
+ /**
103
+ * Whenever the user wants to start the transfer
104
+ */
105
+ async handleClickStart() {
106
+ try {
107
+ await this.toggleProcessing();
108
+ await this.createTransfer();
109
+ await this.toggleProcessing();
110
+ } catch (error) {
111
+ // Could be that the user canceled or couldn't remember the passphrase
112
+ if (error.name === "UserAbortsOperationError") {
113
+ return this.handleTransferCancel();
114
+ } else {
115
+ return this.handleTransferError(error);
116
+ }
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Build first QR code
122
+ * @param {object} transferDto
123
+ * @param {int} totalPages
124
+ * @param {string} hash
125
+ * @returns {Promise<string>} image data
126
+ */
127
+ async buildFirstQrCode(transferDto, totalPages, hash) {
128
+ // sanity checks
129
+ if (!transferDto) {
130
+ throw new Error(this.translate('Server response is empty.'));
131
+ }
132
+
133
+ if (transferDto.total_pages !== totalPages || transferDto.hash !== hash) {
134
+ const error = new Error(this.translate('Server response does not match initial request.'));
135
+ error.data = {transferDto: transferDto, totalPages, hash};
136
+ throw error;
137
+ }
138
+
139
+ if (!transferDto.authentication_token || !transferDto.authentication_token.token) {
140
+ throw new Error(this.translate('Authentication token is missing from server response.'));
141
+ }
142
+
143
+ const str = this.getTransferMetadataDataAsString(transferDto);
144
+ const slices = this.stringToSlices(str, 0);
145
+ if (!slices || slices.length === 0) {
146
+ throw new Error(this.translate('Sorry, it is not possible to proceed. The first QR code is empty.'));
147
+ }
148
+ if (slices.length > 1) {
149
+ throw new Error(this.translate('Sorry, it is not possible to proceed. The first QR code is too big.'));
150
+ }
151
+ return await this.getQrCode(slices[0]);
152
+ }
153
+
154
+ /*
155
+ *
156
+ * Data prep
157
+ *
158
+ */
159
+ /**
160
+ * Get first QR code data
161
+ *
162
+ * @param {object} transferDto
163
+ * @returns {string}
164
+ */
165
+ getTransferMetadataDataAsString(transferDto) {
166
+ return JSON.stringify({
167
+ transfer_id: transferDto.id,
168
+ user_id: this.user.id,
169
+ domain: this.domain,
170
+ total_pages: transferDto.total_pages,
171
+ hash: transferDto.hash,
172
+ authentication_token: transferDto.authentication_token.token
173
+ });
174
+ }
175
+
176
+ /**
177
+ * Getter for bulk of the data to transfer
178
+ *
179
+ * @returns {Promise<string>} base64 encoded JSON string with
180
+ * {user: uuid, fingerprint: string, armored_key: openpgp secret armored key block}
181
+ */
182
+ async getTransferDataAsString() {
183
+ const fingerprint = await this.getFingerprint();
184
+ const privateKey = await this.getPrivateKey();
185
+ return JSON.stringify({user_id: this.user.id, fingerprint, armored_key: privateKey});
186
+ }
187
+
188
+ /**
189
+ * Get the transfer data hash
190
+ * Will be send to the server so that the client can double check the data integrity
191
+ * at the end of the transfer process
192
+ *
193
+ * @param {string} message
194
+ * @throws {Error} if message is empty or not a string
195
+ * @returns {Promise<string>}
196
+ */
197
+ async getTransferHash(message) {
198
+ return await sha512(message);
199
+ }
200
+
201
+ /*
202
+ *
203
+ * QR Code generation
204
+ *
205
+ */
206
+ /**
207
+ * Build QR codes
208
+ * Get the raw data, slices it according to desired QR code size, build QR codes as images
209
+ * @returns {Promise<[]>}
210
+ */
211
+ async buildQrCodes(rawData) {
212
+ const slices = this.stringToSlices(rawData, 1);
213
+ const qrCodes = [];
214
+ for (let i = 0; i < slices.length; i++) {
215
+ const qrCode = await this.getQrCode(slices[i]);
216
+ qrCodes.push(qrCode);
217
+ }
218
+ return qrCodes;
219
+ }
220
+
221
+ /**
222
+ * String to slice
223
+ *
224
+ * @param {string} data
225
+ * @param {int} startPage
226
+ * @returns {array} array of strings sliced to fit on the defined QR CODE size
227
+ */
228
+ stringToSlices(data, startPage) {
229
+ const slices = [];
230
+
231
+ /*
232
+ * 2 reserved byte for page number, max page number 255
233
+ * 1 reserved byte for protocol version
234
+ */
235
+ const sliceSize = QRCODE_MAXSLICE - (2 + 1);
236
+ const sliceNeeded = Math.ceil(data.length / sliceSize);
237
+
238
+ if (sliceNeeded > MAX_UINT8) {
239
+ throw new Error('Cannot transfer the data, the private key is too big.');
240
+ }
241
+ if (typeof startPage === 'undefined') {
242
+ startPage = 0;
243
+ }
244
+
245
+ for (let i = 0; i < sliceNeeded; i++) {
246
+ const pageCounter = startPage + i;
247
+
248
+ /*
249
+ * Header - Version and page
250
+ * UInt8 => Hex string => Unicode value of the individual characters
251
+ * 255 => "ff" => 70 70
252
+ *
253
+ * Unfortunately we we cannot send these numbers as bytes.
254
+ * This sub optimal encoding is due to compatibility issues with iOS QR Code scanning library
255
+ */
256
+ const version = (QRCCODE_PROTOCOL_VERSION.toString(16));
257
+ const page = (pageCounter.toString(16)).padStart(2, '0');
258
+ const uint8Header = new Uint8ClampedArray([
259
+ version.charCodeAt(0), page.charCodeAt(0), page.charCodeAt(1)
260
+ ]);
261
+
262
+ /*
263
+ * Data
264
+ * Similar encoding, but since data is just ASCII chars, one less step
265
+ * "F" => 102
266
+ */
267
+ const start = (i === 0) ? 0 : (i * sliceSize);
268
+ let end = (i === 0) ? (sliceSize) : (sliceSize * (i + 1));
269
+ end = (end > data.length) ? data.length : end;
270
+ const slicedData = data.slice(start, end);
271
+ const uint8Data = this.str2bytes(slicedData);
272
+
273
+ // together
274
+ slices[i] = Uint8ClampedArray.from([...uint8Header, ...uint8Data]);
275
+ }
276
+
277
+ return slices;
278
+ }
279
+
280
+ /**
281
+ * Convert a 8bit encoded string into Uint8ClampedArray
282
+ * @param {string} str
283
+ * @returns {Uint8ClampedArray}
284
+ */
285
+ str2bytes(str) {
286
+ const buffer = new Uint8ClampedArray(str.length);
287
+ for (let i = 0, strLen = str.length; i < strLen; i++) {
288
+ buffer[i] = str.charCodeAt(i);
289
+ }
290
+ return buffer;
291
+ }
292
+
293
+ /**
294
+ * Populates the component with data
295
+ * @param {Uint8ClampedArray} content
296
+ * @returns {Promise<string>} image data
297
+ */
298
+ async getQrCode(content) {
299
+ try {
300
+ return await QRCode.toDataURL([{
301
+ data: content,
302
+ mode: 'byte'
303
+ }], {
304
+ version: QRCODE_VERSION,
305
+ errorCorrectionLevel: QRCODE_ERROR_CORRECTION,
306
+ type: 'image/jpeg',
307
+ quality: 1,
308
+ margin: QRCODE_MARGIN,
309
+ });
310
+ } catch (error) {
311
+ this.handleError(error);
312
+ }
313
+ }
314
+
315
+ /*
316
+ *
317
+ * API CALLS
318
+ *
319
+ */
320
+ /**
321
+ * Fetch the user key id
322
+ */
323
+ async getPrivateKey() {
324
+ return await this.context.port.request('passbolt.keyring.get-private-key');
325
+ }
326
+
327
+ /**
328
+ * Find a user gpg key
329
+ *
330
+ * @throws {Error} if fingerprint is not available
331
+ * @returns {Promise<String>} fingerprint
332
+ */
333
+ async getFingerprint() {
334
+ const key = await this.context.port.request('passbolt.keyring.get-public-key-info-by-user', this.user.id);
335
+ if (!key || !key.fingerprint) {
336
+ throw new Error('The user fingerprint is not set.');
337
+ }
338
+ return key.fingerprint;
339
+ }
340
+
341
+ /*
342
+ *
343
+ * Transfer state machine
344
+ *
345
+ */
346
+ /**
347
+ * Initiate the exchange by creating a transfer entity server side
348
+ * This will allow the clients to coordinate the transfer
349
+ *
350
+ * @returns {Promise<void>}
351
+ */
352
+ async createTransfer() {
353
+ const rawString = await this.getTransferDataAsString();
354
+ const hash = await this.getTransferHash(rawString);
355
+ const qrCodes = await this.buildQrCodes(rawString);
356
+ const totalPages = qrCodes.length + 1; // +1 for the first QR code with hash and auth token
357
+
358
+ try {
359
+ const data = {total_pages: totalPages, hash: hash};
360
+ const transferDto = await this.context.port.request('passbolt.mobile.transfer.create', data);
361
+ const firstQrCode = await this.buildFirstQrCode(transferDto, totalPages, hash);
362
+ qrCodes.unshift(firstQrCode);
363
+ this.setState({qrCodes, step: 'in progress', page: 0, transferDto}, () => {
364
+ this.setInterval();
365
+ });
366
+ } catch (error) {
367
+ this.handleError(error);
368
+ }
369
+ }
370
+
371
+ /**
372
+ * Get some update
373
+ *
374
+ * @returns {Promise<void>}
375
+ */
376
+ async getUpdatedTransfer() {
377
+ let transferDto;
378
+ try {
379
+ this.request = 1;
380
+ transferDto = await this.context.port.request('passbolt.mobile.transfer.get', this.state.transferDto.id);
381
+ this.request = 0;
382
+ } catch (error) {
383
+ // if there is an error, consider the transfer cancelled
384
+ await this.handleTransferError(error);
385
+ return;
386
+ }
387
+
388
+ if (transferDto) {
389
+ switch (transferDto.status) {
390
+ case 'start':
391
+ // update QR code only if the page changed
392
+ break;
393
+ case 'in progress':
394
+ if (transferDto.current_page !== this.state.page) {
395
+ await this.handleTransferUpdated(transferDto);
396
+ }
397
+ break;
398
+ case 'complete':
399
+ await this.handleTransferComplete();
400
+ break;
401
+ case 'error':
402
+ await this.handleTransferError();
403
+ break;
404
+ case 'cancel':
405
+ await this.handleTransferCancelled();
406
+ break;
407
+ default:
408
+ await this.handleTransferError(new Error('Unsupported status'));
409
+ break;
410
+ }
411
+ }
412
+ }
413
+
414
+ /**
415
+ * Handle when the transfer was updated
416
+ * Turn pages, etc.
417
+ *
418
+ * @param transferDto
419
+ * @returns {Promise<void>}
420
+ */
421
+ async handleTransferUpdated(transferDto) {
422
+ this.setState({transferDto, step: 'in progress', page: transferDto.current_page});
423
+ }
424
+
425
+ /**
426
+ * Tell the server that the transfer is cancelled browser extension side
427
+ * This allows the other client to also give up.
428
+ *
429
+ * @returns {Promise<void>}
430
+ */
431
+ async handleTransferCancel() {
432
+ await this.toggleProcessing();
433
+ this.clearInterval();
434
+ try {
435
+ // cancel server side if we had the time to create a transfer entity there
436
+ if (this.state.transferDto && this.state.transferDto !== 'cancel') {
437
+ const transferDto = {id: this.state.transferDto.id, status: 'cancel'};
438
+ await this.context.port.request('passbolt.mobile.transfer.update', transferDto);
439
+ }
440
+ } catch (error) {
441
+ // not much to recover from
442
+ console.error(error);
443
+ }
444
+ this.setState(this.defaultState);
445
+ }
446
+
447
+ /**
448
+ * Tell the server that the transfer is cancelled mobile side
449
+ *
450
+ * @returns {Promise<void>}
451
+ */
452
+ async handleTransferCancelled() {
453
+ this.clearInterval();
454
+ const cancelState = this.defaultState;
455
+ cancelState.step = 'cancel';
456
+ this.setState(cancelState);
457
+ }
458
+
459
+ /**
460
+ * When the transfer is over
461
+ * @returns {Promise<void>}
462
+ */
463
+ async handleTransferComplete() {
464
+ this.clearInterval();
465
+ const completeState = this.defaultState;
466
+ completeState.step = 'complete';
467
+ this.setState(completeState);
468
+ }
469
+
470
+ /**
471
+ * When the transfer is reporting an issue
472
+ * @returns {Promise<void>}
473
+ */
474
+ async handleTransferError(error) {
475
+ this.clearInterval();
476
+ if (!error) {
477
+ const msg = this.translate('The transfer was cancelled because the other client returned an error.');
478
+ error = new Error(msg);
479
+ }
480
+ this.handleError(error);
481
+ }
482
+
483
+ /*
484
+ *
485
+ * Update polling
486
+ *
487
+ */
488
+ /**
489
+ * componentWillUnmount
490
+ * This method is called when a component is being removed from the DOM
491
+ */
492
+ componentWillUnmount() {
493
+ this.clearInterval();
494
+ }
495
+
496
+ /**
497
+ * Add an interval to fetch transfer update
498
+ */
499
+ setInterval() {
500
+ this.timeout = window.setInterval(() => {
501
+ // throttle requests so that there is only one pending at a given time
502
+ if (this.request === 0) {
503
+ this.getUpdatedTransfer();
504
+ }
505
+ }, FETCH_INTERVAL);
506
+ }
507
+
508
+ /**
509
+ * Remove the interval fetching the last transfer update
510
+ */
511
+ clearInterval() {
512
+ if (this.timeout) {
513
+ window.clearInterval(this.timeout);
514
+ this.timeout = null;
515
+ }
516
+ this.request = 0;
517
+ }
518
+
519
+ /*
520
+ *
521
+ * UI related events
522
+ *
523
+ */
524
+ /**
525
+ * What happens when the user clicks cancel
526
+ *
527
+ * @returns {Promise<void>}
528
+ */
529
+ async handleClickCancel() {
530
+ this.handleTransferCancel();
531
+ }
532
+
533
+ /**
534
+ * When the transfer is over and one wants to restart
535
+ * @returns {Promise<void>}
536
+ */
537
+ async handleClickDone() {
538
+ this.clearInterval();
539
+ this.setState(this.defaultState);
540
+ }
541
+
542
+ /**
543
+ * Toggle processing state
544
+ * @returns {Promise<void>}
545
+ */
546
+ async toggleProcessing() {
547
+ const prev = this.state.processing;
548
+ return new Promise(resolve => {
549
+ this.setState({processing: !prev}, resolve());
550
+ });
551
+ }
552
+
553
+ /*
554
+ *
555
+ * JSX Helpers
556
+ *
557
+ */
558
+ /**
559
+ * Handle error to display the error info and retry
560
+ * @param {Error} error
561
+ */
562
+ handleError(error) {
563
+ console.error(error);
564
+ this.setState({step: 'error', error});
565
+ }
566
+
567
+ /**
568
+ * Return the current QR code src (inline image)
569
+ * @returns {string|*}
570
+ */
571
+ getCurrentQrCodeSrc() {
572
+ if (typeof this.state.qrCodes[this.state.page] === 'undefined') {
573
+ // TODO display something...
574
+ return '';
575
+ }
576
+ return this.state.qrCodes[this.state.page];
577
+ }
578
+
579
+ /**
580
+ * Render
581
+ * @returns {JSX.Element}
582
+ */
583
+ render() {
584
+ const processingClassName = this.state.processing ? 'processing' : '';
585
+ return (
586
+ <div className="grid grid-responsive-12 profile-mobile-transfer">
587
+ <div className="row">
588
+ {this.state.step === 'start' &&
589
+ <div className="mobile-transfer-step-start">
590
+ <div className="profile col6">
591
+ <h3><Trans>Welcome to the mobile account transfer!</Trans></h3>
592
+ <div className="mobile-transfer-bg">
593
+ <div className="visually-hidden">An illustration showing the different steps.</div>
594
+ </div>
595
+ <p className="font-dim">
596
+ <Trans>Click start once the mobile application is installed and opened on your phone and you are ready to scan QR codes.</Trans>
597
+ </p>
598
+ <div className="submit-wrapper">
599
+ <a className={`button primary big ${processingClassName}`} role="button" onClick={this.handleClickStart}>
600
+ <Trans>Start</Trans>
601
+ </a>
602
+ </div>
603
+ </div>
604
+ <div className="avatar col4 push1 last">
605
+ <h3><Trans>Get started in 5 easy steps</Trans></h3>
606
+ <p><Trans>1. Install the application from the store.</Trans></p>
607
+ <p><Trans>2. Open the application on your phone.</Trans></p>
608
+ <p><strong><Trans>3. Click start, here, in your browser.</Trans></strong></p>
609
+ <p><Trans>4. Scan the QR codes with your phone.</Trans></p>
610
+ <p><Trans>5. And you are done!</Trans></p>
611
+ <a className="button" href="https://help.passbolt.com/" target="_blank" rel="noopener noreferrer">
612
+ <Icon name="life-ring"/>
613
+ <span><Trans>Read the documentation</Trans></span>
614
+ </a>
615
+ </div>
616
+ </div>
617
+ }
618
+ {this.state.step === 'in progress' &&
619
+ <div className="mobile-transfer-step-in-progress">
620
+ <div className="profile col6">
621
+ <h3><Trans>Transfer in progress...</Trans></h3>
622
+ <img id="qr-canvas" style={{width: `${QRCODE_WIDTH}px`, height: `${QRCODE_WIDTH}px`, marginBottom: '1em'}} src={this.getCurrentQrCodeSrc()}/>
623
+ <a className={`button cancel ${processingClassName}`} role="button" onClick={this.handleClickCancel}>
624
+ <Trans>Cancel</Trans>
625
+ </a>
626
+ </div>
627
+ <div className="avatar col4 push1 last">
628
+ <h3><Trans>Get started in 5 easy steps</Trans></h3>
629
+ <p><Trans>1. Install the application from the store.</Trans></p>
630
+ <p><Trans>2. Open the application on your phone.</Trans></p>
631
+ <p><Trans>3. Click start, here, in your browser.</Trans></p>
632
+ <p><Trans><strong>4. Scan the QR codes with your phone.</strong></Trans></p>
633
+ <p><Trans>5. And you are done!</Trans></p>
634
+ <a className="button" href="https://help.passbolt.com/" target="_blank" rel="noopener noreferrer">
635
+ <Icon name="life-ring"/>
636
+ <span><Trans>Read the documentation</Trans></span>
637
+ </a>
638
+ </div>
639
+ </div>
640
+ }
641
+ {this.state.step === 'complete' &&
642
+ <div className="mobile-transfer-step-complete">
643
+ <div className="profile col6">
644
+ <h3><Trans>Transfer complete!</Trans></h3>
645
+ <div className="feedback-card">
646
+ <AnimatedFeedback name='success' />
647
+ <div className="additional-information">
648
+ <p>
649
+ <Trans>You are now ready to continue the setup on your phone.</Trans>&nbsp;
650
+ <Trans>You can restart this process if you want to configure another phone.</Trans>
651
+ </p>
652
+ <p>
653
+ <a className={`button primary ${processingClassName}`} role="button" onClick={this.handleClickDone}>
654
+ <Trans>Configure another phone</Trans>
655
+ </a>
656
+ </p>
657
+ </div>
658
+ </div>
659
+ </div>
660
+ <div className="avatar col4 push1 last">
661
+ <h3><Trans>Get started in 5 easy steps</Trans></h3>
662
+ <p><Trans>1. Install the application from the store.</Trans></p>
663
+ <p><Trans>2. Open the application on your phone.</Trans></p>
664
+ <p><Trans>3. Click start, here, in your browser.</Trans></p>
665
+ <p><Trans>4. Scan the QR codes with your phone.</Trans></p>
666
+ <p><Trans><strong>5. And you are done!</strong></Trans></p>
667
+ <a className="button" href="https://help.passbolt.com/" target="_blank" rel="noopener noreferrer">
668
+ <Icon name="life-ring"/>
669
+ <span><Trans>Read the documentation</Trans></span>
670
+ </a>
671
+ </div>
672
+ </div>
673
+ }
674
+ {this.state.step === 'cancel' &&
675
+ <div className="mobile-transfer-step-error">
676
+ <div className="profile col6">
677
+ <h3><Trans>The operation was cancelled.</Trans></h3>
678
+ <div className="feedback-card">
679
+ <AnimatedFeedback name='error' />
680
+ <div className="additional-information">
681
+ <p>
682
+ <Trans>If there was an issue during the transfer, either the operation was cancelled on the mobile side,
683
+ or the authentication token expired.</Trans>&nbsp;
684
+ <Trans>Please try again later or contact your administrator.</Trans>
685
+ </p>
686
+ <p>
687
+ <a className={`button primary ${processingClassName}`} role="button" onClick={this.handleClickStart}>
688
+ <Trans>Restart</Trans>
689
+ </a>
690
+ </p>
691
+ </div>
692
+ </div>
693
+ </div>
694
+ <div className="avatar col4 push1 last">
695
+ <h3><Trans>Need some help?</Trans></h3>
696
+ <p><Trans>Contact your administrator with details about what went wrong.</Trans></p>
697
+ <p><Trans>Alternatively you can also get in touch with support on community forum or via the paid support channels.</Trans></p>
698
+ <a className="button" href="https://help.passbolt.com/" target="_blank" rel="noopener noreferrer">
699
+ <Icon name="life-ring"/>
700
+ <span><Trans>Help site</Trans></span>
701
+ </a>
702
+ </div>
703
+ </div>
704
+ }
705
+ {this.state.step === 'error' &&
706
+ <div className="mobile-transfer-step-error">
707
+ <div className="profile col6">
708
+ <h3><Trans>Oops, something went wrong</Trans></h3>
709
+ <div className="feedback-card">
710
+ <AnimatedFeedback name='error' />
711
+ <div className="additional-information">
712
+ <p>
713
+ <Trans>There was an issue during the transfer. Please try again later or contact your administrator.</Trans>
714
+ </p>
715
+ <p>
716
+ <a className={`button primary ${processingClassName}`} role="button" onClick={this.handleClickStart}>
717
+ <Trans>Restart</Trans>
718
+ </a>
719
+ </p>
720
+ </div>
721
+ </div>
722
+ <ShowErrorDetails error={this.state.error} />
723
+ </div>
724
+ <div className="avatar col4 push1 last">
725
+ <h3><Trans>Need some help?</Trans></h3>
726
+ <p><Trans>Contact your administrator with the error details.</Trans></p>
727
+ <p><Trans>Alternatively you can also get in touch with support on community forum or via the paid support channels.</Trans></p>
728
+ <a className="button" href="https://help.passbolt.com/" target="_blank" rel="noopener noreferrer">
729
+ <Icon name="life-ring"/>
730
+ <span><Trans>Help site</Trans></span>
731
+ </a>
732
+ </div>
733
+ </div>
734
+ }
735
+ </div>
736
+ </div>
737
+ );
738
+ }
739
+ }
740
+
741
+ TransferToMobile.contextType = AppContext;
742
+ TransferToMobile.propTypes = {
743
+ dialogContext: PropTypes.object, // The dialog context
744
+ userSettingsContext: PropTypes.object, // The user settings context
745
+ t: PropTypes.func, // The translation function
746
+ i18n: PropTypes.any // The i18n context translation
747
+ };
748
+
749
+ export default withDialog(withUserSettings(withTranslation('common')(TransferToMobile)));