@api-client/ui 0.0.12 → 0.0.14

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 (194) 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/http/http-body-editor.d.ts.map +1 -1
  17. package/dist/define/http/http-body-editor.js +1 -1
  18. package/dist/define/http/http-body-editor.js.map +1 -1
  19. package/dist/define/ui/ui-segmented-button-set.d.ts +1 -1
  20. package/dist/define/ui/ui-segmented-button-set.d.ts.map +1 -1
  21. package/dist/define/ui/ui-segmented-button-set.js.map +1 -1
  22. package/dist/elements/authorization/ui/CC.styles.d.ts.map +1 -1
  23. package/dist/elements/authorization/ui/CC.styles.js +4 -9
  24. package/dist/elements/authorization/ui/CC.styles.js.map +1 -1
  25. package/dist/elements/authorization/ui/CcAuthorization.d.ts +14 -29
  26. package/dist/elements/authorization/ui/CcAuthorization.d.ts.map +1 -1
  27. package/dist/elements/authorization/ui/CcAuthorization.js +67 -158
  28. package/dist/elements/authorization/ui/CcAuthorization.js.map +1 -1
  29. package/dist/elements/http/BodyEditor.js +5 -5
  30. package/dist/elements/http/BodyEditor.js.map +1 -1
  31. package/dist/elements/http/BodyEditor.styles.d.ts +1 -1
  32. package/dist/elements/http/BodyEditor.styles.d.ts.map +1 -1
  33. package/dist/elements/http/BodyEditor.styles.js +5 -19
  34. package/dist/elements/http/BodyEditor.styles.js.map +1 -1
  35. package/dist/elements/http/CertificateAdd.element.d.ts +91 -0
  36. package/dist/elements/http/CertificateAdd.element.d.ts.map +1 -0
  37. package/dist/elements/http/CertificateAdd.element.js +389 -0
  38. package/dist/elements/http/CertificateAdd.element.js.map +1 -0
  39. package/dist/elements/http/CertificateAdd.styles.d.ts +3 -0
  40. package/dist/elements/http/CertificateAdd.styles.d.ts.map +1 -0
  41. package/dist/elements/http/CertificateAdd.styles.js +61 -0
  42. package/dist/elements/http/CertificateAdd.styles.js.map +1 -0
  43. package/dist/elements/project/ProjectRunReport.d.ts +2 -1
  44. package/dist/elements/project/ProjectRunReport.d.ts.map +1 -1
  45. package/dist/elements/project/ProjectRunReport.js.map +1 -1
  46. package/dist/elements/store/FilePicker.styles.d.ts.map +1 -1
  47. package/dist/elements/store/FilePicker.styles.js +1 -0
  48. package/dist/elements/store/FilePicker.styles.js.map +1 -1
  49. package/dist/elements/store/FilesLib.d.ts +2 -2
  50. package/dist/elements/store/FilesLib.d.ts.map +1 -1
  51. package/dist/elements/store/FilesLib.js.map +1 -1
  52. package/dist/events/EventTypes.d.ts +6 -7
  53. package/dist/events/EventTypes.d.ts.map +1 -1
  54. package/dist/events/EventTypes.js +7 -7
  55. package/dist/events/EventTypes.js.map +1 -1
  56. package/dist/events/Events.d.ts +6 -1
  57. package/dist/events/Events.d.ts.map +1 -1
  58. package/dist/events/Events.js +2 -0
  59. package/dist/events/Events.js.map +1 -1
  60. package/dist/events/FilesystemEvents.d.ts +8 -0
  61. package/dist/events/FilesystemEvents.d.ts.map +1 -0
  62. package/dist/events/FilesystemEvents.js +59 -0
  63. package/dist/events/FilesystemEvents.js.map +1 -0
  64. package/dist/events/HttpClientEvents.d.ts +0 -2
  65. package/dist/events/HttpClientEvents.d.ts.map +1 -1
  66. package/dist/events/HttpClientEvents.js +0 -2
  67. package/dist/events/HttpClientEvents.js.map +1 -1
  68. package/dist/http-client/idb/Arc18DataUpgrade.d.ts +0 -8
  69. package/dist/http-client/idb/Arc18DataUpgrade.d.ts.map +1 -1
  70. package/dist/http-client/idb/Arc18DataUpgrade.js +11 -206
  71. package/dist/http-client/idb/Arc18DataUpgrade.js.map +1 -1
  72. package/dist/http-client/store/Cursor.js +2 -2
  73. package/dist/http-client/store/Cursor.js.map +1 -1
  74. package/dist/http-client/store/HttpClientIdbDatabase.d.ts.map +1 -1
  75. package/dist/http-client/store/HttpClientIdbDatabase.js +2 -6
  76. package/dist/http-client/store/HttpClientIdbDatabase.js.map +1 -1
  77. package/dist/http-client/store/State.d.ts +1 -3
  78. package/dist/http-client/store/State.d.ts.map +1 -1
  79. package/dist/http-client/store/State.js.map +1 -1
  80. package/dist/http-client/store/StoreBroadcast.d.ts +0 -5
  81. package/dist/http-client/store/StoreBroadcast.d.ts.map +1 -1
  82. package/dist/http-client/store/StoreBroadcast.js +0 -7
  83. package/dist/http-client/store/StoreBroadcast.js.map +1 -1
  84. package/dist/http-client/store/idb/IdbStore.d.ts +1 -10
  85. package/dist/http-client/store/idb/IdbStore.d.ts.map +1 -1
  86. package/dist/http-client/store/idb/IdbStore.js +0 -48
  87. package/dist/http-client/store/idb/IdbStore.js.map +1 -1
  88. package/dist/http-client/store/types.d.ts +2 -56
  89. package/dist/http-client/store/types.d.ts.map +1 -1
  90. package/dist/http-client/store/types.js.map +1 -1
  91. package/dist/index.d.ts +1 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +2 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/lib/files/FileUtils.d.ts +9 -0
  96. package/dist/lib/files/FileUtils.d.ts.map +1 -0
  97. package/dist/lib/files/FileUtils.js +13 -0
  98. package/dist/lib/files/FileUtils.js.map +1 -0
  99. package/dist/mixins/RouteMixin.d.ts +4 -0
  100. package/dist/mixins/RouteMixin.d.ts.map +1 -1
  101. package/dist/mixins/RouteMixin.js +1 -0
  102. package/dist/mixins/RouteMixin.js.map +1 -1
  103. package/dist/pages/api-client/ApiClient.screen.d.ts +8 -4
  104. package/dist/pages/api-client/ApiClient.screen.d.ts.map +1 -1
  105. package/dist/pages/api-client/ApiClient.screen.js +25 -4
  106. package/dist/pages/api-client/ApiClient.screen.js.map +1 -1
  107. package/dist/pages/api-client/ApiClient.styles.d.ts.map +1 -1
  108. package/dist/pages/api-client/ApiClient.styles.js +0 -12
  109. package/dist/pages/api-client/ApiClient.styles.js.map +1 -1
  110. package/dist/pages/api-client/pages/Files.page.d.ts.map +1 -1
  111. package/dist/pages/api-client/pages/Files.page.js +13 -0
  112. package/dist/pages/api-client/pages/Files.page.js.map +1 -1
  113. package/dist/pages/api-client/pages/Trash.page.d.ts.map +1 -1
  114. package/dist/pages/api-client/pages/Trash.page.js +3 -11
  115. package/dist/pages/api-client/pages/Trash.page.js.map +1 -1
  116. package/dist/ui/button/SegmentedButtonsSet.d.ts +14 -0
  117. package/dist/ui/button/SegmentedButtonsSet.d.ts.map +1 -1
  118. package/dist/ui/button/SegmentedButtonsSet.js.map +1 -1
  119. package/dist/ui/list/UiDropdownList.js +1 -1
  120. package/dist/ui/list/UiDropdownList.js.map +1 -1
  121. package/dist/ui/notification/SnackNotifications.d.ts +1 -0
  122. package/dist/ui/notification/SnackNotifications.d.ts.map +1 -1
  123. package/dist/ui/notification/SnackNotifications.js +7 -0
  124. package/dist/ui/notification/SnackNotifications.js.map +1 -1
  125. package/package.json +2 -2
  126. package/src/bindings/base/FileBindings.ts +25 -1
  127. package/src/bindings/base/StoreBindings.ts +1 -73
  128. package/src/bindings/web/WebFileBindings.ts +1 -1
  129. package/src/define/http/certificate-add.ts +12 -0
  130. package/src/define/http/http-body-editor.ts +1 -1
  131. package/src/define/ui/ui-segmented-button-set.ts +1 -1
  132. package/src/elements/authorization/ui/CC.styles.ts +4 -9
  133. package/src/elements/authorization/ui/CcAuthorization.ts +67 -167
  134. package/src/elements/http/BodyEditor.styles.ts +5 -19
  135. package/src/elements/http/BodyEditor.ts +5 -5
  136. package/src/elements/http/CertificateAdd.element.ts +443 -0
  137. package/src/elements/http/CertificateAdd.styles.ts +61 -0
  138. package/src/elements/project/ProjectRunReport.ts +2 -1
  139. package/src/elements/store/FilePicker.styles.ts +1 -0
  140. package/src/elements/store/FilesLib.ts +2 -2
  141. package/src/events/EventTypes.ts +7 -7
  142. package/src/events/Events.ts +2 -0
  143. package/src/events/FilesystemEvents.ts +63 -0
  144. package/src/events/HttpClientEvents.ts +0 -2
  145. package/src/http-client/idb/Arc18DataUpgrade.ts +84 -84
  146. package/src/http-client/store/Cursor.ts +2 -2
  147. package/src/http-client/store/HttpClientIdbDatabase.ts +5 -9
  148. package/src/http-client/store/State.ts +1 -5
  149. package/src/http-client/store/StoreBroadcast.ts +0 -8
  150. package/src/http-client/store/idb/IdbStore.ts +1 -51
  151. package/src/http-client/store/types.ts +2 -57
  152. package/src/index.ts +3 -0
  153. package/src/lib/files/FileUtils.ts +12 -0
  154. package/src/mixins/RouteMixin.ts +8 -1
  155. package/src/pages/api-client/ApiClient.screen.ts +33 -9
  156. package/src/pages/api-client/ApiClient.styles.ts +0 -12
  157. package/src/pages/api-client/pages/Files.page.ts +11 -0
  158. package/src/pages/api-client/pages/Trash.page.ts +3 -10
  159. package/src/ui/button/SegmentedButtonsSet.ts +16 -1
  160. package/src/ui/list/UiDropdownList.ts +1 -1
  161. package/src/ui/notification/SnackNotifications.ts +8 -0
  162. package/test/elements/http/BodyFormdataEditorElement.test.ts +458 -454
  163. package/test/elements/http/BodyMultipartEditorElement.test.ts +609 -605
  164. package/test/elements/http/BodyRawEditorElement.test.ts +60 -56
  165. package/test/elements/http/CertificateAdd.test.ts +430 -0
  166. package/test/events/EventTypes.test.ts +0 -22
  167. package/test/helpers/UiMock.ts +19 -2
  168. package/web-test-runner.config.mjs +6 -5
  169. package/dist/events/http-client/models/CertificatesEvents.d.ts +0 -12
  170. package/dist/events/http-client/models/CertificatesEvents.d.ts.map +0 -1
  171. package/dist/events/http-client/models/CertificatesEvents.js +0 -18
  172. package/dist/events/http-client/models/CertificatesEvents.js.map +0 -1
  173. package/dist/http-client/idb/AuthDataModel.d.ts +0 -60
  174. package/dist/http-client/idb/AuthDataModel.d.ts.map +0 -1
  175. package/dist/http-client/idb/AuthDataModel.js +0 -150
  176. package/dist/http-client/idb/AuthDataModel.js.map +0 -1
  177. package/dist/http-client/idb/HostsModel.d.ts +0 -25
  178. package/dist/http-client/idb/HostsModel.d.ts.map +0 -1
  179. package/dist/http-client/idb/HostsModel.js +0 -82
  180. package/dist/http-client/idb/HostsModel.js.map +0 -1
  181. package/dist/http-client/idb/LegacyMockedStore.d.ts +0 -214
  182. package/dist/http-client/idb/LegacyMockedStore.d.ts.map +0 -1
  183. package/dist/http-client/idb/LegacyMockedStore.js +0 -486
  184. package/dist/http-client/idb/LegacyMockedStore.js.map +0 -1
  185. package/dist/http-client/store/Validator.d.ts +0 -4
  186. package/dist/http-client/store/Validator.d.ts.map +0 -1
  187. package/dist/http-client/store/Validator.js +0 -32
  188. package/dist/http-client/store/Validator.js.map +0 -1
  189. package/src/events/http-client/models/CertificatesEvents.ts +0 -23
  190. package/src/http-client/idb/AuthDataModel.ts +0 -175
  191. package/src/http-client/idb/HostsModel.ts +0 -125
  192. package/src/http-client/idb/LegacyMockedStore.ts +0 -544
  193. package/src/http-client/store/Validator.ts +0 -33
  194. package/test/apic-ui.test.ts +0 -31
@@ -1 +1 @@
1
- {"version":3,"file":"Trash.page.d.ts","sourceRoot":"","sources":["../../../../src/pages/api-client/pages/Trash.page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,UAAU,EAAkC,cAAc,EAAuC,MAAM,mCAAmC,CAAC;AACzL,OAAO,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,+BAA+B,CAAC;AAIvC,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,+BAA+B,CAAC;AAEvC;;GAEG;AACH,qBAAa,SAAS;IAiCR,SAAS,CAAC,MAAM,EAAE,eAAe;IAhC7C,KAAK,EAAE,UAAU,EAAE,CAAM;IAEzB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,EAAE,wBAAmE;IAErE,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB,IAAI,WAAW,IAAI,UAAU,EAAE,CAa9B;gBAEqB,MAAM,EAAE,eAAe;IAa7C,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAQ5C,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAMlD,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IASzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,SAAS,IAAI,IAAI;IAKX,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BhC;;;;OAIG;IACH,iBAAiB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM;IAIvD,SAAS,CAAC,wBAAwB,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAiBlD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBvC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,SAAS,CAAC,yBAAyB,IAAI,IAAI;IAI3C,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAIvC,SAAS,CAAC,gBAAgB,IAAI,IAAI;IASlC,SAAS,CAAC,uBAAuB,IAAI,IAAI;IAKzC,SAAS,CAAC,kBAAkB,IAAI,IAAI;IAWpC,MAAM,IAAI,cAAc;IAaxB,SAAS,CAAC,gBAAgB,IAAI,cAAc;IAW5C,SAAS,CAAC,gBAAgB,IAAI,cAAc;IAI5C,SAAS,CAAC,gBAAgB,IAAI,cAAc;IAM5C,SAAS,CAAC,iBAAiB,IAAI,cAAc,EAAE;IAO/C,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,EAAE;IAyB7D,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc;IA8B7D,SAAS,CAAC,qBAAqB,IAAI,cAAc;IAiBjD,SAAS,CAAC,uBAAuB,IAAI,cAAc;IAgBnD,SAAS,CAAC,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc;IAalE,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,cAAc;CAYrE"}
1
+ {"version":3,"file":"Trash.page.d.ts","sourceRoot":"","sources":["../../../../src/pages/api-client/pages/Trash.page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,UAAU,EAAkC,cAAc,EAAyB,MAAM,mCAAmC,CAAC;AAClJ,OAAO,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,+BAA+B,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,+BAA+B,CAAC;AAEvC;;GAEG;AACH,qBAAa,SAAS;IAiCR,SAAS,CAAC,MAAM,EAAE,eAAe;IAhC7C,KAAK,EAAE,UAAU,EAAE,CAAM;IAEzB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,EAAE,wBAAmE;IAErE,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB,IAAI,WAAW,IAAI,UAAU,EAAE,CAa9B;gBAEqB,MAAM,EAAE,eAAe;IAa7C,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAQ5C,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAMlD,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IASzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,SAAS,IAAI,IAAI;IAKX,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BhC;;;;OAIG;IACH,iBAAiB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM;IAIvD,SAAS,CAAC,wBAAwB,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAiBlD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBvC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,SAAS,CAAC,yBAAyB,IAAI,IAAI;IAI3C,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAIvC,SAAS,CAAC,gBAAgB,IAAI,IAAI;IASlC,SAAS,CAAC,uBAAuB,IAAI,IAAI;IAKzC,SAAS,CAAC,kBAAkB,IAAI,IAAI;IAWpC,MAAM,IAAI,cAAc;IAaxB,SAAS,CAAC,gBAAgB,IAAI,cAAc;IAW5C,SAAS,CAAC,gBAAgB,IAAI,cAAc;IAI5C,SAAS,CAAC,gBAAgB,IAAI,cAAc;IAM5C,SAAS,CAAC,iBAAiB,IAAI,cAAc,EAAE;IAO/C,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,EAAE;IAkB7D,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc;IA8B7D,SAAS,CAAC,qBAAqB,IAAI,cAAc;IAiBjD,SAAS,CAAC,uBAAuB,IAAI,cAAc;IAgBnD,SAAS,CAAC,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc;IAalE,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,cAAc;CAYrE"}
@@ -1,9 +1,10 @@
1
- import { ProjectKind, EventUtils, FolderKind, DataFileKind } from "@api-client/core/build/browser.js";
1
+ import { EventUtils } from "@api-client/core/build/browser.js";
2
2
  import { html } from "lit";
3
3
  import '@github/relative-time-element';
4
4
  import { navigate } from "../../../lib/route.js";
5
5
  import { SnackNotifications } from "../../../ui/notification/SnackNotifications.js";
6
6
  import { DataTable } from "../../../ui/table/DataTable.js";
7
+ import { fileIcon } from "../../../elements/store/FilesLib.js";
7
8
  import '../../../define/ui/ui-icon.js';
8
9
  /**
9
10
  * A class that specializes in rendering the list of trash in HTTP Client.
@@ -216,16 +217,7 @@ export class TrashPage {
216
217
  }
217
218
  renderTableItem(item) {
218
219
  const { kind, name, info } = item;
219
- let icon;
220
- if (kind === ProjectKind) {
221
- icon = 'collectionsBookmark';
222
- }
223
- else if (kind === FolderKind) {
224
- icon = 'folder';
225
- }
226
- else if (kind === DataFileKind) {
227
- icon = 'schema';
228
- }
220
+ const icon = fileIcon(item);
229
221
  const nameCell = this.dt.cell(html `
230
222
  ${icon ? html `<ui-icon icon="${icon}" class="cell-icon"></ui-icon>` : ''}
231
223
  ${name || 'Unnamed file'}
@@ -1 +1 @@
1
- {"version":3,"file":"Trash.page.js","sourceRoot":"","sources":["../../../../src/pages/api-client/pages/Trash.page.ts"],"names":[],"mappings":"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","sourcesContent":["import { ProjectKind, EventUtils, FolderKind, TrashEntry, ContextSpaceListOptions, IFile, BroadcastEvent, BroadcastCreatedEvent, DataFileKind } from \"@api-client/core/build/browser.js\";\nimport { html, TemplateResult } from \"lit\";\nimport '@github/relative-time-element';\nimport { IconType } from \"../../../ui/icons/Icons.js\";\nimport { navigate } from \"../../../lib/route.js\";\nimport { SnackNotifications } from \"../../../ui/notification/SnackNotifications.js\";\nimport { DataTable } from \"../../../ui/table/DataTable.js\";\nimport type ApiClientScreen from \"../ApiClient.screen.js\";\nimport '../../../define/ui/ui-icon.js';\n\n/**\n * A class that specializes in rendering the list of trash in HTTP Client.\n */\nexport class TrashPage {\n files: TrashEntry[] = [];\n\n /**\n * The pagination cursor for trash.\n * As long there's a cursor, there are more files to request.\n */\n cursor?: string;\n\n dt = new DataTable(() => this.files, { ariaLabel: 'Trashed files' });\n\n readingFiles?: boolean;\n\n /**\n * The list of keys of files to delete.\n */\n deleteKeys?: string[];\n\n get deleteItems(): TrashEntry[] {\n const { deleteKeys, files } = this;\n if (!deleteKeys) {\n return [];\n }\n const result: TrashEntry[] = [];\n deleteKeys.forEach((key) => {\n const item = files.find(i => i.key === key);\n if (item) {\n result.push(item);\n }\n });\n return result;\n }\n\n constructor(protected screen: ApiClientScreen) {\n this.dt.addEventListener('empty', this.renderEmptyTable.bind(this));\n this.dt.addEventListener('header', this.renderTableHeader.bind(this));\n this.dt.addEventListener('item', this.renderTableItem.bind(this));\n\n this.itemOptionsSelectHandler = this.itemOptionsSelectHandler.bind(this);\n this.cancelDeleteAllDialog = this.cancelDeleteAllDialog.bind(this);\n this.deleteAllHandler = this.deleteAllHandler.bind(this);\n this.cancelDeleteFilesDialog = this.cancelDeleteFilesDialog.bind(this);\n this.deleteFilesHandler = this.deleteFilesHandler.bind(this);\n this.openEmptyAllDialogHandler = this.openEmptyAllDialogHandler.bind(this);\n }\n\n handleFileEvent(event: BroadcastEvent): void {\n switch (event.operation) {\n case 'created': this.handleTrashAdded((event as BroadcastCreatedEvent).data as TrashEntry); break;\n case 'deleted': this.handleTrashRemoved(event.key as string); break;\n default:\n }\n }\n\n protected handleTrashAdded(item: TrashEntry): void {\n this.files.push(item);\n this.files.sort(this.filesSortFunction.bind(this));\n this.screen.render();\n }\n\n protected handleTrashRemoved(key: string): void {\n const index = this.files.findIndex(i => i.key === key);\n if (index === -1) {\n return;\n }\n this.files.splice(index, 1);\n this.screen.render();\n }\n\n async refresh(): Promise<void> {\n this.resetList();\n this.screen.render();\n await this.readFiles();\n }\n\n resetList(): void {\n this.files = [];\n this.cursor = undefined;\n }\n\n async readFiles(): Promise<void> {\n const { selectedSpace } = this.screen;\n if (!selectedSpace) {\n return;\n }\n if (this.readingFiles) {\n return;\n }\n this.readingFiles = true;\n const { cursor: currentCursor } = this;\n const opts: ContextSpaceListOptions = {\n space: selectedSpace,\n descending: true,\n };\n if (currentCursor) {\n opts.cursor = currentCursor;\n }\n try {\n const result = await this.screen.bindings.store.trash.list(opts);\n const { items, cursor } = result;\n this.files = this.files.concat(items).sort(this.filesSortFunction.bind(this));\n this.cursor = cursor;\n } finally {\n this.readingFiles = false;\n }\n this.screen.render();\n }\n\n /**\n * Sorts files on the list.\n * \n * Folders are always on top.\n */\n filesSortFunction(a: TrashEntry, b: TrashEntry): number {\n return b.info.time - a.info.time;\n }\n\n protected itemOptionsSelectHandler(e: CustomEvent): void {\n const item = e.detail.item as HTMLElement;\n const list = e.target as HTMLElement;\n const operation = item.dataset.option as string;\n const key = list.dataset.key as string;\n if (!key || !operation) {\n return;\n }\n if (operation === 'restore') {\n this.restoreItem(key);\n } else if (operation === 'delete') {\n this.deleteKeys = [key];\n this.screen.render();\n this.screen.openDialog('deleteFilesDialog');\n }\n }\n\n async restoreItem(key: string): Promise<void> {\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n const record = await bindings.store.trash.restore(key);\n const file = record.item as IFile;\n const parentId = file.parents && file.parents.length ? file.parents[file.parents.length - 1] : undefined;\n SnackNotifications.notify(`Restored file: ${file.info.name}`, {\n actionLabel: 'Go to file location',\n actionCallback: () => {\n if (parentId) {\n navigate('files', parentId);\n } else {\n navigate('files');\n }\n },\n });\n }\n\n async deleteItem(key: string): Promise<void> {\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n await bindings.store.trash.delete(key);\n }\n\n protected openEmptyAllDialogHandler(): void {\n this.screen.openDialog('deleteAllDialog');\n }\n\n protected cancelDeleteAllDialog(): void {\n this.screen.closeDialog('deleteAllDialog');\n }\n\n protected deleteAllHandler(): void {\n this.screen.closeDialog('deleteAllDialog');\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n bindings.store.trash.empty(selectedSpace);\n }\n\n protected cancelDeleteFilesDialog(): void {\n this.deleteKeys = undefined;\n this.screen.closeDialog('deleteFilesDialog');\n }\n\n protected deleteFilesHandler(): void {\n this.screen.closeDialog('deleteFilesDialog');\n this.screen.render();\n const { deleteKeys } = this;\n this.deleteKeys = undefined;\n if (!deleteKeys || !deleteKeys.length) {\n return;\n }\n deleteKeys.forEach(k => this.deleteItem(k));\n }\n\n render(): TemplateResult {\n return html`\n <div class=\"section-header\">\n <h2 class=\"headline-small\">Trash</h2>\n <div class=\"spacer\"></div>\n ${this.renderEmptyTrash()}\n </div>\n ${this.renderTrashTable()}\n ${this.renderDeleteAllDialog()}\n ${this.renderDeleteFilesDialog()}\n `;\n }\n\n protected renderEmptyTrash(): TemplateResult {\n const { files } = this;\n const disabled = !files || !files.length;\n return html`\n <ui-button type=\"outlined\" ?disabled=\"${disabled}\" @click=\"${this.openEmptyAllDialogHandler}\">\n <ui-icon icon=\"deleteOutline\" slot=\"icon\"></ui-icon>\n Empty trash\n </ui-button>\n `;\n }\n\n protected renderTrashTable(): TemplateResult {\n return this.dt.render();\n }\n\n protected renderEmptyTable(): TemplateResult {\n return html`\n <p>The trash bin is empty.</p>\n `;\n }\n\n protected renderTableHeader(): TemplateResult[] {\n const name = this.dt.header('Name', { class: 'name-cell' });\n const deleted = this.dt.header('Deleted', { class: 'updated-cell' });\n const menu = this.dt.header(html`<span hidden>Menu</span>`, { class: 'menu-cell' });\n return [name, deleted, menu];\n }\n\n protected renderTableItem(item: TrashEntry): TemplateResult[] {\n const { kind, name, info } = item;\n let icon: IconType | undefined;\n if (kind === ProjectKind) {\n icon = 'collectionsBookmark';\n } else if (kind === FolderKind) {\n icon = 'folder';\n } else if (kind === DataFileKind) {\n icon = 'schema';\n }\n\n const nameCell = this.dt.cell(html`\n ${icon ? html`<ui-icon icon=\"${icon}\" class=\"cell-icon\"></ui-icon>` : ''}\n ${name || 'Unnamed file'}\n `, { class: 'name-cell', data: { kind } });\n\n const deleted = this.dt.cell(html`\n <relative-time datetime=\"${new Date(info.time).toISOString()}\"></relative-time>\n `, { class: 'updated-cell' });\n\n const menu = this.dt.cell(this.renderItemOptions(item), { class: 'menu-cell' });\n\n return [nameCell, deleted, menu];\n }\n\n protected renderItemOptions(item: TrashEntry): TemplateResult {\n return html`\n <ui-dropdown-list\n horizontalAlign=\"auto\"\n verticalAlign=\"auto\"\n closeOnOutsideClick\n @mousedown=\"${EventUtils.cancelEvent}\" \n @mouseup=\"${EventUtils.cancelEvent}\" \n @click=\"${EventUtils.cancelEvent}\"\n @dblclick=\"${EventUtils.cancelEvent}\"\n @select=\"${this.itemOptionsSelectHandler}\"\n data-key=\"${item.key}\"\n >\n <ui-icon-button title=\"Project options\" aria-label=\"Activate for more options\">\n <ui-icon icon=\"moreVert\"></ui-icon>\n </ui-icon-button>\n <ui-list slot=\"dropdown\" role=\"menu\">\n <ui-list-item image=\"icon\" data-option=\"restore\" role=\"menuitem\" title=\"Restores the file to its original folder.\">\n <ui-icon icon=\"restoreFromTrash\" slot=\"start\"></ui-icon>\n Restore\n </ui-list-item>\n <ui-list-item image=\"icon\" data-option=\"delete\" role=\"menuitem\" title=\"Permanently deleted the item.\">\n <ui-icon icon=\"deleteOutline\" slot=\"start\"></ui-icon>\n Delete forever\n </ui-list-item>\n </ui-list>\n </ui-dropdown-list>\n `;\n }\n\n protected renderDeleteAllDialog(): TemplateResult {\n return html`\n <dialog id=\"deleteAllDialog\" class=\"warning\">\n <h3>Empty Trash?</h3>\n <div>\n <p class=\"body-medium\">\n This will permanently delete all files in the trash.\n </p>\n </div>\n <div class=\"dialog-buttons\">\n <ui-button type=\"text\" value=\"cancel\" @click=\"${this.cancelDeleteAllDialog}\">Cancel</ui-button>\n <ui-button type=\"text\" value=\"delete\" @click=\"${this.deleteAllHandler}\">Delete</ui-button>\n </div>\n </dialog>\n `;\n }\n\n protected renderDeleteFilesDialog(): TemplateResult {\n const { deleteItems } = this;\n return html`\n <dialog id=\"deleteFilesDialog\" class=\"warning\">\n <h3>Delete Forever?</h3>\n <div>\n ${deleteItems.length > 1 ? this.renderDeleteMultiFile(deleteItems) : this.renderDeleteSingleFile(deleteItems[0])}\n </div>\n <div class=\"dialog-buttons\">\n <ui-button type=\"text\" value=\"cancel\" @click=\"${this.cancelDeleteFilesDialog}\">Cancel</ui-button>\n <ui-button type=\"text\" value=\"delete\" @click=\"${this.deleteFilesHandler}\">Delete</ui-button>\n </div>\n </dialog>\n `;\n }\n\n protected renderDeleteSingleFile(item: TrashEntry): TemplateResult {\n if (!item) {\n return html`\n <p class=\"body-medium\">Invalid state. Couldn't find files to delete.</p>\n `;\n }\n return html`\n <p class=\"body-medium\">\n <b>\"${item.name}\"</b> will be deleted forever and you won't be able to restore it.\n </p>\n `;\n }\n\n protected renderDeleteMultiFile(items: TrashEntry[]): TemplateResult {\n return html`\n <p class=\"body-medium\">\n The following files will be deleted forever and you won't be able to restore them:\n </p>\n <ui-divider></ui-divider>\n <ul>\n ${items.map(i => html`<li>${i.name}</li>`)}\n </ul>\n <ui-divider></ui-divider>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"Trash.page.js","sourceRoot":"","sources":["../../../../src/pages/api-client/pages/Trash.page.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventUtils, TrashEntry, ContextSpaceListOptions, IFile, BroadcastEvent, BroadcastCreatedEvent } from \"@api-client/core/build/browser.js\";\nimport { html, TemplateResult } from \"lit\";\nimport '@github/relative-time-element';\nimport { navigate } from \"../../../lib/route.js\";\nimport { SnackNotifications } from \"../../../ui/notification/SnackNotifications.js\";\nimport { DataTable } from \"../../../ui/table/DataTable.js\";\nimport { fileIcon } from \"../../../elements/store/FilesLib.js\";\nimport type ApiClientScreen from \"../ApiClient.screen.js\";\nimport '../../../define/ui/ui-icon.js';\n\n/**\n * A class that specializes in rendering the list of trash in HTTP Client.\n */\nexport class TrashPage {\n files: TrashEntry[] = [];\n\n /**\n * The pagination cursor for trash.\n * As long there's a cursor, there are more files to request.\n */\n cursor?: string;\n\n dt = new DataTable(() => this.files, { ariaLabel: 'Trashed files' });\n\n readingFiles?: boolean;\n\n /**\n * The list of keys of files to delete.\n */\n deleteKeys?: string[];\n\n get deleteItems(): TrashEntry[] {\n const { deleteKeys, files } = this;\n if (!deleteKeys) {\n return [];\n }\n const result: TrashEntry[] = [];\n deleteKeys.forEach((key) => {\n const item = files.find(i => i.key === key);\n if (item) {\n result.push(item);\n }\n });\n return result;\n }\n\n constructor(protected screen: ApiClientScreen) {\n this.dt.addEventListener('empty', this.renderEmptyTable.bind(this));\n this.dt.addEventListener('header', this.renderTableHeader.bind(this));\n this.dt.addEventListener('item', this.renderTableItem.bind(this));\n\n this.itemOptionsSelectHandler = this.itemOptionsSelectHandler.bind(this);\n this.cancelDeleteAllDialog = this.cancelDeleteAllDialog.bind(this);\n this.deleteAllHandler = this.deleteAllHandler.bind(this);\n this.cancelDeleteFilesDialog = this.cancelDeleteFilesDialog.bind(this);\n this.deleteFilesHandler = this.deleteFilesHandler.bind(this);\n this.openEmptyAllDialogHandler = this.openEmptyAllDialogHandler.bind(this);\n }\n\n handleFileEvent(event: BroadcastEvent): void {\n switch (event.operation) {\n case 'created': this.handleTrashAdded((event as BroadcastCreatedEvent).data as TrashEntry); break;\n case 'deleted': this.handleTrashRemoved(event.key as string); break;\n default:\n }\n }\n\n protected handleTrashAdded(item: TrashEntry): void {\n this.files.push(item);\n this.files.sort(this.filesSortFunction.bind(this));\n this.screen.render();\n }\n\n protected handleTrashRemoved(key: string): void {\n const index = this.files.findIndex(i => i.key === key);\n if (index === -1) {\n return;\n }\n this.files.splice(index, 1);\n this.screen.render();\n }\n\n async refresh(): Promise<void> {\n this.resetList();\n this.screen.render();\n await this.readFiles();\n }\n\n resetList(): void {\n this.files = [];\n this.cursor = undefined;\n }\n\n async readFiles(): Promise<void> {\n const { selectedSpace } = this.screen;\n if (!selectedSpace) {\n return;\n }\n if (this.readingFiles) {\n return;\n }\n this.readingFiles = true;\n const { cursor: currentCursor } = this;\n const opts: ContextSpaceListOptions = {\n space: selectedSpace,\n descending: true,\n };\n if (currentCursor) {\n opts.cursor = currentCursor;\n }\n try {\n const result = await this.screen.bindings.store.trash.list(opts);\n const { items, cursor } = result;\n this.files = this.files.concat(items).sort(this.filesSortFunction.bind(this));\n this.cursor = cursor;\n } finally {\n this.readingFiles = false;\n }\n this.screen.render();\n }\n\n /**\n * Sorts files on the list.\n * \n * Folders are always on top.\n */\n filesSortFunction(a: TrashEntry, b: TrashEntry): number {\n return b.info.time - a.info.time;\n }\n\n protected itemOptionsSelectHandler(e: CustomEvent): void {\n const item = e.detail.item as HTMLElement;\n const list = e.target as HTMLElement;\n const operation = item.dataset.option as string;\n const key = list.dataset.key as string;\n if (!key || !operation) {\n return;\n }\n if (operation === 'restore') {\n this.restoreItem(key);\n } else if (operation === 'delete') {\n this.deleteKeys = [key];\n this.screen.render();\n this.screen.openDialog('deleteFilesDialog');\n }\n }\n\n async restoreItem(key: string): Promise<void> {\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n const record = await bindings.store.trash.restore(key);\n const file = record.item as IFile;\n const parentId = file.parents && file.parents.length ? file.parents[file.parents.length - 1] : undefined;\n SnackNotifications.notify(`Restored file: ${file.info.name}`, {\n actionLabel: 'Go to file location',\n actionCallback: () => {\n if (parentId) {\n navigate('files', parentId);\n } else {\n navigate('files');\n }\n },\n });\n }\n\n async deleteItem(key: string): Promise<void> {\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n await bindings.store.trash.delete(key);\n }\n\n protected openEmptyAllDialogHandler(): void {\n this.screen.openDialog('deleteAllDialog');\n }\n\n protected cancelDeleteAllDialog(): void {\n this.screen.closeDialog('deleteAllDialog');\n }\n\n protected deleteAllHandler(): void {\n this.screen.closeDialog('deleteAllDialog');\n const { bindings, selectedSpace } = this.screen;\n if (!selectedSpace) {\n throw new Error(`Invalid state: Folder is not selected.`);\n }\n bindings.store.trash.empty(selectedSpace);\n }\n\n protected cancelDeleteFilesDialog(): void {\n this.deleteKeys = undefined;\n this.screen.closeDialog('deleteFilesDialog');\n }\n\n protected deleteFilesHandler(): void {\n this.screen.closeDialog('deleteFilesDialog');\n this.screen.render();\n const { deleteKeys } = this;\n this.deleteKeys = undefined;\n if (!deleteKeys || !deleteKeys.length) {\n return;\n }\n deleteKeys.forEach(k => this.deleteItem(k));\n }\n\n render(): TemplateResult {\n return html`\n <div class=\"section-header\">\n <h2 class=\"headline-small\">Trash</h2>\n <div class=\"spacer\"></div>\n ${this.renderEmptyTrash()}\n </div>\n ${this.renderTrashTable()}\n ${this.renderDeleteAllDialog()}\n ${this.renderDeleteFilesDialog()}\n `;\n }\n\n protected renderEmptyTrash(): TemplateResult {\n const { files } = this;\n const disabled = !files || !files.length;\n return html`\n <ui-button type=\"outlined\" ?disabled=\"${disabled}\" @click=\"${this.openEmptyAllDialogHandler}\">\n <ui-icon icon=\"deleteOutline\" slot=\"icon\"></ui-icon>\n Empty trash\n </ui-button>\n `;\n }\n\n protected renderTrashTable(): TemplateResult {\n return this.dt.render();\n }\n\n protected renderEmptyTable(): TemplateResult {\n return html`\n <p>The trash bin is empty.</p>\n `;\n }\n\n protected renderTableHeader(): TemplateResult[] {\n const name = this.dt.header('Name', { class: 'name-cell' });\n const deleted = this.dt.header('Deleted', { class: 'updated-cell' });\n const menu = this.dt.header(html`<span hidden>Menu</span>`, { class: 'menu-cell' });\n return [name, deleted, menu];\n }\n\n protected renderTableItem(item: TrashEntry): TemplateResult[] {\n const { kind, name, info } = item;\n const icon = fileIcon(item);\n\n const nameCell = this.dt.cell(html`\n ${icon ? html`<ui-icon icon=\"${icon}\" class=\"cell-icon\"></ui-icon>` : ''}\n ${name || 'Unnamed file'}\n `, { class: 'name-cell', data: { kind } });\n\n const deleted = this.dt.cell(html`\n <relative-time datetime=\"${new Date(info.time).toISOString()}\"></relative-time>\n `, { class: 'updated-cell' });\n\n const menu = this.dt.cell(this.renderItemOptions(item), { class: 'menu-cell' });\n\n return [nameCell, deleted, menu];\n }\n\n protected renderItemOptions(item: TrashEntry): TemplateResult {\n return html`\n <ui-dropdown-list\n horizontalAlign=\"auto\"\n verticalAlign=\"auto\"\n closeOnOutsideClick\n @mousedown=\"${EventUtils.cancelEvent}\" \n @mouseup=\"${EventUtils.cancelEvent}\" \n @click=\"${EventUtils.cancelEvent}\"\n @dblclick=\"${EventUtils.cancelEvent}\"\n @select=\"${this.itemOptionsSelectHandler}\"\n data-key=\"${item.key}\"\n >\n <ui-icon-button title=\"Project options\" aria-label=\"Activate for more options\">\n <ui-icon icon=\"moreVert\"></ui-icon>\n </ui-icon-button>\n <ui-list slot=\"dropdown\" role=\"menu\">\n <ui-list-item image=\"icon\" data-option=\"restore\" role=\"menuitem\" title=\"Restores the file to its original folder.\">\n <ui-icon icon=\"restoreFromTrash\" slot=\"start\"></ui-icon>\n Restore\n </ui-list-item>\n <ui-list-item image=\"icon\" data-option=\"delete\" role=\"menuitem\" title=\"Permanently deleted the item.\">\n <ui-icon icon=\"deleteOutline\" slot=\"start\"></ui-icon>\n Delete forever\n </ui-list-item>\n </ui-list>\n </ui-dropdown-list>\n `;\n }\n\n protected renderDeleteAllDialog(): TemplateResult {\n return html`\n <dialog id=\"deleteAllDialog\" class=\"warning\">\n <h3>Empty Trash?</h3>\n <div>\n <p class=\"body-medium\">\n This will permanently delete all files in the trash.\n </p>\n </div>\n <div class=\"dialog-buttons\">\n <ui-button type=\"text\" value=\"cancel\" @click=\"${this.cancelDeleteAllDialog}\">Cancel</ui-button>\n <ui-button type=\"text\" value=\"delete\" @click=\"${this.deleteAllHandler}\">Delete</ui-button>\n </div>\n </dialog>\n `;\n }\n\n protected renderDeleteFilesDialog(): TemplateResult {\n const { deleteItems } = this;\n return html`\n <dialog id=\"deleteFilesDialog\" class=\"warning\">\n <h3>Delete Forever?</h3>\n <div>\n ${deleteItems.length > 1 ? this.renderDeleteMultiFile(deleteItems) : this.renderDeleteSingleFile(deleteItems[0])}\n </div>\n <div class=\"dialog-buttons\">\n <ui-button type=\"text\" value=\"cancel\" @click=\"${this.cancelDeleteFilesDialog}\">Cancel</ui-button>\n <ui-button type=\"text\" value=\"delete\" @click=\"${this.deleteFilesHandler}\">Delete</ui-button>\n </div>\n </dialog>\n `;\n }\n\n protected renderDeleteSingleFile(item: TrashEntry): TemplateResult {\n if (!item) {\n return html`\n <p class=\"body-medium\">Invalid state. Couldn't find files to delete.</p>\n `;\n }\n return html`\n <p class=\"body-medium\">\n <b>\"${item.name}\"</b> will be deleted forever and you won't be able to restore it.\n </p>\n `;\n }\n\n protected renderDeleteMultiFile(items: TrashEntry[]): TemplateResult {\n return html`\n <p class=\"body-medium\">\n The following files will be deleted forever and you won't be able to restore them:\n </p>\n <ui-divider></ui-divider>\n <ul>\n ${items.map(i => html`<li>${i.name}</li>`)}\n </ul>\n <ui-divider></ui-divider>\n `;\n }\n}\n"]}
@@ -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"]}
@@ -264,7 +264,7 @@ export default class UiDropdownList extends LitElement {
264
264
  }
265
265
  const event = new CustomEvent('select', {
266
266
  cancelable: true,
267
- composed: true,
267
+ // composed: true,
268
268
  detail: {
269
269
  item,
270
270
  },
@@ -1 +1 @@
1
- {"version":3,"file":"UiDropdownList.js","sourceRoot":"","sources":["../../../src/ui/list/UiDropdownList.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, PropertyValues, TemplateResult } from \"lit\";\nimport { property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { ClassInfo, classMap } from \"lit/directives/class-map.js\";\nimport { StyleInfo, styleMap } from \"lit/directives/style-map.js\";\nimport { randomString } from \"../../lib/Random.js\";\nimport { ElementPositioning, HorizontalAlignment, VerticalAlignment } from \"../lib/ElementPositioning.js\";\nimport { ScrollHelper } from \"../lib/ScrollHelper.js\";\n\nconst itemRole = ['menuitem', 'menuitemcheckbox', 'menuitemradio'];\n\nexport interface UiDropdownListSelection {\n item: HTMLElement;\n}\n\n/**\n * An overlay list rendered over a button.\n * \n * Examples:\n * \n * <ui-dropdown-list>\n * <ui-button>Click me</ui-button>\n * <ui-list slot=\"dropdown\" role=\"menu\">\n * <ui-list-item role=\"menuitem\">Item 1</ui-list-item>\n * <ui-list-item role=\"menuitem\">Item 2</ui-list-item>\n * </ui-list>\n * </ui-dropdown-list>\n * \n * @slot - The default slot for the dropdown trigger (button) \n * @slot dropdown - The slot for the list.\n * @fires select - Custom event with the selected item on the `detail.item` when the user selected an item. When the event is cancelled then there's no side effects (closing the dropdown)\n * @fires dropdownopen - An event informing other dropdowns that this one was opened and other should close.\n * @fires open - An event dispatched when the open state change through a user interaction\n */\nexport default class UiDropdownList extends LitElement {\n @queryAssignedElements()\n protected triggers!: HTMLElement[] | null;\n\n @queryAssignedElements({ slot: 'dropdown' })\n protected dropdowns!: HTMLElement[] | null;\n\n @state() protected triggerId = `ui-trigger-${randomString(4)}`;\n\n @state() protected menuId = `ui-menu-${randomString(4)}`;\n\n /**\n * Whether the menu is opened.\n * @attribute\n */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /**\n * The vertical (y-axis) alignment of the dropdown content.\n * - top\n * - bottom\n * - middle\n * \n * No value means the natural position according to the box model.\n * @attribute\n */\n @property({ type: String, reflect: true }) verticalAlign?: VerticalAlignment;\n\n /**\n * The horizontal (x-axis) alignment of the dropdown content.\n * - top\n * - bottom\n * - middle\n * \n * No value means the natural position according to the box model.\n * @attribute\n */\n @property({ type: String, reflect: true }) horizontalAlign?: HorizontalAlignment;\n\n /**\n * Affects the `horizontal` and `vertical` positioning so that the target element does not overlap with the anchor.\n * For example, when the `vertical` align is `top`, the top edge of the target will be rendered at the bottom \n * of the anchor down to the edge of the viewport.\n * @attribute\n */\n @property({ type: Boolean, reflect: true }) noOverlap?: boolean;\n\n /**\n * When set it closes the opened list when registering a click outside the list.\n * @attribute\n */\n @property({ type: Boolean }) closeOnOutsideClick?: boolean;\n\n /**\n * When set it makes the drop-down to match the width of the trigger.\n * Be careful as this may crop the content when the trigger is not wide enough.\n * @attribute\n */\n @property({ type: Boolean }) matchTriggerWidth?: boolean;\n\n /**\n * When set it closes the drop-down when `tab` button is pressed.\n * This is not a default behavior since the drop-down content can have its own logic\n * related to tab index.\n */\n @property({ type: Boolean }) closeOnTab?: boolean;\n\n /**\n * The first element located in the default slot.\n */\n protected get trigger(): HTMLElement | null {\n const { triggers } = this;\n if (!triggers || !triggers.length) {\n return null;\n }\n const [button] = triggers;\n return button;\n }\n\n /**\n * The first element located in the \"dropdown\" slot.\n */\n protected get dropdown(): HTMLElement | null {\n const { dropdowns } = this;\n if (!dropdowns || !dropdowns.length) {\n return null;\n }\n const [content] = dropdowns;\n return content;\n }\n\n @state() protected overlayPositioning?: StyleInfo;\n\n constructor() {\n super();\n this.dropdownOpenHandler = this.dropdownOpenHandler.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.clickHandler = this.clickHandler.bind(this);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n window.addEventListener('dropdownopen', this.dropdownOpenHandler);\n window.addEventListener('click', this.clickHandler, { capture: true });\n ScrollHelper.addListeners(this, this.scrollHandler);\n\n this.setAttribute('aria-haspopup', 'menu');\n this.setAttribute('aria-expanded', 'false');\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener('dropdownopen', this.dropdownOpenHandler);\n window.removeEventListener('click', this.clickHandler, { capture: true });\n ScrollHelper.removeListeners(this);\n }\n\n protected dropdownOpenHandler(e: Event): void {\n if (e.composedPath()[0] === this) {\n return;\n }\n this.close();\n }\n\n protected updateExpanded(): void {\n this.setAttribute('aria-expanded', String(this.open));\n }\n\n protected triggerChanged(): void {\n const { trigger } = this;\n if (!trigger) {\n return;\n }\n this.decorateTrigger(trigger);\n }\n\n protected dropdownChanged(): void {\n const { dropdown } = this;\n if (!dropdown) {\n return;\n }\n this.decorateDropdown(dropdown);\n }\n\n /**\n * Decorates the trigger with aria attributes.\n */\n protected decorateTrigger(button: HTMLElement): void {\n button.setAttribute('aria-controls', this.menuId);\n button.setAttribute('tabindex', '0');\n if (button.id) {\n this.triggerId = button.id;\n } else {\n // eslint-disable-next-line no-param-reassign\n button.id = this.triggerId;\n }\n }\n\n protected decorateDropdown(list: HTMLElement): void {\n if (!list.hasAttribute('role')) {\n list.setAttribute('role', 'menu');\n }\n if (!list.hasAttribute('aria-labelledby')) {\n list.setAttribute('aria-labelledby', this.triggerId);\n }\n list.setAttribute('tabindex', '-1');\n // eslint-disable-next-line no-param-reassign\n list.id = this.menuId;\n }\n\n protected triggerClickHandler(): void {\n this.open = !this.open;\n this.updateExpanded();\n this.notifyOpen();\n }\n\n protected triggerKeyDownHandler(e: KeyboardEvent): void {\n if (['Enter', 'Space', 'ArrowDown', 'ArrowUp'].includes(e.code)) {\n e.preventDefault();\n this.open = true;\n this.updateExpanded();\n this.notifyOpen();\n }\n }\n\n protected contentKeyDownHandler(e: KeyboardEvent): void {\n if (e.defaultPrevented) {\n return;\n }\n if (e.code === 'Escape') {\n this.close();\n } else if (e.code === 'Tab') {\n if (this.closeOnTab) {\n this.close();\n }\n } else if (['Enter', 'Space'].includes(e.code)) {\n this.activate(e);\n }\n }\n\n protected contentClickHandler(e: PointerEvent): void {\n this.activate(e);\n }\n\n close(): void {\n this.open = false;\n this.updateExpanded();\n this.notifyOpen();\n }\n\n protected contentCloseHandler(e: Event): void {\n e.stopPropagation();\n this.close();\n }\n\n protected override willUpdate(cp: PropertyValues<this>): void {\n super.willUpdate(cp);\n if ((cp.has('noOverlap') || cp.has('verticalAlign') || cp.has('horizontalAlign') || cp.has('open')) && this.open) {\n this.computePositioning();\n }\n }\n\n protected override updated(cp: PropertyValues<this>): void {\n super.updated(cp);\n if (cp.has('open')) {\n this.toggleOpened();\n }\n }\n\n /**\n * Since the container for the dropdown content is positioned as fixed\n * we need to position the dropdown according to the configured rules.\n */\n protected computePositioning(): void {\n const { trigger, dropdown } = this;\n if (!trigger || !dropdown) {\n return;\n }\n this.overlayPositioning = ElementPositioning.positionOverlay(dropdown, trigger, {\n horizontal: this.horizontalAlign,\n vertical: this.verticalAlign,\n noOverlap: this.noOverlap,\n constrain: true,\n constrainPaddingY: 20,\n matchAnchorWidth: this.matchTriggerWidth,\n });\n }\n\n protected scrollHandler(): void {\n if (this.open) {\n this.computePositioning();\n }\n }\n\n protected clickHandler(e: Event): void {\n if (!this.open || !this.closeOnOutsideClick) {\n return;\n }\n const inside = e.composedPath().some(i => i === this);\n if (inside) {\n return;\n }\n this.close();\n }\n\n protected toggleOpened(): void {\n const { open } = this;\n if (open) {\n this.handleOpened();\n } else {\n this.handleClosed();\n }\n }\n\n protected handleOpened(): void {\n const { trigger, dropdown } = this;\n if (trigger) {\n trigger.removeAttribute('tabindex');\n }\n if (dropdown) {\n dropdown.setAttribute('tabindex', '0');\n dropdown.focus();\n }\n }\n\n protected handleClosed(): void {\n const { trigger, dropdown } = this;\n if (trigger) {\n trigger.setAttribute('tabindex', '0');\n if (this.matches(':focus-within')) {\n trigger.focus();\n }\n }\n if (dropdown) {\n dropdown.removeAttribute('tabindex');\n }\n }\n\n protected activate(e: Event): void {\n if (e.defaultPrevented) {\n return;\n }\n const path = e.composedPath();\n let item: HTMLElement | undefined;\n while (!item) {\n const next = path.shift() as Element;\n if (next === this) {\n break;\n }\n if (next.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n if (itemRole.includes(next.getAttribute('role') || '')) {\n item = next as HTMLElement;\n }\n }\n if (!item) {\n return;\n }\n const event = new CustomEvent<UiDropdownListSelection>('select', {\n cancelable: true,\n composed: true,\n detail: {\n item,\n },\n })\n this.dispatchEvent(event);\n if (event.defaultPrevented) {\n return;\n }\n this.close();\n }\n\n protected notifyOpen(): void {\n this.dispatchEvent(new Event('open'));\n if (this.open) {\n this.dispatchEvent(new Event('dropdownopen', {\n bubbles: true,\n composed: true,\n cancelable: true,\n }));\n }\n }\n\n protected override render(): TemplateResult {\n const classes: ClassInfo = {\n container: true,\n open: this.open,\n };\n \n return html`\n <div class=\"${classMap(classes)}\">\n ${this.renderTrigger()}\n ${this.renderContent()}\n </div>\n `;\n }\n\n protected renderTrigger(): TemplateResult {\n return html`\n <div \n class=\"trigger\" \n @click=\"${this.triggerClickHandler}\" \n @keydown=\"${this.triggerKeyDownHandler}\"\n ><slot @slotchange=\"${this.triggerChanged}\"></slot></div>\n `;\n }\n\n protected renderContent(): TemplateResult {\n const contentStyles = this.overlayPositioning || {};\n return html`\n <div \n class=\"content\" \n style=\"${styleMap(contentStyles)}\"\n >\n <slot \n name=\"dropdown\" \n @slotchange=\"${this.dropdownChanged}\" \n @keydown=\"${this.contentKeyDownHandler}\" \n @click=\"${this.contentClickHandler}\"\n @close=\"${this.contentCloseHandler}\"\n ></slot>\n </div>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"UiDropdownList.js","sourceRoot":"","sources":["../../../src/ui/list/UiDropdownList.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, PropertyValues, TemplateResult } from \"lit\";\nimport { property, queryAssignedElements, state } from \"lit/decorators.js\";\nimport { ClassInfo, classMap } from \"lit/directives/class-map.js\";\nimport { StyleInfo, styleMap } from \"lit/directives/style-map.js\";\nimport { randomString } from \"../../lib/Random.js\";\nimport { ElementPositioning, HorizontalAlignment, VerticalAlignment } from \"../lib/ElementPositioning.js\";\nimport { ScrollHelper } from \"../lib/ScrollHelper.js\";\n\nconst itemRole = ['menuitem', 'menuitemcheckbox', 'menuitemradio'];\n\nexport interface UiDropdownListSelection {\n item: HTMLElement;\n}\n\n/**\n * An overlay list rendered over a button.\n * \n * Examples:\n * \n * <ui-dropdown-list>\n * <ui-button>Click me</ui-button>\n * <ui-list slot=\"dropdown\" role=\"menu\">\n * <ui-list-item role=\"menuitem\">Item 1</ui-list-item>\n * <ui-list-item role=\"menuitem\">Item 2</ui-list-item>\n * </ui-list>\n * </ui-dropdown-list>\n * \n * @slot - The default slot for the dropdown trigger (button) \n * @slot dropdown - The slot for the list.\n * @fires select - Custom event with the selected item on the `detail.item` when the user selected an item. When the event is cancelled then there's no side effects (closing the dropdown)\n * @fires dropdownopen - An event informing other dropdowns that this one was opened and other should close.\n * @fires open - An event dispatched when the open state change through a user interaction\n */\nexport default class UiDropdownList extends LitElement {\n @queryAssignedElements()\n protected triggers!: HTMLElement[] | null;\n\n @queryAssignedElements({ slot: 'dropdown' })\n protected dropdowns!: HTMLElement[] | null;\n\n @state() protected triggerId = `ui-trigger-${randomString(4)}`;\n\n @state() protected menuId = `ui-menu-${randomString(4)}`;\n\n /**\n * Whether the menu is opened.\n * @attribute\n */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /**\n * The vertical (y-axis) alignment of the dropdown content.\n * - top\n * - bottom\n * - middle\n * \n * No value means the natural position according to the box model.\n * @attribute\n */\n @property({ type: String, reflect: true }) verticalAlign?: VerticalAlignment;\n\n /**\n * The horizontal (x-axis) alignment of the dropdown content.\n * - top\n * - bottom\n * - middle\n * \n * No value means the natural position according to the box model.\n * @attribute\n */\n @property({ type: String, reflect: true }) horizontalAlign?: HorizontalAlignment;\n\n /**\n * Affects the `horizontal` and `vertical` positioning so that the target element does not overlap with the anchor.\n * For example, when the `vertical` align is `top`, the top edge of the target will be rendered at the bottom \n * of the anchor down to the edge of the viewport.\n * @attribute\n */\n @property({ type: Boolean, reflect: true }) noOverlap?: boolean;\n\n /**\n * When set it closes the opened list when registering a click outside the list.\n * @attribute\n */\n @property({ type: Boolean }) closeOnOutsideClick?: boolean;\n\n /**\n * When set it makes the drop-down to match the width of the trigger.\n * Be careful as this may crop the content when the trigger is not wide enough.\n * @attribute\n */\n @property({ type: Boolean }) matchTriggerWidth?: boolean;\n\n /**\n * When set it closes the drop-down when `tab` button is pressed.\n * This is not a default behavior since the drop-down content can have its own logic\n * related to tab index.\n */\n @property({ type: Boolean }) closeOnTab?: boolean;\n\n /**\n * The first element located in the default slot.\n */\n protected get trigger(): HTMLElement | null {\n const { triggers } = this;\n if (!triggers || !triggers.length) {\n return null;\n }\n const [button] = triggers;\n return button;\n }\n\n /**\n * The first element located in the \"dropdown\" slot.\n */\n protected get dropdown(): HTMLElement | null {\n const { dropdowns } = this;\n if (!dropdowns || !dropdowns.length) {\n return null;\n }\n const [content] = dropdowns;\n return content;\n }\n\n @state() protected overlayPositioning?: StyleInfo;\n\n constructor() {\n super();\n this.dropdownOpenHandler = this.dropdownOpenHandler.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.clickHandler = this.clickHandler.bind(this);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n window.addEventListener('dropdownopen', this.dropdownOpenHandler);\n window.addEventListener('click', this.clickHandler, { capture: true });\n ScrollHelper.addListeners(this, this.scrollHandler);\n\n this.setAttribute('aria-haspopup', 'menu');\n this.setAttribute('aria-expanded', 'false');\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener('dropdownopen', this.dropdownOpenHandler);\n window.removeEventListener('click', this.clickHandler, { capture: true });\n ScrollHelper.removeListeners(this);\n }\n\n protected dropdownOpenHandler(e: Event): void {\n if (e.composedPath()[0] === this) {\n return;\n }\n this.close();\n }\n\n protected updateExpanded(): void {\n this.setAttribute('aria-expanded', String(this.open));\n }\n\n protected triggerChanged(): void {\n const { trigger } = this;\n if (!trigger) {\n return;\n }\n this.decorateTrigger(trigger);\n }\n\n protected dropdownChanged(): void {\n const { dropdown } = this;\n if (!dropdown) {\n return;\n }\n this.decorateDropdown(dropdown);\n }\n\n /**\n * Decorates the trigger with aria attributes.\n */\n protected decorateTrigger(button: HTMLElement): void {\n button.setAttribute('aria-controls', this.menuId);\n button.setAttribute('tabindex', '0');\n if (button.id) {\n this.triggerId = button.id;\n } else {\n // eslint-disable-next-line no-param-reassign\n button.id = this.triggerId;\n }\n }\n\n protected decorateDropdown(list: HTMLElement): void {\n if (!list.hasAttribute('role')) {\n list.setAttribute('role', 'menu');\n }\n if (!list.hasAttribute('aria-labelledby')) {\n list.setAttribute('aria-labelledby', this.triggerId);\n }\n list.setAttribute('tabindex', '-1');\n // eslint-disable-next-line no-param-reassign\n list.id = this.menuId;\n }\n\n protected triggerClickHandler(): void {\n this.open = !this.open;\n this.updateExpanded();\n this.notifyOpen();\n }\n\n protected triggerKeyDownHandler(e: KeyboardEvent): void {\n if (['Enter', 'Space', 'ArrowDown', 'ArrowUp'].includes(e.code)) {\n e.preventDefault();\n this.open = true;\n this.updateExpanded();\n this.notifyOpen();\n }\n }\n\n protected contentKeyDownHandler(e: KeyboardEvent): void {\n if (e.defaultPrevented) {\n return;\n }\n if (e.code === 'Escape') {\n this.close();\n } else if (e.code === 'Tab') {\n if (this.closeOnTab) {\n this.close();\n }\n } else if (['Enter', 'Space'].includes(e.code)) {\n this.activate(e);\n }\n }\n\n protected contentClickHandler(e: PointerEvent): void {\n this.activate(e);\n }\n\n close(): void {\n this.open = false;\n this.updateExpanded();\n this.notifyOpen();\n }\n\n protected contentCloseHandler(e: Event): void {\n e.stopPropagation();\n this.close();\n }\n\n protected override willUpdate(cp: PropertyValues<this>): void {\n super.willUpdate(cp);\n if ((cp.has('noOverlap') || cp.has('verticalAlign') || cp.has('horizontalAlign') || cp.has('open')) && this.open) {\n this.computePositioning();\n }\n }\n\n protected override updated(cp: PropertyValues<this>): void {\n super.updated(cp);\n if (cp.has('open')) {\n this.toggleOpened();\n }\n }\n\n /**\n * Since the container for the dropdown content is positioned as fixed\n * we need to position the dropdown according to the configured rules.\n */\n protected computePositioning(): void {\n const { trigger, dropdown } = this;\n if (!trigger || !dropdown) {\n return;\n }\n this.overlayPositioning = ElementPositioning.positionOverlay(dropdown, trigger, {\n horizontal: this.horizontalAlign,\n vertical: this.verticalAlign,\n noOverlap: this.noOverlap,\n constrain: true,\n constrainPaddingY: 20,\n matchAnchorWidth: this.matchTriggerWidth,\n });\n }\n\n protected scrollHandler(): void {\n if (this.open) {\n this.computePositioning();\n }\n }\n\n protected clickHandler(e: Event): void {\n if (!this.open || !this.closeOnOutsideClick) {\n return;\n }\n const inside = e.composedPath().some(i => i === this);\n if (inside) {\n return;\n }\n this.close();\n }\n\n protected toggleOpened(): void {\n const { open } = this;\n if (open) {\n this.handleOpened();\n } else {\n this.handleClosed();\n }\n }\n\n protected handleOpened(): void {\n const { trigger, dropdown } = this;\n if (trigger) {\n trigger.removeAttribute('tabindex');\n }\n if (dropdown) {\n dropdown.setAttribute('tabindex', '0');\n dropdown.focus();\n }\n }\n\n protected handleClosed(): void {\n const { trigger, dropdown } = this;\n if (trigger) {\n trigger.setAttribute('tabindex', '0');\n if (this.matches(':focus-within')) {\n trigger.focus();\n }\n }\n if (dropdown) {\n dropdown.removeAttribute('tabindex');\n }\n }\n\n protected activate(e: Event): void {\n if (e.defaultPrevented) {\n return;\n }\n const path = e.composedPath();\n let item: HTMLElement | undefined;\n while (!item) {\n const next = path.shift() as Element;\n if (next === this) {\n break;\n }\n if (next.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n if (itemRole.includes(next.getAttribute('role') || '')) {\n item = next as HTMLElement;\n }\n }\n if (!item) {\n return;\n }\n const event = new CustomEvent<UiDropdownListSelection>('select', {\n cancelable: true,\n // composed: true,\n detail: {\n item,\n },\n })\n this.dispatchEvent(event);\n if (event.defaultPrevented) {\n return;\n }\n this.close();\n }\n\n protected notifyOpen(): void {\n this.dispatchEvent(new Event('open'));\n if (this.open) {\n this.dispatchEvent(new Event('dropdownopen', {\n bubbles: true,\n composed: true,\n cancelable: true,\n }));\n }\n }\n\n protected override render(): TemplateResult {\n const classes: ClassInfo = {\n container: true,\n open: this.open,\n };\n \n return html`\n <div class=\"${classMap(classes)}\">\n ${this.renderTrigger()}\n ${this.renderContent()}\n </div>\n `;\n }\n\n protected renderTrigger(): TemplateResult {\n return html`\n <div \n class=\"trigger\" \n @click=\"${this.triggerClickHandler}\" \n @keydown=\"${this.triggerKeyDownHandler}\"\n ><slot @slotchange=\"${this.triggerChanged}\"></slot></div>\n `;\n }\n\n protected renderContent(): TemplateResult {\n const contentStyles = this.overlayPositioning || {};\n return html`\n <div \n class=\"content\" \n style=\"${styleMap(contentStyles)}\"\n >\n <slot \n name=\"dropdown\" \n @slotchange=\"${this.dropdownChanged}\" \n @keydown=\"${this.contentKeyDownHandler}\" \n @click=\"${this.contentClickHandler}\"\n @close=\"${this.contentCloseHandler}\"\n ></slot>\n </div>\n `;\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.14",
4
4
  "description": "UI for API Client.",
5
5
  "license": "CC-BY-2.0",
6
6
  "main": "dist/index.js",
@@ -49,7 +49,7 @@
49
49
  "idb-keyval": "^6.1.0",
50
50
  "lit": "^2.2.2",
51
51
  "marked": "^4.0.15",
52
- "monaco-editor": "^0.35.0",
52
+ "monaco-editor": "^0.36.0",
53
53
  "pouchdb": "^7.3.0",
54
54
  "prismjs": "^1.28.0"
55
55
  },
@@ -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
+ }
@@ -4,7 +4,7 @@ import styles from '../../elements/http/BodyEditor.styles.js';
4
4
 
5
5
  @customElement('http-body-editor')
6
6
  export class HttpBodyEditorElement extends Element {
7
- static override styles = [styles];
7
+ static override styles = [...styles];
8
8
  }
9
9
 
10
10
  declare global {
@@ -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
  }