@optimum-intelligence/opti-ui 0.2.0 → 0.3.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 (34) hide show
  1. package/README.md +86 -3
  2. package/dist/components/card/Card.d.ts +1 -1
  3. package/dist/components/card/Card.js.map +1 -1
  4. package/dist/components/data-table/DataTable.d.ts +58 -96
  5. package/dist/components/data-table/DataTable.js +452 -418
  6. package/dist/components/data-table/DataTable.js.map +1 -1
  7. package/dist/components/data-table/DataTableContent.d.ts +35 -0
  8. package/dist/components/data-table/DataTableContent.js +550 -0
  9. package/dist/components/data-table/DataTableContent.js.map +1 -0
  10. package/dist/components/data-table/DataTableFilters.d.ts +15 -0
  11. package/dist/components/data-table/DataTableFilters.js +284 -0
  12. package/dist/components/data-table/DataTableFilters.js.map +1 -0
  13. package/dist/components/data-table/DataTableRow.d.ts +33 -0
  14. package/dist/components/data-table/DataTableRow.js +552 -0
  15. package/dist/components/data-table/DataTableRow.js.map +1 -0
  16. package/dist/components/data-table/context.d.ts +5 -0
  17. package/dist/components/data-table/context.js +14 -0
  18. package/dist/components/data-table/context.js.map +1 -0
  19. package/dist/components/data-table/layout.d.ts +60 -0
  20. package/dist/components/data-table/layout.js +272 -0
  21. package/dist/components/data-table/layout.js.map +1 -0
  22. package/dist/components/data-table/types.d.ts +319 -0
  23. package/dist/components/data-table/useDataTable.d.ts +9 -0
  24. package/dist/components/data-table/useDataTable.js +666 -0
  25. package/dist/components/data-table/useDataTable.js.map +1 -0
  26. package/dist/components/stat-card/StatCard.d.ts +1 -1
  27. package/dist/components/stat-card/StatCard.js.map +1 -1
  28. package/dist/icons/index.d.ts +8 -0
  29. package/dist/icons/index.js +9 -1
  30. package/dist/icons/index.js.map +1 -1
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.js +4 -2
  33. package/dist/opti-ui.css +494 -167
  34. package/package.json +1 -1
@@ -0,0 +1,552 @@
1
+ "use client";
2
+ import { CheckIcon, PencilIcon, TrashIcon, XIcon } from "../../icons/index.js";
3
+ import { IconButton } from "../button/Button.js";
4
+ import { Input } from "../input/Input.js";
5
+ import { Select } from "../select/Select.js";
6
+ import { Checkbox } from "../choice/Choice.js";
7
+ import { Tooltip } from "../tooltip/Tooltip.js";
8
+ import { TableCell, TableRow } from "../table/Table.js";
9
+ import { getColumnValue } from "./useDataTable.js";
10
+ import { c } from "react/compiler-runtime";
11
+ import * as React from "react";
12
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
+ //#region src/components/data-table/DataTableRow.tsx
14
+ var INTERACTIVE = "a, button, input, select, textarea, label, [role=\"checkbox\"], [role=\"button\"], [role=\"combobox\"]";
15
+ function isEmpty(value) {
16
+ return value === null || value === void 0 || value === "";
17
+ }
18
+ function labelOf(column) {
19
+ return column.label ?? (typeof column.header === "string" ? column.header : column.id);
20
+ }
21
+ function editOf(column) {
22
+ if (!column.edit) return null;
23
+ const config = typeof column.edit === "string" ? { type: column.edit } : column.edit;
24
+ return {
25
+ ...config,
26
+ field: config.field ?? column.id
27
+ };
28
+ }
29
+ /** Whether the column's editor is the built-in text input, which takes the focus when editing starts. */
30
+ function isTextEditor(column) {
31
+ const edit = editOf(column);
32
+ return edit !== null && !edit.render && (edit.type ?? "text") === "text";
33
+ }
34
+ function isAction(item) {
35
+ return typeof item === "object" && item !== null && !React.isValidElement(item) && "label" in item && "icon" in item;
36
+ }
37
+ /** What a cell shows outside editing: the column's `cell`, or its value as text. */
38
+ function cellContent(column, row) {
39
+ if (column.cell) return column.cell(row);
40
+ const value = getColumnValue(column, row);
41
+ if (React.isValidElement(value)) return value;
42
+ return isEmpty(value) ? "—" : String(value);
43
+ }
44
+ function ActionButton(t0) {
45
+ const $ = c(13);
46
+ let danger;
47
+ let icon;
48
+ let label;
49
+ let props;
50
+ if ($[0] !== t0) {
51
+ ({label, icon, danger, ...props} = t0);
52
+ $[0] = t0;
53
+ $[1] = danger;
54
+ $[2] = icon;
55
+ $[3] = label;
56
+ $[4] = props;
57
+ } else {
58
+ danger = $[1];
59
+ icon = $[2];
60
+ label = $[3];
61
+ props = $[4];
62
+ }
63
+ const t1 = danger ? "" : void 0;
64
+ let t2;
65
+ if ($[5] !== icon || $[6] !== label || $[7] !== props || $[8] !== t1) {
66
+ t2 = /* @__PURE__ */ jsx(IconButton, {
67
+ size: "sm",
68
+ className: "oui-data-table__action",
69
+ "aria-label": label,
70
+ "data-danger": t1,
71
+ ...props,
72
+ children: icon
73
+ });
74
+ $[5] = icon;
75
+ $[6] = label;
76
+ $[7] = props;
77
+ $[8] = t1;
78
+ $[9] = t2;
79
+ } else t2 = $[9];
80
+ let t3;
81
+ if ($[10] !== label || $[11] !== t2) {
82
+ t3 = /* @__PURE__ */ jsx(Tooltip, {
83
+ content: label,
84
+ children: t2
85
+ });
86
+ $[10] = label;
87
+ $[11] = t2;
88
+ $[12] = t3;
89
+ } else t3 = $[12];
90
+ return t3;
91
+ }
92
+ function Editor(t0) {
93
+ const $ = c(16);
94
+ const { table, column, edit, row, autoFocus } = t0;
95
+ let t1;
96
+ let t2;
97
+ if ($[0] !== autoFocus || $[1] !== column || $[2] !== edit || $[3] !== row || $[4] !== table) {
98
+ t2 = Symbol.for("react.early_return_sentinel");
99
+ bb0: {
100
+ const value = table.editValue(row, edit.field);
101
+ let t3;
102
+ if ($[7] !== edit.field || $[8] !== table) {
103
+ t3 = (next) => table.setEditValue(edit.field, next);
104
+ $[7] = edit.field;
105
+ $[8] = table;
106
+ $[9] = t3;
107
+ } else t3 = $[9];
108
+ const setValue = t3;
109
+ const disabled = table.saving;
110
+ let t4;
111
+ if ($[10] !== column) {
112
+ t4 = labelOf(column);
113
+ $[10] = column;
114
+ $[11] = t4;
115
+ } else t4 = $[11];
116
+ const label = t4;
117
+ if (edit.render) {
118
+ t2 = edit.render({
119
+ row,
120
+ value,
121
+ setValue,
122
+ disabled
123
+ });
124
+ break bb0;
125
+ }
126
+ if (edit.type === "checkbox") {
127
+ t2 = /* @__PURE__ */ jsx(Checkbox, {
128
+ size: "sm",
129
+ "aria-label": label,
130
+ checked: Boolean(value),
131
+ disabled,
132
+ onCheckedChange: setValue
133
+ });
134
+ break bb0;
135
+ }
136
+ if (edit.type === "select") {
137
+ let t5;
138
+ if ($[12] !== edit.options) {
139
+ t5 = edit.options ?? [];
140
+ $[12] = edit.options;
141
+ $[13] = t5;
142
+ } else t5 = $[13];
143
+ let t6;
144
+ if ($[14] !== label) {
145
+ t6 = { "aria-label": label };
146
+ $[14] = label;
147
+ $[15] = t6;
148
+ } else t6 = $[15];
149
+ t2 = /* @__PURE__ */ jsx(Select, {
150
+ size: "sm",
151
+ items: t5,
152
+ value: isEmpty(value) ? null : String(value),
153
+ onValueChange: setValue,
154
+ disabled,
155
+ triggerProps: t6
156
+ });
157
+ break bb0;
158
+ }
159
+ t1 = /* @__PURE__ */ jsx(Input, {
160
+ size: "sm",
161
+ "aria-label": label,
162
+ autoFocus,
163
+ disabled,
164
+ ...edit.inputProps,
165
+ value: isEmpty(value) ? "" : String(value),
166
+ onValueChange: setValue
167
+ });
168
+ }
169
+ $[0] = autoFocus;
170
+ $[1] = column;
171
+ $[2] = edit;
172
+ $[3] = row;
173
+ $[4] = table;
174
+ $[5] = t1;
175
+ $[6] = t2;
176
+ } else {
177
+ t1 = $[5];
178
+ t2 = $[6];
179
+ }
180
+ if (t2 !== Symbol.for("react.early_return_sentinel")) return t2;
181
+ return t1;
182
+ }
183
+ /** Trailing cell of a row: its own actions, then edit and delete; save and cancel while it is edited. */
184
+ function RowActions(t0) {
185
+ const $ = c(21);
186
+ const { table, entry: t1, onEdit } = t0;
187
+ const { row, id } = t1;
188
+ const text = table.labels;
189
+ const editing = table.editingId === id;
190
+ let T0;
191
+ let t2;
192
+ let t3;
193
+ let t4;
194
+ let t5;
195
+ if ($[0] !== editing || $[1] !== id || $[2] !== onEdit || $[3] !== row || $[4] !== table || $[5] !== text) {
196
+ const actions = table.rowActions?.(row);
197
+ const slots = table.editable ? table.deletable ? 3 : 2 : 0;
198
+ T0 = TableCell;
199
+ t5 = "oui-data-table__row-actions";
200
+ t2 = "oui-data-table__row-actions-list";
201
+ if ($[11] !== slots) {
202
+ t3 = slots ? { minWidth: `calc(${slots} * var(--oui-control-height-sm) + ${(slots - 1) * .125}rem)` } : void 0;
203
+ $[11] = slots;
204
+ $[12] = t3;
205
+ } else t3 = $[12];
206
+ t4 = editing ? /* @__PURE__ */ jsxs(Fragment, { children: [
207
+ /* @__PURE__ */ jsx(ActionButton, {
208
+ label: text.save,
209
+ icon: /* @__PURE__ */ jsx(CheckIcon, {}),
210
+ loading: table.saving,
211
+ onClick: table.saveEdit
212
+ }),
213
+ table.deletable && /* @__PURE__ */ jsx(ActionButton, {
214
+ label: text.delete,
215
+ icon: /* @__PURE__ */ jsx(TrashIcon, {}),
216
+ danger: true,
217
+ disabled: table.saving,
218
+ onClick: () => table.deleteRow(row)
219
+ }),
220
+ /* @__PURE__ */ jsx(ActionButton, {
221
+ label: text.cancel,
222
+ icon: /* @__PURE__ */ jsx(XIcon, {}),
223
+ disabled: table.saving,
224
+ onClick: table.cancelEdit
225
+ })
226
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
227
+ (Array.isArray(actions) ? actions : [actions]).map(_temp),
228
+ table.editable && /* @__PURE__ */ jsx(ActionButton, {
229
+ label: text.edit,
230
+ icon: /* @__PURE__ */ jsx(PencilIcon, {}),
231
+ disabled: table.saving,
232
+ onClick: (event) => {
233
+ onEdit?.(event.currentTarget);
234
+ table.startEdit(id);
235
+ }
236
+ }),
237
+ table.deletable && !table.editable && /* @__PURE__ */ jsx(ActionButton, {
238
+ label: text.delete,
239
+ icon: /* @__PURE__ */ jsx(TrashIcon, {}),
240
+ danger: true,
241
+ onClick: () => table.deleteRow(row)
242
+ })
243
+ ] });
244
+ $[0] = editing;
245
+ $[1] = id;
246
+ $[2] = onEdit;
247
+ $[3] = row;
248
+ $[4] = table;
249
+ $[5] = text;
250
+ $[6] = T0;
251
+ $[7] = t2;
252
+ $[8] = t3;
253
+ $[9] = t4;
254
+ $[10] = t5;
255
+ } else {
256
+ T0 = $[6];
257
+ t2 = $[7];
258
+ t3 = $[8];
259
+ t4 = $[9];
260
+ t5 = $[10];
261
+ }
262
+ let t6;
263
+ if ($[13] !== t2 || $[14] !== t3 || $[15] !== t4) {
264
+ t6 = /* @__PURE__ */ jsx("div", {
265
+ className: t2,
266
+ style: t3,
267
+ children: t4
268
+ });
269
+ $[13] = t2;
270
+ $[14] = t3;
271
+ $[15] = t4;
272
+ $[16] = t6;
273
+ } else t6 = $[16];
274
+ let t7;
275
+ if ($[17] !== T0 || $[18] !== t5 || $[19] !== t6) {
276
+ t7 = /* @__PURE__ */ jsx(T0, {
277
+ className: t5,
278
+ children: t6
279
+ });
280
+ $[17] = T0;
281
+ $[18] = t5;
282
+ $[19] = t6;
283
+ $[20] = t7;
284
+ } else t7 = $[20];
285
+ return t7;
286
+ }
287
+ function _temp(item, index) {
288
+ return isAction(item) ? /* @__PURE__ */ jsx(ActionButton, {
289
+ label: item.label,
290
+ icon: item.icon,
291
+ danger: item.danger,
292
+ disabled: item.disabled,
293
+ onClick: item.onClick
294
+ }, item.label) : /* @__PURE__ */ jsx(React.Fragment, { children: item }, index);
295
+ }
296
+ function Row(t0) {
297
+ const $ = c(63);
298
+ const { table, entry, columns, hasActions, focused, index, height } = t0;
299
+ const { row, id } = entry;
300
+ const editing = table.editingId === id;
301
+ const virtual = index !== void 0;
302
+ const [editHeight, setEditHeight] = React.useState();
303
+ const onRowClick = editing ? void 0 : table.onRowClick;
304
+ let t1;
305
+ if ($[0] !== row || $[1] !== table) {
306
+ t1 = table.rowProps?.(row);
307
+ $[0] = row;
308
+ $[1] = table;
309
+ $[2] = t1;
310
+ } else t1 = $[2];
311
+ const extra = t1;
312
+ const held = height ?? (editing ? editHeight : void 0);
313
+ let t2;
314
+ if ($[3] !== extra?.style || $[4] !== held) {
315
+ t2 = held !== void 0 ? {
316
+ height: held,
317
+ ...extra?.style
318
+ } : extra?.style;
319
+ $[3] = extra?.style;
320
+ $[4] = held;
321
+ $[5] = t2;
322
+ } else t2 = $[5];
323
+ const t3 = virtual ? index + 2 : void 0;
324
+ let t4;
325
+ if ($[6] !== id || $[7] !== table) {
326
+ t4 = table.isSelected(id) || void 0;
327
+ $[6] = id;
328
+ $[7] = table;
329
+ $[8] = t4;
330
+ } else t4 = $[8];
331
+ const t5 = onRowClick ? "" : void 0;
332
+ const t6 = editing ? "" : void 0;
333
+ let t7;
334
+ if ($[9] !== row || $[10] !== table) {
335
+ t7 = table.rowTone?.(row) ?? void 0;
336
+ $[9] = row;
337
+ $[10] = table;
338
+ $[11] = t7;
339
+ } else t7 = $[11];
340
+ const t8 = onRowClick ? 0 : extra?.tabIndex;
341
+ let t9;
342
+ if ($[12] !== extra || $[13] !== onRowClick || $[14] !== row || $[15] !== table) {
343
+ t9 = onRowClick ? table.rowLabel?.(row) : extra?.["aria-label"];
344
+ $[12] = extra;
345
+ $[13] = onRowClick;
346
+ $[14] = row;
347
+ $[15] = table;
348
+ $[16] = t9;
349
+ } else t9 = $[16];
350
+ let t10;
351
+ if ($[17] !== extra || $[18] !== onRowClick || $[19] !== row) {
352
+ t10 = (event) => {
353
+ extra?.onClick?.(event);
354
+ if (!onRowClick || event.ctrlKey || event.metaKey) return;
355
+ if (event.target.closest(INTERACTIVE)) return;
356
+ onRowClick(row);
357
+ };
358
+ $[17] = extra;
359
+ $[18] = onRowClick;
360
+ $[19] = row;
361
+ $[20] = t10;
362
+ } else t10 = $[20];
363
+ let t11;
364
+ if ($[21] !== editing || $[22] !== extra || $[23] !== onRowClick || $[24] !== row || $[25] !== table) {
365
+ t11 = (event_0) => {
366
+ extra?.onKeyDown?.(event_0);
367
+ if (onRowClick && event_0.target === event_0.currentTarget && event_0.key === "Enter") onRowClick(row);
368
+ if (!editing || !event_0.currentTarget.contains(event_0.target)) return;
369
+ if (event_0.key === "Escape") table.cancelEdit();
370
+ if (event_0.key === "Enter" && event_0.target.tagName === "INPUT") table.saveEdit();
371
+ };
372
+ $[21] = editing;
373
+ $[22] = extra;
374
+ $[23] = onRowClick;
375
+ $[24] = row;
376
+ $[25] = table;
377
+ $[26] = t11;
378
+ } else t11 = $[26];
379
+ let t12;
380
+ if ($[27] !== id || $[28] !== row || $[29] !== table) {
381
+ t12 = table.selectable && /* @__PURE__ */ jsx(TableCell, {
382
+ className: "oui-data-table__check",
383
+ children: /* @__PURE__ */ jsx(Checkbox, {
384
+ size: "sm",
385
+ "aria-label": table.labels.selectRow(table.rowLabel?.(row) ?? id),
386
+ checked: table.isSelected(id),
387
+ onCheckedChange: (checked) => table.toggleRow(id, checked)
388
+ })
389
+ });
390
+ $[27] = id;
391
+ $[28] = row;
392
+ $[29] = table;
393
+ $[30] = t12;
394
+ } else t12 = $[30];
395
+ let t13;
396
+ if ($[31] !== columns || $[32] !== editing || $[33] !== focused || $[34] !== row || $[35] !== table || $[36] !== virtual) {
397
+ let t14;
398
+ if ($[38] !== editing || $[39] !== focused || $[40] !== row || $[41] !== table || $[42] !== virtual) {
399
+ t14 = (column) => {
400
+ const edit = editing ? editOf(column) : null;
401
+ const className = typeof column.cellClassName === "function" ? column.cellClassName(row) : column.cellClassName;
402
+ const value = getColumnValue(column, row);
403
+ const title = (column.truncate || virtual) && !edit && (typeof value === "string" || typeof value === "number");
404
+ return /* @__PURE__ */ jsx(TableCell, {
405
+ align: column.align,
406
+ numeric: column.numeric,
407
+ className,
408
+ title: title ? String(value) : void 0,
409
+ "data-mono": column.mono || void 0,
410
+ "data-muted": column.muted || void 0,
411
+ "data-truncate": column.truncate && !edit || void 0,
412
+ "data-editor": edit ? "" : void 0,
413
+ children: edit ? /* @__PURE__ */ jsx(Editor, {
414
+ table,
415
+ column,
416
+ edit,
417
+ row,
418
+ autoFocus: column.id === focused
419
+ }) : cellContent(column, row)
420
+ }, column.id);
421
+ };
422
+ $[38] = editing;
423
+ $[39] = focused;
424
+ $[40] = row;
425
+ $[41] = table;
426
+ $[42] = virtual;
427
+ $[43] = t14;
428
+ } else t14 = $[43];
429
+ t13 = columns.map(t14);
430
+ $[31] = columns;
431
+ $[32] = editing;
432
+ $[33] = focused;
433
+ $[34] = row;
434
+ $[35] = table;
435
+ $[36] = virtual;
436
+ $[37] = t13;
437
+ } else t13 = $[37];
438
+ let t14;
439
+ if ($[44] !== entry || $[45] !== hasActions || $[46] !== table) {
440
+ t14 = hasActions && /* @__PURE__ */ jsx(RowActions, {
441
+ table,
442
+ entry,
443
+ onEdit: (button) => setEditHeight(button.closest("tr")?.getBoundingClientRect().height)
444
+ });
445
+ $[44] = entry;
446
+ $[45] = hasActions;
447
+ $[46] = table;
448
+ $[47] = t14;
449
+ } else t14 = $[47];
450
+ let t15;
451
+ if ($[48] !== extra || $[49] !== t10 || $[50] !== t11 || $[51] !== t12 || $[52] !== t13 || $[53] !== t14 || $[54] !== t2 || $[55] !== t3 || $[56] !== t4 || $[57] !== t5 || $[58] !== t6 || $[59] !== t7 || $[60] !== t8 || $[61] !== t9) {
452
+ t15 = /* @__PURE__ */ jsxs(TableRow, {
453
+ ...extra,
454
+ style: t2,
455
+ "aria-rowindex": t3,
456
+ "data-selected": t4,
457
+ "data-clickable": t5,
458
+ "data-editing": t6,
459
+ "data-tone": t7,
460
+ tabIndex: t8,
461
+ "aria-label": t9,
462
+ onClick: t10,
463
+ onKeyDown: t11,
464
+ children: [
465
+ t12,
466
+ t13,
467
+ t14
468
+ ]
469
+ });
470
+ $[48] = extra;
471
+ $[49] = t10;
472
+ $[50] = t11;
473
+ $[51] = t12;
474
+ $[52] = t13;
475
+ $[53] = t14;
476
+ $[54] = t2;
477
+ $[55] = t3;
478
+ $[56] = t4;
479
+ $[57] = t5;
480
+ $[58] = t6;
481
+ $[59] = t7;
482
+ $[60] = t8;
483
+ $[61] = t9;
484
+ $[62] = t15;
485
+ } else t15 = $[62];
486
+ return t15;
487
+ }
488
+ var DataTableRow = React.memo(Row);
489
+ /**
490
+ * A row that only gives its columns their width: what the cells would show, at
491
+ * no height. Rendered while the column widths are measured, never painted.
492
+ */
493
+ function SizerRow(t0) {
494
+ const $ = c(15);
495
+ const { table, entry, columns, hasActions } = t0;
496
+ let t1;
497
+ if ($[0] !== table.selectable) {
498
+ t1 = table.selectable && /* @__PURE__ */ jsx(TableCell, { className: "oui-data-table__check" });
499
+ $[0] = table.selectable;
500
+ $[1] = t1;
501
+ } else t1 = $[1];
502
+ let t2;
503
+ if ($[2] !== columns || $[3] !== entry) {
504
+ let t3;
505
+ if ($[5] !== entry) {
506
+ t3 = (column) => /* @__PURE__ */ jsx(TableCell, {
507
+ align: column.align,
508
+ numeric: column.numeric,
509
+ "data-mono": column.mono || void 0,
510
+ "data-truncate": column.truncate || void 0,
511
+ children: !column.truncate && /* @__PURE__ */ jsx("div", {
512
+ className: "oui-data-table__sizer-content",
513
+ children: cellContent(column, entry.row)
514
+ })
515
+ }, column.id);
516
+ $[5] = entry;
517
+ $[6] = t3;
518
+ } else t3 = $[6];
519
+ t2 = columns.map(t3);
520
+ $[2] = columns;
521
+ $[3] = entry;
522
+ $[4] = t2;
523
+ } else t2 = $[4];
524
+ let t3;
525
+ if ($[7] !== entry || $[8] !== hasActions || $[9] !== table) {
526
+ t3 = hasActions && /* @__PURE__ */ jsx(RowActions, {
527
+ table,
528
+ entry
529
+ });
530
+ $[7] = entry;
531
+ $[8] = hasActions;
532
+ $[9] = table;
533
+ $[10] = t3;
534
+ } else t3 = $[10];
535
+ let t4;
536
+ if ($[11] !== t1 || $[12] !== t2 || $[13] !== t3) {
537
+ t4 = /* @__PURE__ */ jsxs(TableRow, { children: [
538
+ t1,
539
+ t2,
540
+ t3
541
+ ] });
542
+ $[11] = t1;
543
+ $[12] = t2;
544
+ $[13] = t3;
545
+ $[14] = t4;
546
+ } else t4 = $[14];
547
+ return t4;
548
+ }
549
+ //#endregion
550
+ export { DataTableRow, RowActions, SizerRow, cellContent, isTextEditor };
551
+
552
+ //# sourceMappingURL=DataTableRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableRow.js","names":["React","CheckIcon","PencilIcon","TrashIcon","XIcon","IconButton","IconButtonProps","Checkbox","Input","Select","TableCell","TableRow","Tooltip","getColumnValue","DataTableColumn","DataTableColumnEdit","DataTableEntry","DataTableInstance","DataTableRowAction","INTERACTIVE","isEmpty","value","undefined","labelOf","column","T","label","header","id","ResolvedEdit","Omit","field","editOf","edit","config","type","isTextEditor","render","isAction","item","isValidElement","cellContent","row","ReactNode","cell","String","ActionButtonProps","icon","danger","ActionButton","t0","$","_c","props","t1","t2","t3","EditorProps","table","autoFocus","Editor","Symbol","for","bb0","editValue","next","setEditValue","setValue","disabled","saving","t4","Boolean","t5","options","t6","inputProps","RowActionsProps","entry","onEdit","button","HTMLElement","RowActions","text","labels","editing","editingId","T0","actions","rowActions","slots","editable","deletable","minWidth","save","saveEdit","delete","deleteRow","cancel","cancelEdit","Array","isArray","map","_temp","event","currentTarget","startEdit","t7","index","onClick","DataTableRowProps","columns","hasActions","focused","height","Row","virtual","editHeight","setEditHeight","useState","onRowClick","rowProps","extra","held","style","isSelected","rowTone","t8","tabIndex","t9","rowLabel","t10","ctrlKey","metaKey","target","closest","t11","event_0","onKeyDown","key","contains","Node","tagName","t12","selectable","selectRow","checked","toggleRow","t13","t14","className","cellClassName","title","truncate","align","numeric","mono","muted","getBoundingClientRect","t15","DataTableRow","memo","SizerRow","_c","_Fragment"],"sources":["../../../src/components/data-table/DataTableRow.tsx"],"sourcesContent":["import * as React from 'react';\nimport { CheckIcon, PencilIcon, TrashIcon, XIcon } from '../../icons';\nimport { IconButton, type IconButtonProps } from '../button/Button';\nimport { Checkbox } from '../choice/Choice';\nimport { Input } from '../input/Input';\nimport { Select } from '../select/Select';\nimport { TableCell, TableRow } from '../table/Table';\nimport { Tooltip } from '../tooltip/Tooltip';\nimport { getColumnValue } from './useDataTable';\nimport type { DataTableColumn, DataTableColumnEdit, DataTableEntry, DataTableInstance, DataTableRowAction } from './types';\n\nconst INTERACTIVE = 'a, button, input, select, textarea, label, [role=\"checkbox\"], [role=\"button\"], [role=\"combobox\"]';\n\nfunction isEmpty(value: unknown) {\n return value === null || value === undefined || value === '';\n}\n\nfunction labelOf<T>(column: DataTableColumn<T>) {\n return column.label ?? (typeof column.header === 'string' ? column.header : column.id);\n}\n\ntype ResolvedEdit<T> = Omit<DataTableColumnEdit<T>, 'field'> & { field: string };\n\nfunction editOf<T>(column: DataTableColumn<T>): ResolvedEdit<T> | null {\n if (!column.edit) return null;\n const config = typeof column.edit === 'string' ? { type: column.edit } : column.edit;\n return { ...config, field: config.field ?? column.id };\n}\n\n/** Whether the column's editor is the built-in text input, which takes the focus when editing starts. */\nexport function isTextEditor<T>(column: DataTableColumn<T>) {\n const edit = editOf(column);\n return edit !== null && !edit.render && (edit.type ?? 'text') === 'text';\n}\n\nfunction isAction(item: unknown): item is DataTableRowAction {\n return typeof item === 'object' && item !== null && !React.isValidElement(item) && 'label' in item && 'icon' in item;\n}\n\n/** What a cell shows outside editing: the column's `cell`, or its value as text. */\nexport function cellContent<T>(column: DataTableColumn<T>, row: T): React.ReactNode {\n if (column.cell) return column.cell(row);\n const value = getColumnValue(column, row);\n if (React.isValidElement(value)) return value;\n return isEmpty(value) ? '—' : String(value);\n}\n\ninterface ActionButtonProps extends Omit<IconButtonProps, 'aria-label' | 'children'> {\n label: string;\n icon: React.ReactNode;\n danger?: boolean;\n}\n\nfunction ActionButton({ label, icon, danger, ...props }: ActionButtonProps) {\n return (\n <Tooltip content={label}>\n <IconButton size=\"sm\" className=\"oui-data-table__action\" aria-label={label} data-danger={danger ? '' : undefined} {...props}>\n {icon}\n </IconButton>\n </Tooltip>\n );\n}\n\ninterface EditorProps<T> {\n table: DataTableInstance<T>;\n column: DataTableColumn<T>;\n edit: ResolvedEdit<T>;\n row: T;\n autoFocus: boolean;\n}\n\nfunction Editor<T>({ table, column, edit, row, autoFocus }: EditorProps<T>) {\n const value = table.editValue(row, edit.field);\n const setValue = (next: unknown) => table.setEditValue(edit.field, next);\n const disabled = table.saving;\n const label = labelOf(column);\n\n if (edit.render) return edit.render({ row, value, setValue, disabled });\n if (edit.type === 'checkbox') {\n return <Checkbox size=\"sm\" aria-label={label} checked={Boolean(value)} disabled={disabled} onCheckedChange={setValue} />;\n }\n if (edit.type === 'select') {\n return (\n <Select\n size=\"sm\"\n items={edit.options ?? []}\n value={isEmpty(value) ? null : String(value)}\n onValueChange={setValue}\n disabled={disabled}\n triggerProps={{ 'aria-label': label }}\n />\n );\n }\n return (\n <Input\n size=\"sm\"\n aria-label={label}\n autoFocus={autoFocus}\n disabled={disabled}\n {...edit.inputProps}\n value={isEmpty(value) ? '' : String(value)}\n onValueChange={setValue}\n />\n );\n}\n\ninterface RowActionsProps<T> {\n table: DataTableInstance<T>;\n entry: DataTableEntry<T>;\n /** Called with the edit button before editing starts. */\n onEdit?: (button: HTMLElement) => void;\n}\n\n/** Trailing cell of a row: its own actions, then edit and delete; save and cancel while it is edited. */\nexport function RowActions<T>({ table, entry: { row, id }, onEdit }: RowActionsProps<T>) {\n const text = table.labels;\n const editing = table.editingId === id;\n const actions = table.rowActions?.(row);\n // Room for the buttons of the edited state from the start, so entering it does not widen the column.\n const slots = table.editable ? (table.deletable ? 3 : 2) : 0;\n return (\n <TableCell className=\"oui-data-table__row-actions\">\n <div\n className=\"oui-data-table__row-actions-list\"\n style={slots ? { minWidth: `calc(${slots} * var(--oui-control-height-sm) + ${(slots - 1) * 0.125}rem)` } : undefined}\n >\n {editing ? (\n <>\n <ActionButton label={text.save} icon={<CheckIcon />} loading={table.saving} onClick={table.saveEdit} />\n {table.deletable && (\n <ActionButton label={text.delete} icon={<TrashIcon />} danger disabled={table.saving} onClick={() => table.deleteRow(row)} />\n )}\n <ActionButton label={text.cancel} icon={<XIcon />} disabled={table.saving} onClick={table.cancelEdit} />\n </>\n ) : (\n <>\n {(Array.isArray(actions) ? actions : [actions]).map((item, index) =>\n isAction(item) ? (\n <ActionButton\n key={item.label}\n label={item.label}\n icon={item.icon}\n danger={item.danger}\n disabled={item.disabled}\n onClick={item.onClick}\n />\n ) : (\n <React.Fragment key={index}>{item}</React.Fragment>\n ),\n )}\n {table.editable && (\n <ActionButton\n label={text.edit}\n icon={<PencilIcon />}\n disabled={table.saving}\n onClick={(event) => {\n onEdit?.(event.currentTarget);\n table.startEdit(id);\n }}\n />\n )}\n {table.deletable && !table.editable && (\n <ActionButton label={text.delete} icon={<TrashIcon />} danger onClick={() => table.deleteRow(row)} />\n )}\n </>\n )}\n </div>\n </TableCell>\n );\n}\n\nexport interface DataTableRowProps<T> {\n table: DataTableInstance<T>;\n entry: DataTableEntry<T>;\n columns: DataTableColumn<T>[];\n hasActions: boolean;\n /** Id of the column whose editor takes the focus when editing starts. */\n focused?: string;\n /** Virtualized tables: position among all rows, and the height every row shares. */\n index?: number;\n height?: number;\n}\n\nfunction Row<T>({ table, entry, columns, hasActions, focused, index, height }: DataTableRowProps<T>) {\n const { row, id } = entry;\n const editing = table.editingId === id;\n const virtual = index !== undefined;\n // Height the row had when its editing started: the editors fit inside it, so the rows below stay put.\n const [editHeight, setEditHeight] = React.useState<number>();\n const onRowClick = editing ? undefined : table.onRowClick;\n const extra = table.rowProps?.(row);\n const held = height ?? (editing ? editHeight : undefined);\n\n return (\n <TableRow\n {...extra}\n style={held !== undefined ? { height: held, ...extra?.style } : extra?.style}\n aria-rowindex={virtual ? index + 2 : undefined}\n data-selected={table.isSelected(id) || undefined}\n data-clickable={onRowClick ? '' : undefined}\n data-editing={editing ? '' : undefined}\n data-tone={table.rowTone?.(row) ?? undefined}\n tabIndex={onRowClick ? 0 : extra?.tabIndex}\n aria-label={onRowClick ? table.rowLabel?.(row) : extra?.['aria-label']}\n onClick={(event) => {\n extra?.onClick?.(event);\n if (!onRowClick || event.ctrlKey || event.metaKey) return;\n if ((event.target as HTMLElement).closest(INTERACTIVE)) return;\n onRowClick(row);\n }}\n onKeyDown={(event) => {\n extra?.onKeyDown?.(event);\n if (onRowClick && event.target === event.currentTarget && event.key === 'Enter') onRowClick(row);\n // Popups of the editors are portalled out of the row: their keys are not the row's.\n if (!editing || !event.currentTarget.contains(event.target as Node)) return;\n if (event.key === 'Escape') table.cancelEdit();\n if (event.key === 'Enter' && (event.target as HTMLElement).tagName === 'INPUT') table.saveEdit();\n }}\n >\n {table.selectable && (\n <TableCell className=\"oui-data-table__check\">\n <Checkbox\n size=\"sm\"\n aria-label={table.labels.selectRow(table.rowLabel?.(row) ?? id)}\n checked={table.isSelected(id)}\n onCheckedChange={(checked) => table.toggleRow(id, checked)}\n />\n </TableCell>\n )}\n {columns.map((column) => {\n const edit = editing ? editOf(column) : null;\n const className = typeof column.cellClassName === 'function' ? column.cellClassName(row) : column.cellClassName;\n const value = getColumnValue(column, row);\n // Cut text can still be read in full by pointing at it.\n const title = (column.truncate || virtual) && !edit && (typeof value === 'string' || typeof value === 'number');\n return (\n <TableCell\n key={column.id}\n align={column.align}\n numeric={column.numeric}\n className={className}\n title={title ? String(value) : undefined}\n data-mono={column.mono || undefined}\n data-muted={column.muted || undefined}\n data-truncate={(column.truncate && !edit) || undefined}\n data-editor={edit ? '' : undefined}\n >\n {edit ? (\n <Editor table={table} column={column} edit={edit} row={row} autoFocus={column.id === focused} />\n ) : (\n cellContent(column, row)\n )}\n </TableCell>\n );\n })}\n {hasActions && (\n <RowActions\n table={table}\n entry={entry}\n onEdit={(button) => setEditHeight(button.closest('tr')?.getBoundingClientRect().height)}\n />\n )}\n </TableRow>\n );\n}\n\n// Memoized by hand: scrolling a virtualized table renders its content on every\n// step, and the rows that stay in view have nothing new to show.\nexport const DataTableRow = React.memo(Row) as typeof Row;\n\n/**\n * A row that only gives its columns their width: what the cells would show, at\n * no height. Rendered while the column widths are measured, never painted.\n */\nexport function SizerRow<T>({ table, entry, columns, hasActions }: DataTableRowProps<T>) {\n return (\n <TableRow>\n {table.selectable && <TableCell className=\"oui-data-table__check\" />}\n {columns.map((column) => (\n <TableCell\n key={column.id}\n align={column.align}\n numeric={column.numeric}\n data-mono={column.mono || undefined}\n data-truncate={column.truncate || undefined}\n >\n {!column.truncate && <div className=\"oui-data-table__sizer-content\">{cellContent(column, entry.row)}</div>}\n </TableCell>\n ))}\n {hasActions && <RowActions table={table} entry={entry} />}\n </TableRow>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+ import type { DataTableInstance } from './types';
3
+ export declare const DataTableContext: React.Context<DataTableInstance<any> | null>;
4
+ /** The table of the surrounding `DataTable.Root`, for building custom parts. */
5
+ export declare function useDataTableContext<T = unknown>(): DataTableInstance<T>;
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ //#region src/components/data-table/context.ts
4
+ var DataTableContext = React.createContext(null);
5
+ /** The table of the surrounding `DataTable.Root`, for building custom parts. */
6
+ function useDataTableContext() {
7
+ const table = React.useContext(DataTableContext);
8
+ if (!table) throw new Error("DataTable parts must be rendered inside <DataTable.Root>.");
9
+ return table;
10
+ }
11
+ //#endregion
12
+ export { DataTableContext, useDataTableContext };
13
+
14
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","names":["React","DataTableInstance","DataTableContext","createContext","useDataTableContext","table","useContext","Error"],"sources":["../../../src/components/data-table/context.ts"],"sourcesContent":["import * as React from 'react';\nimport type { DataTableInstance } from './types';\n\n// The parts never look inside a row: they hand it back to the column callbacks.\nexport const DataTableContext = React.createContext<DataTableInstance<any> | null>(null);\n\n/** The table of the surrounding `DataTable.Root`, for building custom parts. */\nexport function useDataTableContext<T = unknown>(): DataTableInstance<T> {\n const table = React.useContext(DataTableContext);\n if (!table) throw new Error('DataTable parts must be rendered inside <DataTable.Root>.');\n return table;\n}\n"],"mappings":";;;AAIA,IAAaE,mBAAmBF,MAAMG,cAA6C,IAAI;;AAGvF,SAAOC,sBAAA;CACL,MAAAC,QAAcL,MAAKM,WAAYJ,gBAAgB;CAC/C,IAAI,CAACG,OAAO,MAAM,IAAIE,MAAM,2DAA2D;CAAE,OAClFF;AAAK"}