@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.
Files changed (141) hide show
  1. package/demo/elements/authorization/cc.ts +56 -27
  2. package/dist/bindings/base/FileBindings.d.ts +4 -0
  3. package/dist/bindings/base/FileBindings.d.ts.map +1 -1
  4. package/dist/bindings/base/FileBindings.js +21 -1
  5. package/dist/bindings/base/FileBindings.js.map +1 -1
  6. package/dist/bindings/base/StoreBindings.d.ts +1 -17
  7. package/dist/bindings/base/StoreBindings.d.ts.map +1 -1
  8. package/dist/bindings/base/StoreBindings.js +0 -59
  9. package/dist/bindings/base/StoreBindings.js.map +1 -1
  10. package/dist/bindings/web/WebFileBindings.js +1 -1
  11. package/dist/bindings/web/WebFileBindings.js.map +1 -1
  12. package/dist/define/http/certificate-add.d.ts +9 -0
  13. package/dist/define/http/certificate-add.d.ts.map +1 -0
  14. package/dist/define/http/certificate-add.js +10 -0
  15. package/dist/define/http/certificate-add.js.map +1 -0
  16. package/dist/define/ui/ui-segmented-button-set.d.ts +1 -1
  17. package/dist/define/ui/ui-segmented-button-set.d.ts.map +1 -1
  18. package/dist/define/ui/ui-segmented-button-set.js.map +1 -1
  19. package/dist/elements/authorization/ui/CC.styles.d.ts.map +1 -1
  20. package/dist/elements/authorization/ui/CC.styles.js +4 -9
  21. package/dist/elements/authorization/ui/CC.styles.js.map +1 -1
  22. package/dist/elements/authorization/ui/CcAuthorization.d.ts +14 -29
  23. package/dist/elements/authorization/ui/CcAuthorization.d.ts.map +1 -1
  24. package/dist/elements/authorization/ui/CcAuthorization.js +67 -158
  25. package/dist/elements/authorization/ui/CcAuthorization.js.map +1 -1
  26. package/dist/elements/http/CertificateAdd.element.d.ts +91 -0
  27. package/dist/elements/http/CertificateAdd.element.d.ts.map +1 -0
  28. package/dist/elements/http/CertificateAdd.element.js +389 -0
  29. package/dist/elements/http/CertificateAdd.element.js.map +1 -0
  30. package/dist/elements/http/CertificateAdd.styles.d.ts +3 -0
  31. package/dist/elements/http/CertificateAdd.styles.d.ts.map +1 -0
  32. package/dist/elements/http/CertificateAdd.styles.js +61 -0
  33. package/dist/elements/http/CertificateAdd.styles.js.map +1 -0
  34. package/dist/elements/project/ProjectRunReport.d.ts +2 -1
  35. package/dist/elements/project/ProjectRunReport.d.ts.map +1 -1
  36. package/dist/elements/project/ProjectRunReport.js.map +1 -1
  37. package/dist/elements/store/FilePicker.styles.d.ts.map +1 -1
  38. package/dist/elements/store/FilePicker.styles.js +1 -0
  39. package/dist/elements/store/FilePicker.styles.js.map +1 -1
  40. package/dist/events/EventTypes.d.ts +6 -7
  41. package/dist/events/EventTypes.d.ts.map +1 -1
  42. package/dist/events/EventTypes.js +7 -7
  43. package/dist/events/EventTypes.js.map +1 -1
  44. package/dist/events/Events.d.ts +6 -1
  45. package/dist/events/Events.d.ts.map +1 -1
  46. package/dist/events/Events.js +2 -0
  47. package/dist/events/Events.js.map +1 -1
  48. package/dist/events/FilesystemEvents.d.ts +8 -0
  49. package/dist/events/FilesystemEvents.d.ts.map +1 -0
  50. package/dist/events/FilesystemEvents.js +59 -0
  51. package/dist/events/FilesystemEvents.js.map +1 -0
  52. package/dist/events/HttpClientEvents.d.ts +0 -2
  53. package/dist/events/HttpClientEvents.d.ts.map +1 -1
  54. package/dist/events/HttpClientEvents.js +0 -2
  55. package/dist/events/HttpClientEvents.js.map +1 -1
  56. package/dist/http-client/idb/Arc18DataUpgrade.d.ts +0 -8
  57. package/dist/http-client/idb/Arc18DataUpgrade.d.ts.map +1 -1
  58. package/dist/http-client/idb/Arc18DataUpgrade.js +11 -206
  59. package/dist/http-client/idb/Arc18DataUpgrade.js.map +1 -1
  60. package/dist/http-client/store/StoreBroadcast.d.ts +0 -5
  61. package/dist/http-client/store/StoreBroadcast.d.ts.map +1 -1
  62. package/dist/http-client/store/StoreBroadcast.js +0 -7
  63. package/dist/http-client/store/StoreBroadcast.js.map +1 -1
  64. package/dist/lib/files/FileUtils.d.ts +9 -0
  65. package/dist/lib/files/FileUtils.d.ts.map +1 -0
  66. package/dist/lib/files/FileUtils.js +13 -0
  67. package/dist/lib/files/FileUtils.js.map +1 -0
  68. package/dist/mixins/RouteMixin.d.ts +4 -0
  69. package/dist/mixins/RouteMixin.d.ts.map +1 -1
  70. package/dist/mixins/RouteMixin.js +1 -0
  71. package/dist/mixins/RouteMixin.js.map +1 -1
  72. package/dist/pages/api-client/ApiClient.screen.d.ts +4 -0
  73. package/dist/pages/api-client/ApiClient.screen.d.ts.map +1 -1
  74. package/dist/pages/api-client/ApiClient.screen.js +23 -2
  75. package/dist/pages/api-client/ApiClient.screen.js.map +1 -1
  76. package/dist/pages/api-client/ApiClient.styles.d.ts.map +1 -1
  77. package/dist/pages/api-client/ApiClient.styles.js +0 -12
  78. package/dist/pages/api-client/ApiClient.styles.js.map +1 -1
  79. package/dist/pages/api-client/pages/Files.page.d.ts.map +1 -1
  80. package/dist/pages/api-client/pages/Files.page.js +13 -0
  81. package/dist/pages/api-client/pages/Files.page.js.map +1 -1
  82. package/dist/ui/button/SegmentedButtonsSet.d.ts +14 -0
  83. package/dist/ui/button/SegmentedButtonsSet.d.ts.map +1 -1
  84. package/dist/ui/button/SegmentedButtonsSet.js.map +1 -1
  85. package/dist/ui/notification/SnackNotifications.d.ts +1 -0
  86. package/dist/ui/notification/SnackNotifications.d.ts.map +1 -1
  87. package/dist/ui/notification/SnackNotifications.js +7 -0
  88. package/dist/ui/notification/SnackNotifications.js.map +1 -1
  89. package/package.json +1 -1
  90. package/src/bindings/base/FileBindings.ts +25 -1
  91. package/src/bindings/base/StoreBindings.ts +1 -73
  92. package/src/bindings/web/WebFileBindings.ts +1 -1
  93. package/src/define/http/certificate-add.ts +12 -0
  94. package/src/define/ui/ui-segmented-button-set.ts +1 -1
  95. package/src/elements/authorization/ui/CC.styles.ts +4 -9
  96. package/src/elements/authorization/ui/CcAuthorization.ts +67 -167
  97. package/src/elements/http/CertificateAdd.element.ts +443 -0
  98. package/src/elements/http/CertificateAdd.styles.ts +61 -0
  99. package/src/elements/project/ProjectRunReport.ts +2 -1
  100. package/src/elements/store/FilePicker.styles.ts +1 -0
  101. package/src/events/EventTypes.ts +7 -7
  102. package/src/events/Events.ts +2 -0
  103. package/src/events/FilesystemEvents.ts +63 -0
  104. package/src/events/HttpClientEvents.ts +0 -2
  105. package/src/http-client/idb/Arc18DataUpgrade.ts +84 -84
  106. package/src/http-client/store/StoreBroadcast.ts +0 -8
  107. package/src/lib/files/FileUtils.ts +12 -0
  108. package/src/mixins/RouteMixin.ts +8 -1
  109. package/src/pages/api-client/ApiClient.screen.ts +26 -2
  110. package/src/pages/api-client/ApiClient.styles.ts +0 -12
  111. package/src/pages/api-client/pages/Files.page.ts +11 -0
  112. package/src/ui/button/SegmentedButtonsSet.ts +16 -1
  113. package/src/ui/notification/SnackNotifications.ts +8 -0
  114. package/test/elements/http/BodyFormdataEditorElement.test.ts +458 -454
  115. package/test/elements/http/BodyMultipartEditorElement.test.ts +609 -605
  116. package/test/elements/http/BodyRawEditorElement.test.ts +60 -56
  117. package/test/elements/http/CertificateAdd.test.ts +430 -0
  118. package/test/events/EventTypes.test.ts +0 -22
  119. package/test/helpers/UiMock.ts +19 -2
  120. package/web-test-runner.config.mjs +4 -3
  121. package/dist/events/http-client/models/CertificatesEvents.d.ts +0 -12
  122. package/dist/events/http-client/models/CertificatesEvents.d.ts.map +0 -1
  123. package/dist/events/http-client/models/CertificatesEvents.js +0 -18
  124. package/dist/events/http-client/models/CertificatesEvents.js.map +0 -1
  125. package/dist/http-client/idb/AuthDataModel.d.ts +0 -60
  126. package/dist/http-client/idb/AuthDataModel.d.ts.map +0 -1
  127. package/dist/http-client/idb/AuthDataModel.js +0 -150
  128. package/dist/http-client/idb/AuthDataModel.js.map +0 -1
  129. package/dist/http-client/idb/HostsModel.d.ts +0 -25
  130. package/dist/http-client/idb/HostsModel.d.ts.map +0 -1
  131. package/dist/http-client/idb/HostsModel.js +0 -82
  132. package/dist/http-client/idb/HostsModel.js.map +0 -1
  133. package/dist/http-client/idb/LegacyMockedStore.d.ts +0 -214
  134. package/dist/http-client/idb/LegacyMockedStore.d.ts.map +0 -1
  135. package/dist/http-client/idb/LegacyMockedStore.js +0 -486
  136. package/dist/http-client/idb/LegacyMockedStore.js.map +0 -1
  137. package/src/events/http-client/models/CertificatesEvents.ts +0 -23
  138. package/src/http-client/idb/AuthDataModel.ts +0 -175
  139. package/src/http-client/idb/HostsModel.ts +0 -125
  140. package/src/http-client/idb/LegacyMockedStore.ts +0 -544
  141. 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":"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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\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('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"]}
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;CAiBrC"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@api-client/ui",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "description": "UI for API Client.",
5
5
  "license": "CC-BY-2.0",
6
6
  "main": "dist/index.js",
@@ -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
+ }
@@ -9,6 +9,6 @@ export class UiSegmentedButtonSetElement extends Element {
9
9
 
10
10
  declare global {
11
11
  interface HTMLElementTagNameMap {
12
- 'ui-segmented-button-set': UiSegmentedButtonSetElement;
12
+ 'ui-segmented-button-set': Element;
13
13
  }
14
14
  }
@@ -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
- form {
16
- overflow: auto;
17
- flex: 1;
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 '@github/relative-time-element';
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 type RadioElement from "../../../ui/input/RadioElement.js";
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-radio.js';
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() items?: ICertificate[];
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
- protected handleCreated(event: BroadcastCreatedEvent): void {
54
- const cert = event.data as ICertificate;
55
- if (!this.items) {
56
- this.items = [];
18
+ get config(): ICCAuthorization {
19
+ const { authorization } = this;
20
+ if (!authorization) {
21
+ return { };
57
22
  }
58
- const index = this.items.findIndex(i => i.key === cert.key);
59
- if (index >= 0) {
60
- this.items[index] = cert;
61
- } else {
62
- this.items.push(cert);
23
+ if (!authorization.config) {
24
+ authorization.config = {} as ICCAuthorization;
63
25
  }
64
- this.requestUpdate();
26
+ return authorization.config as ICCAuthorization;
65
27
  }
66
28
 
67
- protected handleDeleted(event: DeletedBroadcastEvent): void {
68
- if (!this.items) {
29
+ protected handleClose(e: CustomEvent<FilePickerClosingReason>): void {
30
+ const { canceled, file } = e.detail;
31
+ if (canceled) {
69
32
  return;
70
33
  }
71
- const { key } = event;
72
- const index = this.items.findIndex(i => i.key === key);
73
- if (index >= 0) {
74
- this.items.splice(index, 1);
75
- this.requestUpdate();
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
- protected async queryCertificates(): Promise<void> {
80
- if (this.querying) {
81
- return;
82
- }
83
- this.querying = true;
42
+ async setCertificate(key: string): Promise<void> {
43
+ let result: unknown;
84
44
  try {
85
- const data = await Events.HttpClient.Model.Certificate.list({ limit: 100, space: "" }); // the space should be filled by the bindings / hosting app
86
- if (!data) {
87
- this.items = undefined;
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 handleSelected(e: Event): void {
100
- const { authorization } = this;
101
- if (!authorization) {
102
- return;
55
+ protected handleDropDownOpen(): void {
56
+ this.selectorRendered = true;
57
+ if (this.isUpdatePending) {
58
+ this.scheduleUpdate();
103
59
  }
60
+ }
104
61
 
105
- const radio = e.target as RadioElement;
106
- const { checked, value } = radio;
107
- if (!checked) {
108
- return;
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 { authorization, loadingError, items } = this;
138
- if (!authorization) {
139
- return nothing;
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
- ${loadingError ? this.renderErrorState(loadingError) : ''}
150
- ${hasItems ? html`
151
- <form autocomplete="on" class="auth-form basic-auth">
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 renderErrorState(error: string): TemplateResult {
159
- return html`<p class="error-message">Unable to load certificates: ${error}.</p>`;
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
- ${this.renderNoneItem(currentKey)}
170
- ${items.map((item) => this.renderCertItem(item, currentKey))}
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
- <relative-time datetime="${d.toISOString()}"></relative-time>
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
  }