@simpleapps-com/augur-web 2026.11.2 → 2026.11.3

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 (167) hide show
  1. package/EXPORTS.md +1 -1
  2. package/README.md +7 -2
  3. package/dist/add-to-cart-button.cjs +3 -2
  4. package/dist/add-to-cart-button.cjs.map +1 -1
  5. package/dist/add-to-cart-button.js +2 -1
  6. package/dist/add-to-cart-button.js.map +1 -1
  7. package/dist/bin-scan.d.ts +23 -0
  8. package/dist/bin-scan.d.ts.map +1 -0
  9. package/dist/button.d.ts +1 -1
  10. package/dist/{chunk-32XB3REY.cjs → chunk-6SSR5Z6X.cjs} +8 -5
  11. package/dist/chunk-6SSR5Z6X.cjs.map +1 -0
  12. package/dist/{chunk-RCUKSVMF.js → chunk-6USFUHWW.js} +9 -14
  13. package/dist/chunk-6USFUHWW.js.map +1 -0
  14. package/dist/{chunk-WJUDOEVB.cjs → chunk-7RDA26CL.cjs} +7 -7
  15. package/dist/{chunk-WJUDOEVB.cjs.map → chunk-7RDA26CL.cjs.map} +1 -1
  16. package/dist/{chunk-UMNTUD2P.js → chunk-AC3OCGDU.js} +6 -8
  17. package/dist/chunk-AC3OCGDU.js.map +1 -0
  18. package/dist/{chunk-MOC5N2N4.js → chunk-BSRLAXZ2.js} +9 -6
  19. package/dist/chunk-BSRLAXZ2.js.map +1 -0
  20. package/dist/{chunk-UB7HYAAC.js → chunk-EBCKH6JE.js} +6 -3
  21. package/dist/chunk-EBCKH6JE.js.map +1 -0
  22. package/dist/{chunk-WFMP6TZN.js → chunk-I6LMIYVF.js} +3 -3
  23. package/dist/{chunk-RGJT67PN.js → chunk-IDCDOE2L.js} +6 -3
  24. package/dist/chunk-IDCDOE2L.js.map +1 -0
  25. package/dist/{chunk-MXSQYVCK.js → chunk-IXQFZJSN.js} +7 -3
  26. package/dist/chunk-IXQFZJSN.js.map +1 -0
  27. package/dist/{chunk-76RSVRGB.cjs → chunk-KVJQIZSM.cjs} +10 -15
  28. package/dist/chunk-KVJQIZSM.cjs.map +1 -0
  29. package/dist/{chunk-TFP5RICB.cjs → chunk-L7JN7ED7.cjs} +37 -37
  30. package/dist/chunk-L7JN7ED7.cjs.map +1 -0
  31. package/dist/{chunk-JXW4XE2P.cjs → chunk-N57EZBPE.cjs} +10 -7
  32. package/dist/chunk-N57EZBPE.cjs.map +1 -0
  33. package/dist/chunk-NBXA42AW.cjs +534 -0
  34. package/dist/chunk-NBXA42AW.cjs.map +1 -0
  35. package/dist/chunk-NSMOT7GD.js +534 -0
  36. package/dist/chunk-NSMOT7GD.js.map +1 -0
  37. package/dist/{chunk-BXMTQGKV.cjs → chunk-OJS2B6U2.cjs} +7 -3
  38. package/dist/chunk-OJS2B6U2.cjs.map +1 -0
  39. package/dist/{chunk-5VMEEKZ5.cjs → chunk-SJGSBMMN.cjs} +7 -9
  40. package/dist/chunk-SJGSBMMN.cjs.map +1 -0
  41. package/dist/{chunk-C6K7FZNX.js → chunk-TEDFINZP.js} +2 -2
  42. package/dist/{chunk-DMWSWL4B.cjs → chunk-VCFKYOVH.cjs} +3 -3
  43. package/dist/{chunk-DMWSWL4B.cjs.map → chunk-VCFKYOVH.cjs.map} +1 -1
  44. package/dist/{chunk-Z57QBVUC.cjs → chunk-VXVOYZBN.cjs} +8 -5
  45. package/dist/chunk-VXVOYZBN.cjs.map +1 -0
  46. package/dist/{chunk-KVHOMD4T.js → chunk-YJDVFOVR.js} +40 -40
  47. package/dist/chunk-YJDVFOVR.js.map +1 -0
  48. package/dist/command.cjs +3 -3
  49. package/dist/command.cjs.map +1 -1
  50. package/dist/command.d.ts.map +1 -1
  51. package/dist/command.js +2 -2
  52. package/dist/command.js.map +1 -1
  53. package/dist/confirm-dialog.cjs +3 -2
  54. package/dist/confirm-dialog.cjs.map +1 -1
  55. package/dist/confirm-dialog.js +2 -1
  56. package/dist/confirm-dialog.js.map +1 -1
  57. package/dist/data-table.cjs +65 -46
  58. package/dist/data-table.cjs.map +1 -1
  59. package/dist/data-table.d.ts.map +1 -1
  60. package/dist/data-table.js +59 -40
  61. package/dist/data-table.js.map +1 -1
  62. package/dist/detail-panel.cjs +71 -63
  63. package/dist/detail-panel.cjs.map +1 -1
  64. package/dist/detail-panel.d.ts.map +1 -1
  65. package/dist/detail-panel.js +70 -62
  66. package/dist/detail-panel.js.map +1 -1
  67. package/dist/dropdown-menu.cjs +3 -2
  68. package/dist/dropdown-menu.cjs.map +1 -1
  69. package/dist/dropdown-menu.d.ts.map +1 -1
  70. package/dist/dropdown-menu.js +2 -1
  71. package/dist/financing-widget.cjs +4 -1
  72. package/dist/financing-widget.cjs.map +1 -1
  73. package/dist/financing-widget.d.ts.map +1 -1
  74. package/dist/financing-widget.js +4 -1
  75. package/dist/financing-widget.js.map +1 -1
  76. package/dist/form-field.cjs +3 -2
  77. package/dist/form-field.cjs.map +1 -1
  78. package/dist/form-field.d.ts.map +1 -1
  79. package/dist/form-field.js +2 -1
  80. package/dist/form-input.cjs +4 -3
  81. package/dist/form-input.cjs.map +1 -1
  82. package/dist/form-input.d.ts.map +1 -1
  83. package/dist/form-input.js +3 -2
  84. package/dist/form-select.cjs +5 -4
  85. package/dist/form-select.cjs.map +1 -1
  86. package/dist/form-select.js +4 -3
  87. package/dist/form-textarea.cjs +4 -3
  88. package/dist/form-textarea.cjs.map +1 -1
  89. package/dist/form-textarea.d.ts.map +1 -1
  90. package/dist/form-textarea.js +3 -2
  91. package/dist/gtm.cjs +3 -3
  92. package/dist/gtm.js +2 -2
  93. package/dist/pagination.cjs +3 -3
  94. package/dist/pagination.d.ts +1 -1
  95. package/dist/pagination.d.ts.map +1 -1
  96. package/dist/pagination.js +2 -2
  97. package/dist/payment-modal.cjs +52 -34
  98. package/dist/payment-modal.cjs.map +1 -1
  99. package/dist/payment-modal.d.ts +4 -4
  100. package/dist/payment-modal.d.ts.map +1 -1
  101. package/dist/payment-modal.js +52 -34
  102. package/dist/payment-modal.js.map +1 -1
  103. package/dist/popover.cjs +4 -4
  104. package/dist/popover.cjs.map +1 -1
  105. package/dist/popover.js +3 -3
  106. package/dist/popover.js.map +1 -1
  107. package/dist/price.cjs +2 -2
  108. package/dist/price.js +1 -1
  109. package/dist/provider.cjs +3 -3
  110. package/dist/provider.js +2 -2
  111. package/dist/quantity-input.cjs +125 -111
  112. package/dist/quantity-input.cjs.map +1 -1
  113. package/dist/quantity-input.d.ts +16 -5
  114. package/dist/quantity-input.d.ts.map +1 -1
  115. package/dist/quantity-input.js +127 -113
  116. package/dist/quantity-input.js.map +1 -1
  117. package/dist/resource-tabs.cjs +10 -5
  118. package/dist/resource-tabs.cjs.map +1 -1
  119. package/dist/resource-tabs.d.ts +1 -1
  120. package/dist/resource-tabs.d.ts.map +1 -1
  121. package/dist/resource-tabs.js +10 -5
  122. package/dist/resource-tabs.js.map +1 -1
  123. package/dist/rules.d.ts +315 -17
  124. package/dist/rules.d.ts.map +1 -1
  125. package/dist/select.cjs +3 -2
  126. package/dist/select.cjs.map +1 -1
  127. package/dist/select.d.ts.map +1 -1
  128. package/dist/select.js +2 -1
  129. package/dist/separator.cjs +8 -9
  130. package/dist/separator.cjs.map +1 -1
  131. package/dist/separator.d.ts.map +1 -1
  132. package/dist/separator.js +7 -8
  133. package/dist/separator.js.map +1 -1
  134. package/dist/session-replay.cjs +2 -2
  135. package/dist/session-replay.js +1 -1
  136. package/dist/spinner.cjs +3 -2
  137. package/dist/spinner.cjs.map +1 -1
  138. package/dist/spinner.d.ts +1 -1
  139. package/dist/spinner.d.ts.map +1 -1
  140. package/dist/spinner.js +2 -1
  141. package/dist/stock-label.cjs +28 -33
  142. package/dist/stock-label.cjs.map +1 -1
  143. package/dist/stock-label.d.ts.map +1 -1
  144. package/dist/stock-label.js +30 -35
  145. package/dist/stock-label.js.map +1 -1
  146. package/llms.txt +3 -2
  147. package/package.json +3 -1
  148. package/dist/chunk-32XB3REY.cjs.map +0 -1
  149. package/dist/chunk-5VMEEKZ5.cjs.map +0 -1
  150. package/dist/chunk-76RSVRGB.cjs.map +0 -1
  151. package/dist/chunk-BXMTQGKV.cjs.map +0 -1
  152. package/dist/chunk-IO77MGHW.js +0 -220
  153. package/dist/chunk-IO77MGHW.js.map +0 -1
  154. package/dist/chunk-JXW4XE2P.cjs.map +0 -1
  155. package/dist/chunk-KVHOMD4T.js.map +0 -1
  156. package/dist/chunk-MOC5N2N4.js.map +0 -1
  157. package/dist/chunk-MXSQYVCK.js.map +0 -1
  158. package/dist/chunk-QKWXJM4Q.cjs +0 -220
  159. package/dist/chunk-QKWXJM4Q.cjs.map +0 -1
  160. package/dist/chunk-RCUKSVMF.js.map +0 -1
  161. package/dist/chunk-RGJT67PN.js.map +0 -1
  162. package/dist/chunk-TFP5RICB.cjs.map +0 -1
  163. package/dist/chunk-UB7HYAAC.js.map +0 -1
  164. package/dist/chunk-UMNTUD2P.js.map +0 -1
  165. package/dist/chunk-Z57QBVUC.cjs.map +0 -1
  166. /package/dist/{chunk-WFMP6TZN.js.map → chunk-I6LMIYVF.js.map} +0 -0
  167. /package/dist/{chunk-C6K7FZNX.js.map → chunk-TEDFINZP.js.map} +0 -0
@@ -10,34 +10,41 @@
10
10
  var _chunkNEY26NNFcjs = require('./chunk-NEY26NNF.cjs');
11
11
 
12
12
 
13
- var _chunkTFP5RICBcjs = require('./chunk-TFP5RICB.cjs');
13
+ var _chunkL7JN7ED7cjs = require('./chunk-L7JN7ED7.cjs');
14
14
 
15
15
 
16
16
 
17
17
 
18
18
 
19
- var _chunkQKWXJM4Qcjs = require('./chunk-QKWXJM4Q.cjs');
20
19
 
20
+ var _chunkKVJQIZSMcjs = require('./chunk-KVJQIZSM.cjs');
21
21
 
22
22
 
23
23
 
24
24
 
25
25
 
26
- var _chunk76RSVRGBcjs = require('./chunk-76RSVRGB.cjs');
27
26
 
28
27
 
28
+ var _chunkN57EZBPEcjs = require('./chunk-N57EZBPE.cjs');
29
29
 
30
30
 
31
+ var _chunk7EXXNELXcjs = require('./chunk-7EXXNELX.cjs');
32
+
33
+
34
+ var _chunkSJGSBMMNcjs = require('./chunk-SJGSBMMN.cjs');
35
+
31
36
 
32
37
 
33
38
 
34
- var _chunkJXW4XE2Pcjs = require('./chunk-JXW4XE2P.cjs');
35
39
 
36
40
 
37
- var _chunk7EXXNELXcjs = require('./chunk-7EXXNELX.cjs');
38
41
 
39
42
 
40
- var _chunk5VMEEKZ5cjs = require('./chunk-5VMEEKZ5.cjs');
43
+
44
+
45
+
46
+
47
+ var _chunkNBXA42AWcjs = require('./chunk-NBXA42AW.cjs');
41
48
 
42
49
 
43
50
  var _chunkVL6L4GDAcjs = require('./chunk-VL6L4GDA.cjs');
@@ -59,7 +66,7 @@ var _web = require('@simpleapps-com/augur-utils/web');
59
66
  var _lu = require('react-icons/lu');
60
67
  var _jsxruntime = require('react/jsx-runtime');
61
68
  function getAlignCn(meta) {
62
- return _chunkQKWXJM4Qcjs.alignClass.call(void 0, _nullishCoalesce(_optionalChain([meta, 'optionalAccess', _ => _.align]), () => ( "left")));
69
+ return _chunkNBXA42AWcjs.alignClassOf.call(void 0, _optionalChain([meta, 'optionalAccess', _ => _.align]));
63
70
  }
64
71
  function buildTanstackColumns(columns, selectable) {
65
72
  const cols = [];
@@ -93,8 +100,8 @@ function buildTanstackColumns(columns, selectable) {
93
100
  id: col.key,
94
101
  accessorKey: col.key,
95
102
  header: col.header,
96
- enableSorting: _nullishCoalesce(col.sortable, () => ( false)),
97
- enableHiding: col.hideable !== false,
103
+ enableSorting: _chunkNBXA42AWcjs.enableSorting.call(void 0, col.sortable),
104
+ enableHiding: _chunkNBXA42AWcjs.enableHiding.call(void 0, col.hideable),
98
105
  cell: col.render ? (info) => col.render(info.row.original) : (info) => String(_nullishCoalesce(info.getValue(), () => ( ""))),
99
106
  meta: { align: col.align }
100
107
  });
@@ -102,9 +109,9 @@ function buildTanstackColumns(columns, selectable) {
102
109
  return cols;
103
110
  }
104
111
  function exportToCsv(columns, data, filename) {
105
- const headers = columns.map((c) => c.header);
106
- const rows = data.map((row) => columns.map((col) => _chunkQKWXJM4Qcjs.csvField.call(void 0, String(_nullishCoalesce(row[col.key], () => ( ""))))));
107
- const csv = [headers.join(","), ...rows.map((r) => r.join(","))].join("\n");
112
+ const headers = columns.map((c) => _chunkNBXA42AWcjs.csvField.call(void 0, c.header));
113
+ const rows = data.map((row) => columns.map((col) => _chunkNBXA42AWcjs.csvField.call(void 0, String(_nullishCoalesce(row[col.key], () => ( ""))))));
114
+ const csv = _chunkNBXA42AWcjs.csvText.call(void 0, headers, rows);
108
115
  const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
109
116
  const url = URL.createObjectURL(blob);
110
117
  const link = document.createElement("a");
@@ -114,21 +121,24 @@ function exportToCsv(columns, data, filename) {
114
121
  URL.revokeObjectURL(url);
115
122
  }
116
123
  function SortIndicator({ direction }) {
117
- if (direction === "asc") return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuArrowUp, { className: "h-4 w-4" });
118
- if (direction === "desc") return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuArrowDown, { className: "h-4 w-4" });
119
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuArrowUpDown, { className: "text-muted-foreground/50 h-4 w-4" });
124
+ const slots = _chunkNBXA42AWcjs.sortSlotsOf.call(void 0, direction);
125
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
126
+ slots.up.map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuArrowUp, { className: "h-4 w-4" }, slot)),
127
+ slots.down.map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuArrowDown, { className: "h-4 w-4" }, slot)),
128
+ slots.both.map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuArrowUpDown, { className: "text-muted-foreground/50 h-4 w-4" }, slot))
129
+ ] });
120
130
  }
121
131
  function ColumnToggle({ table }) {
122
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkJXW4XE2Pcjs.DropdownMenu, { children: [
123
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJXW4XE2Pcjs.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkVL6L4GDAcjs.Button, { variant: "outline", size: "sm", children: [
132
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkN57EZBPEcjs.DropdownMenu, { children: [
133
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN57EZBPEcjs.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkVL6L4GDAcjs.Button, { variant: "outline", size: "sm", children: [
124
134
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuSettings2, { className: "mr-2 h-4 w-4" }),
125
135
  "Columns"
126
136
  ] }) }),
127
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkJXW4XE2Pcjs.DropdownMenuContent, { align: "end", children: [
128
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJXW4XE2Pcjs.DropdownMenuLabel, { children: "Toggle columns" }),
129
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJXW4XE2Pcjs.DropdownMenuSeparator, {}),
137
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkN57EZBPEcjs.DropdownMenuContent, { align: "end", children: [
138
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN57EZBPEcjs.DropdownMenuLabel, { children: "Toggle columns" }),
139
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN57EZBPEcjs.DropdownMenuSeparator, {}),
130
140
  table.getAllColumns().filter((col) => col.getCanHide()).map((col) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
131
- _chunkJXW4XE2Pcjs.DropdownMenuCheckboxItem,
141
+ _chunkN57EZBPEcjs.DropdownMenuCheckboxItem,
132
142
  {
133
143
  checked: col.getIsVisible(),
134
144
  onCheckedChange: (v) => col.toggleVisibility(!!v),
@@ -142,7 +152,8 @@ function ColumnToggle({ table }) {
142
152
  function HeaderCell({ header }) {
143
153
  const canSort = header.column.getCanSort();
144
154
  const sorted = header.column.getIsSorted();
145
- const ariaSort = _chunkQKWXJM4Qcjs.ariaSortOf.call(void 0, canSort, sorted === false ? "unsorted" : sorted);
155
+ const direction = sorted === false ? "unsorted" : sorted;
156
+ const ariaSort = _chunkNBXA42AWcjs.ariaSortOf.call(void 0, canSort, direction);
146
157
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableHead, { className: getAlignCn(header.column.columnDef.meta), "aria-sort": ariaSort, children: canSort ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
147
158
  "button",
148
159
  {
@@ -151,7 +162,7 @@ function HeaderCell({ header }) {
151
162
  className: "inline-flex cursor-pointer select-none items-center gap-1",
152
163
  children: [
153
164
  _reacttable.flexRender.call(void 0, header.column.columnDef.header, header.getContext()),
154
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SortIndicator, { direction: sorted })
165
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SortIndicator, { direction })
155
166
  ]
156
167
  }
157
168
  ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "inline-flex items-center gap-1", children: _reacttable.flexRender.call(void 0, header.column.columnDef.header, header.getContext()) }) });
@@ -207,22 +218,29 @@ function Toolbar({
207
218
  columnToggle,
208
219
  table
209
220
  }) {
210
- const hasSelection = selectedRows.length > 0;
211
221
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-4", children: [
212
- searchable && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
222
+ _chunkNBXA42AWcjs.slotsWhen.call(void 0, searchable).map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
213
223
  _chunk7EXXNELXcjs.Input,
214
224
  {
215
225
  placeholder: searchPlaceholder,
216
226
  value: globalFilter,
217
227
  onChange: (e) => onGlobalFilterChange(e.target.value),
218
228
  className: "max-w-sm"
219
- }
220
- ),
221
- hasSelection && bulkActions && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, BulkActionsBar, { selectedRows, bulkActions }),
229
+ },
230
+ slot
231
+ )),
232
+ _chunkNBXA42AWcjs.slotsWhen.call(void 0, _chunkNBXA42AWcjs.bulkBarShown.call(void 0, selectedRows.length, Boolean(bulkActions))).map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
233
+ BulkActionsBar,
234
+ {
235
+ selectedRows,
236
+ bulkActions
237
+ },
238
+ slot
239
+ )),
222
240
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "ml-auto flex items-center gap-2", children: [
223
241
  toolbar,
224
- exportCsv && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ExportButton, { columns, data, csvFilename }),
225
- columnToggle && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ColumnToggle, { table })
242
+ _chunkNBXA42AWcjs.slotsWhen.call(void 0, exportCsv).map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ExportButton, { columns, data, csvFilename }, slot)),
243
+ _chunkNBXA42AWcjs.slotsWhen.call(void 0, columnToggle).map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ColumnToggle, { table }, slot))
226
244
  ] })
227
245
  ] });
228
246
  }
@@ -233,14 +251,12 @@ function TableBodyContent({
233
251
  rows,
234
252
  onRowClick
235
253
  }) {
236
- const view = _chunkQKWXJM4Qcjs.bodyViewOf.call(void 0, loading, rows.length);
237
- if (view === "loading") {
238
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableRow, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableCell, { colSpan, className: "h-24 text-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5VMEEKZ5cjs.Spinner, { size: "lg", className: "mx-auto" }) }) });
239
- }
240
- if (view === "empty") {
241
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableRow, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableCell, { colSpan, className: "h-24 text-center", children: emptyMessage }) });
242
- }
243
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children: rows.map((row) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DataRow, { row, onRowClick }, row.id)) });
254
+ const slots = _chunkNBXA42AWcjs.bodySlots.call(void 0, loading, rows.length);
255
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
256
+ slots.loading.map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableRow, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableCell, { colSpan, className: "h-24 text-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkSJGSBMMNcjs.Spinner, { size: "lg", className: "mx-auto" }) }) }, slot)),
257
+ slots.empty.map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableRow, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableCell, { colSpan, className: "h-24 text-center", children: emptyMessage }) }, slot)),
258
+ slots.rows.map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, React.Fragment, { children: rows.map((row) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DataRow, { row, onRowClick }, row.id)) }, slot))
259
+ ] });
244
260
  }
245
261
  function PageSizeSelector({
246
262
  pageSize,
@@ -249,9 +265,9 @@ function PageSizeSelector({
249
265
  }) {
250
266
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2", children: [
251
267
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-muted-foreground text-sm", children: "Rows per page" }),
252
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk76RSVRGBcjs.Select, { value: String(pageSize), onValueChange: (v) => onChange(Number(v)), children: [
253
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk76RSVRGBcjs.SelectTrigger, { className: "h-8 w-[70px]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk76RSVRGBcjs.SelectValue, {}) }),
254
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk76RSVRGBcjs.SelectContent, { children: options.map((size) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk76RSVRGBcjs.SelectItem, { value: String(size), children: size }, size)) })
268
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkKVJQIZSMcjs.Select, { value: String(pageSize), onValueChange: (v) => onChange(Number(v)), children: [
269
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKVJQIZSMcjs.SelectTrigger, { className: "h-8 w-[70px]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKVJQIZSMcjs.SelectValue, {}) }),
270
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKVJQIZSMcjs.SelectContent, { children: options.map((size) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKVJQIZSMcjs.SelectItem, { value: String(size), children: size }, size)) })
255
271
  ] })
256
272
  ] });
257
273
  }
@@ -270,7 +286,7 @@ function PaginationFooter({ pagination }) {
270
286
  }
271
287
  ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", {}),
272
288
  showPages && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
273
- _chunkTFP5RICBcjs.ListPagination,
289
+ _chunkL7JN7ED7cjs.ListPagination,
274
290
  {
275
291
  page: pagination.page,
276
292
  totalPages: pagination.totalPages,
@@ -335,9 +351,6 @@ function useDataTable(opts) {
335
351
  const selectedRows = opts.selectable ? table.getSelectedRowModel().rows.map((r) => r.original) : [];
336
352
  return { table, tanstackColumns, globalFilter, handleGlobalFilterChange, selectedRows };
337
353
  }
338
- function toolbarVisible(searchable, toolbar, columnToggle, exportCsv, selectedRows) {
339
- return Boolean(searchable || toolbar || columnToggle || exportCsv || selectedRows.length > 0);
340
- }
341
354
  function DataTable({
342
355
  columns,
343
356
  data,
@@ -375,7 +388,13 @@ function DataTable({
375
388
  externalRowSelection: rowSelection,
376
389
  onRowSelectionChange
377
390
  });
378
- const showToolbar = toolbarVisible(searchable, toolbar, columnToggle, exportCsv, selectedRows);
391
+ const showToolbar = _chunkNBXA42AWcjs.toolbarShown.call(void 0,
392
+ searchable,
393
+ Boolean(toolbar),
394
+ columnToggle,
395
+ exportCsv,
396
+ selectedRows.length
397
+ );
379
398
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _web.cn.call(void 0, "space-y-4", className), children: [
380
399
  showToolbar && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
381
400
  Toolbar,
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/data-table.cjs","../src/data-table.tsx"],"names":[],"mappings":"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","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/data-table.cjs","sourcesContent":[null,"/** Feature-complete admin data table built on TanStack Table. */\n\"use client\";\n\nimport * as React from \"react\";\nimport {\n flexRender,\n functionalUpdate,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n useReactTable,\n type ColumnDef as TanstackColumnDef,\n type SortingState,\n type RowSelectionState,\n type Updater,\n type VisibilityState,\n type Table as TanstackTable,\n type Header,\n type Row,\n type Cell,\n} from \"@tanstack/react-table\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { LuArrowDown, LuArrowUp, LuArrowUpDown, LuDownload, LuSettings2 } from \"react-icons/lu\";\nimport { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from \"./table\";\nimport { Input } from \"./input\";\nimport { Spinner } from \"./spinner\";\nimport { alignClass, ariaSortOf, bodyViewOf, csvField } from \"./rules\";\nimport { Checkbox } from \"./checkbox\";\nimport { Button } from \"./button\";\nimport { ListPagination } from \"./pagination\";\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from \"./select\";\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuCheckboxItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from \"./dropdown-menu\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface ColumnDef<T> {\n key: keyof T & string;\n header: string;\n sortable?: boolean;\n render?: (row: T) => React.ReactNode;\n align?: \"left\" | \"center\" | \"right\";\n hideable?: boolean;\n}\n\nexport interface DataTablePagination {\n page: number;\n totalPages: number;\n getHref: (page: number) => string;\n onPageChange?: (page: number) => void;\n /** Current page size. Required when pageSizeOptions is set. */\n pageSize?: number;\n /** Available page size options. Renders a dropdown when provided. */\n pageSizeOptions?: number[];\n /** Called when the user selects a different page size. */\n onPageSizeChange?: (size: number) => void;\n}\n\nexport interface DataTableProps<T> {\n columns: ColumnDef<T>[];\n data: T[];\n searchable?: boolean;\n searchPlaceholder?: string;\n onRowClick?: (row: T) => void;\n loading?: boolean;\n emptyMessage?: string;\n toolbar?: React.ReactNode;\n className?: string;\n getRowId?: (row: T) => string;\n pagination?: DataTablePagination;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n sortingState?: SortingState;\n onSortingChange?: (state: SortingState) => void;\n selectable?: boolean;\n rowSelection?: RowSelectionState;\n onRowSelectionChange?: (state: RowSelectionState) => void;\n bulkActions?: (selectedRows: T[]) => React.ReactNode;\n columnToggle?: boolean;\n exportCsv?: boolean;\n csvFilename?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction getAlignCn(meta: unknown): string {\n return alignClass((meta as { align?: string } | undefined)?.align ?? \"left\");\n}\n\nfunction buildTanstackColumns<T>(\n columns: ColumnDef<T>[],\n selectable: boolean,\n): TanstackColumnDef<T, unknown>[] {\n const cols: TanstackColumnDef<T, unknown>[] = [];\n if (selectable) {\n cols.push({\n id: \"_select\",\n header: ({ table }) => (\n <Checkbox\n checked={table.getIsAllPageRowsSelected()}\n onCheckedChange={(v) => table.toggleAllPageRowsSelected(!!v)}\n aria-label=\"Select all\"\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(v) => row.toggleSelected(!!v)}\n aria-label=\"Select row\"\n onClick={(e) => e.stopPropagation()}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n meta: { align: \"center\" },\n });\n }\n for (const col of columns) {\n cols.push({\n id: col.key,\n accessorKey: col.key,\n header: col.header,\n enableSorting: col.sortable ?? false,\n enableHiding: col.hideable !== false,\n cell: col.render\n ? (info) => col.render!(info.row.original)\n : (info) => String(info.getValue() ?? \"\"),\n meta: { align: col.align },\n });\n }\n return cols;\n}\n\nfunction exportToCsv<T>(columns: ColumnDef<T>[], data: T[], filename: string) {\n const headers = columns.map((c) => c.header);\n const rows = data.map((row) => columns.map((col) => csvField(String(row[col.key] ?? \"\"))));\n const csv = [headers.join(\",\"), ...rows.map((r) => r.join(\",\"))].join(\"\\n\");\n const blob = new Blob([csv], { type: \"text/csv;charset=utf-8;\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `${filename}.csv`;\n link.click();\n URL.revokeObjectURL(url);\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction SortIndicator({ direction }: { direction: false | \"asc\" | \"desc\" }) {\n if (direction === \"asc\") return <LuArrowUp className=\"h-4 w-4\" />;\n if (direction === \"desc\") return <LuArrowDown className=\"h-4 w-4\" />;\n return <LuArrowUpDown className=\"text-muted-foreground/50 h-4 w-4\" />;\n}\n\nfunction ColumnToggle<T>({ table }: { table: TanstackTable<T> }) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <LuSettings2 className=\"mr-2 h-4 w-4\" />\n Columns\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((col) => col.getCanHide())\n .map((col) => (\n <DropdownMenuCheckboxItem\n key={col.id}\n checked={col.getIsVisible()}\n onCheckedChange={(v) => col.toggleVisibility(!!v)}\n >\n {col.columnDef.header as string}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction HeaderCell<T>({ header }: { header: Header<T, unknown> }) {\n const canSort = header.column.getCanSort();\n const sorted = header.column.getIsSorted();\n // aria-sort announces sort state to screen readers; only meaningful on\n // sortable columns. Sorting is triggered by a real <button> so it is\n // keyboard-focusable and Enter/Space-activatable (a click handler on the\n // <th> alone is mouse-only).\n // ariaSortOf gives only \"ascending\", \"descending\", \"none\" or undefined.\n const ariaSort = ariaSortOf(canSort, sorted === false ? \"unsorted\" : sorted) as\n React.AriaAttributes[\"aria-sort\"] | undefined;\n\n return (\n <TableHead className={getAlignCn(header.column.columnDef.meta)} aria-sort={ariaSort}>\n {canSort ? (\n <button\n type=\"button\"\n onClick={header.column.getToggleSortingHandler()}\n className=\"inline-flex cursor-pointer select-none items-center gap-1\"\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n <SortIndicator direction={sorted} />\n </button>\n ) : (\n <span className=\"inline-flex items-center gap-1\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n </span>\n )}\n </TableHead>\n );\n}\n\nfunction DataCell<T>({ cell }: { cell: Cell<T, unknown> }) {\n return (\n <TableCell className={getAlignCn(cell.column.columnDef.meta)}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n );\n}\n\nfunction DataRow<T>({ row, onRowClick }: { row: Row<T>; onRowClick?: (r: T) => void }) {\n return (\n <TableRow\n data-state={row.getIsSelected() ? \"selected\" : undefined}\n className={cn(onRowClick && \"cursor-pointer\")}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n >\n {row.getVisibleCells().map((cell) => (\n <DataCell key={cell.id} cell={cell} />\n ))}\n </TableRow>\n );\n}\n\nfunction ExportButton<T>({\n columns,\n data,\n csvFilename,\n}: {\n columns: ColumnDef<T>[];\n data: T[];\n csvFilename: string;\n}) {\n return (\n <Button variant=\"outline\" size=\"sm\" onClick={() => exportToCsv(columns, data, csvFilename)}>\n <LuDownload className=\"mr-2 h-4 w-4\" />\n Export\n </Button>\n );\n}\n\nfunction BulkActionsBar<T>({\n selectedRows,\n bulkActions,\n}: {\n selectedRows: T[];\n bulkActions: (rows: T[]) => React.ReactNode;\n}) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">{selectedRows.length} selected</span>\n {bulkActions(selectedRows)}\n </div>\n );\n}\n\nfunction Toolbar<T>({\n searchable,\n searchPlaceholder,\n globalFilter,\n onGlobalFilterChange,\n selectedRows,\n bulkActions,\n toolbar,\n exportCsv,\n columns,\n data,\n csvFilename,\n columnToggle,\n table,\n}: {\n searchable: boolean;\n searchPlaceholder: string;\n globalFilter: string;\n onGlobalFilterChange: (value: string) => void;\n selectedRows: T[];\n bulkActions?: (rows: T[]) => React.ReactNode;\n toolbar?: React.ReactNode;\n exportCsv: boolean;\n columns: ColumnDef<T>[];\n data: T[];\n csvFilename: string;\n columnToggle: boolean;\n table: TanstackTable<T>;\n}) {\n const hasSelection = selectedRows.length > 0;\n return (\n <div className=\"flex items-center gap-4\">\n {searchable && (\n <Input\n placeholder={searchPlaceholder}\n value={globalFilter}\n onChange={(e) => onGlobalFilterChange(e.target.value)}\n className=\"max-w-sm\"\n />\n )}\n {hasSelection && bulkActions && (\n <BulkActionsBar selectedRows={selectedRows} bulkActions={bulkActions} />\n )}\n <div className=\"ml-auto flex items-center gap-2\">\n {toolbar}\n {exportCsv && <ExportButton columns={columns} data={data} csvFilename={csvFilename} />}\n {columnToggle && <ColumnToggle table={table} />}\n </div>\n </div>\n );\n}\n\nfunction TableBodyContent<T>({\n loading,\n colSpan,\n emptyMessage,\n rows,\n onRowClick,\n}: {\n loading: boolean;\n colSpan: number;\n emptyMessage: string;\n rows: Row<T>[];\n onRowClick?: (r: T) => void;\n}) {\n const view = bodyViewOf(loading, rows.length);\n if (view === \"loading\") {\n return (\n <TableRow>\n <TableCell colSpan={colSpan} className=\"h-24 text-center\">\n <Spinner size=\"lg\" className=\"mx-auto\" />\n </TableCell>\n </TableRow>\n );\n }\n if (view === \"empty\") {\n return (\n <TableRow>\n <TableCell colSpan={colSpan} className=\"h-24 text-center\">\n {emptyMessage}\n </TableCell>\n </TableRow>\n );\n }\n return (\n <>\n {rows.map((row) => (\n <DataRow key={row.id} row={row} onRowClick={onRowClick} />\n ))}\n </>\n );\n}\n\nfunction PageSizeSelector({\n pageSize,\n options,\n onChange,\n}: {\n pageSize: number;\n options: number[];\n onChange: (size: number) => void;\n}) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Rows per page</span>\n <Select value={String(pageSize)} onValueChange={(v) => onChange(Number(v))}>\n <SelectTrigger className=\"h-8 w-[70px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n}\n\nfunction PaginationFooter({ pagination }: { pagination?: DataTablePagination }) {\n if (!pagination) return null;\n const showPageSize =\n pagination.pageSizeOptions && pagination.pageSize !== undefined && pagination.onPageSizeChange;\n const showPages = pagination.totalPages > 1;\n if (!showPageSize && !showPages) return null;\n return (\n <div className=\"flex items-center justify-between\">\n {showPageSize ? (\n <PageSizeSelector\n pageSize={pagination.pageSize!}\n options={pagination.pageSizeOptions!}\n onChange={pagination.onPageSizeChange!}\n />\n ) : (\n <div />\n )}\n {showPages && (\n <ListPagination\n page={pagination.page}\n totalPages={pagination.totalPages}\n getHref={pagination.getHref}\n onPageChange={pagination.onPageChange}\n />\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hook: encapsulates all state management and TanStack Table configuration\n// ---------------------------------------------------------------------------\n\ninterface UseDataTableOptions<T> {\n columns: ColumnDef<T>[];\n data: T[];\n selectable: boolean;\n getRowId?: (row: T) => string;\n pagination?: DataTablePagination;\n externalGlobalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n externalSorting?: SortingState;\n onSortingChange?: (state: SortingState) => void;\n externalRowSelection?: RowSelectionState;\n onRowSelectionChange?: (state: RowSelectionState) => void;\n}\n\n/**\n * The change handler TanStack calls: the caller's (with TanStack's Updater<S> =\n * S | ((old: S) => S) resolved against the current value via functionalUpdate, so a plain\n * value from resetRowSelection()/setSorting(v) is not called as a function), or the internal\n * state setter when the state is uncontrolled.\n */\nfunction changeHandler<S>(\n onChange: ((state: S) => void) | undefined,\n current: S,\n setInternal: React.Dispatch<React.SetStateAction<S>>,\n): (updater: Updater<S>) => void {\n if (!onChange) return setInternal;\n return (updater) => onChange(functionalUpdate(updater, current));\n}\n\n/** TanStack's client-side models, left out when the caller sorts or filters on the server. */\nfunction clientRowModels(isManualSorting: boolean, isManualFiltering: boolean) {\n return {\n getSortedRowModel: isManualSorting ? undefined : getSortedRowModel(),\n getFilteredRowModel: isManualFiltering ? undefined : getFilteredRowModel(),\n };\n}\n\nfunction useDataTable<T>(opts: UseDataTableOptions<T>) {\n const isManualFiltering = opts.externalGlobalFilter !== undefined;\n const isManualSorting = opts.externalSorting !== undefined;\n\n const [internalSorting, setInternalSorting] = React.useState<SortingState>([]);\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalRowSelection, setInternalRowSelection] = React.useState<RowSelectionState>({});\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({});\n\n const sorting = opts.externalSorting ?? internalSorting;\n const globalFilter = opts.externalGlobalFilter ?? internalGlobalFilter;\n const rowSelectionState = opts.externalRowSelection ?? internalRowSelection;\n\n const handleSortingChange = changeHandler(opts.onSortingChange, sorting, setInternalSorting);\n\n const handleGlobalFilterChange = opts.onGlobalFilterChange ?? setInternalGlobalFilter;\n\n const handleRowSelectionChange = changeHandler(\n opts.onRowSelectionChange,\n rowSelectionState,\n setInternalRowSelection,\n );\n\n const tanstackColumns = React.useMemo(\n () => buildTanstackColumns(opts.columns, opts.selectable),\n [opts.columns, opts.selectable],\n );\n\n const table = useReactTable({\n data: opts.data,\n columns: tanstackColumns,\n state: {\n sorting,\n globalFilter: isManualFiltering ? undefined : globalFilter,\n rowSelection: rowSelectionState,\n columnVisibility,\n },\n onSortingChange: handleSortingChange,\n onGlobalFilterChange: isManualFiltering ? undefined : setInternalGlobalFilter,\n onRowSelectionChange: handleRowSelectionChange,\n onColumnVisibilityChange: setColumnVisibility,\n getCoreRowModel: getCoreRowModel(),\n ...clientRowModels(isManualSorting, isManualFiltering),\n manualSorting: isManualSorting,\n manualFiltering: isManualFiltering,\n manualPagination: opts.pagination !== undefined,\n enableRowSelection: opts.selectable,\n getRowId: opts.getRowId ? (row) => opts.getRowId!(row) : undefined,\n });\n\n const selectedRows = opts.selectable\n ? table.getSelectedRowModel().rows.map((r) => r.original)\n : [];\n\n return { table, tanstackColumns, globalFilter, handleGlobalFilterChange, selectedRows };\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\n/** The toolbar shows when it has something to show: search, custom content, column toggle, CSV export, or a selection. */\nfunction toolbarVisible(\n searchable: boolean,\n toolbar: React.ReactNode,\n columnToggle: boolean,\n exportCsv: boolean,\n selectedRows: readonly unknown[],\n): boolean {\n return Boolean(searchable || toolbar || columnToggle || exportCsv || selectedRows.length > 0);\n}\n\nfunction DataTable<T>({\n columns,\n data,\n searchable = false,\n searchPlaceholder = \"Search...\",\n onRowClick,\n loading = false,\n emptyMessage = \"No results.\",\n toolbar,\n className,\n getRowId,\n pagination,\n globalFilter: externalGlobalFilter,\n onGlobalFilterChange,\n sortingState,\n onSortingChange,\n selectable = false,\n rowSelection,\n onRowSelectionChange,\n bulkActions,\n columnToggle = false,\n exportCsv = false,\n csvFilename = \"export\",\n}: DataTableProps<T>) {\n const { table, tanstackColumns, globalFilter, handleGlobalFilterChange, selectedRows } =\n useDataTable({\n columns,\n data,\n selectable,\n getRowId,\n pagination,\n externalGlobalFilter,\n onGlobalFilterChange,\n externalSorting: sortingState,\n onSortingChange,\n externalRowSelection: rowSelection,\n onRowSelectionChange,\n });\n\n const showToolbar = toolbarVisible(searchable, toolbar, columnToggle, exportCsv, selectedRows);\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n {showToolbar && (\n <Toolbar\n searchable={searchable}\n searchPlaceholder={searchPlaceholder}\n globalFilter={globalFilter}\n onGlobalFilterChange={handleGlobalFilterChange}\n selectedRows={selectedRows}\n bulkActions={bulkActions}\n toolbar={toolbar}\n exportCsv={exportCsv}\n columns={columns}\n data={data}\n csvFilename={csvFilename}\n columnToggle={columnToggle}\n table={table}\n />\n )}\n <Table>\n <TableHeader className=\"bg-background sticky top-0 z-10\">\n {table.getHeaderGroups().map((hg) => (\n <TableRow key={hg.id}>\n {hg.headers.map((h) => (\n <HeaderCell key={h.id} header={h} />\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n <TableBodyContent\n loading={loading}\n colSpan={tanstackColumns.length}\n emptyMessage={emptyMessage}\n rows={table.getRowModel().rows}\n onRowClick={onRowClick}\n />\n </TableBody>\n </Table>\n <PaginationFooter pagination={pagination} />\n </div>\n );\n}\nDataTable.displayName = \"DataTable\";\n\nexport { DataTable };\nexport type { SortingState, RowSelectionState, VisibilityState };\n"]}
1
+ {"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/data-table.cjs","../src/data-table.tsx"],"names":[],"mappings":"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","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/data-table.cjs","sourcesContent":[null,"/** Feature-complete admin data table built on TanStack Table. */\n\"use client\";\n\nimport * as React from \"react\";\nimport {\n flexRender,\n functionalUpdate,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n useReactTable,\n type ColumnDef as TanstackColumnDef,\n type SortingState,\n type RowSelectionState,\n type Updater,\n type VisibilityState,\n type Table as TanstackTable,\n type Header,\n type Row,\n type Cell,\n} from \"@tanstack/react-table\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { LuArrowDown, LuArrowUp, LuArrowUpDown, LuDownload, LuSettings2 } from \"react-icons/lu\";\nimport { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from \"./table\";\nimport { Input } from \"./input\";\nimport { Spinner } from \"./spinner\";\nimport {\n alignClassOf,\n ariaSortOf,\n bodySlots,\n bulkBarShown,\n csvField,\n csvText,\n enableHiding,\n enableSorting,\n slotsWhen,\n sortSlotsOf,\n toolbarShown,\n type SortDir,\n} from \"./rules\";\nimport { Checkbox } from \"./checkbox\";\nimport { Button } from \"./button\";\nimport { ListPagination } from \"./pagination\";\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from \"./select\";\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuCheckboxItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from \"./dropdown-menu\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface ColumnDef<T> {\n key: keyof T & string;\n header: string;\n sortable?: boolean;\n render?: (row: T) => React.ReactNode;\n align?: \"left\" | \"center\" | \"right\";\n hideable?: boolean;\n}\n\nexport interface DataTablePagination {\n page: number;\n totalPages: number;\n getHref: (page: number) => string;\n onPageChange?: (page: number) => void;\n /** Current page size. Required when pageSizeOptions is set. */\n pageSize?: number;\n /** Available page size options. Renders a dropdown when provided. */\n pageSizeOptions?: number[];\n /** Called when the user selects a different page size. */\n onPageSizeChange?: (size: number) => void;\n}\n\nexport interface DataTableProps<T> {\n columns: ColumnDef<T>[];\n data: T[];\n searchable?: boolean;\n searchPlaceholder?: string;\n onRowClick?: (row: T) => void;\n loading?: boolean;\n emptyMessage?: string;\n toolbar?: React.ReactNode;\n className?: string;\n getRowId?: (row: T) => string;\n pagination?: DataTablePagination;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n sortingState?: SortingState;\n onSortingChange?: (state: SortingState) => void;\n selectable?: boolean;\n rowSelection?: RowSelectionState;\n onRowSelectionChange?: (state: RowSelectionState) => void;\n bulkActions?: (selectedRows: T[]) => React.ReactNode;\n columnToggle?: boolean;\n exportCsv?: boolean;\n csvFilename?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction getAlignCn(meta: unknown): string {\n return alignClassOf((meta as { align?: string } | undefined)?.align);\n}\n\nfunction buildTanstackColumns<T>(\n columns: ColumnDef<T>[],\n selectable: boolean,\n): TanstackColumnDef<T, unknown>[] {\n const cols: TanstackColumnDef<T, unknown>[] = [];\n if (selectable) {\n cols.push({\n id: \"_select\",\n header: ({ table }) => (\n <Checkbox\n checked={table.getIsAllPageRowsSelected()}\n onCheckedChange={(v) => table.toggleAllPageRowsSelected(!!v)}\n aria-label=\"Select all\"\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(v) => row.toggleSelected(!!v)}\n aria-label=\"Select row\"\n onClick={(e) => e.stopPropagation()}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n meta: { align: \"center\" },\n });\n }\n for (const col of columns) {\n cols.push({\n id: col.key,\n accessorKey: col.key,\n header: col.header,\n enableSorting: enableSorting(col.sortable),\n enableHiding: enableHiding(col.hideable),\n cell: col.render\n ? (info) => col.render!(info.row.original)\n : (info) => String(info.getValue() ?? \"\"),\n meta: { align: col.align },\n });\n }\n return cols;\n}\n\nfunction exportToCsv<T>(columns: ColumnDef<T>[], data: T[], filename: string) {\n const headers = columns.map((c) => csvField(c.header));\n const rows = data.map((row) => columns.map((col) => csvField(String(row[col.key] ?? \"\"))));\n const csv = csvText(headers, rows);\n const blob = new Blob([csv], { type: \"text/csv;charset=utf-8;\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `${filename}.csv`;\n link.click();\n URL.revokeObjectURL(url);\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction SortIndicator({ direction }: { direction: SortDir }) {\n const slots = sortSlotsOf(direction);\n return (\n <>\n {slots.up.map((slot) => (\n <LuArrowUp key={slot} className=\"h-4 w-4\" />\n ))}\n {slots.down.map((slot) => (\n <LuArrowDown key={slot} className=\"h-4 w-4\" />\n ))}\n {slots.both.map((slot) => (\n <LuArrowUpDown key={slot} className=\"text-muted-foreground/50 h-4 w-4\" />\n ))}\n </>\n );\n}\n\nfunction ColumnToggle<T>({ table }: { table: TanstackTable<T> }) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <LuSettings2 className=\"mr-2 h-4 w-4\" />\n Columns\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((col) => col.getCanHide())\n .map((col) => (\n <DropdownMenuCheckboxItem\n key={col.id}\n checked={col.getIsVisible()}\n onCheckedChange={(v) => col.toggleVisibility(!!v)}\n >\n {col.columnDef.header as string}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction HeaderCell<T>({ header }: { header: Header<T, unknown> }) {\n const canSort = header.column.getCanSort();\n const sorted = header.column.getIsSorted();\n // aria-sort announces sort state to screen readers; only meaningful on\n // sortable columns. Sorting is triggered by a real <button> so it is\n // keyboard-focusable and Enter/Space-activatable (a click handler on the\n // <th> alone is mouse-only).\n // ariaSortOf gives only \"ascending\", \"descending\", \"none\" or undefined.\n const direction: SortDir = sorted === false ? \"unsorted\" : sorted;\n const ariaSort = ariaSortOf(canSort, direction) as React.AriaAttributes[\"aria-sort\"] | undefined;\n\n return (\n <TableHead className={getAlignCn(header.column.columnDef.meta)} aria-sort={ariaSort}>\n {canSort ? (\n <button\n type=\"button\"\n onClick={header.column.getToggleSortingHandler()}\n className=\"inline-flex cursor-pointer select-none items-center gap-1\"\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n <SortIndicator direction={direction} />\n </button>\n ) : (\n <span className=\"inline-flex items-center gap-1\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n </span>\n )}\n </TableHead>\n );\n}\n\nfunction DataCell<T>({ cell }: { cell: Cell<T, unknown> }) {\n return (\n <TableCell className={getAlignCn(cell.column.columnDef.meta)}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n );\n}\n\nfunction DataRow<T>({ row, onRowClick }: { row: Row<T>; onRowClick?: (r: T) => void }) {\n return (\n <TableRow\n data-state={row.getIsSelected() ? \"selected\" : undefined}\n className={cn(onRowClick && \"cursor-pointer\")}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n >\n {row.getVisibleCells().map((cell) => (\n <DataCell key={cell.id} cell={cell} />\n ))}\n </TableRow>\n );\n}\n\nfunction ExportButton<T>({\n columns,\n data,\n csvFilename,\n}: {\n columns: ColumnDef<T>[];\n data: T[];\n csvFilename: string;\n}) {\n return (\n <Button variant=\"outline\" size=\"sm\" onClick={() => exportToCsv(columns, data, csvFilename)}>\n <LuDownload className=\"mr-2 h-4 w-4\" />\n Export\n </Button>\n );\n}\n\nfunction BulkActionsBar<T>({\n selectedRows,\n bulkActions,\n}: {\n selectedRows: T[];\n bulkActions: (rows: T[]) => React.ReactNode;\n}) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">{selectedRows.length} selected</span>\n {bulkActions(selectedRows)}\n </div>\n );\n}\n\nfunction Toolbar<T>({\n searchable,\n searchPlaceholder,\n globalFilter,\n onGlobalFilterChange,\n selectedRows,\n bulkActions,\n toolbar,\n exportCsv,\n columns,\n data,\n csvFilename,\n columnToggle,\n table,\n}: {\n searchable: boolean;\n searchPlaceholder: string;\n globalFilter: string;\n onGlobalFilterChange: (value: string) => void;\n selectedRows: T[];\n bulkActions?: (rows: T[]) => React.ReactNode;\n toolbar?: React.ReactNode;\n exportCsv: boolean;\n columns: ColumnDef<T>[];\n data: T[];\n csvFilename: string;\n columnToggle: boolean;\n table: TanstackTable<T>;\n}) {\n return (\n <div className=\"flex items-center gap-4\">\n {slotsWhen(searchable).map((slot) => (\n <Input\n key={slot}\n placeholder={searchPlaceholder}\n value={globalFilter}\n onChange={(e) => onGlobalFilterChange(e.target.value)}\n className=\"max-w-sm\"\n />\n ))}\n {slotsWhen(bulkBarShown(selectedRows.length, Boolean(bulkActions))).map((slot) => (\n <BulkActionsBar\n key={slot}\n selectedRows={selectedRows}\n bulkActions={bulkActions as (rows: T[]) => React.ReactNode}\n />\n ))}\n <div className=\"ml-auto flex items-center gap-2\">\n {toolbar}\n {slotsWhen(exportCsv).map((slot) => (\n <ExportButton key={slot} columns={columns} data={data} csvFilename={csvFilename} />\n ))}\n {slotsWhen(columnToggle).map((slot) => (\n <ColumnToggle key={slot} table={table} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction TableBodyContent<T>({\n loading,\n colSpan,\n emptyMessage,\n rows,\n onRowClick,\n}: {\n loading: boolean;\n colSpan: number;\n emptyMessage: string;\n rows: Row<T>[];\n onRowClick?: (r: T) => void;\n}) {\n const slots = bodySlots(loading, rows.length);\n return (\n <>\n {slots.loading.map((slot) => (\n <TableRow key={slot}>\n <TableCell colSpan={colSpan} className=\"h-24 text-center\">\n <Spinner size=\"lg\" className=\"mx-auto\" />\n </TableCell>\n </TableRow>\n ))}\n {slots.empty.map((slot) => (\n <TableRow key={slot}>\n <TableCell colSpan={colSpan} className=\"h-24 text-center\">\n {emptyMessage}\n </TableCell>\n </TableRow>\n ))}\n {slots.rows.map((slot) => (\n <React.Fragment key={slot}>\n {rows.map((row) => (\n <DataRow key={row.id} row={row} onRowClick={onRowClick} />\n ))}\n </React.Fragment>\n ))}\n </>\n );\n}\n\nfunction PageSizeSelector({\n pageSize,\n options,\n onChange,\n}: {\n pageSize: number;\n options: number[];\n onChange: (size: number) => void;\n}) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Rows per page</span>\n <Select value={String(pageSize)} onValueChange={(v) => onChange(Number(v))}>\n <SelectTrigger className=\"h-8 w-[70px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n}\n\nfunction PaginationFooter({ pagination }: { pagination?: DataTablePagination }) {\n if (!pagination) return null;\n const showPageSize =\n pagination.pageSizeOptions && pagination.pageSize !== undefined && pagination.onPageSizeChange;\n const showPages = pagination.totalPages > 1;\n if (!showPageSize && !showPages) return null;\n return (\n <div className=\"flex items-center justify-between\">\n {showPageSize ? (\n <PageSizeSelector\n pageSize={pagination.pageSize!}\n options={pagination.pageSizeOptions!}\n onChange={pagination.onPageSizeChange!}\n />\n ) : (\n <div />\n )}\n {showPages && (\n <ListPagination\n page={pagination.page}\n totalPages={pagination.totalPages}\n getHref={pagination.getHref}\n onPageChange={pagination.onPageChange}\n />\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hook: encapsulates all state management and TanStack Table configuration\n// ---------------------------------------------------------------------------\n\ninterface UseDataTableOptions<T> {\n columns: ColumnDef<T>[];\n data: T[];\n selectable: boolean;\n getRowId?: (row: T) => string;\n pagination?: DataTablePagination;\n externalGlobalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n externalSorting?: SortingState;\n onSortingChange?: (state: SortingState) => void;\n externalRowSelection?: RowSelectionState;\n onRowSelectionChange?: (state: RowSelectionState) => void;\n}\n\n/**\n * The change handler TanStack calls: the caller's (with TanStack's Updater<S> =\n * S | ((old: S) => S) resolved against the current value via functionalUpdate, so a plain\n * value from resetRowSelection()/setSorting(v) is not called as a function), or the internal\n * state setter when the state is uncontrolled.\n */\nfunction changeHandler<S>(\n onChange: ((state: S) => void) | undefined,\n current: S,\n setInternal: React.Dispatch<React.SetStateAction<S>>,\n): (updater: Updater<S>) => void {\n if (!onChange) return setInternal;\n return (updater) => onChange(functionalUpdate(updater, current));\n}\n\n/** TanStack's client-side models, left out when the caller sorts or filters on the server. */\nfunction clientRowModels(isManualSorting: boolean, isManualFiltering: boolean) {\n return {\n getSortedRowModel: isManualSorting ? undefined : getSortedRowModel(),\n getFilteredRowModel: isManualFiltering ? undefined : getFilteredRowModel(),\n };\n}\n\nfunction useDataTable<T>(opts: UseDataTableOptions<T>) {\n const isManualFiltering = opts.externalGlobalFilter !== undefined;\n const isManualSorting = opts.externalSorting !== undefined;\n\n const [internalSorting, setInternalSorting] = React.useState<SortingState>([]);\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalRowSelection, setInternalRowSelection] = React.useState<RowSelectionState>({});\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({});\n\n const sorting = opts.externalSorting ?? internalSorting;\n const globalFilter = opts.externalGlobalFilter ?? internalGlobalFilter;\n const rowSelectionState = opts.externalRowSelection ?? internalRowSelection;\n\n const handleSortingChange = changeHandler(opts.onSortingChange, sorting, setInternalSorting);\n\n const handleGlobalFilterChange = opts.onGlobalFilterChange ?? setInternalGlobalFilter;\n\n const handleRowSelectionChange = changeHandler(\n opts.onRowSelectionChange,\n rowSelectionState,\n setInternalRowSelection,\n );\n\n const tanstackColumns = React.useMemo(\n () => buildTanstackColumns(opts.columns, opts.selectable),\n [opts.columns, opts.selectable],\n );\n\n const table = useReactTable({\n data: opts.data,\n columns: tanstackColumns,\n state: {\n sorting,\n globalFilter: isManualFiltering ? undefined : globalFilter,\n rowSelection: rowSelectionState,\n columnVisibility,\n },\n onSortingChange: handleSortingChange,\n onGlobalFilterChange: isManualFiltering ? undefined : setInternalGlobalFilter,\n onRowSelectionChange: handleRowSelectionChange,\n onColumnVisibilityChange: setColumnVisibility,\n getCoreRowModel: getCoreRowModel(),\n ...clientRowModels(isManualSorting, isManualFiltering),\n manualSorting: isManualSorting,\n manualFiltering: isManualFiltering,\n manualPagination: opts.pagination !== undefined,\n enableRowSelection: opts.selectable,\n getRowId: opts.getRowId ? (row) => opts.getRowId!(row) : undefined,\n });\n\n const selectedRows = opts.selectable\n ? table.getSelectedRowModel().rows.map((r) => r.original)\n : [];\n\n return { table, tanstackColumns, globalFilter, handleGlobalFilterChange, selectedRows };\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nfunction DataTable<T>({\n columns,\n data,\n searchable = false,\n searchPlaceholder = \"Search...\",\n onRowClick,\n loading = false,\n emptyMessage = \"No results.\",\n toolbar,\n className,\n getRowId,\n pagination,\n globalFilter: externalGlobalFilter,\n onGlobalFilterChange,\n sortingState,\n onSortingChange,\n selectable = false,\n rowSelection,\n onRowSelectionChange,\n bulkActions,\n columnToggle = false,\n exportCsv = false,\n csvFilename = \"export\",\n}: DataTableProps<T>) {\n const { table, tanstackColumns, globalFilter, handleGlobalFilterChange, selectedRows } =\n useDataTable({\n columns,\n data,\n selectable,\n getRowId,\n pagination,\n externalGlobalFilter,\n onGlobalFilterChange,\n externalSorting: sortingState,\n onSortingChange,\n externalRowSelection: rowSelection,\n onRowSelectionChange,\n });\n\n const showToolbar = toolbarShown(\n searchable,\n Boolean(toolbar),\n columnToggle,\n exportCsv,\n selectedRows.length,\n );\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n {showToolbar && (\n <Toolbar\n searchable={searchable}\n searchPlaceholder={searchPlaceholder}\n globalFilter={globalFilter}\n onGlobalFilterChange={handleGlobalFilterChange}\n selectedRows={selectedRows}\n bulkActions={bulkActions}\n toolbar={toolbar}\n exportCsv={exportCsv}\n columns={columns}\n data={data}\n csvFilename={csvFilename}\n columnToggle={columnToggle}\n table={table}\n />\n )}\n <Table>\n <TableHeader className=\"bg-background sticky top-0 z-10\">\n {table.getHeaderGroups().map((hg) => (\n <TableRow key={hg.id}>\n {hg.headers.map((h) => (\n <HeaderCell key={h.id} header={h} />\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n <TableBodyContent\n loading={loading}\n colSpan={tanstackColumns.length}\n emptyMessage={emptyMessage}\n rows={table.getRowModel().rows}\n onRowClick={onRowClick}\n />\n </TableBody>\n </Table>\n <PaginationFooter pagination={pagination} />\n </div>\n );\n}\nDataTable.displayName = \"DataTable\";\n\nexport { DataTable };\nexport type { SortingState, RowSelectionState, VisibilityState };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../src/data-table.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../src/data-table.tsx"],"names":[],"mappings":"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"}
@@ -10,20 +10,14 @@ import {
10
10
  } from "./chunk-XIKSI7NY.js";
11
11
  import {
12
12
  ListPagination
13
- } from "./chunk-KVHOMD4T.js";
14
- import {
15
- alignClass,
16
- ariaSortOf,
17
- bodyViewOf,
18
- csvField
19
- } from "./chunk-IO77MGHW.js";
13
+ } from "./chunk-YJDVFOVR.js";
20
14
  import {
21
15
  Select,
22
16
  SelectContent,
23
17
  SelectItem,
24
18
  SelectTrigger,
25
19
  SelectValue
26
- } from "./chunk-RCUKSVMF.js";
20
+ } from "./chunk-6USFUHWW.js";
27
21
  import {
28
22
  DropdownMenu,
29
23
  DropdownMenuCheckboxItem,
@@ -31,13 +25,26 @@ import {
31
25
  DropdownMenuLabel,
32
26
  DropdownMenuSeparator,
33
27
  DropdownMenuTrigger
34
- } from "./chunk-MOC5N2N4.js";
28
+ } from "./chunk-BSRLAXZ2.js";
35
29
  import {
36
30
  Input
37
31
  } from "./chunk-HXQF6XTL.js";
38
32
  import {
39
33
  Spinner
40
- } from "./chunk-UMNTUD2P.js";
34
+ } from "./chunk-AC3OCGDU.js";
35
+ import {
36
+ alignClassOf,
37
+ ariaSortOf,
38
+ bodySlots,
39
+ bulkBarShown,
40
+ csvField,
41
+ csvText,
42
+ enableHiding,
43
+ enableSorting,
44
+ slotsWhen,
45
+ sortSlotsOf,
46
+ toolbarShown
47
+ } from "./chunk-NSMOT7GD.js";
41
48
  import {
42
49
  Button
43
50
  } from "./chunk-QICSGVX3.js";
@@ -57,9 +64,9 @@ import {
57
64
  } from "@tanstack/react-table";
58
65
  import { cn } from "@simpleapps-com/augur-utils/web";
59
66
  import { LuArrowDown, LuArrowUp, LuArrowUpDown, LuDownload, LuSettings2 } from "react-icons/lu";
60
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
67
+ import { Fragment as Fragment2, jsx, jsxs } from "react/jsx-runtime";
61
68
  function getAlignCn(meta) {
62
- return alignClass(meta?.align ?? "left");
69
+ return alignClassOf(meta?.align);
63
70
  }
64
71
  function buildTanstackColumns(columns, selectable) {
65
72
  const cols = [];
@@ -93,8 +100,8 @@ function buildTanstackColumns(columns, selectable) {
93
100
  id: col.key,
94
101
  accessorKey: col.key,
95
102
  header: col.header,
96
- enableSorting: col.sortable ?? false,
97
- enableHiding: col.hideable !== false,
103
+ enableSorting: enableSorting(col.sortable),
104
+ enableHiding: enableHiding(col.hideable),
98
105
  cell: col.render ? (info) => col.render(info.row.original) : (info) => String(info.getValue() ?? ""),
99
106
  meta: { align: col.align }
100
107
  });
@@ -102,9 +109,9 @@ function buildTanstackColumns(columns, selectable) {
102
109
  return cols;
103
110
  }
104
111
  function exportToCsv(columns, data, filename) {
105
- const headers = columns.map((c) => c.header);
112
+ const headers = columns.map((c) => csvField(c.header));
106
113
  const rows = data.map((row) => columns.map((col) => csvField(String(row[col.key] ?? ""))));
107
- const csv = [headers.join(","), ...rows.map((r) => r.join(","))].join("\n");
114
+ const csv = csvText(headers, rows);
108
115
  const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
109
116
  const url = URL.createObjectURL(blob);
110
117
  const link = document.createElement("a");
@@ -114,9 +121,12 @@ function exportToCsv(columns, data, filename) {
114
121
  URL.revokeObjectURL(url);
115
122
  }
116
123
  function SortIndicator({ direction }) {
117
- if (direction === "asc") return /* @__PURE__ */ jsx(LuArrowUp, { className: "h-4 w-4" });
118
- if (direction === "desc") return /* @__PURE__ */ jsx(LuArrowDown, { className: "h-4 w-4" });
119
- return /* @__PURE__ */ jsx(LuArrowUpDown, { className: "text-muted-foreground/50 h-4 w-4" });
124
+ const slots = sortSlotsOf(direction);
125
+ return /* @__PURE__ */ jsxs(Fragment2, { children: [
126
+ slots.up.map((slot) => /* @__PURE__ */ jsx(LuArrowUp, { className: "h-4 w-4" }, slot)),
127
+ slots.down.map((slot) => /* @__PURE__ */ jsx(LuArrowDown, { className: "h-4 w-4" }, slot)),
128
+ slots.both.map((slot) => /* @__PURE__ */ jsx(LuArrowUpDown, { className: "text-muted-foreground/50 h-4 w-4" }, slot))
129
+ ] });
120
130
  }
121
131
  function ColumnToggle({ table }) {
122
132
  return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
@@ -142,7 +152,8 @@ function ColumnToggle({ table }) {
142
152
  function HeaderCell({ header }) {
143
153
  const canSort = header.column.getCanSort();
144
154
  const sorted = header.column.getIsSorted();
145
- const ariaSort = ariaSortOf(canSort, sorted === false ? "unsorted" : sorted);
155
+ const direction = sorted === false ? "unsorted" : sorted;
156
+ const ariaSort = ariaSortOf(canSort, direction);
146
157
  return /* @__PURE__ */ jsx(TableHead, { className: getAlignCn(header.column.columnDef.meta), "aria-sort": ariaSort, children: canSort ? /* @__PURE__ */ jsxs(
147
158
  "button",
148
159
  {
@@ -151,7 +162,7 @@ function HeaderCell({ header }) {
151
162
  className: "inline-flex cursor-pointer select-none items-center gap-1",
152
163
  children: [
153
164
  flexRender(header.column.columnDef.header, header.getContext()),
154
- /* @__PURE__ */ jsx(SortIndicator, { direction: sorted })
165
+ /* @__PURE__ */ jsx(SortIndicator, { direction })
155
166
  ]
156
167
  }
157
168
  ) : /* @__PURE__ */ jsx("span", { className: "inline-flex items-center gap-1", children: flexRender(header.column.columnDef.header, header.getContext()) }) });
@@ -207,22 +218,29 @@ function Toolbar({
207
218
  columnToggle,
208
219
  table
209
220
  }) {
210
- const hasSelection = selectedRows.length > 0;
211
221
  return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
212
- searchable && /* @__PURE__ */ jsx(
222
+ slotsWhen(searchable).map((slot) => /* @__PURE__ */ jsx(
213
223
  Input,
214
224
  {
215
225
  placeholder: searchPlaceholder,
216
226
  value: globalFilter,
217
227
  onChange: (e) => onGlobalFilterChange(e.target.value),
218
228
  className: "max-w-sm"
219
- }
220
- ),
221
- hasSelection && bulkActions && /* @__PURE__ */ jsx(BulkActionsBar, { selectedRows, bulkActions }),
229
+ },
230
+ slot
231
+ )),
232
+ slotsWhen(bulkBarShown(selectedRows.length, Boolean(bulkActions))).map((slot) => /* @__PURE__ */ jsx(
233
+ BulkActionsBar,
234
+ {
235
+ selectedRows,
236
+ bulkActions
237
+ },
238
+ slot
239
+ )),
222
240
  /* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
223
241
  toolbar,
224
- exportCsv && /* @__PURE__ */ jsx(ExportButton, { columns, data, csvFilename }),
225
- columnToggle && /* @__PURE__ */ jsx(ColumnToggle, { table })
242
+ slotsWhen(exportCsv).map((slot) => /* @__PURE__ */ jsx(ExportButton, { columns, data, csvFilename }, slot)),
243
+ slotsWhen(columnToggle).map((slot) => /* @__PURE__ */ jsx(ColumnToggle, { table }, slot))
226
244
  ] })
227
245
  ] });
228
246
  }
@@ -233,14 +251,12 @@ function TableBodyContent({
233
251
  rows,
234
252
  onRowClick
235
253
  }) {
236
- const view = bodyViewOf(loading, rows.length);
237
- if (view === "loading") {
238
- return /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan, className: "h-24 text-center", children: /* @__PURE__ */ jsx(Spinner, { size: "lg", className: "mx-auto" }) }) });
239
- }
240
- if (view === "empty") {
241
- return /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan, className: "h-24 text-center", children: emptyMessage }) });
242
- }
243
- return /* @__PURE__ */ jsx(Fragment, { children: rows.map((row) => /* @__PURE__ */ jsx(DataRow, { row, onRowClick }, row.id)) });
254
+ const slots = bodySlots(loading, rows.length);
255
+ return /* @__PURE__ */ jsxs(Fragment2, { children: [
256
+ slots.loading.map((slot) => /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan, className: "h-24 text-center", children: /* @__PURE__ */ jsx(Spinner, { size: "lg", className: "mx-auto" }) }) }, slot)),
257
+ slots.empty.map((slot) => /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan, className: "h-24 text-center", children: emptyMessage }) }, slot)),
258
+ slots.rows.map((slot) => /* @__PURE__ */ jsx(React.Fragment, { children: rows.map((row) => /* @__PURE__ */ jsx(DataRow, { row, onRowClick }, row.id)) }, slot))
259
+ ] });
244
260
  }
245
261
  function PageSizeSelector({
246
262
  pageSize,
@@ -335,9 +351,6 @@ function useDataTable(opts) {
335
351
  const selectedRows = opts.selectable ? table.getSelectedRowModel().rows.map((r) => r.original) : [];
336
352
  return { table, tanstackColumns, globalFilter, handleGlobalFilterChange, selectedRows };
337
353
  }
338
- function toolbarVisible(searchable, toolbar, columnToggle, exportCsv, selectedRows) {
339
- return Boolean(searchable || toolbar || columnToggle || exportCsv || selectedRows.length > 0);
340
- }
341
354
  function DataTable({
342
355
  columns,
343
356
  data,
@@ -375,7 +388,13 @@ function DataTable({
375
388
  externalRowSelection: rowSelection,
376
389
  onRowSelectionChange
377
390
  });
378
- const showToolbar = toolbarVisible(searchable, toolbar, columnToggle, exportCsv, selectedRows);
391
+ const showToolbar = toolbarShown(
392
+ searchable,
393
+ Boolean(toolbar),
394
+ columnToggle,
395
+ exportCsv,
396
+ selectedRows.length
397
+ );
379
398
  return /* @__PURE__ */ jsxs("div", { className: cn("space-y-4", className), children: [
380
399
  showToolbar && /* @__PURE__ */ jsx(
381
400
  Toolbar,