@ni/nimble-components 18.0.2 → 18.0.3

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.
@@ -1,6 +1,7 @@
1
1
  import { FoundationElement } from '@microsoft/fast-foundation';
2
2
  import type { TableColumn } from '../table-column/base';
3
3
  import type { TableRecord, TableRowState, TableValidity } from './types';
4
+ import { Virtualizer } from './models/virtualizer';
4
5
  declare global {
5
6
  interface HTMLElementTagNameMap {
6
7
  'nimble-table': Table;
@@ -21,12 +22,22 @@ export declare class Table<TData extends TableRecord = TableRecord> extends Foun
21
22
  */
22
23
  canRenderRows: boolean;
23
24
  get validity(): TableValidity;
25
+ /**
26
+ * @internal
27
+ */
28
+ readonly viewport: HTMLElement;
29
+ /**
30
+ * @internal
31
+ */
32
+ readonly virtualizer: Virtualizer<TData>;
24
33
  private readonly table;
25
34
  private options;
26
35
  private readonly tableValidator;
27
36
  constructor();
28
37
  setData(newData: readonly TData[]): void;
29
38
  idFieldNameChanged(_prev: string | undefined, _next: string | undefined): void;
39
+ connectedCallback(): void;
40
+ disconnectedCallback(): void;
30
41
  checkValidity(): boolean;
31
42
  private setTableData;
32
43
  private refreshRows;
@@ -5,6 +5,7 @@ import { createTable as tanStackCreateTable, getCoreRowModel as tanStackGetCoreR
5
5
  import { TableValidator } from './models/table-validator';
6
6
  import { styles } from './styles';
7
7
  import { template } from './template';
8
+ import { Virtualizer } from './models/virtualizer';
8
9
  /**
9
10
  * A nimble-styled table.
10
11
  */
@@ -44,6 +45,7 @@ export class Table extends FoundationElement {
44
45
  autoResetAll: false
45
46
  };
46
47
  this.table = tanStackCreateTable(this.options);
48
+ this.virtualizer = new Virtualizer(this);
47
49
  }
48
50
  get validity() {
49
51
  return this.tableValidator.getValidity();
@@ -57,6 +59,13 @@ export class Table extends FoundationElement {
57
59
  // generated when creating a new row model.
58
60
  this.setTableData(this.table.options.data);
59
61
  }
62
+ connectedCallback() {
63
+ super.connectedCallback();
64
+ this.virtualizer.connectedCallback();
65
+ }
66
+ disconnectedCallback() {
67
+ this.virtualizer.disconnectedCallback();
68
+ }
60
69
  checkValidity() {
61
70
  return this.tableValidator.isValid();
62
71
  }
@@ -83,6 +92,7 @@ export class Table extends FoundationElement {
83
92
  };
84
93
  return rowState;
85
94
  });
95
+ this.virtualizer.dataChanged();
86
96
  }
87
97
  updateTableOptions(updatedOptions) {
88
98
  this.options = { ...this.options, ...updatedOptions };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/table/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/table/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { VirtualItem } from '@tanstack/virtual-core';
2
+ import type { Table } from '..';
3
+ import type { TableRecord } from '../types';
4
+ /**
5
+ * Helper class for the nimble-table for row virtualization.
6
+ *
7
+ * @internal
8
+ */
9
+ export declare class Virtualizer<TData extends TableRecord = TableRecord> {
10
+ visibleItems: VirtualItem[];
11
+ allRowsHeight: number;
12
+ headerContainerMarginRight: number;
13
+ rowContainerYOffset: number;
14
+ private readonly table;
15
+ private readonly viewportResizeObserver;
16
+ private virtualizer?;
17
+ constructor(table: Table<TData>);
18
+ connectedCallback(): void;
19
+ disconnectedCallback(): void;
20
+ dataChanged(): void;
21
+ private updateVirtualizer;
22
+ private createVirtualizerOptions;
23
+ private handleVirtualizerChange;
24
+ }
@@ -0,0 +1,98 @@
1
+ import { __decorate } from "tslib";
2
+ import { observable } from '@microsoft/fast-element';
3
+ import { Virtualizer as TanStackVirtualizer, elementScroll, observeElementOffset, observeElementRect } from '@tanstack/virtual-core';
4
+ import { controlHeight } from '../../theme-provider/design-tokens';
5
+ /**
6
+ * Helper class for the nimble-table for row virtualization.
7
+ *
8
+ * @internal
9
+ */
10
+ export class Virtualizer {
11
+ constructor(table) {
12
+ this.visibleItems = [];
13
+ this.allRowsHeight = 0;
14
+ this.headerContainerMarginRight = 0;
15
+ this.rowContainerYOffset = 0;
16
+ this.table = table;
17
+ this.viewportResizeObserver = new ResizeObserver(entries => {
18
+ const borderBoxSize = entries[0]?.borderBoxSize[0];
19
+ if (borderBoxSize) {
20
+ // If we have enough rows that a vertical scrollbar is shown, we need to offset the header widths
21
+ // by the same margin so the column headers align with the corresponding rendered cells
22
+ const viewportBoundingWidth = borderBoxSize.inlineSize;
23
+ this.headerContainerMarginRight = viewportBoundingWidth - this.table.viewport.scrollWidth;
24
+ }
25
+ });
26
+ }
27
+ connectedCallback() {
28
+ this.viewportResizeObserver.observe(this.table.viewport);
29
+ this.updateVirtualizer();
30
+ }
31
+ disconnectedCallback() {
32
+ this.viewportResizeObserver.disconnect();
33
+ }
34
+ dataChanged() {
35
+ if (this.table.$fastController.isConnected) {
36
+ this.updateVirtualizer();
37
+ }
38
+ }
39
+ updateVirtualizer() {
40
+ const options = this.createVirtualizerOptions();
41
+ if (this.virtualizer) {
42
+ this.virtualizer.setOptions(options);
43
+ }
44
+ else {
45
+ this.virtualizer = new TanStackVirtualizer(options);
46
+ }
47
+ this.virtualizer._willUpdate();
48
+ this.handleVirtualizerChange();
49
+ }
50
+ createVirtualizerOptions() {
51
+ const rowHeight = parseFloat(controlHeight.getValueFor(this.table));
52
+ return {
53
+ count: this.table.tableData.length,
54
+ getScrollElement: () => {
55
+ return this.table.viewport;
56
+ },
57
+ estimateSize: (_) => rowHeight,
58
+ enableSmoothScroll: true,
59
+ overscan: 3,
60
+ scrollingDelay: 5,
61
+ scrollToFn: elementScroll,
62
+ observeElementOffset,
63
+ observeElementRect,
64
+ onChange: () => this.handleVirtualizerChange()
65
+ };
66
+ }
67
+ handleVirtualizerChange() {
68
+ const virtualizer = this.virtualizer;
69
+ this.visibleItems = virtualizer.getVirtualItems();
70
+ this.allRowsHeight = virtualizer.getTotalSize();
71
+ // We're using a separate div ('table-scroll') to represent the full height of all rows, and
72
+ // the row container's height is only big enough to hold the virtualized rows. So we don't
73
+ // use the TanStackVirtual-provided 'start' offset (which is in terms of the full height)
74
+ // to translate every individual row, we just translate the row container.
75
+ let rowContainerYOffset = 0;
76
+ if (this.visibleItems.length > 0) {
77
+ const firstItem = this.visibleItems[0];
78
+ const lastItem = this.visibleItems[this.visibleItems.length - 1];
79
+ if (lastItem.end < this.allRowsHeight) {
80
+ rowContainerYOffset = firstItem.start - virtualizer.scrollOffset;
81
+ }
82
+ }
83
+ this.rowContainerYOffset = rowContainerYOffset;
84
+ }
85
+ }
86
+ __decorate([
87
+ observable
88
+ ], Virtualizer.prototype, "visibleItems", void 0);
89
+ __decorate([
90
+ observable
91
+ ], Virtualizer.prototype, "allRowsHeight", void 0);
92
+ __decorate([
93
+ observable
94
+ ], Virtualizer.prototype, "headerContainerMarginRight", void 0);
95
+ __decorate([
96
+ observable
97
+ ], Virtualizer.prototype, "rowContainerYOffset", void 0);
98
+ //# sourceMappingURL=virtualizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualizer.js","sourceRoot":"","sources":["../../../../src/table/models/virtualizer.ts"],"names":[],"mappings":"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"}
@@ -8,13 +8,37 @@ import { themeBehavior } from '../utilities/style/theme';
8
8
  export const styles = css `
9
9
  ${display('flex')}
10
10
 
11
+ :host {
12
+ height: 480px;
13
+ }
14
+
11
15
  .table-container {
12
16
  display: flex;
13
17
  flex-direction: column;
14
18
  width: 100%;
15
19
  font: ${bodyFont};
16
20
  color: ${bodyFontColor};
17
- overflow: auto;
21
+ }
22
+
23
+ .table-viewport {
24
+ overflow-y: auto;
25
+ display: block;
26
+ height: 100%;
27
+ position: relative;
28
+ }
29
+
30
+ .table-scroll {
31
+ pointer-events: none;
32
+ position: absolute;
33
+ top: 0px;
34
+ width: 100%;
35
+ }
36
+
37
+ .table-row-container {
38
+ width: 100%;
39
+ position: sticky;
40
+ overflow: hidden;
41
+ top: 0px;
18
42
  }
19
43
 
20
44
  .header-container {
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/table/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,kDAAkD,CAAC;AACzE,OAAO,EACH,0BAA0B,EAC1B,QAAQ,EACR,aAAa,EACb,cAAc,EACjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,OAAO,CAAC,MAAM,CAAC;;;;;;gBAML,QAAQ;iBACP,aAAa;;;;;;;;;;;;sBAYR,0BAA0B;;;;;;;;;sBAS1B,0BAA0B;;;;;;;;;;;;sBAY1B,cAAc;;CAEnC,CAAC,aAAa,CACX,aAAa,CACT,KAAK,CAAC,KAAK,EACX,GAAG,CAAA;;;;;;8BAMmB,cAAc;;;;8BAId,cAAc;;;;8BAId,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC;;SAEnD,CACJ,CACJ,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/table/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,kDAAkD,CAAC;AACzE,OAAO,EACH,0BAA0B,EAC1B,QAAQ,EACR,aAAa,EACb,cAAc,EACjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;gBAUL,QAAQ;iBACP,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAgCR,0BAA0B;;;;;;;;;sBAS1B,0BAA0B;;;;;;;;;;;;sBAY1B,cAAc;;CAEnC,CAAC,aAAa,CACX,aAAa,CACT,KAAK,CAAC,KAAK,EACX,GAAG,CAAA;;;;;;8BAMmB,cAAc;;;;8BAId,cAAc;;;;8BAId,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC;;SAEnD,CACJ,CACJ,CAAC"}
@@ -1,4 +1,4 @@
1
- import { html, repeat, slotted, when } from '@microsoft/fast-element';
1
+ import { html, ref, repeat, slotted, when } from '@microsoft/fast-element';
2
2
  import { DesignSystem } from '@microsoft/fast-foundation';
3
3
  import { TableHeader } from './components/header';
4
4
  import { TableRow } from './components/row';
@@ -13,7 +13,7 @@ const isTableColumn = () => {
13
13
  export const template = html `
14
14
  <template role="table">
15
15
  <div class="table-container">
16
- <div role="rowgroup" class="header-container">
16
+ <div role="rowgroup" class="header-container" style="margin-right: ${x => x.virtualizer.headerContainerMarginRight}px;">
17
17
  <div class="header-row" role="row">
18
18
  ${repeat(x => x.columns, html `
19
19
  <${DesignSystem.tagFor(TableHeader)} class="header">
@@ -22,18 +22,22 @@ export const template = html `
22
22
  `)}
23
23
  </div>
24
24
  </div>
25
- <div class="table-viewport" role="rowgroup">
26
- ${when(x => x.columns.length > 0 && x.canRenderRows, html `
27
- ${repeat(x => x.tableData, html `
28
- <${DesignSystem.tagFor(TableRow)}
29
- class="row"
30
- record-id="${x => x.id}"
31
- :dataRecord="${x => x.record}"
32
- :columns="${(_, c) => c.parent.columns}"
33
- >
34
- </${DesignSystem.tagFor(TableRow)}>
35
- `)}
36
- `)}
25
+ <div class="table-viewport" ${ref('viewport')}>
26
+ <div class="table-scroll" style="height: ${x => x.virtualizer.allRowsHeight}px;"></div>
27
+ <div class="table-row-container" role="rowgroup" style="transform: ${x => (x.virtualizer.rowContainerYOffset === 0 ? 'none' : `translateY(${x.virtualizer.rowContainerYOffset}px)`)};">
28
+ ${when(x => x.columns.length > 0 && x.canRenderRows, html `
29
+ ${repeat(x => x.virtualizer.visibleItems, html `
30
+ <${DesignSystem.tagFor(TableRow)}
31
+ class="row"
32
+ record-id="${(x, c) => c.parent.tableData[x.index]?.id}"
33
+ :dataRecord="${(x, c) => c.parent.tableData[x.index]?.record}"
34
+ :columns="${(_, c) => c.parent.columns}"
35
+ style="height: ${x => x.size}px;"
36
+ >
37
+ </${DesignSystem.tagFor(TableRow)}>
38
+ `)}
39
+ `)}
40
+ </div>
37
41
  </div>
38
42
  </div>
39
43
  <slot ${slotted({ property: 'columns', filter: isTableColumn() })}></slot>
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/table/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,IAAI,EACJ,MAAM,EACN,OAAO,EACP,IAAI,EACP,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,aAAa,GAAG,GAAmB,EAAE;IACvC,MAAM,MAAM,GAAmB,CAC3B,KAAW,EACX,CAAS,EACT,EAAU,EACH,EAAE;QACT,OAAO,KAAK,YAAY,WAAW,CAAC;IACxC,CAAC,CAAC;IACF,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,kBAAkB;AAClB,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAO;;;;;sBAKb,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAa;2BACnC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC;8BAC7B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;4BACpB,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC;qBACvC,CAAC;;;;cAIR,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,IAAI,CAAO;kBAC1D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAe;uBACvC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;;qCAEf,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;uCACP,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM;oCAChB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,MAAgB,CAAC,OAAO;;wBAEjD,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;iBACpC,CAAC;aACL,CAAC;;;gBAGE,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC;;CAExE,CAAC"}
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/table/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,IAAI,EACJ,GAAG,EACH,MAAM,EACN,OAAO,EACP,IAAI,EACP,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,aAAa,GAAG,GAAmB,EAAE;IACvC,MAAM,MAAM,GAAmB,CAC3B,KAAW,EACX,CAAS,EACT,EAAU,EACH,EAAE;QACT,OAAO,KAAK,YAAY,WAAW,CAAC;IACxC,CAAC,CAAC;IACF,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,kBAAkB;AAClB,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAO;;;iFAG8C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,0BAA0B;;sBAExG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAa;2BACnC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC;8BAC7B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;4BACpB,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC;qBACvC,CAAC;;;0CAGoB,GAAG,CAAC,UAAU,CAAC;2DACE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,aAAa;qFACN,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,mBAAmB,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,mBAAmB,KAAK,CAAC;sBAC7K,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,IAAI,CAAO;0BAC1D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAoB;+BAC3D,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;;6CAEf,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE;+CACvC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM;4CAChD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;iDACrB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;;gCAE5B,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;yBACpC,CAAC;qBACL,CAAC;;;;gBAIN,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC;;CAExE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ni/nimble-components",
3
- "version": "18.0.2",
3
+ "version": "18.0.3",
4
4
  "description": "Styled web components for the NI Nimble Design System",
5
5
  "scripts": {
6
6
  "build": "npm run generate-icons && npm run build-components && npm run bundle-components && npm run generate-scss && npm run build-storybook",
@@ -52,6 +52,7 @@
52
52
  "@microsoft/fast-web-utilities": "^5.4.1",
53
53
  "@ni/nimble-tokens": "^4.3.2",
54
54
  "@tanstack/table-core": "^8.7.0",
55
+ "@tanstack/virtual-core": "^3.0.0-beta.34",
55
56
  "@types/d3": "^7.4.0",
56
57
  "@types/d3-scale": "^4.0.2",
57
58
  "@types/d3-zoom": "^3.0.0",