igniteui-grid-lite 1.0.0-alpha.9

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 (207) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +17 -0
  3. package/components/cell.d.ts +35 -0
  4. package/components/cell.js +47 -0
  5. package/components/cell.js.map +1 -0
  6. package/components/filter-row.d.ts +47 -0
  7. package/components/filter-row.js +313 -0
  8. package/components/filter-row.js.map +1 -0
  9. package/components/grid.d.ts +226 -0
  10. package/components/grid.js +227 -0
  11. package/components/grid.js.map +1 -0
  12. package/components/header-row.d.ts +23 -0
  13. package/components/header-row.js +72 -0
  14. package/components/header-row.js.map +1 -0
  15. package/components/header.d.ts +23 -0
  16. package/components/header.js +137 -0
  17. package/components/header.js.map +1 -0
  18. package/components/row.d.ts +24 -0
  19. package/components/row.js +64 -0
  20. package/components/row.js.map +1 -0
  21. package/components/virtualizer.d.ts +12 -0
  22. package/components/virtualizer.js +21 -0
  23. package/components/virtualizer.js.map +1 -0
  24. package/controllers/data-operation.d.ts +17 -0
  25. package/controllers/data-operation.js +36 -0
  26. package/controllers/data-operation.js.map +1 -0
  27. package/controllers/dom.d.ts +19 -0
  28. package/controllers/dom.js +54 -0
  29. package/controllers/dom.js.map +1 -0
  30. package/controllers/filter.d.ts +21 -0
  31. package/controllers/filter.js +105 -0
  32. package/controllers/filter.js.map +1 -0
  33. package/controllers/navigation.d.ts +27 -0
  34. package/controllers/navigation.js +98 -0
  35. package/controllers/navigation.js.map +1 -0
  36. package/controllers/resize.d.ts +27 -0
  37. package/controllers/resize.js +52 -0
  38. package/controllers/resize.js.map +1 -0
  39. package/controllers/sort.d.ts +15 -0
  40. package/controllers/sort.js +94 -0
  41. package/controllers/sort.js.map +1 -0
  42. package/controllers/state.d.ts +24 -0
  43. package/controllers/state.js +37 -0
  44. package/controllers/state.js.map +1 -0
  45. package/custom-elements.json +4166 -0
  46. package/define.d.ts +2 -0
  47. package/define.js +4 -0
  48. package/define.js.map +1 -0
  49. package/docs/.nojekyll +1 -0
  50. package/docs/assets/hierarchy.js +1 -0
  51. package/docs/assets/highlight.css +71 -0
  52. package/docs/assets/icons.js +18 -0
  53. package/docs/assets/icons.svg +1 -0
  54. package/docs/assets/main.js +60 -0
  55. package/docs/assets/navigation.js +1 -0
  56. package/docs/assets/search.js +1 -0
  57. package/docs/assets/style.css +1633 -0
  58. package/docs/classes/IgcGridLite.html +74 -0
  59. package/docs/hierarchy.html +1 -0
  60. package/docs/index.html +11 -0
  61. package/docs/interfaces/BaseColumnConfiguration.html +28 -0
  62. package/docs/interfaces/BaseColumnSortConfiguration.html +6 -0
  63. package/docs/interfaces/BaseFilterExpression.html +15 -0
  64. package/docs/interfaces/BaseIgcCellContext.html +10 -0
  65. package/docs/interfaces/BaseSortExpression.html +12 -0
  66. package/docs/interfaces/ColumnFilterConfiguration.html +4 -0
  67. package/docs/interfaces/DataPipelineConfiguration.html +6 -0
  68. package/docs/interfaces/GridSortConfiguration.html +6 -0
  69. package/docs/interfaces/IgcFilteredEvent.html +6 -0
  70. package/docs/interfaces/IgcFilteringEvent.html +12 -0
  71. package/docs/interfaces/IgcGridLiteEventMap.html +17 -0
  72. package/docs/interfaces/IgcHeaderContext.html +6 -0
  73. package/docs/modules.html +1 -0
  74. package/docs/types/BasePropertyType.html +2 -0
  75. package/docs/types/BaseSortComparer.html +2 -0
  76. package/docs/types/ColumnConfiguration.html +2 -0
  77. package/docs/types/ColumnSortConfiguration.html +2 -0
  78. package/docs/types/DataPipelineHook.html +2 -0
  79. package/docs/types/DataPipelineParams.html +8 -0
  80. package/docs/types/DataType.html +2 -0
  81. package/docs/types/FilterCriteria.html +6 -0
  82. package/docs/types/FilterExpression.html +2 -0
  83. package/docs/types/IgcCellContext.html +2 -0
  84. package/docs/types/Keys.html +2 -0
  85. package/docs/types/PropertyType.html +2 -0
  86. package/docs/types/SortComparer.html +2 -0
  87. package/docs/types/SortExpression.html +2 -0
  88. package/docs/types/SortState.html +2 -0
  89. package/docs/types/SortingDirection.html +3 -0
  90. package/index.d.ts +8 -0
  91. package/index.js +5 -0
  92. package/index.js.map +1 -0
  93. package/internal/constants.d.ts +8 -0
  94. package/internal/constants.js +19 -0
  95. package/internal/constants.js.map +1 -0
  96. package/internal/icon-registry.d.ts +1 -0
  97. package/internal/icon-registry.js +29 -0
  98. package/internal/icon-registry.js.map +1 -0
  99. package/internal/is-defined.d.ts +1 -0
  100. package/internal/is-defined.js +4 -0
  101. package/internal/is-defined.js.map +1 -0
  102. package/internal/mixins/event-emitter.d.ts +7 -0
  103. package/internal/mixins/event-emitter.js +18 -0
  104. package/internal/mixins/event-emitter.js.map +1 -0
  105. package/internal/normalize-case.d.ts +1 -0
  106. package/internal/normalize-case.js +4 -0
  107. package/internal/normalize-case.js.map +1 -0
  108. package/internal/part-map.d.ts +4 -0
  109. package/internal/part-map.js +6 -0
  110. package/internal/part-map.js.map +1 -0
  111. package/internal/register.d.ts +6 -0
  112. package/internal/register.js +9 -0
  113. package/internal/register.js.map +1 -0
  114. package/internal/tags.d.ts +7 -0
  115. package/internal/tags.js +8 -0
  116. package/internal/tags.js.map +1 -0
  117. package/internal/theming.d.ts +34 -0
  118. package/internal/theming.js +123 -0
  119. package/internal/theming.js.map +1 -0
  120. package/internal/types.d.ts +198 -0
  121. package/internal/types.js +2 -0
  122. package/internal/types.js.map +1 -0
  123. package/internal/utils.d.ts +6 -0
  124. package/internal/utils.js +34 -0
  125. package/internal/utils.js.map +1 -0
  126. package/internal/watch.d.ts +5 -0
  127. package/internal/watch.js +19 -0
  128. package/internal/watch.js.map +1 -0
  129. package/operations/base.d.ts +6 -0
  130. package/operations/base.js +9 -0
  131. package/operations/base.js.map +1 -0
  132. package/operations/filter/operands/boolean.d.ts +3 -0
  133. package/operations/filter/operands/boolean.js +34 -0
  134. package/operations/filter/operands/boolean.js.map +1 -0
  135. package/operations/filter/operands/number.d.ts +3 -0
  136. package/operations/filter/operands/number.js +52 -0
  137. package/operations/filter/operands/number.js.map +1 -0
  138. package/operations/filter/operands/string.d.ts +3 -0
  139. package/operations/filter/operands/string.js +53 -0
  140. package/operations/filter/operands/string.js.map +1 -0
  141. package/operations/filter/state.d.ts +16 -0
  142. package/operations/filter/state.js +41 -0
  143. package/operations/filter/state.js.map +1 -0
  144. package/operations/filter/tree.d.ts +17 -0
  145. package/operations/filter/tree.js +46 -0
  146. package/operations/filter/tree.js.map +1 -0
  147. package/operations/filter/types.d.ts +57 -0
  148. package/operations/filter/types.js +2 -0
  149. package/operations/filter/types.js.map +1 -0
  150. package/operations/filter.d.ts +8 -0
  151. package/operations/filter.js +22 -0
  152. package/operations/filter.js.map +1 -0
  153. package/operations/sort/types.d.ts +49 -0
  154. package/operations/sort/types.js +2 -0
  155. package/operations/sort/types.js.map +1 -0
  156. package/operations/sort.d.ts +8 -0
  157. package/operations/sort.js +37 -0
  158. package/operations/sort.js.map +1 -0
  159. package/package.json +41 -0
  160. package/styles/_common.css.d.ts +1 -0
  161. package/styles/_common.css.js +3 -0
  162. package/styles/_common.css.js.map +1 -0
  163. package/styles/body-cell/body-cell.css.d.ts +1 -0
  164. package/styles/body-cell/body-cell.css.js +3 -0
  165. package/styles/body-cell/body-cell.css.js.map +1 -0
  166. package/styles/body-row/body-row.css.d.ts +1 -0
  167. package/styles/body-row/body-row.css.js +3 -0
  168. package/styles/body-row/body-row.css.js.map +1 -0
  169. package/styles/filter-row/filter-row.css.d.ts +1 -0
  170. package/styles/filter-row/filter-row.css.js +3 -0
  171. package/styles/filter-row/filter-row.css.js.map +1 -0
  172. package/styles/grid/themes/dark/grid.bootstrap.css.d.ts +1 -0
  173. package/styles/grid/themes/dark/grid.bootstrap.css.js +3 -0
  174. package/styles/grid/themes/dark/grid.bootstrap.css.js.map +1 -0
  175. package/styles/grid/themes/dark/grid.fluent.css.d.ts +1 -0
  176. package/styles/grid/themes/dark/grid.fluent.css.js +3 -0
  177. package/styles/grid/themes/dark/grid.fluent.css.js.map +1 -0
  178. package/styles/grid/themes/dark/grid.indigo.css.d.ts +1 -0
  179. package/styles/grid/themes/dark/grid.indigo.css.js +3 -0
  180. package/styles/grid/themes/dark/grid.indigo.css.js.map +1 -0
  181. package/styles/grid/themes/dark/grid.material.css.d.ts +1 -0
  182. package/styles/grid/themes/dark/grid.material.css.js +3 -0
  183. package/styles/grid/themes/dark/grid.material.css.js.map +1 -0
  184. package/styles/grid/themes/grid.base.css.d.ts +1 -0
  185. package/styles/grid/themes/grid.base.css.js +3 -0
  186. package/styles/grid/themes/grid.base.css.js.map +1 -0
  187. package/styles/grid/themes/light/grid.bootstrap.css.d.ts +1 -0
  188. package/styles/grid/themes/light/grid.bootstrap.css.js +3 -0
  189. package/styles/grid/themes/light/grid.bootstrap.css.js.map +1 -0
  190. package/styles/grid/themes/light/grid.fluent.css.d.ts +1 -0
  191. package/styles/grid/themes/light/grid.fluent.css.js +3 -0
  192. package/styles/grid/themes/light/grid.fluent.css.js.map +1 -0
  193. package/styles/grid/themes/light/grid.indigo.css.d.ts +1 -0
  194. package/styles/grid/themes/light/grid.indigo.css.js +3 -0
  195. package/styles/grid/themes/light/grid.indigo.css.js.map +1 -0
  196. package/styles/grid/themes/light/grid.material.css.d.ts +1 -0
  197. package/styles/grid/themes/light/grid.material.css.js +3 -0
  198. package/styles/grid/themes/light/grid.material.css.js.map +1 -0
  199. package/styles/grid/themes/themes.d.ts +2 -0
  200. package/styles/grid/themes/themes.js +39 -0
  201. package/styles/grid/themes/themes.js.map +1 -0
  202. package/styles/header-cell/header-cell.css.d.ts +1 -0
  203. package/styles/header-cell/header-cell.css.js +3 -0
  204. package/styles/header-cell/header-cell.css.js.map +1 -0
  205. package/styles/header-row/header-row.base.css.d.ts +1 -0
  206. package/styles/header-row/header-row.base.css.js +3 -0
  207. package/styles/header-row/header-row.base.css.js.map +1 -0
@@ -0,0 +1,137 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { consume } from '@lit/context';
8
+ import { IgcIconComponent } from 'igniteui-webcomponents';
9
+ import { html, LitElement, nothing } from 'lit';
10
+ import { property } from 'lit/decorators.js';
11
+ import { gridStateContext } from '../controllers/state.js';
12
+ import { MIN_COL_RESIZE_WIDTH, SORT_ICON_ASCENDING, SORT_ICON_DESCENDING, } from '../internal/constants.js';
13
+ import { partNameMap } from '../internal/part-map.js';
14
+ import { registerComponent } from '../internal/register.js';
15
+ import { GRID_HEADER_TAG } from '../internal/tags.js';
16
+ import { styles } from '../styles/header-cell/header-cell.css.js';
17
+ export default class IgcGridLiteHeader extends LitElement {
18
+ static get tagName() {
19
+ return GRID_HEADER_TAG;
20
+ }
21
+ static { this.styles = styles; }
22
+ static register() {
23
+ registerComponent(IgcGridLiteHeader, IgcIconComponent);
24
+ }
25
+ get context() {
26
+ return {
27
+ parent: this,
28
+ column: this.column,
29
+ };
30
+ }
31
+ get isSortable() {
32
+ return Boolean(this.column.sort);
33
+ }
34
+ get resizeController() {
35
+ return this.state.resizing;
36
+ }
37
+ #addResizeEventHandlers() {
38
+ const config = { once: true };
39
+ this.addEventListener('gotpointercapture', () => {
40
+ this.resizeController.indicatorActive = true;
41
+ }, config);
42
+ this.addEventListener('lostpointercapture', this.#handlePointerLost, config);
43
+ this.addEventListener('pointerup', (e) => this.releasePointerCapture(e.pointerId), config);
44
+ this.addEventListener('pointermove', this.#handleResize);
45
+ }
46
+ #handleClick(e) {
47
+ e.stopPropagation();
48
+ this.state.sorting.sortFromHeaderClick(this.column);
49
+ }
50
+ #handleResize = ({ clientX }) => {
51
+ const { left } = this.getBoundingClientRect();
52
+ const width = Math.max(clientX - left, MIN_COL_RESIZE_WIDTH);
53
+ const x = this.offsetLeft + width;
54
+ this.resizeController.resize(this.column, width, x);
55
+ };
56
+ #handleResizeStart(ev) {
57
+ const { target, pointerId } = ev;
58
+ ev.preventDefault();
59
+ this.#addResizeEventHandlers();
60
+ this.resizeController.start(this);
61
+ target.setPointerCapture(pointerId);
62
+ }
63
+ #handlePointerLost = () => {
64
+ this.resizeController.indicatorActive = false;
65
+ this.removeEventListener('pointermove', this.#handleResize);
66
+ this.resizeController.stop();
67
+ };
68
+ #handleAutosize = () => this.resizeController.autosize(this.column, this);
69
+ renderSortPart() {
70
+ const state = this.state.sorting.state.get(this.column.key);
71
+ const idx = Array.from(this.state.sorting.state.values()).indexOf(state);
72
+ const attr = this.state.host.sortConfiguration.multiple
73
+ ? idx > -1
74
+ ? idx + 1
75
+ : nothing
76
+ : nothing;
77
+ const icon = state
78
+ ? state.direction === 'ascending'
79
+ ? SORT_ICON_ASCENDING
80
+ : SORT_ICON_DESCENDING
81
+ : SORT_ICON_ASCENDING;
82
+ return state || this.isSortable
83
+ ? html `<span
84
+ part=${partNameMap({ action: true, sorted: !!state?.direction })}
85
+ @click=${this.isSortable ? this.#handleClick : nothing}
86
+ >
87
+ <igc-icon
88
+ part=${partNameMap({ 'sorting-action': !!state })}
89
+ data-sortIndex=${attr}
90
+ name=${icon}
91
+ collection="internal"
92
+ ></igc-icon>
93
+ </span>`
94
+ : nothing;
95
+ }
96
+ renderContentPart() {
97
+ const defaultContent = this.column.headerText ?? this.column.key;
98
+ const template = this.column.headerTemplate;
99
+ return html `
100
+ <span part="title">
101
+ <span>${template ? template(this.context) : html `${defaultContent}`}</span>
102
+ </span>
103
+ `;
104
+ }
105
+ renderResizePart() {
106
+ return this.column.resizable
107
+ ? html `<span
108
+ part="resizable"
109
+ @dblclick=${this.#handleAutosize}
110
+ @pointerdown=${this.#handleResizeStart}
111
+ ></span>`
112
+ : nothing;
113
+ }
114
+ render() {
115
+ return html `
116
+ <div
117
+ part=${partNameMap({
118
+ content: true,
119
+ sortable: this.isSortable,
120
+ resizing: this.resizeController.indicatorActive,
121
+ })}
122
+ >
123
+ ${this.renderContentPart()}
124
+ <div part="actions">${this.renderSortPart()}</div>
125
+ </div>
126
+ ${this.renderResizePart()}
127
+ `;
128
+ }
129
+ }
130
+ __decorate([
131
+ consume({ context: gridStateContext, subscribe: true }),
132
+ property({ attribute: false })
133
+ ], IgcGridLiteHeader.prototype, "state", void 0);
134
+ __decorate([
135
+ property({ attribute: false })
136
+ ], IgcGridLiteHeader.prototype, "column", void 0);
137
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../../src/components/header.ts"],"names":[],"mappings":"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","sourcesContent":["import { consume } from '@lit/context';\nimport { IgcIconComponent } from 'igniteui-webcomponents';\nimport { html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { gridStateContext, type StateController } from '../controllers/state.js';\nimport {\n MIN_COL_RESIZE_WIDTH,\n SORT_ICON_ASCENDING,\n SORT_ICON_DESCENDING,\n} from '../internal/constants.js';\nimport { partNameMap } from '../internal/part-map.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_HEADER_TAG } from '../internal/tags.js';\nimport type { ColumnConfiguration, IgcHeaderContext } from '../internal/types.js';\nimport { styles } from '../styles/header-cell/header-cell.css.js';\n\nexport default class IgcGridLiteHeader<T extends object> extends LitElement {\n public static get tagName() {\n return GRID_HEADER_TAG;\n }\n\n public static override styles = styles;\n\n public static register(): void {\n registerComponent(IgcGridLiteHeader, IgcIconComponent);\n }\n\n protected get context(): IgcHeaderContext<T> {\n return {\n parent: this,\n column: this.column,\n };\n }\n\n protected get isSortable() {\n return Boolean(this.column.sort);\n }\n\n protected get resizeController() {\n return this.state.resizing;\n }\n\n @consume({ context: gridStateContext, subscribe: true })\n @property({ attribute: false })\n public state!: StateController<T>;\n\n @property({ attribute: false })\n public column!: ColumnConfiguration<T>;\n\n #addResizeEventHandlers() {\n const config: AddEventListenerOptions = { once: true };\n\n this.addEventListener(\n 'gotpointercapture',\n () => {\n this.resizeController.indicatorActive = true;\n },\n config\n );\n this.addEventListener('lostpointercapture', this.#handlePointerLost, config);\n this.addEventListener('pointerup', (e) => this.releasePointerCapture(e.pointerId), config);\n this.addEventListener('pointermove', this.#handleResize);\n }\n\n #handleClick(e: Event) {\n e.stopPropagation();\n this.state.sorting.sortFromHeaderClick(this.column);\n }\n\n #handleResize = ({ clientX }: PointerEvent) => {\n const { left } = this.getBoundingClientRect();\n const width = Math.max(clientX - left, MIN_COL_RESIZE_WIDTH);\n const x = this.offsetLeft + width;\n\n this.resizeController.resize(this.column, width, x);\n };\n\n #handleResizeStart(ev: PointerEvent) {\n const { target, pointerId } = ev;\n\n ev.preventDefault();\n\n this.#addResizeEventHandlers();\n this.resizeController.start(this);\n\n (target as HTMLElement).setPointerCapture(pointerId);\n }\n\n #handlePointerLost = () => {\n this.resizeController.indicatorActive = false;\n this.removeEventListener('pointermove', this.#handleResize);\n this.resizeController.stop();\n };\n\n #handleAutosize = () => this.resizeController.autosize(this.column, this);\n\n protected renderSortPart() {\n const state = this.state.sorting.state.get(this.column.key);\n const idx = Array.from(this.state.sorting.state.values()).indexOf(state!);\n const attr = this.state.host.sortConfiguration.multiple\n ? idx > -1\n ? idx + 1\n : nothing\n : nothing;\n const icon = state\n ? state.direction === 'ascending'\n ? SORT_ICON_ASCENDING\n : SORT_ICON_DESCENDING\n : SORT_ICON_ASCENDING;\n\n return state || this.isSortable\n ? html`<span\n part=${partNameMap({ action: true, sorted: !!state?.direction })}\n @click=${this.isSortable ? this.#handleClick : nothing}\n >\n <igc-icon\n part=${partNameMap({ 'sorting-action': !!state })}\n data-sortIndex=${attr}\n name=${icon}\n collection=\"internal\"\n ></igc-icon>\n </span>`\n : nothing;\n }\n\n protected renderContentPart() {\n const defaultContent = this.column.headerText ?? this.column.key;\n const template = this.column.headerTemplate;\n\n return html`\n <span part=\"title\">\n <span>${template ? template(this.context) : html`${defaultContent}`}</span>\n </span>\n `;\n }\n\n protected renderResizePart() {\n return this.column.resizable\n ? html`<span\n part=\"resizable\"\n @dblclick=${this.#handleAutosize}\n @pointerdown=${this.#handleResizeStart}\n ></span>`\n : nothing;\n }\n\n protected override render() {\n return html`\n <div\n part=${partNameMap({\n content: true,\n sortable: this.isSortable,\n resizing: this.resizeController.indicatorActive,\n })}\n >\n ${this.renderContentPart()}\n <div part=\"actions\">${this.renderSortPart()}</div>\n </div>\n ${this.renderResizePart()}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcGridLiteHeader.tagName]: IgcGridLiteHeader<object>;\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import { LitElement } from 'lit';
2
+ import type { ActiveNode, ColumnConfiguration } from '../internal/types.js';
3
+ import IgcGridLiteCell from './cell.js';
4
+ /**
5
+ * Component representing the DOM row in the IgcGridLite.
6
+ */
7
+ export default class IgcGridLiteRow<T extends object> extends LitElement {
8
+ static get tagName(): "igc-grid-lite-row";
9
+ static styles: import("lit").CSSResult;
10
+ static register(): void;
11
+ protected _cells: NodeListOf<IgcGridLiteCell<T>>;
12
+ data: T;
13
+ columns: Array<ColumnConfiguration<T>>;
14
+ get cells(): IgcGridLiteCell<T>[];
15
+ activeNode: ActiveNode<T>;
16
+ index: number;
17
+ connectedCallback(): void;
18
+ protected render(): import("lit-html").TemplateResult<1>;
19
+ }
20
+ declare global {
21
+ interface HTMLElementTagNameMap {
22
+ [IgcGridLiteRow.tagName]: IgcGridLiteRow<object>;
23
+ }
24
+ }
@@ -0,0 +1,64 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { html, LitElement, nothing } from 'lit';
8
+ import { property, queryAll } from 'lit/decorators.js';
9
+ import { map } from 'lit/directives/map.js';
10
+ import { registerComponent } from '../internal/register.js';
11
+ import { GRID_ROW_TAG } from '../internal/tags.js';
12
+ import { styles } from '../styles/body-row/body-row.css.js';
13
+ import IgcGridLiteCell from './cell.js';
14
+ export default class IgcGridLiteRow extends LitElement {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.columns = [];
18
+ this.index = -1;
19
+ }
20
+ static get tagName() {
21
+ return GRID_ROW_TAG;
22
+ }
23
+ static { this.styles = styles; }
24
+ static register() {
25
+ registerComponent(IgcGridLiteRow, IgcGridLiteCell);
26
+ }
27
+ get cells() {
28
+ return Array.from(this._cells);
29
+ }
30
+ connectedCallback() {
31
+ super.connectedCallback();
32
+ this.setAttribute('exportparts', 'cell');
33
+ }
34
+ render() {
35
+ const { column: key, row: index } = this.activeNode;
36
+ return html `
37
+ ${map(this.columns, (column) => column.hidden
38
+ ? nothing
39
+ : html `<igc-grid-lite-cell
40
+ part="cell"
41
+ .active=${key === column.key && index === this.index}
42
+ .column=${column}
43
+ .row=${this}
44
+ .value=${this.data[column.key]}
45
+ ></igc-grid-lite-cell>`)}
46
+ `;
47
+ }
48
+ }
49
+ __decorate([
50
+ queryAll(IgcGridLiteCell.tagName)
51
+ ], IgcGridLiteRow.prototype, "_cells", void 0);
52
+ __decorate([
53
+ property({ attribute: false })
54
+ ], IgcGridLiteRow.prototype, "data", void 0);
55
+ __decorate([
56
+ property({ attribute: false })
57
+ ], IgcGridLiteRow.prototype, "columns", void 0);
58
+ __decorate([
59
+ property({ attribute: false })
60
+ ], IgcGridLiteRow.prototype, "activeNode", void 0);
61
+ __decorate([
62
+ property({ attribute: false, type: Number })
63
+ ], IgcGridLiteRow.prototype, "index", void 0);
64
+ //# sourceMappingURL=row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row.js","sourceRoot":"","sources":["../../src/components/row.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,eAAe,MAAM,WAAW,CAAC;AAKxC,MAAM,CAAC,OAAO,OAAO,cAAiC,SAAQ,UAAU;IAAxE;;QAiBS,YAAO,GAAkC,EAAE,CAAC;QAU5C,UAAK,GAAG,CAAC,CAAC,CAAC;IAwBpB,CAAC;IAlDQ,MAAM,KAAK,OAAO;QACvB,OAAO,YAAY,CAAC;IACtB,CAAC;aACsB,WAAM,GAAG,MAAM,AAAT,CAAU;IAEhC,MAAM,CAAC,QAAQ;QACpB,iBAAiB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IACrD,CAAC;IAWD,IAAW,KAAK;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAQe,iBAAiB;QAC/B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAEkB,MAAM;QACvB,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;QAEpD,OAAO,IAAI,CAAA;QACP,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAC7B,MAAM,CAAC,MAAM;YACX,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,IAAI,CAAA;;wBAEQ,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK;wBAC1C,MAAM;qBACT,IAAyB;uBACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;mCACT,CAC5B;KACF,CAAC;IACJ,CAAC;;AAvCS;IADT,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC;8CACgB;AAG3C;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;4CACf;AAGT;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;+CACoB;AAO5C;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;kDACG;AAG3B;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAC3B","sourcesContent":["import { html, LitElement, nothing } from 'lit';\nimport { property, queryAll } from 'lit/decorators.js';\nimport { map } from 'lit/directives/map.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_ROW_TAG } from '../internal/tags.js';\nimport type { ActiveNode, ColumnConfiguration } from '../internal/types.js';\nimport { styles } from '../styles/body-row/body-row.css.js';\nimport IgcGridLiteCell from './cell.js';\n\n/**\n * Component representing the DOM row in the IgcGridLite.\n */\nexport default class IgcGridLiteRow<T extends object> extends LitElement {\n public static get tagName() {\n return GRID_ROW_TAG;\n }\n public static override styles = styles;\n\n public static register(): void {\n registerComponent(IgcGridLiteRow, IgcGridLiteCell);\n }\n\n @queryAll(IgcGridLiteCell.tagName)\n protected _cells!: NodeListOf<IgcGridLiteCell<T>>;\n\n @property({ attribute: false })\n public data!: T;\n\n @property({ attribute: false })\n public columns: Array<ColumnConfiguration<T>> = [];\n\n public get cells() {\n return Array.from(this._cells);\n }\n\n @property({ attribute: false })\n public activeNode!: ActiveNode<T>;\n\n @property({ attribute: false, type: Number })\n public index = -1;\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('exportparts', 'cell');\n }\n\n protected override render() {\n const { column: key, row: index } = this.activeNode;\n\n return html`\n ${map(this.columns, (column) =>\n column.hidden\n ? nothing\n : html`<igc-grid-lite-cell\n part=\"cell\"\n .active=${key === column.key && index === this.index}\n .column=${column}\n .row=${this as IgcGridLiteRow<T>}\n .value=${this.data[column.key]}\n ></igc-grid-lite-cell>`\n )}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcGridLiteRow.tagName]: IgcGridLiteRow<object>;\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { LitVirtualizer } from '@lit-labs/virtualizer/LitVirtualizer.js';
2
+ export default class IgcVirtualizer extends LitVirtualizer {
3
+ static get tagName(): "igc-virtualizer";
4
+ static register(): void;
5
+ scroller: boolean;
6
+ connectedCallback(): Promise<void>;
7
+ }
8
+ declare global {
9
+ interface HTMLElementTagNameMap {
10
+ [IgcVirtualizer.tagName]: IgcVirtualizer;
11
+ }
12
+ }
@@ -0,0 +1,21 @@
1
+ import { LitVirtualizer } from '@lit-labs/virtualizer/LitVirtualizer.js';
2
+ import { registerComponent } from '../internal/register.js';
3
+ import { GRID_BODY } from '../internal/tags.js';
4
+ export default class IgcVirtualizer extends LitVirtualizer {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.scroller = true;
8
+ }
9
+ static get tagName() {
10
+ return GRID_BODY;
11
+ }
12
+ static register() {
13
+ registerComponent(IgcVirtualizer);
14
+ }
15
+ async connectedCallback() {
16
+ await super.layoutComplete;
17
+ super.connectedCallback();
18
+ this.setAttribute('tabindex', '0');
19
+ }
20
+ }
21
+ //# sourceMappingURL=virtualizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualizer.js","sourceRoot":"","sources":["../../src/components/virtualizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,cAAc;IAA1D;;QASkB,aAAQ,GAAG,IAAI,CAAC;IAQlC,CAAC;IAhBQ,MAAM,KAAK,OAAO;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAQ;QACpB,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;IAIe,KAAK,CAAC,iBAAiB;QACrC,MAAM,KAAK,CAAC,cAAc,CAAC;QAE3B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;CACF","sourcesContent":["import { LitVirtualizer } from '@lit-labs/virtualizer/LitVirtualizer.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_BODY } from '../internal/tags.js';\n\nexport default class IgcVirtualizer extends LitVirtualizer {\n public static get tagName() {\n return GRID_BODY;\n }\n\n public static register(): void {\n registerComponent(IgcVirtualizer);\n }\n\n public override scroller = true;\n\n public override async connectedCallback() {\n await super.layoutComplete;\n\n super.connectedCallback();\n this.setAttribute('tabindex', '0');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcVirtualizer.tagName]: IgcVirtualizer;\n }\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { ReactiveController } from 'lit';
2
+ import type { GridHost } from '../internal/types.js';
3
+ import FilterDataOperation from '../operations/filter.js';
4
+ import SortDataOperation from '../operations/sort.js';
5
+ import type { StateController } from './state.js';
6
+ export declare class DataOperationsController<T extends object> implements ReactiveController {
7
+ protected host: GridHost<T>;
8
+ protected sorting: SortDataOperation<T>;
9
+ protected filtering: FilterDataOperation<T>;
10
+ constructor(host: GridHost<T>);
11
+ hostConnected(): void;
12
+ protected get hasCustomSort(): boolean;
13
+ protected get hasCustomFilter(): boolean;
14
+ protected get customFilter(): import("../index.js").DataPipelineHook<T>;
15
+ protected get customSort(): import("../index.js").DataPipelineHook<T>;
16
+ apply(data: T[], state: StateController<T>): Promise<T[]>;
17
+ }
@@ -0,0 +1,36 @@
1
+ import { isDefined } from '../internal/is-defined.js';
2
+ import FilterDataOperation from '../operations/filter.js';
3
+ import SortDataOperation from '../operations/sort.js';
4
+ export class DataOperationsController {
5
+ constructor(host) {
6
+ this.host = host;
7
+ this.sorting = new SortDataOperation();
8
+ this.filtering = new FilterDataOperation();
9
+ this.host.addController(this);
10
+ }
11
+ hostConnected() { }
12
+ get hasCustomSort() {
13
+ return isDefined(this.host.dataPipelineConfiguration?.sort);
14
+ }
15
+ get hasCustomFilter() {
16
+ return isDefined(this.host.dataPipelineConfiguration?.filter);
17
+ }
18
+ get customFilter() {
19
+ return this.host.dataPipelineConfiguration.filter;
20
+ }
21
+ get customSort() {
22
+ return this.host.dataPipelineConfiguration.sort;
23
+ }
24
+ async apply(data, state) {
25
+ const { filtering, sorting } = state;
26
+ let transformed;
27
+ transformed = this.hasCustomFilter
28
+ ? await this.customFilter({ data, grid: this.host, type: 'filter' })
29
+ : this.filtering.apply(data, filtering.state);
30
+ transformed = this.hasCustomSort
31
+ ? await this.customSort({ data: transformed, grid: this.host, type: 'sort' })
32
+ : this.sorting.apply(transformed, sorting.state);
33
+ return transformed;
34
+ }
35
+ }
36
+ //# sourceMappingURL=data-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-operation.js","sourceRoot":"","sources":["../../src/controllers/data-operation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,mBAAmB,MAAM,yBAAyB,CAAC;AAC1D,OAAO,iBAAiB,MAAM,uBAAuB,CAAC;AAGtD,MAAM,OAAO,wBAAwB;IAInC,YAAsB,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;QAH7B,YAAO,GAAG,IAAI,iBAAiB,EAAK,CAAC;QACrC,cAAS,GAAG,IAAI,mBAAmB,EAAK,CAAC;QAGjD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAEM,aAAa,KAAI,CAAC;IAEzB,IAAc,aAAa;QACzB,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,IAAc,eAAe;QAC3B,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;IAED,IAAc,YAAY;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,yBAA0B,CAAC,MAAO,CAAC;IACtD,CAAC;IAED,IAAc,UAAU;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,yBAA0B,CAAC,IAAK,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAS,EAAE,KAAyB;QACrD,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;QACrC,IAAI,WAAgB,CAAC;QAErB,WAAW,GAAG,IAAI,CAAC,eAAe;YAChC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACpE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAEhD,WAAW,GAAG,IAAI,CAAC,aAAa;YAC9B,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC7E,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAEnD,OAAO,WAAW,CAAC;IACrB,CAAC;CACF","sourcesContent":["import type { ReactiveController } from 'lit';\nimport { isDefined } from '../internal/is-defined.js';\nimport type { GridHost } from '../internal/types.js';\nimport FilterDataOperation from '../operations/filter.js';\nimport SortDataOperation from '../operations/sort.js';\nimport type { StateController } from './state.js';\n\nexport class DataOperationsController<T extends object> implements ReactiveController {\n protected sorting = new SortDataOperation<T>();\n protected filtering = new FilterDataOperation<T>();\n\n constructor(protected host: GridHost<T>) {\n this.host.addController(this);\n }\n\n public hostConnected() {}\n\n protected get hasCustomSort() {\n return isDefined(this.host.dataPipelineConfiguration?.sort);\n }\n\n protected get hasCustomFilter() {\n return isDefined(this.host.dataPipelineConfiguration?.filter);\n }\n\n protected get customFilter() {\n return this.host.dataPipelineConfiguration!.filter!;\n }\n\n protected get customSort() {\n return this.host.dataPipelineConfiguration!.sort!;\n }\n\n public async apply(data: T[], state: StateController<T>) {\n const { filtering, sorting } = state;\n let transformed: T[];\n\n transformed = this.hasCustomFilter\n ? await this.customFilter({ data, grid: this.host, type: 'filter' })\n : this.filtering.apply(data, filtering.state);\n\n transformed = this.hasCustomSort\n ? await this.customSort({ data: transformed, grid: this.host, type: 'sort' })\n : this.sorting.apply(transformed, sorting.state);\n\n return transformed;\n }\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import type { RenderItemFunction } from '@lit-labs/virtualizer/virtualize.js';
2
+ import { type ReactiveController } from 'lit';
3
+ import { type StyleInfo } from 'lit/directives/style-map.js';
4
+ import type { GridHost } from '../internal/types.js';
5
+ import type { StateController } from './state.js';
6
+ export declare class GridDOMController<T extends object> implements ReactiveController {
7
+ #private;
8
+ protected host: GridHost<T>;
9
+ protected state: StateController<T>;
10
+ constructor(host: GridHost<T>, state: StateController<T>);
11
+ get container(): import("../components/virtualizer.js").default;
12
+ columnSizes: StyleInfo;
13
+ rowRenderer: RenderItemFunction<T>;
14
+ hostConnected(): Promise<void>;
15
+ hostUpdate(): void;
16
+ setScrollOffset(): void;
17
+ protected setGridColumnSizes(): void;
18
+ getActiveRowStyles(index: number): StyleInfo;
19
+ }
@@ -0,0 +1,54 @@
1
+ import { html } from 'lit';
2
+ import { styleMap } from 'lit/directives/style-map.js';
3
+ import { registerGridIcons } from '../internal/icon-registry.js';
4
+ import { applyColumnWidths } from '../internal/utils.js';
5
+ export class GridDOMController {
6
+ constructor(host, state) {
7
+ this.host = host;
8
+ this.state = state;
9
+ this.#initialSize = () => {
10
+ setTimeout(() => this.setScrollOffset());
11
+ };
12
+ this.columnSizes = {};
13
+ this.rowRenderer = (data, index) => {
14
+ return html `
15
+ <igc-grid-lite-row
16
+ part="row"
17
+ style=${styleMap({ ...this.columnSizes, ...this.getActiveRowStyles(index) })}
18
+ .index=${index}
19
+ .activeNode=${this.state.active}
20
+ .data=${data}
21
+ .columns=${this.host.columns}
22
+ >
23
+ </igc-grid-lite-row>
24
+ `;
25
+ };
26
+ this.host.addController(this);
27
+ }
28
+ #initialSize;
29
+ get container() {
30
+ return this.host.scrollContainer;
31
+ }
32
+ async hostConnected() {
33
+ registerGridIcons();
34
+ this.setGridColumnSizes();
35
+ await this.host.updateComplete;
36
+ this.container.addEventListener('visibilityChanged', this.#initialSize, { once: true });
37
+ }
38
+ hostUpdate() {
39
+ this.setScrollOffset();
40
+ this.setGridColumnSizes();
41
+ }
42
+ setScrollOffset() {
43
+ const size = this.container ? this.container.offsetWidth - this.container.clientWidth : 0;
44
+ this.host.style.setProperty('--scrollbar-offset', `${size}px`);
45
+ }
46
+ setGridColumnSizes() {
47
+ this.columnSizes = applyColumnWidths(this.host.columns);
48
+ }
49
+ getActiveRowStyles(index) {
50
+ const { row } = this.state.active;
51
+ return row === index ? { 'z-index': '3' } : {};
52
+ }
53
+ }
54
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/controllers/dom.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAA2B,MAAM,KAAK,CAAC;AACpD,OAAO,EAAkB,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,MAAM,OAAO,iBAAiB;IAC5B,YACY,IAAiB,EACjB,KAAyB;QADzB,SAAI,GAAJ,IAAI,CAAa;QACjB,UAAK,GAAL,KAAK,CAAoB;QAKrC,iBAAY,GAAG,GAAG,EAAE;YAClB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC;QAOK,gBAAW,GAAc,EAAE,CAAC;QAE5B,gBAAW,GAA0B,CAAC,IAAO,EAAE,KAAa,EAAE,EAAE;YACrE,OAAO,IAAI,CAAA;;;gBAGC,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;iBACnE,KAAK;sBACA,IAAI,CAAC,KAAK,CAAC,MAAM;gBACvB,IAAI;mBACD,IAAI,CAAC,IAAI,CAAC,OAAO;;;KAG/B,CAAC;QACJ,CAAC,CAAC;QA1BA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,YAAY,CAEV;IAEF,IAAW,SAAS;QAElB,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;IACnC,CAAC;IAkBM,KAAK,CAAC,aAAa;QACxB,iBAAiB,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAG1B,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEM,eAAe;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;IACjE,CAAC;IAES,kBAAkB;QAC1B,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAEM,kBAAkB,CAAC,KAAa;QACrC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAClC,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,CAAC;CACF","sourcesContent":["import type { RenderItemFunction } from '@lit-labs/virtualizer/virtualize.js';\nimport { html, type ReactiveController } from 'lit';\nimport { type StyleInfo, styleMap } from 'lit/directives/style-map.js';\nimport { registerGridIcons } from '../internal/icon-registry.js';\nimport type { GridHost } from '../internal/types.js';\nimport { applyColumnWidths } from '../internal/utils.js';\nimport type { StateController } from './state.js';\n\nexport class GridDOMController<T extends object> implements ReactiveController {\n constructor(\n protected host: GridHost<T>,\n protected state: StateController<T>\n ) {\n this.host.addController(this);\n }\n\n #initialSize = () => {\n setTimeout(() => this.setScrollOffset());\n };\n\n public get container() {\n // @ts-expect-error: protected member access\n return this.host.scrollContainer;\n }\n\n public columnSizes: StyleInfo = {};\n\n public rowRenderer: RenderItemFunction<T> = (data: T, index: number) => {\n return html`\n <igc-grid-lite-row\n part=\"row\"\n style=${styleMap({ ...this.columnSizes, ...this.getActiveRowStyles(index) })}\n .index=${index}\n .activeNode=${this.state.active}\n .data=${data}\n .columns=${this.host.columns}\n >\n </igc-grid-lite-row>\n `;\n };\n\n public async hostConnected() {\n registerGridIcons();\n this.setGridColumnSizes();\n // Wait for the initial paint of the virtualizer and recalculate the scrollbar offset\n // for the next one\n await this.host.updateComplete;\n this.container.addEventListener('visibilityChanged', this.#initialSize, { once: true });\n }\n\n public hostUpdate(): void {\n this.setScrollOffset();\n this.setGridColumnSizes();\n }\n\n public setScrollOffset() {\n const size = this.container ? this.container.offsetWidth - this.container.clientWidth : 0;\n this.host.style.setProperty('--scrollbar-offset', `${size}px`);\n }\n\n protected setGridColumnSizes() {\n this.columnSizes = applyColumnWidths(this.host.columns);\n }\n\n public getActiveRowStyles(index: number): StyleInfo {\n const { row } = this.state.active;\n return row === index ? { 'z-index': '3' } : {};\n }\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { ReactiveController } from 'lit';
2
+ import type { ColumnConfiguration, GridHost, Keys } from '../internal/types.js';
3
+ import { FilterState } from '../operations/filter/state.js';
4
+ import type { FilterExpression } from '../operations/filter/types.js';
5
+ export declare class FilterController<T extends object> implements ReactiveController {
6
+ #private;
7
+ protected host: GridHost<T>;
8
+ constructor(host: GridHost<T>);
9
+ state: FilterState<T>;
10
+ get filterRow(): import("../components/filter-row.js").default<T>;
11
+ hostConnected(): void;
12
+ hostUpdate(): void;
13
+ get(key: Keys<T>): import("../operations/filter/tree.js").FilterExpressionTree<T> | undefined;
14
+ reset(key?: Keys<T>): void;
15
+ setActiveColumn(column?: ColumnConfiguration<T>): void;
16
+ getDefaultExpression(column: ColumnConfiguration<T>): FilterExpression<T>;
17
+ removeAllExpressions(key: Keys<T>): Promise<void>;
18
+ removeExpression(expression: FilterExpression<T>): Promise<void>;
19
+ filterWithEvent(expression: FilterExpression<T>, type: 'add' | 'modify' | 'remove'): Promise<void>;
20
+ filter(expression: FilterExpression<T> | FilterExpression<T>[]): void;
21
+ }
@@ -0,0 +1,105 @@
1
+ import { PIPELINE } from '../internal/constants.js';
2
+ import { asArray, getFilterOperandsFor } from '../internal/utils.js';
3
+ import { FilterState } from '../operations/filter/state.js';
4
+ export class FilterController {
5
+ constructor(host) {
6
+ this.host = host;
7
+ this.state = new FilterState();
8
+ this.host.addController(this);
9
+ }
10
+ get filterRow() {
11
+ return this.host.filterRow;
12
+ }
13
+ get #virtualizer() {
14
+ return this.host.scrollContainer;
15
+ }
16
+ #emitFilteringEvent(expression, type) {
17
+ return this.host.emitEvent('filtering', {
18
+ detail: {
19
+ key: expression.key,
20
+ expressions: [expression],
21
+ type,
22
+ },
23
+ cancelable: true,
24
+ });
25
+ }
26
+ #emitFilteredEvent(detail) {
27
+ return this.host.emitEvent('filtered', { detail });
28
+ }
29
+ #filter(expression) {
30
+ for (const expr of asArray(expression)) {
31
+ this.state.set(expr);
32
+ }
33
+ this.#virtualizer?.scrollTo({ top: 0 });
34
+ this.host.requestUpdate(PIPELINE);
35
+ }
36
+ hostConnected() { }
37
+ hostUpdate() {
38
+ this.filterRow?.requestUpdate();
39
+ }
40
+ get(key) {
41
+ return this.state.get(key);
42
+ }
43
+ reset(key) {
44
+ key ? this.state.delete(key) : this.state.clear();
45
+ }
46
+ setActiveColumn(column) {
47
+ if (column?.filter && this.filterRow?.active) {
48
+ this.filterRow.column = column;
49
+ this.filterRow.expression = this.getDefaultExpression(column);
50
+ this.host.requestUpdate();
51
+ }
52
+ }
53
+ getDefaultExpression(column) {
54
+ const caseSensitive = typeof column.filter === 'boolean' ? false : Boolean(column.filter?.caseSensitive);
55
+ const operands = getFilterOperandsFor(column);
56
+ const keys = Object.keys(operands);
57
+ return {
58
+ key: column.key,
59
+ condition: operands[keys[0]],
60
+ caseSensitive,
61
+ };
62
+ }
63
+ async removeAllExpressions(key) {
64
+ const state = this.get(key)?.all ?? [];
65
+ if (!this.host.emitEvent('filtering', {
66
+ detail: {
67
+ key,
68
+ expressions: state,
69
+ type: 'remove',
70
+ },
71
+ cancelable: true,
72
+ })) {
73
+ return;
74
+ }
75
+ this.reset(key);
76
+ this.#filter([]);
77
+ await this.host.updateComplete;
78
+ this.#emitFilteredEvent({ key, state: this.get(key)?.all ?? [] });
79
+ }
80
+ async removeExpression(expression) {
81
+ const state = this.get(expression.key);
82
+ if (!this.#emitFilteringEvent(expression, 'remove')) {
83
+ return;
84
+ }
85
+ state?.remove(expression);
86
+ if (state?.empty) {
87
+ this.reset(state.key);
88
+ }
89
+ this.#filter([]);
90
+ await this.host.updateComplete;
91
+ this.#emitFilteredEvent({ key: expression.key, state: state?.all ?? [] });
92
+ }
93
+ async filterWithEvent(expression, type) {
94
+ if (!this.#emitFilteringEvent(expression, type)) {
95
+ return;
96
+ }
97
+ this.#filter(expression);
98
+ await this.host.updateComplete;
99
+ this.#emitFilteredEvent({ key: expression.key, state: this.get(expression.key)?.all ?? [] });
100
+ }
101
+ filter(expression) {
102
+ this.#filter(asArray(expression).map((expr) => Object.assign(this.getDefaultExpression(this.host.getColumn(expr.key)), expr)));
103
+ }
104
+ }
105
+ //# sourceMappingURL=filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/controllers/filter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController } from 'lit';\nimport type { IgcFilteredEvent } from '../components/grid.js';\nimport { PIPELINE } from '../internal/constants.js';\nimport type { ColumnConfiguration, GridHost, Keys } from '../internal/types.js';\nimport { asArray, getFilterOperandsFor } from '../internal/utils.js';\nimport { FilterState } from '../operations/filter/state.js';\nimport type { FilterExpression } from '../operations/filter/types.js';\n\nexport class FilterController<T extends object> implements ReactiveController {\n constructor(protected host: GridHost<T>) {\n this.host.addController(this);\n }\n\n public state: FilterState<T> = new FilterState();\n\n public get filterRow() {\n // @ts-expect-error - protected access\n return this.host.filterRow;\n }\n\n get #virtualizer() {\n // @ts-expect-error - protected access\n return this.host.scrollContainer;\n }\n\n #emitFilteringEvent(expression: FilterExpression<T>, type: 'add' | 'modify' | 'remove') {\n return this.host.emitEvent('filtering', {\n detail: {\n key: expression.key,\n expressions: [expression],\n type,\n },\n cancelable: true,\n });\n }\n\n #emitFilteredEvent(detail?: IgcFilteredEvent<T>) {\n return this.host.emitEvent('filtered', { detail });\n }\n\n #filter(expression: FilterExpression<T> | FilterExpression<T>[]) {\n for (const expr of asArray(expression)) {\n this.state.set(expr);\n }\n\n // HACK: In the case where the scrollTop is a large and amount and a big chunk of data is filtered out\n // HACK: the virtualizer can't recalculate its scroll position correctly. Thus, we reset the scrollTop state.\n this.#virtualizer?.scrollTo({ top: 0 });\n this.host.requestUpdate(PIPELINE);\n }\n\n public hostConnected() {}\n\n public hostUpdate(): void {\n this.filterRow?.requestUpdate();\n }\n\n public get(key: Keys<T>) {\n return this.state.get(key);\n }\n\n public reset(key?: Keys<T>) {\n key ? this.state.delete(key) : this.state.clear();\n }\n\n public setActiveColumn(column?: ColumnConfiguration<T>) {\n if (column?.filter && this.filterRow?.active) {\n this.filterRow.column = column;\n this.filterRow.expression = this.getDefaultExpression(column);\n this.host.requestUpdate();\n }\n }\n\n public getDefaultExpression(column: ColumnConfiguration<T>) {\n const caseSensitive =\n typeof column.filter === 'boolean' ? false : Boolean(column.filter?.caseSensitive);\n const operands = getFilterOperandsFor(column);\n const keys = Object.keys(operands) as Keys<typeof operands>[];\n\n // XXX: Types\n return {\n key: column.key,\n condition: operands[keys[0]],\n caseSensitive,\n } as unknown as FilterExpression<T>;\n }\n\n public async removeAllExpressions(key: Keys<T>) {\n const state = this.get(key)?.all ?? [];\n\n if (\n !this.host.emitEvent('filtering', {\n detail: {\n key,\n expressions: state,\n type: 'remove',\n },\n cancelable: true,\n })\n ) {\n return;\n }\n\n this.reset(key);\n this.#filter([]);\n\n await this.host.updateComplete;\n this.#emitFilteredEvent({ key, state: this.get(key)?.all ?? [] });\n }\n\n public async removeExpression(expression: FilterExpression<T>) {\n const state = this.get(expression.key);\n\n if (!this.#emitFilteringEvent(expression, 'remove')) {\n return;\n }\n\n state?.remove(expression);\n\n if (state?.empty) {\n this.reset(state.key);\n }\n\n this.#filter([]);\n\n await this.host.updateComplete;\n this.#emitFilteredEvent({ key: expression.key, state: state?.all ?? [] });\n }\n\n public async filterWithEvent(expression: FilterExpression<T>, type: 'add' | 'modify' | 'remove') {\n if (!this.#emitFilteringEvent(expression, type)) {\n return;\n }\n\n this.#filter(expression);\n\n await this.host.updateComplete;\n this.#emitFilteredEvent({ key: expression.key, state: this.get(expression.key)?.all ?? [] });\n }\n\n public filter(expression: FilterExpression<T> | FilterExpression<T>[]) {\n this.#filter(\n asArray(expression).map((expr) =>\n Object.assign(this.getDefaultExpression(this.host.getColumn(expr.key)!), expr)\n )\n );\n }\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import type { ReactiveController } from 'lit';
2
+ import type { ActiveNode, GridHost, Keys } from '../internal/types.js';
3
+ export declare class NavigationController<T extends object> implements ReactiveController {
4
+ protected host: GridHost<T>;
5
+ protected handlers: Map<string, (() => void) | (() => void) | (() => void) | (() => void) | (() => void) | (() => void)>;
6
+ protected get virtualizer(): import("../components/virtualizer.js").default;
7
+ protected state: Map<import("../internal/types.js").NavigationState, ActiveNode<any>>;
8
+ protected _active: Readonly<ActiveNode<any>>;
9
+ protected get nextNode(): ActiveNode<T>;
10
+ protected get columns(): import("../index.js").ColumnConfiguration<T, keyof T>[];
11
+ protected get firstColumn(): (keyof T & string) | (keyof T & number) | (keyof T & symbol);
12
+ protected getPreviousColumn(key: Keys<T>): (keyof T & string) | (keyof T & number) | (keyof T & symbol);
13
+ protected getNextColumn(key: Keys<T>): (keyof T & string) | (keyof T & number) | (keyof T & symbol);
14
+ protected scrollToCell(node: ActiveNode<T>): void;
15
+ get active(): ActiveNode<T>;
16
+ set active(node: ActiveNode<T>);
17
+ constructor(host: GridHost<T>);
18
+ protected home(): void;
19
+ protected end(): void;
20
+ protected arrowDown(): void;
21
+ protected arrowUp(): void;
22
+ protected arrowLeft(): void;
23
+ protected arrowRight(): void;
24
+ hostConnected(): void;
25
+ hostDisconnected(): void;
26
+ navigate(event: KeyboardEvent): void;
27
+ }