passbolt-styleguide 4.10.2 → 4.11.0-alpha.2

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 (99) hide show
  1. package/build/css/help.min.css +3 -3
  2. package/build/css/public.min.css +2 -2
  3. package/build/css/themes/default/api_authentication.min.css +3 -3
  4. package/build/css/themes/default/api_cloud.min.css +3 -3
  5. package/build/css/themes/default/api_main.min.css +3 -3
  6. package/build/css/themes/default/api_reports.min.css +3 -3
  7. package/build/css/themes/default/api_webinstaller.min.css +3 -3
  8. package/build/css/themes/default/ext_app.min.css +3 -3
  9. package/build/css/themes/default/ext_authentication.min.css +3 -3
  10. package/build/css/themes/default/ext_external.min.css +2 -2
  11. package/build/css/themes/default/ext_in_form_cta.min.css +3 -3
  12. package/build/css/themes/default/ext_in_form_menu.min.css +3 -3
  13. package/build/css/themes/default/ext_quickaccess.min.css +3 -3
  14. package/build/css/themes/midgar/api_authentication.min.css +3 -3
  15. package/build/css/themes/midgar/api_main.min.css +3 -3
  16. package/build/css/themes/midgar/api_reports.min.css +3 -3
  17. package/build/css/themes/midgar/ext_app.min.css +3 -3
  18. package/build/css/themes/midgar/ext_authentication.min.css +3 -3
  19. package/build/css/themes/midgar/ext_in_form_cta.min.css +3 -3
  20. package/build/css/themes/midgar/ext_in_form_menu.min.css +3 -3
  21. package/build/css/themes/midgar/ext_quickaccess.min.css +3 -3
  22. package/build/css/themes/solarized_dark/api_authentication.min.css +1 -1
  23. package/build/css/themes/solarized_dark/api_main.min.css +1 -1
  24. package/build/css/themes/solarized_dark/api_reports.min.css +1 -1
  25. package/build/css/themes/solarized_dark/ext_app.min.css +1 -1
  26. package/build/css/themes/solarized_dark/ext_authentication.min.css +1 -1
  27. package/build/css/themes/solarized_dark/ext_in_form_cta.min.css +1 -1
  28. package/build/css/themes/solarized_dark/ext_in_form_menu.min.css +1 -1
  29. package/build/css/themes/solarized_dark/ext_quickaccess.min.css +1 -1
  30. package/build/css/themes/solarized_light/api_authentication.min.css +1 -1
  31. package/build/css/themes/solarized_light/api_main.min.css +1 -1
  32. package/build/css/themes/solarized_light/api_reports.min.css +1 -1
  33. package/build/css/themes/solarized_light/ext_app.min.css +1 -1
  34. package/build/css/themes/solarized_light/ext_authentication.min.css +1 -1
  35. package/build/css/themes/solarized_light/ext_in_form_cta.min.css +1 -1
  36. package/build/css/themes/solarized_light/ext_in_form_menu.min.css +1 -1
  37. package/build/css/themes/solarized_light/ext_quickaccess.min.css +1 -1
  38. package/build/js/dist/api-app.js +1 -1
  39. package/build/js/dist/api-app.js.LICENSE.txt +29 -1
  40. package/build/js/dist/api-vendors.js +1 -1
  41. package/build/js/dist/api-vendors.js.LICENSE.txt +8 -0
  42. package/jest.config.json +2 -1
  43. package/package.json +1 -1
  44. package/src/react-extension/ApiApp.js +2 -0
  45. package/src/react-extension/ExtApp.js +7 -8
  46. package/src/react-extension/ExtBootstrapApp.js +2 -0
  47. package/src/react-extension/components/Administration/AdministrationWorkspace.js +29 -2
  48. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.js +66 -0
  49. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.data.js +3 -1
  50. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.js +60 -1
  51. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.page.js +24 -0
  52. package/src/react-extension/components/Administration/DisplayContentTypesEncryptedMetadataAdministration/DisplayContentTypesEncryptedMetadataAdministration.js +421 -0
  53. package/src/react-extension/components/Administration/DisplayContentTypesEncryptedMetadataAdministration/DisplayContentTypesEncryptedMetadataAdministration.test.data.js +77 -0
  54. package/src/react-extension/components/Administration/DisplayContentTypesEncryptedMetadataAdministration/DisplayContentTypesEncryptedMetadataAdministration.test.js +337 -0
  55. package/src/react-extension/components/Administration/DisplayContentTypesEncryptedMetadataAdministration/DisplayContentTypesEncryptedMetadataAdministration.test.page.js +277 -0
  56. package/src/react-extension/components/Administration/DisplayContentTypesEncryptedMetadataAdministration/DisplayContentTypesEncryptedMetadataAdministration.test.stories.js +54 -0
  57. package/src/react-extension/components/Administration/DisplayContentTypesEncryptedMetadataAdministration/DisplayContentTypesEncryptedMetadataAdministrationActions.js +49 -0
  58. package/src/react-extension/components/Administration/DisplayContentTypesEncryptedMetadataAdministration/DisplayContentTypesEncryptedMetadataAdministrationActions.test.data.js +26 -0
  59. package/src/react-extension/components/Administration/DisplayContentTypesEncryptedMetadataAdministration/DisplayContentTypesEncryptedMetadataAdministrationActions.test.js +50 -0
  60. package/src/react-extension/components/Administration/DisplayContentTypesEncryptedMetadataAdministration/DisplayContentTypesEncryptedMetadataAdministrationActions.test.page.js +71 -0
  61. package/src/react-extension/components/Administration/DisplayContentTypesMetadataKeyAdministration/DisplayContentTypesMetadataKeyAdministration.js +422 -0
  62. package/src/react-extension/components/Administration/DisplayContentTypesMetadataKeyAdministration/DisplayContentTypesMetadataKeyAdministration.test.data.js +158 -0
  63. package/src/react-extension/components/Administration/DisplayContentTypesMetadataKeyAdministration/DisplayContentTypesMetadataKeyAdministration.test.js +169 -0
  64. package/src/react-extension/components/Administration/DisplayContentTypesMetadataKeyAdministration/DisplayContentTypesMetadataKeyAdministration.test.page.js +154 -0
  65. package/src/react-extension/components/Administration/DisplayContentTypesMetadataKeyAdministration/DisplayContentTypesMetadataKeyAdministration.test.stories.js +50 -0
  66. package/src/react-extension/contexts/AdministrationWorkspaceContext.js +14 -3
  67. package/src/react-extension/contexts/NavigationContext.js +18 -0
  68. package/src/react-quickaccess/ExtQuickAccess.js +3 -3
  69. package/src/react-quickaccess/components/ConfirmCreatePage/ConfirmCreatePage.js +1 -1
  70. package/src/react-quickaccess/components/LoginPage/LoginPage.js +1 -1
  71. package/src/shared/models/entity/abstract/entityV2.js +144 -8
  72. package/src/shared/models/entity/abstract/entityV2.test.data.js +30 -11
  73. package/src/shared/models/entity/abstract/entityV2.test.js +256 -22
  74. package/src/shared/models/entity/gpgkey/external/externalGpgKeyPairEntity.js +140 -0
  75. package/src/shared/models/entity/gpgkey/external/externalGpgKeyPairEntity.test.js +57 -0
  76. package/src/shared/models/entity/gpgkey/externalGpgKeyCollection.js +88 -0
  77. package/src/shared/models/entity/gpgkey/externalGpgKeyCollection.test.js +40 -0
  78. package/src/shared/models/entity/gpgkey/externalGpgKeyEntity.js +308 -0
  79. package/src/shared/models/entity/gpgkey/externalGpgKeyEntity.test.data.js +123 -0
  80. package/src/shared/models/entity/gpgkey/externalGpgKeyEntity.test.fixtures.js +112 -0
  81. package/src/shared/models/entity/gpgkey/externalGpgKeyEntity.test.js +163 -0
  82. package/src/shared/models/entity/metadata/metadataKeyEntity.js +21 -0
  83. package/src/shared/models/entity/metadata/metadataKeyEntity.test.data.js +2 -1
  84. package/src/shared/models/entity/metadata/metadataKeyEntity.test.js +32 -2
  85. package/src/shared/models/entity/metadata/metadataTypesSettingsEntity.js +61 -8
  86. package/src/shared/models/entity/metadata/metadataTypesSettingsEntity.test.data.js +10 -0
  87. package/src/shared/models/entity/metadata/metadataTypesSettingsEntity.test.js +80 -9
  88. package/src/shared/models/entity/metadata/metadataTypesSettingsFormEntity.js +95 -0
  89. package/src/shared/models/entity/metadata/metadataTypesSettingsFormEntity.test.js +140 -0
  90. package/src/shared/models/entity/resourceType/resourceTypesCollection.js +9 -0
  91. package/src/shared/models/entity/resourceType/resourceTypesCollection.test.js +26 -0
  92. package/src/shared/services/serviceWorker/crypto/gpgServiceWorkerService.js +53 -0
  93. package/src/shared/services/serviceWorker/crypto/gpgServiceWorkerService.test.js +64 -0
  94. package/src/shared/services/serviceWorker/metadata/metadataKeysServiceWorkerService.js +37 -0
  95. package/src/shared/services/serviceWorker/metadata/metadataKeysServiceWorkerService.test.js +43 -0
  96. package/src/shared/services/serviceWorker/metadata/metadataSettingsServiceWorkerService.js +64 -0
  97. package/src/shared/services/serviceWorker/metadata/metadataSettingsServiceWorkerService.test.js +81 -0
  98. package/test/fixture/pgpKeys/keys.js +11 -0
  99. package/test/matchers/toThrowEntityValidationError.js +2 -2
@@ -1631,6 +1631,10 @@ object-assign
1631
1631
  !*** ./node_modules/core-js-pure/stable/symbol/index.js ***!
1632
1632
  \**********************************************************/
1633
1633
 
1634
+ /*!**********************************************************!*\
1635
+ !*** ./node_modules/memoize-one/dist/memoize-one.esm.js ***!
1636
+ \**********************************************************/
1637
+
1634
1638
  /*!***********************************************************!*\
1635
1639
  !*** ./node_modules/core-js-pure/actual/instance/push.js ***!
1636
1640
  \***********************************************************/
@@ -1795,6 +1799,10 @@ object-assign
1795
1799
  !*** ./node_modules/i18next-http-backend/esm/getFetch.cjs ***!
1796
1800
  \************************************************************/
1797
1801
 
1802
+ /*!************************************************************!*\
1803
+ !*** ./node_modules/validator/es/lib/util/assertString.js ***!
1804
+ \************************************************************/
1805
+
1798
1806
  /*!************************************************************!*\
1799
1807
  !*** ./node_modules/xregexp/lib/addons/unicode-scripts.js ***!
1800
1808
  \************************************************************/
package/jest.config.json CHANGED
@@ -27,6 +27,7 @@
27
27
  "src/shared/**/*.{js,jsx}",
28
28
  "!src/**/*.test.js",
29
29
  "!src/**/*.test.stories.js",
30
- "!src/**/*.test.data.js"
30
+ "!src/**/*.test.data.js",
31
+ "!src/**/*.test.page.js"
31
32
  ]
32
33
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "passbolt-styleguide",
3
- "version": "4.10.2",
3
+ "version": "4.11.0-alpha.2",
4
4
  "license": "AGPL-3.0",
5
5
  "copyright": "Copyright 2023 Passbolt SA",
6
6
  "description": "Passbolt styleguide contains common styling assets used by the different sites, plugin, etc.",
@@ -89,6 +89,8 @@ class ApiApp extends Component {
89
89
  "/app/administration/password-policies",
90
90
  "/app/administration/user-passphrase-policies",
91
91
  "/app/administration/password-expiry",
92
+ "/app/administration/content-types/metadata",
93
+ "/app/administration/content-types/metadata-key",
92
94
  ]}/>
93
95
  <Route path="/app/administration">
94
96
  <AdministrationWorkspaceContextProvider>
@@ -84,11 +84,6 @@ import MetadataTypesSettingsLocalStorageContextProvider from "../shared/context/
84
84
  * - Most of the user settings MFA screen. Because of duo constraints.
85
85
  */
86
86
  class ExtApp extends Component {
87
- /*
88
- * =============================================================
89
- * View
90
- * =============================================================
91
- */
92
87
  render() {
93
88
  const accountRecoveryUserService = new ExtAppAccountRecoveryUserService(this.props.port);
94
89
  return (
@@ -221,6 +216,8 @@ class ExtApp extends Component {
221
216
  "/app/administration/password-policies",
222
217
  "/app/administration/user-passphrase-policies",
223
218
  "/app/administration/password-expiry",
219
+ "/app/administration/content-types/metadata",
220
+ "/app/administration/content-types/metadata-key",
224
221
  ]}>
225
222
  <AdministrationWorkspaceContextProvider>
226
223
  <AdminAccountRecoveryContextProvider>
@@ -229,9 +226,11 @@ class ExtApp extends Component {
229
226
  <AdminPasswordPoliciesContextProvider>
230
227
  <AdministrationUserPassphrasePoliciesContextProvider>
231
228
  <AdministrationPasswordExpiryContextProvider>
232
- <ManageDialogs/>
233
- <ManageWorkflows/>
234
- <AdministrationWorkspace/>
229
+ <ResourceTypesLocalStorageContextProvider>
230
+ <ManageDialogs/>
231
+ <ManageWorkflows/>
232
+ <AdministrationWorkspace/>
233
+ </ResourceTypesLocalStorageContextProvider>
235
234
  </AdministrationPasswordExpiryContextProvider>
236
235
  </AdministrationUserPassphrasePoliciesContextProvider>
237
236
  </AdminPasswordPoliciesContextProvider>
@@ -111,6 +111,8 @@ class ExtBootstrapApp extends Component {
111
111
  "/app/administration/password-policies",
112
112
  "/app/administration/user-passphrase-policies",
113
113
  "/app/administration/password-expiry",
114
+ "/app/administration/content-types/metadata",
115
+ "/app/administration/content-types/metadata-key",
114
116
  "/app/folders/view/:filterByFolderId",
115
117
  "/app/groups/view/:selectedGroupId",
116
118
  "/app/groups/edit/:selectedGroupId",
@@ -45,6 +45,10 @@ import DisplayAdministrationUserPassphrasePolicies from "./DisplayAdministration
45
45
  import DisplayAdministrationPasswordExpiry from "./DisplayAdministrationPasswordExpiry/DisplayAdministrationPasswordExpiry";
46
46
  import DisplayHttpError from "../Common/Error/DisplayHttpError/DisplayHttpError";
47
47
  import DisplayHealthcheckAdministration from "./DisplayHealthcheckAdministration/DisplayHealthcheckAdministration";
48
+ import DisplayContentTypesEncryptedMetadataAdministration
49
+ from "./DisplayContentTypesEncryptedMetadataAdministration/DisplayContentTypesEncryptedMetadataAdministration";
50
+ import DisplayContentTypesMetadataKeyAdministration
51
+ from "./DisplayContentTypesMetadataKeyAdministration/DisplayContentTypesMetadataKeyAdministration";
48
52
 
49
53
  class AdministrationWorkspace extends Component {
50
54
  /**
@@ -159,6 +163,22 @@ class AdministrationWorkspace extends Component {
159
163
  return AdministrationWorkspaceMenuTypes.PASSWORD_EXPIRY === this.props.administrationWorkspaceContext.selectedAdministration;
160
164
  }
161
165
 
166
+ /**
167
+ * If content types encrypted metadata is selected
168
+ * @returns {boolean}
169
+ */
170
+ isContentTypesEncryptedMetadataSelected() {
171
+ return AdministrationWorkspaceMenuTypes.CONTENT_TYPES_ENCRYPTED_METADATA === this.props.administrationWorkspaceContext.selectedAdministration;
172
+ }
173
+
174
+ /**
175
+ * If content types metadata key is selected
176
+ * @returns {boolean}
177
+ */
178
+ isContentTypesMetadataKeySelected() {
179
+ return AdministrationWorkspaceMenuTypes.CONTENT_TYPES_METADATA_KEY === this.props.administrationWorkspaceContext.selectedAdministration;
180
+ }
181
+
162
182
  /**
163
183
  * If the page access is denied
164
184
  * @returns {boolean}
@@ -194,8 +214,9 @@ class AdministrationWorkspace extends Component {
194
214
  </div>
195
215
  <div className="header third">
196
216
  <div className="col1 main-action-wrapper">
197
- </div>
198
- <AdministrationWorkspaceAction/>
217
+ </div>{/* Deprecated */}
218
+ <AdministrationWorkspaceAction/>{/* Deprecated */}
219
+ <div id="administration-actions-content-action"></div>
199
220
  </div>
200
221
  <div className="panel main">
201
222
  <div>
@@ -260,6 +281,12 @@ class AdministrationWorkspace extends Component {
260
281
  {this.isHealthcheckSelected() &&
261
282
  <DisplayHealthcheckAdministration/>
262
283
  }
284
+ {this.isContentTypesEncryptedMetadataSelected() &&
285
+ <DisplayContentTypesEncryptedMetadataAdministration/>
286
+ }
287
+ {this.isContentTypesMetadataKeySelected() &&
288
+ <DisplayContentTypesMetadataKeyAdministration/>
289
+ }
263
290
  </div>
264
291
  </div>
265
292
  </div>
@@ -156,6 +156,14 @@ class DisplayAdministrationMenu extends React.Component {
156
156
  return this.canIUse('healthcheckUi');
157
157
  }
158
158
 
159
+ /**
160
+ * Can I use the metadata plugin
161
+ * @returns {boolean}
162
+ */
163
+ get canIUseMetadata() {
164
+ return this.canIUse('metadata');
165
+ }
166
+
159
167
  /**
160
168
  * Bind callbacks methods
161
169
  */
@@ -175,6 +183,8 @@ class DisplayAdministrationMenu extends React.Component {
175
183
  this.handleUserPassphrasePoliciesClick = this.handleUserPassphrasePoliciesClick.bind(this);
176
184
  this.handlePasswordExpirySettingsClick = this.handlePasswordExpirySettingsClick.bind(this);
177
185
  this.handleHealthcheckClick = this.handleHealthcheckClick.bind(this);
186
+ this.handleContentTypesEncryptedMetadataClick = this.handleContentTypesEncryptedMetadataClick.bind(this);
187
+ this.handleContentTypesMetadataKeyClick = this.handleContentTypesMetadataKeyClick.bind(this);
178
188
  }
179
189
 
180
190
  /**
@@ -282,6 +292,20 @@ class DisplayAdministrationMenu extends React.Component {
282
292
  this.props.navigationContext.onGoToAdministrationHealthcheckRequested();
283
293
  }
284
294
 
295
+ /**
296
+ * Handle when the user click on the content types encrypted metadata settings menu
297
+ */
298
+ handleContentTypesEncryptedMetadataClick() {
299
+ this.props.navigationContext.onGoToAdministrationContentTypesEncryptedMetadataRequested();
300
+ }
301
+
302
+ /**
303
+ * Handle when the user click on the content types metadata key settings menu
304
+ */
305
+ handleContentTypesMetadataKeyClick() {
306
+ this.props.navigationContext.onGoToAdministrationContentTypesMetadataKeyRequested();
307
+ }
308
+
285
309
  /**
286
310
  * If MFA menu is selected
287
311
  * @returns {boolean}
@@ -402,6 +426,22 @@ class DisplayAdministrationMenu extends React.Component {
402
426
  return AdministrationWorkspaceMenuTypes.HEALTHCHECK === this.props.administrationWorkspaceContext.selectedAdministration;
403
427
  }
404
428
 
429
+ /**
430
+ * If content types encrypted metadata menu is selected
431
+ * @returns {boolean}
432
+ */
433
+ isContentTypesEncryptedMetadataSelected() {
434
+ return AdministrationWorkspaceMenuTypes.CONTENT_TYPES_ENCRYPTED_METADATA === this.props.administrationWorkspaceContext.selectedAdministration;
435
+ }
436
+
437
+ /**
438
+ * If content types metadata key menu is selected
439
+ * @returns {boolean}
440
+ */
441
+ isContentTypesMetadataKeySelected() {
442
+ return AdministrationWorkspaceMenuTypes.CONTENT_TYPES_METADATA_KEY === this.props.administrationWorkspaceContext.selectedAdministration;
443
+ }
444
+
405
445
  /**
406
446
  * Render the component
407
447
  * @returns {JSX}
@@ -589,6 +629,32 @@ class DisplayAdministrationMenu extends React.Component {
589
629
  </div>
590
630
  </li>
591
631
  }
632
+ {this.canIUseMetadata &&
633
+ <li id="encrypted_metadata_menu">
634
+ <div className={`row ${this.isContentTypesEncryptedMetadataSelected() ? "selected" : ""}`}>
635
+ <div className="main-cell-wrapper">
636
+ <div className="main-cell">
637
+ <button className="link no-border" type="button" onClick={this.handleContentTypesEncryptedMetadataClick}>
638
+ <span><Trans>Encrypted metadata</Trans></span>
639
+ </button>
640
+ </div>
641
+ </div>
642
+ </div>
643
+ </li>
644
+ }
645
+ {this.canIUseMetadata &&
646
+ <li id="metadata_key_menu">
647
+ <div className={`row ${this.isContentTypesMetadataKeySelected() ? "selected" : ""}`}>
648
+ <div className="main-cell-wrapper">
649
+ <div className="main-cell">
650
+ <button className="link no-border" type="button" onClick={this.handleContentTypesMetadataKeyClick}>
651
+ <span><Trans>Metadata key</Trans></span>
652
+ </button>
653
+ </div>
654
+ </div>
655
+ </div>
656
+ </li>
657
+ }
592
658
  </ul>
593
659
  </div>
594
660
  );
@@ -36,7 +36,9 @@ export function defaultProps(data = {}) {
36
36
  onGoToAdministrationRbacsRequested: jest.fn(),
37
37
  onGoToAdministrationUserPassphrasePoliciesRequested: jest.fn(),
38
38
  onGoToAdministrationPasswordExpirySettingsRequested: jest.fn(),
39
- onGoToAdministrationHealthcheckRequested: jest.fn()
39
+ onGoToAdministrationHealthcheckRequested: jest.fn(),
40
+ onGoToAdministrationContentTypesEncryptedMetadataRequested: jest.fn(),
41
+ onGoToAdministrationContentTypesMetadataKeyRequested: jest.fn(),
40
42
  }
41
43
  }, data);
42
44
  }
@@ -16,7 +16,6 @@
16
16
  * Unit tests on DisplayAdministrationMenu in regard of specifications
17
17
  */
18
18
 
19
-
20
19
  import DisplayAdministrationMenuPage from "./DisplayAdministrationMenu.test.page";
21
20
  import {AdministrationWorkspaceMenuTypes} from "../../../contexts/AdministrationWorkspaceContext";
22
21
  import {defaultAppContext, defaultProps} from "./DisplayAdministrationMenu.test.data";
@@ -356,4 +355,64 @@ describe("As AD I can see the administration menu", () => {
356
355
  expect(page.passwordExpirySettings).toBeNull();
357
356
  });
358
357
  });
358
+
359
+ describe("As a signed-in administrator on the administration workspace, I can see the Content Type Encrypted metadata option in the left-side bar", () => {
360
+ it('If the feature flag is true, the menu should be visible', async() => {
361
+ expect.assertions(4);
362
+ const props = defaultProps({
363
+ administrationWorkspaceContext: {selectedAdministration: AdministrationWorkspaceMenuTypes.CONTENT_TYPES_ENCRYPTED_METADATA}
364
+ }); // The props to pass
365
+ page = new DisplayAdministrationMenuPage(context, props);
366
+ expect(page.exists()).toBeTruthy();
367
+ await page.gotoContentTypesEncryptedMetadata();
368
+ expect(page.contentTypesEncryptedMetadata).toBeTruthy();
369
+ expect(page.menuSelected).toBe('Encrypted metadata');
370
+ expect(props.navigationContext.onGoToAdministrationContentTypesEncryptedMetadataRequested).toHaveBeenCalled();
371
+ });
372
+
373
+ it('If the feature flag is false, the menu should not be visible', async() => {
374
+ expect.assertions(2);
375
+ const props = defaultProps({
376
+ context: {
377
+ siteSettings: {
378
+ canIUse: feature => feature !== "metadata"
379
+ }
380
+ },
381
+ administrationWorkspaceContext: {selectedAdministration: AdministrationWorkspaceMenuTypes.CONTENT_TYPES_ENCRYPTED_METADATA}
382
+ }); // The props to pass
383
+ page = new DisplayAdministrationMenuPage(context, props);
384
+ expect(page.exists()).toBeTruthy();
385
+ expect(page.contentTypesEncryptedMetadata).toBeNull();
386
+ });
387
+ });
388
+
389
+ describe("As a signed-in administrator on the administration workspace, I can see the Content Type Metadata key option in the left-side bar", () => {
390
+ it('If the feature flag is true, the menu should be visible', async() => {
391
+ expect.assertions(4);
392
+ const props = defaultProps({
393
+ administrationWorkspaceContext: {selectedAdministration: AdministrationWorkspaceMenuTypes.CONTENT_TYPES_METADATA_KEY}
394
+ }); // The props to pass
395
+ page = new DisplayAdministrationMenuPage(context, props);
396
+ expect(page.exists()).toBeTruthy();
397
+ await page.gotoContentTypesMetadataKey();
398
+ expect(page.contentTypesMetadataKey).toBeTruthy();
399
+ expect(page.menuSelected).toBe('Metadata key');
400
+ expect(props.navigationContext.onGoToAdministrationContentTypesMetadataKeyRequested).toHaveBeenCalled();
401
+ });
402
+
403
+ it('If the feature flag is false, the menu should not be visible', async() => {
404
+ expect.assertions(2);
405
+ const props = defaultProps({
406
+ context: {
407
+ siteSettings: {
408
+ canIUse: feature => feature !== "metadata"
409
+ }
410
+ },
411
+ administrationWorkspaceContext: {selectedAdministration: AdministrationWorkspaceMenuTypes.CONTENT_TYPES_METADATA_KEY}
412
+ }); // The props to pass
413
+ page = new DisplayAdministrationMenuPage(context, props);
414
+ expect(page.exists()).toBeTruthy();
415
+ expect(page.contentTypesMetadataKey).toBeNull();
416
+ });
417
+ });
359
418
  });
@@ -153,6 +153,20 @@ export default class DisplayAdministrationMenuPage {
153
153
  return this._page.container.querySelector('#password_expiry_menu .row .main-cell-wrapper .main-cell button');
154
154
  }
155
155
 
156
+ /**
157
+ * Returns the Content Types Encrypted Metadata.
158
+ */
159
+ get contentTypesEncryptedMetadata() {
160
+ return this._page.container.querySelector('#encrypted_metadata_menu .row .main-cell-wrapper .main-cell button');
161
+ }
162
+
163
+ /**
164
+ * Returns the Content Types Encrypted Metadata.
165
+ */
166
+ get contentTypesMetadataKey() {
167
+ return this._page.container.querySelector('#metadata_key_menu .row .main-cell-wrapper .main-cell button');
168
+ }
169
+
156
170
  /**
157
171
  * Returns true if the page object exists in the container
158
172
  */
@@ -237,4 +251,14 @@ export default class DisplayAdministrationMenuPage {
237
251
  async gotoPasswordExpirySettings() {
238
252
  await this.click(this.passwordExpirySettings);
239
253
  }
254
+
255
+ /** Click on the Content Types Encrypted Metadata element */
256
+ async gotoContentTypesEncryptedMetadata() {
257
+ await this.click(this.contentTypesEncryptedMetadata);
258
+ }
259
+
260
+ /** Click on the Content Types Metadata Key element */
261
+ async gotoContentTypesMetadataKey() {
262
+ await this.click(this.contentTypesMetadataKey);
263
+ }
240
264
  }