igniteui-grid-lite 0.10.0 → 0.11.0

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 (90) hide show
  1. package/components/cell.d.ts +5 -17
  2. package/components/cell.js +2 -2
  3. package/components/cell.js.map +1 -1
  4. package/components/filter-row.d.ts +2 -5
  5. package/components/filter-row.js +22 -27
  6. package/components/filter-row.js.map +1 -1
  7. package/components/grid.d.ts +10 -15
  8. package/components/grid.js +33 -36
  9. package/components/grid.js.map +1 -1
  10. package/components/header-row.js +2 -1
  11. package/components/header-row.js.map +1 -1
  12. package/components/header.js +2 -6
  13. package/components/header.js.map +1 -1
  14. package/components/row.d.ts +0 -3
  15. package/components/row.js +3 -3
  16. package/components/row.js.map +1 -1
  17. package/controllers/data-operation.d.ts +1 -3
  18. package/controllers/data-operation.js +0 -2
  19. package/controllers/data-operation.js.map +1 -1
  20. package/controllers/dom.d.ts +4 -16
  21. package/controllers/dom.js +14 -13
  22. package/controllers/dom.js.map +1 -1
  23. package/controllers/filter.d.ts +10 -22
  24. package/controllers/filter.js +14 -8
  25. package/controllers/filter.js.map +1 -1
  26. package/controllers/navigation.d.ts +4 -9
  27. package/controllers/navigation.js +23 -43
  28. package/controllers/navigation.js.map +1 -1
  29. package/controllers/resize.d.ts +3 -9
  30. package/controllers/resize.js +2 -7
  31. package/controllers/resize.js.map +1 -1
  32. package/controllers/sort.d.ts +3 -5
  33. package/controllers/sort.js +19 -14
  34. package/controllers/sort.js.map +1 -1
  35. package/controllers/state.d.ts +2 -13
  36. package/controllers/state.js +12 -10
  37. package/controllers/state.js.map +1 -1
  38. package/custom-elements.json +201 -350
  39. package/docs/igniteui-grid-lite.json +849 -859
  40. package/internal/a11y.d.ts +2 -5
  41. package/internal/a11y.js.map +1 -1
  42. package/internal/body-focus.d.ts +6 -0
  43. package/internal/body-focus.js +46 -0
  44. package/internal/body-focus.js.map +1 -0
  45. package/internal/constants.d.ts +4 -1
  46. package/internal/constants.js +2 -0
  47. package/internal/constants.js.map +1 -1
  48. package/internal/element-from-event-path.d.ts +1 -1
  49. package/internal/element-from-event-path.js +2 -9
  50. package/internal/element-from-event-path.js.map +1 -1
  51. package/internal/tags.d.ts +0 -1
  52. package/internal/tags.js +0 -1
  53. package/internal/tags.js.map +1 -1
  54. package/internal/types.d.ts +6 -7
  55. package/internal/types.js.map +1 -1
  56. package/internal/utils.d.ts +4 -8
  57. package/internal/utils.js +7 -3
  58. package/internal/utils.js.map +1 -1
  59. package/operations/base.js +2 -2
  60. package/operations/base.js.map +1 -1
  61. package/operations/filter/state.d.ts +0 -1
  62. package/operations/filter/state.js +0 -3
  63. package/operations/filter/state.js.map +1 -1
  64. package/operations/filter/types.d.ts +1 -1
  65. package/operations/filter/types.js.map +1 -1
  66. package/operations/filter.js +3 -2
  67. package/operations/filter.js.map +1 -1
  68. package/operations/sort/types.d.ts +1 -1
  69. package/operations/sort/types.js.map +1 -1
  70. package/operations/sort.js +5 -1
  71. package/operations/sort.js.map +1 -1
  72. package/package.json +2 -3
  73. package/styles/header-cell/header-cell.css.js +1 -1
  74. package/styles/header-cell/header-cell.css.js.map +1 -1
  75. package/styles/themes/filtering-row-themes.js +2 -30
  76. package/styles/themes/filtering-row-themes.js.map +1 -1
  77. package/styles/themes/grid-header-themes.js +2 -20
  78. package/styles/themes/grid-header-themes.js.map +1 -1
  79. package/styles/themes/grid-themes.js +10 -31
  80. package/styles/themes/grid-themes.js.map +1 -1
  81. package/styles/themes/grid.base.css.js +1 -1
  82. package/styles/themes/grid.base.css.js.map +1 -1
  83. package/styles/themes/shared/grid.common.css.js +1 -1
  84. package/styles/themes/shared/grid.common.css.js.map +1 -1
  85. package/components/virtualizer.d.ts +0 -14
  86. package/components/virtualizer.js +0 -49
  87. package/components/virtualizer.js.map +0 -1
  88. package/internal/virt-flow-layout.d.ts +0 -4
  89. package/internal/virt-flow-layout.js +0 -15
  90. package/internal/virt-flow-layout.js.map +0 -1
@@ -1,9 +1,6 @@
1
1
  import { LitElement, type PropertyValues } from 'lit';
2
2
  import type { ColumnConfiguration, IgcCellContext, PropertyType } from '../internal/types.js';
3
3
  import type IgcGridLiteRow from './row.js';
4
- /**
5
- * Component representing a DOM cell of the Igc grid.
6
- */
7
4
  export default class IgcGridLiteCell<T extends object> extends LitElement {
8
5
  static get tagName(): "igc-grid-lite-cell";
9
6
  static styles: import("lit").CSSResult;
@@ -18,22 +15,13 @@ export default class IgcGridLiteCell<T extends object> extends LitElement {
18
15
  * @internal
19
16
  */
20
17
  _colIndex: number;
21
- /**
22
- * The value which will be rendered by the component.
23
- */
18
+ /** The rendered value. */
24
19
  value: PropertyType<T>;
25
- /**
26
- * A reference to the column configuration object.
27
- */
20
+ /** The column configuration. */
28
21
  column: ColumnConfiguration<T>;
29
- /**
30
- * Indicates whether this is the active cell in the grid.
31
- *
32
- */
22
+ /** Whether this is the active cell in the grid. */
33
23
  active: boolean;
34
- /**
35
- * The parent row component holding this cell.
36
- */
24
+ /** The parent row. */
37
25
  row: IgcGridLiteRow<T>;
38
26
  rowIndex: number;
39
27
  cellTemplate?: (context: IgcCellContext<T>) => unknown;
@@ -41,7 +29,7 @@ export default class IgcGridLiteCell<T extends object> extends LitElement {
41
29
  private get _shouldAdoptStyles();
42
30
  connectedCallback(): void;
43
31
  protected update(props: PropertyValues<this>): void;
44
- protected render(): import("lit-html").TemplateResult<1>;
32
+ protected render(): import("lit-html/directive.js").DirectiveResult<typeof import("lit-html/directives/cache.js").CacheDirective>;
45
33
  }
46
34
  declare global {
47
35
  interface HTMLElementTagNameMap {
@@ -56,9 +56,9 @@ export default class IgcGridLiteCell extends LitElement {
56
56
  super.update(props);
57
57
  }
58
58
  render() {
59
- return html `${cache(this.cellTemplate
59
+ return cache(this.cellTemplate
60
60
  ? this.cellTemplate(this.context)
61
- : html `<span part="text">${this.value}</span>`)}`;
61
+ : html `<span part="text">${this.value}</span>`);
62
62
  }
63
63
  }
64
64
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"cell.js","sourceRoot":"","sources":["../../src/components/cell.ts"],"names":[],"mappings":"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","sourcesContent":["import { θaddAdoptedStylesController as addAdoptedStylesController } from 'igniteui-webcomponents';\nimport { html, LitElement, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { cache } from 'lit/directives/cache.js';\nimport { addA11y } from '../internal/a11y.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 private readonly _adoptedStylesController = addAdoptedStylesController(this);\n private readonly _a11y = addA11y(this, 'gridcell');\n\n @property({ attribute: false })\n public adoptRootStyles = false;\n\n /**\n * Position of the cell among the visible columns. Written as its 1-based\n * `aria-colindex`.\n *\n * @internal\n */\n @property({ attribute: false })\n public _colIndex = -1;\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 @property({ attribute: false })\n public row!: IgcGridLiteRow<T>;\n\n @property({ attribute: false })\n public rowIndex = -1;\n\n @property({ attribute: false })\n public cellTemplate?: (context: IgcCellContext<T>) => unknown;\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 private get _shouldAdoptStyles(): boolean {\n return this.adoptRootStyles && this.cellTemplate != null;\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n\n // Roving focus target. Navigation moves DOM focus here so that assistive\n // technology announces the cell.\n this.tabIndex = -1;\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n protected override update(props: PropertyValues<this>): void {\n if (props.has('adoptRootStyles') || props.has('cellTemplate')) {\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n // The grid has no cell selection. `aria-selected` marks only the active cell.\n this._a11y.set({\n ariaColIndex: `${this._colIndex}`,\n ariaSelected: this.active ? 'true' : null,\n });\n\n super.update(props);\n }\n\n protected override render() {\n return html`${cache(\n this.cellTemplate\n ? this.cellTemplate(this.context as any)\n : html`<span part=\"text\">${this.value}</span>`\n )}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcGridLiteCell.tagName]: IgcGridLiteCell<object>;\n }\n}\n"]}
1
+ {"version":3,"file":"cell.js","sourceRoot":"","sources":["../../src/components/cell.ts"],"names":[],"mappings":"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","sourcesContent":["import { θaddAdoptedStylesController as addAdoptedStylesController } from 'igniteui-webcomponents';\nimport { html, LitElement, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { cache } from 'lit/directives/cache.js';\nimport { addA11y } from '../internal/a11y.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\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 private readonly _adoptedStylesController = addAdoptedStylesController(this);\n private readonly _a11y = addA11y(this, 'gridcell');\n\n @property({ attribute: false })\n public adoptRootStyles = false;\n\n /**\n * Position of the cell among the visible columns. Written as its 1-based\n * `aria-colindex`.\n *\n * @internal\n */\n @property({ attribute: false })\n public _colIndex = -1;\n\n /** The rendered value. */\n @property({ attribute: false })\n public value!: PropertyType<T>;\n\n /** The column configuration. */\n @property({ attribute: false })\n public column!: ColumnConfiguration<T>;\n\n /** Whether this is the active cell in the grid. */\n @property({ type: Boolean, reflect: true })\n public active = false;\n\n /** The parent row. */\n @property({ attribute: false })\n public row!: IgcGridLiteRow<T>;\n\n @property({ attribute: false })\n public rowIndex = -1;\n\n @property({ attribute: false })\n public cellTemplate?: (context: IgcCellContext<T>) => unknown;\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 private get _shouldAdoptStyles(): boolean {\n return this.adoptRootStyles && this.cellTemplate != null;\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n\n // Roving focus target: focus here announces the cell.\n this.tabIndex = -1;\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n protected override update(props: PropertyValues<this>): void {\n if (props.has('adoptRootStyles') || props.has('cellTemplate')) {\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n // The grid has no cell selection. `aria-selected` marks only the active cell.\n this._a11y.set({\n ariaColIndex: `${this._colIndex}`,\n ariaSelected: this.active ? 'true' : null,\n });\n\n super.update(props);\n }\n\n protected override render() {\n return cache(\n this.cellTemplate\n ? this.cellTemplate(this.context)\n : html`<span part=\"text\">${this.value}</span>`\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcGridLiteCell.tagName]: IgcGridLiteCell<object>;\n }\n}\n"]}
@@ -14,10 +14,7 @@ export default class IgcFilterRow<T extends object> extends LitElement {
14
14
  #private;
15
15
  static get tagName(): "igc-grid-lite-filter-row";
16
16
  static styles: import("lit").CSSResult;
17
- /**
18
- * Only the filter row renders these editor components, so the grid defers this
19
- * call until a filterable column shows one.
20
- */
17
+ /** Deferred by the grid until a filterable column shows: only this row uses the editors. */
21
18
  static register(): void;
22
19
  private readonly _adoptedStylesController;
23
20
  state: StateController<T>;
@@ -47,7 +44,7 @@ export default class IgcFilterRow<T extends object> extends LitElement {
47
44
  protected renderInactiveChips(column: ColumnConfiguration<T>, state: FilterExpressionTree<T>): import("lit-html").TemplateResult<1>[];
48
45
  protected renderFilterState(column: ColumnConfiguration<T>): import("lit-html").TemplateResult<1> | import("lit-html").TemplateResult<1>[];
49
46
  protected renderInactiveState(): import("lit-html").TemplateResult<1>[];
50
- protected render(): import("lit-html").TemplateResult<1>;
47
+ protected render(): import("lit-html").TemplateResult<1> | import("lit-html").TemplateResult<1>[];
51
48
  }
52
49
  declare global {
53
50
  interface HTMLElementTagNameMap {
@@ -14,7 +14,7 @@ import { DEFAULT_COLUMN_CONFIG } from '../internal/constants.js';
14
14
  import { GRID_STATE_CONTEXT } from '../internal/context.js';
15
15
  import { registerComponent } from '../internal/register.js';
16
16
  import { GRID_FILTER_ROW_TAG } from '../internal/tags.js';
17
- import { getFilterOperandsFor, resolveCondition } from '../internal/utils.js';
17
+ import { getFilterOperandsFor, resolveCondition, visibleColumns } from '../internal/utils.js';
18
18
  import { watch } from '../internal/watch.js';
19
19
  import { styles } from '../styles/filter-row/filter-row.css.js';
20
20
  import { all } from '../styles/themes/filtering-row-themes.js';
@@ -76,14 +76,14 @@ export default class IgcFilterRow extends LitElement {
76
76
  #setDefaultExpression() {
77
77
  this.expression = this.filterController.getDefaultExpression(this.column);
78
78
  }
79
- #removeExpression(expression) {
80
- this.filterController.removeExpression(expression);
81
- }
82
- async #show() {
83
- this.active = true;
79
+ async #selectInput() {
84
80
  await this.updateComplete;
85
81
  this.input?.select();
86
82
  }
83
+ #show() {
84
+ this.active = true;
85
+ this.#selectInput();
86
+ }
87
87
  #handleConditionChanged(event) {
88
88
  event.stopPropagation();
89
89
  const condition = resolveCondition(this.column, event.detail.value);
@@ -99,14 +99,14 @@ export default class IgcFilterRow extends LitElement {
99
99
  event.stopPropagation();
100
100
  const value = this.isNumeric ? Number.parseFloat(event.detail) : event.detail;
101
101
  const shouldUpdate = this.isNumeric ? !Number.isNaN(value) : !!value;
102
- const type = this.filterController.get(this.expression.key)?.has(this.expression)
103
- ? 'modify'
104
- : 'add';
105
102
  if (shouldUpdate) {
103
+ const type = this.filterController.get(this.expression.key)?.has(this.expression)
104
+ ? 'modify'
105
+ : 'add';
106
106
  this.filterController.filterWithEvent({ ...this.expression, searchTerm: value }, type, this.expression);
107
107
  }
108
108
  else {
109
- this.#removeExpression(this.expression);
109
+ this.filterController.removeExpression(this.expression);
110
110
  }
111
111
  this.requestUpdate();
112
112
  }
@@ -120,8 +120,6 @@ export default class IgcFilterRow extends LitElement {
120
120
  case 'Escape':
121
121
  this.active = false;
122
122
  return;
123
- default:
124
- return;
125
123
  }
126
124
  }
127
125
  #handleResetClick() {
@@ -162,14 +160,13 @@ export default class IgcFilterRow extends LitElement {
162
160
  return async (e) => {
163
161
  e.stopPropagation();
164
162
  this.expression = expression;
165
- await this.updateComplete;
166
- this.input?.select();
163
+ await this.#selectInput();
167
164
  };
168
165
  }
169
166
  #chipRemoveFor(expression) {
170
167
  return async (e) => {
171
168
  e.stopPropagation();
172
- this.#removeExpression(expression);
169
+ this.filterController.removeExpression(expression);
173
170
  if (this.active && this.expression === expression) {
174
171
  this.#setDefaultExpression();
175
172
  await this.updateComplete;
@@ -332,20 +329,18 @@ export default class IgcFilterRow extends LitElement {
332
329
  >`;
333
330
  }
334
331
  renderInactiveState() {
335
- return this.state.columns
336
- .filter((column) => !column.hidden)
337
- .map((column, index) => html `
338
- <div
339
- part="filter-row-preview"
340
- role="gridcell"
341
- aria-colindex=${index + 1}
342
- >
343
- ${column.filterable ? this.renderFilterState(column) : nothing}
344
- </div>
345
- `);
332
+ return visibleColumns(this.state.columns).map((column, index) => html `
333
+ <div
334
+ part="filter-row-preview"
335
+ role="gridcell"
336
+ aria-colindex=${index + 1}
337
+ >
338
+ ${column.filterable ? this.renderFilterState(column) : nothing}
339
+ </div>
340
+ `);
346
341
  }
347
342
  render() {
348
- return html `${this.active ? this.renderActiveState() : this.renderInactiveState()}`;
343
+ return this.active ? this.renderActiveState() : this.renderInactiveState();
349
344
  }
350
345
  }
351
346
  __decorate([
@@ -1 +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 θaddAdoptedStylesController as addAdoptedStylesController,\n θaddThemingController as addThemingController,\n IgcButtonComponent,\n IgcChipComponent,\n IgcDropdownComponent,\n type IgcDropdownItemComponent,\n type IgcIconComponent,\n IgcInputComponent,\n} from 'igniteui-webcomponents';\nimport { html, LitElement, nothing, type PropertyValues } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport type { StateController } from '../controllers/state.js';\nimport { addA11y, FILTER_ROW_INDEX } from '../internal/a11y.js';\nimport { DEFAULT_COLUMN_CONFIG } from '../internal/constants.js';\nimport { GRID_STATE_CONTEXT } from '../internal/context.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_FILTER_ROW_TAG } from '../internal/tags.js';\nimport type { ColumnConfiguration, Keys, PropertyType } from '../internal/types.js';\nimport { getFilterOperandsFor, resolveCondition } from '../internal/utils.js';\nimport { watch } from '../internal/watch.js';\nimport type { FilterExpressionTree } from '../operations/filter/tree.js';\nimport type { FilterExpression, FilterOperation } from '../operations/filter/types.js';\nimport { styles } from '../styles/filter-row/filter-row.css.js';\nimport { all } from '../styles/themes/filtering-row-themes.js';\n\n/** Number of filter expressions shown as chips before collapsing into a single counted chip. */\nconst MAX_PREVIEW_CHIPS = 3;\n\n/** Accessible name of the filter row itself. */\nconst FILTER_ROW_LABEL = 'Column filters';\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`\n <igc-icon\n slot=\"prefix\"\n name=${ifDefined(icon)}\n collection=\"internal\"\n ></igc-icon>\n `;\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 /**\n * Only the filter row renders these editor components, so the grid defers this\n * call until a filterable column shows one.\n */\n public static register() {\n registerComponent(\n IgcFilterRow,\n IgcButtonComponent,\n IgcChipComponent,\n IgcInputComponent,\n IgcDropdownComponent\n );\n }\n\n private readonly _adoptedStylesController = addAdoptedStylesController(this);\n\n @consume({ context: GRID_STATE_CONTEXT, subscribe: true })\n @property({ attribute: false })\n public state!: StateController<T>;\n\n protected get isNumeric() {\n return this.column.dataType === '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 @property({ attribute: false })\n public adoptRootStyles = false;\n\n constructor() {\n super();\n\n // `role=grid` permits only rows and rowgroups as children, so a `search`\n // landmark here would be an illegal node in the grid tree. The filter row is\n // modeled as the second header row: one `gridcell` per column, each with that\n // column's filter controls.\n addA11y(this, 'row').set({\n ariaRowIndex: `${FILTER_ROW_INDEX}`,\n ariaLabel: FILTER_ROW_LABEL,\n });\n\n addThemingController(this, all, {\n themeChange: this._handleThemeChange,\n });\n }\n\n private get _shouldAdoptStyles(): boolean {\n return this.adoptRootStyles && this.column.headerTemplate != null;\n }\n\n private _handleThemeChange() {\n this._adoptedStylesController.invalidateCache(this.ownerDocument);\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n protected override update(props: PropertyValues<this>): void {\n if (props.has('adoptRootStyles')) {\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n super.update(props);\n }\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\n const condition = resolveCondition(this.column, event.detail.value) as FilterOperation<\n PropertyType<T, keyof T>\n >;\n\n if (this.input.value || condition.unary) {\n this.filterController.filterWithEvent(\n { ...this.expression, condition },\n 'modify',\n this.expression\n );\n } else {\n // Nothing to filter by yet - the condition is only staged in the UI.\n this.expression.condition = condition;\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.filterController.filterWithEvent(\n { ...this.expression, searchTerm: value as any },\n type,\n this.expression\n );\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.field);\n this.requestUpdate();\n }\n\n #openDropdownList() {\n this.dropdown.toggle(this.input);\n }\n\n #handleConditionKeydown(event: KeyboardEvent) {\n if (event.key !== 'Enter' && event.key !== ' ') {\n return;\n }\n\n // The trigger sits in the prefix slot of the input. The keystroke must not\n // reach the input and commit a filter behind the open dropdown.\n event.preventDefault();\n event.stopPropagation();\n\n this.#openDropdownList();\n }\n\n /** Header text of a column. Names the filter controls that act on it. */\n #nameFor(field: Keys<T>): string {\n const column = this.state.columns.find((each) => each.field === field);\n return String(column?.header ?? field);\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 // The header row marks the column whose filter editor is open.\n this.state.updateObservers();\n }\n\n #chipCriteriaFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n\n const criteria = expression.criteria === 'and' ? 'or' : 'and';\n\n this.filterController.filterWithEvent({ ...expression, criteria }, 'modify', expression);\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`\n <igc-button\n variant=\"flat\"\n @click=${this.#chipCriteriaFor(expr)}\n >\n ${expr.criteria}\n </igc-button>\n `\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 // The chip renders its select and remove actions in its own shadow root.\n // Resource strings are the only way to name them after the expression.\n const expression = `${this.#nameFor(props.expression.key)} ${name} ${unary ? '' : term}`.trim();\n\n return html`\n <igc-chip\n selectable\n removable\n .resourceStrings=${{\n chip_remove: `Remove filter ${expression}`,\n chip_select: `Edit filter ${expression}`,\n }}\n ?selected=${props.selected}\n @igcRemove=${props.onRemove}\n @igcSelect=${props.onSelect}\n >\n ${prefix}${unary ? name : term}\n </igc-chip>\n `;\n }\n\n /** Chip list for a column's filter state. `onSelectFor` builds each chip's select action. */\n #renderChips(\n state: FilterExpressionTree<T>,\n onSelectFor: (expression: FilterExpression<T>) => (e: Event) => Promise<void>\n ) {\n return Array.from(state).map((expression, idx) => {\n const props: ExpressionChipProps<T> = {\n expression,\n selected: this.active && this.expression === expression,\n onRemove: this.#chipRemoveFor(expression),\n onSelect: onSelectFor(expression),\n };\n\n return html`${this.renderCriteriaButton(expression, idx)}${this.renderExpressionChip(props)}`;\n });\n }\n\n protected renderActiveChips() {\n const state = this.filterController.get(this.column.field);\n\n return state ? this.#renderChips(state, (expr) => this.#chipSelectFor(expr)) : nothing;\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 const condition = this.condition.label ?? this.condition.name;\n\n return html`<igc-icon\n id=\"condition\"\n slot=\"prefix\"\n collection=\"internal\"\n role=\"button\"\n tabindex=\"0\"\n aria-haspopup=\"listbox\"\n aria-label=${`Filter condition: ${condition}`}\n .name=${this.condition.name}\n @click=${this.#openDropdownList}\n @keydown=${this.#handleConditionKeydown}\n >\n </igc-icon>`;\n }\n\n protected renderInputArea() {\n // `igc-input` names its inner control from a slotted label or the placeholder\n // only, so the placeholder carries the column name.\n return html`\n <igc-input\n outlined\n value=${ifDefined(this.expression.searchTerm)}\n placeholder=${`Filter ${this.#nameFor(this.column.field)}`}\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\n protected renderActiveState() {\n return html`\n <div\n part=\"active-state\"\n role=\"gridcell\"\n >\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\n protected renderInactiveChips(column: ColumnConfiguration<T>, state: FilterExpressionTree<T>) {\n return this.#renderChips(state, (expression) => async (e: Event) => {\n e.stopPropagation();\n this.column = column;\n this.expression = expression;\n this.#show();\n });\n }\n\n protected renderFilterState(column: ColumnConfiguration<T>) {\n const state = this.filterController.get(column.field);\n\n // A short expression list renders inline. A longer one collapses into a\n // single chip carrying the expression count.\n if (state && state.length < MAX_PREVIEW_CHIPS) {\n return this.renderInactiveChips(column, state);\n }\n\n const open = () => {\n this.column = column;\n this.#setDefaultExpression();\n this.#show();\n };\n\n const count = state ? html`<span slot=\"suffix\">${state.length}</span>` : nothing;\n\n return html`<igc-chip\n data-column=${column.field}\n aria-label=${`Filter ${this.#nameFor(column.field)}`}\n @click=${open}\n >${prefixedIcon('filter')}Filter${count}</igc-chip\n >`;\n }\n\n protected renderInactiveState() {\n return this.state.columns\n .filter((column) => !column.hidden)\n .map(\n (column, index) => html`\n <div\n part=\"filter-row-preview\"\n role=\"gridcell\"\n aria-colindex=${index + 1}\n >\n ${column.filterable ? this.renderFilterState(column) : nothing}\n </div>\n `\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"]}
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 θaddAdoptedStylesController as addAdoptedStylesController,\n θaddThemingController as addThemingController,\n IgcButtonComponent,\n IgcChipComponent,\n IgcDropdownComponent,\n type IgcDropdownItemComponent,\n type IgcIconComponent,\n IgcInputComponent,\n} from 'igniteui-webcomponents';\nimport { html, LitElement, nothing, type PropertyValues } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport type { StateController } from '../controllers/state.js';\nimport { addA11y, FILTER_ROW_INDEX } from '../internal/a11y.js';\nimport { DEFAULT_COLUMN_CONFIG } from '../internal/constants.js';\nimport { GRID_STATE_CONTEXT } from '../internal/context.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_FILTER_ROW_TAG } from '../internal/tags.js';\nimport type { ColumnConfiguration, Keys, PropertyType } from '../internal/types.js';\nimport { getFilterOperandsFor, resolveCondition, visibleColumns } from '../internal/utils.js';\nimport { watch } from '../internal/watch.js';\nimport type { FilterExpressionTree } from '../operations/filter/tree.js';\nimport type { FilterExpression, FilterOperation } from '../operations/filter/types.js';\nimport { styles } from '../styles/filter-row/filter-row.css.js';\nimport { all } from '../styles/themes/filtering-row-themes.js';\n\n/** Expression count at which the preview collapses into one counted chip. */\nconst MAX_PREVIEW_CHIPS = 3;\n\n/** Filter row accessible name. */\nconst FILTER_ROW_LABEL = 'Column filters';\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`\n <igc-icon\n slot=\"prefix\"\n name=${ifDefined(icon)}\n collection=\"internal\"\n ></igc-icon>\n `;\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 /** Deferred by the grid until a filterable column shows: only this row uses the editors. */\n public static register() {\n registerComponent(\n IgcFilterRow,\n IgcButtonComponent,\n IgcChipComponent,\n IgcInputComponent,\n IgcDropdownComponent\n );\n }\n\n private readonly _adoptedStylesController = addAdoptedStylesController(this);\n\n @consume({ context: GRID_STATE_CONTEXT, subscribe: true })\n @property({ attribute: false })\n public state!: StateController<T>;\n\n protected get isNumeric() {\n return this.column.dataType === '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 @property({ attribute: false })\n public adoptRootStyles = false;\n\n constructor() {\n super();\n\n // `role=grid` allows only rows and rowgroups, so no `search` landmark. Modeled\n // as the second header row: one `gridcell` per column.\n addA11y(this, 'row').set({\n ariaRowIndex: `${FILTER_ROW_INDEX}`,\n ariaLabel: FILTER_ROW_LABEL,\n });\n\n addThemingController(this, all, {\n themeChange: this._handleThemeChange,\n });\n }\n\n private get _shouldAdoptStyles(): boolean {\n return this.adoptRootStyles && this.column.headerTemplate != null;\n }\n\n private _handleThemeChange() {\n this._adoptedStylesController.invalidateCache(this.ownerDocument);\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n protected override update(props: PropertyValues<this>): void {\n if (props.has('adoptRootStyles')) {\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n super.update(props);\n }\n\n #setDefaultExpression() {\n this.expression = this.filterController.getDefaultExpression(this.column);\n }\n\n async #selectInput() {\n await this.updateComplete;\n this.input?.select();\n }\n\n #show() {\n this.active = true;\n this.#selectInput();\n }\n\n #handleConditionChanged(event: CustomEvent<IgcDropdownItemComponent>) {\n event.stopPropagation();\n\n const condition = resolveCondition(this.column, event.detail.value) as FilterOperation<\n PropertyType<T, keyof T>\n >;\n\n if (this.input.value || condition.unary) {\n this.filterController.filterWithEvent(\n { ...this.expression, condition },\n 'modify',\n this.expression\n );\n } else {\n // Nothing to filter by yet - the condition is only staged in the UI.\n this.expression.condition = condition;\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\n if (shouldUpdate) {\n const type = this.filterController.get(this.expression.key)?.has(this.expression)\n ? 'modify'\n : 'add';\n\n this.filterController.filterWithEvent(\n { ...this.expression, searchTerm: value as any },\n type,\n this.expression\n );\n } else {\n this.filterController.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 }\n }\n\n #handleResetClick() {\n this.filterController.removeAllExpressions(this.column.field);\n this.requestUpdate();\n }\n\n #openDropdownList() {\n this.dropdown.toggle(this.input);\n }\n\n #handleConditionKeydown(event: KeyboardEvent) {\n if (event.key !== 'Enter' && event.key !== ' ') {\n return;\n }\n\n // The trigger sits in the prefix slot of the input. The keystroke must not\n // reach the input and commit a filter behind the open dropdown.\n event.preventDefault();\n event.stopPropagation();\n\n this.#openDropdownList();\n }\n\n /** Header text of a column. Names the filter controls that act on it. */\n #nameFor(field: Keys<T>): string {\n const column = this.state.columns.find((each) => each.field === field);\n return String(column?.header ?? field);\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 // The header row marks the column whose filter editor is open.\n this.state.updateObservers();\n }\n\n #chipCriteriaFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n\n const criteria = expression.criteria === 'and' ? 'or' : 'and';\n\n this.filterController.filterWithEvent({ ...expression, criteria }, 'modify', expression);\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.#selectInput();\n };\n }\n\n #chipRemoveFor(expression: FilterExpression<T>) {\n return async (e: Event) => {\n e.stopPropagation();\n this.filterController.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`\n <igc-button\n variant=\"flat\"\n @click=${this.#chipCriteriaFor(expr)}\n >\n ${expr.criteria}\n </igc-button>\n `\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 // The chip names its actions in its shadow root. Resource strings are the only hook.\n const expression = `${this.#nameFor(props.expression.key)} ${name} ${unary ? '' : term}`.trim();\n\n return html`\n <igc-chip\n selectable\n removable\n .resourceStrings=${{\n chip_remove: `Remove filter ${expression}`,\n chip_select: `Edit filter ${expression}`,\n }}\n ?selected=${props.selected}\n @igcRemove=${props.onRemove}\n @igcSelect=${props.onSelect}\n >\n ${prefix}${unary ? name : term}\n </igc-chip>\n `;\n }\n\n /** Chip list for a column's filter state. `onSelectFor` builds each chip's select action. */\n #renderChips(\n state: FilterExpressionTree<T>,\n onSelectFor: (expression: FilterExpression<T>) => (e: Event) => Promise<void>\n ) {\n return Array.from(state).map((expression, idx) => {\n const props: ExpressionChipProps<T> = {\n expression,\n selected: this.active && this.expression === expression,\n onRemove: this.#chipRemoveFor(expression),\n onSelect: onSelectFor(expression),\n };\n\n return html`${this.renderCriteriaButton(expression, idx)}${this.renderExpressionChip(props)}`;\n });\n }\n\n protected renderActiveChips() {\n const state = this.filterController.get(this.column.field);\n\n return state ? this.#renderChips(state, (expr) => this.#chipSelectFor(expr)) : nothing;\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 const condition = this.condition.label ?? this.condition.name;\n\n return html`<igc-icon\n id=\"condition\"\n slot=\"prefix\"\n collection=\"internal\"\n role=\"button\"\n tabindex=\"0\"\n aria-haspopup=\"listbox\"\n aria-label=${`Filter condition: ${condition}`}\n .name=${this.condition.name}\n @click=${this.#openDropdownList}\n @keydown=${this.#handleConditionKeydown}\n >\n </igc-icon>`;\n }\n\n protected renderInputArea() {\n // `igc-input` names its inner control from a slotted label or the placeholder\n // only, so the placeholder carries the column name.\n return html`\n <igc-input\n outlined\n value=${ifDefined(this.expression.searchTerm)}\n placeholder=${`Filter ${this.#nameFor(this.column.field)}`}\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\n protected renderActiveState() {\n return html`\n <div\n part=\"active-state\"\n role=\"gridcell\"\n >\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\n protected renderInactiveChips(column: ColumnConfiguration<T>, state: FilterExpressionTree<T>) {\n return this.#renderChips(state, (expression) => async (e: Event) => {\n e.stopPropagation();\n this.column = column;\n this.expression = expression;\n this.#show();\n });\n }\n\n protected renderFilterState(column: ColumnConfiguration<T>) {\n const state = this.filterController.get(column.field);\n\n // Short lists render inline. Longer ones collapse into one counted chip.\n if (state && state.length < MAX_PREVIEW_CHIPS) {\n return this.renderInactiveChips(column, state);\n }\n\n const open = () => {\n this.column = column;\n this.#setDefaultExpression();\n this.#show();\n };\n\n const count = state ? html`<span slot=\"suffix\">${state.length}</span>` : nothing;\n\n return html`<igc-chip\n data-column=${column.field}\n aria-label=${`Filter ${this.#nameFor(column.field)}`}\n @click=${open}\n >${prefixedIcon('filter')}Filter${count}</igc-chip\n >`;\n }\n\n protected renderInactiveState() {\n return visibleColumns(this.state.columns).map(\n (column, index) => html`\n <div\n part=\"filter-row-preview\"\n role=\"gridcell\"\n aria-colindex=${index + 1}\n >\n ${column.filterable ? this.renderFilterState(column) : nothing}\n </div>\n `\n );\n }\n\n protected override render() {\n return this.active ? this.renderActiveState() : this.renderInactiveState();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcFilterRow.tagName]: IgcFilterRow<object>;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { ContextProvider } from '@lit/context';
2
- import type { RenderItemFunction } from '@lit-labs/virtualizer/virtualize.js';
2
+ import { type VirtualScrollItemTemplate } from 'igniteui-webcomponents';
3
3
  import { type PropertyValues } from 'lit';
4
4
  import { EventEmitterBase } from '../internal/mixins/event-emitter.js';
5
5
  import type { ColumnConfiguration, DataPipelineConfiguration, GridLiteSortingOptions, Keys, NavigateToOptions } from '../internal/types.js';
@@ -110,16 +110,12 @@ export declare class IgcGridLite<T extends object = any> extends EventEmitterBas
110
110
  protected readonly _columnUpdateProvider: ContextProvider<{
111
111
  __context__: (config: import("../index.js").BaseColumnConfiguration<object>) => void;
112
112
  }, this>;
113
- private _updateObservers;
114
- private _updateConfiguration;
115
113
  protected _dataState: T[];
116
- /** Monotonic token identifying the most recently started pipeline run. */
114
+ /** Id of the latest pipeline run. */
117
115
  private _pipelineEpoch;
118
116
  private _pipelineTask;
119
117
  /**
120
- * Resolves when the latest pipeline run completes and its result is rendered.
121
- * The sort and filter controllers await this so that `sorted` and `filtered`
122
- * report an up-to-date {@link IgcGridLite.dataView}.
118
+ * Resolves once the latest pipeline run renders. `sorted` and `filtered` await it.
123
119
  *
124
120
  * @internal
125
121
  */
@@ -206,15 +202,14 @@ export declare class IgcGridLite<T extends object = any> extends EventEmitterBas
206
202
  protected sortingOptionsChanged(): void;
207
203
  protected dataChanged(): void;
208
204
  /**
209
- * NOTE: The `PIPELINE` sentinel equals this method's name. That equality makes
210
- * the `@watch` comparison (`undefined !== <method>`) fire on each requested
211
- * update. A rename of this method silently disables the pipeline.
205
+ * NOTE: `PIPELINE` equals this method's name, so `@watch` fires on each request.
206
+ * Renaming the method silently disables the pipeline.
212
207
  */
213
208
  protected pipeline(): void;
214
- /** Runs the data operations. Discards a result that a newer run supersedes. */
209
+ /** Runs the data operations. Discards results superseded by a newer run. */
215
210
  private _runPipeline;
216
211
  constructor();
217
- /** The column set the current row renderer was built from. */
212
+ /** Columns the row renderer was built from. */
218
213
  private _rowColumns?;
219
214
  protected willUpdate(props: PropertyValues<this>): void;
220
215
  protected createRenderRoot(): HTMLElement | DocumentFragment;
@@ -259,12 +254,12 @@ export declare class IgcGridLite<T extends object = any> extends EventEmitterBas
259
254
  getColumn(id: Keys<T> | number): ColumnConfiguration<T> | undefined;
260
255
  protected _bodyClickHandler(event: PointerEvent): void;
261
256
  protected _bodyKeydownHandler(event: KeyboardEvent): void;
262
- /** Rebuilt by {@link IgcGridLite.willUpdate} when a row input changes. */
263
- protected _renderRow: RenderItemFunction<T>;
257
+ /** Rebuilt in {@link IgcGridLite.willUpdate}. */
258
+ protected _renderRow: VirtualScrollItemTemplate<T>;
264
259
  private _createRowRenderer;
265
260
  protected _renderHeaderRow(): import("lit-html").TemplateResult<1>;
266
261
  protected _renderBody(): import("lit-html").TemplateResult<1>;
267
- protected _renderFilterRow(): import("lit-html").TemplateResult<1>;
262
+ protected _renderFilterRow(): import("lit-html/directive.js").DirectiveResult<typeof import("lit-html/directives/cache.js").CacheDirective>;
268
263
  protected render(): import("lit-html").TemplateResult<1>;
269
264
  }
270
265
  declare global {
@@ -5,22 +5,23 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { ContextProvider } from '@lit/context';
8
- import { θaddThemingController as addThemingController } from 'igniteui-webcomponents';
8
+ import { θaddThemingController as addThemingController, IgcVirtualScrollComponent, } from 'igniteui-webcomponents';
9
9
  import { html, nothing } from 'lit';
10
10
  import { eventOptions, property, state } from 'lit/decorators.js';
11
11
  import { cache } from 'lit/directives/cache.js';
12
12
  import { styleMap } from 'lit/directives/style-map.js';
13
13
  import { createDataOperationsController } from '../controllers/data-operation.js';
14
14
  import { createDomController } from '../controllers/dom.js';
15
+ import { activeNodeFor } from '../controllers/navigation.js';
15
16
  import { createStateController } from '../controllers/state.js';
16
17
  import { addA11y, headerRowsFor } from '../internal/a11y.js';
17
- import { FOCUS_WITHIN, PIPELINE } from '../internal/constants.js';
18
+ import { FOCUS_WITHIN, NO_SCROLL, PIPELINE } from '../internal/constants.js';
18
19
  import { COLUMN_UPDATE_CONTEXT, GRID_STATE_CONTEXT } from '../internal/context.js';
19
20
  import { getElementFromEventPath } from '../internal/element-from-event-path.js';
20
21
  import { EventEmitterBase } from '../internal/mixins/event-emitter.js';
21
22
  import { registerComponent } from '../internal/register.js';
22
23
  import { GRID_TAG } from '../internal/tags.js';
23
- import { asArray, isNumber, isString, resolveCondition } from '../internal/utils.js';
24
+ import { asArray, isNumber, isString, resolveCondition, visibleColumns, } from '../internal/utils.js';
24
25
  import { watch } from '../internal/watch.js';
25
26
  import { styles as base } from '../styles/themes/grid.base.css.js';
26
27
  import { all } from '../styles/themes/grid-themes.js';
@@ -30,20 +31,13 @@ import { IgcGridLiteColumn } from './column.js';
30
31
  import IgcFilterRow from './filter-row.js';
31
32
  import IgcGridLiteHeaderRow from './header-row.js';
32
33
  import IgcGridLiteRow from './row.js';
33
- import IgcVirtualizer from './virtualizer.js';
34
34
  export class IgcGridLite extends EventEmitterBase {
35
35
  static get tagName() {
36
36
  return GRID_TAG;
37
37
  }
38
38
  static { this.styles = [base, shared]; }
39
39
  static register() {
40
- registerComponent(IgcGridLite, IgcGridLiteColumn, IgcVirtualizer, IgcGridLiteRow, IgcGridLiteHeaderRow);
41
- }
42
- _updateObservers() {
43
- this._stateProvider.updateObservers();
44
- }
45
- _updateConfiguration(config) {
46
- this._stateController.updateColumnsConfiguration(asArray(config));
40
+ registerComponent(IgcGridLite, IgcGridLiteColumn, IgcVirtualScrollComponent, IgcGridLiteRow, IgcGridLiteHeaderRow);
47
41
  }
48
42
  get _pipelineComplete() {
49
43
  return this.updateComplete.then(() => this._pipelineTask);
@@ -90,16 +84,17 @@ export class IgcGridLite extends EventEmitterBase {
90
84
  return this._dataState.length;
91
85
  }
92
86
  sortingOptionsChanged() {
93
- this._updateObservers();
87
+ this._stateController.updateObservers();
94
88
  }
95
89
  dataChanged() {
96
90
  this._dataState = [...this.data];
97
- if (this.hasUpdated) {
98
- if (!this._hasAssignedColumns()) {
99
- this._stateController.setAutoColumnConfiguration();
100
- }
101
- this.pipeline();
91
+ if (!this.hasUpdated) {
92
+ return;
93
+ }
94
+ if (!this._hasAssignedColumns()) {
95
+ this._stateController.setAutoColumnConfiguration();
102
96
  }
97
+ this.pipeline();
103
98
  }
104
99
  pipeline() {
105
100
  this._pipelineTask = this._runPipeline();
@@ -122,7 +117,7 @@ export class IgcGridLite extends EventEmitterBase {
122
117
  super();
123
118
  this._a11y = addA11y(this, 'grid');
124
119
  this._domController = createDomController(this);
125
- this._stateController = createStateController(this, this._domController, this._updateObservers);
120
+ this._stateController = createStateController(this, this._domController, () => this._stateProvider.updateObservers());
126
121
  this._dataController = createDataOperationsController(this);
127
122
  this._stateProvider = new ContextProvider(this, {
128
123
  context: GRID_STATE_CONTEXT,
@@ -131,7 +126,7 @@ export class IgcGridLite extends EventEmitterBase {
131
126
  this._columnUpdateProvider = new ContextProvider(this, {
132
127
  context: COLUMN_UPDATE_CONTEXT,
133
128
  initialValue: ((config) => {
134
- this._updateConfiguration(config);
129
+ this._stateController.updateColumnsConfiguration(asArray(config));
135
130
  }),
136
131
  });
137
132
  this._dataState = [];
@@ -143,7 +138,6 @@ export class IgcGridLite extends EventEmitterBase {
143
138
  this.sortingOptions = {
144
139
  mode: 'multiple',
145
140
  };
146
- this._renderRow = () => html ``;
147
141
  addThemingController(this, all);
148
142
  }
149
143
  willUpdate(props) {
@@ -151,7 +145,7 @@ export class IgcGridLite extends EventEmitterBase {
151
145
  this._domController.setColumns(columns);
152
146
  this._a11y.set({
153
147
  ariaRowCount: `${headerRowsFor(columns) + this._dataState.length}`,
154
- ariaColCount: `${columns.filter((column) => !column.hidden).length}`,
148
+ ariaColCount: `${visibleColumns(columns).length}`,
155
149
  });
156
150
  if (columns !== this._rowColumns || props.has('adoptRootStyles')) {
157
151
  this._rowColumns = columns;
@@ -215,29 +209,30 @@ export class IgcGridLite extends EventEmitterBase {
215
209
  }
216
210
  _bodyClickHandler(event) {
217
211
  const target = getElementFromEventPath(IgcGridLiteCell.tagName, event);
218
- if (target) {
219
- this._stateController.active = { column: target.column.field, row: target.row.index };
220
- if (!target.matches(FOCUS_WITHIN)) {
221
- target.focus({ preventScroll: true });
222
- }
212
+ if (!target) {
213
+ return;
214
+ }
215
+ this._stateController.active = { column: target.column.field, row: target.row.index };
216
+ if (!target.matches(FOCUS_WITHIN)) {
217
+ target.focus(NO_SCROLL);
223
218
  }
224
219
  }
225
220
  _bodyKeydownHandler(event) {
226
221
  const [origin] = event.composedPath();
227
- if (origin === this._domController.virtualizer || origin instanceof IgcGridLiteCell) {
222
+ if (origin === event.currentTarget || origin instanceof IgcGridLiteCell) {
228
223
  this._stateController.navigation.navigate(event);
229
224
  }
230
225
  }
231
226
  _createRowRenderer(columns) {
232
- return (item, index) => html `
227
+ return ({ value, index }) => html `
233
228
  <igc-grid-lite-row
234
229
  part="row"
235
230
  exportparts="cell"
236
231
  style=${styleMap(this._domController.columnSizes)}
237
232
  .adoptRootStyles=${this.adoptRootStyles}
238
233
  .index=${index}
239
- .activeNode=${this._stateController.active}
240
- .data=${item}
234
+ .activeNode=${activeNodeFor(this._stateController.active, index)}
235
+ .data=${value}
241
236
  .columns=${columns}
242
237
  ></igc-grid-lite-row>
243
238
  `;
@@ -254,13 +249,15 @@ export class IgcGridLite extends EventEmitterBase {
254
249
  }
255
250
  _renderBody() {
256
251
  return html `
257
- <igc-grid-lite-virtualizer
252
+ <igc-virtual-scroll
253
+ role="rowgroup"
254
+ .overScan=${10}
258
255
  tabindex="0"
259
- .items=${this._dataState}
260
- .renderItem=${this._renderRow}
256
+ .data=${this._dataState}
257
+ .itemTemplate=${this._renderRow}
261
258
  @click=${this._bodyClickHandler}
262
259
  @keydown=${this._bodyKeydownHandler}
263
- ></igc-grid-lite-virtualizer>
260
+ ></igc-virtual-scroll>
264
261
  `;
265
262
  }
266
263
  _renderFilterRow() {
@@ -268,11 +265,11 @@ export class IgcGridLite extends EventEmitterBase {
268
265
  if (filterable) {
269
266
  IgcFilterRow.register();
270
267
  }
271
- return html `${cache(filterable
268
+ return cache(filterable
272
269
  ? html `<igc-grid-lite-filter-row
273
270
  style=${styleMap(this._domController.columnSizes)}
274
271
  ></igc-grid-lite-filter-row>`
275
- : nothing)}`;
272
+ : nothing);
276
273
  }
277
274
  render() {
278
275
  return html `