igniteui-grid-lite 0.0.1

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
package/LICENSE ADDED
@@ -0,0 +1,9 @@
1
+ The MIT License (MIT)
2
+
3
+ © Copyright 2025 INFRAGISTICS.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # Ignite UI Grid Lite
2
+ [![Node.js CI](https://github.com/IgniteUI/igniteui-grid-lite/actions/workflows/node.js.yml/badge.svg)](https://github.com/IgniteUI/igniteui-grid-lite/actions/workflows/node.js.yml)
3
+ [![Coverage Status](https://coveralls.io/repos/github/IgniteUI/igniteui-grid-lite/badge.svg?branch=master)](https://coveralls.io/github/IgniteUI/igniteui-grid-lite?branch=master)
4
+
5
+
6
+ This is still a **very** early proof of concept for a web component based data grid.
7
+
8
+ ## Local Development
9
+
10
+ 1. Clone the repository.
11
+ 2. Run `npm install`
12
+ 3. Run `npm run build`
13
+ 3. Play and explore the codebase.
14
+
15
+ ## Local demo with Vite
16
+
17
+ Run `npm start` to open the demo page in `demo/index.html`
@@ -0,0 +1,35 @@
1
+ import { LitElement } from 'lit';
2
+ import type { ColumnConfiguration, IgcCellContext, PropertyType } from '../internal/types.js';
3
+ import type IgcGridLiteRow from './row.js';
4
+ /**
5
+ * Component representing a DOM cell of the Igc grid.
6
+ */
7
+ export default class IgcGridLiteCell<T extends object> extends LitElement {
8
+ static get tagName(): "igc-grid-lite-cell";
9
+ static styles: import("lit").CSSResult;
10
+ static register(): void;
11
+ /**
12
+ * The value which will be rendered by the component.
13
+ */
14
+ value: PropertyType<T>;
15
+ /**
16
+ * A reference to the column configuration object.
17
+ */
18
+ column: ColumnConfiguration<T>;
19
+ /**
20
+ * Indicates whether this is the active cell in the grid.
21
+ *
22
+ */
23
+ active: boolean;
24
+ /**
25
+ * The parent row component holding this cell.
26
+ */
27
+ row: IgcGridLiteRow<T>;
28
+ protected get context(): IgcCellContext<T>;
29
+ protected render(): unknown;
30
+ }
31
+ declare global {
32
+ interface HTMLElementTagNameMap {
33
+ [IgcGridLiteCell.tagName]: IgcGridLiteCell<object>;
34
+ }
35
+ }
@@ -0,0 +1,47 @@
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 } from 'lit';
8
+ import { property } from 'lit/decorators.js';
9
+ import { registerComponent } from '../internal/register.js';
10
+ import { GRID_CELL_TAG } from '../internal/tags.js';
11
+ import { styles } from '../styles/body-cell/body-cell.css.js';
12
+ export default class IgcGridLiteCell extends LitElement {
13
+ constructor() {
14
+ super(...arguments);
15
+ this.active = false;
16
+ }
17
+ static get tagName() {
18
+ return GRID_CELL_TAG;
19
+ }
20
+ static { this.styles = styles; }
21
+ static register() {
22
+ registerComponent(IgcGridLiteCell);
23
+ }
24
+ get context() {
25
+ return {
26
+ parent: this,
27
+ row: this.row,
28
+ column: this.column,
29
+ value: this.value,
30
+ };
31
+ }
32
+ render() {
33
+ return this.column.cellTemplate
34
+ ? this.column.cellTemplate(this.context)
35
+ : html `${this.value}`;
36
+ }
37
+ }
38
+ __decorate([
39
+ property({ attribute: false })
40
+ ], IgcGridLiteCell.prototype, "value", void 0);
41
+ __decorate([
42
+ property({ attribute: false })
43
+ ], IgcGridLiteCell.prototype, "column", void 0);
44
+ __decorate([
45
+ property({ type: Boolean, reflect: true })
46
+ ], IgcGridLiteCell.prototype, "active", void 0);
47
+ //# sourceMappingURL=cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell.js","sourceRoot":"","sources":["../../src/components/cell.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAM9D,MAAM,CAAC,OAAO,OAAO,eAAkC,SAAQ,UAAU;IAAzE;;QA4BS,WAAM,GAAG,KAAK,CAAC;IAqBxB,CAAC;IAhDQ,MAAM,KAAK,OAAO;QACvB,OAAO,aAAa,CAAC;IACvB,CAAC;aAEsB,WAAM,GAAG,MAAM,AAAT,CAAU;IAEhC,MAAM,CAAC,QAAQ;QACpB,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC;IA0BD,IAAc,OAAO;QACnB,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;SACc,CAAC;IACpC,CAAC;IAEkB,MAAM;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY;YAC7B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,OAAmC,CAAC;YACpE,CAAC,CAAC,IAAI,CAAA,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;;AAjCM;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;8CACA;AAMxB;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;+CACQ;AAOhC;IADN,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;+CACrB","sourcesContent":["import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_CELL_TAG } from '../internal/tags.js';\nimport type { ColumnConfiguration, IgcCellContext, PropertyType } from '../internal/types.js';\nimport { styles } from '../styles/body-cell/body-cell.css.js';\nimport type IgcGridLiteRow from './row.js';\n\n/**\n * Component representing a DOM cell of the Igc grid.\n */\nexport default class IgcGridLiteCell<T extends object> extends LitElement {\n public static get tagName() {\n return GRID_CELL_TAG;\n }\n\n public static override styles = styles;\n\n public static register(): void {\n registerComponent(IgcGridLiteCell);\n }\n\n /**\n * The value which will be rendered by the component.\n */\n @property({ attribute: false })\n public value!: PropertyType<T>;\n\n /**\n * A reference to the column configuration object.\n */\n @property({ attribute: false })\n public column!: ColumnConfiguration<T>;\n\n /**\n * Indicates whether this is the active cell in the grid.\n *\n */\n @property({ type: Boolean, reflect: true })\n public active = false;\n\n /**\n * The parent row component holding this cell.\n */\n public row!: IgcGridLiteRow<T>;\n\n protected get context(): IgcCellContext<T> {\n return {\n parent: this,\n row: this.row,\n column: this.column,\n value: this.value,\n } as unknown as IgcCellContext<T>;\n }\n\n protected override render() {\n return this.column.cellTemplate\n ? this.column.cellTemplate(this.context as IgcCellContext<T> as any)\n : html`${this.value}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcGridLiteCell.tagName]: IgcGridLiteCell<object>;\n }\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import { IgcDropdownComponent, type IgcIconComponent, IgcInputComponent } from 'igniteui-webcomponents';
2
+ import { LitElement, nothing } from 'lit';
3
+ import { type StateController } from '../controllers/state.js';
4
+ import type { ColumnConfiguration } from '../internal/types.js';
5
+ import type { FilterExpressionTree } from '../operations/filter/tree.js';
6
+ import type { FilterExpression, FilterOperation } from '../operations/filter/types.js';
7
+ type ExpressionChipProps<T> = {
8
+ expression: FilterExpression<T>;
9
+ selected: boolean;
10
+ onRemove: (e: Event) => Promise<void>;
11
+ onSelect: (e: Event) => Promise<void>;
12
+ };
13
+ export default class IgcFilterRow<T extends object> extends LitElement {
14
+ #private;
15
+ static get tagName(): "igc-filter-row";
16
+ static styles: import("lit").CSSResult;
17
+ static register(): void;
18
+ state: StateController<T>;
19
+ protected get isNumeric(): boolean;
20
+ protected get filterController(): import("../controllers/filter.js").FilterController<T>;
21
+ protected get condition(): FilterOperation<T>;
22
+ active: boolean;
23
+ input: IgcInputComponent;
24
+ conditionElement: IgcIconComponent;
25
+ dropdown: IgcDropdownComponent;
26
+ column: ColumnConfiguration<T>;
27
+ expression: FilterExpression<T>;
28
+ protected activeChanged(): void;
29
+ protected renderCriteriaButton(expr: FilterExpression<T>, index: number): typeof nothing | import("lit-html").TemplateResult<1>;
30
+ protected renderExpressionChip(props: ExpressionChipProps<T>): import("lit-html").TemplateResult<1>;
31
+ protected renderActiveChips(): typeof nothing | import("lit-html").TemplateResult<1>[];
32
+ protected renderFilterActions(): import("lit-html").TemplateResult<1>;
33
+ protected renderDropdown(): import("lit-html").TemplateResult<1>;
34
+ protected renderDropdownTarget(): import("lit-html").TemplateResult<1>;
35
+ protected renderInputArea(): import("lit-html").TemplateResult<1>;
36
+ protected renderActiveState(): import("lit-html").TemplateResult<1>;
37
+ protected renderInactiveChips(column: ColumnConfiguration<T>, state: FilterExpressionTree<T>): import("lit-html").TemplateResult<1>[];
38
+ protected renderFilterState(column: ColumnConfiguration<T>): import("lit-html").TemplateResult<1> | import("lit-html").TemplateResult<1>[];
39
+ protected renderInactiveState(): (typeof nothing | import("lit-html").TemplateResult<1>)[];
40
+ protected render(): import("lit-html").TemplateResult<1>;
41
+ }
42
+ declare global {
43
+ interface HTMLElementTagNameMap {
44
+ [IgcFilterRow.tagName]: IgcFilterRow<object>;
45
+ }
46
+ }
47
+ export {};
@@ -0,0 +1,313 @@
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 { IgcDropdownComponent, IgcInputComponent, } from 'igniteui-webcomponents';
9
+ import { html, LitElement, nothing } from 'lit';
10
+ import { property, query } from 'lit/decorators.js';
11
+ import { ifDefined } from 'lit/directives/if-defined.js';
12
+ import { gridStateContext } from '../controllers/state.js';
13
+ import { DEFAULT_COLUMN_CONFIG } from '../internal/constants.js';
14
+ import { registerComponent } from '../internal/register.js';
15
+ import { GRID_FILTER_ROW_TAG } from '../internal/tags.js';
16
+ import { getFilterOperandsFor } from '../internal/utils.js';
17
+ import { watch } from '../internal/watch.js';
18
+ import { styles } from '../styles/filter-row/filter-row.css.js';
19
+ function prefixedIcon(icon) {
20
+ return html `<igc-icon
21
+ slot="prefix"
22
+ name=${ifDefined(icon)}
23
+ collection="internal"
24
+ ></igc-icon>`;
25
+ }
26
+ export default class IgcFilterRow extends LitElement {
27
+ constructor() {
28
+ super(...arguments);
29
+ this.active = false;
30
+ this.column = DEFAULT_COLUMN_CONFIG;
31
+ }
32
+ static get tagName() {
33
+ return GRID_FILTER_ROW_TAG;
34
+ }
35
+ static { this.styles = styles; }
36
+ static register() {
37
+ registerComponent(IgcFilterRow);
38
+ }
39
+ get isNumeric() {
40
+ return this.column.type === 'number';
41
+ }
42
+ get filterController() {
43
+ return this.state.filtering;
44
+ }
45
+ get condition() {
46
+ return this.expression.condition;
47
+ }
48
+ #setDefaultExpression() {
49
+ this.expression = this.filterController.getDefaultExpression(this.column);
50
+ }
51
+ #removeExpression(expression) {
52
+ this.filterController.removeExpression(expression);
53
+ }
54
+ async #show() {
55
+ this.active = true;
56
+ await this.updateComplete;
57
+ this.input?.select();
58
+ }
59
+ #handleConditionChanged(event) {
60
+ event.stopPropagation();
61
+ const key = event.detail.value;
62
+ this.expression.condition = getFilterOperandsFor(this.column)[key];
63
+ if (this.input.value || this.expression.condition.unary) {
64
+ this.filterController.filterWithEvent(this.expression, 'modify');
65
+ }
66
+ this.requestUpdate();
67
+ }
68
+ #handleInput(event) {
69
+ event.stopPropagation();
70
+ const value = this.isNumeric ? Number.parseFloat(event.detail) : event.detail;
71
+ const shouldUpdate = this.isNumeric ? !Number.isNaN(value) : !!value;
72
+ const type = this.filterController.get(this.expression.key)?.has(this.expression)
73
+ ? 'modify'
74
+ : 'add';
75
+ if (shouldUpdate) {
76
+ this.expression.searchTerm = value;
77
+ this.filterController.filterWithEvent(this.expression, type);
78
+ }
79
+ else {
80
+ this.#removeExpression(this.expression);
81
+ }
82
+ this.requestUpdate();
83
+ }
84
+ #handleKeydown(event) {
85
+ event.stopPropagation();
86
+ switch (event.key) {
87
+ case 'Enter':
88
+ this.input.value = '';
89
+ this.#setDefaultExpression();
90
+ return;
91
+ case 'Escape':
92
+ this.active = false;
93
+ return;
94
+ default:
95
+ return;
96
+ }
97
+ }
98
+ #handleResetClick() {
99
+ this.filterController.removeAllExpressions(this.column.key);
100
+ this.requestUpdate();
101
+ }
102
+ #openDropdownList() {
103
+ this.dropdown.toggle(this.input);
104
+ }
105
+ activeChanged() {
106
+ this.style.display = this.active ? 'flex' : '';
107
+ if (!this.active) {
108
+ this.column = DEFAULT_COLUMN_CONFIG;
109
+ }
110
+ this.state.host.requestUpdate();
111
+ }
112
+ #chipCriteriaFor(expression) {
113
+ return async (e) => {
114
+ e.stopPropagation();
115
+ expression.criteria = expression.criteria === 'and' ? 'or' : 'and';
116
+ this.filterController.filterWithEvent(expression, 'modify');
117
+ this.requestUpdate();
118
+ };
119
+ }
120
+ #chipSelectFor(expression) {
121
+ return async (e) => {
122
+ e.stopPropagation();
123
+ this.expression = expression;
124
+ await this.updateComplete;
125
+ this.input?.select();
126
+ };
127
+ }
128
+ #chipRemoveFor(expression) {
129
+ return async (e) => {
130
+ e.stopPropagation();
131
+ this.#removeExpression(expression);
132
+ if (this.active && this.expression === expression) {
133
+ this.#setDefaultExpression();
134
+ await this.updateComplete;
135
+ this.input.focus();
136
+ }
137
+ this.requestUpdate();
138
+ };
139
+ }
140
+ renderCriteriaButton(expr, index) {
141
+ return index
142
+ ? html `<igc-button
143
+ variant="flat"
144
+ @click=${this.#chipCriteriaFor(expr)}
145
+ >
146
+ ${expr.criteria}
147
+ </igc-button>`
148
+ : nothing;
149
+ }
150
+ renderExpressionChip(props) {
151
+ const { name, unary } = props.expression.condition;
152
+ const { searchTerm: term } = props.expression;
153
+ const prefix = html `<span slot="select"></span>${prefixedIcon(name)}`;
154
+ return html `<igc-chip
155
+ selectable
156
+ removable
157
+ ?selected=${props.selected}
158
+ @igcRemove=${props.onRemove}
159
+ @igcSelect=${props.onSelect}
160
+ >
161
+ ${prefix}${unary ? name : term}
162
+ </igc-chip>`;
163
+ }
164
+ renderActiveChips() {
165
+ const state = this.filterController.get(this.column.key);
166
+ return !state
167
+ ? nothing
168
+ : Array.from(state).map((expression, idx) => {
169
+ const props = {
170
+ expression,
171
+ selected: this.expression === expression,
172
+ onRemove: this.#chipRemoveFor(expression),
173
+ onSelect: this.#chipSelectFor(expression),
174
+ };
175
+ return html `${this.renderCriteriaButton(expression, idx)}${this.renderExpressionChip(props)}`;
176
+ });
177
+ }
178
+ renderFilterActions() {
179
+ return html `
180
+ <igc-button
181
+ id="reset"
182
+ variant="flat"
183
+ @click=${this.#handleResetClick}
184
+ >
185
+ ${prefixedIcon('refresh')} Reset
186
+ </igc-button>
187
+ <igc-button
188
+ id="close"
189
+ variant="flat"
190
+ @click=${() => {
191
+ this.active = false;
192
+ }}
193
+ >
194
+ ${prefixedIcon('close')} Close
195
+ </igc-button>
196
+ `;
197
+ }
198
+ renderDropdown() {
199
+ return html `<igc-dropdown
200
+ flip
201
+ same-width
202
+ @igcChange=${this.#handleConditionChanged}
203
+ >
204
+ ${Object.entries(getFilterOperandsFor(this.column)).map(([key, operand]) => html `
205
+ <igc-dropdown-item
206
+ .value=${key}
207
+ ?selected=${this.condition.name === key}
208
+ >
209
+ ${prefixedIcon(key)}${operand?.label ?? key}
210
+ </igc-dropdown-item>
211
+ `)}
212
+ </igc-dropdown>`;
213
+ }
214
+ renderDropdownTarget() {
215
+ return html `<igc-icon
216
+ id="condition"
217
+ slot="prefix"
218
+ collection="internal"
219
+ .name=${this.condition.name}
220
+ @click=${this.#openDropdownList}
221
+ >
222
+ </igc-icon>`;
223
+ }
224
+ renderInputArea() {
225
+ return html `<igc-input
226
+ outlined
227
+ value=${ifDefined(this.expression.searchTerm)}
228
+ placeholder="Add filter value"
229
+ ?readonly=${this.condition.unary}
230
+ @igcInput=${this.#handleInput}
231
+ @keydown=${this.#handleKeydown}
232
+ >
233
+ ${this.renderDropdownTarget()}
234
+ </igc-input>
235
+ ${this.renderDropdown()}`;
236
+ }
237
+ renderActiveState() {
238
+ return html `<div part="active-state">
239
+ <div part="filter-row-input">${this.renderInputArea()}</div>
240
+ <div part="filter-row-filters">${this.renderActiveChips()}</div>
241
+ <div part="filter-row-actions">${this.renderFilterActions()}</div>
242
+ </div> `;
243
+ }
244
+ renderInactiveChips(column, state) {
245
+ return Array.from(state).map((expression, idx) => {
246
+ const props = {
247
+ expression,
248
+ selected: false,
249
+ onRemove: this.#chipRemoveFor(expression),
250
+ onSelect: async (e) => {
251
+ e.stopPropagation();
252
+ this.column = column;
253
+ this.expression = expression;
254
+ this.#show();
255
+ },
256
+ };
257
+ return html `${this.renderCriteriaButton(expression, idx)}${this.renderExpressionChip(props)}`;
258
+ });
259
+ }
260
+ renderFilterState(column) {
261
+ const state = this.filterController.get(column.key);
262
+ const partial = state && state.length < 3;
263
+ const hidden = state && state.length >= 3;
264
+ const open = () => {
265
+ this.column = column;
266
+ this.#setDefaultExpression();
267
+ this.#show();
268
+ };
269
+ const count = hidden ? html `<span slot="suffix">${state.length}</span>` : nothing;
270
+ const chip = html `<igc-chip
271
+ data-column=${column.key}
272
+ @click=${open}
273
+ >${prefixedIcon('filter')}Filter${count}</igc-chip
274
+ >`;
275
+ return partial ? this.renderInactiveChips(column, state) : chip;
276
+ }
277
+ renderInactiveState() {
278
+ return this.state.host.columns.map((column) => column.hidden
279
+ ? nothing
280
+ : html `<div part="filter-row-preview">
281
+ ${column.filter ? this.renderFilterState(column) : nothing}
282
+ </div>`);
283
+ }
284
+ render() {
285
+ return html `${this.active ? this.renderActiveState() : this.renderInactiveState()}`;
286
+ }
287
+ }
288
+ __decorate([
289
+ consume({ context: gridStateContext, subscribe: true }),
290
+ property({ attribute: false })
291
+ ], IgcFilterRow.prototype, "state", void 0);
292
+ __decorate([
293
+ property({ attribute: false })
294
+ ], IgcFilterRow.prototype, "active", void 0);
295
+ __decorate([
296
+ query(IgcInputComponent.tagName)
297
+ ], IgcFilterRow.prototype, "input", void 0);
298
+ __decorate([
299
+ query('#condition')
300
+ ], IgcFilterRow.prototype, "conditionElement", void 0);
301
+ __decorate([
302
+ query(IgcDropdownComponent.tagName)
303
+ ], IgcFilterRow.prototype, "dropdown", void 0);
304
+ __decorate([
305
+ property({ attribute: false })
306
+ ], IgcFilterRow.prototype, "column", void 0);
307
+ __decorate([
308
+ property({ attribute: false })
309
+ ], IgcFilterRow.prototype, "expression", void 0);
310
+ __decorate([
311
+ watch('active', { waitUntilFirstUpdate: true })
312
+ ], IgcFilterRow.prototype, "activeChanged", null);
313
+ //# sourceMappingURL=filter-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-row.js","sourceRoot":"","sources":["../../src/components/filter-row.ts"],"names":[],"mappings":"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","sourcesContent":["import { consume } from '@lit/context';\nimport {\n IgcDropdownComponent,\n type IgcDropdownItemComponent,\n type IgcIconComponent,\n IgcInputComponent,\n} from 'igniteui-webcomponents';\nimport { html, LitElement, nothing } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { gridStateContext, type StateController } from '../controllers/state.js';\nimport { DEFAULT_COLUMN_CONFIG } from '../internal/constants.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_FILTER_ROW_TAG } from '../internal/tags.js';\nimport type { ColumnConfiguration } from '../internal/types.js';\nimport { getFilterOperandsFor } from '../internal/utils.js';\nimport { watch } from '../internal/watch.js';\nimport type { FilterExpressionTree } from '../operations/filter/tree.js';\nimport type { FilterExpression, FilterOperation, OperandKeys } from '../operations/filter/types.js';\nimport { styles } from '../styles/filter-row/filter-row.css.js';\n\ntype ExpressionChipProps<T> = {\n expression: FilterExpression<T>;\n selected: boolean;\n onRemove: (e: Event) => Promise<void>;\n onSelect: (e: Event) => Promise<void>;\n};\n\nfunction prefixedIcon(icon?: string) {\n return html`<igc-icon\n slot=\"prefix\"\n name=${ifDefined(icon)}\n collection=\"internal\"\n ></igc-icon>`;\n}\n\nexport default class IgcFilterRow<T extends object> extends LitElement {\n public static get tagName() {\n return GRID_FILTER_ROW_TAG;\n }\n\n public static override styles = styles;\n\n public static register() {\n registerComponent(IgcFilterRow);\n }\n\n @consume({ context: gridStateContext, subscribe: true })\n @property({ attribute: false })\n public state!: StateController<T>;\n\n protected get isNumeric() {\n return this.column.type === 'number';\n }\n\n protected get filterController() {\n return this.state.filtering;\n }\n\n protected get condition() {\n return this.expression.condition as FilterOperation<T>;\n }\n\n @property({ attribute: false })\n public active = false;\n\n @query(IgcInputComponent.tagName)\n public input!: IgcInputComponent;\n\n @query('#condition')\n public conditionElement!: IgcIconComponent;\n\n @query(IgcDropdownComponent.tagName)\n public dropdown!: IgcDropdownComponent;\n\n @property({ attribute: false })\n public column: ColumnConfiguration<T> = DEFAULT_COLUMN_CONFIG as ColumnConfiguration<T>;\n\n @property({ attribute: false })\n public expression!: FilterExpression<T>;\n\n #setDefaultExpression() {\n this.expression = this.filterController.getDefaultExpression(this.column);\n }\n\n #removeExpression(expression: FilterExpression<T>) {\n this.filterController.removeExpression(expression);\n }\n\n async #show() {\n this.active = true;\n\n await this.updateComplete;\n this.input?.select();\n }\n\n #handleConditionChanged(event: CustomEvent<IgcDropdownItemComponent>) {\n event.stopPropagation();\n const key = event.detail.value as OperandKeys<T[typeof this.column.key]>;\n\n // XXX: Types\n this.expression.condition = (getFilterOperandsFor(this.column) as any)[key] as FilterOperation<\n T[keyof T]\n >;\n\n if (this.input.value || this.expression.condition.unary) {\n this.filterController.filterWithEvent(this.expression, 'modify');\n }\n\n this.requestUpdate();\n }\n\n #handleInput(event: CustomEvent<string>) {\n event.stopPropagation();\n\n const value = this.isNumeric ? Number.parseFloat(event.detail) : event.detail;\n const shouldUpdate = this.isNumeric ? !Number.isNaN(value as number) : !!value;\n const type = this.filterController.get(this.expression.key)?.has(this.expression)\n ? 'modify'\n : 'add';\n\n if (shouldUpdate) {\n this.expression.searchTerm = value as any;\n\n this.filterController.filterWithEvent(this.expression, type);\n } else {\n this.#removeExpression(this.expression);\n }\n\n this.requestUpdate();\n }\n\n #handleKeydown(event: KeyboardEvent) {\n event.stopPropagation();\n\n switch (event.key) {\n case 'Enter':\n this.input.value = '';\n this.#setDefaultExpression();\n return;\n case 'Escape':\n this.active = false;\n return;\n default:\n return;\n }\n }\n\n #handleResetClick() {\n this.filterController.removeAllExpressions(this.column.key);\n this.requestUpdate();\n }\n\n #openDropdownList() {\n this.dropdown.toggle(this.input);\n }\n\n @watch('active', { waitUntilFirstUpdate: true })\n protected activeChanged() {\n this.style.display = this.active ? 'flex' : '';\n\n if (!this.active) {\n this.column = DEFAULT_COLUMN_CONFIG as ColumnConfiguration<T>;\n }\n\n this.state.host.requestUpdate();\n }\n\n #chipCriteriaFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n\n expression.criteria = expression.criteria === 'and' ? 'or' : 'and';\n this.filterController.filterWithEvent(expression, 'modify');\n this.requestUpdate();\n };\n }\n\n #chipSelectFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n this.expression = expression;\n await this.updateComplete;\n this.input?.select();\n };\n }\n\n #chipRemoveFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n this.#removeExpression(expression);\n\n if (this.active && this.expression === expression) {\n this.#setDefaultExpression();\n await this.updateComplete;\n this.input.focus();\n }\n\n this.requestUpdate();\n };\n }\n\n protected renderCriteriaButton(expr: FilterExpression<T>, index: number) {\n return index\n ? html`<igc-button\n variant=\"flat\"\n @click=${this.#chipCriteriaFor(expr)}\n >\n ${expr.criteria}\n </igc-button>`\n : nothing;\n }\n\n protected renderExpressionChip(props: ExpressionChipProps<T>) {\n const { name, unary } = props.expression.condition as FilterOperation<T>;\n const { searchTerm: term } = props.expression;\n\n const prefix = html`<span slot=\"select\"></span>${prefixedIcon(name)}`;\n\n return html`<igc-chip\n selectable\n removable\n ?selected=${props.selected}\n @igcRemove=${props.onRemove}\n @igcSelect=${props.onSelect}\n >\n ${prefix}${unary ? name : term}\n </igc-chip>`;\n }\n\n protected renderActiveChips() {\n const state = this.filterController.get(this.column.key);\n\n return !state\n ? nothing\n : Array.from(state).map((expression, idx) => {\n const props: ExpressionChipProps<T> = {\n expression,\n selected: this.expression === expression,\n onRemove: this.#chipRemoveFor(expression),\n onSelect: this.#chipSelectFor(expression),\n };\n\n return html`${this.renderCriteriaButton(expression, idx)}${this.renderExpressionChip(\n props\n )}`;\n });\n }\n\n protected renderFilterActions() {\n return html`\n <igc-button\n id=\"reset\"\n variant=\"flat\"\n @click=${this.#handleResetClick}\n >\n ${prefixedIcon('refresh')} Reset\n </igc-button>\n <igc-button\n id=\"close\"\n variant=\"flat\"\n @click=${() => {\n this.active = false;\n }}\n >\n ${prefixedIcon('close')} Close\n </igc-button>\n `;\n }\n\n protected renderDropdown() {\n return html`<igc-dropdown\n flip\n same-width\n @igcChange=${this.#handleConditionChanged}\n >\n ${Object.entries(getFilterOperandsFor(this.column)).map(\n ([key, operand]) => html`\n <igc-dropdown-item\n .value=${key}\n ?selected=${this.condition.name === key}\n >\n ${prefixedIcon(key)}${operand?.label ?? key}\n </igc-dropdown-item>\n `\n )}\n </igc-dropdown>`;\n }\n\n protected renderDropdownTarget() {\n return html`<igc-icon\n id=\"condition\"\n slot=\"prefix\"\n collection=\"internal\"\n .name=${this.condition.name}\n @click=${this.#openDropdownList}\n >\n </igc-icon>`;\n }\n\n protected renderInputArea() {\n return html`<igc-input\n outlined\n value=${ifDefined(this.expression.searchTerm)}\n placeholder=\"Add filter value\"\n ?readonly=${this.condition.unary}\n @igcInput=${this.#handleInput}\n @keydown=${this.#handleKeydown}\n >\n ${this.renderDropdownTarget()}\n </igc-input>\n ${this.renderDropdown()}`;\n }\n\n protected renderActiveState() {\n return html`<div part=\"active-state\">\n <div part=\"filter-row-input\">${this.renderInputArea()}</div>\n <div part=\"filter-row-filters\">${this.renderActiveChips()}</div>\n <div part=\"filter-row-actions\">${this.renderFilterActions()}</div>\n </div> `;\n }\n\n protected renderInactiveChips(column: ColumnConfiguration<T>, state: FilterExpressionTree<T>) {\n return Array.from(state).map((expression, idx) => {\n const props: ExpressionChipProps<T> = {\n expression,\n selected: false,\n onRemove: this.#chipRemoveFor(expression),\n onSelect: async (e: Event) => {\n e.stopPropagation();\n this.column = column;\n this.expression = expression;\n this.#show();\n },\n };\n\n return html`${this.renderCriteriaButton(expression, idx)}${this.renderExpressionChip(props)}`;\n });\n }\n\n protected renderFilterState(column: ColumnConfiguration<T>) {\n const state = this.filterController.get(column.key);\n\n const partial = state && state.length < 3;\n const hidden = state && state.length >= 3;\n\n const open = () => {\n this.column = column;\n this.#setDefaultExpression();\n this.#show();\n };\n\n const count = hidden ? html`<span slot=\"suffix\">${state.length}</span>` : nothing;\n const chip = html`<igc-chip\n data-column=${column.key}\n @click=${open}\n >${prefixedIcon('filter')}Filter${count}</igc-chip\n >`;\n\n return partial ? this.renderInactiveChips(column, state) : chip;\n }\n\n protected renderInactiveState() {\n return this.state.host.columns.map((column) =>\n column.hidden\n ? nothing\n : html`<div part=\"filter-row-preview\">\n ${column.filter ? this.renderFilterState(column) : nothing}\n </div>`\n );\n }\n\n protected override render() {\n return html`${this.active ? this.renderActiveState() : this.renderInactiveState()}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcFilterRow.tagName]: IgcFilterRow<object>;\n }\n}\n"]}