@mieweb/ui 0.6.1-dev.149 → 0.6.1-dev.151
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/dist/brands/index.cjs +22 -22
- package/dist/brands/index.js +5 -5
- package/dist/chunk-2T4JU5RH.cjs +1156 -0
- package/dist/chunk-2T4JU5RH.cjs.map +1 -0
- package/dist/chunk-3SSXDWD7.js +363 -0
- package/dist/chunk-3SSXDWD7.js.map +1 -0
- package/dist/{chunk-MARLXJQO.cjs → chunk-6R2ZPDN7.cjs} +7 -7
- package/dist/{chunk-MARLXJQO.cjs.map → chunk-6R2ZPDN7.cjs.map} +1 -1
- package/dist/{chunk-WHUD3XHR.cjs → chunk-7PA26KBF.cjs} +15 -3
- package/dist/chunk-7PA26KBF.cjs.map +1 -0
- package/dist/chunk-ASLZUFH4.js +1967 -0
- package/dist/chunk-ASLZUFH4.js.map +1 -0
- package/dist/chunk-FADQVM4M.cjs +2017 -0
- package/dist/chunk-FADQVM4M.cjs.map +1 -0
- package/dist/{chunk-DFT7TYKL.cjs → chunk-H4T5T65N.cjs} +6 -3
- package/dist/chunk-H4T5T65N.cjs.map +1 -0
- package/dist/chunk-I6CY5C6A.js +12 -0
- package/dist/chunk-I6CY5C6A.js.map +1 -0
- package/dist/chunk-JFLC7SHM.cjs +35 -0
- package/dist/chunk-JFLC7SHM.cjs.map +1 -0
- package/dist/chunk-LZPPH5BW.cjs +368 -0
- package/dist/chunk-LZPPH5BW.cjs.map +1 -0
- package/dist/{chunk-3OHVUXDG.js → chunk-M7BLVBL4.js} +6 -3
- package/dist/chunk-M7BLVBL4.js.map +1 -0
- package/dist/chunk-PM2I3QKM.cjs +1419 -0
- package/dist/chunk-PM2I3QKM.cjs.map +1 -0
- package/dist/{chunk-TW6DXMSD.js → chunk-R6PBBPU3.js} +2 -2
- package/dist/{chunk-TW6DXMSD.js.map → chunk-R6PBBPU3.js.map} +1 -1
- package/dist/{chunk-33PO3J4O.js → chunk-RXY5SD3O.js} +15 -3
- package/dist/chunk-RXY5SD3O.js.map +1 -0
- package/dist/{chunk-AEGYWRSL.js → chunk-TXYTMU3K.js} +3 -3
- package/dist/{chunk-AEGYWRSL.js.map → chunk-TXYTMU3K.js.map} +1 -1
- package/dist/chunk-UHPQYBXQ.js +1124 -0
- package/dist/chunk-UHPQYBXQ.js.map +1 -0
- package/dist/chunk-XQE26F3G.js +1383 -0
- package/dist/chunk-XQE26F3G.js.map +1 -0
- package/dist/{chunk-26YNFCOC.cjs → chunk-Z6NRP4Z5.cjs} +2 -2
- package/dist/{chunk-26YNFCOC.cjs.map → chunk-Z6NRP4Z5.cjs.map} +1 -1
- package/dist/components/Dropdown/index.cjs +7 -7
- package/dist/components/Dropdown/index.d.cts +1 -1
- package/dist/components/Dropdown/index.d.ts +1 -1
- package/dist/components/Dropdown/index.js +1 -1
- package/dist/components/RichTextEditor/index.cjs +5 -5
- package/dist/components/RichTextEditor/index.js +2 -2
- package/dist/components/SuperChat/index.cjs +1319 -0
- package/dist/components/SuperChat/index.cjs.map +1 -0
- package/dist/components/SuperChat/index.d.cts +189 -0
- package/dist/components/SuperChat/index.d.ts +189 -0
- package/dist/components/SuperChat/index.js +1282 -0
- package/dist/components/SuperChat/index.js.map +1 -0
- package/dist/components/SuperChat/plugins/index.cjs +1221 -0
- package/dist/components/SuperChat/plugins/index.cjs.map +1 -0
- package/dist/components/SuperChat/plugins/index.d.cts +253 -0
- package/dist/components/SuperChat/plugins/index.d.ts +253 -0
- package/dist/components/SuperChat/plugins/index.js +1181 -0
- package/dist/components/SuperChat/plugins/index.js.map +1 -0
- package/dist/datavis.cjs +18 -362
- package/dist/datavis.cjs.map +1 -1
- package/dist/datavis.js +1 -361
- package/dist/datavis.js.map +1 -1
- package/dist/index.cjs +1297 -5412
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +44 -240
- package/dist/index.d.ts +44 -240
- package/dist/index.js +759 -5037
- package/dist/index.js.map +1 -1
- package/dist/nitroTableGrid-FWRCDE4N.js +22 -0
- package/dist/nitroTableGrid-FWRCDE4N.js.map +1 -0
- package/dist/nitroTableGrid-IY75TQJ2.cjs +44 -0
- package/dist/nitroTableGrid-IY75TQJ2.cjs.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/types-BFFgW6qy.d.ts +240 -0
- package/dist/types-BzeY_kYO.d.cts +242 -0
- package/dist/types-BzeY_kYO.d.ts +242 -0
- package/dist/types-CRt5IPNL.d.cts +240 -0
- package/package.json +42 -5
- package/dist/chunk-33PO3J4O.js.map +0 -1
- package/dist/chunk-3OHVUXDG.js.map +0 -1
- package/dist/chunk-DFT7TYKL.cjs.map +0 -1
- package/dist/chunk-WHUD3XHR.cjs.map +0 -1
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var datavisAce = require('datavis-ace');
|
|
5
|
+
var datavis = require('@mieweb/datavis');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
|
|
8
|
+
// src/components/DataVisNITRO/DataVisNITRO.tsx
|
|
9
|
+
var DataVisNitroContext = react.createContext(null);
|
|
10
|
+
function isObject(value) {
|
|
11
|
+
return typeof value === "object" && value !== null;
|
|
12
|
+
}
|
|
13
|
+
function normalizeTypeInfo(typeInfo) {
|
|
14
|
+
if (Array.isArray(typeInfo)) {
|
|
15
|
+
return Object.fromEntries(
|
|
16
|
+
typeInfo.filter(isObject).map((entry) => [entry.field, entry])
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
if (!isObject(typeInfo)) {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
const maybeOrdMap = typeInfo;
|
|
23
|
+
if (typeof maybeOrdMap.keys === "function" && typeof maybeOrdMap.get === "function") {
|
|
24
|
+
return Object.fromEntries(
|
|
25
|
+
maybeOrdMap.keys().map((field) => [field, maybeOrdMap.get?.(field) ?? {}])
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
return Object.fromEntries(
|
|
29
|
+
Object.entries(typeInfo).filter(([, value]) => isObject(value))
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
function normalizeFieldType(type) {
|
|
33
|
+
if (!type) return void 0;
|
|
34
|
+
if (type === "integer") return "number";
|
|
35
|
+
if (type === "boolean") return "string";
|
|
36
|
+
return type;
|
|
37
|
+
}
|
|
38
|
+
function buildColumnFromField(field, typeInfo) {
|
|
39
|
+
const info = typeInfo[field];
|
|
40
|
+
const normalizedType = normalizeFieldType(info?.type);
|
|
41
|
+
return {
|
|
42
|
+
field,
|
|
43
|
+
header: info?.displayText ?? field,
|
|
44
|
+
sortable: true,
|
|
45
|
+
filterable: true,
|
|
46
|
+
resizable: true,
|
|
47
|
+
reorderable: true,
|
|
48
|
+
...normalizedType ? {
|
|
49
|
+
typeInfo: {
|
|
50
|
+
type: normalizedType,
|
|
51
|
+
...info?.format !== void 0 ? { format: info.format } : {},
|
|
52
|
+
...info?.internalType !== void 0 ? { internalType: info.internalType } : {}
|
|
53
|
+
}
|
|
54
|
+
} : {}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function mergeColumnWithTypeInfo(column, typeInfo) {
|
|
58
|
+
const fallbackColumn = buildColumnFromField(column.field, typeInfo);
|
|
59
|
+
return {
|
|
60
|
+
...fallbackColumn,
|
|
61
|
+
...column,
|
|
62
|
+
header: column.header ?? fallbackColumn.header,
|
|
63
|
+
typeInfo: column.typeInfo ?? fallbackColumn.typeInfo
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function buildResolvedColumns(columns, fallbackFields, typeInfo) {
|
|
67
|
+
if (columns && columns.length > 0) {
|
|
68
|
+
return columns.map((column) => {
|
|
69
|
+
if (typeof column === "string") {
|
|
70
|
+
return buildColumnFromField(column, typeInfo);
|
|
71
|
+
}
|
|
72
|
+
return mergeColumnWithTypeInfo(column, typeInfo);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return fallbackFields.map((field) => buildColumnFromField(field, typeInfo));
|
|
76
|
+
}
|
|
77
|
+
function buildFallbackFieldOrder(typeInfo, data) {
|
|
78
|
+
const rows = Array.isArray(data) ? data.filter((row) => isObject(row)) : null;
|
|
79
|
+
const normalizedEntries = Object.fromEntries(
|
|
80
|
+
Object.entries(typeInfo).map(([field, info]) => [
|
|
81
|
+
field,
|
|
82
|
+
{
|
|
83
|
+
type: normalizeFieldType(info.type) ?? "string",
|
|
84
|
+
...info.displayText !== void 0 ? { displayText: info.displayText } : {}
|
|
85
|
+
}
|
|
86
|
+
])
|
|
87
|
+
);
|
|
88
|
+
return datavis.determineColumns(null, normalizedEntries, rows);
|
|
89
|
+
}
|
|
90
|
+
function buildControlFields(columns) {
|
|
91
|
+
return columns.map((column) => ({
|
|
92
|
+
field: column.field,
|
|
93
|
+
displayName: column.header,
|
|
94
|
+
type: column.typeInfo?.type
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
function buildAggregateFields(columns) {
|
|
98
|
+
return columns.map((column) => ({
|
|
99
|
+
field: column.field,
|
|
100
|
+
displayName: column.header
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
function mergeTableDef(tableDef, features) {
|
|
104
|
+
if (!tableDef && !features) {
|
|
105
|
+
return void 0;
|
|
106
|
+
}
|
|
107
|
+
const { rowMode, ...featureFlags } = features ?? {};
|
|
108
|
+
return {
|
|
109
|
+
...tableDef,
|
|
110
|
+
...rowMode !== void 0 ? { rowMode } : {},
|
|
111
|
+
...Object.keys(featureFlags).length > 0 ? {
|
|
112
|
+
features: {
|
|
113
|
+
...tableDef?.features ?? {},
|
|
114
|
+
...featureFlags
|
|
115
|
+
}
|
|
116
|
+
} : {}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function DataVisNitroSource(props) {
|
|
120
|
+
const { type, children } = props;
|
|
121
|
+
const url = props.type === "http" ? props.url : void 0;
|
|
122
|
+
const viewRef = react.useRef(null);
|
|
123
|
+
if (viewRef.current === null || viewRef.current._dvType !== type || viewRef.current._dvUrl !== url) {
|
|
124
|
+
const source = props.type === "http" ? new datavisAce.Source({ type, url: props.url }) : new datavisAce.Source({ type });
|
|
125
|
+
viewRef.current = Object.assign(
|
|
126
|
+
new datavisAce.ComputedView(source),
|
|
127
|
+
{ _dvType: type, _dvUrl: url }
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DataVisNitroContext.Provider, { value: viewRef.current, children });
|
|
131
|
+
}
|
|
132
|
+
function DataVisNitroGridInner({
|
|
133
|
+
computedView,
|
|
134
|
+
columns,
|
|
135
|
+
allColumns,
|
|
136
|
+
features,
|
|
137
|
+
filterColumns,
|
|
138
|
+
controlFields,
|
|
139
|
+
aggregateFields,
|
|
140
|
+
aggregateFunctions,
|
|
141
|
+
groupFunctionDefs,
|
|
142
|
+
tableDef,
|
|
143
|
+
formatCell,
|
|
144
|
+
onColumnReorder,
|
|
145
|
+
onColumnResize,
|
|
146
|
+
onHeaderContextMenu,
|
|
147
|
+
onRowClick,
|
|
148
|
+
onRowDoubleClick,
|
|
149
|
+
onSelectionChange,
|
|
150
|
+
style,
|
|
151
|
+
trans,
|
|
152
|
+
...dataGridProps
|
|
153
|
+
}) {
|
|
154
|
+
const viewState = datavis.useView(computedView, false);
|
|
155
|
+
const normalizedTypeInfo = react.useMemo(
|
|
156
|
+
() => normalizeTypeInfo(viewState.typeInfo ?? computedView?.typeInfo ?? null),
|
|
157
|
+
[computedView, viewState.typeInfo]
|
|
158
|
+
);
|
|
159
|
+
const fallbackFields = react.useMemo(
|
|
160
|
+
() => buildFallbackFieldOrder(normalizedTypeInfo, viewState.data?.data ?? null),
|
|
161
|
+
[normalizedTypeInfo, viewState.data?.data]
|
|
162
|
+
);
|
|
163
|
+
const resolvedAllColumns = react.useMemo(() => {
|
|
164
|
+
if (allColumns && allColumns.length > 0) {
|
|
165
|
+
return allColumns.map(
|
|
166
|
+
(column) => mergeColumnWithTypeInfo(column, normalizedTypeInfo)
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
return buildResolvedColumns(columns, fallbackFields, normalizedTypeInfo);
|
|
170
|
+
}, [allColumns, columns, fallbackFields, normalizedTypeInfo]);
|
|
171
|
+
const resolvedColumns = react.useMemo(() => {
|
|
172
|
+
if (columns && columns.length > 0) {
|
|
173
|
+
return buildResolvedColumns(
|
|
174
|
+
columns,
|
|
175
|
+
fallbackFields,
|
|
176
|
+
normalizedTypeInfo
|
|
177
|
+
).filter((column) => column.visible !== false);
|
|
178
|
+
}
|
|
179
|
+
return resolvedAllColumns.filter((column) => column.visible !== false);
|
|
180
|
+
}, [columns, fallbackFields, normalizedTypeInfo, resolvedAllColumns]);
|
|
181
|
+
const effectiveAggregateFunctions = react.useMemo(
|
|
182
|
+
() => aggregateFunctions ?? datavis.buildAggregateFunctions(),
|
|
183
|
+
[aggregateFunctions]
|
|
184
|
+
);
|
|
185
|
+
const effectiveGroupFunctionDefs = react.useMemo(
|
|
186
|
+
() => groupFunctionDefs ?? datavis.getBuiltinGroupFunctions(trans),
|
|
187
|
+
[groupFunctionDefs, trans]
|
|
188
|
+
);
|
|
189
|
+
const effectiveTableDef = react.useMemo(
|
|
190
|
+
() => mergeTableDef(tableDef, features),
|
|
191
|
+
[tableDef, features]
|
|
192
|
+
);
|
|
193
|
+
const aggFnLabels = react.useMemo(
|
|
194
|
+
() => Object.fromEntries(
|
|
195
|
+
effectiveAggregateFunctions.map((fn) => [fn.name, fn.label])
|
|
196
|
+
),
|
|
197
|
+
[effectiveAggregateFunctions]
|
|
198
|
+
);
|
|
199
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { style, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
200
|
+
datavis.DataGrid,
|
|
201
|
+
{
|
|
202
|
+
...dataGridProps,
|
|
203
|
+
view: computedView,
|
|
204
|
+
tableDef: effectiveTableDef,
|
|
205
|
+
allColumns: resolvedAllColumns,
|
|
206
|
+
filterColumns: filterColumns ?? [],
|
|
207
|
+
controlFields: controlFields ?? buildControlFields(resolvedAllColumns),
|
|
208
|
+
aggregateFields: aggregateFields ?? buildAggregateFields(resolvedAllColumns),
|
|
209
|
+
aggregateFunctions: effectiveAggregateFunctions,
|
|
210
|
+
groupFunctionDefs: effectiveGroupFunctionDefs,
|
|
211
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
212
|
+
datavis.TableRenderer,
|
|
213
|
+
{
|
|
214
|
+
viewData: viewState.data,
|
|
215
|
+
columns: resolvedColumns,
|
|
216
|
+
features: effectiveTableDef?.features ?? features,
|
|
217
|
+
totalRows: viewState.totalRowCount ?? viewState.rowCount,
|
|
218
|
+
loading: viewState.loading || !viewState.ready,
|
|
219
|
+
formatCell,
|
|
220
|
+
aggFnLabels,
|
|
221
|
+
onColumnReorder,
|
|
222
|
+
onColumnResize,
|
|
223
|
+
onHeaderContextMenu,
|
|
224
|
+
onRowClick,
|
|
225
|
+
onRowDoubleClick,
|
|
226
|
+
onSelectionChange
|
|
227
|
+
}
|
|
228
|
+
)
|
|
229
|
+
}
|
|
230
|
+
) });
|
|
231
|
+
}
|
|
232
|
+
function DataVisNitroGrid(props) {
|
|
233
|
+
const computedView = react.useContext(DataVisNitroContext);
|
|
234
|
+
if (computedView === null) {
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DataVisNitroGridInner, { ...props, computedView });
|
|
238
|
+
}
|
|
239
|
+
DataVisNitroSource.displayName = "DataVisNitroSource";
|
|
240
|
+
DataVisNitroGrid.displayName = "DataVisNitroGrid";
|
|
241
|
+
function isObject2(value) {
|
|
242
|
+
return typeof value === "object" && value !== null;
|
|
243
|
+
}
|
|
244
|
+
function normalizeTypeInfo2(typeInfo) {
|
|
245
|
+
if (Array.isArray(typeInfo)) {
|
|
246
|
+
return Object.fromEntries(
|
|
247
|
+
typeInfo.filter(isObject2).map((entry) => [entry.field, entry])
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
if (!isObject2(typeInfo)) {
|
|
251
|
+
return {};
|
|
252
|
+
}
|
|
253
|
+
const maybeOrdMap = typeInfo;
|
|
254
|
+
if (typeof maybeOrdMap.keys === "function" && typeof maybeOrdMap.get === "function") {
|
|
255
|
+
return Object.fromEntries(
|
|
256
|
+
maybeOrdMap.keys().map((field) => [field, maybeOrdMap.get?.(field) ?? {}])
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
return Object.fromEntries(
|
|
260
|
+
Object.entries(typeInfo).filter(([, value]) => isObject2(value))
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
function normalizeFieldType2(type) {
|
|
264
|
+
if (!type) return void 0;
|
|
265
|
+
if (type === "integer") return "number";
|
|
266
|
+
if (type === "boolean") return "string";
|
|
267
|
+
return type;
|
|
268
|
+
}
|
|
269
|
+
function buildColumnFromField2(field, typeInfo) {
|
|
270
|
+
const info = typeInfo[field];
|
|
271
|
+
const normalizedType = normalizeFieldType2(info?.type);
|
|
272
|
+
return {
|
|
273
|
+
field,
|
|
274
|
+
header: info?.displayText ?? field,
|
|
275
|
+
sortable: true,
|
|
276
|
+
filterable: true,
|
|
277
|
+
resizable: true,
|
|
278
|
+
reorderable: true,
|
|
279
|
+
...normalizedType ? {
|
|
280
|
+
typeInfo: {
|
|
281
|
+
type: normalizedType,
|
|
282
|
+
...info?.format !== void 0 ? { format: info.format } : {},
|
|
283
|
+
...info?.internalType !== void 0 ? { internalType: info.internalType } : {}
|
|
284
|
+
}
|
|
285
|
+
} : {}
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function buildResolvedColumns2(columns, fallbackFields, typeInfo) {
|
|
289
|
+
if (columns && columns.length > 0) {
|
|
290
|
+
return columns.map((column) => {
|
|
291
|
+
if (typeof column === "string") {
|
|
292
|
+
return buildColumnFromField2(column, typeInfo);
|
|
293
|
+
}
|
|
294
|
+
return column;
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
return fallbackFields.map((field) => buildColumnFromField2(field, typeInfo));
|
|
298
|
+
}
|
|
299
|
+
function buildFallbackFieldOrder2(typeInfo, data) {
|
|
300
|
+
const rows = Array.isArray(data) ? data.filter((row) => isObject2(row)) : null;
|
|
301
|
+
const normalizedEntries = Object.fromEntries(
|
|
302
|
+
Object.entries(typeInfo).map(([field, info]) => [
|
|
303
|
+
field,
|
|
304
|
+
{
|
|
305
|
+
type: normalizeFieldType2(info.type) ?? "string",
|
|
306
|
+
...info.displayText !== void 0 ? { displayText: info.displayText } : {}
|
|
307
|
+
}
|
|
308
|
+
])
|
|
309
|
+
);
|
|
310
|
+
return datavis.determineColumns(null, normalizedEntries, rows);
|
|
311
|
+
}
|
|
312
|
+
function DataVisNitroGraphInner({
|
|
313
|
+
computedView,
|
|
314
|
+
columns,
|
|
315
|
+
config: initialConfig,
|
|
316
|
+
locale,
|
|
317
|
+
className,
|
|
318
|
+
height,
|
|
319
|
+
onConfigChange
|
|
320
|
+
}) {
|
|
321
|
+
const viewState = datavis.useView(computedView);
|
|
322
|
+
const [liveConfig, setLiveConfig] = react.useState(initialConfig);
|
|
323
|
+
const handleConfigChange = react.useCallback(
|
|
324
|
+
(newConfig) => {
|
|
325
|
+
setLiveConfig(newConfig);
|
|
326
|
+
onConfigChange?.(newConfig);
|
|
327
|
+
},
|
|
328
|
+
[onConfigChange]
|
|
329
|
+
);
|
|
330
|
+
const normalizedTypeInfo = react.useMemo(
|
|
331
|
+
() => normalizeTypeInfo2(viewState.typeInfo ?? computedView?.typeInfo ?? null),
|
|
332
|
+
[computedView, viewState.typeInfo]
|
|
333
|
+
);
|
|
334
|
+
const fallbackFields = react.useMemo(
|
|
335
|
+
() => buildFallbackFieldOrder2(normalizedTypeInfo, viewState.data?.data ?? null),
|
|
336
|
+
[normalizedTypeInfo, viewState.data?.data]
|
|
337
|
+
);
|
|
338
|
+
const resolvedColumns = react.useMemo(
|
|
339
|
+
() => buildResolvedColumns2(columns, fallbackFields, normalizedTypeInfo),
|
|
340
|
+
[columns, fallbackFields, normalizedTypeInfo]
|
|
341
|
+
);
|
|
342
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { style: height ? { height } : void 0, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
343
|
+
datavis.GraphView,
|
|
344
|
+
{
|
|
345
|
+
viewData: viewState.data,
|
|
346
|
+
columns: resolvedColumns,
|
|
347
|
+
config: liveConfig,
|
|
348
|
+
locale,
|
|
349
|
+
className,
|
|
350
|
+
onConfigChange: handleConfigChange
|
|
351
|
+
}
|
|
352
|
+
) });
|
|
353
|
+
}
|
|
354
|
+
function DataVisNitroGraph(props) {
|
|
355
|
+
const computedView = react.useContext(DataVisNitroContext);
|
|
356
|
+
if (computedView === null) {
|
|
357
|
+
return null;
|
|
358
|
+
}
|
|
359
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DataVisNitroGraphInner, { ...props, computedView });
|
|
360
|
+
}
|
|
361
|
+
DataVisNitroGraph.displayName = "DataVisNitroGraph";
|
|
362
|
+
|
|
363
|
+
exports.DataVisNitroContext = DataVisNitroContext;
|
|
364
|
+
exports.DataVisNitroGraph = DataVisNitroGraph;
|
|
365
|
+
exports.DataVisNitroGrid = DataVisNitroGrid;
|
|
366
|
+
exports.DataVisNitroSource = DataVisNitroSource;
|
|
367
|
+
//# sourceMappingURL=chunk-LZPPH5BW.cjs.map
|
|
368
|
+
//# sourceMappingURL=chunk-LZPPH5BW.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/DataVisNITRO/DataVisNITRO.tsx","../src/components/DataVisNITRO/DataVisNitroGraph.tsx"],"names":["createContext","determineColumns","useRef","Source","ComputedView","useView","useMemo","buildAggregateFunctions","getBuiltinGroupFunctions","jsx","DataGrid","TableRenderer","useContext","isObject","normalizeTypeInfo","normalizeFieldType","buildColumnFromField","buildResolvedColumns","buildFallbackFieldOrder","useState","useCallback","GraphView"],"mappings":"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","file":"chunk-LZPPH5BW.cjs","sourcesContent":["import React, { createContext, useContext, useMemo, useRef } from 'react';\nimport { ComputedView, Source } from 'datavis-ace';\n\nimport {\n DataGrid,\n determineColumns,\n getBuiltinGroupFunctions,\n buildAggregateFunctions,\n useView,\n TableRenderer,\n type DataGridProps,\n type GridTableDef,\n type ViewInstance,\n type TableRendererProps,\n type TableColumn,\n type TableFeatures,\n type ColumnFilterConfig,\n type AggregateFunction,\n type GroupFunctionDef,\n} from '@mieweb/datavis';\n\ntype TranslateFn = (key: string, ...args: unknown[]) => string;\n\ntype DataVisNitroSourceType = 'http' | 'local' | 'file';\n\ninterface HttpDataVisNitroSourceProps {\n type: 'http';\n url: string;\n children?: React.ReactNode;\n}\n\ninterface LocalDataVisNitroSourceProps {\n type: 'local';\n children?: React.ReactNode;\n}\n\ninterface FileDataVisNitroSourceProps {\n type: 'file';\n children?: React.ReactNode;\n}\n\nexport type DataVisNitroSourceProps =\n | HttpDataVisNitroSourceProps\n | LocalDataVisNitroSourceProps\n | FileDataVisNitroSourceProps;\n\ntype TrackedViewInstance = ViewInstance & {\n _dvType: DataVisNitroSourceType;\n _dvUrl: string | undefined;\n};\n\ntype DataVisTypeInfoEntry = {\n type?: string;\n displayText?: string;\n format?: string | Record<string, unknown>;\n internalType?: string;\n};\n\ntype DataVisTypeInfoMap = Record<string, DataVisTypeInfoEntry>;\n\ntype DataVisTypeInfoOrdMap = {\n keys?: () => string[];\n get?: (key: string) => DataVisTypeInfoEntry | undefined;\n};\n\nexport type DataVisNitroColumn = string | TableColumn;\n\nexport interface DataVisNitroGridProps\n extends\n Omit<DataGridProps, 'view' | 'children' | 'allColumns'>,\n Pick<\n TableRendererProps,\n | 'formatCell'\n | 'onColumnReorder'\n | 'onColumnResize'\n | 'onHeaderContextMenu'\n | 'onRowClick'\n | 'onRowDoubleClick'\n | 'onSelectionChange'\n > {\n columns?: DataVisNitroColumn[];\n allColumns?: TableColumn[];\n features?: TableFeatures;\n filterColumns?: ColumnFilterConfig[];\n aggregateFunctions?: AggregateFunction[];\n groupFunctionDefs?: GroupFunctionDef[];\n style?: React.CSSProperties;\n trans?: TranslateFn;\n}\n\nexport const DataVisNitroContext = createContext<ViewInstance | null>(null);\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction normalizeTypeInfo(typeInfo: unknown): DataVisTypeInfoMap {\n if (Array.isArray(typeInfo)) {\n return Object.fromEntries(\n typeInfo.filter(isObject).map((entry) => [entry.field, entry])\n ) as DataVisTypeInfoMap;\n }\n\n if (!isObject(typeInfo)) {\n return {};\n }\n\n const maybeOrdMap = typeInfo as DataVisTypeInfoOrdMap;\n if (\n typeof maybeOrdMap.keys === 'function' &&\n typeof maybeOrdMap.get === 'function'\n ) {\n return Object.fromEntries(\n maybeOrdMap.keys().map((field) => [field, maybeOrdMap.get?.(field) ?? {}])\n );\n }\n\n return Object.fromEntries(\n Object.entries(typeInfo).filter(([, value]) => isObject(value))\n ) as DataVisTypeInfoMap;\n}\n\nfunction normalizeFieldType(type: string | undefined): string | undefined {\n if (!type) return undefined;\n if (type === 'integer') return 'number';\n if (type === 'boolean') return 'string';\n return type;\n}\n\nfunction buildColumnFromField(\n field: string,\n typeInfo: DataVisTypeInfoMap\n): TableColumn {\n const info = typeInfo[field];\n const normalizedType = normalizeFieldType(info?.type);\n\n return {\n field,\n header: info?.displayText ?? field,\n sortable: true,\n filterable: true,\n resizable: true,\n reorderable: true,\n ...(normalizedType\n ? {\n typeInfo: {\n type: normalizedType,\n ...(info?.format !== undefined ? { format: info.format } : {}),\n ...(info?.internalType !== undefined\n ? { internalType: info.internalType }\n : {}),\n },\n }\n : {}),\n };\n}\n\nfunction mergeColumnWithTypeInfo(\n column: TableColumn,\n typeInfo: DataVisTypeInfoMap\n): TableColumn {\n const fallbackColumn = buildColumnFromField(column.field, typeInfo);\n return {\n ...fallbackColumn,\n ...column,\n header: column.header ?? fallbackColumn.header,\n typeInfo: column.typeInfo ?? fallbackColumn.typeInfo,\n };\n}\n\nfunction buildResolvedColumns(\n columns: DataVisNitroColumn[] | undefined,\n fallbackFields: string[],\n typeInfo: DataVisTypeInfoMap\n): TableColumn[] {\n if (columns && columns.length > 0) {\n return columns.map((column) => {\n if (typeof column === 'string') {\n return buildColumnFromField(column, typeInfo);\n }\n\n return mergeColumnWithTypeInfo(column, typeInfo);\n });\n }\n\n return fallbackFields.map((field) => buildColumnFromField(field, typeInfo));\n}\n\nfunction buildFallbackFieldOrder(\n typeInfo: DataVisTypeInfoMap,\n data: unknown[] | null\n): string[] {\n const rows = Array.isArray(data)\n ? data.filter((row): row is Record<string, unknown> => isObject(row))\n : null;\n\n const normalizedEntries = Object.fromEntries(\n Object.entries(typeInfo).map(([field, info]) => [\n field,\n {\n type: normalizeFieldType(info.type) ?? 'string',\n ...(info.displayText !== undefined\n ? { displayText: info.displayText }\n : {}),\n },\n ])\n );\n\n return determineColumns(null, normalizedEntries, rows);\n}\n\nfunction buildControlFields(\n columns: TableColumn[]\n): NonNullable<DataGridProps['controlFields']> {\n return columns.map((column) => ({\n field: column.field,\n displayName: column.header,\n type: column.typeInfo?.type,\n }));\n}\n\nfunction buildAggregateFields(\n columns: TableColumn[]\n): NonNullable<DataGridProps['aggregateFields']> {\n return columns.map((column) => ({\n field: column.field,\n displayName: column.header,\n }));\n}\n\nfunction mergeTableDef(\n tableDef: GridTableDef | undefined,\n features: TableFeatures | undefined\n): GridTableDef | undefined {\n if (!tableDef && !features) {\n return undefined;\n }\n\n const { rowMode, ...featureFlags } = features ?? {};\n\n return {\n ...tableDef,\n ...(rowMode !== undefined ? { rowMode } : {}),\n ...(Object.keys(featureFlags).length > 0\n ? {\n features: {\n ...(tableDef?.features ?? {}),\n ...featureFlags,\n },\n }\n : {}),\n };\n}\n\nfunction DataVisNitroSource(props: DataVisNitroSourceProps) {\n const { type, children } = props;\n const url = props.type === 'http' ? props.url : undefined;\n const viewRef = useRef<TrackedViewInstance | null>(null);\n\n if (\n viewRef.current === null ||\n viewRef.current._dvType !== type ||\n viewRef.current._dvUrl !== url\n ) {\n const source =\n props.type === 'http'\n ? new Source({ type, url: props.url })\n : new Source({ type });\n\n viewRef.current = Object.assign(\n new ComputedView(source) as unknown as ViewInstance,\n { _dvType: type, _dvUrl: url }\n );\n }\n\n return (\n <DataVisNitroContext.Provider value={viewRef.current}>\n {children}\n </DataVisNitroContext.Provider>\n );\n}\n\nfunction DataVisNitroGridInner({\n computedView,\n columns,\n allColumns,\n features,\n filterColumns,\n controlFields,\n aggregateFields,\n aggregateFunctions,\n groupFunctionDefs,\n tableDef,\n formatCell,\n onColumnReorder,\n onColumnResize,\n onHeaderContextMenu,\n onRowClick,\n onRowDoubleClick,\n onSelectionChange,\n style,\n trans,\n ...dataGridProps\n}: DataVisNitroGridProps & { computedView: ViewInstance }) {\n const viewState = useView(computedView, false);\n\n const normalizedTypeInfo = useMemo(\n () =>\n normalizeTypeInfo(viewState.typeInfo ?? computedView?.typeInfo ?? null),\n [computedView, viewState.typeInfo]\n );\n\n const fallbackFields = useMemo(\n () =>\n buildFallbackFieldOrder(normalizedTypeInfo, viewState.data?.data ?? null),\n [normalizedTypeInfo, viewState.data?.data]\n );\n\n const resolvedAllColumns = useMemo(() => {\n if (allColumns && allColumns.length > 0) {\n return allColumns.map((column) =>\n mergeColumnWithTypeInfo(column, normalizedTypeInfo)\n );\n }\n\n return buildResolvedColumns(columns, fallbackFields, normalizedTypeInfo);\n }, [allColumns, columns, fallbackFields, normalizedTypeInfo]);\n\n const resolvedColumns = useMemo(() => {\n if (columns && columns.length > 0) {\n return buildResolvedColumns(\n columns,\n fallbackFields,\n normalizedTypeInfo\n ).filter((column) => column.visible !== false);\n }\n\n return resolvedAllColumns.filter((column) => column.visible !== false);\n }, [columns, fallbackFields, normalizedTypeInfo, resolvedAllColumns]);\n\n const effectiveAggregateFunctions = useMemo(\n () => aggregateFunctions ?? buildAggregateFunctions(),\n [aggregateFunctions]\n );\n\n const effectiveGroupFunctionDefs = useMemo(\n () =>\n groupFunctionDefs ??\n getBuiltinGroupFunctions(trans as TranslateFn | undefined),\n [groupFunctionDefs, trans]\n );\n\n const effectiveTableDef = useMemo(\n () => mergeTableDef(tableDef, features),\n [tableDef, features]\n );\n\n const aggFnLabels = useMemo(\n () =>\n Object.fromEntries(\n effectiveAggregateFunctions.map((fn) => [fn.name, fn.label])\n ),\n [effectiveAggregateFunctions]\n );\n\n return (\n <div style={style}>\n <DataGrid\n {...dataGridProps}\n view={computedView}\n tableDef={effectiveTableDef}\n allColumns={resolvedAllColumns}\n filterColumns={filterColumns ?? []}\n controlFields={controlFields ?? buildControlFields(resolvedAllColumns)}\n aggregateFields={\n aggregateFields ?? buildAggregateFields(resolvedAllColumns)\n }\n aggregateFunctions={effectiveAggregateFunctions}\n groupFunctionDefs={effectiveGroupFunctionDefs}\n >\n <TableRenderer\n viewData={viewState.data}\n columns={resolvedColumns}\n features={\n (effectiveTableDef?.features as TableFeatures | undefined) ??\n features\n }\n totalRows={viewState.totalRowCount ?? viewState.rowCount}\n loading={viewState.loading || !viewState.ready}\n formatCell={formatCell}\n aggFnLabels={aggFnLabels}\n onColumnReorder={onColumnReorder}\n onColumnResize={onColumnResize}\n onHeaderContextMenu={onHeaderContextMenu}\n onRowClick={onRowClick}\n onRowDoubleClick={onRowDoubleClick}\n onSelectionChange={onSelectionChange}\n />\n </DataGrid>\n </div>\n );\n}\n\nfunction DataVisNitroGrid(props: DataVisNitroGridProps) {\n const computedView = useContext(DataVisNitroContext);\n\n if (computedView === null) {\n return null;\n }\n\n return <DataVisNitroGridInner {...props} computedView={computedView} />;\n}\n\nDataVisNitroSource.displayName = 'DataVisNitroSource';\nDataVisNitroGrid.displayName = 'DataVisNitroGrid';\n\nexport { DataVisNitroGrid, DataVisNitroSource };\n","import React, { useCallback, useContext, useMemo, useState } from 'react';\n\nimport {\n GraphView,\n determineColumns,\n useView,\n type GraphConfig,\n type TableColumn,\n type ViewInstance,\n} from '@mieweb/datavis';\n\nimport { DataVisNitroContext } from './DataVisNITRO';\nimport type { DataVisNitroColumn } from './DataVisNITRO';\n\ntype DataVisTypeInfoEntry = {\n type?: string;\n displayText?: string;\n format?: string | Record<string, unknown>;\n internalType?: string;\n};\n\ntype DataVisTypeInfoMap = Record<string, DataVisTypeInfoEntry>;\n\ntype DataVisTypeInfoOrdMap = {\n keys?: () => string[];\n get?: (key: string) => DataVisTypeInfoEntry | undefined;\n};\n\nexport interface DataVisNitroGraphProps {\n /** Column definitions or field names to include in the graph. */\n columns?: DataVisNitroColumn[];\n /** Initial graph configuration (chart type, axes, etc.). */\n config?: Partial<GraphConfig>;\n /** Locale for formatting. */\n locale?: string;\n /** Additional CSS class name. */\n className?: string;\n /** CSS height for the container. */\n height?: string;\n /** Callback when the user changes graph configuration. */\n onConfigChange?: (config: GraphConfig) => void;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction normalizeTypeInfo(typeInfo: unknown): DataVisTypeInfoMap {\n if (Array.isArray(typeInfo)) {\n return Object.fromEntries(\n typeInfo.filter(isObject).map((entry) => [entry.field, entry])\n ) as DataVisTypeInfoMap;\n }\n\n if (!isObject(typeInfo)) {\n return {};\n }\n\n const maybeOrdMap = typeInfo as DataVisTypeInfoOrdMap;\n if (\n typeof maybeOrdMap.keys === 'function' &&\n typeof maybeOrdMap.get === 'function'\n ) {\n return Object.fromEntries(\n maybeOrdMap.keys().map((field) => [field, maybeOrdMap.get?.(field) ?? {}])\n );\n }\n\n return Object.fromEntries(\n Object.entries(typeInfo).filter(([, value]) => isObject(value))\n ) as DataVisTypeInfoMap;\n}\n\nfunction normalizeFieldType(type: string | undefined): string | undefined {\n if (!type) return undefined;\n if (type === 'integer') return 'number';\n if (type === 'boolean') return 'string';\n return type;\n}\n\nfunction buildColumnFromField(\n field: string,\n typeInfo: DataVisTypeInfoMap\n): TableColumn {\n const info = typeInfo[field];\n const normalizedType = normalizeFieldType(info?.type);\n\n return {\n field,\n header: info?.displayText ?? field,\n sortable: true,\n filterable: true,\n resizable: true,\n reorderable: true,\n ...(normalizedType\n ? {\n typeInfo: {\n type: normalizedType,\n ...(info?.format !== undefined ? { format: info.format } : {}),\n ...(info?.internalType !== undefined\n ? { internalType: info.internalType }\n : {}),\n },\n }\n : {}),\n };\n}\n\nfunction buildResolvedColumns(\n columns: DataVisNitroColumn[] | undefined,\n fallbackFields: string[],\n typeInfo: DataVisTypeInfoMap\n): TableColumn[] {\n if (columns && columns.length > 0) {\n return columns.map((column) => {\n if (typeof column === 'string') {\n return buildColumnFromField(column, typeInfo);\n }\n return column;\n });\n }\n\n return fallbackFields.map((field) => buildColumnFromField(field, typeInfo));\n}\n\nfunction buildFallbackFieldOrder(\n typeInfo: DataVisTypeInfoMap,\n data: unknown[] | null\n): string[] {\n const rows = Array.isArray(data)\n ? data.filter((row): row is Record<string, unknown> => isObject(row))\n : null;\n\n const normalizedEntries = Object.fromEntries(\n Object.entries(typeInfo).map(([field, info]) => [\n field,\n {\n type: normalizeFieldType(info.type) ?? 'string',\n ...(info.displayText !== undefined\n ? { displayText: info.displayText }\n : {}),\n },\n ])\n );\n\n return determineColumns(null, normalizedEntries, rows);\n}\n\nfunction DataVisNitroGraphInner({\n computedView,\n columns,\n config: initialConfig,\n locale,\n className,\n height,\n onConfigChange,\n}: DataVisNitroGraphProps & { computedView: ViewInstance }) {\n const viewState = useView(computedView);\n const [liveConfig, setLiveConfig] = useState<\n Partial<GraphConfig> | undefined\n >(initialConfig);\n\n const handleConfigChange = useCallback(\n (newConfig: GraphConfig) => {\n setLiveConfig(newConfig);\n onConfigChange?.(newConfig);\n },\n [onConfigChange]\n );\n\n const normalizedTypeInfo = useMemo(\n () =>\n normalizeTypeInfo(viewState.typeInfo ?? computedView?.typeInfo ?? null),\n [computedView, viewState.typeInfo]\n );\n\n const fallbackFields = useMemo(\n () =>\n buildFallbackFieldOrder(normalizedTypeInfo, viewState.data?.data ?? null),\n [normalizedTypeInfo, viewState.data?.data]\n );\n\n const resolvedColumns = useMemo(\n () => buildResolvedColumns(columns, fallbackFields, normalizedTypeInfo),\n [columns, fallbackFields, normalizedTypeInfo]\n );\n\n return (\n <div style={height ? { height } : undefined}>\n <GraphView\n viewData={viewState.data}\n columns={resolvedColumns}\n config={liveConfig}\n locale={locale}\n className={className}\n onConfigChange={handleConfigChange}\n />\n </div>\n );\n}\n\nfunction DataVisNitroGraph(props: DataVisNitroGraphProps) {\n const computedView = useContext(DataVisNitroContext);\n\n if (computedView === null) {\n return null;\n }\n\n return <DataVisNitroGraphInner {...props} computedView={computedView} />;\n}\n\nDataVisNitroGraph.displayName = 'DataVisNitroGraph';\n\nexport { DataVisNitroGraph };\n"]}
|
|
@@ -8,7 +8,10 @@ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
|
8
8
|
var placementStyles = {
|
|
9
9
|
"bottom-start": "top-full left-0 mt-2",
|
|
10
10
|
"bottom-end": "top-full right-0 mt-2",
|
|
11
|
-
bottom: "top-full left-1/2 -translate-x-1/2 mt-2"
|
|
11
|
+
bottom: "top-full left-1/2 -translate-x-1/2 mt-2",
|
|
12
|
+
"top-start": "bottom-full left-0 mb-2",
|
|
13
|
+
"top-end": "bottom-full right-0 mb-2",
|
|
14
|
+
top: "bottom-full left-1/2 -translate-x-1/2 mb-2"
|
|
12
15
|
};
|
|
13
16
|
var DropdownContext = React.createContext(null);
|
|
14
17
|
function getNodeText(node) {
|
|
@@ -586,5 +589,5 @@ function DropdownLabel({
|
|
|
586
589
|
DropdownLabel.displayName = "DropdownLabel";
|
|
587
590
|
|
|
588
591
|
export { Dropdown, DropdownContent, DropdownHeader, DropdownItem, DropdownLabel, DropdownSeparator };
|
|
589
|
-
//# sourceMappingURL=chunk-
|
|
590
|
-
//# sourceMappingURL=chunk-
|
|
592
|
+
//# sourceMappingURL=chunk-M7BLVBL4.js.map
|
|
593
|
+
//# sourceMappingURL=chunk-M7BLVBL4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Dropdown/Dropdown.tsx"],"names":["Fragment"],"mappings":"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","file":"chunk-M7BLVBL4.js","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\nimport { inputVariants } from '../Input';\n\nexport type DropdownPlacement =\n | 'bottom-start'\n | 'bottom-end'\n | 'bottom'\n | 'top-start'\n | 'top-end'\n | 'top';\n\nexport interface DropdownProps {\n /** The trigger element (usually a button) */\n trigger: React.ReactElement<{\n onClick?: () => void;\n disabled?: boolean;\n 'aria-haspopup'?: string;\n 'aria-expanded'?: boolean;\n 'aria-controls'?: string;\n }>;\n /** Dropdown content */\n children: React.ReactNode;\n /** Controlled open state */\n open?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Placement of the dropdown */\n placement?: DropdownPlacement;\n /** Additional class name for the dropdown menu */\n className?: string;\n /** Width of the dropdown menu */\n width?: 'auto' | 'trigger' | number;\n /** Whether the dropdown is disabled */\n disabled?: boolean;\n /** Whether to render a search field at the top of the dropdown */\n searchable?: boolean;\n /** Placeholder text for the search input */\n searchPlaceholder?: string;\n /** Accessible label for the search input */\n searchAriaLabel?: string;\n /** Content to render when no items match the search query */\n searchEmptyState?: React.ReactNode;\n /** Whether dropdown items support multi-select checkboxes */\n multiSelect?: boolean;\n /** Selected item values for controlled multi-select dropdowns */\n selectedValues?: string[];\n /** Initial selected item values for uncontrolled multi-select dropdowns */\n defaultSelectedValues?: string[];\n /** Callback fired when selected values change in multi-select mode */\n onSelectedValuesChange?: (values: string[]) => void;\n /** Whether to render a select-all control for multi-select dropdowns */\n showSelectAll?: boolean;\n /** Label for the select-all control */\n selectAllLabel?: React.ReactNode;\n}\n\nconst placementStyles: Record<DropdownPlacement, string> = {\n 'bottom-start': 'top-full left-0 mt-2',\n 'bottom-end': 'top-full right-0 mt-2',\n bottom: 'top-full left-1/2 -translate-x-1/2 mt-2',\n 'top-start': 'bottom-full left-0 mb-2',\n 'top-end': 'bottom-full right-0 mb-2',\n top: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n};\n\ninterface DropdownContextValue {\n multiSelect: boolean;\n selectedValues: string[];\n toggleSelectedValue: (value: string) => void;\n}\n\nconst DropdownContext = React.createContext<DropdownContextValue | null>(null);\n\nfunction getNodeText(node: React.ReactNode): string {\n if (typeof node === 'string' || typeof node === 'number') {\n return String(node);\n }\n\n if (Array.isArray(node)) {\n return node.map(getNodeText).join(' ');\n }\n\n if (React.isValidElement<{ children?: React.ReactNode }>(node)) {\n return getNodeText(node.props.children);\n }\n\n return '';\n}\n\nfunction isDropdownElement<P>(\n node: React.ReactNode,\n component: React.JSXElementConstructor<P>\n): node is React.ReactElement<P> {\n return React.isValidElement(node) && node.type === component;\n}\n\nfunction hasVisibleDropdownContent(node: React.ReactNode): boolean {\n if (node == null || typeof node === 'boolean') {\n return false;\n }\n\n if (Array.isArray(node)) {\n return node.some(hasVisibleDropdownContent);\n }\n\n if (!React.isValidElement<{ children?: React.ReactNode }>(node)) {\n if (typeof node === 'string') {\n return node.trim().length > 0;\n }\n\n return true;\n }\n\n if (node.type === React.Fragment) {\n return React.Children.toArray(node.props.children).some(\n hasVisibleDropdownContent\n );\n }\n\n if (\n node.type === DropdownSeparator ||\n node.type === DropdownLabel ||\n node.type === DropdownHeader\n ) {\n return false;\n }\n\n if (node.type === DropdownContent) {\n return React.Children.toArray(node.props.children).some(\n hasVisibleDropdownContent\n );\n }\n\n return true;\n}\n\nfunction normalizeDropdownSiblings(\n children: React.ReactNode[]\n): React.ReactNode[] {\n const hasContentBefore = (index: number) => {\n for (let current = index - 1; current >= 0; current -= 1) {\n const child = children[current];\n\n if (isDropdownElement(child, DropdownSeparator)) {\n return false;\n }\n\n if (hasVisibleDropdownContent(child)) {\n return true;\n }\n }\n\n return false;\n };\n\n const hasContentAfter = (index: number) => {\n for (let current = index + 1; current < children.length; current += 1) {\n const child = children[current];\n\n if (isDropdownElement(child, DropdownSeparator)) {\n return false;\n }\n\n if (hasVisibleDropdownContent(child)) {\n return true;\n }\n }\n\n return false;\n };\n\n return children.filter((child, index) => {\n if (isDropdownElement(child, DropdownSeparator)) {\n return hasContentBefore(index) && hasContentAfter(index);\n }\n\n if (isDropdownElement(child, DropdownLabel)) {\n return hasContentAfter(index);\n }\n\n return true;\n });\n}\n\nfunction filterDropdownChildren(\n children: React.ReactNode,\n query: string\n): React.ReactNode[] {\n const normalizedQuery = query.trim().toLowerCase();\n\n if (!normalizedQuery) {\n return React.Children.toArray(children);\n }\n\n const filteredChildren = React.Children.toArray(children)\n .map((child) => {\n if (!React.isValidElement<{ children?: React.ReactNode }>(child)) {\n if (typeof child === 'string' || typeof child === 'number') {\n return String(child).toLowerCase().includes(normalizedQuery)\n ? child\n : null;\n }\n\n return null;\n }\n\n if (child.type === React.Fragment) {\n const fragmentChildren = filterDropdownChildren(\n child.props.children,\n normalizedQuery\n );\n\n return fragmentChildren.length > 0\n ? React.cloneElement(child, undefined, fragmentChildren)\n : null;\n }\n\n if (isDropdownElement(child, DropdownHeader)) {\n return child;\n }\n\n if (isDropdownElement(child, DropdownItem)) {\n const searchText = [\n getNodeText(child.props.children),\n child.props.searchText,\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n\n return searchText.includes(normalizedQuery) ? child : null;\n }\n\n if (isDropdownElement(child, DropdownContent)) {\n const contentChildren = filterDropdownChildren(\n child.props.children,\n normalizedQuery\n );\n\n return hasVisibleDropdownContent(contentChildren)\n ? React.cloneElement(child, undefined, contentChildren)\n : null;\n }\n\n if (isDropdownElement(child, DropdownSeparator)) {\n return child;\n }\n\n if (isDropdownElement(child, DropdownLabel)) {\n return child;\n }\n\n const nestedChildren = child.props.children;\n\n if (nestedChildren === undefined) {\n return child;\n }\n\n const filteredNestedChildren = filterDropdownChildren(\n nestedChildren,\n normalizedQuery\n );\n\n return filteredNestedChildren.length > 0\n ? React.cloneElement(child, undefined, filteredNestedChildren)\n : null;\n })\n .filter((child) => child !== null);\n\n return normalizeDropdownSiblings(filteredChildren);\n}\n\nfunction getSelectableValues(children: React.ReactNode): string[] {\n return React.Children.toArray(children).flatMap((child) => {\n if (\n !React.isValidElement<{ children?: React.ReactNode; value?: unknown }>(\n child\n )\n ) {\n return [];\n }\n\n if (child.type === React.Fragment || child.type === DropdownContent) {\n return getSelectableValues(child.props.children);\n }\n\n if (isDropdownElement(child, DropdownItem)) {\n return typeof child.props.value === 'string' ? [child.props.value] : [];\n }\n\n return child.props.children !== undefined\n ? getSelectableValues(child.props.children)\n : [];\n });\n}\n\n/**\n * An accessible dropdown menu component.\n *\n * @example\n * ```tsx\n * <Dropdown\n * trigger={<Button>Options</Button>}\n * >\n * <DropdownItem onClick={() => console.log('Edit')}>Edit</DropdownItem>\n * <DropdownItem onClick={() => console.log('Delete')} variant=\"danger\">Delete</DropdownItem>\n * </Dropdown>\n * ```\n */\nfunction Dropdown({\n trigger,\n children,\n open: controlledOpen,\n onOpenChange,\n placement = 'bottom-start',\n className,\n width = 'auto',\n disabled = false,\n searchable = false,\n searchPlaceholder = 'Search...',\n searchAriaLabel = 'Search dropdown items',\n searchEmptyState = 'No results found',\n multiSelect = false,\n selectedValues: controlledSelectedValues,\n defaultSelectedValues = [],\n onSelectedValuesChange,\n showSelectAll = false,\n selectAllLabel = 'Select all',\n}: DropdownProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const [uncontrolledSelectedValues, setUncontrolledSelectedValues] =\n React.useState(defaultSelectedValues);\n const [searchQuery, setSearchQuery] = React.useState('');\n const containerRef = React.useRef<HTMLDivElement>(null);\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n const menuId = React.useId();\n\n const isControlled = controlledOpen !== undefined;\n const isSelectedValuesControlled = controlledSelectedValues !== undefined;\n const isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n const selectedValues = isSelectedValuesControlled\n ? controlledSelectedValues\n : uncontrolledSelectedValues;\n\n const setOpen = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(value);\n }\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange]\n );\n\n const handleToggle = React.useCallback(() => {\n if (!disabled) {\n setOpen(!isOpen);\n }\n }, [disabled, isOpen, setOpen]);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const setSelectedValues = React.useCallback(\n (values: string[]) => {\n if (!isSelectedValuesControlled) {\n setUncontrolledSelectedValues(values);\n }\n onSelectedValuesChange?.(values);\n },\n [isSelectedValuesControlled, onSelectedValuesChange]\n );\n\n const toggleSelectedValue = React.useCallback(\n (value: string) => {\n if (!multiSelect) {\n return;\n }\n\n setSelectedValues(\n selectedValues.includes(value)\n ? selectedValues.filter((selectedValue) => selectedValue !== value)\n : [...selectedValues, value]\n );\n },\n [multiSelect, selectedValues, setSelectedValues]\n );\n\n const dropdownContext = React.useMemo<DropdownContextValue>(\n () => ({\n multiSelect,\n selectedValues,\n toggleSelectedValue,\n }),\n [multiSelect, selectedValues, toggleSelectedValue]\n );\n\n useClickOutside(containerRef, handleClose, isOpen);\n useEscapeKey(handleClose, isOpen);\n\n React.useEffect(() => {\n if (!isOpen) {\n setSearchQuery('');\n return;\n }\n\n if (searchable) {\n requestAnimationFrame(() => searchInputRef.current?.focus());\n }\n }, [isOpen, searchable]);\n\n // Clone trigger to add event handlers\n const triggerElement = React.cloneElement(trigger, {\n onClick: handleToggle,\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n 'aria-controls': isOpen ? menuId : undefined,\n disabled: disabled || trigger.props.disabled,\n });\n\n const widthStyle =\n typeof width === 'number'\n ? { width: `${width}px` }\n : width === 'trigger'\n ? { minWidth: '100%' }\n : {};\n\n const filteredChildren = React.useMemo(\n () => filterDropdownChildren(children, searchQuery),\n [children, searchQuery]\n );\n const visibleSelectableValues = React.useMemo(\n () => getSelectableValues(searchable ? filteredChildren : children),\n [children, filteredChildren, searchable]\n );\n const hasSearchResults = React.useMemo(\n () => hasVisibleDropdownContent(filteredChildren),\n [filteredChildren]\n );\n const allVisibleSelected =\n visibleSelectableValues.length > 0 &&\n visibleSelectableValues.every((value) => selectedValues.includes(value));\n const someVisibleSelected = visibleSelectableValues.some((value) =>\n selectedValues.includes(value)\n );\n\n const handleSelectAll = React.useCallback(() => {\n if (!multiSelect || visibleSelectableValues.length === 0) {\n return;\n }\n\n const visibleValueSet = new Set(visibleSelectableValues);\n\n setSelectedValues(\n allVisibleSelected\n ? selectedValues.filter((value) => !visibleValueSet.has(value))\n : Array.from(new Set([...selectedValues, ...visibleSelectableValues]))\n );\n }, [\n allVisibleSelected,\n multiSelect,\n selectedValues,\n setSelectedValues,\n visibleSelectableValues,\n ]);\n\n return (\n <DropdownContext.Provider value={dropdownContext}>\n <div ref={containerRef} className=\"relative inline-flex\">\n {triggerElement}\n {isOpen && (\n <div\n style={widthStyle}\n data-slot=\"dropdown-menu\"\n className={cn(\n 'absolute z-50 min-w-[12rem]',\n 'rounded-xl border border-neutral-200 bg-white shadow-lg',\n 'dark:border-neutral-700 dark:bg-neutral-800',\n 'animate-in fade-in zoom-in-95 duration-100',\n placementStyles[placement],\n className\n )}\n >\n {searchable && (\n <div\n className=\"border-b border-neutral-200 p-2 dark:border-neutral-700\"\n data-slot=\"dropdown-search\"\n >\n <input\n ref={searchInputRef}\n type=\"search\"\n value={searchQuery}\n onChange={(event) => setSearchQuery(event.target.value)}\n placeholder={searchPlaceholder}\n aria-label={searchAriaLabel}\n aria-controls={menuId}\n aria-autocomplete=\"list\"\n data-slot=\"dropdown-search-input\"\n className={cn(\n inputVariants({ size: 'sm' }),\n 'text-sm',\n 'dark:border-neutral-600 dark:bg-neutral-700 dark:text-neutral-100'\n )}\n />\n </div>\n )}\n <div id={menuId} role=\"menu\">\n {multiSelect &&\n showSelectAll &&\n visibleSelectableValues.length > 0 && (\n <>\n <div className=\"p-2\" data-slot=\"dropdown-select-all\">\n <DropdownItem\n checked={allVisibleSelected}\n indeterminate={\n !allVisibleSelected && someVisibleSelected\n }\n onClick={handleSelectAll}\n >\n {selectAllLabel}\n </DropdownItem>\n </div>\n <DropdownSeparator />\n </>\n )}\n {searchable ? (\n hasSearchResults ? (\n filteredChildren\n ) : (\n <div\n className=\"text-muted-foreground px-3 py-4 text-center text-sm\"\n data-slot=\"dropdown-empty\"\n >\n {searchEmptyState}\n </div>\n )\n ) : (\n children\n )}\n </div>\n </div>\n )}\n </div>\n </DropdownContext.Provider>\n );\n}\n\nDropdown.displayName = 'Dropdown';\n\n// ============================================================================\n// Dropdown Header Component\n// ============================================================================\n\nexport interface DropdownHeaderProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'title'\n> {\n /** Avatar element or image */\n avatar?: React.ReactNode;\n /** Primary text (e.g., user name) */\n title: React.ReactNode;\n /** Secondary text (e.g., email) */\n subtitle?: React.ReactNode;\n}\n\n/**\n * A header section for dropdown menus, typically used for user info.\n *\n * @example\n * ```tsx\n * <DropdownHeader\n * avatar={<Avatar name=\"John Doe\" />}\n * title=\"John Doe\"\n * subtitle=\"john@example.com\"\n * />\n * ```\n */\nconst DropdownHeader = React.forwardRef<HTMLDivElement, DropdownHeaderProps>(\n ({ className, avatar, title, subtitle, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"dropdown-header\"\n className={cn(\n 'border-b border-neutral-200 p-4 dark:border-neutral-700',\n className\n )}\n {...props}\n >\n <div\n className=\"flex items-center gap-3\"\n data-slot=\"dropdown-header-row\"\n >\n {avatar}\n <div className=\"min-w-0 flex-1\">\n <p\n className=\"truncate text-sm font-semibold text-neutral-900 dark:text-white\"\n data-slot=\"dropdown-header-title\"\n >\n {title}\n </p>\n {subtitle && (\n <p\n className=\"text-muted-foreground truncate text-xs\"\n data-slot=\"dropdown-header-subtitle\"\n >\n {subtitle}\n </p>\n )}\n </div>\n </div>\n {children}\n </div>\n );\n }\n);\n\nDropdownHeader.displayName = 'DropdownHeader';\n\n// ============================================================================\n// Dropdown Content Component\n// ============================================================================\n\nexport type DropdownContentProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * A container for dropdown menu items with proper padding.\n */\nconst DropdownContent = React.forwardRef<HTMLDivElement, DropdownContentProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"dropdown-content\"\n className={cn('p-2', className)}\n {...props}\n />\n );\n }\n);\n\nDropdownContent.displayName = 'DropdownContent';\n\n// ============================================================================\n// Dropdown Item Component\n// ============================================================================\n\nexport interface DropdownItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Icon to display before the label */\n icon?: React.ReactNode;\n /** Danger variant for destructive actions */\n variant?: 'default' | 'danger';\n /** Optional text used when filtering searchable dropdown items */\n searchText?: string;\n /** Checked state for multi-select items */\n checked?: boolean;\n /** Indeterminate state for multi-select items */\n indeterminate?: boolean;\n /** Callback fired when a multi-select item changes */\n onCheckedChange?: (checked: boolean) => void;\n}\n\nfunction DropdownItemCheckbox({\n checked,\n indeterminate = false,\n}: {\n checked: boolean;\n indeterminate?: boolean;\n}) {\n return (\n <span\n aria-hidden=\"true\"\n data-slot=\"dropdown-checkbox\"\n className={cn(\n 'flex h-4 w-4 shrink-0 items-center justify-center rounded border-2 transition-colors duration-150',\n checked || indeterminate\n ? 'border-primary-500 bg-primary-800 text-white'\n : 'border-input bg-background text-transparent'\n )}\n >\n {indeterminate ? (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M4 8h8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n ) : (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3.5 8.5 6.5 11.5 12.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n );\n}\n\n/**\n * An item within a Dropdown menu.\n */\nconst DropdownItem = React.forwardRef<HTMLButtonElement, DropdownItemProps>(\n (\n {\n className,\n icon,\n variant = 'default',\n children,\n searchText,\n checked,\n indeterminate = false,\n onCheckedChange,\n onClick,\n value,\n disabled,\n ...props\n },\n ref\n ) => {\n const dropdownContext = React.useContext(DropdownContext);\n const itemValue = typeof value === 'string' ? value : undefined;\n const contextSelectedValues = dropdownContext?.selectedValues ?? [];\n const isMultiSelectItem =\n (dropdownContext?.multiSelect === true && itemValue !== undefined) ||\n checked !== undefined ||\n indeterminate;\n const isChecked =\n checked ??\n (isMultiSelectItem\n ? itemValue !== undefined && contextSelectedValues.includes(itemValue)\n : false);\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n if (\n dropdownContext &&\n isMultiSelectItem &&\n itemValue !== undefined &&\n !disabled\n ) {\n dropdownContext.toggleSelectedValue(itemValue);\n onCheckedChange?.(!isChecked);\n }\n\n onClick?.(event);\n },\n [\n disabled,\n dropdownContext,\n isChecked,\n isMultiSelectItem,\n itemValue,\n onCheckedChange,\n onClick,\n ]\n );\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role={isMultiSelectItem ? 'menuitemcheckbox' : 'menuitem'}\n aria-checked={\n isMultiSelectItem ? (indeterminate ? 'mixed' : isChecked) : undefined\n }\n disabled={disabled}\n data-slot=\"dropdown-item\"\n className={cn(\n 'flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-sm',\n 'transition-colors duration-150',\n 'focus:outline-none',\n variant === 'default' && [\n 'text-neutral-700 dark:text-neutral-300',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-700',\n 'focus:bg-neutral-100 dark:focus:bg-neutral-700',\n ],\n variant === 'danger' && [\n 'text-red-600 dark:text-red-400',\n 'hover:bg-red-50 dark:hover:bg-red-900/20',\n 'focus:bg-red-50 dark:focus:bg-red-900/20',\n ],\n className\n )}\n data-search-text={searchText}\n onClick={handleClick}\n value={value}\n {...props}\n >\n {isMultiSelectItem && (\n <DropdownItemCheckbox\n checked={isChecked}\n indeterminate={indeterminate}\n />\n )}\n {icon && (\n <span className=\"h-4 w-4 shrink-0\" data-slot=\"dropdown-item-icon\">\n {icon}\n </span>\n )}\n <span className=\"font-medium\" data-slot=\"dropdown-item-label\">\n {children}\n </span>\n </button>\n );\n }\n);\n\nDropdownItem.displayName = 'DropdownItem';\n\n// ============================================================================\n// Dropdown Separator Component\n// ============================================================================\n\n/**\n * A separator between dropdown items.\n */\nfunction DropdownSeparator({ className }: { className?: string }) {\n return (\n <hr\n data-slot=\"dropdown-separator\"\n className={cn(\n 'border-t border-neutral-200 dark:border-neutral-700',\n className\n )}\n />\n );\n}\n\nDropdownSeparator.displayName = 'DropdownSeparator';\n\n// ============================================================================\n// Dropdown Label Component\n// ============================================================================\n\n/**\n * A label/header for a group of dropdown items.\n */\nfunction DropdownLabel({\n className,\n children,\n}: {\n className?: string;\n children: React.ReactNode;\n}) {\n return (\n <div\n data-slot=\"dropdown-label\"\n className={cn(\n 'px-3 py-1.5 text-xs font-semibold tracking-wider uppercase',\n 'text-muted-foreground',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\nDropdownLabel.displayName = 'DropdownLabel';\n\nexport {\n Dropdown,\n DropdownHeader,\n DropdownContent,\n DropdownItem,\n DropdownSeparator,\n DropdownLabel,\n};\n"]}
|