@inandu-solutions/grid-react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/components/InanduGrid.d.ts +97 -0
  4. package/dist/core/aggregate.d.ts +5 -0
  5. package/dist/core/columns.d.ts +11 -0
  6. package/dist/core/constants.d.ts +14 -0
  7. package/dist/core/export/csv.d.ts +2 -0
  8. package/dist/core/export/download.d.ts +2 -0
  9. package/dist/core/export/markup.d.ts +2 -0
  10. package/dist/core/export/pdf.d.ts +3 -0
  11. package/dist/core/filter.d.ts +26 -0
  12. package/dist/core/format.d.ts +24 -0
  13. package/dist/core/i18n/en.d.ts +46 -0
  14. package/dist/core/i18n/es.d.ts +46 -0
  15. package/dist/core/i18n/fr.d.ts +46 -0
  16. package/dist/core/i18n/index.d.ts +8 -0
  17. package/dist/core/i18n/it.d.ts +46 -0
  18. package/dist/core/i18n/zh.d.ts +46 -0
  19. package/dist/core/index.d.ts +16 -0
  20. package/dist/core/parse.d.ts +14 -0
  21. package/dist/core/sort.d.ts +1 -0
  22. package/dist/core/tree.d.ts +28 -0
  23. package/dist/core/types.d.ts +46 -0
  24. package/dist/hooks/useInanduGrid.d.ts +187 -0
  25. package/dist/html2canvas-BE2ZQbtv.js +4021 -0
  26. package/dist/html2canvas-o9-HsXBE.cjs +5 -0
  27. package/dist/inandu-grid-react.cjs +2 -0
  28. package/dist/inandu-grid-react.js +1656 -0
  29. package/dist/index.d.ts +11 -0
  30. package/dist/index.es-BqzICVsf.cjs +5 -0
  31. package/dist/index.es-CPZG9pTc.js +5752 -0
  32. package/dist/jspdf.es.min-D_8zJvYC.cjs +78 -0
  33. package/dist/jspdf.es.min-DiTFVZBc.js +18250 -0
  34. package/dist/purify.es-3_UFdOhH.js +805 -0
  35. package/dist/purify.es-DXMFKXT6.cjs +3 -0
  36. package/dist/utils/exporters.d.ts +29 -0
  37. package/dist/utils/measureColumn.d.ts +15 -0
  38. package/dist/utils/translate.d.ts +10 -0
  39. package/package.json +89 -0
@@ -0,0 +1,1656 @@
1
+ import { useEffect as e, useMemo as t, useRef as n, useState as r } from "react";
2
+ import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
3
+ //#region src/core/format.ts
4
+ var s = /^(\d+)?\.(\d+)-(\d+)$/;
5
+ function c(e, t, n) {
6
+ let r = {}, i = n ? s.exec(n) : null;
7
+ return i ? (i[1] && (r.minimumIntegerDigits = Number(i[1])), r.minimumFractionDigits = Number(i[2]), r.maximumFractionDigits = Number(i[3])) : r.maximumFractionDigits = 3, new Intl.NumberFormat(t || void 0, r).format(e);
8
+ }
9
+ function l(e) {
10
+ return e instanceof Date ? e : typeof e == "string" ? new Date(e.replace(/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2})/, "$1T$2")) : new Date(e);
11
+ }
12
+ var u = /YYYY|sss|MM|DD|HH|mm|ss/g;
13
+ function d(e, t) {
14
+ let n = (e, t = 2) => String(e).padStart(t, "0");
15
+ return t.replace(u, (t) => {
16
+ switch (t) {
17
+ case "YYYY": return String(e.getFullYear());
18
+ case "MM": return n(e.getMonth() + 1);
19
+ case "DD": return n(e.getDate());
20
+ case "HH": return n(e.getHours());
21
+ case "mm": return n(e.getMinutes());
22
+ case "ss": return n(e.getSeconds());
23
+ case "sss": return n(e.getMilliseconds(), 3);
24
+ default: return t;
25
+ }
26
+ });
27
+ }
28
+ function f(e, t, n, r, i = c) {
29
+ if (e == null) return "";
30
+ switch (t) {
31
+ case "number": {
32
+ let t = typeof e == "number" ? e : Number(e);
33
+ return Number.isNaN(t) ? String(e) : i(t, r, n || void 0);
34
+ }
35
+ case "date": {
36
+ let t = l(e);
37
+ return Number.isNaN(t.getTime()) ? String(e) : d(t, n || "YYYY-MM-DD");
38
+ }
39
+ case "boolean": {
40
+ let [t, r] = (n || "true|false").split("|");
41
+ return e ? t : r;
42
+ }
43
+ default: return String(e);
44
+ }
45
+ }
46
+ //#endregion
47
+ //#region src/core/sort.ts
48
+ function p(e, t, n) {
49
+ return e == null && t == null ? 0 : e == null ? -1 : t == null ? 1 : e instanceof Date && t instanceof Date ? e.getTime() - t.getTime() : typeof e == "number" && typeof t == "number" ? e - t : String(e).localeCompare(String(t), n || void 0);
50
+ }
51
+ //#endregion
52
+ //#region src/core/tree.ts
53
+ function ee(e, t) {
54
+ let { getChildren: n, isExpanded: r, match: i, compare: a } = t, o = [], s = /* @__PURE__ */ new Map(), c = (e) => {
55
+ if (!i) return !0;
56
+ let t = s.get(e);
57
+ if (t !== void 0) return t;
58
+ let r = i(e);
59
+ if (!r) {
60
+ let t = n(e);
61
+ r = !!t && t.some(c);
62
+ }
63
+ return s.set(e, r), r;
64
+ }, l = (e, t) => {
65
+ let s = i ? e.filter(c) : [...e];
66
+ a && (s = s.slice().sort(a));
67
+ for (let e of s) {
68
+ let a = n(e), s = (a ? i ? a.filter(c) : a : []).length > 0, u = s && (i ? !0 : r(e));
69
+ o.push({
70
+ row: e,
71
+ depth: t,
72
+ expandable: s,
73
+ expanded: u
74
+ }), u && l(a, t + 1);
75
+ }
76
+ };
77
+ return l(e, 0), o;
78
+ }
79
+ function te(e, t) {
80
+ let n = [], r = (e) => {
81
+ for (let i of e) {
82
+ n.push(i);
83
+ let e = t(i);
84
+ e && e.length && r(e);
85
+ }
86
+ };
87
+ return r(e), n;
88
+ }
89
+ //#endregion
90
+ //#region src/core/filter.ts
91
+ function m(e) {
92
+ return e ? Object.values(e).some((e) => Array.isArray(e) ? !0 : !!e) : !1;
93
+ }
94
+ function h(e, t, n, r, i) {
95
+ let a = t[e.field()];
96
+ if (n.values !== void 0) return n.values.includes(f(a, e.type(), e.format(), r, i));
97
+ switch (e.type()) {
98
+ case "number": {
99
+ let e = !!n.min, t = !!n.max;
100
+ if (!e && !t) return !0;
101
+ let r = typeof a == "number" ? a : Number(a);
102
+ return !(a == null || Number.isNaN(r) || e && r < Number(n.min) || t && r > Number(n.max));
103
+ }
104
+ case "date": {
105
+ let e = !!n.from, t = !!n.to;
106
+ if (!e && !t) return !0;
107
+ if (a == null) return !1;
108
+ let r = l(a);
109
+ if (Number.isNaN(r.getTime()) || e && r < new Date(n.from)) return !1;
110
+ if (t) {
111
+ let e = new Date(n.to);
112
+ if (e.setHours(23, 59, 59, 999), r > e) return !1;
113
+ }
114
+ return !0;
115
+ }
116
+ case "boolean": return !n.bool || !!a == (n.bool === "true");
117
+ default: {
118
+ let t = (n.text ?? "").trim().toLowerCase();
119
+ return !t || f(a, e.type(), e.format(), r, i).toLowerCase().includes(t);
120
+ }
121
+ }
122
+ }
123
+ //#endregion
124
+ //#region src/core/aggregate.ts
125
+ var g = {
126
+ sum: "Σ",
127
+ avg: "x̄",
128
+ min: "min",
129
+ max: "max",
130
+ count: "#"
131
+ };
132
+ function _(e, t) {
133
+ let n = {};
134
+ for (let r of t) {
135
+ let t = r.field(), i = r.aggregate();
136
+ if (i === "count") {
137
+ n[t] = e.length;
138
+ continue;
139
+ }
140
+ let a = e.map((e) => e[t]).filter((e) => e != null && e !== "" && typeof e != "boolean").map((e) => Number(e)).filter((e) => Number.isFinite(e));
141
+ if (a.length === 0) {
142
+ n[t] = 0;
143
+ continue;
144
+ }
145
+ switch (i) {
146
+ case "sum":
147
+ n[t] = a.reduce((e, t) => e + t, 0);
148
+ break;
149
+ case "avg":
150
+ n[t] = a.reduce((e, t) => e + t, 0) / a.length;
151
+ break;
152
+ case "min":
153
+ n[t] = a.reduce((e, t) => t < e ? t : e, Infinity);
154
+ break;
155
+ case "max": n[t] = a.reduce((e, t) => t > e ? t : e, -Infinity);
156
+ }
157
+ }
158
+ return n;
159
+ }
160
+ //#endregion
161
+ //#region src/core/parse.ts
162
+ function v(e, t) {
163
+ switch (t) {
164
+ case "number": {
165
+ if (e === "" || e === void 0) return;
166
+ let t = Number(e);
167
+ return Number.isNaN(t) ? void 0 : t;
168
+ }
169
+ case "date": {
170
+ let t = typeof e == "string" ? /^(\d{4})-(\d{2})-(\d{2})$/.exec(e) : null, n = t ? new Date(Number(t[1]), Number(t[2]) - 1, Number(t[3])) : new Date(e);
171
+ return Number.isNaN(n.getTime()) ? void 0 : n;
172
+ }
173
+ case "boolean": return !!e;
174
+ default: return e;
175
+ }
176
+ }
177
+ function ne(e, t) {
178
+ return t === "boolean" ? e.trim().toLowerCase() === "true" : v(e, t);
179
+ }
180
+ //#endregion
181
+ //#region src/core/export/csv.ts
182
+ function re(e) {
183
+ return /[",\r\n]/.test(e) ? "\"" + e.replace(/"/g, "\"\"") + "\"" : e;
184
+ }
185
+ //#endregion
186
+ //#region src/core/export/markup.ts
187
+ function y(e) {
188
+ return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
189
+ }
190
+ //#endregion
191
+ //#region src/core/export/pdf.ts
192
+ function ie(e, t, n) {
193
+ if (e.getTextWidth(t) <= n) return t;
194
+ let r = t;
195
+ for (; r.length > 0 && e.getTextWidth(r + "…") > n;) r = r.slice(0, -1);
196
+ return r + "…";
197
+ }
198
+ //#endregion
199
+ //#region src/core/export/download.ts
200
+ function b(e, t, n) {
201
+ let r = e instanceof Blob ? e : new Blob([e], { type: n }), i = URL.createObjectURL(r), a = document.createElement("a");
202
+ a.href = i, a.download = t, a.click(), URL.revokeObjectURL(i);
203
+ }
204
+ //#endregion
205
+ //#region src/core/i18n/en.ts
206
+ var x = {
207
+ MsgNoData: "No data",
208
+ MsgFirstPage: "First page",
209
+ MsgPreviousPage: "Previous page",
210
+ MsgNextPage: "Next page",
211
+ MsgLastPage: "Last page",
212
+ MsgSortBy: "Sort by {{column}}",
213
+ MsgPageOf: "Page {{page}} of {{total}}",
214
+ MsgFilterPlaceholder: "Search",
215
+ MsgFilterColumn: "Filter {{column}}",
216
+ MsgFilterMin: "Min",
217
+ MsgFilterMax: "Max",
218
+ MsgFilterFrom: "From",
219
+ MsgFilterTo: "To",
220
+ MsgAll: "All",
221
+ MsgCancelFilter: "Cancel filter",
222
+ MsgCancelAllFilters: "Clear filters",
223
+ MsgGroupByHint: "Drag a column header here to group by it",
224
+ MsgGroupedBy: "Grouped by {{column}}",
225
+ MsgGroupHeader: "{{column}}: {{value}} ({{count}})",
226
+ MsgCancelGrouping: "Cancel grouping",
227
+ MsgSelectAll: "Select all rows",
228
+ MsgSelectRow: "Select row {{index}}",
229
+ MsgExportCsv: "Export CSV",
230
+ MsgExportExcel: "Export Excel",
231
+ MsgExportPdf: "Export PDF",
232
+ MsgPrint: "Print",
233
+ MsgToggleColumns: "Columns",
234
+ MsgToggleColumn: "Toggle {{column}}",
235
+ MsgEditCell: "Edit {{column}}",
236
+ MsgEditRow: "Edit",
237
+ MsgSaveRow: "Save",
238
+ MsgCancelRowEdit: "Cancel",
239
+ MsgDeleteRow: "Delete",
240
+ MsgAddRow: "Add row",
241
+ MsgLoading: "Loading…",
242
+ MsgDragRow: "Drag to reorder row",
243
+ MsgAutosizeColumn: "Double-click to fit column to content",
244
+ MsgExpandDetail: "Expand row details",
245
+ MsgCollapseDetail: "Collapse row details",
246
+ MsgDeleteSelected: "Delete selected ({{count}})",
247
+ MsgValidationRequired: "This field is required",
248
+ MsgValidationMin: "Must be at least {{min}}",
249
+ MsgValidationMax: "Must be at most {{max}}",
250
+ MsgValidationPattern: "Invalid format"
251
+ }, ae = {
252
+ MsgNoData: "Sin datos",
253
+ MsgFirstPage: "Primera página",
254
+ MsgPreviousPage: "Página anterior",
255
+ MsgNextPage: "Página siguiente",
256
+ MsgLastPage: "Última página",
257
+ MsgSortBy: "Ordenar por {{column}}",
258
+ MsgPageOf: "Página {{page}} de {{total}}",
259
+ MsgFilterPlaceholder: "Buscar",
260
+ MsgFilterColumn: "Filtrar {{column}}",
261
+ MsgFilterMin: "Mín",
262
+ MsgFilterMax: "Máx",
263
+ MsgFilterFrom: "Desde",
264
+ MsgFilterTo: "Hasta",
265
+ MsgAll: "Todos",
266
+ MsgCancelFilter: "Cancelar filtro",
267
+ MsgCancelAllFilters: "Cancelar filtros",
268
+ MsgGroupByHint: "Arrastra el encabezado de una columna aquí para agrupar por ella",
269
+ MsgGroupedBy: "Agrupado por {{column}}",
270
+ MsgGroupHeader: "{{column}}: {{value}} ({{count}})",
271
+ MsgCancelGrouping: "Cancelar agrupación",
272
+ MsgSelectAll: "Seleccionar todas las filas",
273
+ MsgSelectRow: "Seleccionar fila {{index}}",
274
+ MsgExportCsv: "Exportar CSV",
275
+ MsgExportExcel: "Exportar Excel",
276
+ MsgExportPdf: "Exportar PDF",
277
+ MsgPrint: "Imprimir",
278
+ MsgToggleColumns: "Columnas",
279
+ MsgToggleColumn: "Mostrar u ocultar {{column}}",
280
+ MsgEditCell: "Editar {{column}}",
281
+ MsgEditRow: "Editar",
282
+ MsgSaveRow: "Guardar",
283
+ MsgCancelRowEdit: "Cancelar",
284
+ MsgDeleteRow: "Eliminar",
285
+ MsgAddRow: "Agregar fila",
286
+ MsgLoading: "Cargando…",
287
+ MsgDragRow: "Arrastrar para reordenar fila",
288
+ MsgAutosizeColumn: "Doble clic para ajustar la columna al contenido",
289
+ MsgExpandDetail: "Expandir detalle de fila",
290
+ MsgCollapseDetail: "Contraer detalle de fila",
291
+ MsgDeleteSelected: "Eliminar seleccionados ({{count}})",
292
+ MsgValidationRequired: "Este campo es obligatorio",
293
+ MsgValidationMin: "Debe ser como mínimo {{min}}",
294
+ MsgValidationMax: "Debe ser como máximo {{max}}",
295
+ MsgValidationPattern: "Formato inválido"
296
+ }, S = {
297
+ MsgNoData: "Aucune donnée",
298
+ MsgFirstPage: "Première page",
299
+ MsgPreviousPage: "Page précédente",
300
+ MsgNextPage: "Page suivante",
301
+ MsgLastPage: "Dernière page",
302
+ MsgSortBy: "Trier par {{column}}",
303
+ MsgPageOf: "Page {{page}} sur {{total}}",
304
+ MsgFilterPlaceholder: "Rechercher",
305
+ MsgFilterColumn: "Filtrer {{column}}",
306
+ MsgFilterMin: "Min",
307
+ MsgFilterMax: "Max",
308
+ MsgFilterFrom: "De",
309
+ MsgFilterTo: "À",
310
+ MsgAll: "Tous",
311
+ MsgCancelFilter: "Annuler le filtre",
312
+ MsgCancelAllFilters: "Effacer les filtres",
313
+ MsgGroupByHint: "Faites glisser l'en-tête d'une colonne ici pour regrouper par celle-ci",
314
+ MsgGroupedBy: "Regroupé par {{column}}",
315
+ MsgGroupHeader: "{{column}} : {{value}} ({{count}})",
316
+ MsgCancelGrouping: "Annuler le regroupement",
317
+ MsgSelectAll: "Sélectionner toutes les lignes",
318
+ MsgSelectRow: "Sélectionner la ligne {{index}}",
319
+ MsgExportCsv: "Exporter CSV",
320
+ MsgExportExcel: "Exporter Excel",
321
+ MsgExportPdf: "Exporter PDF",
322
+ MsgPrint: "Imprimer",
323
+ MsgToggleColumns: "Colonnes",
324
+ MsgToggleColumn: "Afficher/masquer {{column}}",
325
+ MsgEditCell: "Modifier {{column}}",
326
+ MsgEditRow: "Modifier",
327
+ MsgSaveRow: "Enregistrer",
328
+ MsgCancelRowEdit: "Annuler",
329
+ MsgDeleteRow: "Supprimer",
330
+ MsgAddRow: "Ajouter une ligne",
331
+ MsgLoading: "Chargement…",
332
+ MsgDragRow: "Glisser pour réordonner la ligne",
333
+ MsgAutosizeColumn: "Double-cliquez pour ajuster la colonne au contenu",
334
+ MsgExpandDetail: "Développer les détails de la ligne",
335
+ MsgCollapseDetail: "Réduire les détails de la ligne",
336
+ MsgDeleteSelected: "Supprimer la sélection ({{count}})",
337
+ MsgValidationRequired: "Ce champ est obligatoire",
338
+ MsgValidationMin: "Doit être au moins {{min}}",
339
+ MsgValidationMax: "Doit être au plus {{max}}",
340
+ MsgValidationPattern: "Format invalide"
341
+ }, C = {
342
+ MsgNoData: "Nessun dato",
343
+ MsgFirstPage: "Prima pagina",
344
+ MsgPreviousPage: "Pagina precedente",
345
+ MsgNextPage: "Pagina successiva",
346
+ MsgLastPage: "Ultima pagina",
347
+ MsgSortBy: "Ordina per {{column}}",
348
+ MsgPageOf: "Pagina {{page}} di {{total}}",
349
+ MsgFilterPlaceholder: "Cerca",
350
+ MsgFilterColumn: "Filtra {{column}}",
351
+ MsgFilterMin: "Min",
352
+ MsgFilterMax: "Max",
353
+ MsgFilterFrom: "Da",
354
+ MsgFilterTo: "A",
355
+ MsgAll: "Tutti",
356
+ MsgCancelFilter: "Annulla filtro",
357
+ MsgCancelAllFilters: "Cancella filtri",
358
+ MsgGroupByHint: "Trascina qui l'intestazione di una colonna per raggruppare per essa",
359
+ MsgGroupedBy: "Raggruppato per {{column}}",
360
+ MsgGroupHeader: "{{column}}: {{value}} ({{count}})",
361
+ MsgCancelGrouping: "Annulla raggruppamento",
362
+ MsgSelectAll: "Seleziona tutte le righe",
363
+ MsgSelectRow: "Seleziona riga {{index}}",
364
+ MsgExportCsv: "Esporta CSV",
365
+ MsgExportExcel: "Esporta Excel",
366
+ MsgExportPdf: "Esporta PDF",
367
+ MsgPrint: "Stampa",
368
+ MsgToggleColumns: "Colonne",
369
+ MsgToggleColumn: "Mostra/nascondi {{column}}",
370
+ MsgEditCell: "Modifica {{column}}",
371
+ MsgEditRow: "Modifica",
372
+ MsgSaveRow: "Salva",
373
+ MsgCancelRowEdit: "Annulla",
374
+ MsgDeleteRow: "Elimina",
375
+ MsgAddRow: "Aggiungi riga",
376
+ MsgLoading: "Caricamento…",
377
+ MsgDragRow: "Trascina per riordinare la riga",
378
+ MsgAutosizeColumn: "Doppio clic per adattare la colonna al contenuto",
379
+ MsgExpandDetail: "Espandi dettagli riga",
380
+ MsgCollapseDetail: "Comprimi dettagli riga",
381
+ MsgDeleteSelected: "Elimina selezionati ({{count}})",
382
+ MsgValidationRequired: "Questo campo è obbligatorio",
383
+ MsgValidationMin: "Deve essere almeno {{min}}",
384
+ MsgValidationMax: "Deve essere al massimo {{max}}",
385
+ MsgValidationPattern: "Formato non valido"
386
+ }, oe = {
387
+ MsgNoData: "暂无数据",
388
+ MsgFirstPage: "首页",
389
+ MsgPreviousPage: "上一页",
390
+ MsgNextPage: "下一页",
391
+ MsgLastPage: "末页",
392
+ MsgSortBy: "按{{column}}排序",
393
+ MsgPageOf: "第 {{page}} 页,共 {{total}} 页",
394
+ MsgFilterPlaceholder: "搜索",
395
+ MsgFilterColumn: "筛选{{column}}",
396
+ MsgFilterMin: "最小",
397
+ MsgFilterMax: "最大",
398
+ MsgFilterFrom: "从",
399
+ MsgFilterTo: "到",
400
+ MsgAll: "全部",
401
+ MsgCancelFilter: "取消筛选",
402
+ MsgCancelAllFilters: "清除所有筛选",
403
+ MsgGroupByHint: "将列标题拖到此处以按其分组",
404
+ MsgGroupedBy: "按{{column}}分组",
405
+ MsgGroupHeader: "{{column}}: {{value}} ({{count}})",
406
+ MsgCancelGrouping: "取消分组",
407
+ MsgSelectAll: "选择所有行",
408
+ MsgSelectRow: "选择第 {{index}} 行",
409
+ MsgExportCsv: "导出 CSV",
410
+ MsgExportExcel: "导出 Excel",
411
+ MsgExportPdf: "导出 PDF",
412
+ MsgPrint: "打印",
413
+ MsgToggleColumns: "列",
414
+ MsgToggleColumn: "显示/隐藏{{column}}",
415
+ MsgEditCell: "编辑{{column}}",
416
+ MsgEditRow: "编辑",
417
+ MsgSaveRow: "保存",
418
+ MsgCancelRowEdit: "取消",
419
+ MsgDeleteRow: "删除",
420
+ MsgAddRow: "添加行",
421
+ MsgLoading: "加载中…",
422
+ MsgDragRow: "拖动以重新排序行",
423
+ MsgAutosizeColumn: "双击以使列适应内容",
424
+ MsgExpandDetail: "展开行详情",
425
+ MsgCollapseDetail: "收起行详情",
426
+ MsgDeleteSelected: "删除所选 ({{count}})",
427
+ MsgValidationRequired: "此字段为必填项",
428
+ MsgValidationMin: "不得小于 {{min}}",
429
+ MsgValidationMax: "不得大于 {{max}}",
430
+ MsgValidationPattern: "格式无效"
431
+ }, w = {
432
+ en: x,
433
+ es: ae,
434
+ fr: S,
435
+ it: C,
436
+ zh: oe
437
+ };
438
+ //#endregion
439
+ //#region src/utils/translate.ts
440
+ function T(e, t) {
441
+ return t ? e.replace(/\{\{(\w+)\}\}/g, (e, n) => n in t ? String(t[n]) : e) : e;
442
+ }
443
+ function se(e) {
444
+ let t = w[e.split("-")[0]] ?? x;
445
+ return (e, n) => T(t[e] ?? x[e], n);
446
+ }
447
+ //#endregion
448
+ //#region src/hooks/useInanduGrid.ts
449
+ function ce(e) {
450
+ return {
451
+ field: () => e.field,
452
+ type: () => e.type ?? "string",
453
+ format: () => e.format ?? "",
454
+ order: () => e.order,
455
+ aggregate: () => e.aggregate ?? ""
456
+ };
457
+ }
458
+ function E({ rows: i, columns: a, locale: o = "en", lang: s, pageSize: c = 0, selectable: u = !1, deleteConfirmMessage: d, bulkDeleteConfirmMessage: g, onRowSave: re, onRowCreate: y, onRowDelete: ie, onRowsDelete: b, onCellsPaste: x, onRowOrderChange: ae, treeChildrenKey: S, treeDefaultExpanded: C = "none", singleDetailExpand: oe = !1, virtualScroll: w = !1 }) {
459
+ let [T, E] = r([]), [D, O] = r({}), [k, le] = r(""), [A, ue] = r(0), [j, de] = r(void 0), [M, fe] = r(/* @__PURE__ */ new Set()), [N, pe] = r(void 0), [me, he] = r(!1), [P, F] = r({}), [I, L] = r({}), [ge, _e] = r(!1), [R, ve] = r(/* @__PURE__ */ new Set()), [ye, be] = r(void 0), [xe, z] = r(void 0), [B, Se] = r({}), [Ce, we] = r(void 0), [Te, V] = r(/* @__PURE__ */ new Set()), [Ee, De] = r(/* @__PURE__ */ new Set()), Oe = n(void 0), H = t(() => se(s ?? o), [s, o]), U = t(() => {
460
+ if (!ye) return a;
461
+ let e = new Map(a.map((e) => [e.field, e])), t = [];
462
+ for (let n of ye) {
463
+ let r = e.get(n);
464
+ r && (t.push(r), e.delete(n));
465
+ }
466
+ return t.push(...e.values()), t;
467
+ }, [a, ye]), W = t(() => R.size === 0 ? U : U.filter((e) => !R.has(e.field)), [U, R]), G = t(() => U.filter((e) => e.hideable !== !1), [U]);
468
+ function ke(e) {
469
+ let t = U.map((e) => e.field), n = new Set(t), r = e.filter((e) => n.has(e)), i = new Set(r), a = t.filter((e) => !i.has(e));
470
+ be([...r, ...a]);
471
+ }
472
+ function Ae(e) {
473
+ z(e);
474
+ }
475
+ function je(e) {
476
+ let t = xe;
477
+ if (z(void 0), !t || t === e) return;
478
+ let n = U.find((e) => e.field === t);
479
+ if (!n || n.reorder === !1) return;
480
+ let r = U.map((e) => e.field), i = r.indexOf(t), a = r.indexOf(e);
481
+ i !== -1 && a !== -1 && (r.splice(i, 1), i < a && a--, r.splice(a, 0, t), ke(r));
482
+ }
483
+ function Me(e) {
484
+ return R.has(e);
485
+ }
486
+ function Ne(e) {
487
+ if (R.has(e)) {
488
+ ve((t) => {
489
+ let n = new Set(t);
490
+ return n.delete(e), n;
491
+ });
492
+ return;
493
+ }
494
+ W.length <= 1 || ve((t) => new Set(t).add(e));
495
+ }
496
+ let Pe = t(() => W.filter((e) => e.editable), [W]);
497
+ function Fe(e) {
498
+ ue(0), le(e);
499
+ }
500
+ let K = t(() => new Map(W.map((e) => [e.field, ce(e)])), [W]), Ie = t(() => W.filter((e) => e.aggregate).map((e) => K.get(e.field)), [W, K]);
501
+ function Le(e, t) {
502
+ ue(0), O((n) => ({
503
+ ...n,
504
+ [e]: t
505
+ }));
506
+ }
507
+ let q = t(() => {
508
+ let e = i, t = k.trim().toLowerCase();
509
+ t && (e = e.filter((e) => W.some((n) => {
510
+ let r = K.get(n.field);
511
+ return f(e[n.field], r.type(), r.format(), o).toLowerCase().includes(t);
512
+ })));
513
+ let n = Object.entries(D).filter(([, e]) => m(e));
514
+ return n.length > 0 && (e = e.filter((e) => n.every(([t, n]) => {
515
+ let r = K.get(t);
516
+ return !r || h(r, e, n, o);
517
+ }))), T.length > 0 && (e = [...e].sort((e, t) => {
518
+ for (let { field: n, direction: r } of T) {
519
+ let i = r === "asc" ? 1 : -1, a = p(e[n], t[n], o) * i;
520
+ if (a !== 0) return a;
521
+ }
522
+ return 0;
523
+ })), e;
524
+ }, [
525
+ i,
526
+ W,
527
+ K,
528
+ k,
529
+ D,
530
+ T,
531
+ o
532
+ ]), Re = t(() => {
533
+ if (!j) return null;
534
+ let e = K.get(j);
535
+ if (!e) return null;
536
+ let t = /* @__PURE__ */ new Map();
537
+ for (let n of q) {
538
+ let r = f(n[j], e.type(), e.format(), o), i = t.get(r);
539
+ i ? i.push(n) : t.set(r, [n]);
540
+ }
541
+ return Array.from(t.entries()).map(([e, t]) => ({
542
+ key: e,
543
+ rows: t,
544
+ aggregates: _(t, Ie)
545
+ }));
546
+ }, [
547
+ q,
548
+ j,
549
+ K,
550
+ Ie,
551
+ o
552
+ ]), ze = t(() => _(q, Ie), [q, Ie]), J = !!S && !j && !w;
553
+ function Y(e) {
554
+ let t = S ? e[S] : void 0;
555
+ return Array.isArray(t) ? t : void 0;
556
+ }
557
+ let Be = t(() => {
558
+ if (!J) return [];
559
+ let e = k.trim().toLowerCase(), t = Object.entries(D).filter(([, e]) => m(e));
560
+ return ee(i, {
561
+ getChildren: Y,
562
+ isExpanded: (e) => Te.has(e),
563
+ match: e || t.length > 0 ? (n) => e && !W.some((t) => {
564
+ let r = K.get(t.field);
565
+ return f(n[t.field], r.type(), r.format(), o).toLowerCase().includes(e);
566
+ }) ? !1 : t.every(([e, t]) => {
567
+ let r = K.get(e);
568
+ return !r || h(r, n, t, o);
569
+ }) : void 0,
570
+ compare: T.length > 0 ? (e, t) => {
571
+ for (let { field: n, direction: r } of T) {
572
+ let i = p(e[n], t[n], o) * (r === "asc" ? 1 : -1);
573
+ if (i !== 0) return i;
574
+ }
575
+ return 0;
576
+ } : void 0
577
+ });
578
+ }, [
579
+ J,
580
+ i,
581
+ S,
582
+ W,
583
+ K,
584
+ k,
585
+ D,
586
+ T,
587
+ Te,
588
+ o
589
+ ]);
590
+ e(() => {
591
+ if (!J || Oe.current === i) return;
592
+ if (Oe.current = i, C === "none") {
593
+ V(/* @__PURE__ */ new Set());
594
+ return;
595
+ }
596
+ let e = /* @__PURE__ */ new Set();
597
+ if (C === "all") for (let t of te(i, Y)) Y(t)?.length && e.add(t);
598
+ else {
599
+ let t = (n, r) => {
600
+ if (!(r >= C)) for (let i of n) {
601
+ let n = Y(i);
602
+ n?.length && (e.add(i), t(n, r + 1));
603
+ }
604
+ };
605
+ t(i, 0);
606
+ }
607
+ V(e);
608
+ }, [
609
+ J,
610
+ i,
611
+ C
612
+ ]);
613
+ function Ve(e) {
614
+ return Te.has(e);
615
+ }
616
+ function He(e) {
617
+ V((t) => {
618
+ let n = new Set(t);
619
+ return n.has(e) ? n.delete(e) : n.add(e), n;
620
+ });
621
+ }
622
+ function Ue(e) {
623
+ if (!e) {
624
+ V(/* @__PURE__ */ new Set());
625
+ return;
626
+ }
627
+ let t = /* @__PURE__ */ new Set();
628
+ for (let e of te(i, Y)) Y(e)?.length && t.add(e);
629
+ V(t);
630
+ }
631
+ let We = w && !j, Ge = c > 0 && !j && !J && !We, Ke = Ge ? Math.max(1, Math.ceil(q.length / c)) : 1, qe = Math.min(A, Ke - 1), Je = t(() => {
632
+ if (J) return Be.map((e) => e.row);
633
+ if (!Ge) return q;
634
+ let e = qe * c;
635
+ return q.slice(e, e + c);
636
+ }, [
637
+ J,
638
+ Be,
639
+ q,
640
+ Ge,
641
+ c,
642
+ qe
643
+ ]), X = j ? q : Je;
644
+ function Ye(e) {
645
+ return M.has(e);
646
+ }
647
+ function Xe(e) {
648
+ fe((t) => {
649
+ let n = new Set(t);
650
+ return n.has(e) ? n.delete(e) : n.add(e), n;
651
+ });
652
+ }
653
+ let Ze = X.length > 0 && X.every((e) => M.has(e)), Qe = !Ze && X.some((e) => M.has(e));
654
+ function $e() {
655
+ let e = !Ze;
656
+ fe((t) => {
657
+ let n = new Set(t);
658
+ for (let t of X) e ? n.add(t) : n.delete(t);
659
+ return n;
660
+ });
661
+ }
662
+ function et() {
663
+ fe(/* @__PURE__ */ new Set());
664
+ }
665
+ function tt(e, t = !1) {
666
+ ue(0), E((n) => {
667
+ let r = n.findIndex((t) => t.field === e);
668
+ if (t) {
669
+ if (r === -1) return [...n, {
670
+ field: e,
671
+ direction: "asc"
672
+ }];
673
+ let t = [...n];
674
+ return t[r] = {
675
+ field: e,
676
+ direction: n[r].direction === "asc" ? "desc" : "asc"
677
+ }, t;
678
+ }
679
+ return n.length === 1 && n[0].field === e ? [{
680
+ field: e,
681
+ direction: n[0].direction === "asc" ? "desc" : "asc"
682
+ }] : [{
683
+ field: e,
684
+ direction: "asc"
685
+ }];
686
+ });
687
+ }
688
+ function nt(e) {
689
+ return T.find((t) => t.field === e)?.direction;
690
+ }
691
+ function rt(e) {
692
+ if (T.length < 2) return;
693
+ let t = T.findIndex((t) => t.field === e);
694
+ return t === -1 ? void 0 : t + 1;
695
+ }
696
+ function it(e) {
697
+ return N === e;
698
+ }
699
+ function at(e) {
700
+ return me ? !0 : N !== void 0 && N !== e;
701
+ }
702
+ function ot(e, t) {
703
+ let n = t.type ?? "string";
704
+ if (n === "boolean") return !!e[t.field];
705
+ if (n === "date") {
706
+ let n = l(e[t.field]);
707
+ if (Number.isNaN(n.getTime())) return "";
708
+ let r = (e) => String(e).padStart(2, "0");
709
+ return `${n.getFullYear()}-${r(n.getMonth() + 1)}-${r(n.getDate())}`;
710
+ }
711
+ let r = e[t.field];
712
+ return r == null ? "" : String(r);
713
+ }
714
+ function st(e) {
715
+ let t = {};
716
+ for (let n of Pe) t[n.field] = ot(e, n);
717
+ pe(e), F(t), L({});
718
+ }
719
+ function Z() {
720
+ pe(void 0), F({}), L({});
721
+ }
722
+ function Q(e, t) {
723
+ F((n) => ({
724
+ ...n,
725
+ [e]: t
726
+ }));
727
+ }
728
+ function ct(e, t, n, r) {
729
+ if (e.required && (t === "" || t == null)) return H("MsgValidationRequired");
730
+ if ((e.type ?? "string") === "number" && typeof n == "number") {
731
+ if (e.min !== void 0 && n < e.min) return H("MsgValidationMin", { min: e.min });
732
+ if (e.max !== void 0 && n > e.max) return H("MsgValidationMax", { max: e.max });
733
+ }
734
+ if (e.pattern && typeof t == "string" && t !== "") {
735
+ let n;
736
+ try {
737
+ n = new RegExp(e.pattern);
738
+ } catch {
739
+ n = void 0;
740
+ }
741
+ if (n && !n.test(t)) return H("MsgValidationPattern");
742
+ }
743
+ return e.validator ? e.validator(n, r) : null;
744
+ }
745
+ function lt(e, t, n = {}) {
746
+ return ct(e, t, t, n);
747
+ }
748
+ async function ut(e) {
749
+ let t = {};
750
+ for (let n of Pe) t[n.field] = v(e[n.field], n.type ?? "string");
751
+ let n = {}, r = {}, i = [];
752
+ for (let a of Pe) {
753
+ let o = a.field, s = ct(a, e[o], t[o], t);
754
+ if (s) {
755
+ n[o] = s;
756
+ continue;
757
+ }
758
+ if (!a.asyncValidator) {
759
+ t[o] !== void 0 && (r[o] = t[o]);
760
+ continue;
761
+ }
762
+ i.push(a.asyncValidator(t[o], t).then((e) => {
763
+ e ? n[o] = e : t[o] !== void 0 && (r[o] = t[o]);
764
+ }));
765
+ }
766
+ if (i.length > 0) {
767
+ _e(!0);
768
+ try {
769
+ await Promise.all(i);
770
+ } finally {
771
+ _e(!1);
772
+ }
773
+ }
774
+ return {
775
+ errors: n,
776
+ values: r
777
+ };
778
+ }
779
+ async function dt(e) {
780
+ if (N !== e) return;
781
+ let { errors: t, values: n } = await ut(P);
782
+ if (N === e) {
783
+ if (Object.keys(t).length > 0) {
784
+ L(t);
785
+ return;
786
+ }
787
+ pe(void 0), F({}), L({}), re?.({
788
+ row: e,
789
+ values: n
790
+ });
791
+ }
792
+ }
793
+ function $(e) {
794
+ (!d || window.confirm(d)) && ie?.(e);
795
+ }
796
+ function ft() {
797
+ if (g && !window.confirm(g)) return;
798
+ let e = Array.from(M);
799
+ et(), b?.(e);
800
+ }
801
+ function pt() {
802
+ he(!0), F({}), L({});
803
+ }
804
+ function mt() {
805
+ he(!1), F({}), L({});
806
+ }
807
+ async function ht() {
808
+ if (!me) return;
809
+ let { errors: e, values: t } = await ut(P);
810
+ if (me) {
811
+ if (Object.keys(e).length > 0) {
812
+ L(e);
813
+ return;
814
+ }
815
+ he(!1), F({}), L({}), y?.(t);
816
+ }
817
+ }
818
+ function gt(e, t) {
819
+ let n = Je[e], r = K.get(t);
820
+ return !n || !r ? "" : f(n[t], r.type(), r.format(), o);
821
+ }
822
+ function _t(e, t, n) {
823
+ let r = W.findIndex((e) => e.field === t);
824
+ if (e === -1 || r === -1) return;
825
+ let i = [];
826
+ n.replace(/\r\n$|\r$|\n$/, "").split(/\r\n|\r|\n/).map((e) => e.split(" ")).forEach((t, n) => {
827
+ let a = Je[e + n];
828
+ a && t.forEach((e, t) => {
829
+ let n = W[r + t];
830
+ n && n.editable && i.push({
831
+ row: a,
832
+ field: n.field,
833
+ value: ne(e, n.type ?? "string")
834
+ });
835
+ });
836
+ }), i.length > 0 && x?.(i);
837
+ }
838
+ function vt(e) {
839
+ return B[e] === void 0 ? U.find((t) => t.field === e)?.width ?? 80 : B[e];
840
+ }
841
+ function yt(e) {
842
+ return B[e] !== void 0;
843
+ }
844
+ function bt(e, t) {
845
+ U.some((t) => t.field === e) && Se((n) => ({
846
+ ...n,
847
+ [e]: Math.max(30, t)
848
+ }));
849
+ }
850
+ function xt(e) {
851
+ we(e);
852
+ }
853
+ function St(e) {
854
+ return Ee.has(e);
855
+ }
856
+ function Ct(e) {
857
+ De((t) => {
858
+ let n = oe ? /* @__PURE__ */ new Set() : new Set(t);
859
+ return t.has(e) ? n.delete(e) : n.add(e), n;
860
+ });
861
+ }
862
+ function wt(e) {
863
+ let t = Ce;
864
+ if (we(void 0), !t || t === e) return;
865
+ let n = [...q], r = n.indexOf(t), i = n.indexOf(e);
866
+ r !== -1 && i !== -1 && (n.splice(r, 1), r < i && i--, n.splice(i, 0, t), ae?.(n));
867
+ }
868
+ function Tt(e) {
869
+ let t = u ? 36 : 0;
870
+ for (let n of W) {
871
+ if (n.field === e) break;
872
+ n.pinned === "left" && (t += vt(n.field));
873
+ }
874
+ return t;
875
+ }
876
+ function Et(e) {
877
+ let t = 0, n = !1;
878
+ for (let r of W) {
879
+ if (r.field === e) {
880
+ n = !0;
881
+ continue;
882
+ }
883
+ n && r.pinned === "right" && (t += vt(r.field));
884
+ }
885
+ return t;
886
+ }
887
+ return {
888
+ visibleColumns: W,
889
+ stickyOffset: Tt,
890
+ stickyOffsetRight: Et,
891
+ hideableColumns: G,
892
+ isColumnHidden: Me,
893
+ toggleColumnVisibility: Ne,
894
+ setColumnOrder: ke,
895
+ draggingField: xe,
896
+ onColumnDragStart: Ae,
897
+ onColumnDrop: je,
898
+ effectiveWidth: vt,
899
+ isColumnResized: yt,
900
+ setColumnWidth: bt,
901
+ draggingRow: Ce,
902
+ onRowDragStart: xt,
903
+ onRowDrop: wt,
904
+ hasTreeData: J,
905
+ treeRows: Be,
906
+ isTreeRowExpanded: Ve,
907
+ toggleTreeRow: He,
908
+ setAllTreeRowsExpanded: Ue,
909
+ isRowExpanded: St,
910
+ toggleRowExpanded: Ct,
911
+ hasVirtualScroll: We,
912
+ visibleRows: Je,
913
+ exportRows: X,
914
+ filteredRowCount: q.length,
915
+ sortCriteria: T,
916
+ setSort: E,
917
+ toggleSort: tt,
918
+ sortDirectionFor: nt,
919
+ sortPriorityFor: rt,
920
+ filterValues: D,
921
+ setFilterValue: Le,
922
+ filterQuery: k,
923
+ setFilterQuery: Fe,
924
+ page: qe,
925
+ setPage: ue,
926
+ pageCount: Ge ? Ke : 1,
927
+ groupByField: j,
928
+ setGroupByField: de,
929
+ groups: Re,
930
+ totals: ze,
931
+ selectedRows: M,
932
+ isRowSelected: Ye,
933
+ toggleRowSelection: Xe,
934
+ allSelected: Ze,
935
+ someSelected: Qe,
936
+ toggleSelectAll: $e,
937
+ clearSelection: et,
938
+ editableColumns: Pe,
939
+ editingRow: N,
940
+ isAddingRow: me,
941
+ rowDraft: P,
942
+ fieldErrors: I,
943
+ isValidating: ge,
944
+ isEditingRow: it,
945
+ isAnotherRowEditing: at,
946
+ startEditingRow: st,
947
+ cancelRowEdit: Z,
948
+ setRowDraftValue: Q,
949
+ saveRow: dt,
950
+ deleteRow: $,
951
+ deleteSelectedRows: ft,
952
+ startAddingRow: pt,
953
+ cancelAddRow: mt,
954
+ saveNewRow: ht,
955
+ validateCell: lt,
956
+ copyCellText: gt,
957
+ pasteAt: _t
958
+ };
959
+ }
960
+ //#endregion
961
+ //#region src/utils/exporters.ts
962
+ function D(e) {
963
+ return e.headerText || e.field;
964
+ }
965
+ function O(e, t, n) {
966
+ return f(t[e.field], e.type ?? "string", e.format ?? "", n);
967
+ }
968
+ function k(e, t, n) {
969
+ return "" + [t.map((e) => re(D(e))).join(","), ...e.map((e) => t.map((t) => re(O(t, e, n))).join(","))].join("\r\n");
970
+ }
971
+ function le(e, t, n, r = "inandu-grid") {
972
+ b(k(e, t, n), `${r}-export.csv`, "text/csv;charset=utf-8;");
973
+ }
974
+ function A(e, t, n) {
975
+ let r = (e, t) => {
976
+ let n = t[e.field];
977
+ return e.type === "number" && typeof n == "number" && Number.isFinite(n) ? n : void 0;
978
+ }, i = (e, t) => {
979
+ let i = r(e, t);
980
+ return i === void 0 ? `<Cell><Data ss:Type="String">${y(O(e, t, n))}</Data></Cell>` : `<Cell><Data ss:Type="Number">${i}</Data></Cell>`;
981
+ }, a = `<Row ss:StyleID="header">${t.map((e) => `<Cell><Data ss:Type="String">${y(D(e))}</Data></Cell>`).join("")}</Row>`, o = e.map((e) => `<Row>${t.map((t) => i(t, e)).join("")}</Row>`).join("");
982
+ return "<?xml version=\"1.0\"?><?mso-application progid=\"Excel.Sheet\"?><Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"><Styles><Style ss:ID=\"header\"><Font ss:Bold=\"1\"/></Style></Styles><Worksheet ss:Name=\"Sheet1\"><Table>" + a + o + "</Table></Worksheet></Workbook>";
983
+ }
984
+ function ue(e, t, n, r = "inandu-grid") {
985
+ b(A(e, t, n), `${r}-export.xls`, "application/vnd.ms-excel");
986
+ }
987
+ function j(e, t, n, r = "inandu-grid") {
988
+ let i = t.map((e) => `<th>${y(D(e))}</th>`).join(""), a = e.map((e) => `<tr>${t.map((t) => `<td>${y(O(t, e, n))}</td>`).join("")}</tr>`).join(""), o = `<!doctype html><html><head><meta charset="utf-8"><title>${y(r)}</title><style>table{border-collapse:collapse;width:100%}th,td{border:1px solid #333;padding:4px 8px;text-align:left}th{background:#eee}</style></head><body><table><thead><tr>${i}</tr></thead><tbody>${a}</tbody></table></body></html>`, s = window.open("", "_blank");
989
+ s && (s.document.write(o), s.document.close(), s.focus(), setTimeout(() => s.print(), 0));
990
+ }
991
+ async function de(e, t, n, r = "inandu-grid") {
992
+ let { jsPDF: i } = await import("./jspdf.es.min-DiTFVZBc.js"), a = t.map(D), o = new i({ orientation: "landscape" }), s = o.internal.pageSize.getWidth() - 20, c = o.internal.pageSize.getHeight() - 10, l = s / (t.length || 1), u = 10, d = (e, t) => {
993
+ o.setFont("helvetica", t ? "bold" : "normal");
994
+ let n = 10;
995
+ e.forEach((e) => {
996
+ o.text(ie(o, e, l - 4), n + 2, u + 6), n += l;
997
+ }), u += 8;
998
+ };
999
+ d(a, !0);
1000
+ for (let r of e) u + 8 > c && (o.addPage(), u = 10, d(a, !0)), d(t.map((e) => O(e, r, n)), !1);
1001
+ b(o.output("blob"), `${r}-export.pdf`);
1002
+ }
1003
+ //#endregion
1004
+ //#region src/utils/measureColumn.ts
1005
+ function M(e, t, n) {
1006
+ let r = typeof CSS < "u" && CSS.escape ? CSS.escape(t) : t.replace(/"/g, "\\\""), i = Array.from(e.querySelectorAll(`td[data-field="${r}"]`)), a = e.querySelector(`th[data-field="${r}"]`), o = i[0] ?? a ?? e, s = getComputedStyle(o), c = document.createElement("span");
1007
+ c.style.cssText = "position:absolute;left:-9999px;top:-9999px;visibility:hidden;white-space:pre;pointer-events:none", c.style.font = s.font || `${s.fontStyle} ${s.fontWeight} ${s.fontSize}/${s.lineHeight} ${s.fontFamily}`, c.style.letterSpacing = s.letterSpacing, document.body.appendChild(c);
1008
+ let l = (parseFloat(s.paddingLeft) || 0) + (parseFloat(s.paddingRight) || 0) + 2, u = 0;
1009
+ c.textContent = n || t, u = Math.max(u, c.offsetWidth + 44);
1010
+ for (let e of i) c.textContent = (e.textContent ?? "").replace(/\s+/g, " ").trim(), u = Math.max(u, c.offsetWidth + l);
1011
+ return c.remove(), i.length || a ? Math.ceil(u) : 0;
1012
+ }
1013
+ //#endregion
1014
+ //#region src/components/InanduGrid.tsx
1015
+ function fe({ rows: s, columns: c, locale: l = "en", lang: u, pageSize: d = 0, selectable: p = !1, onSelectionChange: ee, exportable: te = !1, exportFilenameBase: m = "inandu-grid", deletable: h = !1, deleteConfirmMessage: _, bulkDeleteConfirmMessage: v, creatable: ne = !1, onRowSave: re, onRowCreate: y, onRowDelete: ie, onRowsDelete: b, clipboard: x = !1, onCellsPaste: ae, columnToggle: S = !1, rowReorder: C = !1, onRowOrderChange: oe, treeChildrenKey: w, treeDefaultExpanded: T = "none", renderDetail: ce, singleDetailExpand: D = !1, virtualScroll: O = !1, virtualRowHeight: k = 40, height: A = 400, overscan: fe = 4, autosize: P = !1 }) {
1016
+ let { visibleColumns: I, hideableColumns: L, isColumnHidden: ge, toggleColumnVisibility: _e, onColumnDragStart: R, onColumnDrop: ve, effectiveWidth: ye, isColumnResized: be, setColumnWidth: xe, visibleRows: z, exportRows: B, filteredRowCount: Se, toggleSort: Ce, sortDirectionFor: we, sortPriorityFor: Te, filterValues: V, setFilterValue: Ee, filterQuery: De, setFilterQuery: Oe, page: H, setPage: U, pageCount: W, groupByField: G, setGroupByField: ke, groups: Ae, totals: je, selectedRows: Me, isRowSelected: Ne, toggleRowSelection: Pe, allSelected: Fe, someSelected: K, toggleSelectAll: Ie, editableColumns: Le, isAddingRow: q, rowDraft: Re, fieldErrors: ze, isValidating: J, isEditingRow: Y, isAnotherRowEditing: Be, startEditingRow: Ve, cancelRowEdit: He, setRowDraftValue: Ue, saveRow: We, deleteRow: Ge, deleteSelectedRows: Ke, startAddingRow: qe, cancelAddRow: Je, saveNewRow: X, copyCellText: Ye, pasteAt: Xe, stickyOffset: Ze, stickyOffsetRight: Qe, draggingRow: $e, onRowDragStart: et, onRowDrop: tt, hasTreeData: nt, treeRows: rt, isTreeRowExpanded: it, toggleTreeRow: at, isRowExpanded: ot, toggleRowExpanded: st, hasVirtualScroll: Z } = E({
1017
+ rows: s,
1018
+ columns: c,
1019
+ locale: l,
1020
+ lang: u,
1021
+ pageSize: d,
1022
+ selectable: p,
1023
+ deleteConfirmMessage: _,
1024
+ bulkDeleteConfirmMessage: v,
1025
+ onRowSave: re,
1026
+ onRowCreate: y,
1027
+ onRowDelete: ie,
1028
+ onRowsDelete: b,
1029
+ onCellsPaste: ae,
1030
+ onRowOrderChange: oe,
1031
+ treeChildrenKey: w,
1032
+ treeDefaultExpanded: T,
1033
+ singleDetailExpand: D,
1034
+ virtualScroll: O
1035
+ }), Q = t(() => se(u ?? l), [u, l]), [ct, lt] = r(void 0), [ut, dt] = r(void 0), [$, ft] = r(null), [pt, mt] = r(0), ht = n(null);
1036
+ e(() => {
1037
+ ee?.(Array.from(Me));
1038
+ }, [Me, ee]), e(() => {
1039
+ if (!$) return;
1040
+ let e = (e) => {
1041
+ xe($.field, $.startWidth + (e.clientX - $.startX));
1042
+ }, t = () => ft(null);
1043
+ return window.addEventListener("mousemove", e), window.addEventListener("mouseup", t), () => {
1044
+ window.removeEventListener("mousemove", e), window.removeEventListener("mouseup", t);
1045
+ };
1046
+ }, [$, xe]);
1047
+ function gt(e, t) {
1048
+ e.preventDefault(), ft({
1049
+ field: t,
1050
+ startX: e.clientX,
1051
+ startWidth: ye(t)
1052
+ });
1053
+ }
1054
+ function _t(e, t) {
1055
+ if (!P || !ht.current) return;
1056
+ e.preventDefault(), e.stopPropagation();
1057
+ let n = M(ht.current, t.field, t.headerText ?? t.field);
1058
+ n > 0 && xe(t.field, Math.min(600, n));
1059
+ }
1060
+ let vt = I.filter((e) => e.aggregate), yt = I.filter((e) => e.groupable !== !1), bt = Ae ? Ae.length === 0 : z.length === 0, xt = Le.length > 0 || h || ne, St = C && !G && !Z, Ct = !!ce && !G && !Z, wt = +!!Ct + +!!St + +!!p + +!!xt, Tt = Z ? Math.max(0, Math.floor(pt / k) - fe) : 0, Et = Z ? Math.min(z.length, Math.ceil((pt + A) / k) + fe) : z.length, Dt = Z ? z.slice(Tt, Et) : z, Ot = Tt * k, kt = (z.length - Et) * k;
1061
+ function At(e, t) {
1062
+ Ee(e, {
1063
+ ...V[e],
1064
+ ...t
1065
+ });
1066
+ }
1067
+ function jt(e) {
1068
+ let t = e.width !== void 0 || be(e.field) ? { width: ye(e.field) } : {};
1069
+ return e.pinned === "left" ? {
1070
+ ...t,
1071
+ position: "sticky",
1072
+ left: Ze(e.field),
1073
+ zIndex: 1
1074
+ } : e.pinned === "right" ? {
1075
+ ...t,
1076
+ position: "sticky",
1077
+ right: Qe(e.field),
1078
+ zIndex: 1
1079
+ } : t;
1080
+ }
1081
+ function Mt(e, t) {
1082
+ R(t), e.dataTransfer.setData("text/plain", t);
1083
+ }
1084
+ function Nt(e, t) {
1085
+ e.preventDefault(), lt(t);
1086
+ }
1087
+ function Pt(e, t) {
1088
+ e.preventDefault(), lt(void 0), ve(t);
1089
+ }
1090
+ let Ft = p ? {
1091
+ position: "sticky",
1092
+ left: 0,
1093
+ zIndex: 1
1094
+ } : void 0;
1095
+ function It(e, t) {
1096
+ let n = e.aggregate, r = t[e.field];
1097
+ if (!n || r === void 0) return "";
1098
+ let i = n === "count" ? String(r) : f(r, "number", e.format ?? "", l);
1099
+ return `${e.headerText ?? e.field} ${g[n]}: ${i}`;
1100
+ }
1101
+ function Lt(e) {
1102
+ if (!x || !(e.ctrlKey || e.metaKey)) return;
1103
+ let t = e.key.toLowerCase();
1104
+ if (t !== "c" && t !== "v") return;
1105
+ let n = e.target;
1106
+ if (n instanceof HTMLInputElement || n instanceof HTMLTextAreaElement || n instanceof HTMLSelectElement) return;
1107
+ let r = n.closest("td[data-field]"), i = r?.getAttribute("data-field"), a = r?.closest("tr")?.getAttribute("data-row-index");
1108
+ if (!r || !i || a == null) return;
1109
+ let o = Number(a);
1110
+ e.preventDefault(), t === "c" ? navigator.clipboard?.writeText(Ye(o, i))?.catch(() => void 0) : navigator.clipboard?.readText()?.then((e) => Xe(o, i, e)).catch(() => void 0);
1111
+ }
1112
+ let Rt = {
1113
+ columns: I,
1114
+ locale: l,
1115
+ t: Q,
1116
+ selectable: p,
1117
+ selectColumnStyle: Ft,
1118
+ columnStyle: jt,
1119
+ isRowSelected: Ne,
1120
+ toggleRowSelection: Pe,
1121
+ hasRowActions: xt,
1122
+ editableColumns: Le,
1123
+ isEditingRow: Y,
1124
+ isAnotherRowEditing: Be,
1125
+ startEditingRow: Ve,
1126
+ cancelRowEdit: He,
1127
+ saveRow: We,
1128
+ deleteRow: Ge,
1129
+ deletable: h,
1130
+ rowDraft: Re,
1131
+ fieldErrors: ze,
1132
+ isValidating: J,
1133
+ setRowDraftValue: Ue
1134
+ };
1135
+ return /* @__PURE__ */ o("div", {
1136
+ className: "inandu-grid-react",
1137
+ children: [
1138
+ /* @__PURE__ */ a("div", {
1139
+ className: "inandu-grid-search",
1140
+ children: /* @__PURE__ */ a("input", {
1141
+ "aria-label": Q("MsgFilterPlaceholder"),
1142
+ type: "text",
1143
+ placeholder: `${Q("MsgFilterPlaceholder")}…`,
1144
+ value: De,
1145
+ onChange: (e) => Oe(e.target.value)
1146
+ })
1147
+ }),
1148
+ /* @__PURE__ */ o("div", {
1149
+ className: "inandu-grid-toolbar",
1150
+ children: [
1151
+ te && /* @__PURE__ */ o(i, { children: [
1152
+ /* @__PURE__ */ a("button", {
1153
+ type: "button",
1154
+ onClick: () => le(B, I, l, m),
1155
+ children: Q("MsgExportCsv")
1156
+ }),
1157
+ /* @__PURE__ */ a("button", {
1158
+ type: "button",
1159
+ onClick: () => ue(B, I, l, m),
1160
+ children: Q("MsgExportExcel")
1161
+ }),
1162
+ /* @__PURE__ */ a("button", {
1163
+ type: "button",
1164
+ onClick: () => void de(B, I, l, m),
1165
+ children: Q("MsgExportPdf")
1166
+ }),
1167
+ /* @__PURE__ */ a("button", {
1168
+ type: "button",
1169
+ onClick: () => j(B, I, l, m),
1170
+ children: Q("MsgPrint")
1171
+ })
1172
+ ] }),
1173
+ ne && Le.length > 0 && !q && /* @__PURE__ */ a("button", {
1174
+ type: "button",
1175
+ onClick: qe,
1176
+ children: Q("MsgAddRow")
1177
+ }),
1178
+ p && h && Me.size > 0 && /* @__PURE__ */ a("button", {
1179
+ type: "button",
1180
+ onClick: Ke,
1181
+ children: Q("MsgDeleteSelected", { count: Me.size })
1182
+ }),
1183
+ S && /* @__PURE__ */ o("details", {
1184
+ className: "inandu-grid-column-toggle",
1185
+ children: [/* @__PURE__ */ a("summary", { children: Q("MsgToggleColumns") }), /* @__PURE__ */ a("ul", { children: L.map((e) => /* @__PURE__ */ a("li", { children: /* @__PURE__ */ o("label", { children: [
1186
+ /* @__PURE__ */ a("input", {
1187
+ "aria-label": Q("MsgToggleColumn", { column: e.headerText ?? e.field }),
1188
+ type: "checkbox",
1189
+ checked: !ge(e.field),
1190
+ onChange: () => _e(e.field)
1191
+ }),
1192
+ " ",
1193
+ e.headerText ?? e.field
1194
+ ] }) }, e.field)) })]
1195
+ })
1196
+ ]
1197
+ }),
1198
+ yt.length > 0 && /* @__PURE__ */ a("div", {
1199
+ className: "inandu-grid-group-by",
1200
+ children: /* @__PURE__ */ o("label", { children: [
1201
+ G ? Q("MsgGroupedBy", { column: yt.find((e) => e.field === G)?.headerText ?? G }) : Q("MsgGroupByHint"),
1202
+ " ",
1203
+ /* @__PURE__ */ o("select", {
1204
+ "aria-label": "Group by",
1205
+ value: G ?? "",
1206
+ onChange: (e) => ke(e.target.value || void 0),
1207
+ children: [/* @__PURE__ */ a("option", {
1208
+ value: "",
1209
+ children: Q("MsgCancelGrouping")
1210
+ }), yt.map((e) => /* @__PURE__ */ a("option", {
1211
+ value: e.field,
1212
+ children: e.headerText ?? e.field
1213
+ }, e.field))]
1214
+ })
1215
+ ] })
1216
+ }),
1217
+ /* @__PURE__ */ a("div", {
1218
+ className: Z ? "inandu-grid-viewport" : void 0,
1219
+ style: Z ? {
1220
+ height: A,
1221
+ overflow: "auto"
1222
+ } : void 0,
1223
+ onScroll: Z ? (e) => mt(e.currentTarget.scrollTop) : void 0,
1224
+ children: /* @__PURE__ */ o("table", {
1225
+ ref: ht,
1226
+ className: "inandu-grid",
1227
+ onKeyDown: Lt,
1228
+ children: [
1229
+ /* @__PURE__ */ o("thead", { children: [/* @__PURE__ */ o("tr", { children: [
1230
+ Ct && /* @__PURE__ */ a("th", {}),
1231
+ St && /* @__PURE__ */ a("th", {}),
1232
+ p && /* @__PURE__ */ a("th", {
1233
+ style: Ft,
1234
+ children: /* @__PURE__ */ a("input", {
1235
+ "aria-label": Q("MsgSelectAll"),
1236
+ type: "checkbox",
1237
+ checked: Fe,
1238
+ ref: (e) => {
1239
+ e && (e.indeterminate = K);
1240
+ },
1241
+ onChange: Ie
1242
+ })
1243
+ }),
1244
+ I.map((e) => {
1245
+ let t = we(e.field), n = Te(e.field);
1246
+ return /* @__PURE__ */ o("th", {
1247
+ "data-field": e.field,
1248
+ style: jt(e),
1249
+ className: ct === e.field ? "inandu-drag-over" : void 0,
1250
+ draggable: e.reorder !== !1,
1251
+ onDragStart: (t) => Mt(t, e.field),
1252
+ onDragOver: (t) => Nt(t, e.field),
1253
+ onDragLeave: () => lt((t) => t === e.field ? void 0 : t),
1254
+ onDrop: (t) => Pt(t, e.field),
1255
+ onClick: (t) => Ce(e.field, t.shiftKey),
1256
+ "aria-label": Q("MsgSortBy", { column: e.headerText ?? e.field }),
1257
+ children: [
1258
+ e.headerText ?? e.field,
1259
+ t ? t === "asc" ? " ▲" : " ▼" : "",
1260
+ n !== void 0 && /* @__PURE__ */ a("sup", {
1261
+ className: "inandu-grid-sort-priority",
1262
+ children: n
1263
+ }),
1264
+ /* @__PURE__ */ a("span", {
1265
+ className: "inandu-grid-resize-handle",
1266
+ onMouseDown: (t) => gt(t, e.field),
1267
+ onDoubleClick: (t) => _t(t, e),
1268
+ onClick: (e) => e.stopPropagation(),
1269
+ draggable: !1
1270
+ })
1271
+ ]
1272
+ }, e.field);
1273
+ }),
1274
+ xt && /* @__PURE__ */ a("th", {})
1275
+ ] }), /* @__PURE__ */ o("tr", {
1276
+ className: "inandu-grid-filter-row",
1277
+ children: [
1278
+ Ct && /* @__PURE__ */ a("th", {}),
1279
+ St && /* @__PURE__ */ a("th", {}),
1280
+ p && /* @__PURE__ */ a("th", { style: Ft }),
1281
+ I.map((e) => /* @__PURE__ */ a("th", {
1282
+ style: jt(e),
1283
+ children: /* @__PURE__ */ a(F, {
1284
+ column: e,
1285
+ value: V[e.field],
1286
+ onChange: (t) => At(e.field, t),
1287
+ t: Q
1288
+ })
1289
+ }, e.field)),
1290
+ xt && /* @__PURE__ */ a("th", {})
1291
+ ]
1292
+ })] }),
1293
+ /* @__PURE__ */ o("tbody", { children: [q && /* @__PURE__ */ a(pe, {
1294
+ ...Rt,
1295
+ onSave: () => void X(),
1296
+ onCancel: Je
1297
+ }), bt ? /* @__PURE__ */ a("tr", { children: /* @__PURE__ */ a("td", {
1298
+ colSpan: I.length + wt,
1299
+ children: Q("MsgNoData")
1300
+ }) }) : nt ? rt.map((e, t) => /* @__PURE__ */ a(he, {
1301
+ node: e,
1302
+ rowIndex: t,
1303
+ isTreeRowExpanded: it,
1304
+ toggleTreeRow: at,
1305
+ ...Rt
1306
+ }, e.row.id == null ? t : String(e.row.id))) : Ae ? Ae.map((e) => /* @__PURE__ */ a(me, {
1307
+ group: e,
1308
+ aggregateColumns: vt,
1309
+ aggregateLabel: It,
1310
+ extraColumnCount: wt,
1311
+ ...Rt
1312
+ }, e.key)) : /* @__PURE__ */ o(i, { children: [
1313
+ Z && Ot > 0 && /* @__PURE__ */ a("tr", {
1314
+ "aria-hidden": "true",
1315
+ children: /* @__PURE__ */ a("td", {
1316
+ style: {
1317
+ height: Ot,
1318
+ padding: 0,
1319
+ border: "none"
1320
+ },
1321
+ colSpan: I.length + wt
1322
+ })
1323
+ }),
1324
+ Dt.map((e, t) => {
1325
+ let n = Tt + t;
1326
+ return /* @__PURE__ */ a(N, {
1327
+ row: e,
1328
+ rowIndex: n,
1329
+ clipboard: x,
1330
+ hasRowDragHandle: St,
1331
+ isDragOverRow: $e !== void 0 && ut === e,
1332
+ onRowDragStart: () => et(e),
1333
+ onRowDragOver: () => dt(e),
1334
+ onRowDragLeave: () => dt((t) => t === e ? void 0 : t),
1335
+ onRowDrop: () => tt(e),
1336
+ hasMasterDetail: Ct,
1337
+ isRowExpanded: ot(e),
1338
+ toggleRowExpanded: () => st(e),
1339
+ renderDetail: ce,
1340
+ extraColumnCount: wt,
1341
+ ...Rt
1342
+ }, e.id == null ? n : String(e.id));
1343
+ }),
1344
+ Z && kt > 0 && /* @__PURE__ */ a("tr", {
1345
+ "aria-hidden": "true",
1346
+ children: /* @__PURE__ */ a("td", {
1347
+ style: {
1348
+ height: kt,
1349
+ padding: 0,
1350
+ border: "none"
1351
+ },
1352
+ colSpan: I.length + wt
1353
+ })
1354
+ })
1355
+ ] })] }),
1356
+ vt.length > 0 && !Z && /* @__PURE__ */ a("tfoot", { children: /* @__PURE__ */ o("tr", {
1357
+ className: "inandu-grid-totals-row",
1358
+ children: [
1359
+ Ct && /* @__PURE__ */ a("td", {}),
1360
+ St && /* @__PURE__ */ a("td", {}),
1361
+ p && /* @__PURE__ */ a("td", { style: Ft }),
1362
+ I.map((e) => /* @__PURE__ */ a("td", {
1363
+ style: jt(e),
1364
+ children: e.aggregate ? It(e, je) : ""
1365
+ }, e.field)),
1366
+ xt && /* @__PURE__ */ a("td", {})
1367
+ ]
1368
+ }) })
1369
+ ]
1370
+ })
1371
+ }),
1372
+ d > 0 && !G && !Z && /* @__PURE__ */ o("div", {
1373
+ className: "inandu-grid-pagination",
1374
+ children: [
1375
+ /* @__PURE__ */ o("button", {
1376
+ type: "button",
1377
+ disabled: H === 0,
1378
+ onClick: () => U(H - 1),
1379
+ children: ["‹ ", Q("MsgPreviousPage")]
1380
+ }),
1381
+ /* @__PURE__ */ o("span", { children: [
1382
+ Q("MsgPageOf", {
1383
+ page: H + 1,
1384
+ total: W
1385
+ }),
1386
+ " (",
1387
+ Se,
1388
+ ")"
1389
+ ] }),
1390
+ /* @__PURE__ */ o("button", {
1391
+ type: "button",
1392
+ disabled: H >= W - 1,
1393
+ onClick: () => U(H + 1),
1394
+ children: [Q("MsgNextPage"), " ›"]
1395
+ })
1396
+ ]
1397
+ })
1398
+ ]
1399
+ });
1400
+ }
1401
+ function N({ row: e, rowIndex: t, columns: n, locale: r, t: s, selectable: c, selectColumnStyle: l, columnStyle: u, isRowSelected: d, toggleRowSelection: p, hasRowActions: ee, editableColumns: te, isEditingRow: m, isAnotherRowEditing: h, startEditingRow: g, cancelRowEdit: _, saveRow: v, deleteRow: ne, deletable: re, rowDraft: y, fieldErrors: ie, isValidating: b, setRowDraftValue: x, clipboard: ae = !1, hasRowDragHandle: S = !1, isDragOverRow: C = !1, onRowDragStart: oe, onRowDragOver: w, onRowDragLeave: T, onRowDrop: se, hasMasterDetail: ce = !1, isRowExpanded: E = !1, toggleRowExpanded: D, renderDetail: O, extraColumnCount: k = 0 }) {
1402
+ let le = m(e), A = s(E ? "MsgCollapseDetail" : "MsgExpandDetail");
1403
+ return /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ o("tr", {
1404
+ "data-row-index": ae ? t : void 0,
1405
+ className: C ? "inandu-drag-over" : void 0,
1406
+ onDragOver: S ? (e) => {
1407
+ e.preventDefault(), w?.();
1408
+ } : void 0,
1409
+ onDragLeave: S ? T : void 0,
1410
+ onDrop: S ? (e) => {
1411
+ e.preventDefault(), se?.();
1412
+ } : void 0,
1413
+ children: [
1414
+ ce && /* @__PURE__ */ a("td", { children: /* @__PURE__ */ a("button", {
1415
+ type: "button",
1416
+ className: "inandu-grid-detail-toggle",
1417
+ "aria-label": A,
1418
+ title: A,
1419
+ onClick: D,
1420
+ children: E ? "▾" : "▸"
1421
+ }) }),
1422
+ S && /* @__PURE__ */ a("td", { children: /* @__PURE__ */ a("span", {
1423
+ className: "inandu-grid-row-drag-handle",
1424
+ "aria-label": s("MsgDragRow"),
1425
+ draggable: !0,
1426
+ onDragStart: (e) => {
1427
+ oe?.(), e.dataTransfer.setData("text/plain", "row");
1428
+ },
1429
+ children: "⋮⋮"
1430
+ }) }),
1431
+ c && /* @__PURE__ */ a("td", {
1432
+ style: l,
1433
+ children: /* @__PURE__ */ a("input", {
1434
+ "aria-label": s("MsgSelectRow", { index: t + 1 }),
1435
+ type: "checkbox",
1436
+ checked: d(e),
1437
+ onChange: () => p(e)
1438
+ })
1439
+ }),
1440
+ n.map((t) => /* @__PURE__ */ a("td", {
1441
+ style: u(t),
1442
+ "data-field": t.field,
1443
+ tabIndex: ae ? 0 : void 0,
1444
+ children: le && t.editable ? /* @__PURE__ */ a(P, {
1445
+ column: t,
1446
+ value: y[t.field],
1447
+ error: ie[t.field],
1448
+ onChange: (e) => x(t.field, e),
1449
+ t: s
1450
+ }) : f(e[t.field], t.type ?? "string", t.format ?? "", r)
1451
+ }, t.field)),
1452
+ ee && /* @__PURE__ */ a("td", {
1453
+ className: "inandu-grid-row-actions",
1454
+ children: le ? /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a("button", {
1455
+ type: "button",
1456
+ disabled: b,
1457
+ onClick: () => v(e),
1458
+ children: s("MsgSaveRow")
1459
+ }), /* @__PURE__ */ a("button", {
1460
+ type: "button",
1461
+ disabled: b,
1462
+ onClick: _,
1463
+ children: s("MsgCancelRowEdit")
1464
+ })] }) : /* @__PURE__ */ o(i, { children: [te.length > 0 && /* @__PURE__ */ a("button", {
1465
+ type: "button",
1466
+ disabled: h(e),
1467
+ onClick: () => g(e),
1468
+ children: s("MsgEditRow")
1469
+ }), re && /* @__PURE__ */ a("button", {
1470
+ type: "button",
1471
+ disabled: h(e),
1472
+ onClick: () => ne(e),
1473
+ children: s("MsgDeleteRow")
1474
+ })] })
1475
+ })
1476
+ ]
1477
+ }), ce && E && /* @__PURE__ */ a("tr", {
1478
+ className: "inandu-grid-detail-row",
1479
+ children: /* @__PURE__ */ a("td", {
1480
+ colSpan: n.length + k,
1481
+ children: O?.(e)
1482
+ })
1483
+ })] });
1484
+ }
1485
+ function pe({ columns: e, t, selectable: n, selectColumnStyle: r, columnStyle: i, hasRowActions: s, rowDraft: c, fieldErrors: l, isValidating: u, setRowDraftValue: d, onSave: f, onCancel: p }) {
1486
+ return /* @__PURE__ */ o("tr", {
1487
+ className: "inandu-grid-new-row",
1488
+ children: [
1489
+ n && /* @__PURE__ */ a("td", { style: r }),
1490
+ e.map((e) => /* @__PURE__ */ a("td", {
1491
+ style: i(e),
1492
+ children: e.editable ? /* @__PURE__ */ a(P, {
1493
+ column: e,
1494
+ value: c[e.field],
1495
+ error: l[e.field],
1496
+ onChange: (t) => d(e.field, t),
1497
+ t
1498
+ }) : null
1499
+ }, e.field)),
1500
+ s && /* @__PURE__ */ o("td", {
1501
+ className: "inandu-grid-row-actions",
1502
+ children: [/* @__PURE__ */ a("button", {
1503
+ type: "button",
1504
+ disabled: u,
1505
+ onClick: f,
1506
+ children: t("MsgSaveRow")
1507
+ }), /* @__PURE__ */ a("button", {
1508
+ type: "button",
1509
+ disabled: u,
1510
+ onClick: p,
1511
+ children: t("MsgCancelRowEdit")
1512
+ })]
1513
+ })
1514
+ ]
1515
+ });
1516
+ }
1517
+ function me({ group: e, columns: t, aggregateColumns: n, aggregateLabel: r, extraColumnCount: s, ...c }) {
1518
+ return /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a("tr", {
1519
+ className: "inandu-grid-group-row",
1520
+ children: /* @__PURE__ */ o("td", {
1521
+ colSpan: t.length + s,
1522
+ children: [
1523
+ /* @__PURE__ */ a("strong", { children: e.key }),
1524
+ " (",
1525
+ e.rows.length,
1526
+ ")",
1527
+ n.length > 0 && /* @__PURE__ */ a("span", {
1528
+ className: "inandu-grid-group-aggregates",
1529
+ children: n.map((t) => /* @__PURE__ */ o("span", { children: [" · ", r(t, e.aggregates)] }, t.field))
1530
+ })
1531
+ ]
1532
+ })
1533
+ }), e.rows.map((n, r) => /* @__PURE__ */ a(N, {
1534
+ row: n,
1535
+ rowIndex: r,
1536
+ columns: t,
1537
+ ...c
1538
+ }, n.id == null ? `${e.key}:${r}` : String(n.id)))] });
1539
+ }
1540
+ function he({ node: e, rowIndex: t, columns: n, locale: r, t: i, selectable: s, selectColumnStyle: c, columnStyle: l, isRowSelected: u, toggleRowSelection: d, hasRowActions: p, isTreeRowExpanded: ee, toggleTreeRow: te }) {
1541
+ let { row: m, depth: h, expandable: g } = e, _ = ee(m), v = i(_ ? "MsgCollapseDetail" : "MsgExpandDetail");
1542
+ return /* @__PURE__ */ o("tr", {
1543
+ "aria-level": h + 1,
1544
+ "aria-expanded": g ? _ : void 0,
1545
+ children: [
1546
+ s && /* @__PURE__ */ a("td", {
1547
+ style: c,
1548
+ children: /* @__PURE__ */ a("input", {
1549
+ "aria-label": i("MsgSelectRow", { index: t + 1 }),
1550
+ type: "checkbox",
1551
+ checked: u(m),
1552
+ onChange: () => d(m)
1553
+ })
1554
+ }),
1555
+ n.map((e, t) => /* @__PURE__ */ a("td", {
1556
+ style: l(e),
1557
+ children: t === 0 ? /* @__PURE__ */ o("span", {
1558
+ className: "inandu-grid-tree-cell",
1559
+ style: { paddingInlineStart: h * 16 },
1560
+ children: [g ? /* @__PURE__ */ a("button", {
1561
+ type: "button",
1562
+ className: "inandu-grid-tree-toggle",
1563
+ "aria-label": v,
1564
+ title: v,
1565
+ onClick: () => te(m),
1566
+ children: _ ? "▾" : "▸"
1567
+ }) : /* @__PURE__ */ a("span", {
1568
+ className: "inandu-grid-tree-toggle-spacer",
1569
+ "aria-hidden": "true"
1570
+ }), f(m[e.field], e.type ?? "string", e.format ?? "", r)]
1571
+ }) : f(m[e.field], e.type ?? "string", e.format ?? "", r)
1572
+ }, e.field)),
1573
+ p && /* @__PURE__ */ a("td", { className: "inandu-grid-row-actions" })
1574
+ ]
1575
+ });
1576
+ }
1577
+ function P({ column: e, value: t, error: n, onChange: r, t: i }) {
1578
+ let s = e.type ?? "string", c = i("MsgEditCell", { column: e.headerText ?? e.field });
1579
+ return /* @__PURE__ */ o("span", {
1580
+ className: "inandu-grid-edit-cell",
1581
+ children: [s === "boolean" ? /* @__PURE__ */ a("input", {
1582
+ "aria-label": c,
1583
+ type: "checkbox",
1584
+ checked: !!t,
1585
+ onChange: (e) => r(e.target.checked)
1586
+ }) : s === "date" ? /* @__PURE__ */ a("input", {
1587
+ "aria-label": c,
1588
+ type: "date",
1589
+ value: typeof t == "string" ? t : "",
1590
+ onChange: (e) => r(e.target.value)
1591
+ }) : /* @__PURE__ */ a("input", {
1592
+ "aria-label": c,
1593
+ type: s === "number" ? "number" : "text",
1594
+ value: typeof t == "string" ? t : "",
1595
+ onChange: (e) => r(e.target.value)
1596
+ }), n && /* @__PURE__ */ a("span", {
1597
+ className: "inandu-grid-field-error",
1598
+ children: n
1599
+ })]
1600
+ });
1601
+ }
1602
+ function F({ column: e, value: t, onChange: n, t: r }) {
1603
+ let i = e.type ?? "string", s = r("MsgFilterColumn", { column: e.headerText ?? e.field });
1604
+ return i === "number" ? /* @__PURE__ */ o("span", {
1605
+ className: "inandu-grid-filter-range",
1606
+ children: [/* @__PURE__ */ a("input", {
1607
+ "aria-label": `${s} ${r("MsgFilterMin")}`,
1608
+ type: "number",
1609
+ value: t?.min ?? "",
1610
+ onChange: (e) => n({ min: e.target.value })
1611
+ }), /* @__PURE__ */ a("input", {
1612
+ "aria-label": `${s} ${r("MsgFilterMax")}`,
1613
+ type: "number",
1614
+ value: t?.max ?? "",
1615
+ onChange: (e) => n({ max: e.target.value })
1616
+ })]
1617
+ }) : i === "date" ? /* @__PURE__ */ o("span", {
1618
+ className: "inandu-grid-filter-range",
1619
+ children: [/* @__PURE__ */ a("input", {
1620
+ "aria-label": `${s} ${r("MsgFilterFrom")}`,
1621
+ type: "date",
1622
+ value: t?.from ?? "",
1623
+ onChange: (e) => n({ from: e.target.value })
1624
+ }), /* @__PURE__ */ a("input", {
1625
+ "aria-label": `${s} ${r("MsgFilterTo")}`,
1626
+ type: "date",
1627
+ value: t?.to ?? "",
1628
+ onChange: (e) => n({ to: e.target.value })
1629
+ })]
1630
+ }) : i === "boolean" ? /* @__PURE__ */ o("select", {
1631
+ "aria-label": s,
1632
+ value: t?.bool ?? "",
1633
+ onChange: (e) => n({ bool: e.target.value }),
1634
+ children: [
1635
+ /* @__PURE__ */ a("option", {
1636
+ value: "",
1637
+ children: r("MsgAll")
1638
+ }),
1639
+ /* @__PURE__ */ a("option", {
1640
+ value: "true",
1641
+ children: "true"
1642
+ }),
1643
+ /* @__PURE__ */ a("option", {
1644
+ value: "false",
1645
+ children: "false"
1646
+ })
1647
+ ]
1648
+ }) : /* @__PURE__ */ a("input", {
1649
+ "aria-label": s,
1650
+ type: "text",
1651
+ value: t?.text ?? "",
1652
+ onChange: (e) => n({ text: e.target.value })
1653
+ });
1654
+ }
1655
+ //#endregion
1656
+ export { g as AGGREGATE_SYMBOLS, w as INANDU_GRID_TRANSLATIONS, fe as InanduGrid, k as buildCsv, A as buildExcelXml, p as compareCellValues, _ as computeGroupAggregates, se as createTranslator, x as en, ae as es, le as exportCsv, ue as exportExcel, de as exportPdf, f as formatCellValue, S as fr, T as interpolate, C as it, h as matchesColumnFilter, M as measureColumnContentWidth, j as printTable, E as useInanduGrid, oe as zh };