@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.
- package/demo/main.tsx +1 -1
- package/demo/vite.config.ts +1 -1
- package/dist/UiGrid.d.ts +11 -0
- package/dist/UiGrid.d.ts.map +1 -0
- package/dist/gridStateMath.d.ts +8 -0
- package/dist/gridStateMath.d.ts.map +1 -0
- package/dist/index.d.ts +14 -155
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +699 -1063
- package/dist/index.mjs +594 -930
- package/dist/mountUiGrid.d.ts +4 -0
- package/dist/mountUiGrid.d.ts.map +1 -0
- package/dist/rustWasmGridEngine.d.ts +8 -0
- package/dist/rustWasmGridEngine.d.ts.map +1 -0
- package/dist/{index.d.mts → useGridState.d.ts} +6 -50
- package/dist/useGridState.d.ts.map +1 -0
- package/dist/useVirtualScroll.d.ts +20 -0
- package/dist/useVirtualScroll.d.ts.map +1 -0
- package/dist/vanillaAdapter.d.ts +14 -0
- package/dist/vanillaAdapter.d.ts.map +1 -0
- package/dist/virtualScrollMath.d.ts +17 -0
- package/dist/virtualScrollMath.d.ts.map +1 -0
- package/package.json +11 -11
- package/src/UiGrid.test.tsx +63 -25
- package/src/UiGrid.tsx +438 -187
- package/src/gridStateMath.test.ts +10 -8
- package/src/gridStateMath.ts +20 -7
- package/src/index.ts +21 -5
- package/src/mountUiGrid.tsx +10 -0
- package/src/rustWasmGridEngine.test.ts +4 -4
- package/src/rustWasmGridEngine.ts +7 -5
- package/src/ui-grid.css +200 -1
- package/src/useGridState.ts +56 -30
- package/src/useVirtualScroll.ts +2 -0
- package/src/vanillaAdapter.test.ts +33 -0
- package/src/vanillaAdapter.ts +36 -0
- package/tsconfig.build.json +6 -0
- package/tsconfig.dts.json +15 -0
- package/tsconfig.json +1 -1
- package/vitest.config.ts +1 -1
- package/CLAUDE.md +0 -283
|
@@ -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
|
|
2
|
-
import
|
|
3
|
-
|
|
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.
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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 --
|
|
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
|
}
|
package/src/UiGrid.test.tsx
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
201
|
-
|
|
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-
|
|
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
|
-
|
|
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();
|