@api-client/ui 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/.eslintrc +8 -0
  2. package/demo/elements/authorization/cc.ts +56 -27
  3. package/demo/elements/index.html +3 -0
  4. package/demo/elements/store/file-picker.html +15 -0
  5. package/demo/elements/store/file-picker.ts +134 -0
  6. package/demo/elements/store/index.html +19 -0
  7. package/demo/store/StorePlugin.js +1 -0
  8. package/dist/bindings/base/FileBindings.d.ts +4 -0
  9. package/dist/bindings/base/FileBindings.d.ts.map +1 -1
  10. package/dist/bindings/base/FileBindings.js +21 -1
  11. package/dist/bindings/base/FileBindings.js.map +1 -1
  12. package/dist/bindings/base/StoreBindings.d.ts +6 -17
  13. package/dist/bindings/base/StoreBindings.d.ts.map +1 -1
  14. package/dist/bindings/base/StoreBindings.js +15 -60
  15. package/dist/bindings/base/StoreBindings.js.map +1 -1
  16. package/dist/bindings/web/WebFileBindings.js +1 -1
  17. package/dist/bindings/web/WebFileBindings.js.map +1 -1
  18. package/dist/define/http/certificate-add.d.ts +9 -0
  19. package/dist/define/http/certificate-add.d.ts.map +1 -0
  20. package/dist/define/http/certificate-add.js +10 -0
  21. package/dist/define/http/certificate-add.js.map +1 -0
  22. package/dist/define/store/file-picker.d.ts +9 -0
  23. package/dist/define/store/file-picker.d.ts.map +1 -0
  24. package/dist/define/store/file-picker.js +10 -0
  25. package/dist/define/store/file-picker.js.map +1 -0
  26. package/dist/define/{files → store}/share-file.d.ts +1 -1
  27. package/dist/define/store/share-file.d.ts.map +1 -0
  28. package/dist/define/{files → store}/share-file.js +2 -2
  29. package/dist/define/store/share-file.js.map +1 -0
  30. package/dist/define/ui/ui-segmented-button-set.d.ts +1 -1
  31. package/dist/define/ui/ui-segmented-button-set.d.ts.map +1 -1
  32. package/dist/define/ui/ui-segmented-button-set.js.map +1 -1
  33. package/dist/elements/authorization/ui/CC.styles.d.ts.map +1 -1
  34. package/dist/elements/authorization/ui/CC.styles.js +4 -9
  35. package/dist/elements/authorization/ui/CC.styles.js.map +1 -1
  36. package/dist/elements/authorization/ui/CcAuthorization.d.ts +14 -29
  37. package/dist/elements/authorization/ui/CcAuthorization.d.ts.map +1 -1
  38. package/dist/elements/authorization/ui/CcAuthorization.js +67 -158
  39. package/dist/elements/authorization/ui/CcAuthorization.js.map +1 -1
  40. package/dist/elements/http/CertificateAdd.element.d.ts +91 -0
  41. package/dist/elements/http/CertificateAdd.element.d.ts.map +1 -0
  42. package/dist/elements/http/CertificateAdd.element.js +389 -0
  43. package/dist/elements/http/CertificateAdd.element.js.map +1 -0
  44. package/dist/elements/http/CertificateAdd.styles.d.ts +3 -0
  45. package/dist/elements/http/CertificateAdd.styles.d.ts.map +1 -0
  46. package/dist/elements/http/CertificateAdd.styles.js +61 -0
  47. package/dist/elements/http/CertificateAdd.styles.js.map +1 -0
  48. package/dist/elements/project/ProjectRunReport.d.ts +2 -1
  49. package/dist/elements/project/ProjectRunReport.d.ts.map +1 -1
  50. package/dist/elements/project/ProjectRunReport.js.map +1 -1
  51. package/dist/elements/store/FilePicker.element.d.ts +87 -0
  52. package/dist/elements/store/FilePicker.element.d.ts.map +1 -0
  53. package/dist/elements/store/FilePicker.element.js +263 -0
  54. package/dist/elements/store/FilePicker.element.js.map +1 -0
  55. package/dist/elements/store/FilePicker.styles.d.ts +3 -0
  56. package/dist/elements/store/FilePicker.styles.d.ts.map +1 -0
  57. package/dist/elements/store/FilePicker.styles.js +73 -0
  58. package/dist/elements/store/FilePicker.styles.js.map +1 -0
  59. package/dist/elements/store/FilesLib.d.ts +10 -0
  60. package/dist/elements/store/FilesLib.d.ts.map +1 -0
  61. package/dist/elements/store/FilesLib.js +38 -0
  62. package/dist/elements/store/FilesLib.js.map +1 -0
  63. package/dist/elements/{files/ShareFile.d.ts → store/ShareFile.element.d.ts} +1 -1
  64. package/dist/elements/store/ShareFile.element.d.ts.map +1 -0
  65. package/dist/elements/{files/ShareFile.js → store/ShareFile.element.js} +1 -1
  66. package/dist/elements/store/ShareFile.element.js.map +1 -0
  67. package/dist/elements/store/ShareFile.styles.d.ts.map +1 -0
  68. package/dist/elements/{files → store}/ShareFile.styles.js.map +1 -1
  69. package/dist/events/EventTypes.d.ts +7 -7
  70. package/dist/events/EventTypes.d.ts.map +1 -1
  71. package/dist/events/EventTypes.js +8 -7
  72. package/dist/events/EventTypes.js.map +1 -1
  73. package/dist/events/Events.d.ts +7 -1
  74. package/dist/events/Events.d.ts.map +1 -1
  75. package/dist/events/Events.js +2 -0
  76. package/dist/events/Events.js.map +1 -1
  77. package/dist/events/FilesystemEvents.d.ts +8 -0
  78. package/dist/events/FilesystemEvents.d.ts.map +1 -0
  79. package/dist/events/FilesystemEvents.js +59 -0
  80. package/dist/events/FilesystemEvents.js.map +1 -0
  81. package/dist/events/HttpClientEvents.d.ts +0 -2
  82. package/dist/events/HttpClientEvents.d.ts.map +1 -1
  83. package/dist/events/HttpClientEvents.js +0 -2
  84. package/dist/events/HttpClientEvents.js.map +1 -1
  85. package/dist/events/StoreEvents.d.ts +8 -1
  86. package/dist/events/StoreEvents.d.ts.map +1 -1
  87. package/dist/events/StoreEvents.js +19 -0
  88. package/dist/events/StoreEvents.js.map +1 -1
  89. package/dist/http-client/idb/Arc18DataUpgrade.d.ts +0 -8
  90. package/dist/http-client/idb/Arc18DataUpgrade.d.ts.map +1 -1
  91. package/dist/http-client/idb/Arc18DataUpgrade.js +11 -206
  92. package/dist/http-client/idb/Arc18DataUpgrade.js.map +1 -1
  93. package/dist/http-client/store/StoreBroadcast.d.ts +0 -5
  94. package/dist/http-client/store/StoreBroadcast.d.ts.map +1 -1
  95. package/dist/http-client/store/StoreBroadcast.js +0 -7
  96. package/dist/http-client/store/StoreBroadcast.js.map +1 -1
  97. package/dist/lib/files/FileUtils.d.ts +9 -0
  98. package/dist/lib/files/FileUtils.d.ts.map +1 -0
  99. package/dist/lib/files/FileUtils.js +13 -0
  100. package/dist/lib/files/FileUtils.js.map +1 -0
  101. package/dist/mixins/RouteMixin.d.ts +4 -0
  102. package/dist/mixins/RouteMixin.d.ts.map +1 -1
  103. package/dist/mixins/RouteMixin.js +1 -0
  104. package/dist/mixins/RouteMixin.js.map +1 -1
  105. package/dist/pages/ApplicationScreen.d.ts +1 -1
  106. package/dist/pages/ApplicationScreen.d.ts.map +1 -1
  107. package/dist/pages/ApplicationScreen.js +4 -2
  108. package/dist/pages/ApplicationScreen.js.map +1 -1
  109. package/dist/pages/api-client/ApiClient.screen.d.ts +4 -6
  110. package/dist/pages/api-client/ApiClient.screen.d.ts.map +1 -1
  111. package/dist/pages/api-client/ApiClient.screen.js +39 -31
  112. package/dist/pages/api-client/ApiClient.screen.js.map +1 -1
  113. package/dist/pages/api-client/ApiClient.styles.d.ts.map +1 -1
  114. package/dist/pages/api-client/ApiClient.styles.js +0 -12
  115. package/dist/pages/api-client/ApiClient.styles.js.map +1 -1
  116. package/dist/pages/api-client/Authenticate.screen.d.ts +1 -1
  117. package/dist/pages/api-client/Authenticate.screen.d.ts.map +1 -1
  118. package/dist/pages/api-client/Authenticate.screen.js +2 -2
  119. package/dist/pages/api-client/Authenticate.screen.js.map +1 -1
  120. package/dist/pages/api-client/pages/Files.page.d.ts +6 -35
  121. package/dist/pages/api-client/pages/Files.page.d.ts.map +1 -1
  122. package/dist/pages/api-client/pages/Files.page.js +45 -141
  123. package/dist/pages/api-client/pages/Files.page.js.map +1 -1
  124. package/dist/pages/api-client/pages/Shared.page.d.ts +1 -5
  125. package/dist/pages/api-client/pages/Shared.page.d.ts.map +1 -1
  126. package/dist/pages/api-client/pages/Shared.page.js +1 -40
  127. package/dist/pages/api-client/pages/Shared.page.js.map +1 -1
  128. package/dist/pages/demo/DemoPage.d.ts +7 -0
  129. package/dist/pages/demo/DemoPage.d.ts.map +1 -1
  130. package/dist/pages/demo/DemoPage.js +14 -0
  131. package/dist/pages/demo/DemoPage.js.map +1 -1
  132. package/dist/store/FileSystem.d.ts +90 -0
  133. package/dist/store/FileSystem.d.ts.map +1 -0
  134. package/dist/store/FileSystem.js +260 -0
  135. package/dist/store/FileSystem.js.map +1 -0
  136. package/dist/styles/global-styles.d.ts.map +1 -1
  137. package/dist/styles/global-styles.js +7 -0
  138. package/dist/styles/global-styles.js.map +1 -1
  139. package/dist/ui/button/SegmentedButtonsSet.d.ts +14 -0
  140. package/dist/ui/button/SegmentedButtonsSet.d.ts.map +1 -1
  141. package/dist/ui/button/SegmentedButtonsSet.js.map +1 -1
  142. package/dist/ui/icons/Icons.d.ts +2 -1
  143. package/dist/ui/icons/Icons.d.ts.map +1 -1
  144. package/dist/ui/icons/Icons.js +1 -0
  145. package/dist/ui/icons/Icons.js.map +1 -1
  146. package/dist/ui/list/UiDropdownList.d.ts +9 -1
  147. package/dist/ui/list/UiDropdownList.d.ts.map +1 -1
  148. package/dist/ui/list/UiDropdownList.js +39 -17
  149. package/dist/ui/list/UiDropdownList.js.map +1 -1
  150. package/dist/ui/list/UiList.d.ts +6 -1
  151. package/dist/ui/list/UiList.d.ts.map +1 -1
  152. package/dist/ui/list/UiList.js +24 -9
  153. package/dist/ui/list/UiList.js.map +1 -1
  154. package/dist/ui/notification/SnackNotifications.d.ts +1 -0
  155. package/dist/ui/notification/SnackNotifications.d.ts.map +1 -1
  156. package/dist/ui/notification/SnackNotifications.js +7 -0
  157. package/dist/ui/notification/SnackNotifications.js.map +1 -1
  158. package/dist/ui/table/DataTable.d.ts +4 -0
  159. package/dist/ui/table/DataTable.d.ts.map +1 -1
  160. package/dist/ui/table/DataTable.js +23 -1
  161. package/dist/ui/table/DataTable.js.map +1 -1
  162. package/package.json +1 -1
  163. package/src/bindings/base/FileBindings.ts +25 -1
  164. package/src/bindings/base/StoreBindings.ts +16 -73
  165. package/src/bindings/web/WebFileBindings.ts +1 -1
  166. package/src/define/http/certificate-add.ts +12 -0
  167. package/src/define/store/file-picker.ts +12 -0
  168. package/src/define/{files → store}/share-file.ts +2 -2
  169. package/src/define/ui/ui-segmented-button-set.ts +1 -1
  170. package/src/elements/authorization/ui/CC.styles.ts +4 -9
  171. package/src/elements/authorization/ui/CcAuthorization.ts +67 -167
  172. package/src/elements/http/CertificateAdd.element.ts +443 -0
  173. package/src/elements/http/CertificateAdd.styles.ts +61 -0
  174. package/src/elements/project/ProjectRunReport.ts +2 -1
  175. package/src/elements/store/FilePicker.element.ts +297 -0
  176. package/src/elements/store/FilePicker.styles.ts +73 -0
  177. package/src/elements/store/FilesLib.ts +32 -0
  178. package/src/events/EventTypes.ts +8 -7
  179. package/src/events/Events.ts +2 -0
  180. package/src/events/FilesystemEvents.ts +63 -0
  181. package/src/events/HttpClientEvents.ts +0 -2
  182. package/src/events/StoreEvents.ts +21 -1
  183. package/src/http-client/idb/Arc18DataUpgrade.ts +84 -84
  184. package/src/http-client/store/StoreBroadcast.ts +0 -8
  185. package/src/lib/files/FileUtils.ts +12 -0
  186. package/src/mixins/RouteMixin.ts +8 -1
  187. package/src/pages/ApplicationScreen.ts +5 -3
  188. package/src/pages/api-client/ApiClient.screen.ts +42 -33
  189. package/src/pages/api-client/ApiClient.styles.ts +0 -12
  190. package/src/pages/api-client/Authenticate.screen.ts +2 -2
  191. package/src/pages/api-client/pages/Files.page.ts +48 -164
  192. package/src/pages/api-client/pages/Shared.page.ts +2 -40
  193. package/src/pages/demo/DemoPage.ts +17 -0
  194. package/src/store/FileSystem.ts +325 -0
  195. package/src/styles/global-styles.ts +7 -0
  196. package/src/ui/button/SegmentedButtonsSet.ts +16 -1
  197. package/src/ui/icons/Icons.ts +2 -1
  198. package/src/ui/list/UiDropdownList.ts +44 -17
  199. package/src/ui/list/UiList.ts +26 -10
  200. package/src/ui/notification/SnackNotifications.ts +8 -0
  201. package/src/ui/table/DataTable.ts +29 -3
  202. package/test/elements/http/BodyFormdataEditorElement.test.ts +458 -454
  203. package/test/elements/http/BodyMultipartEditorElement.test.ts +609 -605
  204. package/test/elements/http/BodyRawEditorElement.test.ts +60 -56
  205. package/test/elements/http/CertificateAdd.test.ts +430 -0
  206. package/test/elements/store/FilePicker.test.ts +241 -0
  207. package/test/env.js +3 -0
  208. package/test/events/EventTypes.test.ts +0 -22
  209. package/test/helpers/StoreHelper.ts +390 -0
  210. package/test/helpers/UiMock.ts +19 -2
  211. package/tsconfig.eslint.json +3 -1
  212. package/web-test-runner.config.mjs +50 -3
  213. package/dist/define/files/share-file.d.ts.map +0 -1
  214. package/dist/define/files/share-file.js.map +0 -1
  215. package/dist/elements/files/ShareFile.d.ts.map +0 -1
  216. package/dist/elements/files/ShareFile.js.map +0 -1
  217. package/dist/elements/files/ShareFile.styles.d.ts.map +0 -1
  218. package/dist/events/http-client/models/CertificatesEvents.d.ts +0 -12
  219. package/dist/events/http-client/models/CertificatesEvents.d.ts.map +0 -1
  220. package/dist/events/http-client/models/CertificatesEvents.js +0 -18
  221. package/dist/events/http-client/models/CertificatesEvents.js.map +0 -1
  222. package/dist/http-client/idb/AuthDataModel.d.ts +0 -60
  223. package/dist/http-client/idb/AuthDataModel.d.ts.map +0 -1
  224. package/dist/http-client/idb/AuthDataModel.js +0 -150
  225. package/dist/http-client/idb/AuthDataModel.js.map +0 -1
  226. package/dist/http-client/idb/HostsModel.d.ts +0 -25
  227. package/dist/http-client/idb/HostsModel.d.ts.map +0 -1
  228. package/dist/http-client/idb/HostsModel.js +0 -82
  229. package/dist/http-client/idb/HostsModel.js.map +0 -1
  230. package/dist/http-client/idb/LegacyMockedStore.d.ts +0 -214
  231. package/dist/http-client/idb/LegacyMockedStore.d.ts.map +0 -1
  232. package/dist/http-client/idb/LegacyMockedStore.js +0 -486
  233. package/dist/http-client/idb/LegacyMockedStore.js.map +0 -1
  234. package/src/events/http-client/models/CertificatesEvents.ts +0 -23
  235. package/src/http-client/idb/AuthDataModel.ts +0 -175
  236. package/src/http-client/idb/HostsModel.ts +0 -125
  237. package/src/http-client/idb/LegacyMockedStore.ts +0 -544
  238. package/test/apic-ui.test.ts +0 -31
  239. /package/dist/elements/{files → store}/ShareFile.styles.d.ts +0 -0
  240. /package/dist/elements/{files → store}/ShareFile.styles.js +0 -0
  241. /package/src/elements/{files/ShareFile.ts → store/ShareFile.element.ts} +0 -0
  242. /package/src/elements/{files → store}/ShareFile.styles.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"UiList.js","sourceRoot":"","sources":["../../../src/ui/list/UiList.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, PropertyValues, TemplateResult } from \"lit\";\nimport { property, queryAssignedElements } from \"lit/decorators.js\";\nimport UiListItem from \"./UiListItem.js\";\n\nconst NAVIGATION_KEYS = {\n ArrowDown: 'ArrowDown',\n ArrowUp: 'ArrowUp',\n Home: 'Home',\n End: 'End',\n};\n\nconst ACTIVATION_KEYS = {\n Enter: 'Enter',\n Space: ' ',\n};\n\nexport interface UiListSelection {\n item: HTMLElement,\n index: number,\n}\n\n/**\n * @fires select - Dispatched when the user click or press `Enter` or `Space` on any active list item. The `event.detail` object contains the `item` and `index` properties.\n */\nexport default class UiList extends LitElement {\n items: UiListItem[] = [];\n\n activeListItem: UiListItem | null = null;\n\n highlightListItem: UiListItem | null = null;\n\n /**\n * The CSS selector that is used to recognize which items are \n * active list items (can be selected, focused, etc.)\n * @attribute\n */\n @property({ type: String }) selector: string;\n\n /**\n * When set it marks last activated list item as selected.\n * @attribute\n */\n @property({ type: Boolean }) selectActive?: boolean;\n\n @queryAssignedElements({ flatten: true }) protected assignedElements!: HTMLElement[] | null;\n\n constructor() {\n super();\n this.selector = 'ui-list-item';\n this.addEventListener('keydown', this.handleKeydown.bind(this));\n this.addEventListener('click', this.handleClick.bind(this));\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n }\n\n override firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n\n this.updateItems();\n }\n\n activateFirstItem(): void {\n this.activeListItem = this.getFirstItem();\n this.activeListItem.activate();\n }\n\n activateLastItem(): void {\n this.activeListItem = this.getLastItem();\n this.activeListItem?.activate();\n }\n\n resetActiveListItem(): void {\n this.activeListItem = null;\n this.setAttribute('tabindex', '0');\n }\n\n protected updateItems(): void {\n const elements = this.assignedElements || [];\n const items = elements.filter(this.isListItem, this);\n this.items = items;\n if (this.activeListItem && !items.includes(this.activeListItem)) {\n this.activeListItem = null;\n }\n if (this.highlightListItem && !items.includes(this.highlightListItem)) {\n this.highlightListItem = null;\n }\n }\n\n /** \n * @return Whether the given element is a list item element. \n */\n protected isListItem(element: Element): element is UiListItem {\n if (element.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n return element.matches(this.selector);\n }\n\n getFirstItem(): UiListItem {\n return this.items[0];\n }\n\n getLastItem(): UiListItem {\n return this.items[this.items.length - 1];\n }\n\n getPreviousItem(item: UiListItem): UiListItem {\n const { items } = this;\n const curIndex = items.indexOf(item);\n if (curIndex < 0) {\n return item;\n }\n let i = curIndex;\n let result: HTMLElement | undefined;\n do {\n i--;\n if (i === curIndex) {\n // looped back from the end, no active element to find.\n return item;\n }\n const tmp = items[i];\n if (!tmp) {\n i = items.length;\n continue;\n }\n if (this.isSelectable(tmp)) {\n result = tmp;\n }\n } while (!result);\n return result as UiListItem || item;\n }\n\n getNextItem(item: UiListItem): UiListItem {\n const { items } = this;\n const curIndex = items.indexOf(item);\n if (curIndex < 0) {\n return item;\n }\n let i = curIndex;\n let next: HTMLElement | undefined;\n do {\n i++;\n if (i === curIndex) {\n // looped back from the start, no active element to find.\n return item;\n }\n const tmp = items[i];\n if (!tmp) {\n i = -1;\n continue;\n }\n if (this.isSelectable(tmp)) {\n next = tmp;\n }\n } while (!next);\n return next as UiListItem || item;\n }\n\n protected isSelectable(element: HTMLElement): boolean {\n if ((element as unknown as { disabled: boolean }).disabled) {\n return false;\n }\n if (element.hasAttribute('disabled')) {\n return false;\n }\n if (element.hidden && element.hasAttribute('hidden')) {\n return false;\n }\n return true;\n }\n\n protected isListItemActive(item: UiListItem): boolean {\n return item.isActive();\n }\n\n protected deactivateListItem(item: UiListItem): void {\n item.deactivate();\n }\n\n protected activateListItem(item: UiListItem): void {\n this.removeAttribute('tabindex');\n item.activate();\n item.scrollIntoView({ block: \"end\", inline: \"nearest\" });\n }\n\n handleKeydown(event: KeyboardEvent): void {\n if (Object.values(ACTIVATION_KEYS).includes(event.key)) {\n this.activateFromEvent(event);\n return;\n }\n if (Object.values(NAVIGATION_KEYS).indexOf(event.key) === -1) return;\n\n for (const item of this.items) {\n if (this.isListItemActive(item)) {\n this.activeListItem = item;\n }\n\n this.deactivateListItem(item);\n }\n\n if (event.key === NAVIGATION_KEYS.ArrowDown) {\n event.preventDefault();\n this.activateNext();\n }\n\n if (event.key === NAVIGATION_KEYS.ArrowUp) {\n event.preventDefault();\n this.activatePrevious();\n }\n\n if (event.key === NAVIGATION_KEYS.Home) {\n event.preventDefault();\n this.activateFirst();\n }\n\n if (event.key === NAVIGATION_KEYS.End) {\n event.preventDefault();\n this.activateLast();\n }\n }\n\n activateFirst(): void {\n this.activeListItem = this.getFirstItem();\n if (this.activeListItem) {\n this.activateListItem(this.activeListItem);\n }\n }\n\n activateLast(): void {\n this.activeListItem = this.getLastItem();\n if (this.activeListItem) {\n this.activateListItem(this.activeListItem);\n }\n }\n\n activateNext(item = this.activeListItem): void {\n this.activeListItem = item ? this.getNextItem(item) : this.getFirstItem();\n if (this.activeListItem) {\n this.activateListItem(this.activeListItem);\n }\n }\n\n activatePrevious(item = this.activeListItem): void {\n this.activeListItem = item ? this.getPreviousItem(item) : this.getLastItem();\n if (this.activeListItem) {\n this.activateListItem(this.activeListItem);\n }\n }\n\n /**\n * Sets `highlight` class on the next item.\n * @param item When not set it highlights the first item. Default to `this.highlightListItem`. Pass `null` to select first item.\n */\n highlightNext(item = this.highlightListItem): void {\n const next = item ? this.getNextItem(item) : this.getFirstItem();\n this.highlightItem(next);\n }\n\n /**\n * Sets `highlight` class on the previous item.\n * @param item When not set it highlights the last item. Default to `this.highlightListItem`. Pass `null` to select last item.\n */\n highlightPrevious(item = this.highlightListItem): void {\n const previous = item ? this.getPreviousItem(item) : this.getLastItem();\n this.highlightItem(previous);\n }\n\n highlightFirst(): void {\n const item = this.getFirstItem();\n this.highlightItem(item);\n }\n\n highlightLast(): void {\n const item = this.getLastItem();\n this.highlightItem(item);\n }\n\n handleClick(event: MouseEvent): void {\n this.activateFromEvent(event);\n }\n\n protected highlightItem(item?: UiListItem): void {\n if (this.highlightListItem) {\n this.highlightListItem.classList.remove('highlight');\n }\n this.highlightListItem = item || null;\n if (this.highlightListItem) {\n this.highlightListItem.classList.add('highlight');\n this.highlightListItem.scrollIntoView({ block: \"end\", inline: \"nearest\" });\n }\n }\n\n /**\n * Activates a list item from an Event.\n * Activate means dispatches a non-bubbling CustomEvent with the item in the detail.\n */\n protected activateFromEvent(e: Event): void {\n const path = e.composedPath();\n let item: UiListItem | undefined;\n while (!item) {\n const next = path.shift() as Element;\n if (next === this) {\n break;\n }\n if (!this.isListItem(next) || !this.isSelectable(next)) {\n continue;\n }\n item = next as UiListItem;\n }\n if (!item) {\n return;\n }\n this.manageSelection(item);\n item.activate();\n this.activeListItem = item;\n this.notifySelect(item);\n }\n\n notifySelect(item: UiListItem): void {\n const index = this.items.indexOf(item);\n if (index === -1) {\n return;\n }\n this.dispatchEvent(new CustomEvent<UiListSelection>('select', {\n detail: {\n item,\n index,\n }\n }));\n }\n\n protected manageSelection(item: UiListItem): void {\n if (!this.selectActive) {\n return;\n }\n const { activeListItem } = this;\n if (activeListItem) {\n activeListItem.classList.remove('select');\n }\n item.classList.add('select');\n }\n\n override render(): TemplateResult {\n return html`<slot @slotchange=\"${this.updateItems}\"></slot>`;\n }\n}\n"]}
1
+ {"version":3,"file":"UiList.js","sourceRoot":"","sources":["../../../src/ui/list/UiList.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, PropertyValues, TemplateResult } from \"lit\";\nimport { property, queryAssignedElements } from \"lit/decorators.js\";\nimport UiListItem from \"./UiListItem.js\";\n\nconst NAVIGATION_KEYS = {\n ArrowDown: 'ArrowDown',\n ArrowUp: 'ArrowUp',\n Home: 'Home',\n End: 'End',\n};\n\nconst ACTIVATION_KEYS = {\n Enter: 'Enter',\n Space: ' ',\n};\n\nexport interface UiListSelection {\n item: HTMLElement,\n index: number,\n}\n\n/**\n * @fires select - Dispatched when the user click or press `Enter` or `Space` on any active list item. The `event.detail` object contains the `item` and `index` properties.\n */\nexport default class UiList extends LitElement {\n items: UiListItem[] = [];\n\n activeListItem: UiListItem | null = null;\n\n highlightListItem: UiListItem | null = null;\n\n /**\n * The CSS selector that is used to recognize which items are \n * active list items (can be selected, focused, etc.)\n * @attribute\n */\n @property({ type: String }) selector: string;\n\n /**\n * When set it marks last activated list item as selected.\n * @attribute\n */\n @property({ type: Boolean }) selectActive?: boolean;\n\n @queryAssignedElements({ flatten: true }) protected assignedElements!: HTMLElement[] | null;\n\n constructor() {\n super();\n this.selector = 'ui-list-item';\n this.addEventListener('keydown', this.handleKeydown.bind(this));\n this.addEventListener('click', this.handleClick.bind(this));\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n }\n\n override focus(options?: FocusOptions): void {\n const { activeListItem } = this;\n if (activeListItem) {\n activeListItem.focus(options);\n return;\n }\n this.activateFirstItem();\n }\n\n override firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n\n this.updateItems();\n }\n\n activateFirstItem(): void {\n this.activeListItem = this.getFirstItem();\n this.activeListItem?.activate();\n }\n\n activateLastItem(): void {\n this.activeListItem = this.getLastItem();\n this.activeListItem?.activate();\n }\n\n resetActiveListItem(): void {\n this.activeListItem = null;\n this.setAttribute('tabindex', '0');\n }\n\n protected updateItems(): void {\n const elements = this.assignedElements || [];\n const items = elements.filter(this.isListItem, this);\n this.items = items;\n if (this.activeListItem && !items.includes(this.activeListItem)) {\n this.activeListItem = null;\n }\n if (this.highlightListItem && !items.includes(this.highlightListItem)) {\n this.highlightListItem = null;\n }\n }\n\n /** \n * @return Whether the given element is a list item element. \n */\n protected isListItem(element: Element): element is UiListItem {\n if (element.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n return element.matches(this.selector);\n }\n\n getFirstItem(): UiListItem {\n return this.items[0];\n }\n\n getLastItem(): UiListItem {\n return this.items[this.items.length - 1];\n }\n\n getPreviousItem(item: UiListItem): UiListItem {\n const { items } = this;\n const curIndex = items.indexOf(item);\n if (curIndex < 0) {\n return item;\n }\n let i = curIndex;\n let result: HTMLElement | undefined;\n do {\n i--;\n if (i === curIndex) {\n // looped back from the end, no active element to find.\n return item;\n }\n const tmp = items[i];\n if (!tmp) {\n i = items.length;\n continue;\n }\n if (this.isSelectable(tmp)) {\n result = tmp;\n }\n } while (!result);\n return result as UiListItem || item;\n }\n\n getNextItem(item: UiListItem): UiListItem {\n const { items } = this;\n const curIndex = items.indexOf(item);\n if (curIndex < 0) {\n return item;\n }\n let i = curIndex;\n let next: HTMLElement | undefined;\n do {\n i++;\n if (i === curIndex) {\n // looped back from the start, no active element to find.\n return item;\n }\n const tmp = items[i];\n if (!tmp) {\n i = -1;\n continue;\n }\n if (this.isSelectable(tmp)) {\n next = tmp;\n }\n } while (!next);\n return next as UiListItem || item;\n }\n\n protected isSelectable(element: HTMLElement): boolean {\n if ((element as unknown as { disabled: boolean }).disabled) {\n return false;\n }\n if (element.hasAttribute('disabled')) {\n return false;\n }\n if (element.hidden && element.hasAttribute('hidden')) {\n return false;\n }\n return true;\n }\n\n protected isListItemActive(item: UiListItem): boolean {\n return item.isActive();\n }\n\n protected deactivateListItem(item: UiListItem): void {\n item.deactivate();\n }\n\n protected activateListItem(item: UiListItem): void {\n this.removeAttribute('tabindex');\n item.activate();\n item.scrollIntoView({ block: \"end\", inline: \"nearest\" });\n }\n\n handleKeydown(event: KeyboardEvent): void {\n if (Object.values(ACTIVATION_KEYS).includes(event.key)) {\n this.activateFromEvent(event);\n return;\n }\n if (Object.values(NAVIGATION_KEYS).indexOf(event.key) === -1) return;\n\n for (const item of this.items) {\n if (this.isListItemActive(item)) {\n this.activeListItem = item;\n }\n\n this.deactivateListItem(item);\n }\n\n if (event.key === NAVIGATION_KEYS.ArrowDown) {\n event.preventDefault();\n this.activateNext();\n }\n\n if (event.key === NAVIGATION_KEYS.ArrowUp) {\n event.preventDefault();\n this.activatePrevious();\n }\n\n if (event.key === NAVIGATION_KEYS.Home) {\n event.preventDefault();\n this.activateFirst();\n }\n\n if (event.key === NAVIGATION_KEYS.End) {\n event.preventDefault();\n this.activateLast();\n }\n }\n\n activateFirst(): void {\n this.activeListItem = this.getFirstItem();\n if (this.activeListItem) {\n this.activateListItem(this.activeListItem);\n }\n }\n\n activateLast(): void {\n this.activeListItem = this.getLastItem();\n if (this.activeListItem) {\n this.activateListItem(this.activeListItem);\n }\n }\n\n activateNext(item = this.activeListItem): void {\n this.activeListItem = item ? this.getNextItem(item) : this.getFirstItem();\n if (this.activeListItem) {\n this.activateListItem(this.activeListItem);\n }\n }\n\n activatePrevious(item = this.activeListItem): void {\n this.activeListItem = item ? this.getPreviousItem(item) : this.getLastItem();\n if (this.activeListItem) {\n this.activateListItem(this.activeListItem);\n }\n }\n\n /**\n * Sets `highlight` class on the next item.\n * @param item When not set it highlights the first item. Default to `this.highlightListItem`. Pass `null` to select first item.\n */\n highlightNext(item = this.highlightListItem): void {\n const next = item ? this.getNextItem(item) : this.getFirstItem();\n this.highlightItem(next);\n }\n\n /**\n * Sets `highlight` class on the previous item.\n * @param item When not set it highlights the last item. Default to `this.highlightListItem`. Pass `null` to select last item.\n */\n highlightPrevious(item = this.highlightListItem): void {\n const previous = item ? this.getPreviousItem(item) : this.getLastItem();\n this.highlightItem(previous);\n }\n\n highlightFirst(): void {\n const item = this.getFirstItem();\n this.highlightItem(item);\n }\n\n highlightLast(): void {\n const item = this.getLastItem();\n this.highlightItem(item);\n }\n\n handleClick(event: MouseEvent): void {\n this.activateFromEvent(event);\n }\n\n protected highlightItem(item?: UiListItem): void {\n if (this.highlightListItem) {\n this.highlightListItem.classList.remove('highlight');\n }\n this.highlightListItem = item || null;\n if (this.highlightListItem) {\n this.highlightListItem.classList.add('highlight');\n this.highlightListItem.scrollIntoView({ block: \"end\", inline: \"nearest\" });\n }\n }\n\n /**\n * Activates a list item from an Event.\n * Activate means dispatches a non-bubbling CustomEvent with the item in the detail.\n */\n protected activateFromEvent(e: Event): void {\n const path = e.composedPath();\n let item: UiListItem | undefined;\n while (!item) {\n const next = path.shift() as Element;\n if (next === this) {\n break;\n }\n if (!this.isListItem(next) || !this.isSelectable(next)) {\n continue;\n }\n item = next as UiListItem;\n }\n if (!item) {\n return;\n }\n this.manageSelection(item);\n item.activate();\n this.activeListItem = item;\n if (this.notifySelect(item)) {\n e.preventDefault();\n }\n }\n\n /**\n * @param item The UiListItem that is selected.\n * @returns True when the event was canceled.\n */\n notifySelect(item: UiListItem): boolean {\n const index = this.items.indexOf(item);\n if (index === -1) {\n return false;\n }\n const event = new CustomEvent<UiListSelection>('select', {\n cancelable: true,\n detail: {\n item,\n index,\n }\n });\n this.dispatchEvent(event);\n return event.defaultPrevented;\n }\n\n protected manageSelection(item: UiListItem): void {\n if (!this.selectActive) {\n return;\n }\n const { items } = this;\n items.forEach((current) => current.classList.remove('select'));\n item.classList.add('select');\n }\n\n override render(): TemplateResult {\n return html`<slot @slotchange=\"${this.updateItems}\"></slot>`;\n }\n}\n"]}
@@ -73,6 +73,7 @@ export declare class SnackNotifications {
73
73
  protected static openHandler(e: Event): void;
74
74
  protected static dismissHandler(e: Event): void;
75
75
  static cancel(snack: Snackbar): void;
76
+ static clear(): void;
76
77
  }
77
78
  export {};
78
79
  //# sourceMappingURL=SnackNotifications.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SnackNotifications.d.ts","sourceRoot":"","sources":["../../../src/ui/notification/SnackNotifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,gCAAgC,CAAC;AAExC,MAAM,WAAW,UAAU;IACzB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAE7C,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAM;IAEjD;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAE1D;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ;IA0C1D,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI;IAajC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAc9C,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAoB5C,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAc/C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;CAiBrC"}
1
+ {"version":3,"file":"SnackNotifications.d.ts","sourceRoot":"","sources":["../../../src/ui/notification/SnackNotifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,gCAAgC,CAAC;AAExC,MAAM,WAAW,UAAU;IACzB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAE7C,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAM;IAEjD;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAE1D;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ;IA0C1D,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI;IAajC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAc9C,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAoB5C,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAc/C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAkBpC,MAAM,CAAC,KAAK,IAAI,IAAI;CAOrB"}
@@ -119,5 +119,12 @@ export class SnackNotifications {
119
119
  }
120
120
  }
121
121
  }
122
+ static clear() {
123
+ this.stack = [];
124
+ if (this.current) {
125
+ this.current.element.parentElement?.removeChild(this.current.element);
126
+ this.current = undefined;
127
+ }
128
+ }
122
129
  }
123
130
  //# sourceMappingURL=SnackNotifications.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SnackNotifications.js","sourceRoot":"","sources":["../../../src/ui/notification/SnackNotifications.ts"],"names":[],"mappings":"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","sourcesContent":["import { Snackbar } from \"./Snackbar.js\";\nimport '../../define/ui/ui-snackbar.js';\n\nexport interface ISnackInit {\n /**\n * When set the snackbar does not timeout.\n * It has to be cancelled by user interaction or programmatically.\n * \n * When the `cancellable` is set to false the user won't be able to dismiss the\n * snackbar and the application must remove the snackbar after the process \n * finish. Otherwise another snackbar won't appear.\n * \n * @default false\n */\n persistent?: boolean;\n\n /**\n * Whether the snackbar can be cancelled via user interaction.\n * \n * @default true\n */\n cancellable?: boolean;\n\n /**\n * The time in milliseconds after which the message is removed.\n * Has not effect when `persistent` flag is set.\n * \n * @default 5000\n */\n timeout?: number;\n\n /**\n * The action to render next to the message.\n * There can be only one action.\n * It is only rendered when `actionCallback` is set.\n */\n actionLabel?: string;\n\n /**\n * The callback function called when the action was activated by the user.\n */\n actionCallback?: () => void;\n\n /**\n * Whether to render affordable \"close\" icon.\n */\n close?: boolean;\n\n /**\n * Callback called when the message was closed either by the user interaction\n * or by a timeout.\n * Note, it is not called when the message is closed programmatically.\n */\n closed?: () => void;\n}\n\ninterface INotificationInfo {\n element: Snackbar;\n init?: ISnackInit;\n}\n\n/**\n * A class that manages user notifications via snackbars (toast messages).\n */\nexport class SnackNotifications {\n protected static current?: INotificationInfo;\n\n protected static stack: INotificationInfo[] = [];\n\n /**\n * Notifies a user about something using default settings.\n * @param message The message to show\n * @param timeout Optionally the timeout after which the message will disappear.\n */\n static notify(message: string, timeout?: number): Snackbar;\n\n /**\n * Notifies the user about something with full configuration options available.\n * @param message The message to show\n * @param init Snack configuration options.\n */\n static notify(message: string, init: ISnackInit): Snackbar;\n\n static notify(message: string, timeoutOrInit?: number | ISnackInit): Snackbar {\n const snack = document.createElement('ui-snackbar');\n snack.innerText = message;\n let configInit: ISnackInit | undefined;\n\n if (typeof timeoutOrInit === 'number') {\n snack.timeout = timeoutOrInit;\n } else if (timeoutOrInit) {\n const cnf = timeoutOrInit as ISnackInit;\n configInit = cnf;\n if (typeof cnf.timeout === 'number') {\n snack.timeout = cnf.timeout;\n }\n if (typeof cnf.persistent === 'boolean') {\n snack.persistent = cnf.persistent;\n }\n if (typeof cnf.close === 'boolean') { \n snack.close = cnf.close;\n }\n if (typeof cnf.cancellable === 'boolean') {\n snack.cancellable = cnf.cancellable;\n }\n if (cnf.actionLabel && typeof cnf.actionCallback === 'function') {\n snack.action = cnf.actionLabel;\n }\n }\n this.stack.push({\n element: snack,\n init: configInit,\n });\n document.body.appendChild(snack);\n snack.addEventListener('action', this.actionHandler.bind(this));\n snack.addEventListener('open', this.openHandler.bind(this));\n snack.addEventListener('dismiss', this.dismissHandler.bind(this));\n setTimeout(() => {\n this.schedule();\n });\n return snack;\n }\n\n protected static schedule(): void {\n if (this.current) {\n return;\n }\n const { stack = [] } = this;\n const item = stack.shift();\n if (!item) {\n return;\n }\n this.current = item;\n item.element.open = true;\n }\n\n protected static actionHandler(e: Event): void {\n const target = e.target as Snackbar;\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n if (info.init && info.init.actionCallback) {\n info.init.actionCallback();\n }\n }\n\n protected static openHandler(e: Event): void {\n const target = e.target as Snackbar;\n if (target.open) {\n return;\n }\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n target.parentElement?.removeChild(target);\n if (info.init && info.init.closed) {\n info.init.closed();\n }\n SnackNotifications.current = undefined;\n SnackNotifications.schedule();\n }\n\n protected static dismissHandler(e: Event): void {\n const target = e.target as Snackbar;\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n target.parentElement?.removeChild(target);\n SnackNotifications.current = undefined;\n SnackNotifications.schedule();\n }\n\n static cancel(snack: Snackbar): void {\n if (this.current?.element === snack) {\n if (snack.open) {\n // eslint-disable-next-line no-param-reassign\n snack.open = false;\n } else {\n snack.parentElement?.removeChild(snack);\n this.current = undefined;\n SnackNotifications.schedule();\n }\n } else {\n const index = this.stack.findIndex((i) => i.element === snack);\n if (index >= 0) {\n this.stack.splice(index, 1);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"SnackNotifications.js","sourceRoot":"","sources":["../../../src/ui/notification/SnackNotifications.ts"],"names":[],"mappings":"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","sourcesContent":["import { Snackbar } from \"./Snackbar.js\";\nimport '../../define/ui/ui-snackbar.js';\n\nexport interface ISnackInit {\n /**\n * When set the snackbar does not timeout.\n * It has to be cancelled by user interaction or programmatically.\n * \n * When the `cancellable` is set to false the user won't be able to dismiss the\n * snackbar and the application must remove the snackbar after the process \n * finish. Otherwise another snackbar won't appear.\n * \n * @default false\n */\n persistent?: boolean;\n\n /**\n * Whether the snackbar can be cancelled via user interaction.\n * \n * @default true\n */\n cancellable?: boolean;\n\n /**\n * The time in milliseconds after which the message is removed.\n * Has not effect when `persistent` flag is set.\n * \n * @default 5000\n */\n timeout?: number;\n\n /**\n * The action to render next to the message.\n * There can be only one action.\n * It is only rendered when `actionCallback` is set.\n */\n actionLabel?: string;\n\n /**\n * The callback function called when the action was activated by the user.\n */\n actionCallback?: () => void;\n\n /**\n * Whether to render affordable \"close\" icon.\n */\n close?: boolean;\n\n /**\n * Callback called when the message was closed either by the user interaction\n * or by a timeout.\n * Note, it is not called when the message is closed programmatically.\n */\n closed?: () => void;\n}\n\ninterface INotificationInfo {\n element: Snackbar;\n init?: ISnackInit;\n}\n\n/**\n * A class that manages user notifications via snackbars (toast messages).\n */\nexport class SnackNotifications {\n protected static current?: INotificationInfo;\n\n protected static stack: INotificationInfo[] = [];\n\n /**\n * Notifies a user about something using default settings.\n * @param message The message to show\n * @param timeout Optionally the timeout after which the message will disappear.\n */\n static notify(message: string, timeout?: number): Snackbar;\n\n /**\n * Notifies the user about something with full configuration options available.\n * @param message The message to show\n * @param init Snack configuration options.\n */\n static notify(message: string, init: ISnackInit): Snackbar;\n\n static notify(message: string, timeoutOrInit?: number | ISnackInit): Snackbar {\n const snack = document.createElement('ui-snackbar');\n snack.innerText = message;\n let configInit: ISnackInit | undefined;\n\n if (typeof timeoutOrInit === 'number') {\n snack.timeout = timeoutOrInit;\n } else if (timeoutOrInit) {\n const cnf = timeoutOrInit as ISnackInit;\n configInit = cnf;\n if (typeof cnf.timeout === 'number') {\n snack.timeout = cnf.timeout;\n }\n if (typeof cnf.persistent === 'boolean') {\n snack.persistent = cnf.persistent;\n }\n if (typeof cnf.close === 'boolean') { \n snack.close = cnf.close;\n }\n if (typeof cnf.cancellable === 'boolean') {\n snack.cancellable = cnf.cancellable;\n }\n if (cnf.actionLabel && typeof cnf.actionCallback === 'function') {\n snack.action = cnf.actionLabel;\n }\n }\n this.stack.push({\n element: snack,\n init: configInit,\n });\n document.body.appendChild(snack);\n snack.addEventListener('action', this.actionHandler.bind(this));\n snack.addEventListener('open', this.openHandler.bind(this));\n snack.addEventListener('dismiss', this.dismissHandler.bind(this));\n setTimeout(() => {\n this.schedule();\n });\n return snack;\n }\n\n protected static schedule(): void {\n if (this.current) {\n return;\n }\n const { stack = [] } = this;\n const item = stack.shift();\n if (!item) {\n return;\n }\n this.current = item;\n item.element.open = true;\n }\n\n protected static actionHandler(e: Event): void {\n const target = e.target as Snackbar;\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n if (info.init && info.init.actionCallback) {\n info.init.actionCallback();\n }\n }\n\n protected static openHandler(e: Event): void {\n const target = e.target as Snackbar;\n if (target.open) {\n return;\n }\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n target.parentElement?.removeChild(target);\n if (info.init && info.init.closed) {\n info.init.closed();\n }\n SnackNotifications.current = undefined;\n SnackNotifications.schedule();\n }\n\n protected static dismissHandler(e: Event): void {\n const target = e.target as Snackbar;\n const info = SnackNotifications.current;\n if (!info) {\n return;\n }\n if (target !== info.element) {\n return;\n }\n target.parentElement?.removeChild(target);\n SnackNotifications.current = undefined;\n SnackNotifications.schedule();\n }\n\n static cancel(snack: Snackbar): void {\n if (this.current?.element === snack) {\n if (snack.open) {\n // eslint-disable-next-line no-param-reassign\n snack.open = false;\n } else {\n snack.parentElement?.removeChild(snack);\n this.current = undefined;\n SnackNotifications.schedule();\n }\n } else {\n const index = this.stack.findIndex((i) => i.element === snack);\n if (index >= 0) {\n this.stack.splice(index, 1);\n }\n }\n }\n\n static clear(): void {\n this.stack = [];\n if (this.current) {\n this.current.element.parentElement?.removeChild(this.current.element);\n this.current = undefined;\n }\n }\n}\n"]}
@@ -23,6 +23,7 @@ export type RenderContent = string | TemplateResult | TemplateResult[];
23
23
  type CellCallback<T> = (item: T) => TemplateResult[];
24
24
  type ActivateCallback<T> = (item: T) => void;
25
25
  type SelectCallback = (item: string | string[]) => void;
26
+ type Callback = () => void;
26
27
  export interface ICellOptions {
27
28
  /**
28
29
  * The list of CSS class names to add to the cell.
@@ -96,6 +97,7 @@ export declare class DataTable<T> {
96
97
  addEventListener(type: 'empty', listener: () => TemplateResult): void;
97
98
  addEventListener(type: 'activate', listener: ActivateCallback<T>): void;
98
99
  addEventListener(type: 'select', listener: SelectCallback): void;
100
+ addEventListener(type: 'scrollend', listener: Callback): void;
99
101
  /**
100
102
  * Renders a header cell.
101
103
  *
@@ -131,6 +133,7 @@ export declare class DataTable<T> {
131
133
  protected moveFocusDown(e: Event): void;
132
134
  protected moveFocusUp(e: Event): void;
133
135
  protected handlePrimaryAction(e: Event): void;
136
+ protected handleListScroll(e: Event): void;
134
137
  protected renderHeader(): TemplateResult;
135
138
  protected renderBody(): TemplateResult;
136
139
  protected renderItem(item: T): TemplateResult;
@@ -140,6 +143,7 @@ export declare class DataTable<T> {
140
143
  protected dispatchEmpty(): TemplateResult | undefined;
141
144
  protected dispatchRender(): void;
142
145
  protected dispatchSelected(selection: string | string[]): void;
146
+ protected dispatchScrollEnd(): void;
143
147
  }
144
148
  export {};
145
149
  //# sourceMappingURL=DataTable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/ui/table/DataTable.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/ui/table/DataTable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,SAAS,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAC;AAI3D,OAAO,+BAA+B,CAAC;AAEvC,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAChC;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,cAAc,GAAG,cAAc,EAAE,CAAC;AAIvE,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,cAAc,EAAE,CAAC;AACrD,KAAK,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAC7C,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;AACxD,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAM3B,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,IAAI,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IACpD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,SAAS,CAAC,CAAC;;IACtB,MAAM,KAAK,MAAM,IAAI,SAAS,CAgG7B;IAID,IAAI,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAEpC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,EAOxC;IAED,OAAO,EAAE,iBAAiB,CAAC;IAM3B;;;OAGG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAM;IAExB;;;OAGG;IACH,SAAS,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;gBAErB,aAAa,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,iBAAsB;IAU9E,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,EAAE,GAAG,IAAI;IAExE,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAE5D,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAE/D,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,GAAG,IAAI;IAErE,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAEvE,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAEhE,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAM7D;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,GAAE,YAAiB,GAAG,cAAc;IAU1E;;;;;OAKG;IACH,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,GAAE,YAAiB,GAAG,cAAc;IAWxE,MAAM,IAAI,cAAc;IAwBxB,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,SAAS;IAezD,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,SAAS;IAY3D,SAAS,CAAC,qBAAqB,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY;IAwCvD,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,GAAG;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,GAAG,EAAE,WAAW,CAAA;KAAE,GAAG,SAAS;IAmB3F,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAQrC,SAAS,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAkBzC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAgBrC,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAiB/C,SAAS,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IASlD,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAYjD,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAWlD,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAqBpF,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAgBxC,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAgBvC,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAgBvC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAgBrC,SAAS,CAAC,mBAAmB,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAqB7C,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAS1C,SAAS,CAAC,YAAY,IAAI,cAAc;IAWxC,SAAS,CAAC,UAAU,IAAI,cAAc;IAWtC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc;IA2B7C,SAAS,CAAC,WAAW,IAAI,cAAc;IAWvC,SAAS,CAAC,cAAc,IAAI,cAAc,EAAE,GAAG,SAAS;IAexD,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,EAAE,GAAG,SAAS;IAe7D,SAAS,CAAC,aAAa,IAAI,cAAc,GAAG,SAAS;IAerD,SAAS,CAAC,cAAc,IAAI,IAAI;IAahC,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAa9D,SAAS,CAAC,iBAAiB,IAAI,IAAI;CAYpC"}
@@ -158,6 +158,7 @@ export class DataTable {
158
158
  this.handleClick = this.handleClick.bind(this);
159
159
  this.handleKeyDown = this.handleKeyDown.bind(this);
160
160
  this.handleFocus = this.handleFocus.bind(this);
161
+ this.handleListScroll = this.handleListScroll.bind(this);
161
162
  }
162
163
  addEventListener(type, listener) {
163
164
  this.#listeners[type] = listener;
@@ -492,6 +493,14 @@ export class DataTable {
492
493
  this.handleMultiSelection(row.dataset.key);
493
494
  }
494
495
  }
496
+ handleListScroll(e) {
497
+ const list = e.target;
498
+ const { scrollTop, offsetHeight, scrollHeight } = list;
499
+ const bottom = scrollTop + offsetHeight >= scrollHeight - 20; // 20 is the offset which qualifies as the end. An arbitrary number.
500
+ if (bottom) {
501
+ this.dispatchScrollEnd();
502
+ }
503
+ }
495
504
  renderHeader() {
496
505
  const cells = this.dispatchHeader();
497
506
  return html `
@@ -508,7 +517,7 @@ export class DataTable {
508
517
  const contents = !!items && !!items.length ? items.map(item => this.renderItem(item)) : this.renderEmpty();
509
518
  const dbListener = active ? this.dblclickHandler : undefined;
510
519
  return html `
511
- <div class="data-table-body" role="rowgroup" @dblclick="${dbListener}">
520
+ <div class="data-table-body" role="rowgroup" @dblclick="${dbListener}" @scroll="${{ handleEvent: this.handleListScroll, passive: true }}">
512
521
  ${contents}
513
522
  </div>`;
514
523
  }
@@ -620,5 +629,18 @@ export class DataTable {
620
629
  console.warn(e);
621
630
  }
622
631
  }
632
+ dispatchScrollEnd() {
633
+ const callback = this.#listeners.scrollend;
634
+ if (!callback) {
635
+ return;
636
+ }
637
+ try {
638
+ callback();
639
+ }
640
+ catch (e) {
641
+ // eslint-disable-next-line no-console
642
+ console.warn(e);
643
+ }
644
+ }
623
645
  }
624
646
  //# sourceMappingURL=DataTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../../src/ui/table/DataTable.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, CSSResult, html, TemplateResult } from \"lit\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { ClassInfo, classMap } from \"lit/directives/class-map.js\";\nimport { dataAttr } from \"../../directives/data-attr.js\";\nimport '../../define/ui/ui-divider.js';\n\nexport interface IDataTableOptions {\n /**\n * The name of the property that identifies the key. The key is inserted into each row as `data-key`.\n * Default to `key`.\n */\n key?: string;\n /**\n * The value of the aria-label to render on the table.\n */\n ariaLabel?: string;\n\n /**\n * When true it dispatches `activate` event when the user double click on a row.\n */\n active?: boolean;\n /**\n * When set it allows a single selection. A list item is highlighted and the `select` event is dispatched when the selection change.\n */\n selection?: 'single' | 'multi';\n}\n\nexport type RenderContent = string | TemplateResult | TemplateResult[];\n\ntype DataEvents = 'header' | 'item' | 'empty' | 'activate' | 'select' | 'render';\n\ntype CellCallback<T> = (item: T) => TemplateResult[];\ntype ActivateCallback<T> = (item: T) => void;\ntype SelectCallback = (item: string | string[]) => void;\n\ntype DataEventsMap<T> = {\n [key in DataEvents]?: SelectCallback | CellCallback<T> | CellCallback<T[]> | ActivateCallback<T> | ActivateCallback<T[]> | {(): TemplateResult | TemplateResult[]};\n};\n\nexport interface ICellOptions {\n /**\n * The list of CSS class names to add to the cell.\n */\n class?: string;\n\n /**\n * The list of data attributes to set on the cell.\n */\n data?: { [key: string]: number | string | boolean };\n /**\n * The value of the aria-label to render on the cell.\n */\n ariaLabel?: string;\n}\n\ninterface CellPosition { \n row: number; \n cell: number; \n}\n\n/**\n * A helper class that allows to build a data table in a programmatic way.\n * \n * Usage:\n * \n * const dt = new DataTable(arrayOfItems, { key: 'key' });\n * // or dt.items = arrayOfItems;\n * dt.addEventListener('header', () => { \n * const c1 = dt.header('name', { class: 'name-column', data: {a: b} });\n * const c2 = dt.header('created', { class: 'created-column', data: {a: b} });\n * return [c1, c2];\n * });\n * dt.addEventListener('item', (item) => { \n * const c1 = dt.cell(html`cell template content`, { class: 'a b c', data: {a: b} });\n * const c2 = dt.cell(`cell text content`, { class: 'xyz', data: {key: 'value'} });\n * return [c1, c2];\n * });\n * dt.addEventListener('empty', () => { \n * return html`<p>The table has no records.</p>`;\n * });\n * \n * const template = dt.render();\n * \n * @fires header - An event dispatched when a table header row is being rendered.\n * @fires item - An event dispatched when a table item row is being rendered.\n * @fires empty - An event dispatched when a table has no rows to render.\n * @fires activate - An event dispatched when the user double click on a row.\n * @fires select - An event dispatched when the user selected a table item in a single or multi selection table.\n * @fires render - An event dispatched when the internal state changed and the table must be rendered again.\n */\nexport class DataTable<T> {\n static get styles(): CSSResult {\n return css`\n .data-table {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .data-table-body {\n flex: 1;\n overflow: auto;\n }\n\n .data-table-row {\n height: 44px;\n position: relative;\n\n display: flex;\n align-items: center;\n\n font-family: var(--md-sys-typescale-body-medium-font-family-name);\n font-style: var(--md-sys-typescale-body-medium-font-family-style);\n font-weight: var(--md-sys-typescale-body-medium-font-weight);\n font-size: var(--md-sys-typescale-body-medium-font-size);\n letter-spacing: var(--md-sys-typescale-body-medium-tracking);\n line-height: var(--md-sys-typescale-body-medium-height);\n text-transform: var(--md-sys-typescale-body-medium-text-transform);\n text-decoration: var(--md-sys-typescale-body-medium-text-decoration);\n }\n\n .data-table-row-body {\n height: inherit;\n display: flex;\n align-items: center;\n flex: 1;\n }\n\n .data-table-body .data-table-row:not(.data-table-empty-row):hover::before {\n content: '';\n background-color: var(--md-sys-color-on-surface);\n opacity: var(--md-sys-state-hover-state-layer-opacity);\n position: absolute;\n inset: 0;\n z-index: -1;\n }\n\n .data-table-header {\n font-family: var(--md-sys-typescale-label-large-font-family-name);\n font-style: var(--md-sys-typescale-label-large-font-family-style);\n font-weight: var(--md-sys-typescale-label-large-font-weight);\n font-size: var(--md-sys-typescale-label-large-font-size);\n letter-spacing: var(--md-sys-typescale-label-large-tracking);\n line-height: var(--md-sys-typescale-label-large-height);\n text-transform: var(--md-sys-typescale-label-large-text-transform);\n text-decoration: var(--md-sys-typescale-label-large-text-decoration);\n }\n\n .data-table-cell {\n display: flex;\n align-items: center;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n height: inherit;\n padding: 12px;\n box-sizing: border-box;\n position: relative;\n }\n\n .data-table-row.data-table-empty-row {\n height: auto;\n display: block;\n }\n\n .data-table-row.data-table-empty-row > [role=cell] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n\n .selected {\n background-color: var(--md-sys-color-secondary-container);\n border-radius: 8px;\n }\n\n .data-table-cell:focus-visible::before {\n content: '';\n background-color: var(--md-sys-color-on-surface);\n opacity: var(--md-sys-state-focus-state-layer-opacity);\n position: absolute;\n inset: 0;\n z-index: -1;\n }\n `;\n }\n\n #renderItems?: T[];\n\n get items(): ArrayLike<T> | undefined {\n return this.#renderItems;\n }\n\n set items(value: ArrayLike<T> | undefined) {\n if (!value) {\n this.#renderItems = undefined;\n return;\n }\n const arr = Array.from(value);\n this.#renderItems = arr;\n }\n\n options: IDataTableOptions;\n \n #listeners: DataEventsMap<T> = {};\n\n #getItems: () => ArrayLike<T>;\n\n /**\n * The list of keys that correspond to the `key` set on the options of items that are currently selected.\n * Note, this is a common list for single and multi selection. In a single selection only the first is taken into account.\n */\n selected: string[] = [];\n\n /**\n * Describes currently focused cell.\n * The `row` is the index of the focused row (starting with the header) and the `cell` is the index of the focused cell.\n */\n protected focused?: CellPosition;\n\n constructor(itemsCallback: () => ArrayLike<T>, options: IDataTableOptions = {}) {\n this.options = options;\n this.#getItems = itemsCallback;\n this.dblclickHandler = this.dblclickHandler.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n }\n\n addEventListener(type: 'header', listener: () => TemplateResult[]): void;\n\n addEventListener(type: 'render', listener: () => void): void;\n\n addEventListener(type: 'item', listener: CellCallback<T>): void;\n\n addEventListener(type: 'empty', listener: () => TemplateResult): void;\n\n addEventListener(type: 'activate', listener: ActivateCallback<T>): void;\n\n addEventListener(type: 'select', listener: SelectCallback): void;\n\n addEventListener(type: DataEvents, listener: SelectCallback | CellCallback<T> | CellCallback<T[]> | ActivateCallback<T> | ActivateCallback<T[]> | {(): TemplateResult | TemplateResult[]}): void {\n this.#listeners[type] = listener;\n }\n\n /**\n * Renders a header cell.\n * \n * @param content The content of the header cell to render.\n * @param options Cell rendering options\n */\n header(content: RenderContent, options: ICellOptions = {}): TemplateResult {\n const data = options.data || {};\n return html`<span \n role=\"columnheader\" \n class=\"data-table-cell data-table-header-cell ${options.class || ''}\"\n aria-label=\"${ifDefined(options.ariaLabel)}\"\n ${dataAttr(data)}\n >${content}</span>`;\n }\n\n /**\n * Renders a body cell.\n * \n * @param content The content of the header cell to render.\n * @param options Cell rendering options\n */\n cell(content: RenderContent, options: ICellOptions = {}): TemplateResult {\n const data = options.data || {};\n return html`\n <span \n role=\"gridcell\" \n class=\"data-table-cell data-table-body-cell ${options.class || ''}\"\n ${dataAttr(data)}\n >${content}</span>\n `;\n }\n\n render(): TemplateResult {\n this.items = this.#getItems();\n const { options } = this;\n const clickListener = options.selection ? this.handleClick : undefined;\n return html`\n <div \n class=\"data-table\" \n role=\"grid\" \n aria-label=\"${ifDefined(options.ariaLabel)}\"\n aria-multiselectable=\"${options.selection === 'multi'}\"\n aria-readonly=\"true\"\n aria-rowcount=\"-1\"\n tabindex=\"0\"\n @focus=\"${this.handleFocus}\"\n @click=\"${clickListener}\" \n @keydown=\"${this.handleKeyDown}\"\n >\n ${this.renderHeader()}\n <ui-divider></ui-divider>\n ${this.renderBody()}\n </div>\n `;\n }\n\n protected rowFromEvent(e: Event): HTMLElement | undefined {\n const path = e.composedPath();\n const row = path.find(current => {\n const element = current as Element;\n if (element.classList && element.classList.contains('data-table-row')) {\n return true;\n }\n return false;\n }) as HTMLElement | undefined;\n if (!row || !row.dataset.key) {\n return undefined;\n }\n return row;\n }\n\n protected tableFromEvent(e: Event): HTMLElement | undefined {\n const path = e.composedPath();\n const row = path.find((current) => {\n const element = current as Element;\n if (element.classList && element.classList.contains('data-table')) {\n return true;\n }\n return false;\n }) as HTMLElement | undefined;\n return row;\n }\n\n protected cellPositionFromEvent(e: Event): CellPosition {\n const result: CellPosition = {\n cell: 0,\n row: 0,\n };\n let row: HTMLElement | undefined;\n let column: HTMLElement | undefined;\n let table: HTMLElement | undefined;\n const path = e.composedPath();\n for (const current of path.values()) {\n const element = current as HTMLElement;\n if (element.classList && element.classList.contains('data-table-row')) {\n row = element;\n } else if (element.classList && element.classList.contains('data-table-cell')) {\n column = element;\n } else if (element.classList && element.classList.contains('data-table')) {\n table = element;\n break;\n }\n }\n if (!table) {\n return result;\n }\n if (row) {\n const rows = Array.from(table.querySelectorAll(`.data-table-row`));\n const rowIndex = rows.indexOf(row);\n if (rowIndex >= 0) {\n result.row = rowIndex;\n }\n if (column) {\n const columns = Array.from(row.querySelectorAll(`.data-table-cell`));\n const cellIndex = columns.indexOf(column);\n if (cellIndex >= 0) {\n result.cell = cellIndex;\n }\n }\n }\n return result;\n }\n\n protected cellRowFromEvent(e: Event): { column: HTMLElement, row: HTMLElement } | undefined {\n let row: HTMLElement | undefined;\n let column: HTMLElement | undefined;\n const path = e.composedPath();\n for (const current of path.values()) {\n const element = current as HTMLElement;\n if (element.classList && element.classList.contains('data-table-row')) {\n row = element;\n break;\n } else if (element.classList && element.classList.contains('data-table-cell')) {\n column = element;\n }\n }\n if (!row || !column) {\n return undefined;\n }\n return { row, column }\n }\n\n protected handleFocus(e: Event): void {\n const target = e.target as HTMLElement;\n if (target.classList.contains('data-table')) {\n // focusing on the table, move the focus to the first cell\n this.focusFirstCell(target);\n }\n }\n\n protected dblclickHandler(e: Event): void {\n const callback = this.#listeners.activate as (item: T) => void;\n if (!callback) {\n return;\n }\n const row = this.rowFromEvent(e)\n if (!row) {\n return;\n }\n const { key } = row.dataset;\n const keyProperty = this.options.key || 'key';\n const item = this.#renderItems?.find(i => (i as unknown as {[key: string]: unknown})[keyProperty] === key);\n if (!item) {\n return;\n }\n callback(item);\n }\n\n protected handleClick(e: Event): void {\n const { selection } = this.options;\n const row = this.rowFromEvent(e)\n if (!row) {\n return;\n }\n if (selection === 'single') {\n this.handleSingleSelection(row.dataset.key as string);\n } else if (selection === 'multi') {\n this.handleMultiSelection(row.dataset.key as string);\n }\n const table = this.tableFromEvent(e) as HTMLElement;\n this.focused = this.cellPositionFromEvent(e);\n this.focusCell(table, this.focused.row, this.focused.cell);\n }\n\n protected handleKeyDown(e: KeyboardEvent): void {\n if (e.defaultPrevented) {\n return;\n }\n if (['Space', 'Enter'].includes(e.code)) {\n this.handlePrimaryAction(e);\n } else if (e.code === 'ArrowRight') {\n this.moveFocusRight(e);\n } else if (e.code === 'ArrowDown') {\n this.moveFocusDown(e);\n } else if (e.code === 'ArrowUp') {\n this.moveFocusUp(e);\n } else if (e.code === 'ArrowLeft') {\n this.moveFocusLeft(e);\n }\n }\n\n protected handleSingleSelection(key: string): void {\n if (this.selected.includes(key)) {\n return;\n }\n this.selected = [key];\n this.dispatchRender();\n this.dispatchSelected(key);\n }\n\n protected handleMultiSelection(key: string): void {\n const { selected } = this;\n if (selected.includes(key)) {\n const index = selected.indexOf(key);\n selected.splice(index, 1);\n } else {\n selected.push(key);\n }\n this.dispatchRender();\n this.dispatchSelected(selected);\n }\n\n protected focusFirstCell(table: HTMLElement): void {\n const cell = table.querySelector('[role=\"columnheader\"]') as HTMLElement | null;\n if (!cell) {\n return;\n }\n cell.setAttribute('tabindex', '0');\n cell.focus();\n table.removeAttribute('tabindex');\n this.focused = { cell: 0, row: 0 };\n }\n\n protected focusCell(table: HTMLElement, rowIndex: number, colIndex: number): boolean {\n const row = table.querySelectorAll('[role=\"row\"]')[rowIndex];\n if (!row) {\n return false;\n }\n const cell = row.querySelectorAll(`.data-table-cell`)[colIndex] as HTMLElement | null;\n if (!cell) {\n return false;\n }\n const current = table.querySelector(`.data-table-cell[tabindex]`);\n cell.setAttribute('tabindex', '0');\n cell.focus();\n if (current) {\n current.removeAttribute('tabindex');\n } \n if (table.hasAttribute('tabindex')) {\n table.removeAttribute('tabindex');\n }\n return true;\n }\n\n protected moveFocusRight(e: Event): void {\n e.preventDefault();\n const table = this.tableFromEvent(e);\n if (!table) {\n return;\n }\n const { focused } = this;\n if (!focused) {\n this.focusFirstCell(table);\n return;\n }\n if (this.focusCell(table, focused.row, focused.cell + 1)) {\n focused.cell += 1;\n }\n }\n\n protected moveFocusLeft(e: Event): void {\n e.preventDefault();\n const table = this.tableFromEvent(e);\n if (!table) {\n return;\n }\n const { focused } = this;\n if (!focused) {\n this.focusFirstCell(table);\n return;\n }\n if (this.focusCell(table, focused.row, focused.cell - 1)) {\n focused.cell -= 1;\n }\n }\n\n protected moveFocusDown(e: Event): void {\n e.preventDefault();\n const table = this.tableFromEvent(e);\n if (!table) {\n return;\n }\n const { focused } = this;\n if (!focused) {\n this.focusFirstCell(table);\n return;\n }\n if (this.focusCell(table, focused.row + 1, focused.cell)) {\n focused.row += 1;\n }\n }\n\n protected moveFocusUp(e: Event): void {\n e.preventDefault();\n const table = this.tableFromEvent(e);\n if (!table) {\n return;\n }\n const { focused } = this;\n if (!focused) {\n this.focusFirstCell(table);\n return;\n }\n if (this.focusCell(table, focused.row - 1, focused.cell)) {\n focused.row -= 1;\n }\n }\n\n protected handlePrimaryAction(e: Event): void {\n e.preventDefault();\n const info = this.cellRowFromEvent(e);\n if (!info) {\n return;\n }\n const { row, column } = info;\n // first check if the cell has an focusable element. If so trigger action on it.\n const focusable = column.querySelector('[tabindex=\"0\"]') as HTMLElement | null;\n if (focusable) {\n focusable.click();\n return;\n }\n const { selection } = this.options;\n if (selection === 'single') {\n this.handleSingleSelection(row.dataset.key as string);\n } else if (selection === 'multi') {\n this.handleMultiSelection(row.dataset.key as string);\n }\n }\n\n protected renderHeader(): TemplateResult {\n const cells = this.dispatchHeader();\n return html`\n <div role=\"rowgroup\">\n <div role=\"row\" class=\"data-table-row data-table-header\">\n ${cells}\n </div>\n </div>\n `;\n }\n\n protected renderBody(): TemplateResult {\n const { active = false } = this.options;\n const items = this.#renderItems;\n const contents = !!items && !!items.length ? items.map(item => this.renderItem(item)) : this.renderEmpty();\n const dbListener = active ? this.dblclickHandler : undefined;\n return html`\n <div class=\"data-table-body\" role=\"rowgroup\" @dblclick=\"${dbListener}\">\n ${contents}\n </div>`;\n }\n\n protected renderItem(item: T): TemplateResult {\n const cells = this.dispatchItem(item);\n const { selected, options } = this;\n const typed = item as unknown as Record<string, string>;\n const key = typed[options.key || 'key'];\n let isSelected = false;\n if (options.selection === 'single') {\n const [selectedKey] = selected;\n if (selectedKey === key) {\n isSelected = true;\n }\n } else if (options.selection === 'multi') {\n isSelected = selected.includes(key);\n }\n const classes: ClassInfo = {\n 'data-table-row': true,\n selected: isSelected,\n };\n return html`\n <div role=\"row\" class=\"${classMap(classes)}\" data-key=\"${key}\" aria-selected=\"${isSelected ? 'true' : 'false'}\">\n <div class=\"data-table-row-body\" role=\"presentation\">\n ${cells}\n </div>\n </div>\n `;\n }\n\n protected renderEmpty(): TemplateResult {\n const content = this.dispatchEmpty();\n return html`\n <div role=\"row\" class=\"data-table-row data-table-empty-row\">\n <div role=\"cell\">\n ${content}\n </div>\n </div>\n `;\n }\n\n protected dispatchHeader(): TemplateResult[] | undefined {\n const callback = this.#listeners.header as () => TemplateResult[] | undefined;\n if (!callback) {\n return undefined;\n }\n let content: TemplateResult[] | undefined;\n try {\n content = callback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n return content;\n }\n\n protected dispatchItem(item: T): TemplateResult[] | undefined {\n const callback = this.#listeners.item as CellCallback<T> | undefined;\n if (!callback) {\n return undefined;\n }\n let content: TemplateResult[] | undefined;\n try {\n content = callback(item);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n return content;\n }\n\n protected dispatchEmpty(): TemplateResult | undefined {\n const callback = this.#listeners.empty as () => TemplateResult | undefined;\n if (!callback) {\n return undefined;\n }\n let content: TemplateResult | undefined;\n try {\n content = callback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n return content;\n }\n\n protected dispatchRender(): void {\n const callback = this.#listeners.render as () => void;\n if (!callback) {\n return;\n }\n try {\n callback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n }\n\n protected dispatchSelected(selection: string | string[]): void {\n const callback = this.#listeners.select as SelectCallback;\n if (!callback) {\n return;\n }\n try {\n callback(selection);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../../src/ui/table/DataTable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAa,IAAI,EAAkB,MAAM,KAAK,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAa,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,+BAA+B,CAAC;AAyDvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,OAAO,SAAS;IACpB,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8FT,CAAC;IACJ,CAAC;IAED,YAAY,CAAO;IAEnB,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,KAAK,CAAC,KAA+B;QACvC,IAAI,CAAC,KAAK,EAAE;YACV,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,OAAO;SACR;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;IAC1B,CAAC;IAID,UAAU,CAAwB;IAElC,SAAS,CAAqB;IAc9B,YAAY,aAAiC,EAAE,UAA6B,EAAE;QAhB9E,eAAU,GAAqB,EAAE,CAAC;QAIlC;;;WAGG;QACH,aAAQ,GAAa,EAAE,CAAC;QAStB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAgBD,gBAAgB,CAAC,IAAgB,EAAE,QAAsJ;QACvL,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,OAAsB,EAAE,UAAwB,EAAE;QACvD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,OAAO,IAAI,CAAA;;sDAEuC,OAAO,CAAC,KAAK,IAAI,EAAE;oBACrD,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC;OACf,OAAO,SAAS,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,OAAsB,EAAE,UAAwB,EAAE;QACrD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,OAAO,IAAI,CAAA;;;oDAGqC,OAAO,CAAC,KAAK,IAAI,EAAE;QAC/D,QAAQ,CAAC,IAAI,CAAC;OACf,OAAO;KACT,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,OAAO,IAAI,CAAA;;;;oBAIK,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;8BAClB,OAAO,CAAC,SAAS,KAAK,OAAO;;;;gBAI3C,IAAI,CAAC,WAAW;gBAChB,aAAa;kBACX,IAAI,CAAC,aAAa;;QAE5B,IAAI,CAAC,YAAY,EAAE;;QAEnB,IAAI,CAAC,UAAU,EAAE;;KAEpB,CAAC;IACJ,CAAC;IAES,YAAY,CAAC,CAAQ;QAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC9B,MAAM,OAAO,GAAG,OAAkB,CAAC;YACnC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;gBACrE,OAAO,IAAI,CAAC;aACb;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAA4B,CAAC;QAC9B,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5B,OAAO,SAAS,CAAC;SAClB;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAES,cAAc,CAAC,CAAQ;QAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAChC,MAAM,OAAO,GAAG,OAAkB,CAAC;YACnC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;gBACjE,OAAO,IAAI,CAAC;aACb;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAA4B,CAAC;QAC9B,OAAO,GAAG,CAAC;IACb,CAAC;IAES,qBAAqB,CAAC,CAAQ;QACtC,MAAM,MAAM,GAAiB;YAC3B,IAAI,EAAE,CAAC;YACP,GAAG,EAAE,CAAC;SACP,CAAC;QACF,IAAI,GAA4B,CAAC;QACjC,IAAI,MAA+B,CAAC;QACpC,IAAI,KAA8B,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC;QAC9B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,OAAsB,CAAC;YACvC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;gBACrE,GAAG,GAAG,OAAO,CAAC;aACf;iBAAM,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;gBAC7E,MAAM,GAAG,OAAO,CAAC;aAClB;iBAAM,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;gBACxE,KAAK,GAAG,OAAO,CAAC;gBAChB,MAAM;aACP;SACF;QACD,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,MAAM,CAAC;SACf;QACD,IAAI,GAAG,EAAE;YACP,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,QAAQ,IAAI,CAAC,EAAE;gBACjB,MAAM,CAAC,GAAG,GAAG,QAAQ,CAAC;aACvB;YACD,IAAI,MAAM,EAAE;gBACV,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACrE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC1C,IAAI,SAAS,IAAI,CAAC,EAAE;oBAClB,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;iBACzB;aACF;SACF;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAES,gBAAgB,CAAC,CAAQ;QACjC,IAAI,GAA4B,CAAC;QACjC,IAAI,MAA+B,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC;QAC9B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,OAAsB,CAAC;YACvC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;gBACrE,GAAG,GAAG,OAAO,CAAC;gBACd,MAAM;aACP;iBAAM,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;gBAC7E,MAAM,GAAG,OAAO,CAAC;aAClB;SACF;QACD,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;YACnB,OAAO,SAAS,CAAC;SAClB;QACD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;IACxB,CAAC;IAES,WAAW,CAAC,CAAQ;QAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqB,CAAC;QACvC,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;YAC3C,0DAA0D;YAC1D,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;SAC7B;IACH,CAAC;IAES,eAAe,CAAC,CAAQ;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAA6B,CAAC;QAC/D,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO;SACR;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAChC,IAAI,CAAC,GAAG,EAAE;YACR,OAAO;SACR;QACD,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAE,CAAyC,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;QAC3G,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QACD,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAES,WAAW,CAAC,CAAQ;QAC5B,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAChC,IAAI,CAAC,GAAG,EAAE;YACR,OAAO;SACR;QACD,IAAI,SAAS,KAAK,QAAQ,EAAE;YAC1B,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAa,CAAC,CAAC;SACvD;aAAM,IAAI,SAAS,KAAK,OAAO,EAAE;YAChC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAa,CAAC,CAAC;SACtD;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAgB,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAES,aAAa,CAAC,CAAgB;QACtC,IAAI,CAAC,CAAC,gBAAgB,EAAE;YACtB,OAAO;SACR;QACD,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;YACvC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;SAC7B;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE;YAClC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;SACxB;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE;YACjC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACvB;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE;YAC/B,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;SACrB;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE;YACjC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACvB;IACH,CAAC;IAES,qBAAqB,CAAC,GAAW;QACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC/B,OAAO;SACR;QACD,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAES,oBAAoB,CAAC,GAAW;QACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC1B,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAC3B;aAAM;YACL,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACpB;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAES,cAAc,CAAC,KAAkB;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,uBAAuB,CAAuB,CAAC;QAChF,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QACD,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IACrC,CAAC;IAES,SAAS,CAAC,KAAkB,EAAE,QAAgB,EAAE,QAAgB;QACxE,MAAM,GAAG,GAAG,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG,EAAE;YACR,OAAO,KAAK,CAAC;SACd;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAuB,CAAC;QACtF,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,KAAK,CAAC;SACd;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC;QAClE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;SACrC;QACD,IAAI,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;YAClC,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;SACnC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAES,cAAc,CAAC,CAAQ;QAC/B,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;SACR;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO;SACR;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE;YACxD,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;SACnB;IACH,CAAC;IAES,aAAa,CAAC,CAAQ;QAC9B,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;SACR;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO;SACR;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE;YACxD,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;SACnB;IACH,CAAC;IAES,aAAa,CAAC,CAAQ;QAC9B,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;SACR;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO;SACR;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YACxD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;SAClB;IACH,CAAC;IAES,WAAW,CAAC,CAAQ;QAC5B,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;SACR;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO;SACR;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YACxD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;SAClB;IACH,CAAC;IAES,mBAAmB,CAAC,CAAQ;QACpC,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QACD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAC7B,gFAAgF;QAChF,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAuB,CAAC;QAC/E,IAAI,SAAS,EAAE;YACb,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO;SACR;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,IAAI,SAAS,KAAK,QAAQ,EAAE;YAC1B,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAa,CAAC,CAAC;SACvD;aAAM,IAAI,SAAS,KAAK,OAAO,EAAE;YAChC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAa,CAAC,CAAC;SACtD;IACH,CAAC;IAES,gBAAgB,CAAC,CAAQ;QACjC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAqB,CAAC;QACrC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;QACvD,MAAM,MAAM,GAAG,SAAS,GAAG,YAAY,IAAI,YAAY,GAAG,EAAE,CAAC,CAAC,oEAAoE;QAClI,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC1B;IACH,CAAC;IAES,YAAY;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,OAAO,IAAI,CAAA;;;UAGL,KAAK;;;KAGV,CAAC;IACJ,CAAC;IAES,UAAU;QAClB,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;QAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3G,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,OAAO,IAAI,CAAA;8DAC+C,UAAU,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE;QACnI,QAAQ;WACL,CAAC;IACV,CAAC;IAES,UAAU,CAAC,IAAO;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACnC,MAAM,KAAK,GAAG,IAAyC,CAAC;QACxD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;QACxC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE;YAClC,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC;YAC/B,IAAI,WAAW,KAAK,GAAG,EAAE;gBACvB,UAAU,GAAG,IAAI,CAAC;aACnB;SACF;aAAM,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE;YACxC,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;SACrC;QACD,MAAM,OAAO,GAAc;YACzB,gBAAgB,EAAE,IAAI;YACtB,QAAQ,EAAE,UAAU;SACrB,CAAC;QACF,OAAO,IAAI,CAAA;6BACc,QAAQ,CAAC,OAAO,CAAC,eAAe,GAAG,oBAAoB,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;;UAEvG,KAAK;;;KAGV,CAAC;IACJ,CAAC;IAES,WAAW;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,OAAO,IAAI,CAAA;;;QAGP,OAAO;;;KAGV,CAAC;IACJ,CAAC;IAES,cAAc;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAA4C,CAAC;QAC9E,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO,SAAS,CAAC;SAClB;QACD,IAAI,OAAqC,CAAC;QAC1C,IAAI;YACF,OAAO,GAAG,QAAQ,EAAE,CAAC;SACtB;QAAC,OAAO,CAAC,EAAE;YACV,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAES,YAAY,CAAC,IAAO;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAmC,CAAC;QACrE,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO,SAAS,CAAC;SAClB;QACD,IAAI,OAAqC,CAAC;QAC1C,IAAI;YACF,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;SAC1B;QAAC,OAAO,CAAC,EAAE;YACV,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAES,aAAa;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAyC,CAAC;QAC3E,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO,SAAS,CAAC;SAClB;QACD,IAAI,OAAmC,CAAC;QACxC,IAAI;YACF,OAAO,GAAG,QAAQ,EAAE,CAAC;SACtB;QAAC,OAAO,CAAC,EAAE;YACV,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAES,cAAc;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAoB,CAAC;QACtD,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO;SACR;QACD,IAAI;YACF,QAAQ,EAAE,CAAC;SACZ;QAAC,OAAO,CAAC,EAAE;YACV,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;IACH,CAAC;IAES,gBAAgB,CAAC,SAA4B;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAwB,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO;SACR;QACD,IAAI;YACF,QAAQ,CAAC,SAAS,CAAC,CAAC;SACrB;QAAC,OAAO,CAAC,EAAE;YACV,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;IACH,CAAC;IAES,iBAAiB;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,SAAqB,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO;SACR;QACD,IAAI;YACF,QAAQ,EAAE,CAAC;SACZ;QAAC,OAAO,CAAC,EAAE;YACV,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;IACH,CAAC;CACF","sourcesContent":["import { css, CSSResult, html, TemplateResult } from \"lit\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { ClassInfo, classMap } from \"lit/directives/class-map.js\";\nimport { dataAttr } from \"../../directives/data-attr.js\";\nimport '../../define/ui/ui-divider.js';\n\nexport interface IDataTableOptions {\n /**\n * The name of the property that identifies the key. The key is inserted into each row as `data-key`.\n * Default to `key`.\n */\n key?: string;\n /**\n * The value of the aria-label to render on the table.\n */\n ariaLabel?: string;\n\n /**\n * When true it dispatches `activate` event when the user double click on a row.\n */\n active?: boolean;\n /**\n * When set it allows a single selection. A list item is highlighted and the `select` event is dispatched when the selection change.\n */\n selection?: 'single' | 'multi';\n}\n\nexport type RenderContent = string | TemplateResult | TemplateResult[];\n\ntype DataEvents = 'header' | 'item' | 'empty' | 'activate' | 'select' | 'render' | 'scrollend';\n\ntype CellCallback<T> = (item: T) => TemplateResult[];\ntype ActivateCallback<T> = (item: T) => void;\ntype SelectCallback = (item: string | string[]) => void;\ntype Callback = () => void;\n\ntype DataEventsMap<T> = {\n [key in DataEvents]?: Callback | SelectCallback | CellCallback<T> | CellCallback<T[]> | ActivateCallback<T> | ActivateCallback<T[]> | {(): TemplateResult | TemplateResult[]};\n};\n\nexport interface ICellOptions {\n /**\n * The list of CSS class names to add to the cell.\n */\n class?: string;\n\n /**\n * The list of data attributes to set on the cell.\n */\n data?: { [key: string]: number | string | boolean };\n /**\n * The value of the aria-label to render on the cell.\n */\n ariaLabel?: string;\n}\n\ninterface CellPosition { \n row: number; \n cell: number; \n}\n\n/**\n * A helper class that allows to build a data table in a programmatic way.\n * \n * Usage:\n * \n * const dt = new DataTable(arrayOfItems, { key: 'key' });\n * // or dt.items = arrayOfItems;\n * dt.addEventListener('header', () => { \n * const c1 = dt.header('name', { class: 'name-column', data: {a: b} });\n * const c2 = dt.header('created', { class: 'created-column', data: {a: b} });\n * return [c1, c2];\n * });\n * dt.addEventListener('item', (item) => { \n * const c1 = dt.cell(html`cell template content`, { class: 'a b c', data: {a: b} });\n * const c2 = dt.cell(`cell text content`, { class: 'xyz', data: {key: 'value'} });\n * return [c1, c2];\n * });\n * dt.addEventListener('empty', () => { \n * return html`<p>The table has no records.</p>`;\n * });\n * \n * const template = dt.render();\n * \n * @fires header - An event dispatched when a table header row is being rendered.\n * @fires item - An event dispatched when a table item row is being rendered.\n * @fires empty - An event dispatched when a table has no rows to render.\n * @fires activate - An event dispatched when the user double click on a row.\n * @fires select - An event dispatched when the user selected a table item in a single or multi selection table.\n * @fires render - An event dispatched when the internal state changed and the table must be rendered again.\n */\nexport class DataTable<T> {\n static get styles(): CSSResult {\n return css`\n .data-table {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .data-table-body {\n flex: 1;\n overflow: auto;\n }\n\n .data-table-row {\n height: 44px;\n position: relative;\n\n display: flex;\n align-items: center;\n\n font-family: var(--md-sys-typescale-body-medium-font-family-name);\n font-style: var(--md-sys-typescale-body-medium-font-family-style);\n font-weight: var(--md-sys-typescale-body-medium-font-weight);\n font-size: var(--md-sys-typescale-body-medium-font-size);\n letter-spacing: var(--md-sys-typescale-body-medium-tracking);\n line-height: var(--md-sys-typescale-body-medium-height);\n text-transform: var(--md-sys-typescale-body-medium-text-transform);\n text-decoration: var(--md-sys-typescale-body-medium-text-decoration);\n }\n\n .data-table-row-body {\n height: inherit;\n display: flex;\n align-items: center;\n flex: 1;\n }\n\n .data-table-body .data-table-row:not(.data-table-empty-row):hover::before {\n content: '';\n background-color: var(--md-sys-color-on-surface);\n opacity: var(--md-sys-state-hover-state-layer-opacity);\n position: absolute;\n inset: 0;\n z-index: -1;\n }\n\n .data-table-header {\n font-family: var(--md-sys-typescale-label-large-font-family-name);\n font-style: var(--md-sys-typescale-label-large-font-family-style);\n font-weight: var(--md-sys-typescale-label-large-font-weight);\n font-size: var(--md-sys-typescale-label-large-font-size);\n letter-spacing: var(--md-sys-typescale-label-large-tracking);\n line-height: var(--md-sys-typescale-label-large-height);\n text-transform: var(--md-sys-typescale-label-large-text-transform);\n text-decoration: var(--md-sys-typescale-label-large-text-decoration);\n }\n\n .data-table-cell {\n display: flex;\n align-items: center;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n height: inherit;\n padding: 12px;\n box-sizing: border-box;\n position: relative;\n }\n\n .data-table-row.data-table-empty-row {\n height: auto;\n display: block;\n }\n\n .data-table-row.data-table-empty-row > [role=cell] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n\n .selected {\n background-color: var(--md-sys-color-secondary-container);\n border-radius: 8px;\n }\n\n .data-table-cell:focus-visible::before {\n content: '';\n background-color: var(--md-sys-color-on-surface);\n opacity: var(--md-sys-state-focus-state-layer-opacity);\n position: absolute;\n inset: 0;\n z-index: -1;\n }\n `;\n }\n\n #renderItems?: T[];\n\n get items(): ArrayLike<T> | undefined {\n return this.#renderItems;\n }\n\n set items(value: ArrayLike<T> | undefined) {\n if (!value) {\n this.#renderItems = undefined;\n return;\n }\n const arr = Array.from(value);\n this.#renderItems = arr;\n }\n\n options: IDataTableOptions;\n \n #listeners: DataEventsMap<T> = {};\n\n #getItems: () => ArrayLike<T>;\n\n /**\n * The list of keys that correspond to the `key` set on the options of items that are currently selected.\n * Note, this is a common list for single and multi selection. In a single selection only the first is taken into account.\n */\n selected: string[] = [];\n\n /**\n * Describes currently focused cell.\n * The `row` is the index of the focused row (starting with the header) and the `cell` is the index of the focused cell.\n */\n protected focused?: CellPosition;\n\n constructor(itemsCallback: () => ArrayLike<T>, options: IDataTableOptions = {}) {\n this.options = options;\n this.#getItems = itemsCallback;\n this.dblclickHandler = this.dblclickHandler.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleListScroll = this.handleListScroll.bind(this);\n }\n\n addEventListener(type: 'header', listener: () => TemplateResult[]): void;\n\n addEventListener(type: 'render', listener: () => void): void;\n\n addEventListener(type: 'item', listener: CellCallback<T>): void;\n\n addEventListener(type: 'empty', listener: () => TemplateResult): void;\n\n addEventListener(type: 'activate', listener: ActivateCallback<T>): void;\n\n addEventListener(type: 'select', listener: SelectCallback): void;\n\n addEventListener(type: 'scrollend', listener: Callback): void;\n\n addEventListener(type: DataEvents, listener: SelectCallback | CellCallback<T> | CellCallback<T[]> | ActivateCallback<T> | ActivateCallback<T[]> | {(): TemplateResult | TemplateResult[]}): void {\n this.#listeners[type] = listener;\n }\n\n /**\n * Renders a header cell.\n * \n * @param content The content of the header cell to render.\n * @param options Cell rendering options\n */\n header(content: RenderContent, options: ICellOptions = {}): TemplateResult {\n const data = options.data || {};\n return html`<span \n role=\"columnheader\" \n class=\"data-table-cell data-table-header-cell ${options.class || ''}\"\n aria-label=\"${ifDefined(options.ariaLabel)}\"\n ${dataAttr(data)}\n >${content}</span>`;\n }\n\n /**\n * Renders a body cell.\n * \n * @param content The content of the header cell to render.\n * @param options Cell rendering options\n */\n cell(content: RenderContent, options: ICellOptions = {}): TemplateResult {\n const data = options.data || {};\n return html`\n <span \n role=\"gridcell\" \n class=\"data-table-cell data-table-body-cell ${options.class || ''}\"\n ${dataAttr(data)}\n >${content}</span>\n `;\n }\n\n render(): TemplateResult {\n this.items = this.#getItems();\n const { options } = this;\n const clickListener = options.selection ? this.handleClick : undefined;\n return html`\n <div \n class=\"data-table\" \n role=\"grid\" \n aria-label=\"${ifDefined(options.ariaLabel)}\"\n aria-multiselectable=\"${options.selection === 'multi'}\"\n aria-readonly=\"true\"\n aria-rowcount=\"-1\"\n tabindex=\"0\"\n @focus=\"${this.handleFocus}\"\n @click=\"${clickListener}\" \n @keydown=\"${this.handleKeyDown}\"\n >\n ${this.renderHeader()}\n <ui-divider></ui-divider>\n ${this.renderBody()}\n </div>\n `;\n }\n\n protected rowFromEvent(e: Event): HTMLElement | undefined {\n const path = e.composedPath();\n const row = path.find(current => {\n const element = current as Element;\n if (element.classList && element.classList.contains('data-table-row')) {\n return true;\n }\n return false;\n }) as HTMLElement | undefined;\n if (!row || !row.dataset.key) {\n return undefined;\n }\n return row;\n }\n\n protected tableFromEvent(e: Event): HTMLElement | undefined {\n const path = e.composedPath();\n const row = path.find((current) => {\n const element = current as Element;\n if (element.classList && element.classList.contains('data-table')) {\n return true;\n }\n return false;\n }) as HTMLElement | undefined;\n return row;\n }\n\n protected cellPositionFromEvent(e: Event): CellPosition {\n const result: CellPosition = {\n cell: 0,\n row: 0,\n };\n let row: HTMLElement | undefined;\n let column: HTMLElement | undefined;\n let table: HTMLElement | undefined;\n const path = e.composedPath();\n for (const current of path.values()) {\n const element = current as HTMLElement;\n if (element.classList && element.classList.contains('data-table-row')) {\n row = element;\n } else if (element.classList && element.classList.contains('data-table-cell')) {\n column = element;\n } else if (element.classList && element.classList.contains('data-table')) {\n table = element;\n break;\n }\n }\n if (!table) {\n return result;\n }\n if (row) {\n const rows = Array.from(table.querySelectorAll(`.data-table-row`));\n const rowIndex = rows.indexOf(row);\n if (rowIndex >= 0) {\n result.row = rowIndex;\n }\n if (column) {\n const columns = Array.from(row.querySelectorAll(`.data-table-cell`));\n const cellIndex = columns.indexOf(column);\n if (cellIndex >= 0) {\n result.cell = cellIndex;\n }\n }\n }\n return result;\n }\n\n protected cellRowFromEvent(e: Event): { column: HTMLElement, row: HTMLElement } | undefined {\n let row: HTMLElement | undefined;\n let column: HTMLElement | undefined;\n const path = e.composedPath();\n for (const current of path.values()) {\n const element = current as HTMLElement;\n if (element.classList && element.classList.contains('data-table-row')) {\n row = element;\n break;\n } else if (element.classList && element.classList.contains('data-table-cell')) {\n column = element;\n }\n }\n if (!row || !column) {\n return undefined;\n }\n return { row, column }\n }\n\n protected handleFocus(e: Event): void {\n const target = e.target as HTMLElement;\n if (target.classList.contains('data-table')) {\n // focusing on the table, move the focus to the first cell\n this.focusFirstCell(target);\n }\n }\n\n protected dblclickHandler(e: Event): void {\n const callback = this.#listeners.activate as (item: T) => void;\n if (!callback) {\n return;\n }\n const row = this.rowFromEvent(e)\n if (!row) {\n return;\n }\n const { key } = row.dataset;\n const keyProperty = this.options.key || 'key';\n const item = this.#renderItems?.find(i => (i as unknown as {[key: string]: unknown})[keyProperty] === key);\n if (!item) {\n return;\n }\n callback(item);\n }\n\n protected handleClick(e: Event): void {\n const { selection } = this.options;\n const row = this.rowFromEvent(e)\n if (!row) {\n return;\n }\n if (selection === 'single') {\n this.handleSingleSelection(row.dataset.key as string);\n } else if (selection === 'multi') {\n this.handleMultiSelection(row.dataset.key as string);\n }\n const table = this.tableFromEvent(e) as HTMLElement;\n this.focused = this.cellPositionFromEvent(e);\n this.focusCell(table, this.focused.row, this.focused.cell);\n }\n\n protected handleKeyDown(e: KeyboardEvent): void {\n if (e.defaultPrevented) {\n return;\n }\n if (['Space', 'Enter'].includes(e.code)) {\n this.handlePrimaryAction(e);\n } else if (e.code === 'ArrowRight') {\n this.moveFocusRight(e);\n } else if (e.code === 'ArrowDown') {\n this.moveFocusDown(e);\n } else if (e.code === 'ArrowUp') {\n this.moveFocusUp(e);\n } else if (e.code === 'ArrowLeft') {\n this.moveFocusLeft(e);\n }\n }\n\n protected handleSingleSelection(key: string): void {\n if (this.selected.includes(key)) {\n return;\n }\n this.selected = [key];\n this.dispatchRender();\n this.dispatchSelected(key);\n }\n\n protected handleMultiSelection(key: string): void {\n const { selected } = this;\n if (selected.includes(key)) {\n const index = selected.indexOf(key);\n selected.splice(index, 1);\n } else {\n selected.push(key);\n }\n this.dispatchRender();\n this.dispatchSelected(selected);\n }\n\n protected focusFirstCell(table: HTMLElement): void {\n const cell = table.querySelector('[role=\"columnheader\"]') as HTMLElement | null;\n if (!cell) {\n return;\n }\n cell.setAttribute('tabindex', '0');\n cell.focus();\n table.removeAttribute('tabindex');\n this.focused = { cell: 0, row: 0 };\n }\n\n protected focusCell(table: HTMLElement, rowIndex: number, colIndex: number): boolean {\n const row = table.querySelectorAll('[role=\"row\"]')[rowIndex];\n if (!row) {\n return false;\n }\n const cell = row.querySelectorAll(`.data-table-cell`)[colIndex] as HTMLElement | null;\n if (!cell) {\n return false;\n }\n const current = table.querySelector(`.data-table-cell[tabindex]`);\n cell.setAttribute('tabindex', '0');\n cell.focus();\n if (current) {\n current.removeAttribute('tabindex');\n } \n if (table.hasAttribute('tabindex')) {\n table.removeAttribute('tabindex');\n }\n return true;\n }\n\n protected moveFocusRight(e: Event): void {\n e.preventDefault();\n const table = this.tableFromEvent(e);\n if (!table) {\n return;\n }\n const { focused } = this;\n if (!focused) {\n this.focusFirstCell(table);\n return;\n }\n if (this.focusCell(table, focused.row, focused.cell + 1)) {\n focused.cell += 1;\n }\n }\n\n protected moveFocusLeft(e: Event): void {\n e.preventDefault();\n const table = this.tableFromEvent(e);\n if (!table) {\n return;\n }\n const { focused } = this;\n if (!focused) {\n this.focusFirstCell(table);\n return;\n }\n if (this.focusCell(table, focused.row, focused.cell - 1)) {\n focused.cell -= 1;\n }\n }\n\n protected moveFocusDown(e: Event): void {\n e.preventDefault();\n const table = this.tableFromEvent(e);\n if (!table) {\n return;\n }\n const { focused } = this;\n if (!focused) {\n this.focusFirstCell(table);\n return;\n }\n if (this.focusCell(table, focused.row + 1, focused.cell)) {\n focused.row += 1;\n }\n }\n\n protected moveFocusUp(e: Event): void {\n e.preventDefault();\n const table = this.tableFromEvent(e);\n if (!table) {\n return;\n }\n const { focused } = this;\n if (!focused) {\n this.focusFirstCell(table);\n return;\n }\n if (this.focusCell(table, focused.row - 1, focused.cell)) {\n focused.row -= 1;\n }\n }\n\n protected handlePrimaryAction(e: Event): void {\n e.preventDefault();\n const info = this.cellRowFromEvent(e);\n if (!info) {\n return;\n }\n const { row, column } = info;\n // first check if the cell has an focusable element. If so trigger action on it.\n const focusable = column.querySelector('[tabindex=\"0\"]') as HTMLElement | null;\n if (focusable) {\n focusable.click();\n return;\n }\n const { selection } = this.options;\n if (selection === 'single') {\n this.handleSingleSelection(row.dataset.key as string);\n } else if (selection === 'multi') {\n this.handleMultiSelection(row.dataset.key as string);\n }\n }\n\n protected handleListScroll(e: Event): void {\n const list = e.target as HTMLElement;\n const { scrollTop, offsetHeight, scrollHeight } = list;\n const bottom = scrollTop + offsetHeight >= scrollHeight - 20; // 20 is the offset which qualifies as the end. An arbitrary number.\n if (bottom) {\n this.dispatchScrollEnd();\n }\n }\n\n protected renderHeader(): TemplateResult {\n const cells = this.dispatchHeader();\n return html`\n <div role=\"rowgroup\">\n <div role=\"row\" class=\"data-table-row data-table-header\">\n ${cells}\n </div>\n </div>\n `;\n }\n\n protected renderBody(): TemplateResult {\n const { active = false } = this.options;\n const items = this.#renderItems;\n const contents = !!items && !!items.length ? items.map(item => this.renderItem(item)) : this.renderEmpty();\n const dbListener = active ? this.dblclickHandler : undefined;\n return html`\n <div class=\"data-table-body\" role=\"rowgroup\" @dblclick=\"${dbListener}\" @scroll=\"${{ handleEvent: this.handleListScroll, passive: true }}\">\n ${contents}\n </div>`;\n }\n\n protected renderItem(item: T): TemplateResult {\n const cells = this.dispatchItem(item);\n const { selected, options } = this;\n const typed = item as unknown as Record<string, string>;\n const key = typed[options.key || 'key'];\n let isSelected = false;\n if (options.selection === 'single') {\n const [selectedKey] = selected;\n if (selectedKey === key) {\n isSelected = true;\n }\n } else if (options.selection === 'multi') {\n isSelected = selected.includes(key);\n }\n const classes: ClassInfo = {\n 'data-table-row': true,\n selected: isSelected,\n };\n return html`\n <div role=\"row\" class=\"${classMap(classes)}\" data-key=\"${key}\" aria-selected=\"${isSelected ? 'true' : 'false'}\">\n <div class=\"data-table-row-body\" role=\"presentation\">\n ${cells}\n </div>\n </div>\n `;\n }\n\n protected renderEmpty(): TemplateResult {\n const content = this.dispatchEmpty();\n return html`\n <div role=\"row\" class=\"data-table-row data-table-empty-row\">\n <div role=\"cell\">\n ${content}\n </div>\n </div>\n `;\n }\n\n protected dispatchHeader(): TemplateResult[] | undefined {\n const callback = this.#listeners.header as () => TemplateResult[] | undefined;\n if (!callback) {\n return undefined;\n }\n let content: TemplateResult[] | undefined;\n try {\n content = callback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n return content;\n }\n\n protected dispatchItem(item: T): TemplateResult[] | undefined {\n const callback = this.#listeners.item as CellCallback<T> | undefined;\n if (!callback) {\n return undefined;\n }\n let content: TemplateResult[] | undefined;\n try {\n content = callback(item);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n return content;\n }\n\n protected dispatchEmpty(): TemplateResult | undefined {\n const callback = this.#listeners.empty as () => TemplateResult | undefined;\n if (!callback) {\n return undefined;\n }\n let content: TemplateResult | undefined;\n try {\n content = callback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n return content;\n }\n\n protected dispatchRender(): void {\n const callback = this.#listeners.render as () => void;\n if (!callback) {\n return;\n }\n try {\n callback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n }\n\n protected dispatchSelected(selection: string | string[]): void {\n const callback = this.#listeners.select as SelectCallback;\n if (!callback) {\n return;\n }\n try {\n callback(selection);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n }\n\n protected dispatchScrollEnd(): void {\n const callback = this.#listeners.scrollend as Callback;\n if (!callback) {\n return;\n }\n try {\n callback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@api-client/ui",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "description": "UI for API Client.",
5
5
  "license": "CC-BY-2.0",
6
6
  "main": "dist/index.js",
@@ -1,3 +1,4 @@
1
+ import { EventTypes } from '../../events/EventTypes.js';
1
2
  import { PlatformBindings } from './PlatformBindings.js';
2
3
  // import { EventTypes } from '../../events/EventTypes.js';
3
4
 
@@ -144,7 +145,30 @@ export interface FileWriteOptions extends ReadWriteOptions {
144
145
  */
145
146
  export abstract class FileBindings extends PlatformBindings {
146
147
  async initialize(): Promise<void> {
147
- //
148
+ window.addEventListener(EventTypes.Filesystem.requestSaveFile, this.handleRequestSaveFile.bind(this));
149
+ window.addEventListener(EventTypes.Filesystem.requestOpenFile, this.handleRequestOpenFile.bind(this));
150
+ window.addEventListener(EventTypes.Filesystem.writeFile, this.handleWriteFile.bind(this));
151
+ window.addEventListener(EventTypes.Filesystem.readFile, this.handleReadFile.bind(this));
152
+ }
153
+
154
+ protected handleRequestSaveFile(e: Event): void {
155
+ const event = e as CustomEvent<{ options?: ISaveFileDialogInit, result: Promise<ISaveFileDialogResult> }>;
156
+ event.detail.result = this.saveFileDialog(event.detail.options);
157
+ }
158
+
159
+ protected handleRequestOpenFile(e: Event): void {
160
+ const event = e as CustomEvent<{ options?: IOpenFileDialogInit, result: Promise<IOpenFileDialogResult> }>;
161
+ event.detail.result = this.openFileDialog(event.detail.options);
162
+ }
163
+
164
+ protected handleWriteFile(e: Event): void {
165
+ const event = e as CustomEvent<{ path: string, contents: BufferSource | Blob | string | Buffer, options?: FileWriteOptions, result: Promise<void> }>;
166
+ event.detail.result = this.writeFile(event.detail.path, event.detail.contents, event.detail.options);
167
+ }
168
+
169
+ protected handleReadFile(e: Event): void {
170
+ const event = e as CustomEvent<{ path: string, options?: FileReadOptions, result: Promise<Buffer | ArrayBuffer | string> }>;
171
+ event.detail.result = this.readFile(event.detail.path, event.detail.options);
148
172
  }
149
173
 
150
174
  /**