@ornery/ui-grid-react 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/demo/main.tsx +1 -1
  2. package/demo/vite.config.ts +1 -1
  3. package/dist/UiGrid.d.ts +11 -0
  4. package/dist/UiGrid.d.ts.map +1 -0
  5. package/dist/gridStateMath.d.ts +8 -0
  6. package/dist/gridStateMath.d.ts.map +1 -0
  7. package/dist/index.d.ts +14 -155
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +699 -1063
  10. package/dist/index.mjs +594 -930
  11. package/dist/mountUiGrid.d.ts +4 -0
  12. package/dist/mountUiGrid.d.ts.map +1 -0
  13. package/dist/rustWasmGridEngine.d.ts +8 -0
  14. package/dist/rustWasmGridEngine.d.ts.map +1 -0
  15. package/dist/{index.d.mts → useGridState.d.ts} +6 -50
  16. package/dist/useGridState.d.ts.map +1 -0
  17. package/dist/useVirtualScroll.d.ts +20 -0
  18. package/dist/useVirtualScroll.d.ts.map +1 -0
  19. package/dist/vanillaAdapter.d.ts +14 -0
  20. package/dist/vanillaAdapter.d.ts.map +1 -0
  21. package/dist/virtualScrollMath.d.ts +17 -0
  22. package/dist/virtualScrollMath.d.ts.map +1 -0
  23. package/package.json +11 -11
  24. package/src/UiGrid.test.tsx +63 -25
  25. package/src/UiGrid.tsx +438 -187
  26. package/src/gridStateMath.test.ts +10 -8
  27. package/src/gridStateMath.ts +20 -7
  28. package/src/index.ts +21 -5
  29. package/src/mountUiGrid.tsx +10 -0
  30. package/src/rustWasmGridEngine.test.ts +4 -4
  31. package/src/rustWasmGridEngine.ts +7 -5
  32. package/src/ui-grid.css +200 -1
  33. package/src/useGridState.ts +56 -30
  34. package/src/useVirtualScroll.ts +2 -0
  35. package/src/vanillaAdapter.test.ts +33 -0
  36. package/src/vanillaAdapter.ts +36 -0
  37. package/tsconfig.build.json +6 -0
  38. package/tsconfig.dts.json +15 -0
  39. package/tsconfig.json +1 -1
  40. package/vitest.config.ts +1 -1
  41. package/CLAUDE.md +0 -283
@@ -0,0 +1,4 @@
1
+ import { type Root } from 'react-dom/client';
2
+ import { type UiGridProps } from './UiGrid';
3
+ export declare function mountUiGrid(container: Element | DocumentFragment, props: UiGridProps): Root;
4
+ //# sourceMappingURL=mountUiGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mountUiGrid.d.ts","sourceRoot":"","sources":["../src/mountUiGrid.tsx"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEpD,wBAAgB,WAAW,CAAC,SAAS,EAAE,OAAO,GAAG,gBAAgB,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAI3F"}
@@ -0,0 +1,8 @@
1
+ import type { PipelineResult } from '@ornery/ui-grid-core';
2
+ type UiGridWasmModule = {
3
+ build_pipeline_js(context: unknown): PipelineResult;
4
+ };
5
+ export declare function registerReactUiGridWasmEngineFromModule(module: UiGridWasmModule): void;
6
+ export declare function enableReactUiGridWasmEngine(): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=rustWasmGridEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rustWasmGridEngine.d.ts","sourceRoot":"","sources":["../src/rustWasmGridEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA4B,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMrF,KAAK,gBAAgB,GAAG;IACtB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAAC;CACrD,CAAC;AAEF,wBAAgB,uCAAuC,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAMtF;AAED,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CAIjE"}
@@ -1,18 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import React$1 from 'react';
3
- import { GridOptions, UiGridApi, GridCellTemplateContext, GridExpandableTemplateContext, PipelineResult, GridColumnDef, GridLabels, SortState, GridCellPosition, GridBenchmarkResult, GridInfiniteScrollState, DisplayItem, GroupItem, ExpandableItem, RowItem, GridRow } from '@ornery/ui-grid';
4
- export { DEFAULT_GRID_LABELS, GridBenchmarkResult, GridCellEditableContext, GridCellTemplateContext, GridColumnDef, GridExpandableTemplateContext, GridLabels, GridOptions, GridRecord, GridRow, GridSavedState, SortState, UiGridApi } from '@ornery/ui-grid';
5
-
6
- interface UiGridProps {
7
- options: GridOptions;
8
- onRegisterApi?: (api: UiGridApi) => void;
9
- cellRenderer?: (context: GridCellTemplateContext) => React$1.ReactNode;
10
- expandableRenderer?: (context: GridExpandableTemplateContext) => React$1.ReactNode;
11
- className?: string;
12
- }
13
- declare function UiGrid({ options, onRegisterApi, cellRenderer, expandableRenderer, className, }: UiGridProps): react_jsx_runtime.JSX.Element;
14
-
15
- interface UseGridStateResult {
1
+ import { UiGridApi, GridOptions, GridColumnDef, GridRow, GridBenchmarkResult, GridCellPosition, GridLabels, SortState } from '@ornery/ui-grid-core';
2
+ import type { DisplayItem, GroupItem, ExpandableItem, RowItem, PipelineResult, GridInfiniteScrollState, GridCellTemplateContext, GridExpandableTemplateContext } from '@ornery/ui-grid-core';
3
+ export interface UseGridStateResult {
16
4
  pipeline: PipelineResult;
17
5
  visibleColumns: GridColumnDef[];
18
6
  labels: GridLabels;
@@ -111,6 +99,7 @@ interface UseGridStateResult {
111
99
  toggleRowExpansion: (row: GridRow, event?: React.MouseEvent) => void;
112
100
  toggleTreeRow: (row: GridRow, event?: React.MouseEvent) => void;
113
101
  moveColumn: (fromIndex: number, toIndex: number) => void;
102
+ moveVisibleColumn: (columnName: string, targetColumnName: string) => void;
114
103
  nextPage: () => void;
115
104
  previousPage: () => void;
116
105
  onPageSizeChange: (value: string) => void;
@@ -118,38 +107,5 @@ interface UseGridStateResult {
118
107
  exportCsv: () => void;
119
108
  onViewportScroll: (startIndex: number) => void;
120
109
  }
121
- declare function useGridState(options: GridOptions, onRegisterApi?: (api: UiGridApi) => void): UseGridStateResult;
122
-
123
- interface UseVirtualScrollOptions {
124
- itemCount: number;
125
- itemSize: number;
126
- viewportHeight: number;
127
- overscan?: number;
128
- }
129
- interface UseVirtualScrollResult {
130
- visibleRange: {
131
- start: number;
132
- end: number;
133
- };
134
- totalHeight: number;
135
- offsetY: number;
136
- onScroll: (event: React.UIEvent<HTMLDivElement>) => void;
137
- viewportRef: React.RefObject<HTMLDivElement | null>;
138
- scrollTop: number;
139
- }
140
- declare function useVirtualScroll(options: UseVirtualScrollOptions): UseVirtualScrollResult;
141
-
142
- declare function orderVisibleColumns(columns: readonly GridColumnDef[], order: readonly string[]): GridColumnDef[];
143
- declare function buildGridTemplateColumns(columns: readonly GridColumnDef[]): string;
144
- declare function resolveBenchmarkIterations(iterations?: number, configuredIterations?: number): number;
145
- declare function formatPaginationSummary(totalItems: number, firstRowIndex: number, lastRowIndex: number): string;
146
- declare function computeViewportHeightPx(viewportHeight?: number, autoViewportHeight?: number | null): string;
147
- declare function computeViewportRows(viewportHeight?: number, rowHeight?: number): number;
148
-
149
- type UiGridWasmModule = {
150
- build_pipeline_js(context: unknown): PipelineResult;
151
- };
152
- declare function registerReactUiGridWasmEngineFromModule(module: UiGridWasmModule): void;
153
- declare function enableReactUiGridWasmEngine(): Promise<void>;
154
-
155
- export { UiGrid, type UiGridProps, type UseGridStateResult, type UseVirtualScrollOptions, type UseVirtualScrollResult, buildGridTemplateColumns, computeViewportHeightPx, computeViewportRows, enableReactUiGridWasmEngine, formatPaginationSummary, orderVisibleColumns, registerReactUiGridWasmEngineFromModule, resolveBenchmarkIterations, useGridState, useVirtualScroll };
110
+ export declare function useGridState(options: GridOptions, onRegisterApi?: (api: UiGridApi) => void): UseGridStateResult;
111
+ //# sourceMappingURL=useGridState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGridState.d.ts","sourceRoot":"","sources":["../src/useGridState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface UseVirtualScrollOptions {
2
+ itemCount: number;
3
+ itemSize: number;
4
+ viewportHeight: number;
5
+ overscan?: number;
6
+ }
7
+ export interface UseVirtualScrollResult {
8
+ visibleRange: {
9
+ start: number;
10
+ end: number;
11
+ };
12
+ totalHeight: number;
13
+ offsetY: number;
14
+ onScroll: (event: React.UIEvent<HTMLDivElement>) => void;
15
+ setScrollTop: (scrollTop: number) => void;
16
+ viewportRef: React.RefObject<HTMLDivElement | null>;
17
+ scrollTop: number;
18
+ }
19
+ export declare function useVirtualScroll(options: UseVirtualScrollOptions): UseVirtualScrollResult;
20
+ //# sourceMappingURL=useVirtualScroll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVirtualScroll.d.ts","sourceRoot":"","sources":["../src/useVirtualScroll.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACzD,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CA0BzF"}
@@ -0,0 +1,14 @@
1
+ import type { GridOptions } from '@ornery/ui-grid-core';
2
+ export interface MountUiGridCustomElementOptions {
3
+ options: GridOptions;
4
+ tagName?: string;
5
+ ensureDefined?: (tagName: string) => Promise<void> | void;
6
+ }
7
+ export interface MountedUiGridCustomElement {
8
+ element: HTMLElement & {
9
+ options: GridOptions;
10
+ };
11
+ unmount: () => void;
12
+ }
13
+ export declare function mountUiGridCustomElement(container: Element, mountOptions: MountUiGridCustomElementOptions): Promise<MountedUiGridCustomElement>;
14
+ //# sourceMappingURL=vanillaAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vanillaAdapter.d.ts","sourceRoot":"","sources":["../src/vanillaAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,WAAW,GAAG;QAAE,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC;IAChD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,OAAO,EAClB,YAAY,EAAE,+BAA+B,GAC5C,OAAO,CAAC,0BAA0B,CAAC,CAmBrC"}
@@ -0,0 +1,17 @@
1
+ export interface VirtualWindowRequest {
2
+ itemCount: number;
3
+ itemSize: number;
4
+ viewportHeight: number;
5
+ overscan?: number;
6
+ scrollTop: number;
7
+ }
8
+ export interface VirtualWindowResult {
9
+ visibleRange: {
10
+ start: number;
11
+ end: number;
12
+ };
13
+ totalHeight: number;
14
+ offsetY: number;
15
+ }
16
+ export declare function calculateVirtualWindow(request: VirtualWindowRequest): VirtualWindowResult;
17
+ //# sourceMappingURL=virtualScrollMath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualScrollMath.d.ts","sourceRoot":"","sources":["../src/virtualScrollMath.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CAqBzF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ornery/ui-grid-react",
3
- "version": "0.1.5",
4
- "description": "React wrapper for @ornery/ui-grid",
3
+ "version": "0.1.7",
4
+ "description": "React wrapper for @ornery/ui-grid-core",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",
@@ -14,27 +14,27 @@
14
14
  "./styles": "./dist/ui-grid.css"
15
15
  },
16
16
  "peerDependencies": {
17
+ "@ornery/ui-grid-core": "^0.1.7",
17
18
  "react": "^18.0.0 || ^19.0.0",
18
- "react-dom": "^18.0.0 || ^19.0.0",
19
- "@ornery/ui-grid": "^0.1.3"
19
+ "react-dom": "^18.0.0 || ^19.0.0"
20
20
  },
21
21
  "devDependencies": {
22
- "@ornery/ui-grid": "file:../ui-grid",
23
- "react": "^19.1.0",
24
- "react-dom": "^19.1.0",
22
+ "@ornery/ui-grid-core": "file:../ui-grid-core",
25
23
  "@testing-library/react": "^16.0.0",
26
24
  "@types/react": "^19.0.0",
27
25
  "@types/react-dom": "^19.0.0",
28
- "typescript": "~5.8.0",
29
- "vitest": "^4.1.0",
26
+ "@vitejs/plugin-react": "^4.0.0",
30
27
  "jsdom": "^26.0.0",
28
+ "react": "^19.1.0",
29
+ "react-dom": "^19.1.0",
31
30
  "tsup": "^8.0.0",
31
+ "typescript": "~5.8.0",
32
32
  "vite": "^6.0.0",
33
- "@vitejs/plugin-react": "^4.0.0"
33
+ "vitest": "^4.1.0"
34
34
  },
35
35
  "scripts": {
36
36
  "start": "vite serve demo --config demo/vite.config.ts",
37
- "build": "tsup src/index.ts --format esm,cjs --dts --tsconfig tsconfig.json --external react --external react-dom --external @ornery/ui-grid",
37
+ "build": "npm run build --prefix ../ui-grid-core && tsup src/index.ts --format esm,cjs --tsconfig tsconfig.build.json --external react --external react-dom --external @ornery/ui-grid-core && tsc -p tsconfig.dts.json",
38
38
  "test": "vitest run",
39
39
  "test:watch": "vitest"
40
40
  }
@@ -3,8 +3,8 @@ import { render, screen, fireEvent, act } from '@testing-library/react';
3
3
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
4
4
  import { UiGrid } from './UiGrid';
5
5
  import type { UiGridProps } from './UiGrid';
6
- import type { GridOptions, UiGridApi, GridExpandableTemplateContext } from '@ornery/ui-grid';
7
- import { SORT_DIRECTIONS, FILTER_CONDITIONS } from '@ornery/ui-grid';
6
+ import type { GridOptions, UiGridApi, GridExpandableTemplateContext } from '@ornery/ui-grid-core';
7
+ import { SORT_DIRECTIONS, FILTER_CONDITIONS } from '@ornery/ui-grid-core';
8
8
 
9
9
  const baseData = [
10
10
  {
@@ -35,7 +35,7 @@ const baseData = [
35
35
 
36
36
  function createOptions(
37
37
  overrides: Partial<GridOptions> = {},
38
- onRegisterApi?: (api: UiGridApi) => void
38
+ onRegisterApi?: (api: UiGridApi) => void,
39
39
  ): GridOptions {
40
40
  return {
41
41
  id: 'spec-grid',
@@ -72,7 +72,7 @@ function createOptions(
72
72
 
73
73
  function renderGrid(
74
74
  overrides: Partial<GridOptions> = {},
75
- props: Partial<Omit<UiGridProps, 'options'>> = {}
75
+ props: Partial<Omit<UiGridProps, 'options'>> = {},
76
76
  ): { container: HTMLElement; gridApi: UiGridApi } {
77
77
  let gridApi!: UiGridApi;
78
78
  const options = createOptions(overrides, (api) => {
@@ -81,7 +81,7 @@ function renderGrid(
81
81
  });
82
82
 
83
83
  const { container } = render(
84
- <UiGrid options={options} onRegisterApi={options.onRegisterApi as any} {...props} />
84
+ <UiGrid options={options} onRegisterApi={options.onRegisterApi as any} {...props} />,
85
85
  );
86
86
 
87
87
  return { container, gridApi };
@@ -96,11 +96,11 @@ describe('UiGrid React component', () => {
96
96
  it('registers the API and renders headers and rows', () => {
97
97
  const { container, gridApi } = renderGrid();
98
98
 
99
- const headers = Array.from(container.querySelectorAll('.header-label')).map(
100
- (el) => el.textContent?.trim()
99
+ const headers = Array.from(container.querySelectorAll('.header-label')).map((el) =>
100
+ el.textContent?.trim(),
101
101
  );
102
- const bodyCells = Array.from(container.querySelectorAll('.body-cell')).map(
103
- (el) => el.textContent?.trim()
102
+ const bodyCells = Array.from(container.querySelectorAll('.body-cell')).map((el) =>
103
+ el.textContent?.trim(),
104
104
  );
105
105
 
106
106
  expect(gridApi).toBeTruthy();
@@ -132,7 +132,7 @@ describe('UiGrid React component', () => {
132
132
 
133
133
  expect(gridApi.core.getVisibleRows()).toEqual([]);
134
134
  expect(container.querySelector('.empty-state strong')?.textContent).toContain(
135
- 'Nothing to show'
135
+ 'Nothing to show',
136
136
  );
137
137
  });
138
138
 
@@ -164,6 +164,47 @@ describe('UiGrid React component', () => {
164
164
  ]);
165
165
  });
166
166
 
167
+ it('reorders visible columns by header drag and drop without shifting hidden columns', () => {
168
+ const { container } = renderGrid({
169
+ columnDefs: [
170
+ { name: 'id', visible: false },
171
+ { name: 'name', displayName: 'Customer' },
172
+ { name: 'status' },
173
+ { name: 'revenue' },
174
+ { name: 'owner', field: 'account.owner' },
175
+ { name: 'badge' },
176
+ ],
177
+ });
178
+
179
+ const dataTransfer = {
180
+ effectAllowed: 'all',
181
+ dropEffect: 'none',
182
+ store: new Map<string, string>(),
183
+ setData(type: string, value: string) {
184
+ this.store.set(type, value);
185
+ },
186
+ getData(type: string) {
187
+ return this.store.get(type) ?? '';
188
+ },
189
+ };
190
+
191
+ const sourceHeader = container.querySelectorAll('.header-cell')[4] as HTMLElement;
192
+ const targetHeader = container.querySelectorAll('.header-cell')[1] as HTMLElement;
193
+
194
+ act(() => {
195
+ fireEvent.dragStart(sourceHeader, { dataTransfer });
196
+ fireEvent.dragOver(targetHeader, { dataTransfer });
197
+ fireEvent.drop(targetHeader, { dataTransfer });
198
+ fireEvent.dragEnd(sourceHeader, { dataTransfer });
199
+ });
200
+
201
+ const headers = Array.from(container.querySelectorAll('.header-label')).map((el) =>
202
+ el.textContent?.trim(),
203
+ );
204
+
205
+ expect(headers).toEqual(['Customer', 'Badge', 'Status', 'Revenue', 'Owner']);
206
+ });
207
+
167
208
  it('groups rows and collapses groups', () => {
168
209
  const { container, gridApi } = renderGrid();
169
210
 
@@ -180,7 +221,7 @@ describe('UiGrid React component', () => {
180
221
  expect(container.querySelectorAll('.body-cell')).toHaveLength(15);
181
222
 
182
223
  const activeGroup = Array.from(initialGroups).find((node) =>
183
- node.textContent?.includes('status: Active')
224
+ node.textContent?.includes('status: Active'),
184
225
  );
185
226
  expect(activeGroup).toBeTruthy();
186
227
 
@@ -196,13 +237,9 @@ describe('UiGrid React component', () => {
196
237
  const anchor = document.createElement('a');
197
238
  const originalCreateElement = document.createElement.bind(document);
198
239
  const clickSpy = vi.spyOn(anchor, 'click').mockImplementation(() => {});
199
- vi.spyOn(document, 'createElement').mockImplementation(
200
- ((tagName: string) =>
201
- tagName === 'a' ? anchor : originalCreateElement(tagName)) as typeof document.createElement
202
- );
203
- const createObjectUrlSpy = vi
204
- .spyOn(URL, 'createObjectURL')
205
- .mockReturnValue('blob:spec-grid');
240
+ vi.spyOn(document, 'createElement').mockImplementation(((tagName: string) =>
241
+ tagName === 'a' ? anchor : originalCreateElement(tagName)) as typeof document.createElement);
242
+ const createObjectUrlSpy = vi.spyOn(URL, 'createObjectURL').mockReturnValue('blob:spec-grid');
206
243
  vi.spyOn(URL, 'revokeObjectURL').mockImplementation(() => {});
207
244
 
208
245
  act(() => {
@@ -235,7 +272,8 @@ describe('UiGrid React component', () => {
235
272
  });
236
273
 
237
274
  expect(gridApi.core.getVisibleRows()).toHaveLength(5);
238
- expect(container.querySelector('.grid-viewport')).not.toBeNull();
275
+ expect(container.querySelector('.grid-virtual-spacer')).not.toBeNull();
276
+ expect(container.querySelector('.grid-virtual-body')).not.toBeNull();
239
277
  });
240
278
 
241
279
  it('paginates rows', () => {
@@ -286,7 +324,7 @@ describe('UiGrid React component', () => {
286
324
  gridApi.edit.on.cancelCellEdit(cancelCellEdit);
287
325
 
288
326
  const firstNameCell = container.querySelector(
289
- '.body-cell[data-row-id="row-1"][data-col-name="name"]'
327
+ '.body-cell[data-row-id="row-1"][data-col-name="name"]',
290
328
  ) as HTMLElement;
291
329
 
292
330
  await act(async () => {
@@ -295,7 +333,7 @@ describe('UiGrid React component', () => {
295
333
  });
296
334
 
297
335
  let editor = container.querySelector(
298
- '.cell-editor[data-row-id="row-1"][data-col-name="name"]'
336
+ '.cell-editor[data-row-id="row-1"][data-col-name="name"]',
299
337
  ) as HTMLInputElement;
300
338
  expect(editor).toBeTruthy();
301
339
  expect(beginCellEdit).toHaveBeenCalled();
@@ -308,7 +346,7 @@ describe('UiGrid React component', () => {
308
346
  expect(afterCellEdit).toHaveBeenCalled();
309
347
 
310
348
  const ownerCell = container.querySelector(
311
- '.body-cell[data-row-id="row-1"][data-col-name="owner"]'
349
+ '.body-cell[data-row-id="row-1"][data-col-name="owner"]',
312
350
  ) as HTMLElement;
313
351
 
314
352
  await act(async () => {
@@ -317,7 +355,7 @@ describe('UiGrid React component', () => {
317
355
  });
318
356
 
319
357
  editor = container.querySelector(
320
- '.cell-editor[data-row-id="row-1"][data-col-name="owner"]'
358
+ '.cell-editor[data-row-id="row-1"][data-col-name="owner"]',
321
359
  ) as HTMLInputElement;
322
360
  expect(editor).toBeTruthy();
323
361
 
@@ -359,8 +397,8 @@ describe('UiGrid React component', () => {
359
397
  ],
360
398
  });
361
399
 
362
- const headers = Array.from(container.querySelectorAll('.header-label')).map(
363
- (el) => el.textContent?.trim()
400
+ const headers = Array.from(container.querySelectorAll('.header-label')).map((el) =>
401
+ el.textContent?.trim(),
364
402
  );
365
403
  expect(headers).toEqual(['Status', 'Owner']);
366
404
  expect(container.querySelector('.filter-grid')).toBeNull();