@api-client/ui 0.0.10 → 0.0.12

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 (176) hide show
  1. package/.eslintrc +16 -1
  2. package/demo/elements/index.html +3 -0
  3. package/demo/elements/store/file-picker.html +15 -0
  4. package/demo/elements/store/file-picker.ts +134 -0
  5. package/demo/elements/store/index.html +19 -0
  6. package/demo/index.html +3 -0
  7. package/demo/layout/index.html +91 -0
  8. package/demo/layout/index.ts +182 -0
  9. package/demo/store/StorePlugin.js +1 -0
  10. package/dist/bindings/base/StoreBindings.d.ts +5 -0
  11. package/dist/bindings/base/StoreBindings.d.ts.map +1 -1
  12. package/dist/bindings/base/StoreBindings.js +15 -1
  13. package/dist/bindings/base/StoreBindings.js.map +1 -1
  14. package/dist/define/store/file-picker.d.ts +9 -0
  15. package/dist/define/store/file-picker.d.ts.map +1 -0
  16. package/dist/define/store/file-picker.js +10 -0
  17. package/dist/define/store/file-picker.js.map +1 -0
  18. package/dist/define/{files → store}/share-file.d.ts +1 -1
  19. package/dist/define/store/share-file.d.ts.map +1 -0
  20. package/dist/define/{files → store}/share-file.js +2 -2
  21. package/dist/define/store/share-file.js.map +1 -0
  22. package/dist/elements/layout/SplitItem.d.ts +1 -9
  23. package/dist/elements/layout/SplitItem.d.ts.map +1 -1
  24. package/dist/elements/layout/SplitItem.js +27 -20
  25. package/dist/elements/layout/SplitItem.js.map +1 -1
  26. package/dist/elements/layout/SplitLayout.d.ts +16 -14
  27. package/dist/elements/layout/SplitLayout.d.ts.map +1 -1
  28. package/dist/elements/layout/SplitLayout.js +47 -42
  29. package/dist/elements/layout/SplitLayout.js.map +1 -1
  30. package/dist/elements/layout/SplitPanel.d.ts +7 -2
  31. package/dist/elements/layout/SplitPanel.d.ts.map +1 -1
  32. package/dist/elements/layout/SplitPanel.js +130 -52
  33. package/dist/elements/layout/SplitPanel.js.map +1 -1
  34. package/dist/elements/layout/SplitView.d.ts.map +1 -1
  35. package/dist/elements/layout/SplitView.js +18 -14
  36. package/dist/elements/layout/SplitView.js.map +1 -1
  37. package/dist/elements/layout/type.d.ts +3 -3
  38. package/dist/elements/layout/type.d.ts.map +1 -1
  39. package/dist/elements/layout/type.js.map +1 -1
  40. package/dist/elements/store/FilePicker.element.d.ts +87 -0
  41. package/dist/elements/store/FilePicker.element.d.ts.map +1 -0
  42. package/dist/elements/store/FilePicker.element.js +263 -0
  43. package/dist/elements/store/FilePicker.element.js.map +1 -0
  44. package/dist/elements/store/FilePicker.styles.d.ts +3 -0
  45. package/dist/elements/store/FilePicker.styles.d.ts.map +1 -0
  46. package/dist/elements/store/FilePicker.styles.js +72 -0
  47. package/dist/elements/store/FilePicker.styles.js.map +1 -0
  48. package/dist/elements/store/FilesLib.d.ts +10 -0
  49. package/dist/elements/store/FilesLib.d.ts.map +1 -0
  50. package/dist/elements/store/FilesLib.js +38 -0
  51. package/dist/elements/store/FilesLib.js.map +1 -0
  52. package/dist/elements/{files/ShareFile.d.ts → store/ShareFile.element.d.ts} +1 -1
  53. package/dist/elements/store/ShareFile.element.d.ts.map +1 -0
  54. package/dist/elements/{files/ShareFile.js → store/ShareFile.element.js} +1 -1
  55. package/dist/elements/store/ShareFile.element.js.map +1 -0
  56. package/dist/elements/store/ShareFile.styles.d.ts.map +1 -0
  57. package/dist/elements/{files → store}/ShareFile.styles.js.map +1 -1
  58. package/dist/events/EventTypes.d.ts +1 -0
  59. package/dist/events/EventTypes.d.ts.map +1 -1
  60. package/dist/events/EventTypes.js +1 -0
  61. package/dist/events/EventTypes.js.map +1 -1
  62. package/dist/events/Events.d.ts +1 -0
  63. package/dist/events/Events.d.ts.map +1 -1
  64. package/dist/events/StoreEvents.d.ts +8 -1
  65. package/dist/events/StoreEvents.d.ts.map +1 -1
  66. package/dist/events/StoreEvents.js +19 -0
  67. package/dist/events/StoreEvents.js.map +1 -1
  68. package/dist/pages/ApplicationScreen.d.ts +1 -1
  69. package/dist/pages/ApplicationScreen.d.ts.map +1 -1
  70. package/dist/pages/ApplicationScreen.js +4 -2
  71. package/dist/pages/ApplicationScreen.js.map +1 -1
  72. package/dist/pages/api-client/ApiClient.screen.d.ts +0 -6
  73. package/dist/pages/api-client/ApiClient.screen.d.ts.map +1 -1
  74. package/dist/pages/api-client/ApiClient.screen.js +16 -29
  75. package/dist/pages/api-client/ApiClient.screen.js.map +1 -1
  76. package/dist/pages/api-client/Authenticate.screen.d.ts +1 -1
  77. package/dist/pages/api-client/Authenticate.screen.d.ts.map +1 -1
  78. package/dist/pages/api-client/Authenticate.screen.js +2 -2
  79. package/dist/pages/api-client/Authenticate.screen.js.map +1 -1
  80. package/dist/pages/api-client/pages/Files.page.d.ts +6 -35
  81. package/dist/pages/api-client/pages/Files.page.d.ts.map +1 -1
  82. package/dist/pages/api-client/pages/Files.page.js +32 -141
  83. package/dist/pages/api-client/pages/Files.page.js.map +1 -1
  84. package/dist/pages/api-client/pages/Shared.page.d.ts +1 -5
  85. package/dist/pages/api-client/pages/Shared.page.d.ts.map +1 -1
  86. package/dist/pages/api-client/pages/Shared.page.js +1 -40
  87. package/dist/pages/api-client/pages/Shared.page.js.map +1 -1
  88. package/dist/pages/demo/DemoPage.d.ts +7 -0
  89. package/dist/pages/demo/DemoPage.d.ts.map +1 -1
  90. package/dist/pages/demo/DemoPage.js +14 -0
  91. package/dist/pages/demo/DemoPage.js.map +1 -1
  92. package/dist/pages/http-project/HttpClientCommands.d.ts.map +1 -1
  93. package/dist/pages/http-project/HttpClientCommands.js +28 -12
  94. package/dist/pages/http-project/HttpClientCommands.js.map +1 -1
  95. package/dist/store/FileSystem.d.ts +90 -0
  96. package/dist/store/FileSystem.d.ts.map +1 -0
  97. package/dist/store/FileSystem.js +260 -0
  98. package/dist/store/FileSystem.js.map +1 -0
  99. package/dist/styles/global-styles.d.ts.map +1 -1
  100. package/dist/styles/global-styles.js +7 -0
  101. package/dist/styles/global-styles.js.map +1 -1
  102. package/dist/ui/icons/Icons.d.ts +2 -1
  103. package/dist/ui/icons/Icons.d.ts.map +1 -1
  104. package/dist/ui/icons/Icons.js +1 -0
  105. package/dist/ui/icons/Icons.js.map +1 -1
  106. package/dist/ui/list/UiDropdownList.d.ts +9 -1
  107. package/dist/ui/list/UiDropdownList.d.ts.map +1 -1
  108. package/dist/ui/list/UiDropdownList.js +39 -17
  109. package/dist/ui/list/UiDropdownList.js.map +1 -1
  110. package/dist/ui/list/UiList.d.ts +6 -1
  111. package/dist/ui/list/UiList.d.ts.map +1 -1
  112. package/dist/ui/list/UiList.js +24 -9
  113. package/dist/ui/list/UiList.js.map +1 -1
  114. package/dist/ui/table/DataTable.d.ts +4 -0
  115. package/dist/ui/table/DataTable.d.ts.map +1 -1
  116. package/dist/ui/table/DataTable.js +23 -1
  117. package/dist/ui/table/DataTable.js.map +1 -1
  118. package/package.json +2 -1
  119. package/src/bindings/base/StoreBindings.ts +16 -1
  120. package/src/define/store/file-picker.ts +12 -0
  121. package/src/define/{files → store}/share-file.ts +2 -2
  122. package/src/elements/layout/SplitItem.ts +29 -21
  123. package/src/elements/layout/SplitLayout.ts +53 -43
  124. package/src/elements/layout/SplitPanel.ts +140 -57
  125. package/src/elements/layout/SplitView.ts +18 -15
  126. package/src/elements/layout/type.ts +3 -4
  127. package/src/elements/store/FilePicker.element.ts +297 -0
  128. package/src/elements/store/FilePicker.styles.ts +72 -0
  129. package/src/elements/store/FilesLib.ts +32 -0
  130. package/src/events/EventTypes.ts +1 -0
  131. package/src/events/StoreEvents.ts +21 -1
  132. package/src/pages/ApplicationScreen.ts +5 -3
  133. package/src/pages/api-client/ApiClient.screen.ts +16 -31
  134. package/src/pages/api-client/Authenticate.screen.ts +2 -2
  135. package/src/pages/api-client/pages/Files.page.ts +37 -164
  136. package/src/pages/api-client/pages/Shared.page.ts +2 -40
  137. package/src/pages/demo/DemoPage.ts +17 -0
  138. package/src/pages/http-project/HttpClientCommands.ts +28 -12
  139. package/src/store/FileSystem.ts +325 -0
  140. package/src/styles/global-styles.ts +7 -0
  141. package/src/ui/icons/Icons.ts +2 -1
  142. package/src/ui/list/UiDropdownList.ts +44 -17
  143. package/src/ui/list/UiList.ts +26 -10
  144. package/src/ui/table/DataTable.ts +29 -3
  145. package/test/elements/layout/SplitItem.test.ts +76 -75
  146. package/test/elements/layout/SplitLayoutManager.test.ts +70 -69
  147. package/test/elements/layout/SplitPanel.test.ts +10 -7
  148. package/test/elements/store/FilePicker.test.ts +241 -0
  149. package/test/env.js +3 -0
  150. package/test/helpers/StoreHelper.ts +390 -0
  151. package/tsconfig.eslint.json +10 -0
  152. package/web-test-runner.config.mjs +51 -2
  153. package/dist/define/files/share-file.d.ts.map +0 -1
  154. package/dist/define/files/share-file.js.map +0 -1
  155. package/dist/define/layout/layout-panel.d.ts +0 -7
  156. package/dist/define/layout/layout-panel.d.ts.map +0 -1
  157. package/dist/define/layout/layout-panel.js +0 -3
  158. package/dist/define/layout/layout-panel.js.map +0 -1
  159. package/dist/elements/files/ShareFile.d.ts.map +0 -1
  160. package/dist/elements/files/ShareFile.js.map +0 -1
  161. package/dist/elements/files/ShareFile.styles.d.ts.map +0 -1
  162. package/dist/elements/layout/LayoutManager.d.ts +0 -327
  163. package/dist/elements/layout/LayoutManager.d.ts.map +0 -1
  164. package/dist/elements/layout/LayoutManager.js +0 -747
  165. package/dist/elements/layout/LayoutManager.js.map +0 -1
  166. package/dist/elements/layout/LayoutPanelElement.d.ts +0 -62
  167. package/dist/elements/layout/LayoutPanelElement.d.ts.map +0 -1
  168. package/dist/elements/layout/LayoutPanelElement.js +0 -628
  169. package/dist/elements/layout/LayoutPanelElement.js.map +0 -1
  170. package/src/define/layout/layout-panel.ts +0 -9
  171. package/src/elements/layout/LayoutManager.ts +0 -930
  172. package/src/elements/layout/LayoutPanelElement.ts +0 -651
  173. /package/dist/elements/{files → store}/ShareFile.styles.d.ts +0 -0
  174. /package/dist/elements/{files → store}/ShareFile.styles.js +0 -0
  175. /package/src/elements/{files/ShareFile.ts → store/ShareFile.element.ts} +0 -0
  176. /package/src/elements/{files → store}/ShareFile.styles.ts +0 -0
@@ -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":"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"}
@@ -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":"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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' | '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.10",
3
+ "version": "0.0.12",
4
4
  "description": "UI for API Client.",
5
5
  "license": "CC-BY-2.0",
6
6
  "main": "dist/index.js",
@@ -77,6 +77,7 @@
77
77
  "eslint": "^8.11.0",
78
78
  "eslint-config-prettier": "^8.3.0",
79
79
  "eslint-import-resolver-typescript": "^3.5.3",
80
+ "eslint-plugin-deprecation": "^1.3.3",
80
81
  "husky": "^8.0.1",
81
82
  "koa-proxies": "^0.12.3",
82
83
  "lint-staged": "^13.0.1",
@@ -129,11 +129,17 @@ export abstract class StoreBindings extends PlatformBindings {
129
129
 
130
130
  certificatesChannel = new BroadcastChannel(StoreBroadcast.certificates);
131
131
 
132
+ initialized = false;
133
+
132
134
  async initializeStore(): Promise<void> {
133
135
  // ...
134
136
  }
135
137
 
136
138
  async initialize(): Promise<void> {
139
+ if (this.initialized) {
140
+ return;
141
+ }
142
+ this.initialized = true;
137
143
  const target = document.body;
138
144
 
139
145
  window.addEventListener(EventTypes.Store.initEnvironment, this.handleInitializeEnvironment.bind(this));
@@ -156,6 +162,7 @@ export abstract class StoreBindings extends PlatformBindings {
156
162
  window.addEventListener(EventTypes.Store.File.delete, this.handleFileDelete.bind(this) as EventListener);
157
163
  window.addEventListener(EventTypes.Store.File.patchUsers, this.handleFilePatchUser.bind(this) as EventListener);
158
164
  window.addEventListener(EventTypes.Store.File.listUsers, this.handleListFileUsers.bind(this) as EventListener);
165
+ window.addEventListener(EventTypes.Store.File.breadcrumbs, this.handleFileBreadcrumbs.bind(this) as EventListener);
159
166
 
160
167
  // User
161
168
  window.addEventListener(EventTypes.Store.User.me, this.handlerMe.bind(this));
@@ -372,6 +379,11 @@ export abstract class StoreBindings extends PlatformBindings {
372
379
  event.detail.result = this.getStore().sdk.file.listUsers(this.space, event.detail.key);
373
380
  }
374
381
 
382
+ protected handleFileBreadcrumbs(event: CustomEvent<{ key: string, result: Promise<ContextListResult<FileBreadcrumb>> }>): void {
383
+ event.preventDefault();
384
+ event.detail.result = this.files.breadcrumbs(event.detail.key)
385
+ // this.getStore().sdk.file.breadcrumbs(this.space, event.detail.key);
386
+ }
375
387
 
376
388
  protected handlerMe(input: Event): void {
377
389
  const e = input as CustomEvent<{ result: Promise<IUser> }>;
@@ -822,10 +834,13 @@ export abstract class StoreBindings extends PlatformBindings {
822
834
  protected storeEventHandler(e: MessageEvent): void {
823
835
  const event = JSON.parse(e.data) as BroadcastEvent | BackendErrorEvent;
824
836
  if (event.type === 'error') {
825
- // TODO: Report an error somehow
826
837
  throw new Error(event.cause);
827
838
  }
828
839
  if (event.space && event.space !== this.space) {
840
+ // we allow files here to support shared files.
841
+ if (event.path === RouteBuilder.files()) {
842
+ this.filesChannel.postMessage(event);
843
+ }
829
844
  return;
830
845
  }
831
846
  if (event.path === RouteBuilder.spaces()) {
@@ -0,0 +1,12 @@
1
+ import { customElement } from "lit/decorators.js";
2
+ import Element from "../../elements/store/FilePicker.element.js";
3
+
4
+ @customElement('file-picker')
5
+ export class FilePickerElement extends Element {
6
+ }
7
+
8
+ declare global {
9
+ interface HTMLElementTagNameMap {
10
+ 'file-picker': Element;
11
+ }
12
+ }
@@ -1,6 +1,6 @@
1
1
  import { customElement } from 'lit/decorators.js';
2
- import Element from "../../elements/files/ShareFile.js";
3
- import styles from "../../elements/files/ShareFile.styles.js";
2
+ import Element from "../../elements/store/ShareFile.element.js";
3
+ import styles from "../../elements/store/ShareFile.styles.js";
4
4
  import dialogStyles from '../../ui/dialog/UiDialog.styles.js';
5
5
 
6
6
  @customElement('share-file')
@@ -179,30 +179,38 @@ export class SplitItem implements ISplitItem {
179
179
  return result;
180
180
  }
181
181
 
182
- /**
183
- * @returns The parent of the item. Returns undefined when the item was removed from layout.
184
- */
185
- getParent(): SplitPanel | undefined {
186
- return this.manager.getParent(this.key);
187
- }
182
+ // /**
183
+ // * @returns The parent of the item. Returns undefined when the item was removed from layout.
184
+ // * @deprecated Use `getParents()` instead.
185
+ // */
186
+ // getParent(): SplitPanel | undefined {
187
+ // return this.manager.getParent(this.key);
188
+ // }
188
189
 
189
190
  /**
190
- * Removes self from the layout
191
+ * @returns The parent of the item. Returns undefined when the item was removed from layout.
191
192
  */
192
- remove(): void {
193
- this.manager.removeItem(this.key);
193
+ getParents(): SplitPanel[] {
194
+ return this.manager.getParents(this.key);
194
195
  }
195
196
 
196
- /**
197
- * Sets the item active in the parent layout.
198
- */
199
- setSelected(): void {
200
- const parent = this.getParent();
201
- if (parent) {
202
- parent.selected = this.key;
203
- this.notifyChange();
204
- }
205
- }
197
+ // /**
198
+ // * Removes self from the layout. This removes the item from all panels.
199
+ // */
200
+ // remove(): void {
201
+ // this.manager.removeItem(this.key);
202
+ // }
203
+
204
+ // /**
205
+ // * Sets the item active in the parent layout.
206
+ // */
207
+ // setSelected(): void {
208
+ // const parent = this.getParent();
209
+ // if (parent) {
210
+ // parent.selected = this.key;
211
+ // this.notifyChange();
212
+ // }
213
+ // }
206
214
 
207
215
  /**
208
216
  * Updates the label and triggers side effects like layout and view update.
@@ -222,8 +230,8 @@ export class SplitItem implements ISplitItem {
222
230
  }
223
231
 
224
232
  updateView(): void {
225
- const panel = this.getParent();
226
- panel?.updateView();
233
+ const panels = this.getParents();
234
+ panels.forEach(panel => panel.updateView());
227
235
  }
228
236
 
229
237
  notifyChange(): void {
@@ -3,7 +3,7 @@ import { TemplateResult } from "lit";
3
3
  import { ISplitItem, SplitItem } from "./SplitItem.js";
4
4
  import { ISplitPanel, SplitPanel } from "./SplitPanel.js";
5
5
  import SplitView from "./SplitView.js";
6
- import { IPanelObject, LayoutType, SplitCloseDirection, SplitDirection, SplitItemRenderCallback, SplitLayoutInit, SplitPanelAddOptions } from "./type.js";
6
+ import { IPanelObject, LayoutType, SplitDirection, SplitItemRenderCallback, SplitLayoutAddOptions, SplitLayoutInit, SplitPanelAddOptions } from "./type.js";
7
7
 
8
8
  interface LayoutObject {
9
9
  type: LayoutType;
@@ -33,6 +33,11 @@ export interface ISplitLayout {
33
33
  active?: string;
34
34
  }
35
35
 
36
+ export interface ITabCloseDetail {
37
+ tab: string;
38
+ panel: string;
39
+ }
40
+
36
41
  /**
37
42
  * Split layout manager creates a view where the application can put "items" into
38
43
  * and render them inside "panels". The application can create as many panels as needed.
@@ -109,7 +114,7 @@ export class SplitLayout extends EventTarget {
109
114
  return value as SplitPanel;
110
115
  }
111
116
  const item = value as SplitItem;
112
- return this.getParent(item.key);
117
+ return this.getParents(item.key)[0];
113
118
  }
114
119
 
115
120
  /**
@@ -316,22 +321,25 @@ export class SplitLayout extends EventTarget {
316
321
  }
317
322
 
318
323
  /**
319
- * Finds a parent for an item.
320
- * @param panelKey The key of the item (panel or panel's item) to find a parent for.
321
- * @returns The parent panel or `undefined` when the item was removed or the panel has no parents.
324
+ * Finds parents an item or another panel is anchored to.
325
+ * An item can have multiple parents. A panel can only have a single parent.
326
+ *
327
+ * @param itemOrPanelKey The key of the panel or an item.
328
+ * @returns THe list of panels the item is added. It can only return up to 1 result when looking for a panel's parent.
322
329
  */
323
- getParent(panelKey: string): SplitPanel | undefined {
330
+ getParents(itemOrPanelKey: string): SplitPanel[] {
331
+ const result: SplitPanel[] = [];
324
332
  for (const { type, value } of this.definitions.values()) {
325
333
  if (type !== LayoutType.panel) {
326
334
  continue;
327
335
  }
328
336
  const panel = value as SplitPanel;
329
- const result = panel.items.some(i => i.key === panelKey);
330
- if (result) {
331
- return panel;
337
+ const has = panel.items.some(i => i.key === itemOrPanelKey);
338
+ if (has) {
339
+ result.push(panel);
332
340
  }
333
341
  }
334
- return undefined;
342
+ return result;
335
343
  }
336
344
 
337
345
  /**
@@ -396,12 +404,15 @@ export class SplitLayout extends EventTarget {
396
404
  * Do not call this method from the outside of the layout manager logic.
397
405
  * It is a way to communicate a tab was closed.
398
406
  */
399
- notifyTabClose(itemKey: string): void {
400
- this.dispatchEvent(new CustomEvent('closetab', {
407
+ notifyTabClose(itemKey: string, panel: string): void {
408
+ this.dispatchEvent(new CustomEvent<ITabCloseDetail>('closetab', {
401
409
  bubbles: true,
402
410
  cancelable: true,
403
411
  composed: true,
404
- detail: itemKey,
412
+ detail: {
413
+ tab: itemKey,
414
+ panel,
415
+ },
405
416
  }));
406
417
  }
407
418
 
@@ -431,10 +442,8 @@ export class SplitLayout extends EventTarget {
431
442
  const before = item.label;
432
443
  this.dispatchNameItem(item);
433
444
  if (before !== item.label) {
434
- const panel = item.getParent();
435
- if (panel) {
436
- this.updateView(panel.key);
437
- }
445
+ const panels = this.getParents(item.key);
446
+ panels.forEach(panel => this.updateView(panel.key));
438
447
  }
439
448
  }
440
449
 
@@ -450,8 +459,8 @@ export class SplitLayout extends EventTarget {
450
459
  const before = item.label;
451
460
  this.dispatchNameItem(item);
452
461
  if (before !== item.label) {
453
- const panel = item.getParent() as SplitPanel;
454
- updatePanels.add(panel);
462
+ const panels = this.getParents(item.key);
463
+ panels.forEach(panel => updatePanels.add(panel));
455
464
  }
456
465
  }
457
466
 
@@ -532,7 +541,9 @@ export class SplitLayout extends EventTarget {
532
541
  }
533
542
 
534
543
  /**
535
- * Removes an item from layout.
544
+ * Removes an item from the layout. This means removing an item from all panels.
545
+ * If you want to remove an item from a specific panel then find the panel first and then call `removeItem()`.
546
+ *
536
547
  * @param key The key of the item to remove.
537
548
  */
538
549
  removeItem(key: string): void {
@@ -540,27 +551,26 @@ export class SplitLayout extends EventTarget {
540
551
  if (!item) {
541
552
  return;
542
553
  }
543
- const panel = item.getParent();
544
- if (panel) {
545
- panel.removeItem(key);
546
- }
554
+ const parents = this.getParents(key);
555
+ parents.forEach(parent => parent.removeChildItem(item));
547
556
  }
548
557
 
549
- /**
550
- * Removes other items relative to the `key` item.
551
- * @param key The key of the item to perform a relative operation from.
552
- * @param dir The direction to which close other items. Default to both directions leaving only the `key` item
553
- */
554
- removeRelative(key: string, dir?: SplitCloseDirection): void {
555
- const item = this.findItem(key);
556
- if (!item) {
557
- return;
558
- }
559
- const panel = item.getParent();
560
- if (panel) {
561
- panel.removeRelative(key, dir);
562
- }
563
- }
558
+ // /**
559
+ // * Removes other items relative to the `key` item.
560
+ // * @param key The key of the item to perform a relative operation from.
561
+ // * @param dir The direction to which close other items. Default to both directions leaving only the `key` item
562
+ // * @deprecated this function does not work as intended. Find the parent panel first and then call the `removeRelative()`.
563
+ // */
564
+ // removeRelative(key: string, dir?: SplitCloseDirection): void {
565
+ // const item = this.findItem(key);
566
+ // if (!item) {
567
+ // return;
568
+ // }
569
+ // const panel = item.getParent();
570
+ // if (panel) {
571
+ // panel.removeRelative(key, dir);
572
+ // }
573
+ // }
564
574
 
565
575
  /**
566
576
  * Moves a tab between panels or inside a panel
@@ -570,14 +580,14 @@ export class SplitLayout extends EventTarget {
570
580
  * @param itemKey The key of the item
571
581
  * @param toIndex The index to which add the item. Default as the last.
572
582
  */
573
- moveItem(fromPanelKey: string, toPanelKey: string, itemKey: string, toIndex?: number): void {
583
+ moveItem(fromPanelKey: string, toPanelKey: string, itemKey: string, opts?: SplitLayoutAddOptions): void {
574
584
  const singlePanel = fromPanelKey === toPanelKey;
575
585
  const from = this.findPanel(fromPanelKey);
576
586
  if (!from) {
577
587
  throw new Error(`Source layout panel not found.`);
578
588
  }
579
589
  if (singlePanel) {
580
- from.moveItem(itemKey, toIndex);
590
+ from.moveItem(itemKey, opts);
581
591
  } else {
582
592
  const to = this.findPanel(toPanelKey);
583
593
  if (!to) {
@@ -587,7 +597,7 @@ export class SplitLayout extends EventTarget {
587
597
  if (!removed) {
588
598
  throw new Error(`Item not found.`);
589
599
  }
590
- to.addItem(removed, { index: toIndex });
600
+ to.addItem(removed, opts);
591
601
  }
592
602
  this.notifyChange();
593
603
  }
@@ -686,7 +696,7 @@ export class SplitLayout extends EventTarget {
686
696
  panel = activePanel;
687
697
  } else {
688
698
  // any panel that has the item
689
- panel = this.getParent(itemKey);
699
+ [panel] = this.getParents(itemKey);
690
700
  }
691
701
  if (!panel) {
692
702
  return;