igniteui-grid-lite 0.9.0 → 0.10.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 +8 -0
- package/components/cell.js +12 -1
- package/components/cell.js.map +1 -1
- package/components/column.d.ts +2 -2
- package/components/column.js.map +1 -1
- package/components/filter-row.d.ts +7 -2
- package/components/filter-row.js +87 -52
- package/components/filter-row.js.map +1 -1
- package/components/grid.d.ts +49 -3
- package/components/grid.js +102 -62
- package/components/grid.js.map +1 -1
- package/components/header-row.d.ts +1 -2
- package/components/header-row.js +4 -7
- package/components/header-row.js.map +1 -1
- package/components/header.d.ts +9 -0
- package/components/header.js +36 -23
- package/components/header.js.map +1 -1
- package/components/row.d.ts +4 -1
- package/components/row.js +12 -1
- package/components/row.js.map +1 -1
- package/components/virtualizer.d.ts +3 -1
- package/components/virtualizer.js +36 -7
- package/components/virtualizer.js.map +1 -1
- package/controllers/data-operation.d.ts +0 -4
- package/controllers/data-operation.js +7 -22
- package/controllers/data-operation.js.map +1 -1
- package/controllers/dom.d.ts +28 -9
- package/controllers/dom.js +70 -20
- package/controllers/dom.js.map +1 -1
- package/controllers/filter.d.ts +20 -4
- package/controllers/filter.js +39 -55
- package/controllers/filter.js.map +1 -1
- package/controllers/navigation.d.ts +10 -10
- package/controllers/navigation.js +68 -53
- package/controllers/navigation.js.map +1 -1
- package/controllers/resize.d.ts +8 -8
- package/controllers/resize.js +23 -14
- package/controllers/resize.js.map +1 -1
- package/controllers/sort.d.ts +12 -3
- package/controllers/sort.js +25 -32
- package/controllers/sort.js.map +1 -1
- package/controllers/state.d.ts +28 -18
- package/controllers/state.js +20 -26
- package/controllers/state.js.map +1 -1
- package/custom-elements.json +874 -243
- package/docs/igniteui-grid-lite.json +1339 -818
- package/index.d.ts +1 -1
- package/index.js.map +1 -1
- package/internal/a11y.d.ts +29 -0
- package/internal/a11y.js +24 -0
- package/internal/a11y.js.map +1 -0
- package/internal/constants.d.ts +3 -2
- package/internal/constants.js +1 -4
- package/internal/constants.js.map +1 -1
- package/internal/normalize-case.d.ts +5 -1
- package/internal/normalize-case.js +2 -1
- package/internal/normalize-case.js.map +1 -1
- package/internal/part-map.js +9 -17
- package/internal/part-map.js.map +1 -1
- package/internal/tags.d.ts +2 -2
- package/internal/tags.js +2 -2
- package/internal/tags.js.map +1 -1
- package/internal/types.d.ts +13 -1
- package/internal/types.js.map +1 -1
- package/internal/utils.d.ts +3 -0
- package/internal/utils.js +17 -4
- package/internal/utils.js.map +1 -1
- package/internal/watch.js +8 -9
- package/internal/watch.js.map +1 -1
- package/operations/base.js +2 -1
- package/operations/base.js.map +1 -1
- package/operations/filter/state.js +2 -5
- package/operations/filter/state.js.map +1 -1
- package/operations/filter/tree.d.ts +1 -2
- package/operations/filter/tree.js +2 -7
- package/operations/filter/tree.js.map +1 -1
- package/operations/filter.js +13 -1
- package/operations/filter.js.map +1 -1
- package/operations/sort.d.ts +0 -1
- package/operations/sort.js +7 -9
- package/operations/sort.js.map +1 -1
- package/package.json +2 -2
- package/styles/themes/grid.base.css.js +1 -1
- package/styles/themes/grid.base.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/components/header.d.ts
CHANGED
|
@@ -7,13 +7,22 @@ export default class IgcGridLiteHeader<T extends object> extends LitElement {
|
|
|
7
7
|
static styles: import("lit").CSSResult;
|
|
8
8
|
static register(): void;
|
|
9
9
|
private readonly _adoptedStylesController;
|
|
10
|
+
private readonly _a11y;
|
|
10
11
|
protected get context(): IgcHeaderContext<T>;
|
|
11
12
|
protected get isSortable(): boolean;
|
|
12
13
|
protected get resizeController(): import("../controllers/resize.js").ResizeController<T>;
|
|
13
14
|
state: StateController<T>;
|
|
14
15
|
column: ColumnConfiguration<T>;
|
|
15
16
|
adoptRootStyles: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Position of the header among the visible columns. Written as its 1-based
|
|
19
|
+
* `aria-colindex`.
|
|
20
|
+
*
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
_colIndex: number;
|
|
16
24
|
constructor();
|
|
25
|
+
private get _shouldAdoptStyles();
|
|
17
26
|
protected update(props: PropertyValues<this>): void;
|
|
18
27
|
private _handleThemeChange;
|
|
19
28
|
protected renderSortPart(): import("lit-html").TemplateResult<1> | typeof nothing;
|
package/components/header.js
CHANGED
|
@@ -8,6 +8,7 @@ import { consume } from '@lit/context';
|
|
|
8
8
|
import { θaddAdoptedStylesController as addAdoptedStylesController, θaddThemingController as addThemingController, IgcIconComponent, } from 'igniteui-webcomponents';
|
|
9
9
|
import { html, LitElement, nothing } from 'lit';
|
|
10
10
|
import { property } from 'lit/decorators.js';
|
|
11
|
+
import { addA11y } from '../internal/a11y.js';
|
|
11
12
|
import { MIN_COL_RESIZE_WIDTH, SORT_ICON_ASCENDING, SORT_ICON_DESCENDING, } from '../internal/constants.js';
|
|
12
13
|
import { GRID_STATE_CONTEXT } from '../internal/context.js';
|
|
13
14
|
import { partMap } from '../internal/part-map.js';
|
|
@@ -38,7 +39,9 @@ export default class IgcGridLiteHeader extends LitElement {
|
|
|
38
39
|
constructor() {
|
|
39
40
|
super();
|
|
40
41
|
this._adoptedStylesController = addAdoptedStylesController(this);
|
|
42
|
+
this._a11y = addA11y(this, 'columnheader');
|
|
41
43
|
this.adoptRootStyles = false;
|
|
44
|
+
this._colIndex = -1;
|
|
42
45
|
this.#handleResize = ({ clientX }) => {
|
|
43
46
|
const { left } = this.getBoundingClientRect();
|
|
44
47
|
const width = Math.max(clientX - left, MIN_COL_RESIZE_WIDTH);
|
|
@@ -55,15 +58,25 @@ export default class IgcGridLiteHeader extends LitElement {
|
|
|
55
58
|
themeChange: this._handleThemeChange,
|
|
56
59
|
});
|
|
57
60
|
}
|
|
61
|
+
get _shouldAdoptStyles() {
|
|
62
|
+
return this.adoptRootStyles && this.column.headerTemplate != null;
|
|
63
|
+
}
|
|
58
64
|
update(props) {
|
|
59
|
-
if (props.has('adoptRootStyles')) {
|
|
60
|
-
this._adoptedStylesController.shouldAdoptStyles(this.
|
|
65
|
+
if (props.has('adoptRootStyles') || props.has('column')) {
|
|
66
|
+
this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);
|
|
61
67
|
}
|
|
68
|
+
this._a11y.set({ ariaColIndex: `${this._colIndex}`, ariaSort: this.#ariaSort() });
|
|
62
69
|
super.update(props);
|
|
63
70
|
}
|
|
71
|
+
#ariaSort() {
|
|
72
|
+
if (!this.isSortable) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return this.state.sorting.state.get(this.column.field)?.direction ?? 'none';
|
|
76
|
+
}
|
|
64
77
|
_handleThemeChange() {
|
|
65
78
|
this._adoptedStylesController.invalidateCache(this.ownerDocument);
|
|
66
|
-
this._adoptedStylesController.shouldAdoptStyles(this.
|
|
79
|
+
this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);
|
|
67
80
|
}
|
|
68
81
|
#addResizeEventHandlers() {
|
|
69
82
|
const config = { once: true };
|
|
@@ -90,26 +103,23 @@ export default class IgcGridLiteHeader extends LitElement {
|
|
|
90
103
|
#handleAutosize;
|
|
91
104
|
renderSortPart() {
|
|
92
105
|
const state = this.state.sorting.state.get(this.column.field);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
></igc-icon>
|
|
111
|
-
</span>`
|
|
112
|
-
: nothing;
|
|
106
|
+
if (!(state || this.isSortable)) {
|
|
107
|
+
return nothing;
|
|
108
|
+
}
|
|
109
|
+
const position = Array.from(this.state.sorting.state.keys()).indexOf(this.column.field);
|
|
110
|
+
const multiple = this.state.host.sortingOptions.mode === 'multiple';
|
|
111
|
+
const icon = state?.direction === 'descending' ? SORT_ICON_DESCENDING : SORT_ICON_ASCENDING;
|
|
112
|
+
return html `<span
|
|
113
|
+
part=${partMap({ action: true, sorted: !!state?.direction })}
|
|
114
|
+
@click=${this.isSortable ? this.#handleClick : nothing}
|
|
115
|
+
>
|
|
116
|
+
<igc-icon
|
|
117
|
+
part=${partMap({ 'sorting-action': !!state })}
|
|
118
|
+
data-sortIndex=${multiple && position > -1 ? position + 1 : nothing}
|
|
119
|
+
name=${icon}
|
|
120
|
+
collection="internal"
|
|
121
|
+
></igc-icon>
|
|
122
|
+
</span>`;
|
|
113
123
|
}
|
|
114
124
|
renderContentPart() {
|
|
115
125
|
const defaultContent = this.column.header ?? this.column.field;
|
|
@@ -155,4 +165,7 @@ __decorate([
|
|
|
155
165
|
__decorate([
|
|
156
166
|
property({ attribute: false })
|
|
157
167
|
], IgcGridLiteHeader.prototype, "adoptRootStyles", void 0);
|
|
168
|
+
__decorate([
|
|
169
|
+
property({ attribute: false })
|
|
170
|
+
], IgcGridLiteHeader.prototype, "_colIndex", void 0);
|
|
158
171
|
//# sourceMappingURL=header.js.map
|
package/components/header.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../src/components/header.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,2BAA2B,IAAI,0BAA0B,EACzD,qBAAqB,IAAI,oBAAoB,EAC7C,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAuB,MAAM,KAAK,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,0CAA0C,CAAC;AAClE,OAAO,EAAE,GAAG,EAAE,MAAM,wCAAwC,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,iBAAoC,SAAQ,UAAU;IAClE,MAAM,KAAK,OAAO;QACvB,OAAO,eAAe,CAAC;IACzB,CAAC;aAEsB,WAAM,GAAG,MAAM,AAAT,CAAU;IAEhC,MAAM,CAAC,QAAQ;QACpB,iBAAiB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IACzD,CAAC;IAID,IAAc,OAAO;QACnB,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;IAED,IAAc,UAAU;QACtB,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAYD;QACE,KAAK,EAAE,CAAC;QA5BO,6BAAwB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;QAyBtE,oBAAe,GAAG,KAAK,CAAC;QA+C/B,kBAAa,GAAG,CAAC,EAAE,OAAO,EAAgB,EAAE,EAAE;YAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC;YAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YAElC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC;QAaF,uBAAkB,GAAG,GAAG,EAAE;YACxB,IAAI,CAAC,gBAAgB,CAAC,eAAe,GAAG,KAAK,CAAC;YAC9C,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC,CAAC;QAEF,oBAAe,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAnExE,oBAAoB,CAAC,IAAI,EAAE,GAAG,EAAE;YAC9B,WAAW,EAAE,IAAI,CAAC,kBAAkB;SACrC,CAAC,CAAC;IACL,CAAC;IAEkB,MAAM,CAAC,KAA2B;QACnD,IAAI,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAC7C,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAC3D,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClE,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAC7C,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAC3D,CAAC;IACJ,CAAC;IAED,uBAAuB;QACrB,MAAM,MAAM,GAA4B,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAEvD,IAAI,CAAC,gBAAgB,CACnB,mBAAmB,EACnB,GAAG,EAAE;YACH,IAAI,CAAC,gBAAgB,CAAC,eAAe,GAAG,IAAI,CAAC;QAC/C,CAAC,EACD,MAAM,CACP,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAC7E,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3F,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3D,CAAC;IAED,YAAY,CAAC,CAAQ;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,aAAa,CAMX;IAEF,kBAAkB,CAAC,EAAgB;QACjC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;QAEjC,EAAE,CAAC,cAAc,EAAE,CAAC;QAEpB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEjC,MAAsB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,kBAAkB,CAIhB;IAEF,eAAe,CAA2D;IAEhE,cAAc;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;QAC1E,MAAM,IAAI,GACR,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAChG,MAAM,IAAI,GAAG,KAAK;YAChB,CAAC,CAAC,KAAK,CAAC,SAAS,KAAK,WAAW;gBAC/B,CAAC,CAAC,mBAAmB;gBACrB,CAAC,CAAC,oBAAoB;YACxB,CAAC,CAAC,mBAAmB,CAAC;QAExB,OAAO,KAAK,IAAI,IAAI,CAAC,UAAU;YAC7B,CAAC,CAAC,IAAI,CAAA;iBACK,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;mBACnD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO;;;mBAG7C,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;6BAC5B,IAAI;mBACd,IAAI;;;gBAGP;YACV,CAAC,CAAC,OAAO,CAAC;IACd,CAAC;IAES,iBAAiB;QACzB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QAE5C,OAAO,IAAI,CAAA;;gBAEC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA,GAAG,cAAc,EAAE;;KAEtE,CAAC;IACJ,CAAC;IAES,gBAAgB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS;YAC1B,CAAC,CAAC,IAAI,CAAA;;sBAEU,IAAI,CAAC,eAAe;yBACjB,IAAI,CAAC,kBAAkB;iBAC/B;YACX,CAAC,CAAC,OAAO,CAAC;IACd,CAAC;IAEkB,MAAM;QACvB,OAAO,IAAI,CAAA;;eAEA,OAAO,CAAC;YACb,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI,CAAC,UAAU;YACzB,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,eAAe;SAChD,CAAC;;UAEA,IAAI,CAAC,iBAAiB,EAAE;8BACJ,IAAI,CAAC,cAAc,EAAE;;QAE3C,IAAI,CAAC,gBAAgB,EAAE;KAC1B,CAAC;IACJ,CAAC;;AA7IM;IAFN,OAAO,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACzD,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gDACG;AAG3B;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;iDACQ;AAGhC;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;0DACA","sourcesContent":["import { consume } from '@lit/context';\nimport {\n θaddAdoptedStylesController as addAdoptedStylesController,\n θaddThemingController as addThemingController,\n IgcIconComponent,\n} from 'igniteui-webcomponents';\nimport { html, LitElement, nothing, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { StateController } from '../controllers/state.js';\nimport {\n MIN_COL_RESIZE_WIDTH,\n SORT_ICON_ASCENDING,\n SORT_ICON_DESCENDING,\n} from '../internal/constants.js';\nimport { GRID_STATE_CONTEXT } from '../internal/context.js';\nimport { partMap } from '../internal/part-map.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_HEADER_TAG } from '../internal/tags.js';\nimport type { ColumnConfiguration, IgcHeaderContext } from '../internal/types.js';\nimport { styles } from '../styles/header-cell/header-cell.css.js';\nimport { all } from '../styles/themes/grid-header-themes.js';\n\nexport default class IgcGridLiteHeader<T extends object> extends LitElement {\n public static get tagName() {\n return GRID_HEADER_TAG;\n }\n\n public static override styles = styles;\n\n public static register(): void {\n registerComponent(IgcGridLiteHeader, IgcIconComponent);\n }\n\n private readonly _adoptedStylesController = addAdoptedStylesController(this);\n\n protected get context(): IgcHeaderContext<T> {\n return {\n parent: this,\n column: this.column,\n };\n }\n\n protected get isSortable() {\n return Boolean(this.column.sortable);\n }\n\n protected get resizeController() {\n return this.state.resizing;\n }\n\n @consume({ context: GRID_STATE_CONTEXT, subscribe: true })\n @property({ attribute: false })\n public state!: StateController<T>;\n\n @property({ attribute: false })\n public column!: ColumnConfiguration<T>;\n\n @property({ attribute: false })\n public adoptRootStyles = false;\n\n constructor() {\n super();\n\n addThemingController(this, all, {\n themeChange: this._handleThemeChange,\n });\n }\n\n protected override update(props: PropertyValues<this>): void {\n if (props.has('adoptRootStyles')) {\n this._adoptedStylesController.shouldAdoptStyles(\n this.adoptRootStyles && this.column.headerTemplate != null\n );\n }\n\n super.update(props);\n }\n\n private _handleThemeChange() {\n this._adoptedStylesController.invalidateCache(this.ownerDocument);\n this._adoptedStylesController.shouldAdoptStyles(\n this.adoptRootStyles && this.column.headerTemplate != null\n );\n }\n\n #addResizeEventHandlers() {\n const config: AddEventListenerOptions = { once: true };\n\n this.addEventListener(\n 'gotpointercapture',\n () => {\n this.resizeController.indicatorActive = true;\n },\n config\n );\n this.addEventListener('lostpointercapture', this.#handlePointerLost, config);\n this.addEventListener('pointerup', (e) => this.releasePointerCapture(e.pointerId), config);\n this.addEventListener('pointermove', this.#handleResize);\n }\n\n #handleClick(e: Event) {\n e.stopPropagation();\n this.state.sorting.sortFromHeaderClick(this.column);\n }\n\n #handleResize = ({ clientX }: PointerEvent) => {\n const { left } = this.getBoundingClientRect();\n const width = Math.max(clientX - left, MIN_COL_RESIZE_WIDTH);\n const x = this.offsetLeft + width;\n\n this.resizeController.resize(this.column, width, x);\n };\n\n #handleResizeStart(ev: PointerEvent) {\n const { target, pointerId } = ev;\n\n ev.preventDefault();\n\n this.#addResizeEventHandlers();\n this.resizeController.start(this);\n\n (target as HTMLElement).setPointerCapture(pointerId);\n }\n\n #handlePointerLost = () => {\n this.resizeController.indicatorActive = false;\n this.removeEventListener('pointermove', this.#handleResize);\n this.resizeController.stop();\n };\n\n #handleAutosize = () => this.resizeController.autosize(this.column, this);\n\n protected renderSortPart() {\n const state = this.state.sorting.state.get(this.column.field);\n const idx = Array.from(this.state.sorting.state.values()).indexOf(state!);\n const attr =\n this.state.host.sortingOptions.mode === 'multiple' ? (idx > -1 ? idx + 1 : nothing) : nothing;\n const icon = state\n ? state.direction === 'ascending'\n ? SORT_ICON_ASCENDING\n : SORT_ICON_DESCENDING\n : SORT_ICON_ASCENDING;\n\n return state || this.isSortable\n ? html`<span\n part=${partMap({ action: true, sorted: !!state?.direction })}\n @click=${this.isSortable ? this.#handleClick : nothing}\n >\n <igc-icon\n part=${partMap({ 'sorting-action': !!state })}\n data-sortIndex=${attr}\n name=${icon}\n collection=\"internal\"\n ></igc-icon>\n </span>`\n : nothing;\n }\n\n protected renderContentPart() {\n const defaultContent = this.column.header ?? this.column.field;\n const template = this.column.headerTemplate;\n\n return html`\n <span part=\"title\">\n <span>${template ? template(this.context) : html`${defaultContent}`}</span>\n </span>\n `;\n }\n\n protected renderResizePart() {\n return this.column.resizable\n ? html`<span\n part=\"resizable\"\n @dblclick=${this.#handleAutosize}\n @pointerdown=${this.#handleResizeStart}\n ></span>`\n : nothing;\n }\n\n protected override render() {\n return html`\n <div\n part=${partMap({\n content: true,\n sortable: this.isSortable,\n resizing: this.resizeController.indicatorActive,\n })}\n >\n ${this.renderContentPart()}\n <div part=\"actions\">${this.renderSortPart()}</div>\n </div>\n ${this.renderResizePart()}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcGridLiteHeader.tagName]: IgcGridLiteHeader<object>;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../src/components/header.ts"],"names":[],"mappings":"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","sourcesContent":["import { consume } from '@lit/context';\nimport {\n θaddAdoptedStylesController as addAdoptedStylesController,\n θaddThemingController as addThemingController,\n IgcIconComponent,\n} from 'igniteui-webcomponents';\nimport { html, LitElement, nothing, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { StateController } from '../controllers/state.js';\nimport { addA11y } from '../internal/a11y.js';\nimport {\n MIN_COL_RESIZE_WIDTH,\n SORT_ICON_ASCENDING,\n SORT_ICON_DESCENDING,\n} from '../internal/constants.js';\nimport { GRID_STATE_CONTEXT } from '../internal/context.js';\nimport { partMap } from '../internal/part-map.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_HEADER_TAG } from '../internal/tags.js';\nimport type { ColumnConfiguration, IgcHeaderContext } from '../internal/types.js';\nimport { styles } from '../styles/header-cell/header-cell.css.js';\nimport { all } from '../styles/themes/grid-header-themes.js';\n\nexport default class IgcGridLiteHeader<T extends object> extends LitElement {\n public static get tagName() {\n return GRID_HEADER_TAG;\n }\n\n public static override styles = styles;\n\n public static register(): void {\n registerComponent(IgcGridLiteHeader, IgcIconComponent);\n }\n\n private readonly _adoptedStylesController = addAdoptedStylesController(this);\n private readonly _a11y = addA11y(this, 'columnheader');\n\n protected get context(): IgcHeaderContext<T> {\n return {\n parent: this,\n column: this.column,\n };\n }\n\n protected get isSortable() {\n return Boolean(this.column.sortable);\n }\n\n protected get resizeController() {\n return this.state.resizing;\n }\n\n @consume({ context: GRID_STATE_CONTEXT, subscribe: true })\n @property({ attribute: false })\n public state!: StateController<T>;\n\n @property({ attribute: false })\n public column!: ColumnConfiguration<T>;\n\n @property({ attribute: false })\n public adoptRootStyles = false;\n\n /**\n * Position of the header 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 constructor() {\n super();\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 protected override update(props: PropertyValues<this>): void {\n if (props.has('adoptRootStyles') || props.has('column')) {\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n // Sort state reaches the header as a context ping, not a property change, so\n // the ARIA state is resolved on each update instead of dirty-checked.\n this._a11y.set({ ariaColIndex: `${this._colIndex}`, ariaSort: this.#ariaSort() });\n\n super.update(props);\n }\n\n /** `aria-sort` applies only to a sortable header. */\n #ariaSort(): string | null {\n if (!this.isSortable) {\n return null;\n }\n\n return this.state.sorting.state.get(this.column.field)?.direction ?? 'none';\n }\n\n private _handleThemeChange() {\n this._adoptedStylesController.invalidateCache(this.ownerDocument);\n this._adoptedStylesController.shouldAdoptStyles(this._shouldAdoptStyles);\n }\n\n #addResizeEventHandlers() {\n const config: AddEventListenerOptions = { once: true };\n\n this.addEventListener(\n 'gotpointercapture',\n () => {\n this.resizeController.indicatorActive = true;\n },\n config\n );\n this.addEventListener('lostpointercapture', this.#handlePointerLost, config);\n this.addEventListener('pointerup', (e) => this.releasePointerCapture(e.pointerId), config);\n this.addEventListener('pointermove', this.#handleResize);\n }\n\n #handleClick(e: Event) {\n e.stopPropagation();\n this.state.sorting.sortFromHeaderClick(this.column);\n }\n\n #handleResize = ({ clientX }: PointerEvent) => {\n const { left } = this.getBoundingClientRect();\n const width = Math.max(clientX - left, MIN_COL_RESIZE_WIDTH);\n const x = this.offsetLeft + width;\n\n this.resizeController.resize(this.column, width, x);\n };\n\n #handleResizeStart(ev: PointerEvent) {\n const { target, pointerId } = ev;\n\n ev.preventDefault();\n\n this.#addResizeEventHandlers();\n this.resizeController.start(this);\n\n (target as HTMLElement).setPointerCapture(pointerId);\n }\n\n #handlePointerLost = () => {\n this.resizeController.indicatorActive = false;\n this.removeEventListener('pointermove', this.#handleResize);\n this.resizeController.stop();\n };\n\n #handleAutosize = () => this.resizeController.autosize(this.column, this);\n\n protected renderSortPart() {\n const state = this.state.sorting.state.get(this.column.field);\n\n if (!(state || this.isSortable)) {\n return nothing;\n }\n\n // The 1-based position of the column in the multi-sort order.\n const position = Array.from(this.state.sorting.state.keys()).indexOf(this.column.field);\n const multiple = this.state.host.sortingOptions.mode === 'multiple';\n const icon = state?.direction === 'descending' ? SORT_ICON_DESCENDING : SORT_ICON_ASCENDING;\n\n return html`<span\n part=${partMap({ action: true, sorted: !!state?.direction })}\n @click=${this.isSortable ? this.#handleClick : nothing}\n >\n <igc-icon\n part=${partMap({ 'sorting-action': !!state })}\n data-sortIndex=${multiple && position > -1 ? position + 1 : nothing}\n name=${icon}\n collection=\"internal\"\n ></igc-icon>\n </span>`;\n }\n\n protected renderContentPart() {\n const defaultContent = this.column.header ?? this.column.field;\n const template = this.column.headerTemplate;\n\n return html`\n <span part=\"title\">\n <span>${template ? template(this.context) : html`${defaultContent}`}</span>\n </span>\n `;\n }\n\n protected renderResizePart() {\n return this.column.resizable\n ? html`<span\n part=\"resizable\"\n @dblclick=${this.#handleAutosize}\n @pointerdown=${this.#handleResizeStart}\n ></span>`\n : nothing;\n }\n\n protected override render() {\n return html`\n <div\n part=${partMap({\n content: true,\n sortable: this.isSortable,\n resizing: this.resizeController.indicatorActive,\n })}\n >\n ${this.renderContentPart()}\n <div part=\"actions\">${this.renderSortPart()}</div>\n </div>\n ${this.renderResizePart()}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcGridLiteHeader.tagName]: IgcGridLiteHeader<object>;\n }\n}\n"]}
|
package/components/row.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LitElement } from 'lit';
|
|
1
|
+
import { LitElement, type PropertyValues } from 'lit';
|
|
2
2
|
import type { ActiveNode, ColumnConfiguration } from '../internal/types.js';
|
|
3
3
|
import IgcGridLiteCell from './cell.js';
|
|
4
4
|
/**
|
|
@@ -8,12 +8,15 @@ export default class IgcGridLiteRow<T extends object> extends LitElement {
|
|
|
8
8
|
static get tagName(): "igc-grid-lite-row";
|
|
9
9
|
static styles: import("lit").CSSResult;
|
|
10
10
|
static register(): void;
|
|
11
|
+
private readonly _a11y;
|
|
11
12
|
adoptRootStyles: boolean;
|
|
12
13
|
data?: T;
|
|
13
14
|
columns: Array<ColumnConfiguration<T>>;
|
|
14
15
|
activeNode?: ActiveNode<T>;
|
|
15
16
|
index: number;
|
|
16
17
|
get cells(): IgcGridLiteCell<T>[];
|
|
18
|
+
protected update(props: PropertyValues<this>): void;
|
|
19
|
+
protected updated(): void;
|
|
17
20
|
protected render(): import("lit-html").TemplateResult<1>;
|
|
18
21
|
}
|
|
19
22
|
declare global {
|
package/components/row.js
CHANGED
|
@@ -7,14 +7,17 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { html, LitElement } from 'lit';
|
|
8
8
|
import { property } from 'lit/decorators.js';
|
|
9
9
|
import { repeat } from 'lit/directives/repeat.js';
|
|
10
|
+
import { addA11y, headerRowsFor } from '../internal/a11y.js';
|
|
10
11
|
import { registerComponent } from '../internal/register.js';
|
|
11
12
|
import { GRID_ROW_TAG } from '../internal/tags.js';
|
|
12
13
|
import { resolveFieldValue } from '../internal/utils.js';
|
|
13
14
|
import { styles } from '../styles/body-row/body-row.css.js';
|
|
14
15
|
import IgcGridLiteCell from './cell.js';
|
|
16
|
+
const ACTIVE_ROW_Z_INDEX = '3';
|
|
15
17
|
export default class IgcGridLiteRow extends LitElement {
|
|
16
18
|
constructor() {
|
|
17
19
|
super(...arguments);
|
|
20
|
+
this._a11y = addA11y(this, 'row');
|
|
18
21
|
this.adoptRootStyles = false;
|
|
19
22
|
this.columns = [];
|
|
20
23
|
this.index = -1;
|
|
@@ -29,14 +32,22 @@ export default class IgcGridLiteRow extends LitElement {
|
|
|
29
32
|
get cells() {
|
|
30
33
|
return Array.from(this.renderRoot.querySelectorAll(IgcGridLiteCell.tagName));
|
|
31
34
|
}
|
|
35
|
+
update(props) {
|
|
36
|
+
this._a11y.set({ ariaRowIndex: `${this.index + headerRowsFor(this.columns) + 1}` });
|
|
37
|
+
super.update(props);
|
|
38
|
+
}
|
|
39
|
+
updated() {
|
|
40
|
+
this.style.zIndex = this.activeNode?.row === this.index ? ACTIVE_ROW_Z_INDEX : '';
|
|
41
|
+
}
|
|
32
42
|
render() {
|
|
33
43
|
const { column: key, row: index } = this.activeNode ?? {};
|
|
34
44
|
const data = this.data ?? {};
|
|
35
45
|
const columns = this.columns.filter((column) => !column.hidden);
|
|
36
46
|
return html `
|
|
37
|
-
${repeat(columns, (column) => column, (column) => html `
|
|
47
|
+
${repeat(columns, (column) => column.field, (column, colIndex) => html `
|
|
38
48
|
<igc-grid-lite-cell
|
|
39
49
|
part="cell"
|
|
50
|
+
._colIndex=${colIndex + 1}
|
|
40
51
|
.adoptRootStyles=${this.adoptRootStyles}
|
|
41
52
|
.active=${key === column.field && index === this.index}
|
|
42
53
|
.column=${column}
|
package/components/row.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"row.js","sourceRoot":"","sources":["../../src/components/row.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"row.js","sourceRoot":"","sources":["../../src/components/row.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { addA11y, headerRowsFor } from '../internal/a11y.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_ROW_TAG } from '../internal/tags.js';\nimport type { ActiveNode, ColumnConfiguration } from '../internal/types.js';\nimport { resolveFieldValue } from '../internal/utils.js';\nimport { styles } from '../styles/body-row/body-row.css.js';\nimport IgcGridLiteCell from './cell.js';\n\nconst ACTIVE_ROW_Z_INDEX = '3';\n\n/**\n * Component representing the DOM row in the IgcGridLite.\n */\nexport default class IgcGridLiteRow<T extends object> extends LitElement {\n public static get tagName() {\n return GRID_ROW_TAG;\n }\n public static override styles = styles;\n\n public static register(): void {\n registerComponent(IgcGridLiteRow, IgcGridLiteCell);\n }\n\n private readonly _a11y = addA11y(this, 'row');\n\n @property({ attribute: false })\n public adoptRootStyles = false;\n\n @property({ attribute: false })\n public data?: T;\n\n @property({ attribute: false })\n public columns: Array<ColumnConfiguration<T>> = [];\n\n @property({ attribute: false })\n public activeNode?: ActiveNode<T>;\n\n @property({ type: Number, attribute: false })\n public index = -1;\n\n public get cells(): IgcGridLiteCell<T>[] {\n return Array.from(\n this.renderRoot.querySelectorAll<IgcGridLiteCell<T>>(IgcGridLiteCell.tagName)\n );\n }\n\n protected override update(props: PropertyValues<this>): void {\n // Data rows come after the header rows in the 1-based row index space.\n this._a11y.set({ ariaRowIndex: `${this.index + headerRowsFor(this.columns) + 1}` });\n\n super.update(props);\n }\n\n protected override updated(): void {\n // The active row paints above its neighbors so that the focus outline is not\n // clipped. Set after commit: the first render writes the full style attribute.\n this.style.zIndex = this.activeNode?.row === this.index ? ACTIVE_ROW_Z_INDEX : '';\n }\n\n protected override render() {\n const { column: key, row: index } = this.activeNode ?? {};\n const data = this.data ?? ({} as T);\n\n const columns = this.columns.filter((column) => !column.hidden);\n\n return html`\n ${repeat(\n columns,\n (column) => column.field,\n (column, colIndex) => html`\n <igc-grid-lite-cell\n part=\"cell\"\n ._colIndex=${colIndex + 1}\n .adoptRootStyles=${this.adoptRootStyles}\n .active=${key === column.field && index === this.index}\n .column=${column}\n .cellTemplate=${column.cellTemplate}\n .row=${this as IgcGridLiteRow<T>}\n .rowIndex=${this.index}\n .value=${resolveFieldValue(data, column.field)}\n ></igc-grid-lite-cell>\n `\n )}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcGridLiteRow.tagName]: IgcGridLiteRow<object>;\n }\n}\n"]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { LitVirtualizer } from '@lit-labs/virtualizer/LitVirtualizer.js';
|
|
2
2
|
export default class IgcVirtualizer extends LitVirtualizer {
|
|
3
|
-
|
|
3
|
+
#private;
|
|
4
|
+
static get tagName(): "igc-grid-lite-virtualizer";
|
|
4
5
|
layout: LitVirtualizer['layout'];
|
|
5
6
|
static register(): void;
|
|
6
7
|
scroller: boolean;
|
|
8
|
+
constructor();
|
|
7
9
|
}
|
|
8
10
|
declare global {
|
|
9
11
|
interface HTMLElementTagNameMap {
|
|
@@ -1,20 +1,49 @@
|
|
|
1
1
|
import { LitVirtualizer } from '@lit-labs/virtualizer/LitVirtualizer.js';
|
|
2
|
+
import { addA11y } from '../internal/a11y.js';
|
|
3
|
+
import { FOCUS_WITHIN } from '../internal/constants.js';
|
|
2
4
|
import { registerComponent } from '../internal/register.js';
|
|
3
|
-
import {
|
|
5
|
+
import { GRID_VIRTUALIZER_TAG } from '../internal/tags.js';
|
|
4
6
|
import { IgcFlowLayout } from '../internal/virt-flow-layout.js';
|
|
7
|
+
const RANGE_CHANGED = 'rangeChanged';
|
|
5
8
|
export default class IgcVirtualizer extends LitVirtualizer {
|
|
9
|
+
static get tagName() {
|
|
10
|
+
return GRID_VIRTUALIZER_TAG;
|
|
11
|
+
}
|
|
12
|
+
static register() {
|
|
13
|
+
registerComponent(IgcVirtualizer);
|
|
14
|
+
}
|
|
15
|
+
#ownsFocus;
|
|
6
16
|
constructor() {
|
|
7
|
-
super(
|
|
17
|
+
super();
|
|
8
18
|
this.layout = {
|
|
9
19
|
type: IgcFlowLayout,
|
|
10
20
|
};
|
|
11
21
|
this.scroller = true;
|
|
22
|
+
this.#ownsFocus = false;
|
|
23
|
+
this.#handleFocusOut = (event) => {
|
|
24
|
+
const { relatedTarget } = event;
|
|
25
|
+
if (relatedTarget instanceof Node) {
|
|
26
|
+
this.#ownsFocus = this.contains(relatedTarget);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const [origin] = event.composedPath();
|
|
30
|
+
queueMicrotask(() => {
|
|
31
|
+
this.#ownsFocus = !origin.isConnected;
|
|
32
|
+
this.#reclaimFocus();
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
addA11y(this, 'rowgroup');
|
|
36
|
+
this.addEventListener('focusin', () => {
|
|
37
|
+
this.#ownsFocus = true;
|
|
38
|
+
});
|
|
39
|
+
this.addEventListener('focusout', this.#handleFocusOut);
|
|
40
|
+
this.addEventListener(RANGE_CHANGED, () => this.#reclaimFocus());
|
|
12
41
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
42
|
+
#handleFocusOut;
|
|
43
|
+
#reclaimFocus() {
|
|
44
|
+
if (this.#ownsFocus && !this.matches(FOCUS_WITHIN)) {
|
|
45
|
+
this.focus({ preventScroll: true });
|
|
46
|
+
}
|
|
18
47
|
}
|
|
19
48
|
}
|
|
20
49
|
//# sourceMappingURL=virtualizer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtualizer.js","sourceRoot":"","sources":["../../src/components/virtualizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"virtualizer.js","sourceRoot":"","sources":["../../src/components/virtualizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,MAAM,aAAa,GAAG,cAAc,CAAC;AAErC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,cAAc;IACjD,MAAM,KAAK,OAAO;QACvB,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAMM,MAAM,CAAC,QAAQ;QACpB,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;IAKD,UAAU,CAAS;IAEnB;QACE,KAAK,EAAE,CAAC;QAdM,WAAM,GAA6B;YACjD,IAAI,EAAE,aAAa;SACpB,CAAC;QAMc,aAAQ,GAAG,IAAI,CAAC;QAGhC,eAAU,GAAG,KAAK,CAAC;QAkBnB,oBAAe,GAAG,CAAC,KAAiB,EAAQ,EAAE;YAC5C,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;YAEhC,IAAI,aAAa,YAAY,IAAI,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YAKD,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;YAEtC,cAAc,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC,UAAU,GAAG,CAAE,MAAe,CAAC,WAAW,CAAC;gBAChD,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QA1BA,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAE1B,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE;YACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACxD,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,eAAe,CAiBb;IAMF,aAAa;QACX,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;CACF","sourcesContent":["import { LitVirtualizer } from '@lit-labs/virtualizer/LitVirtualizer.js';\nimport { addA11y } from '../internal/a11y.js';\nimport { FOCUS_WITHIN } from '../internal/constants.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_VIRTUALIZER_TAG } from '../internal/tags.js';\nimport { IgcFlowLayout } from '../internal/virt-flow-layout.js';\n\nconst RANGE_CHANGED = 'rangeChanged';\n\nexport default class IgcVirtualizer extends LitVirtualizer {\n public static get tagName() {\n return GRID_VIRTUALIZER_TAG;\n }\n\n public override layout: LitVirtualizer['layout'] = {\n type: IgcFlowLayout,\n };\n\n public static register(): void {\n registerComponent(IgcVirtualizer);\n }\n\n public override scroller = true;\n\n /** True while DOM focus is inside the data area. */\n #ownsFocus = false;\n\n constructor() {\n super();\n\n // The data area is the tab stop of the grid. Navigation moves DOM focus onto\n // the active cell (roving focus). `aria-activedescendant` is not an option:\n // the cell is in a row shadow root and IDREF lookups do not cross shadow\n // boundaries.\n addA11y(this, 'rowgroup');\n\n this.addEventListener('focusin', () => {\n this.#ownsFocus = true;\n });\n this.addEventListener('focusout', this.#handleFocusOut);\n this.addEventListener(RANGE_CHANGED, () => this.#reclaimFocus());\n }\n\n #handleFocusOut = (event: FocusEvent): void => {\n const { relatedTarget } = event;\n\n if (relatedTarget instanceof Node) {\n this.#ownsFocus = this.contains(relatedTarget);\n return;\n }\n\n // No element gained focus. Either the user focused empty space, or\n // virtualization removes the focused cell. The event fires while the cell is\n // still connected, so the two cases become distinct one microtask later.\n const [origin] = event.composedPath();\n\n queueMicrotask(() => {\n this.#ownsFocus = !(origin as Node).isConnected;\n this.#reclaimFocus();\n });\n };\n\n /**\n * A long scroll removes the focused cell and focus falls back to the document\n * body. Take the focus back so that keyboard navigation continues to work.\n */\n #reclaimFocus(): void {\n if (this.#ownsFocus && !this.matches(FOCUS_WITHIN)) {\n this.focus({ preventScroll: true });\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [IgcVirtualizer.tagName]: IgcVirtualizer;\n }\n}\n"]}
|
|
@@ -9,10 +9,6 @@ declare class DataOperationsController<T extends object> implements ReactiveCont
|
|
|
9
9
|
protected filtering: FilterDataOperation<T>;
|
|
10
10
|
constructor(host: GridHost<T>);
|
|
11
11
|
hostConnected(): void;
|
|
12
|
-
protected get hasCustomSort(): boolean;
|
|
13
|
-
protected get hasCustomFilter(): boolean;
|
|
14
|
-
protected get customFilter(): import("../index.js").DataPipelineHook<T>;
|
|
15
|
-
protected get customSort(): import("../index.js").DataPipelineHook<T>;
|
|
16
12
|
apply(data: T[], state: StateController<T>): Promise<T[]>;
|
|
17
13
|
}
|
|
18
14
|
declare function createDataOperationsController<T extends object>(host: GridHost<T>): DataOperationsController<T>;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isDefined } from '../internal/is-defined.js';
|
|
2
1
|
import FilterDataOperation from '../operations/filter.js';
|
|
3
2
|
import SortDataOperation from '../operations/sort.js';
|
|
4
3
|
class DataOperationsController {
|
|
@@ -9,28 +8,14 @@ class DataOperationsController {
|
|
|
9
8
|
this.host.addController(this);
|
|
10
9
|
}
|
|
11
10
|
hostConnected() { }
|
|
12
|
-
get hasCustomSort() {
|
|
13
|
-
return isDefined(this.host.dataPipelineConfiguration?.sort);
|
|
14
|
-
}
|
|
15
|
-
get hasCustomFilter() {
|
|
16
|
-
return isDefined(this.host.dataPipelineConfiguration?.filter);
|
|
17
|
-
}
|
|
18
|
-
get customFilter() {
|
|
19
|
-
return this.host.dataPipelineConfiguration.filter;
|
|
20
|
-
}
|
|
21
|
-
get customSort() {
|
|
22
|
-
return this.host.dataPipelineConfiguration.sort;
|
|
23
|
-
}
|
|
24
11
|
async apply(data, state) {
|
|
25
|
-
const {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
: this.sorting.apply(transformed, sorting.state);
|
|
33
|
-
return transformed;
|
|
12
|
+
const { filter, sort } = this.host.dataPipelineConfiguration ?? {};
|
|
13
|
+
const filtered = filter
|
|
14
|
+
? await filter({ data, grid: this.host, type: 'filter' })
|
|
15
|
+
: this.filtering.apply(data, state.filtering.state);
|
|
16
|
+
return sort
|
|
17
|
+
? await sort({ data: filtered, grid: this.host, type: 'sort' })
|
|
18
|
+
: this.sorting.apply(filtered, state.sorting.state);
|
|
34
19
|
}
|
|
35
20
|
}
|
|
36
21
|
function createDataOperationsController(host) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-operation.js","sourceRoot":"","sources":["../../src/controllers/data-operation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data-operation.js","sourceRoot":"","sources":["../../src/controllers/data-operation.ts"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,yBAAyB,CAAC;AAC1D,OAAO,iBAAiB,MAAM,uBAAuB,CAAC;AAGtD,MAAM,wBAAwB;IAI5B,YAAsB,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;QAH7B,YAAO,GAAG,IAAI,iBAAiB,EAAK,CAAC;QACrC,cAAS,GAAG,IAAI,mBAAmB,EAAK,CAAC;QAGjD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAEM,aAAa,KAAI,CAAC;IAElB,KAAK,CAAC,KAAK,CAAC,IAAS,EAAE,KAAyB;QAErD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,yBAAyB,IAAI,EAAE,CAAC;QAEnE,MAAM,QAAQ,GAAG,MAAM;YACrB,CAAC,CAAC,MAAM,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACzD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEtD,OAAO,IAAI;YACT,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC/D,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;CACF;AAED,SAAS,8BAA8B,CACrC,IAAiB;IAEjB,OAAO,IAAI,wBAAwB,CAAI,IAAI,CAAC,CAAC;AAC/C,CAAC;AAGD,OAAO,EAAE,8BAA8B,EAAE,CAAC","sourcesContent":["import type { ReactiveController } from 'lit';\nimport type { GridHost } from '../internal/types.js';\nimport FilterDataOperation from '../operations/filter.js';\nimport SortDataOperation from '../operations/sort.js';\nimport type { StateController } from './state.js';\n\nclass DataOperationsController<T extends object> implements ReactiveController {\n protected sorting = new SortDataOperation<T>();\n protected filtering = new FilterDataOperation<T>();\n\n constructor(protected host: GridHost<T>) {\n this.host.addController(this);\n }\n\n public hostConnected() {}\n\n public async apply(data: T[], state: StateController<T>) {\n // A hook, when configured, replaces the built-in operation.\n const { filter, sort } = this.host.dataPipelineConfiguration ?? {};\n\n const filtered = filter\n ? await filter({ data, grid: this.host, type: 'filter' })\n : this.filtering.apply(data, state.filtering.state);\n\n return sort\n ? await sort({ data: filtered, grid: this.host, type: 'sort' })\n : this.sorting.apply(filtered, state.sorting.state);\n }\n}\n\nfunction createDataOperationsController<T extends object>(\n host: GridHost<T>\n): DataOperationsController<T> {\n return new DataOperationsController<T>(host);\n}\n\nexport type { DataOperationsController };\nexport { createDataOperationsController };\n"]}
|
package/controllers/dom.d.ts
CHANGED
|
@@ -1,18 +1,37 @@
|
|
|
1
1
|
import type { ReactiveController } from 'lit';
|
|
2
2
|
import type { StyleInfo } from 'lit/directives/style-map.js';
|
|
3
|
-
import type
|
|
4
|
-
import type
|
|
3
|
+
import type IgcFilterRow from '../components/filter-row.js';
|
|
4
|
+
import type IgcGridLiteHeaderRow from '../components/header-row.js';
|
|
5
|
+
import type IgcGridLiteRow from '../components/row.js';
|
|
6
|
+
import type IgcVirtualizer from '../components/virtualizer.js';
|
|
7
|
+
import type { ColumnConfiguration, GridHost } from '../internal/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Owns the DOM concerns of the grid: element queries into the render root, the
|
|
10
|
+
* derived column track sizes, and the scrollbar offset measurement.
|
|
11
|
+
*/
|
|
5
12
|
declare class GridDOMController<T extends object> implements ReactiveController {
|
|
13
|
+
#private;
|
|
6
14
|
protected readonly _host: GridHost<T>;
|
|
7
|
-
|
|
8
|
-
constructor(host: GridHost<T>, state: StateController<T>);
|
|
15
|
+
constructor(host: GridHost<T>);
|
|
9
16
|
columnSizes: StyleInfo;
|
|
17
|
+
/** Returns the header row element of the grid. */
|
|
18
|
+
get headerRow(): IgcGridLiteHeaderRow<T> | null;
|
|
19
|
+
/** Returns the filter row element of the grid. */
|
|
20
|
+
get filterRow(): IgcFilterRow<T> | null;
|
|
21
|
+
/** Returns the data row elements of the grid. */
|
|
22
|
+
get rows(): IgcGridLiteRow<T>[];
|
|
23
|
+
/** Returns the virtualizer element of the grid. */
|
|
24
|
+
get virtualizer(): IgcVirtualizer | null;
|
|
10
25
|
hostConnected(): void;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
26
|
+
hostDisconnected(): void;
|
|
27
|
+
/** Scrolls the data area back to the top. */
|
|
28
|
+
resetScrollPosition(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Re-derives the column track sizes. Column configurations are immutable: an
|
|
31
|
+
* unchanged array identity means the current sizes are still correct.
|
|
32
|
+
*/
|
|
33
|
+
setColumns(columns: ColumnConfiguration<T>[]): void;
|
|
15
34
|
}
|
|
16
|
-
declare function createDomController<T extends object>(host: GridHost<T
|
|
35
|
+
declare function createDomController<T extends object>(host: GridHost<T>): GridDOMController<T>;
|
|
17
36
|
export type { GridDOMController };
|
|
18
37
|
export { createDomController };
|
package/controllers/dom.js
CHANGED
|
@@ -1,40 +1,90 @@
|
|
|
1
1
|
import { registerGridIcons } from '../internal/icon-registry.js';
|
|
2
|
+
import { GRID_FILTER_ROW_TAG, GRID_HEADER_ROW_TAG, GRID_ROW_TAG, GRID_VIRTUALIZER_TAG, } from '../internal/tags.js';
|
|
2
3
|
import { applyColumnWidths } from '../internal/utils.js';
|
|
4
|
+
const SCROLLBAR_OFFSET_VAR = '--scrollbar-offset';
|
|
5
|
+
const VISIBILITY_CHANGED = 'visibilityChanged';
|
|
3
6
|
class GridDOMController {
|
|
4
|
-
|
|
7
|
+
#observed;
|
|
8
|
+
#resizeObserver;
|
|
9
|
+
#scrollOffset;
|
|
10
|
+
#pendingFrame;
|
|
11
|
+
#columns;
|
|
12
|
+
#onScrollbarChange;
|
|
13
|
+
constructor(host) {
|
|
14
|
+
this.#scrollOffset = -1;
|
|
15
|
+
this.#onScrollbarChange = () => {
|
|
16
|
+
if (this.#pendingFrame !== undefined) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
this.#pendingFrame = requestAnimationFrame(() => {
|
|
20
|
+
this.#pendingFrame = undefined;
|
|
21
|
+
this.#applyScrollOffset();
|
|
22
|
+
});
|
|
23
|
+
};
|
|
5
24
|
this.columnSizes = {};
|
|
6
25
|
this._host = host;
|
|
7
|
-
this._state = state;
|
|
8
26
|
this._host.addController(this);
|
|
9
27
|
}
|
|
28
|
+
get headerRow() {
|
|
29
|
+
return this._host.renderRoot.querySelector(GRID_HEADER_ROW_TAG);
|
|
30
|
+
}
|
|
31
|
+
get filterRow() {
|
|
32
|
+
return this._host.renderRoot.querySelector(GRID_FILTER_ROW_TAG);
|
|
33
|
+
}
|
|
34
|
+
get rows() {
|
|
35
|
+
return Array.from(this._host.renderRoot.querySelectorAll(GRID_ROW_TAG));
|
|
36
|
+
}
|
|
37
|
+
get virtualizer() {
|
|
38
|
+
return this._host.renderRoot.querySelector(GRID_VIRTUALIZER_TAG);
|
|
39
|
+
}
|
|
10
40
|
hostConnected() {
|
|
11
41
|
registerGridIcons();
|
|
12
|
-
this.setGridColumnSizes();
|
|
13
42
|
this._host.updateComplete.then(() => {
|
|
14
|
-
this
|
|
15
|
-
this.setScrollOffset();
|
|
16
|
-
}, { once: true });
|
|
43
|
+
this.#observeVirtualizer();
|
|
17
44
|
});
|
|
18
45
|
}
|
|
19
|
-
|
|
20
|
-
this
|
|
21
|
-
|
|
46
|
+
hostDisconnected() {
|
|
47
|
+
if (this.#pendingFrame !== undefined) {
|
|
48
|
+
cancelAnimationFrame(this.#pendingFrame);
|
|
49
|
+
this.#pendingFrame = undefined;
|
|
50
|
+
}
|
|
51
|
+
this.#resizeObserver?.disconnect();
|
|
52
|
+
this.#resizeObserver = undefined;
|
|
53
|
+
this.#observed?.removeEventListener(VISIBILITY_CHANGED, this.#onScrollbarChange);
|
|
54
|
+
this.#observed = undefined;
|
|
55
|
+
}
|
|
56
|
+
#observeVirtualizer() {
|
|
57
|
+
const virtualizer = this.virtualizer;
|
|
58
|
+
if (!virtualizer || virtualizer === this.#observed) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.#observed = virtualizer;
|
|
62
|
+
virtualizer.addEventListener(VISIBILITY_CHANGED, this.#onScrollbarChange);
|
|
63
|
+
this.#resizeObserver = new ResizeObserver(this.#onScrollbarChange);
|
|
64
|
+
this.#resizeObserver.observe(virtualizer);
|
|
22
65
|
}
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
66
|
+
#applyScrollOffset() {
|
|
67
|
+
const virtualizer = this.#observed;
|
|
68
|
+
const offset = virtualizer ? virtualizer.offsetWidth - virtualizer.clientWidth : 0;
|
|
69
|
+
if (offset === this.#scrollOffset) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.#scrollOffset = offset;
|
|
73
|
+
this._host.style.setProperty(SCROLLBAR_OFFSET_VAR, `${offset}px`);
|
|
28
74
|
}
|
|
29
|
-
|
|
30
|
-
this.
|
|
75
|
+
resetScrollPosition() {
|
|
76
|
+
this.virtualizer?.scrollTo({ top: 0 });
|
|
31
77
|
}
|
|
32
|
-
|
|
33
|
-
|
|
78
|
+
setColumns(columns) {
|
|
79
|
+
if (columns === this.#columns) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
this.#columns = columns;
|
|
83
|
+
this.columnSizes = applyColumnWidths(columns);
|
|
34
84
|
}
|
|
35
85
|
}
|
|
36
|
-
function createDomController(host
|
|
37
|
-
return new GridDOMController(host
|
|
86
|
+
function createDomController(host) {
|
|
87
|
+
return new GridDOMController(host);
|
|
38
88
|
}
|
|
39
89
|
export { createDomController };
|
|
40
90
|
//# sourceMappingURL=dom.js.map
|