passbolt-styleguide 3.7.3 → 3.7.4-alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/.vscode/launch.json +22 -0
  2. package/.vscode/settings.json +3 -0
  3. package/build/css/help.min.css +3 -3
  4. package/build/css/public.min.css +2 -2
  5. package/build/css/themes/default/api_authentication.min.css +3 -3
  6. package/build/css/themes/default/api_cloud.min.css +3 -3
  7. package/build/css/themes/default/api_main.min.css +3 -3
  8. package/build/css/themes/default/api_reports.min.css +3 -3
  9. package/build/css/themes/default/api_webinstaller.min.css +3 -3
  10. package/build/css/themes/default/ext_app.min.css +3 -3
  11. package/build/css/themes/default/ext_authentication.min.css +3 -3
  12. package/build/css/themes/default/ext_external.min.css +2 -2
  13. package/build/css/themes/default/ext_in_form_cta.min.css +3 -3
  14. package/build/css/themes/default/ext_in_form_menu.min.css +3 -3
  15. package/build/css/themes/default/ext_quickaccess.min.css +3 -3
  16. package/build/css/themes/midgar/api_authentication.min.css +3 -3
  17. package/build/css/themes/midgar/api_main.min.css +3 -3
  18. package/build/css/themes/midgar/api_reports.min.css +3 -3
  19. package/build/css/themes/midgar/ext_app.min.css +3 -3
  20. package/build/css/themes/midgar/ext_authentication.min.css +3 -3
  21. package/build/css/themes/midgar/ext_in_form_cta.min.css +3 -3
  22. package/build/css/themes/midgar/ext_in_form_menu.min.css +3 -3
  23. package/build/css/themes/midgar/ext_quickaccess.min.css +3 -3
  24. package/build/js/dist/api-account-recovery.js +1 -1
  25. package/build/js/dist/api-app.js +1 -1
  26. package/build/js/dist/api-recover.js +1 -1
  27. package/build/js/dist/api-setup.js +1 -1
  28. package/build/js/dist/api-triage.js +1 -1
  29. package/build/js/dist/api-vendors.js +1 -1
  30. package/build/js/dist/api-vendors.js.LICENSE.txt +54 -44
  31. package/commits.md +17 -0
  32. package/package.json +2 -2
  33. package/src/img/illustrations/wave-pin_my_extension.svg +1 -1
  34. package/src/img/third_party/brave.svg +1 -0
  35. package/src/img/third_party/chrome.svg +1 -0
  36. package/src/img/third_party/edge.svg +1 -0
  37. package/src/img/third_party/firefox.svg +1 -0
  38. package/src/img/third_party/vivaldi.svg +1 -0
  39. package/src/locales/en-UK/common.json +3 -5
  40. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.js +8 -2
  41. package/src/react-extension/components/Authentication/DisplayBrowserNotSupported/DisplayBrowserNotSupported.js +51 -13
  42. package/src/react-extension/components/Authentication/DisplayBrowserNotSupported/DisplayBrowserNotSupported.test.js +32 -9
  43. package/src/react-extension/components/Authentication/DisplayBrowserNotSupported/DisplayBrowserNotSupported.test.page.js +13 -10
  44. package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.js +0 -3
  45. package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.test.js +1 -1
  46. package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.test.page.js +6 -6
  47. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.js +2 -0
  48. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsInformation.js +2 -2
  49. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsInformation.test.js +7 -3
  50. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.js +3 -3
  51. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.js +2 -2
  52. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.js +3 -3
  53. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.js +2 -2
  54. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsInformation.js +2 -2
  55. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsInformation.test.js +3 -2
  56. package/src/react-extension/components/UserDetails/DisplayUserDetailsInformation/DisplayUserDetailsInformation.js +1 -1
  57. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsInformation/DisplayUserGroupDetailsInformation.js +2 -2
  58. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.js +2 -1
  59. package/src/react-extension/components/UserSetting/DisplayUserAccountRecovery/DisplayAccountRecoveryUserSettings.test.stories.js +12 -15
  60. package/src/img/third_party/firefox_logo-black.png +0 -0
  61. package/src/img/third_party/firefox_logo-white.png +0 -0
@@ -12,7 +12,7 @@
12
12
  * @since 2.11.0
13
13
  */
14
14
 
15
- import {render} from "@testing-library/react";
15
+ import {fireEvent, render, waitFor} from "@testing-library/react";
16
16
  import React from "react";
17
17
  import DisplayBrowserNotSupported from "./DisplayBrowserNotSupported";
18
18
  import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
@@ -47,24 +47,27 @@ export default class DisplayBrowserNotSupportedPage {
47
47
  }
48
48
 
49
49
  /**
50
- * Returns the download firefox button
50
+ * Returns the download button
51
51
  */
52
- get downloadFirefox() {
53
- return this._page.container.querySelectorAll('.browser-not-supported .form-actions .button.primary.big')[0].textContent;
52
+ get downloadButton() {
53
+ return this._page.container.querySelector('.browser-not-supported .form-actions .button.primary.big').textContent;
54
54
  }
55
55
 
56
56
  /**
57
- * Returns the download firefox button
57
+ * Returns the current link on the download button
58
58
  */
59
- get downloadChrome() {
60
- return this._page.container.querySelectorAll('.browser-not-supported .form-actions a')[1].textContent;
59
+ get downloadLink() {
60
+ return this._page.container.querySelector('.browser-not-supported .form-actions .button.primary.big').getAttribute('href');
61
61
  }
62
62
 
63
63
  /**
64
- * Returns the link why browser not supported
64
+ * Simulate a click on the desired button from the browser button list.
65
+ * @param {number} buttonIndex
65
66
  */
66
- get link() {
67
- return this._page.container.querySelectorAll('.browser-not-supported .form-actions a')[2].textContent;
67
+ async clickOnBrowserButton(buttonIndex) {
68
+ const button = this._page.container.querySelectorAll('.browser-not-supported .browser-button-list button')[buttonIndex];
69
+ fireEvent.click(button, {button: 0});
70
+ await waitFor(() => {});
68
71
  }
69
72
 
70
73
  /**
@@ -157,9 +157,6 @@ class AcceptLoginServerKeyChange extends Component {
157
157
  <label htmlFor="accept-new-key">
158
158
  <Trans>Yes I checked and it is all fine.</Trans>
159
159
  </label>
160
- {this.state.hasBeenValidated && this.state.errors.hasNotAccepted &&
161
- <div className="has-not-accepted error-message"><Trans>You must accept the new server key</Trans></div>
162
- }
163
160
  </div>
164
161
  <div className="form-actions">
165
162
  <button
@@ -47,6 +47,6 @@ describe("AcceptLoginServerKeyChange", () => {
47
47
  expect.assertions(2);
48
48
  await page.accept();
49
49
  expect(props.onAccept).not.toHaveBeenCalled();
50
- expect(page.checkedInputErrorMessage).toBe("You must accept the new server key");
50
+ expect(page.inputContainer.className).toBe("input checkbox error");
51
51
  });
52
52
  });
@@ -41,17 +41,17 @@ export default class AcceptLoginServerKeyChangePage {
41
41
  }
42
42
 
43
43
  /**
44
- * Returns the check input
44
+ * Returns the input container
45
45
  */
46
- get checkedInput() {
47
- return this._page.container.querySelector('#accept-new-key');
46
+ get inputContainer() {
47
+ return this._page.container.querySelector('.input.checkbox');
48
48
  }
49
49
 
50
50
  /**
51
- * Returns the checked input error message
51
+ * Returns the check input
52
52
  */
53
- get checkedInputErrorMessage() {
54
- return this._page.container.querySelector(".has-not-accepted.error-message")?.textContent;
53
+ get checkedInput() {
54
+ return this._page.container.querySelector('#accept-new-key');
55
55
  }
56
56
 
57
57
  /**
@@ -536,7 +536,9 @@ class DisplayResourcesList extends React.Component {
536
536
 
537
537
  return (
538
538
  <tr id={`resource_${resource.id}`} key={key} draggable="true" className={isSelected ? "selected" : ""}
539
+ /* eslint-disable react/no-unknown-property */
539
540
  unselectable={this.state.selectStrategy === "range" ? "on" : ""}
541
+ /* eslint-enable react/no-unknown-property */
540
542
  onClick={ev => this.handleResourceSelected(ev, resource)}
541
543
  onContextMenu={ev => this.handleResourceRightClick(ev, resource)}
542
544
  onDragStart={event => this.handleDragStartEvent(event, resource)}
@@ -387,7 +387,7 @@ class DisplayResourceDetailsInformation extends React.Component {
387
387
  </li>
388
388
  <li className="modified">
389
389
  <span className="label"><Trans>Modified</Trans></span>
390
- <span className="value">{modifiedDateTimeAgo}</span>
390
+ <span className="value" title={this.resource.modified}>{modifiedDateTimeAgo}</span>
391
391
  </li>
392
392
  <li className="modified-by">
393
393
  <span className="label"><Trans>Modified by</Trans></span>
@@ -395,7 +395,7 @@ class DisplayResourceDetailsInformation extends React.Component {
395
395
  </li>
396
396
  <li className="modified">
397
397
  <span className="label"><Trans>Created</Trans></span>
398
- <span className="value">{createdDateTimeAgo}</span>
398
+ <span className="value" title={this.resource.created}>{createdDateTimeAgo}</span>
399
399
  </li>
400
400
  <li className="modified-by">
401
401
  <span className="label"><Trans>Created by</Trans></span>
@@ -56,9 +56,11 @@ describe("See information", () => {
56
56
  page = new DisplayResourceDetailsInformationPage(context, props);
57
57
  await waitFor(() => {});
58
58
 
59
- const modificationDate = DateTime.fromISO(props.resourceWorkspaceContext.details.resource.modified).toRelative();
60
- const creationDate = DateTime.fromISO(props.resourceWorkspaceContext.details.resource.created).toRelative();
61
- expect.assertions(16);
59
+ const absoluteModificationDate = props.resourceWorkspaceContext.details.resource.modified;
60
+ const modificationDate = DateTime.fromISO(absoluteModificationDate).toRelative();
61
+ const absoluteCreationDate = props.resourceWorkspaceContext.details.resource.created;
62
+ const creationDate = DateTime.fromISO(absoluteCreationDate).toRelative();
63
+ expect.assertions(18);
62
64
  expect(page.displayInformationList.usernameLabel).toBe('Username');
63
65
  expect(page.displayInformationList.username.textContent).toBe(props.resourceWorkspaceContext.details.resource.username);
64
66
  expect(page.displayInformationList.passwordLabel).toBe('Password');
@@ -67,10 +69,12 @@ describe("See information", () => {
67
69
  expect(page.displayInformationList.uri.textContent).toBe(props.resourceWorkspaceContext.details.resource.uri);
68
70
  expect(page.displayInformationList.modifiedLabel(1)).toBe('Modified');
69
71
  expect(page.displayInformationList.modified(1).textContent).toBe(modificationDate);
72
+ expect(page.displayInformationList.modified(1).getAttribute("title")).toBe(absoluteModificationDate);
70
73
  expect(page.displayInformationList.modifiedByLabel(1)).toBe('Modified by');
71
74
  expect(page.displayInformationList.modifiedBy(1).textContent).toBe('ada@passbolt.com');
72
75
  expect(page.displayInformationList.modifiedLabel(2)).toBe('Created');
73
76
  expect(page.displayInformationList.modified(2).textContent).toBe(creationDate);
77
+ expect(page.displayInformationList.modified(2).getAttribute("title")).toBe(absoluteCreationDate);
74
78
  expect(page.displayInformationList.modifiedByLabel(2)).toBe('Created by');
75
79
  expect(page.displayInformationList.modifiedBy(2).textContent).toBe('ada@passbolt.com');
76
80
  expect(page.displayInformationList.locationLabel).toBe('Location');
@@ -246,8 +246,8 @@ class CreateResourceFolder extends Component {
246
246
  if (!name.length) {
247
247
  nameError = this.translate("A name is required.");
248
248
  }
249
- if (name.length > 64) {
250
- nameError = this.translate("A name can not be more than 64 char in length.");
249
+ if (name.length > 256) {
250
+ nameError = this.translate("A name can not be more than 256 char in length.");
251
251
  }
252
252
  return new Promise(resolve => {
253
253
  this.setState({nameError: nameError}, resolve);
@@ -293,7 +293,7 @@ class CreateResourceFolder extends Component {
293
293
  <input id="folder-name-input" name="name"
294
294
  ref={this.nameRef}
295
295
  type="text" value={this.state.name} placeholder={this.translate("Untitled folder")}
296
- maxLength="64" required="required"
296
+ maxLength="256" required="required"
297
297
  disabled={this.hasAllInputDisabled()}
298
298
  onChange={this.handleInputChange}
299
299
  autoComplete='off' autoFocus={true}
@@ -78,9 +78,9 @@ describe("Create Folder", () => {
78
78
  expect(page.hasInvalidName).toBeTruthy();
79
79
  });
80
80
 
81
- it('AS LU I should not fill a folder name longer than 64 characters', async() => {
81
+ it('AS LU I should not fill a folder name longer than 256 characters', async() => {
82
82
  expect.assertions(1);
83
- await page.create({name: '1111111111 1111111111 1111111111 1111111111 1111111111 1111111111 1111'});
83
+ await page.create({name: '11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'});
84
84
  expect(page.hasInvalidName).toBeTruthy();
85
85
  });
86
86
  });
@@ -276,8 +276,8 @@ class RenameResourceFolder extends Component {
276
276
  if (!name.length) {
277
277
  nameError = this.translate("A name is required.");
278
278
  }
279
- if (name.length > 64) {
280
- nameError = this.translate("A name can not be more than 64 char in length.");
279
+ if (name.length > 256) {
280
+ nameError = this.translate("A name can not be more than 256 char in length.");
281
281
  }
282
282
  return new Promise(resolve => {
283
283
  this.setState({nameError: nameError}, resolve);
@@ -323,7 +323,7 @@ class RenameResourceFolder extends Component {
323
323
  <input id="folder-name-input" name="name"
324
324
  ref={this.nameRef}
325
325
  type="text" value={this.state.name} placeholder={this.translate("Untitled folder")}
326
- maxLength="64" required="required"
326
+ maxLength="256" required="required"
327
327
  onChange={this.handleInputChange}
328
328
  disabled={this.hasAllInputDisabled()}
329
329
  autoComplete="off" autoFocus={true}
@@ -78,9 +78,9 @@ describe("Rename Folder", () => {
78
78
  expect(page.hasInvalidName).toBeTruthy();
79
79
  });
80
80
 
81
- it('AS LU I should not fill a folder name longer than 64 characters', async() => {
81
+ it('AS LU I should not fill a folder name longer than 256 characters', async() => {
82
82
  expect.assertions(1);
83
- await page.rename({name: '1111111111 1111111111 1111111111 1111111111 1111111111 1111111111 1111'});
83
+ await page.rename({name: '11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'});
84
84
  expect(page.hasInvalidName).toBeTruthy();
85
85
  });
86
86
  });
@@ -155,7 +155,7 @@ class DisplayResourceFolderDetailsInformation extends React.Component {
155
155
  </li>
156
156
  <li className="modified">
157
157
  <span className="label"><Trans>Modified</Trans></span>
158
- <span className="value">{modifiedDateTimeAgo}</span>
158
+ <span className="value" title={this.folder.modified}>{modifiedDateTimeAgo}</span>
159
159
  </li>
160
160
  <li className="modified-by">
161
161
  <span className="label"><Trans>Modified by</Trans></span>
@@ -163,7 +163,7 @@ class DisplayResourceFolderDetailsInformation extends React.Component {
163
163
  </li>
164
164
  <li className="modified">
165
165
  <span className="label"><Trans>Created</Trans></span>
166
- <span className="value">{createdDateTimeAgo}</span>
166
+ <span className="value" title={this.folder.created}>{createdDateTimeAgo}</span>
167
167
  </li>
168
168
  <li className="modified-by">
169
169
  <span className="label"><Trans>Created by</Trans></span>
@@ -57,16 +57,17 @@ describe("See information", () => {
57
57
  it('I should be able to identify each information name', async() => {
58
58
  mockContextRequest(copyClipboardMockImpl);
59
59
  jest.spyOn(ActionFeedbackContext._currentValue, 'displaySuccess').mockImplementation(() => {});
60
-
61
- expect.assertions(12);
60
+ expect.assertions(14);
62
61
  expect(page.displayInformationList.usernameLabel).toBe('Name');
63
62
  expect(page.displayInformationList.username.textContent).toBe(props.resourceWorkspaceContext.details.folder.name);
64
63
  expect(page.displayInformationList.modifiedLabel(1)).toBe('Modified');
65
64
  expect(page.displayInformationList.modified(1).textContent).toContain('ago');
65
+ expect(page.displayInformationList.modified(1).getAttribute("title")).toBe('2020-02-01T00:00:00+00:00');
66
66
  expect(page.displayInformationList.modifiedByLabel(1)).toBe('Modified by');
67
67
  expect(page.displayInformationList.modifiedBy(1).textContent).toBe('ada@passbolt.com');
68
68
  expect(page.displayInformationList.modifiedLabel(2)).toBe('Created');
69
69
  expect(page.displayInformationList.modified(2).textContent).toContain('ago');
70
+ expect(page.displayInformationList.modified(2).getAttribute("title")).toBe('2020-02-01T00:00:00+00:00');
70
71
  expect(page.displayInformationList.modifiedByLabel(2)).toBe('Created by');
71
72
  expect(page.displayInformationList.modifiedBy(2).textContent).toBe('ada@passbolt.com');
72
73
  expect(page.displayInformationList.locationLabel).toBe('Location');
@@ -158,7 +158,7 @@ class DisplayUserDetailsInformation extends React.Component {
158
158
  </li>
159
159
  <li className="modified">
160
160
  <span className="label"><Trans>Modified</Trans></span>
161
- <span className="value">{modified}</span>
161
+ <span className="value" title={this.user.modified}>{modified}</span>
162
162
  </li>
163
163
  <li className="status">
164
164
  <span className="label"><Trans>Status</Trans></span>
@@ -107,11 +107,11 @@ class DisplayUserGroupDetailsInformation extends React.Component {
107
107
  <ul>
108
108
  <li className="created">
109
109
  <span className="label"><Trans>Created</Trans></span>
110
- <span className="value">{created}</span>
110
+ <span className="value" title={this.group.created}>{created}</span>
111
111
  </li>
112
112
  <li className="modified">
113
113
  <span className="label"><Trans>Modified</Trans></span>
114
- <span className="value">{modified}</span>
114
+ <span className="value" title={this.group.modified}>{modified}</span>
115
115
  </li>
116
116
  <li className="modified-by">
117
117
  <span className="label"><Trans>Modified by</Trans></span>
@@ -274,6 +274,7 @@ class EnterNewPassphrase extends React.Component {
274
274
  }
275
275
 
276
276
  render() {
277
+ const entropy = this.state.hintClassNames.notInDictionary === "error" ? 0 : this.state.passphraseEntropy;
277
278
  return (
278
279
  <div className="grid grid-responsive-12 profile-passphrase">
279
280
  <div className="row">
@@ -291,7 +292,7 @@ class EnterNewPassphrase extends React.Component {
291
292
  securityToken={this.props.context.userSettings.getSecurityToken()}
292
293
  onChange={this.handlePassphraseChange}
293
294
  disabled={!this.areActionsAllowed}/>
294
- <PasswordComplexity entropy={this.state.passphraseEntropy}/>
295
+ <PasswordComplexity entropy={entropy}/>
295
296
  </div>
296
297
  <div className="password-hints">
297
298
  <ul>
@@ -42,21 +42,18 @@ const getTemplateArgs = () => ({
42
42
  accountRecoveryContext: {
43
43
  status: "approved",
44
44
  loadAccountRecoveryPolicy: () => {},
45
- getPolicy: () => {
46
- return {
47
- policy: "opt-out",
48
- };
49
- },
50
- getRequestor: () => {
51
- return {
52
- profile: {
53
- first_name: "Ada",
54
- last_name: "Lovelace"
55
- },
56
- gpgkey: {
57
- fingerprint: "848E95CC7493129AD862583129B81CA8936023DD"
58
- }};
59
- },
45
+ getPolicy: () => ({
46
+ policy: "opt-out",
47
+ }),
48
+ getRequestor: () => ({
49
+ profile: {
50
+ first_name: "Ada",
51
+ last_name: "Lovelace"
52
+ },
53
+ gpgkey: {
54
+ fingerprint: "848E95CC7493129AD862583129B81CA8936023DD"
55
+ }
56
+ }),
60
57
  getRequestedDate: () => "2021-05-25T09:08:34.123"
61
58
  }
62
59
  });