@api-client/ui 0.0.12 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/demo/elements/authorization/cc.ts +56 -27
- package/dist/bindings/base/FileBindings.d.ts +4 -0
- package/dist/bindings/base/FileBindings.d.ts.map +1 -1
- package/dist/bindings/base/FileBindings.js +21 -1
- package/dist/bindings/base/FileBindings.js.map +1 -1
- package/dist/bindings/base/StoreBindings.d.ts +1 -17
- package/dist/bindings/base/StoreBindings.d.ts.map +1 -1
- package/dist/bindings/base/StoreBindings.js +0 -59
- package/dist/bindings/base/StoreBindings.js.map +1 -1
- package/dist/bindings/web/WebFileBindings.js +1 -1
- package/dist/bindings/web/WebFileBindings.js.map +1 -1
- package/dist/define/http/certificate-add.d.ts +9 -0
- package/dist/define/http/certificate-add.d.ts.map +1 -0
- package/dist/define/http/certificate-add.js +10 -0
- package/dist/define/http/certificate-add.js.map +1 -0
- package/dist/define/ui/ui-segmented-button-set.d.ts +1 -1
- package/dist/define/ui/ui-segmented-button-set.d.ts.map +1 -1
- package/dist/define/ui/ui-segmented-button-set.js.map +1 -1
- package/dist/elements/authorization/ui/CC.styles.d.ts.map +1 -1
- package/dist/elements/authorization/ui/CC.styles.js +4 -9
- package/dist/elements/authorization/ui/CC.styles.js.map +1 -1
- package/dist/elements/authorization/ui/CcAuthorization.d.ts +14 -29
- package/dist/elements/authorization/ui/CcAuthorization.d.ts.map +1 -1
- package/dist/elements/authorization/ui/CcAuthorization.js +67 -158
- package/dist/elements/authorization/ui/CcAuthorization.js.map +1 -1
- package/dist/elements/http/CertificateAdd.element.d.ts +91 -0
- package/dist/elements/http/CertificateAdd.element.d.ts.map +1 -0
- package/dist/elements/http/CertificateAdd.element.js +389 -0
- package/dist/elements/http/CertificateAdd.element.js.map +1 -0
- package/dist/elements/http/CertificateAdd.styles.d.ts +3 -0
- package/dist/elements/http/CertificateAdd.styles.d.ts.map +1 -0
- package/dist/elements/http/CertificateAdd.styles.js +61 -0
- package/dist/elements/http/CertificateAdd.styles.js.map +1 -0
- package/dist/elements/project/ProjectRunReport.d.ts +2 -1
- package/dist/elements/project/ProjectRunReport.d.ts.map +1 -1
- package/dist/elements/project/ProjectRunReport.js.map +1 -1
- package/dist/elements/store/FilePicker.styles.d.ts.map +1 -1
- package/dist/elements/store/FilePicker.styles.js +1 -0
- package/dist/elements/store/FilePicker.styles.js.map +1 -1
- package/dist/events/EventTypes.d.ts +6 -7
- package/dist/events/EventTypes.d.ts.map +1 -1
- package/dist/events/EventTypes.js +7 -7
- package/dist/events/EventTypes.js.map +1 -1
- package/dist/events/Events.d.ts +6 -1
- package/dist/events/Events.d.ts.map +1 -1
- package/dist/events/Events.js +2 -0
- package/dist/events/Events.js.map +1 -1
- package/dist/events/FilesystemEvents.d.ts +8 -0
- package/dist/events/FilesystemEvents.d.ts.map +1 -0
- package/dist/events/FilesystemEvents.js +59 -0
- package/dist/events/FilesystemEvents.js.map +1 -0
- package/dist/events/HttpClientEvents.d.ts +0 -2
- package/dist/events/HttpClientEvents.d.ts.map +1 -1
- package/dist/events/HttpClientEvents.js +0 -2
- package/dist/events/HttpClientEvents.js.map +1 -1
- package/dist/http-client/idb/Arc18DataUpgrade.d.ts +0 -8
- package/dist/http-client/idb/Arc18DataUpgrade.d.ts.map +1 -1
- package/dist/http-client/idb/Arc18DataUpgrade.js +11 -206
- package/dist/http-client/idb/Arc18DataUpgrade.js.map +1 -1
- package/dist/http-client/store/StoreBroadcast.d.ts +0 -5
- package/dist/http-client/store/StoreBroadcast.d.ts.map +1 -1
- package/dist/http-client/store/StoreBroadcast.js +0 -7
- package/dist/http-client/store/StoreBroadcast.js.map +1 -1
- package/dist/lib/files/FileUtils.d.ts +9 -0
- package/dist/lib/files/FileUtils.d.ts.map +1 -0
- package/dist/lib/files/FileUtils.js +13 -0
- package/dist/lib/files/FileUtils.js.map +1 -0
- package/dist/mixins/RouteMixin.d.ts +4 -0
- package/dist/mixins/RouteMixin.d.ts.map +1 -1
- package/dist/mixins/RouteMixin.js +1 -0
- package/dist/mixins/RouteMixin.js.map +1 -1
- package/dist/pages/api-client/ApiClient.screen.d.ts +4 -0
- package/dist/pages/api-client/ApiClient.screen.d.ts.map +1 -1
- package/dist/pages/api-client/ApiClient.screen.js +23 -2
- package/dist/pages/api-client/ApiClient.screen.js.map +1 -1
- package/dist/pages/api-client/ApiClient.styles.d.ts.map +1 -1
- package/dist/pages/api-client/ApiClient.styles.js +0 -12
- package/dist/pages/api-client/ApiClient.styles.js.map +1 -1
- package/dist/pages/api-client/pages/Files.page.d.ts.map +1 -1
- package/dist/pages/api-client/pages/Files.page.js +13 -0
- package/dist/pages/api-client/pages/Files.page.js.map +1 -1
- package/dist/ui/button/SegmentedButtonsSet.d.ts +14 -0
- package/dist/ui/button/SegmentedButtonsSet.d.ts.map +1 -1
- package/dist/ui/button/SegmentedButtonsSet.js.map +1 -1
- package/dist/ui/notification/SnackNotifications.d.ts +1 -0
- package/dist/ui/notification/SnackNotifications.d.ts.map +1 -1
- package/dist/ui/notification/SnackNotifications.js +7 -0
- package/dist/ui/notification/SnackNotifications.js.map +1 -1
- package/package.json +1 -1
- package/src/bindings/base/FileBindings.ts +25 -1
- package/src/bindings/base/StoreBindings.ts +1 -73
- package/src/bindings/web/WebFileBindings.ts +1 -1
- package/src/define/http/certificate-add.ts +12 -0
- package/src/define/ui/ui-segmented-button-set.ts +1 -1
- package/src/elements/authorization/ui/CC.styles.ts +4 -9
- package/src/elements/authorization/ui/CcAuthorization.ts +67 -167
- package/src/elements/http/CertificateAdd.element.ts +443 -0
- package/src/elements/http/CertificateAdd.styles.ts +61 -0
- package/src/elements/project/ProjectRunReport.ts +2 -1
- package/src/elements/store/FilePicker.styles.ts +1 -0
- package/src/events/EventTypes.ts +7 -7
- package/src/events/Events.ts +2 -0
- package/src/events/FilesystemEvents.ts +63 -0
- package/src/events/HttpClientEvents.ts +0 -2
- package/src/http-client/idb/Arc18DataUpgrade.ts +84 -84
- package/src/http-client/store/StoreBroadcast.ts +0 -8
- package/src/lib/files/FileUtils.ts +12 -0
- package/src/mixins/RouteMixin.ts +8 -1
- package/src/pages/api-client/ApiClient.screen.ts +26 -2
- package/src/pages/api-client/ApiClient.styles.ts +0 -12
- package/src/pages/api-client/pages/Files.page.ts +11 -0
- package/src/ui/button/SegmentedButtonsSet.ts +16 -1
- package/src/ui/notification/SnackNotifications.ts +8 -0
- package/test/elements/http/BodyFormdataEditorElement.test.ts +458 -454
- package/test/elements/http/BodyMultipartEditorElement.test.ts +609 -605
- package/test/elements/http/BodyRawEditorElement.test.ts +60 -56
- package/test/elements/http/CertificateAdd.test.ts +430 -0
- package/test/events/EventTypes.test.ts +0 -22
- package/test/helpers/UiMock.ts +19 -2
- package/web-test-runner.config.mjs +4 -3
- package/dist/events/http-client/models/CertificatesEvents.d.ts +0 -12
- package/dist/events/http-client/models/CertificatesEvents.d.ts.map +0 -1
- package/dist/events/http-client/models/CertificatesEvents.js +0 -18
- package/dist/events/http-client/models/CertificatesEvents.js.map +0 -1
- package/dist/http-client/idb/AuthDataModel.d.ts +0 -60
- package/dist/http-client/idb/AuthDataModel.d.ts.map +0 -1
- package/dist/http-client/idb/AuthDataModel.js +0 -150
- package/dist/http-client/idb/AuthDataModel.js.map +0 -1
- package/dist/http-client/idb/HostsModel.d.ts +0 -25
- package/dist/http-client/idb/HostsModel.d.ts.map +0 -1
- package/dist/http-client/idb/HostsModel.js +0 -82
- package/dist/http-client/idb/HostsModel.js.map +0 -1
- package/dist/http-client/idb/LegacyMockedStore.d.ts +0 -214
- package/dist/http-client/idb/LegacyMockedStore.d.ts.map +0 -1
- package/dist/http-client/idb/LegacyMockedStore.js +0 -486
- package/dist/http-client/idb/LegacyMockedStore.js.map +0 -1
- package/src/events/http-client/models/CertificatesEvents.ts +0 -23
- package/src/http-client/idb/AuthDataModel.ts +0 -175
- package/src/http-client/idb/HostsModel.ts +0 -125
- package/src/http-client/idb/LegacyMockedStore.ts +0 -544
- package/test/apic-ui.test.ts +0 -31
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import { TemplateResult } from "lit";
|
|
2
2
|
import { UiElement } from "../UiElement.js";
|
|
3
3
|
import SegmentedButton from "./SegmentedButton.js";
|
|
4
|
+
export interface ISegmentedButtonSelectionDetail {
|
|
5
|
+
/**
|
|
6
|
+
* A reference to the selected button.
|
|
7
|
+
*/
|
|
8
|
+
button: SegmentedButton;
|
|
9
|
+
/**
|
|
10
|
+
* Whether the button is selected.
|
|
11
|
+
*/
|
|
12
|
+
selected: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* The index of the selected button.
|
|
15
|
+
*/
|
|
16
|
+
index: number;
|
|
17
|
+
}
|
|
4
18
|
/**
|
|
5
19
|
* @fires select - When button's selection change.
|
|
6
20
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SegmentedButtonsSet.d.ts","sourceRoot":"","sources":["../../../src/ui/button/SegmentedButtonsSet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,eAAe,MAAM,sBAAsB,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,SAAS;IACxD,QAAQ,UAAS;IAEjB;;;OAGG;IAC0B,WAAW,UAAS;IAEP,OAAO,EAAG,eAAe,EAAE,CAAC;;IAO7D,iBAAiB,IAAI,IAAI;IAKlC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAKzD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAwBzD,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;IAYf,MAAM,IAAI,cAAc;CAGlC"}
|
|
1
|
+
{"version":3,"file":"SegmentedButtonsSet.d.ts","sourceRoot":"","sources":["../../../src/ui/button/SegmentedButtonsSet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,eAAe,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,+BAA+B;IAC9C;;OAEG;IACH,MAAM,EAAE,eAAe,CAAC;IACxB;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,SAAS;IACxD,QAAQ,UAAS;IAEjB;;;OAGG;IAC0B,WAAW,UAAS;IAEP,OAAO,EAAG,eAAe,EAAE,CAAC;;IAO7D,iBAAiB,IAAI,IAAI;IAKlC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAKzD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAwBzD,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;IAYf,MAAM,IAAI,cAAc;CAGlC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SegmentedButtonsSet.js","sourceRoot":"","sources":["../../../src/ui/button/SegmentedButtonsSet.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"SegmentedButtonsSet.js","sourceRoot":"","sources":["../../../src/ui/button/SegmentedButtonsSet.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult } from \"lit\";\nimport { property, queryAssignedElements } from \"lit/decorators.js\";\nimport { UiElement } from \"../UiElement.js\";\nimport SegmentedButton from \"./SegmentedButton.js\";\n\nexport interface ISegmentedButtonSelectionDetail {\n /**\n * A reference to the selected button.\n */\n button: SegmentedButton;\n /**\n * Whether the button is selected.\n */\n selected: boolean;\n /**\n * The index of the selected button.\n */\n index: number;\n}\n\n/**\n * @fires select - When button's selection change.\n */\nexport default class SegmentedButtonsSet extends UiElement {\n disabled = false;\n\n /**\n * Whether multiple buttons can be selected at once.\n * @attribute\n */\n @property({ type: Boolean }) multiselect = false;\n\n @queryAssignedElements({ flatten: true }) buttons!: SegmentedButton[];\n\n constructor() {\n super();\n this.addEventListener('trigger', this.handleButtonTrigger.bind(this));\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('role', 'group');\n }\n\n isButtonDisabled(index: number): boolean {\n if (this.isOutOfBounds(index)) return false;\n return this.buttons[index].disabled;\n }\n\n setButtonDisabled(index: number, disabled: boolean): void {\n if (this.isOutOfBounds(index)) return;\n this.buttons[index].disabled = disabled;\n }\n\n isButtonSelected(index: number): boolean {\n if (this.isOutOfBounds(index)) return false;\n return this.buttons[index].selected;\n }\n\n setButtonSelected(index: number, selected: boolean): void {\n // Ignore out-of-index values.\n if (this.isOutOfBounds(index)) return;\n // Ignore disabled buttons.\n if (this.isButtonDisabled(index)) return;\n\n if (this.multiselect) {\n this.buttons[index].selected = selected;\n this.dispatchSelected(index);\n return;\n }\n\n // Single-select segmented buttons are not unselectable.\n if (!selected) return;\n\n this.buttons[index].selected = true;\n this.dispatchSelected(index);\n // Deselect all other buttons for single-select.\n for (let i = 0; i < this.buttons.length; i++) {\n if (i === index) continue;\n this.buttons[i].selected = false;\n }\n }\n\n private handleButtonTrigger(e: Event): void {\n const index = this.buttons.indexOf(e.target as SegmentedButton);\n this.toggleSelection(index);\n }\n\n private toggleSelection(index: number): void {\n this.setButtonSelected(index, !this.buttons[index].selected);\n }\n\n private isOutOfBounds(index: number): boolean {\n return index < 0 || index >= this.buttons.length;\n }\n\n private dispatchSelected(index: number): void {\n this.dispatchEvent(new CustomEvent<ISegmentedButtonSelectionDetail>('select', {\n detail: {\n button: this.buttons[index],\n selected: this.buttons[index].selected,\n index,\n },\n bubbles: true,\n composed: true\n }));\n }\n\n override render(): TemplateResult {\n return html`<slot></slot>`;\n }\n}\n"]}
|
|
@@ -73,6 +73,7 @@ export declare class SnackNotifications {
|
|
|
73
73
|
protected static openHandler(e: Event): void;
|
|
74
74
|
protected static dismissHandler(e: Event): void;
|
|
75
75
|
static cancel(snack: Snackbar): void;
|
|
76
|
+
static clear(): void;
|
|
76
77
|
}
|
|
77
78
|
export {};
|
|
78
79
|
//# sourceMappingURL=SnackNotifications.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnackNotifications.d.ts","sourceRoot":"","sources":["../../../src/ui/notification/SnackNotifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,gCAAgC,CAAC;AAExC,MAAM,WAAW,UAAU;IACzB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAE7C,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAM;IAEjD;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAE1D;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ;IA0C1D,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI;IAajC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAc9C,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAoB5C,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAc/C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"SnackNotifications.d.ts","sourceRoot":"","sources":["../../../src/ui/notification/SnackNotifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,gCAAgC,CAAC;AAExC,MAAM,WAAW,UAAU;IACzB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAE7C,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAM;IAEjD;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAE1D;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ;IA0C1D,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI;IAajC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAc9C,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAoB5C,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAc/C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAkBpC,MAAM,CAAC,KAAK,IAAI,IAAI;CAOrB"}
|
|
@@ -119,5 +119,12 @@ export class SnackNotifications {
|
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
+
static clear() {
|
|
123
|
+
this.stack = [];
|
|
124
|
+
if (this.current) {
|
|
125
|
+
this.current.element.parentElement?.removeChild(this.current.element);
|
|
126
|
+
this.current = undefined;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
122
129
|
}
|
|
123
130
|
//# sourceMappingURL=SnackNotifications.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnackNotifications.js","sourceRoot":"","sources":["../../../src/ui/notification/SnackNotifications.ts"],"names":[],"mappings":"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","sourcesContent":["import { Snackbar } from \"./Snackbar.js\";\nimport '../../define/ui/ui-snackbar.js';\n\nexport interface ISnackInit {\n /**\n * When set the snackbar does not timeout.\n * It has to be cancelled by user interaction or programmatically.\n * \n * When the `cancellable` is set to false the user won't be able to dismiss the\n * snackbar and the application must remove the snackbar after the process \n * finish. Otherwise another snackbar won't appear.\n * \n * @default false\n */\n persistent?: boolean;\n\n /**\n * Whether the snackbar can be cancelled via user interaction.\n * \n * @default true\n */\n cancellable?: boolean;\n\n /**\n * The time in milliseconds after which the message is removed.\n * Has not effect when `persistent` flag is set.\n * \n * @default 5000\n */\n timeout?: number;\n\n /**\n * The action to render next to the message.\n * There can be only one action.\n * It is only rendered when `actionCallback` is set.\n */\n actionLabel?: string;\n\n /**\n * The callback function called when the action was activated by the user.\n */\n actionCallback?: () => void;\n\n /**\n * Whether to render affordable \"close\" icon.\n */\n close?: boolean;\n\n /**\n * Callback called when the message was closed either by the user interaction\n * or by a timeout.\n * Note, it is not called when the message is closed programmatically.\n */\n closed?: () => void;\n}\n\ninterface INotificationInfo {\n element: Snackbar;\n init?: ISnackInit;\n}\n\n/**\n * A class that manages user notifications via snackbars (toast messages).\n */\nexport class SnackNotifications {\n protected static current?: INotificationInfo;\n\n protected static stack: INotificationInfo[] = [];\n\n /**\n * Notifies a user about something using default settings.\n * @param message The message to show\n * @param timeout Optionally the timeout after which the message will disappear.\n */\n static notify(message: string, timeout?: number): Snackbar;\n\n /**\n * Notifies the user about something with full configuration options available.\n * @param message The message to show\n * @param init Snack configuration options.\n */\n static notify(message: string, init: ISnackInit): Snackbar;\n\n static notify(message: string, timeoutOrInit?: number | ISnackInit): Snackbar {\n const snack = document.createElement('ui-snackbar');\n snack.innerText = message;\n let configInit: ISnackInit | undefined;\n\n if (typeof timeoutOrInit === 'number') {\n snack.timeout = timeoutOrInit;\n } else if (timeoutOrInit) {\n const cnf = timeoutOrInit as ISnackInit;\n configInit = cnf;\n if (typeof cnf.timeout === 'number') {\n snack.timeout = cnf.timeout;\n }\n if (typeof cnf.persistent === 'boolean') {\n snack.persistent = cnf.persistent;\n }\n if (typeof cnf.close === 'boolean') { \n snack.close = cnf.close;\n }\n if (typeof cnf.cancellable === 'boolean') {\n snack.cancellable = cnf.cancellable;\n }\n if (cnf.actionLabel && typeof cnf.actionCallback === 'function') {\n snack.action = cnf.actionLabel;\n }\n }\n this.stack.push({\n element: snack,\n init: configInit,\n });\n document.body.appendChild(snack);\n snack.addEventListener('action', this.actionHandler.bind(this));\n snack.addEventListener('open', this.openHandler.bind(this));\n snack.addEventListener('dismiss', this.dismissHandler.bind(this));\n setTimeout(() => {\n this.schedule();\n });\n return snack;\n }\n\n protected static schedule(): void {\n if (this.current) {\n return;\n }\n const { stack = [] } = this;\n const item = stack.shift();\n if (!item) {\n return;\n }\n this.current = item;\n item.element.open = true;\n }\n\n protected static actionHandler(e: Event): void {\n const target = e.target as Snackbar;\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n if (info.init && info.init.actionCallback) {\n info.init.actionCallback();\n }\n }\n\n protected static openHandler(e: Event): void {\n const target = e.target as Snackbar;\n if (target.open) {\n return;\n }\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n target.parentElement?.removeChild(target);\n if (info.init && info.init.closed) {\n info.init.closed();\n }\n SnackNotifications.current = undefined;\n SnackNotifications.schedule();\n }\n\n protected static dismissHandler(e: Event): void {\n const target = e.target as Snackbar;\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n target.parentElement?.removeChild(target);\n SnackNotifications.current = undefined;\n SnackNotifications.schedule();\n }\n\n static cancel(snack: Snackbar): void {\n if (this.current?.element === snack) {\n if (snack.open) {\n // eslint-disable-next-line no-param-reassign\n snack.open = false;\n } else {\n snack.parentElement?.removeChild(snack);\n this.current = undefined;\n SnackNotifications.schedule();\n }\n } else {\n const index = this.stack.findIndex((i) => i.element === snack);\n if (index >= 0) {\n this.stack.splice(index, 1);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SnackNotifications.js","sourceRoot":"","sources":["../../../src/ui/notification/SnackNotifications.ts"],"names":[],"mappings":"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","sourcesContent":["import { Snackbar } from \"./Snackbar.js\";\nimport '../../define/ui/ui-snackbar.js';\n\nexport interface ISnackInit {\n /**\n * When set the snackbar does not timeout.\n * It has to be cancelled by user interaction or programmatically.\n * \n * When the `cancellable` is set to false the user won't be able to dismiss the\n * snackbar and the application must remove the snackbar after the process \n * finish. Otherwise another snackbar won't appear.\n * \n * @default false\n */\n persistent?: boolean;\n\n /**\n * Whether the snackbar can be cancelled via user interaction.\n * \n * @default true\n */\n cancellable?: boolean;\n\n /**\n * The time in milliseconds after which the message is removed.\n * Has not effect when `persistent` flag is set.\n * \n * @default 5000\n */\n timeout?: number;\n\n /**\n * The action to render next to the message.\n * There can be only one action.\n * It is only rendered when `actionCallback` is set.\n */\n actionLabel?: string;\n\n /**\n * The callback function called when the action was activated by the user.\n */\n actionCallback?: () => void;\n\n /**\n * Whether to render affordable \"close\" icon.\n */\n close?: boolean;\n\n /**\n * Callback called when the message was closed either by the user interaction\n * or by a timeout.\n * Note, it is not called when the message is closed programmatically.\n */\n closed?: () => void;\n}\n\ninterface INotificationInfo {\n element: Snackbar;\n init?: ISnackInit;\n}\n\n/**\n * A class that manages user notifications via snackbars (toast messages).\n */\nexport class SnackNotifications {\n protected static current?: INotificationInfo;\n\n protected static stack: INotificationInfo[] = [];\n\n /**\n * Notifies a user about something using default settings.\n * @param message The message to show\n * @param timeout Optionally the timeout after which the message will disappear.\n */\n static notify(message: string, timeout?: number): Snackbar;\n\n /**\n * Notifies the user about something with full configuration options available.\n * @param message The message to show\n * @param init Snack configuration options.\n */\n static notify(message: string, init: ISnackInit): Snackbar;\n\n static notify(message: string, timeoutOrInit?: number | ISnackInit): Snackbar {\n const snack = document.createElement('ui-snackbar');\n snack.innerText = message;\n let configInit: ISnackInit | undefined;\n\n if (typeof timeoutOrInit === 'number') {\n snack.timeout = timeoutOrInit;\n } else if (timeoutOrInit) {\n const cnf = timeoutOrInit as ISnackInit;\n configInit = cnf;\n if (typeof cnf.timeout === 'number') {\n snack.timeout = cnf.timeout;\n }\n if (typeof cnf.persistent === 'boolean') {\n snack.persistent = cnf.persistent;\n }\n if (typeof cnf.close === 'boolean') { \n snack.close = cnf.close;\n }\n if (typeof cnf.cancellable === 'boolean') {\n snack.cancellable = cnf.cancellable;\n }\n if (cnf.actionLabel && typeof cnf.actionCallback === 'function') {\n snack.action = cnf.actionLabel;\n }\n }\n this.stack.push({\n element: snack,\n init: configInit,\n });\n document.body.appendChild(snack);\n snack.addEventListener('action', this.actionHandler.bind(this));\n snack.addEventListener('open', this.openHandler.bind(this));\n snack.addEventListener('dismiss', this.dismissHandler.bind(this));\n setTimeout(() => {\n this.schedule();\n });\n return snack;\n }\n\n protected static schedule(): void {\n if (this.current) {\n return;\n }\n const { stack = [] } = this;\n const item = stack.shift();\n if (!item) {\n return;\n }\n this.current = item;\n item.element.open = true;\n }\n\n protected static actionHandler(e: Event): void {\n const target = e.target as Snackbar;\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n if (info.init && info.init.actionCallback) {\n info.init.actionCallback();\n }\n }\n\n protected static openHandler(e: Event): void {\n const target = e.target as Snackbar;\n if (target.open) {\n return;\n }\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n target.parentElement?.removeChild(target);\n if (info.init && info.init.closed) {\n info.init.closed();\n }\n SnackNotifications.current = undefined;\n SnackNotifications.schedule();\n }\n\n protected static dismissHandler(e: Event): void {\n const target = e.target as Snackbar;\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n target.parentElement?.removeChild(target);\n SnackNotifications.current = undefined;\n SnackNotifications.schedule();\n }\n\n static cancel(snack: Snackbar): void {\n if (this.current?.element === snack) {\n if (snack.open) {\n // eslint-disable-next-line no-param-reassign\n snack.open = false;\n } else {\n snack.parentElement?.removeChild(snack);\n this.current = undefined;\n SnackNotifications.schedule();\n }\n } else {\n const index = this.stack.findIndex((i) => i.element === snack);\n if (index >= 0) {\n this.stack.splice(index, 1);\n }\n }\n }\n\n static clear(): void {\n this.stack = [];\n if (this.current) {\n this.current.element.parentElement?.removeChild(this.current.element);\n this.current = undefined;\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EventTypes } from '../../events/EventTypes.js';
|
|
1
2
|
import { PlatformBindings } from './PlatformBindings.js';
|
|
2
3
|
// import { EventTypes } from '../../events/EventTypes.js';
|
|
3
4
|
|
|
@@ -144,7 +145,30 @@ export interface FileWriteOptions extends ReadWriteOptions {
|
|
|
144
145
|
*/
|
|
145
146
|
export abstract class FileBindings extends PlatformBindings {
|
|
146
147
|
async initialize(): Promise<void> {
|
|
147
|
-
|
|
148
|
+
window.addEventListener(EventTypes.Filesystem.requestSaveFile, this.handleRequestSaveFile.bind(this));
|
|
149
|
+
window.addEventListener(EventTypes.Filesystem.requestOpenFile, this.handleRequestOpenFile.bind(this));
|
|
150
|
+
window.addEventListener(EventTypes.Filesystem.writeFile, this.handleWriteFile.bind(this));
|
|
151
|
+
window.addEventListener(EventTypes.Filesystem.readFile, this.handleReadFile.bind(this));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
protected handleRequestSaveFile(e: Event): void {
|
|
155
|
+
const event = e as CustomEvent<{ options?: ISaveFileDialogInit, result: Promise<ISaveFileDialogResult> }>;
|
|
156
|
+
event.detail.result = this.saveFileDialog(event.detail.options);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
protected handleRequestOpenFile(e: Event): void {
|
|
160
|
+
const event = e as CustomEvent<{ options?: IOpenFileDialogInit, result: Promise<IOpenFileDialogResult> }>;
|
|
161
|
+
event.detail.result = this.openFileDialog(event.detail.options);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
protected handleWriteFile(e: Event): void {
|
|
165
|
+
const event = e as CustomEvent<{ path: string, contents: BufferSource | Blob | string | Buffer, options?: FileWriteOptions, result: Promise<void> }>;
|
|
166
|
+
event.detail.result = this.writeFile(event.detail.path, event.detail.contents, event.detail.options);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
protected handleReadFile(e: Event): void {
|
|
170
|
+
const event = e as CustomEvent<{ path: string, options?: FileReadOptions, result: Promise<Buffer | ArrayBuffer | string> }>;
|
|
171
|
+
event.detail.result = this.readFile(event.detail.path, event.detail.options);
|
|
148
172
|
}
|
|
149
173
|
|
|
150
174
|
/**
|
|
@@ -15,16 +15,11 @@ import {
|
|
|
15
15
|
SpaceKind,
|
|
16
16
|
Space,
|
|
17
17
|
PermissionRole,
|
|
18
|
-
HttpCertificate,
|
|
19
18
|
ContextSpaceListOptions,
|
|
20
19
|
IRevision,
|
|
21
20
|
TrashEntry,
|
|
22
21
|
TrashEntryCreate,
|
|
23
22
|
ContextDeleteBulkEvent,
|
|
24
|
-
ICertificate,
|
|
25
|
-
ContextListEvent,
|
|
26
|
-
ContextReadEvent,
|
|
27
|
-
ContextUpdateEvent,
|
|
28
23
|
FileAddOptions,
|
|
29
24
|
FileBreadcrumb,
|
|
30
25
|
IBackendObserveCommand,
|
|
@@ -127,8 +122,6 @@ export abstract class StoreBindings extends PlatformBindings {
|
|
|
127
122
|
|
|
128
123
|
projectExeChannel = new BroadcastChannel(StoreBroadcast.projectRuns);
|
|
129
124
|
|
|
130
|
-
certificatesChannel = new BroadcastChannel(StoreBroadcast.certificates);
|
|
131
|
-
|
|
132
125
|
initialized = false;
|
|
133
126
|
|
|
134
127
|
async initializeStore(): Promise<void> {
|
|
@@ -189,12 +182,6 @@ export abstract class StoreBindings extends PlatformBindings {
|
|
|
189
182
|
target.addEventListener(EventTypes.Store.ProjectRuns.clearSpace, this.handleProjectExecutionClearSpace.bind(this) as EventListener);
|
|
190
183
|
target.addEventListener(EventTypes.Store.ProjectRuns.clearProject, this.handleProjectExecutionClearProject.bind(this) as EventListener);
|
|
191
184
|
target.addEventListener(EventTypes.Store.ProjectRuns.clearParent, this.handleProjectExecutionClearFolder.bind(this) as EventListener);
|
|
192
|
-
|
|
193
|
-
// certificates
|
|
194
|
-
target.addEventListener(EventTypes.Store.Certificate.list, this.handleCertificateList.bind(this) as EventListener);
|
|
195
|
-
target.addEventListener(EventTypes.Store.Certificate.read, this.handleCertificateRead.bind(this) as EventListener);
|
|
196
|
-
target.addEventListener(EventTypes.Store.Certificate.delete, this.handleCertificateDelete.bind(this) as EventListener);
|
|
197
|
-
target.addEventListener(EventTypes.Store.Certificate.insert, this.handleCertificateInsert.bind(this) as EventListener);
|
|
198
185
|
}
|
|
199
186
|
|
|
200
187
|
abstract environment: EnvironmentSettings;
|
|
@@ -625,27 +612,6 @@ export abstract class StoreBindings extends PlatformBindings {
|
|
|
625
612
|
patchUsers: (space: string, value: IAccessPatchInfo): Promise<void> => this.getStore().sdk.spaces.patchUsers(this.space || space, value),
|
|
626
613
|
}
|
|
627
614
|
|
|
628
|
-
certificates = {
|
|
629
|
-
add: (value: HttpCertificate, space: string): Promise<ContextChangeRecord<HttpCertificate>> => this.getStore().sdk.certificates.add(value, this.space || space),
|
|
630
|
-
addBulk: (values: HttpCertificate[], space: string): Promise<IBulkOperationResult<ContextChangeRecord<HttpCertificate>>> => this.getStore().sdk.certificates.addBulk(values, this.space || space),
|
|
631
|
-
read: (key: string): Promise<HttpCertificate> => this.getStore().sdk.certificates.read(key),
|
|
632
|
-
list: (options?: ContextSpaceListOptions): Promise<ContextListResult<HttpCertificate>> => {
|
|
633
|
-
const cp = { ...options } as ContextSpaceListOptions;
|
|
634
|
-
if (!cp.space) {
|
|
635
|
-
cp.space = this.space;
|
|
636
|
-
}
|
|
637
|
-
return this.getStore().sdk.certificates.list(cp);
|
|
638
|
-
},
|
|
639
|
-
delete: async (key: string): Promise<ContextDeleteRecord> => {
|
|
640
|
-
await this.getStore().sdk.certificates.delete(key);
|
|
641
|
-
return {
|
|
642
|
-
key,
|
|
643
|
-
};
|
|
644
|
-
},
|
|
645
|
-
deleteBulk: (keys: string[]): Promise<IBulkOperationResult<ContextDeleteRecord>> => this.getStore().sdk.certificates.deleteBulk(keys),
|
|
646
|
-
empty: (space: string): Promise<void> => this.getStore().sdk.certificates.empty(this.space || space),
|
|
647
|
-
}
|
|
648
|
-
|
|
649
615
|
trash = {
|
|
650
616
|
add: (entry: TrashEntryCreate, space: string): Promise<ContextChangeRecord<TrashEntry>> => this.getStore().sdk.trash.add(entry, this.space || space),
|
|
651
617
|
list: (options: ContextSpaceListOptions): Promise<ContextListResult<TrashEntry>> => {
|
|
@@ -694,43 +660,7 @@ export abstract class StoreBindings extends PlatformBindings {
|
|
|
694
660
|
me: (): Promise<IUser> => this.getStore().sdk.user.me(),
|
|
695
661
|
read: (key: string): Promise<IUser> => this.getStore().sdk.user.read(key),
|
|
696
662
|
}
|
|
697
|
-
|
|
698
|
-
protected handleCertificateList(event: Event): void {
|
|
699
|
-
const e = event as ContextListEvent<ICertificate>;
|
|
700
|
-
e.preventDefault();
|
|
701
|
-
const options: ContextSpaceListOptions = {
|
|
702
|
-
...e.detail,
|
|
703
|
-
space: this.space,
|
|
704
|
-
}
|
|
705
|
-
e.detail.result = this.certificates.list(options);
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
protected handleCertificateRead(event: Event): void {
|
|
709
|
-
const e = event as ContextReadEvent<ICertificate>;
|
|
710
|
-
e.preventDefault();
|
|
711
|
-
e.detail.result = this.certificates.read(e.detail.key);
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
protected handleCertificateDelete(event: Event): void {
|
|
715
|
-
const e = event as ContextDeleteEvent;
|
|
716
|
-
e.preventDefault();
|
|
717
|
-
e.detail.result = this.certificates.delete(e.detail.key);
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
protected handleCertificateInsert(event: Event): void {
|
|
721
|
-
const e = event as ContextUpdateEvent<HttpCertificate, HttpCertificate>;
|
|
722
|
-
e.preventDefault();
|
|
723
|
-
e.detail.result = this.certificates.add(e.detail.item, this.space);
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
async observeCertificates(): Promise<void> {
|
|
727
|
-
await this.observePath(RouteBuilder.certificates());
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
async unobserveCertificates(): Promise<void> {
|
|
731
|
-
await this.unobservePath(RouteBuilder.certificates());
|
|
732
|
-
}
|
|
733
|
-
|
|
663
|
+
|
|
734
664
|
async observeSpaces(): Promise<void> {
|
|
735
665
|
await this.observePath(RouteBuilder.spaces());
|
|
736
666
|
}
|
|
@@ -860,8 +790,6 @@ export abstract class StoreBindings extends PlatformBindings {
|
|
|
860
790
|
this.historyChannel.postMessage(event);
|
|
861
791
|
} else if (event.path === RouteBuilder.projectExecutions()) {
|
|
862
792
|
this.projectExeChannel.postMessage(event);
|
|
863
|
-
} else if (event.path === RouteBuilder.certificates()) {
|
|
864
|
-
this.certificatesChannel.postMessage(event);
|
|
865
793
|
} else {
|
|
866
794
|
// eslint-disable-next-line no-console
|
|
867
795
|
console.warn(`Broadcast path not handled`, event.path, event)
|
|
@@ -46,7 +46,7 @@ export class WebFileBindings extends FileBindings {
|
|
|
46
46
|
const handles = await window.showOpenFilePicker(dialogOptions);
|
|
47
47
|
const result: string[] = [];
|
|
48
48
|
handles.forEach((handle) => {
|
|
49
|
-
const path = uuidV4()
|
|
49
|
+
const path = `${uuidV4()}/${handle.name}`;
|
|
50
50
|
result.push(path);
|
|
51
51
|
this.handles.set(path, handle);
|
|
52
52
|
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { customElement } from 'lit/decorators.js';
|
|
2
|
+
import Element from '../../elements/http/CertificateAdd.element.js';
|
|
3
|
+
|
|
4
|
+
@customElement('certificate-add')
|
|
5
|
+
export class CertificateAddElement extends Element {
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
declare global {
|
|
9
|
+
interface HTMLElementTagNameMap {
|
|
10
|
+
'certificate-add': Element;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
import { css } from 'lit';
|
|
2
2
|
|
|
3
3
|
export default css`
|
|
4
|
-
.cert-meta {
|
|
5
|
-
display: inline-flex;
|
|
6
|
-
align-items: center;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
4
|
:host {
|
|
10
|
-
max-height: 300px;
|
|
11
5
|
display: flex;
|
|
12
6
|
flex-direction: column;
|
|
13
7
|
}
|
|
14
8
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
.certificate-info {
|
|
10
|
+
display: flex;
|
|
11
|
+
align-items: center;
|
|
12
|
+
margin-top: 20px;
|
|
18
13
|
}
|
|
19
14
|
`;
|
|
@@ -1,129 +1,69 @@
|
|
|
1
1
|
import { html, nothing, TemplateResult } from "lit";
|
|
2
|
-
import { state } from "lit/decorators.js";
|
|
3
2
|
import {
|
|
4
|
-
ICCAuthorization, HttpCertificate, Events as CoreEvents,
|
|
5
|
-
ICertificate,
|
|
6
|
-
BroadcastEvent,
|
|
7
|
-
BroadcastCreatedEvent,
|
|
8
|
-
DeletedBroadcastEvent,
|
|
3
|
+
ICCAuthorization, HttpCertificate, Events as CoreEvents, CertificateFileKind, ICertificate, IFile,
|
|
9
4
|
} from '@api-client/core/build/browser.js';
|
|
10
|
-
import
|
|
5
|
+
import { state } from "lit/decorators.js";
|
|
11
6
|
import { Authorization } from "./Authorization.js";
|
|
7
|
+
import type { FilePickerClosingReason } from "../../store/FilePicker.element.js";
|
|
12
8
|
import { Events } from "../../../events/Events.js";
|
|
13
|
-
import
|
|
14
|
-
import { StoreBroadcast } from "../../../http-client/store/StoreBroadcast.js";
|
|
9
|
+
import '../../../define/ui/ui-dropdown-list.js';
|
|
15
10
|
import '../../../define/ui/ui-button.js';
|
|
16
|
-
import '../../../define/ui/ui-
|
|
11
|
+
import '../../../define/ui/ui-icon-button.js';
|
|
12
|
+
import '../../../define/ui/ui-icon.js';
|
|
13
|
+
import '../../../define/store/file-picker.js';
|
|
17
14
|
|
|
18
15
|
export default class CcAuthorization extends Authorization {
|
|
19
|
-
@state()
|
|
20
|
-
|
|
21
|
-
@state() querying = false;
|
|
22
|
-
|
|
23
|
-
@state() loadingError?: string;
|
|
24
|
-
|
|
25
|
-
channel = new BroadcastChannel(StoreBroadcast.certificates);
|
|
26
|
-
|
|
27
|
-
constructor() {
|
|
28
|
-
super();
|
|
29
|
-
|
|
30
|
-
this.handleBroadcast = this.handleBroadcast.bind(this);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
override connectedCallback(): void {
|
|
34
|
-
super.connectedCallback();
|
|
35
|
-
this.channel.addEventListener('message', this.handleBroadcast);
|
|
36
|
-
this.queryCertificates();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
override disconnectedCallback(): void {
|
|
40
|
-
super.disconnectedCallback();
|
|
41
|
-
this.channel.removeEventListener('message', this.handleBroadcast);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
protected handleBroadcast(e: MessageEvent): void {
|
|
45
|
-
const event = e.data as BroadcastEvent;
|
|
46
|
-
switch (event.operation) {
|
|
47
|
-
case 'created': this.handleCreated(event as BroadcastCreatedEvent); break;
|
|
48
|
-
case 'deleted': this.handleDeleted(event as DeletedBroadcastEvent); break;
|
|
49
|
-
default:
|
|
50
|
-
}
|
|
51
|
-
}
|
|
16
|
+
@state() selectorRendered = false;
|
|
52
17
|
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
if (!
|
|
56
|
-
|
|
18
|
+
get config(): ICCAuthorization {
|
|
19
|
+
const { authorization } = this;
|
|
20
|
+
if (!authorization) {
|
|
21
|
+
return { };
|
|
57
22
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
this.items[index] = cert;
|
|
61
|
-
} else {
|
|
62
|
-
this.items.push(cert);
|
|
23
|
+
if (!authorization.config) {
|
|
24
|
+
authorization.config = {} as ICCAuthorization;
|
|
63
25
|
}
|
|
64
|
-
|
|
26
|
+
return authorization.config as ICCAuthorization;
|
|
65
27
|
}
|
|
66
28
|
|
|
67
|
-
protected
|
|
68
|
-
|
|
29
|
+
protected handleClose(e: CustomEvent<FilePickerClosingReason>): void {
|
|
30
|
+
const { canceled, file } = e.detail;
|
|
31
|
+
if (canceled) {
|
|
69
32
|
return;
|
|
70
33
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
34
|
+
this.setCertificate((file as IFile).key);
|
|
35
|
+
CoreEvents.Telemetry.event({
|
|
36
|
+
category: 'Certificates',
|
|
37
|
+
action: 'Authorization',
|
|
38
|
+
label: 'selected-certificate'
|
|
39
|
+
}, this);
|
|
77
40
|
}
|
|
78
41
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
this.querying = true;
|
|
42
|
+
async setCertificate(key: string): Promise<void> {
|
|
43
|
+
let result: unknown;
|
|
84
44
|
try {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
throw new Error(`Certificates query not handled by the store.`);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
this.items = data.items;
|
|
92
|
-
} catch (cause) {
|
|
93
|
-
this.loadingError = (cause as Error).message;
|
|
94
|
-
} finally {
|
|
95
|
-
this.querying = false;
|
|
45
|
+
result = await Events.Store.File.read(key, true, this);
|
|
46
|
+
} catch (_) {
|
|
47
|
+
return;
|
|
96
48
|
}
|
|
49
|
+
const { config } = this;
|
|
50
|
+
config.certificate = result as ICertificate;
|
|
51
|
+
this.requestUpdate();
|
|
52
|
+
this.notifyChange();
|
|
97
53
|
}
|
|
98
54
|
|
|
99
|
-
protected
|
|
100
|
-
|
|
101
|
-
if (
|
|
102
|
-
|
|
55
|
+
protected handleDropDownOpen(): void {
|
|
56
|
+
this.selectorRendered = true;
|
|
57
|
+
if (this.isUpdatePending) {
|
|
58
|
+
this.scheduleUpdate();
|
|
103
59
|
}
|
|
60
|
+
}
|
|
104
61
|
|
|
105
|
-
|
|
106
|
-
const {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
const config = authorization.config as ICCAuthorization || {} as ICCAuthorization;
|
|
111
|
-
if (value === '') {
|
|
112
|
-
delete config.certificate;
|
|
113
|
-
} else {
|
|
114
|
-
const cert = this.items?.find(i => i.key === value);
|
|
115
|
-
if (!cert) {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
config.certificate = cert;
|
|
119
|
-
}
|
|
62
|
+
protected handleClearCertificate(): void {
|
|
63
|
+
const { config } = this;
|
|
64
|
+
delete config.certificate;
|
|
65
|
+
this.requestUpdate();
|
|
120
66
|
this.notifyChange();
|
|
121
|
-
|
|
122
|
-
CoreEvents.Telemetry.event({
|
|
123
|
-
category: 'Certificates',
|
|
124
|
-
action: 'Authorization',
|
|
125
|
-
label: 'selected-certificate'
|
|
126
|
-
}, this);
|
|
127
67
|
}
|
|
128
68
|
|
|
129
69
|
override render(): TemplateResult {
|
|
@@ -134,81 +74,41 @@ export default class CcAuthorization extends Authorization {
|
|
|
134
74
|
}
|
|
135
75
|
|
|
136
76
|
protected renderEditor(): TemplateResult | typeof nothing {
|
|
137
|
-
const {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
const hasItems = !!items && !!items.length;
|
|
142
|
-
if (!loadingError && !hasItems) {
|
|
143
|
-
return html`
|
|
144
|
-
${this.renderEmptyState()}
|
|
145
|
-
`;
|
|
146
|
-
}
|
|
147
|
-
const config = authorization.config as ICCAuthorization || {} as ICCAuthorization;
|
|
77
|
+
const { config } = this;
|
|
78
|
+
const { certificate } = config;
|
|
79
|
+
// Note, the <form> element is required by the Authorization class for validation.
|
|
148
80
|
return html`
|
|
149
|
-
|
|
150
|
-
${
|
|
151
|
-
|
|
152
|
-
${this.renderList(items, config.certificate)}
|
|
153
|
-
</form>
|
|
154
|
-
` : ''}
|
|
81
|
+
<form autocomplete="on" class="auth-form cc-auth"></form>
|
|
82
|
+
${this.renderSelector()}
|
|
83
|
+
${certificate ? this.renderSelection(certificate) : nothing}
|
|
155
84
|
`;
|
|
156
85
|
}
|
|
157
86
|
|
|
158
|
-
protected
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
protected renderEmptyState(): TemplateResult {
|
|
163
|
-
return html`<p class="empty-screen body-large">There are no certificates installed in this application.</p>`;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
protected renderList(items: HttpCertificate[], current?: ICertificate): TemplateResult {
|
|
167
|
-
const currentKey = current && current.key;
|
|
87
|
+
protected renderSelector(): TemplateResult {
|
|
88
|
+
const { selectorRendered } = this;
|
|
89
|
+
const kinds: typeof CertificateFileKind[] = [CertificateFileKind];
|
|
168
90
|
return html`
|
|
169
|
-
|
|
170
|
-
${
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
protected renderNoneItem(selectedKey?: string): TemplateResult {
|
|
175
|
-
return html`
|
|
176
|
-
<label class="label-medium">
|
|
177
|
-
<ui-radio name="certificate" value="" .checked="${!selectedKey}" @change="${this.handleSelected}"></ui-radio>
|
|
178
|
-
None
|
|
179
|
-
</label>
|
|
180
|
-
`;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* @param item The item to render
|
|
185
|
-
* @returns The template for the dropdown item.
|
|
186
|
-
*/
|
|
187
|
-
protected renderCertItem(item: HttpCertificate, selectedKey?: string): TemplateResult {
|
|
188
|
-
return html`
|
|
189
|
-
<div class="cert-item">
|
|
190
|
-
<label>
|
|
191
|
-
<ui-radio name="certificate" value="${item.key}" .checked="${item.key === selectedKey}" @change="${this.handleSelected}"></ui-radio>
|
|
192
|
-
<div class="cert-meta">
|
|
193
|
-
<span class="label-medium">${item.name}</span>
|
|
194
|
-
<span class="body-small">Added: ${this.renderDateTime(item.created)}</span>
|
|
195
|
-
</div>
|
|
196
|
-
</label>
|
|
91
|
+
<div class="selector">
|
|
92
|
+
<ui-dropdown-list @open="${this.handleDropDownOpen}">
|
|
93
|
+
<ui-button class="dropdown-trigger" type="tonal">Select a certificate</ui-button>
|
|
94
|
+
${selectorRendered ? html`<file-picker slot="dropdown" .kinds="${kinds}" @close="${this.handleClose}"></file-picker>` : nothing}
|
|
95
|
+
</ui-dropdown-list>
|
|
197
96
|
</div>
|
|
198
97
|
`;
|
|
199
98
|
}
|
|
200
99
|
|
|
201
|
-
|
|
202
|
-
* @param created The certificate created time.
|
|
203
|
-
* @returns The template for the cert time element.
|
|
204
|
-
*/
|
|
205
|
-
protected renderDateTime(created?: number): TemplateResult {
|
|
206
|
-
if (!created) {
|
|
207
|
-
return html`<span>Unknown</span>`;
|
|
208
|
-
}
|
|
209
|
-
const d = new Date(created);
|
|
100
|
+
protected renderSelection(certificate: HttpCertificate): TemplateResult {
|
|
210
101
|
return html`
|
|
211
|
-
<
|
|
102
|
+
<div class="certificate-info body-medium">
|
|
103
|
+
Current certificate: ${certificate.name}
|
|
104
|
+
<ui-icon-button
|
|
105
|
+
aria-label="Remove certificate from authorization"
|
|
106
|
+
title="Remove certificate from authorization"
|
|
107
|
+
@click="${this.handleClearCertificate}"
|
|
108
|
+
>
|
|
109
|
+
<ui-icon role="presentation" icon="deleteOutline"></ui-icon>
|
|
110
|
+
</ui-icon-button>
|
|
111
|
+
</div>
|
|
212
112
|
`;
|
|
213
113
|
}
|
|
214
114
|
}
|