@ornery/ui-grid-react 0.1.7 → 0.1.8-hotfix
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/demo.css +122 -0
- package/demo/main.tsx +89 -3
- package/dist/UiGrid.d.ts +3 -2
- package/dist/UiGrid.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +314 -401
- package/dist/index.mjs +312 -401
- package/dist/mountUiGrid.d.ts +5 -0
- package/dist/mountUiGrid.d.ts.map +1 -1
- package/dist/ui-grid.css +802 -0
- package/package.json +2 -2
- package/src/UiGrid.test.tsx +41 -1
- package/src/UiGrid.tsx +264 -348
- package/src/index.ts +1 -1
- package/src/mountUiGrid.tsx +18 -0
- package/src/ui-grid.css +122 -40
package/demo/demo.css
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
.react-demo-shell {
|
|
2
|
+
display: grid;
|
|
3
|
+
gap: 1rem;
|
|
4
|
+
color: var(--ui-grid-cell-color);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.react-demo-shell__header {
|
|
8
|
+
display: grid;
|
|
9
|
+
gap: 1rem;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.react-demo-shell__header h2,
|
|
13
|
+
.react-demo-shell__header p,
|
|
14
|
+
.react-demo-shell__toolbar p {
|
|
15
|
+
margin: 0;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.react-demo-shell__eyebrow {
|
|
19
|
+
margin: 0 0 0.35rem;
|
|
20
|
+
font-size: 0.75rem;
|
|
21
|
+
letter-spacing: 0.12em;
|
|
22
|
+
text-transform: uppercase;
|
|
23
|
+
color: var(--ui-grid-accent);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.react-demo-shell__header p,
|
|
27
|
+
.react-demo-shell__metrics span,
|
|
28
|
+
.react-demo-shell__toolbar p,
|
|
29
|
+
.react-demo-shell__stats small {
|
|
30
|
+
color: var(--ui-grid-muted-color);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.react-demo-shell__actions {
|
|
34
|
+
display: flex;
|
|
35
|
+
flex-wrap: wrap;
|
|
36
|
+
gap: 0.75rem;
|
|
37
|
+
align-items: center;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.react-demo-shell__button {
|
|
41
|
+
display: inline-flex;
|
|
42
|
+
align-items: center;
|
|
43
|
+
justify-content: center;
|
|
44
|
+
border-radius: 999px;
|
|
45
|
+
padding: 0.7rem 1.1rem;
|
|
46
|
+
font: inherit;
|
|
47
|
+
font-weight: 800;
|
|
48
|
+
cursor: pointer;
|
|
49
|
+
border: 1px solid color-mix(in srgb, var(--ui-grid-accent) 40%, transparent);
|
|
50
|
+
background: linear-gradient(
|
|
51
|
+
135deg,
|
|
52
|
+
color-mix(in srgb, var(--ui-grid-accent) 86%, black),
|
|
53
|
+
color-mix(in srgb, var(--ui-grid-accent) 66%, black)
|
|
54
|
+
);
|
|
55
|
+
color: white;
|
|
56
|
+
box-shadow: 0 12px 24px rgba(15, 23, 42, 0.14);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.react-demo-shell__button-secondary {
|
|
60
|
+
background: var(--ui-grid-surface);
|
|
61
|
+
color: var(--ui-grid-cell-color);
|
|
62
|
+
border-color: var(--ui-grid-border-color);
|
|
63
|
+
box-shadow: none;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.react-demo-shell__stats,
|
|
67
|
+
.react-demo-shell__metrics article,
|
|
68
|
+
.react-demo-shell__toolbar {
|
|
69
|
+
border: 1px solid var(--ui-grid-border-color);
|
|
70
|
+
border-radius: var(--ui-grid-radius);
|
|
71
|
+
background: var(--ui-grid-surface);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.react-demo-shell__stats {
|
|
75
|
+
display: inline-grid;
|
|
76
|
+
min-width: 7rem;
|
|
77
|
+
padding: 0.8rem 1rem;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.react-demo-shell__stats span {
|
|
81
|
+
font-size: 1.8rem;
|
|
82
|
+
font-weight: 800;
|
|
83
|
+
line-height: 1;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.react-demo-shell__metrics {
|
|
87
|
+
display: grid;
|
|
88
|
+
gap: 0.85rem;
|
|
89
|
+
grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.react-demo-shell__metrics article {
|
|
93
|
+
display: grid;
|
|
94
|
+
gap: 0.2rem;
|
|
95
|
+
padding: 0.9rem 1rem;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.react-demo-shell__metrics strong {
|
|
99
|
+
font-size: 1.45rem;
|
|
100
|
+
line-height: 1.1;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.react-demo-shell__toolbar {
|
|
104
|
+
display: grid;
|
|
105
|
+
gap: 0.5rem;
|
|
106
|
+
padding: 0.9rem 1rem;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.react-demo-shell__toolbar strong {
|
|
110
|
+
margin-right: 0.4rem;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
@media (max-width: 720px) {
|
|
114
|
+
.react-demo-shell__actions {
|
|
115
|
+
align-items: stretch;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.react-demo-shell__button,
|
|
119
|
+
.react-demo-shell__button-secondary {
|
|
120
|
+
width: 100%;
|
|
121
|
+
}
|
|
122
|
+
}
|
package/demo/main.tsx
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
2
2
|
import { createRoot } from 'react-dom/client';
|
|
3
3
|
import { UiGrid } from '../src/index';
|
|
4
|
-
import type { GridOptions, UiGridApi } from '../src/index';
|
|
4
|
+
import type { GridBenchmarkResult, GridOptions, UiGridApi } from '../src/index';
|
|
5
5
|
import { FILTER_CONDITIONS } from '@ornery/ui-grid-core';
|
|
6
6
|
import '../src/ui-grid.css';
|
|
7
|
+
import './demo.css';
|
|
7
8
|
|
|
8
9
|
const statuses = ['Active', 'Expansion', 'Enterprise', 'Pilot'] as const;
|
|
9
10
|
const companies = ['Northwind', 'Blue Harbor', 'Forge Group', 'Larkspur', 'Atlas'] as const;
|
|
@@ -29,6 +30,8 @@ const currencyFormat = new Intl.NumberFormat('en-US', {
|
|
|
29
30
|
|
|
30
31
|
function App() {
|
|
31
32
|
const [gridApi, setGridApi] = useState<UiGridApi | null>(null);
|
|
33
|
+
const [visibleRowCount, setVisibleRowCount] = useState(0);
|
|
34
|
+
const [benchmarkResult, setBenchmarkResult] = useState<GridBenchmarkResult | null>(null);
|
|
32
35
|
const data = useMemo(() => createDemoData(), []);
|
|
33
36
|
|
|
34
37
|
const options = useMemo<GridOptions>(
|
|
@@ -46,6 +49,7 @@ function App() {
|
|
|
46
49
|
enableCellEditOnFocus: true,
|
|
47
50
|
virtualizationThreshold: 25,
|
|
48
51
|
grouping: { groupBy: ['status'] },
|
|
52
|
+
benchmark: { iterations: 40 },
|
|
49
53
|
rowIdentity: (row) => String(row['id']),
|
|
50
54
|
onRegisterApi: (api) => setGridApi(api as UiGridApi),
|
|
51
55
|
columnDefs: [
|
|
@@ -89,7 +93,89 @@ function App() {
|
|
|
89
93
|
[data],
|
|
90
94
|
);
|
|
91
95
|
|
|
92
|
-
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
if (!gridApi) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
setVisibleRowCount(gridApi.core.getVisibleRows().length);
|
|
102
|
+
|
|
103
|
+
const disposeVisibleRows = gridApi.core.on.rowsVisibleChanged((rows) => {
|
|
104
|
+
setVisibleRowCount(rows.length);
|
|
105
|
+
});
|
|
106
|
+
const disposeBenchmark = gridApi.core.on.benchmarkComplete((result) => {
|
|
107
|
+
setBenchmarkResult(result);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
return () => {
|
|
111
|
+
disposeVisibleRows();
|
|
112
|
+
disposeBenchmark();
|
|
113
|
+
};
|
|
114
|
+
}, [gridApi]);
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<section className="react-demo-shell">
|
|
118
|
+
<header className="react-demo-shell__header">
|
|
119
|
+
<div>
|
|
120
|
+
<p className="react-demo-shell__eyebrow">React package demo</p>
|
|
121
|
+
<h2>{options.title ?? 'UI Grid'}</h2>
|
|
122
|
+
<p>
|
|
123
|
+
Familiar <code>gridOptions</code> and <code>onRegisterApi</code>, rebuilt with React
|
|
124
|
+
hooks, virtualization, grouping, sorting, filtering, and column ordering.
|
|
125
|
+
</p>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
<div className="react-demo-shell__actions">
|
|
129
|
+
<button
|
|
130
|
+
type="button"
|
|
131
|
+
className="react-demo-shell__button"
|
|
132
|
+
onClick={() => gridApi?.core.benchmark()}
|
|
133
|
+
>
|
|
134
|
+
Benchmark
|
|
135
|
+
</button>
|
|
136
|
+
<button
|
|
137
|
+
type="button"
|
|
138
|
+
className="react-demo-shell__button react-demo-shell__button-secondary"
|
|
139
|
+
onClick={() => gridApi?.core.exportCsv()}
|
|
140
|
+
>
|
|
141
|
+
Export CSV
|
|
142
|
+
</button>
|
|
143
|
+
<div className="react-demo-shell__stats">
|
|
144
|
+
<span>{visibleRowCount}</span>
|
|
145
|
+
<small>visible rows</small>
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
</header>
|
|
149
|
+
|
|
150
|
+
<section className="react-demo-shell__metrics" aria-label="React grid metrics">
|
|
151
|
+
<article>
|
|
152
|
+
<strong>{options.enableVirtualization ? 'On' : 'Off'}</strong>
|
|
153
|
+
<span>virtualization</span>
|
|
154
|
+
</article>
|
|
155
|
+
<article>
|
|
156
|
+
<strong>{options.grouping?.groupBy?.length ?? 0}</strong>
|
|
157
|
+
<span>group columns</span>
|
|
158
|
+
</article>
|
|
159
|
+
<article>
|
|
160
|
+
<strong>{benchmarkResult?.averageMs?.toFixed(2) || '—'}</strong>
|
|
161
|
+
<span>benchmark avg</span>
|
|
162
|
+
</article>
|
|
163
|
+
</section>
|
|
164
|
+
|
|
165
|
+
<div className="react-demo-shell__toolbar">
|
|
166
|
+
<div>
|
|
167
|
+
<strong>{visibleRowCount}</strong>
|
|
168
|
+
<span>of {data.length} rows</span>
|
|
169
|
+
</div>
|
|
170
|
+
<p>
|
|
171
|
+
<code>gridOptions</code> compatibility layer: sorting, filtering, grouping, column moving,
|
|
172
|
+
templating, and virtualized rendering.
|
|
173
|
+
</p>
|
|
174
|
+
</div>
|
|
175
|
+
|
|
176
|
+
<UiGrid options={options} onRegisterApi={options.onRegisterApi} />
|
|
177
|
+
</section>
|
|
178
|
+
);
|
|
93
179
|
}
|
|
94
180
|
|
|
95
181
|
createRoot(document.getElementById('root')!).render(<App />);
|
package/dist/UiGrid.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { GridOptions, GridCellTemplateContext, GridExpandableTemplateContext, UiGridApi } from '@ornery/ui-grid-core';
|
|
2
|
+
import type { GridOptions, GridCellTemplateContext, GridExpandableTemplateContext, GridHeaderTemplateContext, UiGridApi } from '@ornery/ui-grid-core';
|
|
3
3
|
export interface UiGridProps {
|
|
4
4
|
options: GridOptions;
|
|
5
5
|
onRegisterApi?: (api: UiGridApi) => void;
|
|
6
6
|
cellRenderer?: (context: GridCellTemplateContext) => React.ReactNode;
|
|
7
|
+
headerRenderer?: (context: GridHeaderTemplateContext) => React.ReactNode;
|
|
7
8
|
expandableRenderer?: (context: GridExpandableTemplateContext) => React.ReactNode;
|
|
8
9
|
className?: string;
|
|
9
10
|
}
|
|
10
|
-
export declare function UiGrid({ options, onRegisterApi, cellRenderer, expandableRenderer, className, }: UiGridProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function UiGrid({ options, onRegisterApi, cellRenderer, headerRenderer, expandableRenderer, className, }: UiGridProps): import("react/jsx-runtime").JSX.Element;
|
|
11
12
|
//# sourceMappingURL=UiGrid.d.ts.map
|
package/dist/UiGrid.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UiGrid.d.ts","sourceRoot":"","sources":["../src/UiGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,6BAA6B,EAC7B,SAAS,EAGV,MAAM,sBAAsB,CAAC;AAK9B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,6BAA6B,KAAK,KAAK,CAAC,SAAS,CAAC;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,SAAS,GACV,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"UiGrid.d.ts","sourceRoot":"","sources":["../src/UiGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,6BAA6B,EAC7B,yBAAyB,EACzB,SAAS,EAGV,MAAM,sBAAsB,CAAC;AAK9B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,KAAK,CAAC,SAAS,CAAC;IACzE,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,6BAA6B,KAAK,KAAK,CAAC,SAAS,CAAC;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,aAAa,EACb,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,SAAS,GACV,EAAE,WAAW,2CA+rBb"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { UiGrid } from './UiGrid';
|
|
2
2
|
export type { UiGridProps } from './UiGrid';
|
|
3
|
-
export { mountUiGrid } from './mountUiGrid';
|
|
3
|
+
export { mountUiGrid, updateUiGrid, styledCell } from './mountUiGrid';
|
|
4
4
|
export { mountUiGridCustomElement, type MountUiGridCustomElementOptions, type MountedUiGridCustomElement, } from './vanillaAdapter';
|
|
5
5
|
export { useGridState } from './useGridState';
|
|
6
6
|
export type { UseGridStateResult } from './useGridState';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EACL,wBAAwB,EACxB,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,GAChC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,2BAA2B,EAC3B,uCAAuC,GACxC,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,WAAW,EACX,aAAa,EACb,OAAO,EACP,UAAU,EACV,UAAU,EACV,uBAAuB,EACvB,6BAA6B,EAC7B,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,SAAS,GACV,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|