igniteui-grid-lite 0.10.0 → 0.12.0-beta.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.
- package/components/cell.d.ts +5 -17
- package/components/cell.js +2 -2
- package/components/cell.js.map +1 -1
- package/components/filter-row.d.ts +2 -5
- package/components/filter-row.js +22 -27
- package/components/filter-row.js.map +1 -1
- package/components/grid.d.ts +10 -15
- package/components/grid.js +34 -39
- package/components/grid.js.map +1 -1
- package/components/header-row.js +2 -1
- package/components/header-row.js.map +1 -1
- package/components/header.js +2 -6
- package/components/header.js.map +1 -1
- package/components/row.d.ts +0 -3
- package/components/row.js +3 -3
- package/components/row.js.map +1 -1
- package/controllers/data-operation.d.ts +1 -3
- package/controllers/data-operation.js +0 -2
- package/controllers/data-operation.js.map +1 -1
- package/controllers/dom.d.ts +4 -16
- package/controllers/dom.js +14 -13
- package/controllers/dom.js.map +1 -1
- package/controllers/filter.d.ts +10 -22
- package/controllers/filter.js +15 -8
- package/controllers/filter.js.map +1 -1
- package/controllers/navigation.d.ts +4 -9
- package/controllers/navigation.js +23 -43
- package/controllers/navigation.js.map +1 -1
- package/controllers/resize.d.ts +3 -9
- package/controllers/resize.js +2 -7
- package/controllers/resize.js.map +1 -1
- package/controllers/sort.d.ts +7 -5
- package/controllers/sort.js +34 -14
- package/controllers/sort.js.map +1 -1
- package/controllers/state.d.ts +2 -13
- package/controllers/state.js +14 -10
- package/controllers/state.js.map +1 -1
- package/custom-elements.json +218 -347
- package/docs/igniteui-grid-lite.json +849 -859
- package/internal/a11y.d.ts +2 -5
- package/internal/a11y.js.map +1 -1
- package/internal/body-focus.d.ts +6 -0
- package/internal/body-focus.js +46 -0
- package/internal/body-focus.js.map +1 -0
- package/internal/constants.d.ts +4 -1
- package/internal/constants.js +2 -0
- package/internal/constants.js.map +1 -1
- package/internal/element-from-event-path.d.ts +1 -1
- package/internal/element-from-event-path.js +2 -9
- package/internal/element-from-event-path.js.map +1 -1
- package/internal/tags.d.ts +0 -1
- package/internal/tags.js +0 -1
- package/internal/tags.js.map +1 -1
- package/internal/types.d.ts +6 -7
- package/internal/types.js.map +1 -1
- package/internal/utils.d.ts +4 -8
- package/internal/utils.js +7 -3
- package/internal/utils.js.map +1 -1
- package/operations/base.js +2 -2
- package/operations/base.js.map +1 -1
- package/operations/filter/state.d.ts +0 -1
- package/operations/filter/state.js +0 -3
- package/operations/filter/state.js.map +1 -1
- package/operations/filter/types.d.ts +1 -1
- package/operations/filter/types.js.map +1 -1
- package/operations/filter.js +3 -2
- package/operations/filter.js.map +1 -1
- package/operations/sort/types.d.ts +1 -1
- package/operations/sort/types.js.map +1 -1
- package/operations/sort.js +5 -1
- package/operations/sort.js.map +1 -1
- package/package.json +2 -3
- package/styles/body-cell/body-cell.css.js +1 -1
- package/styles/body-cell/body-cell.css.js.map +1 -1
- package/styles/filter-row/filter-row.css.js +1 -1
- package/styles/filter-row/filter-row.css.js.map +1 -1
- package/styles/header-cell/header-cell.css.js +1 -1
- package/styles/header-cell/header-cell.css.js.map +1 -1
- package/styles/themes/dark/grid.bootstrap.css.js +1 -1
- package/styles/themes/dark/grid.bootstrap.css.js.map +1 -1
- package/styles/themes/dark/grid.fluent.css.js +1 -1
- package/styles/themes/dark/grid.fluent.css.js.map +1 -1
- package/styles/themes/dark/grid.indigo.css.js +1 -1
- package/styles/themes/dark/grid.indigo.css.js.map +1 -1
- package/styles/themes/dark/grid.material.css.js +1 -1
- package/styles/themes/dark/grid.material.css.js.map +1 -1
- package/styles/themes/dark/grid.shared.css.js +1 -1
- package/styles/themes/dark/grid.shared.css.js.map +1 -1
- package/styles/themes/filtering-row-themes.js +2 -30
- package/styles/themes/filtering-row-themes.js.map +1 -1
- package/styles/themes/grid-header-themes.js +2 -20
- package/styles/themes/grid-header-themes.js.map +1 -1
- package/styles/themes/grid-themes.js +10 -31
- package/styles/themes/grid-themes.js.map +1 -1
- package/styles/themes/grid.base.css.js +1 -1
- package/styles/themes/grid.base.css.js.map +1 -1
- package/styles/themes/light/grid.bootstrap.css.js +1 -1
- package/styles/themes/light/grid.bootstrap.css.js.map +1 -1
- package/styles/themes/light/grid.fluent.css.js +1 -1
- package/styles/themes/light/grid.fluent.css.js.map +1 -1
- package/styles/themes/light/grid.indigo.css.js +1 -1
- package/styles/themes/light/grid.indigo.css.js.map +1 -1
- package/styles/themes/light/grid.shared.css.js +1 -1
- package/styles/themes/light/grid.shared.css.js.map +1 -1
- package/styles/themes/shared/filtering-row/filtering-row.bootstrap.css.js +1 -1
- package/styles/themes/shared/filtering-row/filtering-row.bootstrap.css.js.map +1 -1
- package/styles/themes/shared/filtering-row/filtering-row.fluent.css.js +1 -1
- package/styles/themes/shared/filtering-row/filtering-row.fluent.css.js.map +1 -1
- package/styles/themes/shared/filtering-row/filtering-row.indigo.css.js +1 -1
- package/styles/themes/shared/filtering-row/filtering-row.indigo.css.js.map +1 -1
- package/styles/themes/shared/filtering-row/filtering-row.material.css.js +1 -1
- package/styles/themes/shared/filtering-row/filtering-row.material.css.js.map +1 -1
- package/styles/themes/shared/grid.common.css.js +1 -1
- package/styles/themes/shared/grid.common.css.js.map +1 -1
- package/styles/themes/shared/header/header.indigo.css.js +1 -1
- package/styles/themes/shared/header/header.indigo.css.js.map +1 -1
- package/components/virtualizer.d.ts +0 -14
- package/components/virtualizer.js +0 -49
- package/components/virtualizer.js.map +0 -1
- package/internal/virt-flow-layout.d.ts +0 -4
- package/internal/virt-flow-layout.js +0 -15
- package/internal/virt-flow-layout.js.map +0 -1
package/components/cell.d.ts
CHANGED
|
@@ -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").
|
|
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 {
|
package/components/cell.js
CHANGED
|
@@ -56,9 +56,9 @@ export default class IgcGridLiteCell extends LitElement {
|
|
|
56
56
|
super.update(props);
|
|
57
57
|
}
|
|
58
58
|
render() {
|
|
59
|
-
return
|
|
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([
|
package/components/cell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell.js","sourceRoot":"","sources":["../../src/components/cell.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,2BAA2B,IAAI,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACnG,OAAO,EAAE,IAAI,EAAE,UAAU,EAAuB,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;
|
|
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 {
|
package/components/filter-row.js
CHANGED
|
@@ -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
|
-
#
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
|
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":";;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,2BAA2B,IAAI,0BAA0B,EACzD,qBAAqB,IAAI,oBAAoB,EAC7C,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EAGpB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAuB,MAAM,KAAK,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAG7C,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,0CAA0C,CAAC;AAG/D,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAG5B,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAS1C,SAAS,YAAY,CAAC,IAAa;IACjC,OAAO,IAAI,CAAA;;;aAGA,SAAS,CAAC,IAAI,CAAC;;;GAGzB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,YAA+B,SAAQ,UAAU;IAC7D,MAAM,KAAK,OAAO;QACvB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;aAEsB,WAAM,GAAG,MAAM,AAAT,CAAU;IAMhC,MAAM,CAAC,QAAQ;QACpB,iBAAiB,CACf,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,CACrB,CAAC;IACJ,CAAC;IAQD,IAAc,SAAS;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC3C,CAAC;IAED,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAC9B,CAAC;IAED,IAAc,SAAS;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC,SAA+B,CAAC;IACzD,CAAC;IAuBD;QACE,KAAK,EAAE,CAAC;QAxCO,6BAAwB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;QAmBtE,WAAM,GAAG,KAAK,CAAC;QAYf,WAAM,GAA2B,qBAA+C,CAAC;QAMjF,oBAAe,GAAG,KAAK,CAAC;QAS7B,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC;YACvB,YAAY,EAAE,GAAG,gBAAgB,EAAE;YACnC,SAAS,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QAEH,oBAAoB,CAAC,IAAI,EAAE,GAAG,EAAE;YAC9B,WAAW,EAAE,IAAI,CAAC,kBAAkB;SACrC,CAAC,CAAC;IACL,CAAC;IAED,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC;IACpE,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClE,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC3E,CAAC;IAEkB,MAAM,CAAC,KAA2B;QACnD,IAAI,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3E,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED,iBAAiB,CAAC,UAA+B;QAC/C,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,MAAM,IAAI,CAAC,cAAc,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACvB,CAAC;IAED,uBAAuB,CAAC,KAA4C;QAClE,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAEjE,CAAC;QAEF,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACxC,IAAI,CAAC,gBAAgB,CAAC,eAAe,CACnC,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,EACjC,QAAQ,EACR,IAAI,CAAC,UAAU,CAChB,CAAC;QACJ,CAAC;aAAM,CAAC;YAEN,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,YAAY,CAAC,KAA0B;QACrC,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YAC/E,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,KAAK,CAAC;QAEV,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,gBAAgB,CAAC,eAAe,CACnC,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,KAAY,EAAE,EAChD,IAAI,EACJ,IAAI,CAAC,UAAU,CAChB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,cAAc,CAAC,KAAoB;QACjC,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,OAAO;gBACV,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;gBACtB,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC7B,OAAO;YACT,KAAK,QAAQ;gBACX,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;gBACpB,OAAO;YACT;gBACE,OAAO;QACX,CAAC;IACH,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,uBAAuB,CAAC,KAAoB;QAC1C,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QAID,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAGD,QAAQ,CAAC,KAAc;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC;IACzC,CAAC;IAGS,aAAa;QACrB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAE/C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,qBAA+C,CAAC;QAChE,CAAC;QAGD,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;IAED,gBAAgB,CAAC,UAA+B;QAC9C,OAAO,KAAK,EAAE,CAAQ,EAAE,EAAE;YACxB,CAAC,CAAC,eAAe,EAAE,CAAC;YAEpB,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YAE9D,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,EAAE,GAAG,UAAU,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YACzF,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,UAA+B;QAC5C,OAAO,KAAK,EAAE,CAAQ,EAAE,EAAE;YACxB,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,MAAM,IAAI,CAAC,cAAc,CAAC;YAC1B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,UAA+B;QAC5C,OAAO,KAAK,EAAE,CAAQ,EAAE,EAAE;YACxB,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEnC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBAClD,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,cAAc,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;YAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;IAES,oBAAoB,CAAC,IAAyB,EAAE,KAAa;QACrE,OAAO,KAAK;YACV,CAAC,CAAC,IAAI,CAAA;;;qBAGS,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;;cAElC,IAAI,CAAC,QAAQ;;SAElB;YACH,CAAC,CAAC,OAAO,CAAC;IACd,CAAC;IAES,oBAAoB,CAAC,KAA6B;QAC1D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,SAA+B,CAAC;QACzE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC;QAE9C,MAAM,MAAM,GAAG,IAAI,CAAA,8BAA8B,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QAItE,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhG,OAAO,IAAI,CAAA;;;;2BAIY;YACjB,WAAW,EAAE,iBAAiB,UAAU,EAAE;YAC1C,WAAW,EAAE,eAAe,UAAU,EAAE;SACzC;oBACW,KAAK,CAAC,QAAQ;qBACb,KAAK,CAAC,QAAQ;qBACd,KAAK,CAAC,QAAQ;;UAEzB,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;KAEjC,CAAC;IACJ,CAAC;IAGD,YAAY,CACV,KAA8B,EAC9B,WAA6E;QAE7E,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,GAAG,EAAE,EAAE;YAC/C,MAAM,KAAK,GAA2B;gBACpC,UAAU;gBACV,QAAQ,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU;gBACvD,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;gBACzC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC;aAClC,CAAC;YAEF,OAAO,IAAI,CAAA,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChG,CAAC,CAAC,CAAC;IACL,CAAC;IAES,iBAAiB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE3D,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACzF,CAAC;IAES,mBAAmB;QAC3B,OAAO,IAAI,CAAA;;;;iBAIE,IAAI,CAAC,iBAAiB;;UAE7B,YAAY,CAAC,SAAS,CAAC;;;;;iBAKhB,GAAG,EAAE;YACZ,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC;;UAEC,YAAY,CAAC,OAAO,CAAC;;KAE1B,CAAC;IACJ,CAAC;IAES,cAAc;QACtB,OAAO,IAAI,CAAA;;;mBAGI,IAAI,CAAC,uBAAuB;;QAEvC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CACrD,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA;;qBAEX,GAAG;wBACA,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,GAAG;;cAErC,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,KAAK,IAAI,GAAG;;SAE9C,CACF;oBACa,CAAC;IACnB,CAAC;IAES,oBAAoB;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAE9D,OAAO,IAAI,CAAA;;;;;;;mBAOI,qBAAqB,SAAS,EAAE;cACrC,IAAI,CAAC,SAAS,CAAC,IAAI;eAClB,IAAI,CAAC,iBAAiB;iBACpB,IAAI,CAAC,uBAAuB;;gBAE7B,CAAC;IACf,CAAC;IAES,eAAe;QAGvB,OAAO,IAAI,CAAA;;;gBAGC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;sBAC/B,UAAU,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;oBAC9C,IAAI,CAAC,SAAS,CAAC,KAAK;oBACpB,IAAI,CAAC,YAAY;mBAClB,IAAI,CAAC,cAAc;;UAE5B,IAAI,CAAC,oBAAoB,EAAE;;QAE7B,IAAI,CAAC,cAAc,EAAE;KACxB,CAAC;IACJ,CAAC;IAES,iBAAiB;QACzB,OAAO,IAAI,CAAA;;;;;uCAKwB,IAAI,CAAC,eAAe,EAAE;yCACpB,IAAI,CAAC,iBAAiB,EAAE;yCACxB,IAAI,CAAC,mBAAmB,EAAE;;KAE9D,CAAC;IACJ,CAAC;IAES,mBAAmB,CAAC,MAA8B,EAAE,KAA8B;QAC1F,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,EAAE,CAAQ,EAAE,EAAE;YACjE,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAES,iBAAiB,CAAC,MAA8B;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAItD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA,uBAAuB,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QAEjF,OAAO,IAAI,CAAA;oBACK,MAAM,CAAC,KAAK;mBACb,UAAU,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;eAC3C,IAAI;SACV,YAAY,CAAC,QAAQ,CAAC,SAAS,KAAK;MACvC,CAAC;IACL,CAAC;IAES,mBAAmB;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;aACtB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;aAClC,GAAG,CACF,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAA;;;;4BAIH,KAAK,GAAG,CAAC;;cAEvB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO;;SAEjE,CACF,CAAC;IACN,CAAC;IAEkB,MAAM;QACvB,OAAO,IAAI,CAAA,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;IACtF,CAAC;;AAtaM;IAFN,OAAO,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACzD,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;2CACG;AAe3B;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;4CACT;AAGf;IADN,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC;2CACA;AAG1B;IADN,KAAK,CAAC,YAAY,CAAC;sDACuB;AAGpC;IADN,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC;8CACG;AAGhC;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;4CACyD;AAGjF;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gDACS;AAGjC;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;qDACA;AA2IrB;IADT,KAAK,CAAC,QAAQ,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;iDAU/C","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"]}
|
package/components/grid.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ContextProvider } from '@lit/context';
|
|
2
|
-
import type
|
|
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
|
-
/**
|
|
114
|
+
/** Id of the latest pipeline run. */
|
|
117
115
|
private _pipelineEpoch;
|
|
118
116
|
private _pipelineTask;
|
|
119
117
|
/**
|
|
120
|
-
* Resolves
|
|
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:
|
|
210
|
-
* the
|
|
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
|
|
209
|
+
/** Runs the data operations. Discards results superseded by a newer run. */
|
|
215
210
|
private _runPipeline;
|
|
216
211
|
constructor();
|
|
217
|
-
/**
|
|
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
|
|
263
|
-
protected _renderRow:
|
|
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").
|
|
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 {
|
package/components/grid.js
CHANGED
|
@@ -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,
|
|
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);
|
|
@@ -54,9 +48,7 @@ export class IgcGridLite extends EventEmitterBase {
|
|
|
54
48
|
this.sort(expressions);
|
|
55
49
|
}
|
|
56
50
|
else {
|
|
57
|
-
|
|
58
|
-
this._stateController.sorting.state.set(expr.key, { ...expr });
|
|
59
|
-
}
|
|
51
|
+
this._stateController.sorting.setRaw(expressions);
|
|
60
52
|
}
|
|
61
53
|
}
|
|
62
54
|
get sortingExpressions() {
|
|
@@ -90,16 +82,17 @@ export class IgcGridLite extends EventEmitterBase {
|
|
|
90
82
|
return this._dataState.length;
|
|
91
83
|
}
|
|
92
84
|
sortingOptionsChanged() {
|
|
93
|
-
this.
|
|
85
|
+
this._stateController.updateObservers();
|
|
94
86
|
}
|
|
95
87
|
dataChanged() {
|
|
96
88
|
this._dataState = [...this.data];
|
|
97
|
-
if (this.hasUpdated) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
this.
|
|
89
|
+
if (!this.hasUpdated) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!this._hasAssignedColumns()) {
|
|
93
|
+
this._stateController.setAutoColumnConfiguration();
|
|
102
94
|
}
|
|
95
|
+
this.pipeline();
|
|
103
96
|
}
|
|
104
97
|
pipeline() {
|
|
105
98
|
this._pipelineTask = this._runPipeline();
|
|
@@ -122,7 +115,7 @@ export class IgcGridLite extends EventEmitterBase {
|
|
|
122
115
|
super();
|
|
123
116
|
this._a11y = addA11y(this, 'grid');
|
|
124
117
|
this._domController = createDomController(this);
|
|
125
|
-
this._stateController = createStateController(this, this._domController, this.
|
|
118
|
+
this._stateController = createStateController(this, this._domController, () => this._stateProvider.updateObservers());
|
|
126
119
|
this._dataController = createDataOperationsController(this);
|
|
127
120
|
this._stateProvider = new ContextProvider(this, {
|
|
128
121
|
context: GRID_STATE_CONTEXT,
|
|
@@ -131,7 +124,7 @@ export class IgcGridLite extends EventEmitterBase {
|
|
|
131
124
|
this._columnUpdateProvider = new ContextProvider(this, {
|
|
132
125
|
context: COLUMN_UPDATE_CONTEXT,
|
|
133
126
|
initialValue: ((config) => {
|
|
134
|
-
this.
|
|
127
|
+
this._stateController.updateColumnsConfiguration(asArray(config));
|
|
135
128
|
}),
|
|
136
129
|
});
|
|
137
130
|
this._dataState = [];
|
|
@@ -143,7 +136,6 @@ export class IgcGridLite extends EventEmitterBase {
|
|
|
143
136
|
this.sortingOptions = {
|
|
144
137
|
mode: 'multiple',
|
|
145
138
|
};
|
|
146
|
-
this._renderRow = () => html ``;
|
|
147
139
|
addThemingController(this, all);
|
|
148
140
|
}
|
|
149
141
|
willUpdate(props) {
|
|
@@ -151,7 +143,7 @@ export class IgcGridLite extends EventEmitterBase {
|
|
|
151
143
|
this._domController.setColumns(columns);
|
|
152
144
|
this._a11y.set({
|
|
153
145
|
ariaRowCount: `${headerRowsFor(columns) + this._dataState.length}`,
|
|
154
|
-
ariaColCount: `${columns
|
|
146
|
+
ariaColCount: `${visibleColumns(columns).length}`,
|
|
155
147
|
});
|
|
156
148
|
if (columns !== this._rowColumns || props.has('adoptRootStyles')) {
|
|
157
149
|
this._rowColumns = columns;
|
|
@@ -215,29 +207,30 @@ export class IgcGridLite extends EventEmitterBase {
|
|
|
215
207
|
}
|
|
216
208
|
_bodyClickHandler(event) {
|
|
217
209
|
const target = getElementFromEventPath(IgcGridLiteCell.tagName, event);
|
|
218
|
-
if (target) {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
210
|
+
if (!target) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this._stateController.active = { column: target.column.field, row: target.row.index };
|
|
214
|
+
if (!target.matches(FOCUS_WITHIN)) {
|
|
215
|
+
target.focus(NO_SCROLL);
|
|
223
216
|
}
|
|
224
217
|
}
|
|
225
218
|
_bodyKeydownHandler(event) {
|
|
226
219
|
const [origin] = event.composedPath();
|
|
227
|
-
if (origin ===
|
|
220
|
+
if (origin === event.currentTarget || origin instanceof IgcGridLiteCell) {
|
|
228
221
|
this._stateController.navigation.navigate(event);
|
|
229
222
|
}
|
|
230
223
|
}
|
|
231
224
|
_createRowRenderer(columns) {
|
|
232
|
-
return (
|
|
225
|
+
return ({ value, index }) => html `
|
|
233
226
|
<igc-grid-lite-row
|
|
234
227
|
part="row"
|
|
235
228
|
exportparts="cell"
|
|
236
229
|
style=${styleMap(this._domController.columnSizes)}
|
|
237
230
|
.adoptRootStyles=${this.adoptRootStyles}
|
|
238
231
|
.index=${index}
|
|
239
|
-
.activeNode=${this._stateController.active}
|
|
240
|
-
.data=${
|
|
232
|
+
.activeNode=${activeNodeFor(this._stateController.active, index)}
|
|
233
|
+
.data=${value}
|
|
241
234
|
.columns=${columns}
|
|
242
235
|
></igc-grid-lite-row>
|
|
243
236
|
`;
|
|
@@ -254,13 +247,15 @@ export class IgcGridLite extends EventEmitterBase {
|
|
|
254
247
|
}
|
|
255
248
|
_renderBody() {
|
|
256
249
|
return html `
|
|
257
|
-
<igc-
|
|
250
|
+
<igc-virtual-scroll
|
|
251
|
+
role="rowgroup"
|
|
252
|
+
.overScan=${10}
|
|
258
253
|
tabindex="0"
|
|
259
|
-
.
|
|
260
|
-
.
|
|
254
|
+
.data=${this._dataState}
|
|
255
|
+
.itemTemplate=${this._renderRow}
|
|
261
256
|
@click=${this._bodyClickHandler}
|
|
262
257
|
@keydown=${this._bodyKeydownHandler}
|
|
263
|
-
></igc-
|
|
258
|
+
></igc-virtual-scroll>
|
|
264
259
|
`;
|
|
265
260
|
}
|
|
266
261
|
_renderFilterRow() {
|
|
@@ -268,11 +263,11 @@ export class IgcGridLite extends EventEmitterBase {
|
|
|
268
263
|
if (filterable) {
|
|
269
264
|
IgcFilterRow.register();
|
|
270
265
|
}
|
|
271
|
-
return
|
|
266
|
+
return cache(filterable
|
|
272
267
|
? html `<igc-grid-lite-filter-row
|
|
273
268
|
style=${styleMap(this._domController.columnSizes)}
|
|
274
269
|
></igc-grid-lite-filter-row>`
|
|
275
|
-
: nothing)
|
|
270
|
+
: nothing);
|
|
276
271
|
}
|
|
277
272
|
render() {
|
|
278
273
|
return html `
|