@optimum-intelligence/opti-ui 0.0.0-stage → 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 (193) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +244 -2
  3. package/dist/components/accordion/Accordion.d.ts +17 -0
  4. package/dist/components/accordion/Accordion.js +204 -0
  5. package/dist/components/accordion/Accordion.js.map +1 -0
  6. package/dist/components/alert/Alert.d.ts +18 -0
  7. package/dist/components/alert/Alert.js +164 -0
  8. package/dist/components/alert/Alert.js.map +1 -0
  9. package/dist/components/app-shell/AppShell.d.ts +97 -0
  10. package/dist/components/app-shell/AppShell.js +689 -0
  11. package/dist/components/app-shell/AppShell.js.map +1 -0
  12. package/dist/components/avatar/Avatar.d.ts +21 -0
  13. package/dist/components/avatar/Avatar.js +190 -0
  14. package/dist/components/avatar/Avatar.js.map +1 -0
  15. package/dist/components/badge/Badge.d.ts +16 -0
  16. package/dist/components/badge/Badge.js +94 -0
  17. package/dist/components/badge/Badge.js.map +1 -0
  18. package/dist/components/breadcrumbs/Breadcrumbs.d.ts +18 -0
  19. package/dist/components/breadcrumbs/Breadcrumbs.js +154 -0
  20. package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -0
  21. package/dist/components/button/Button.d.ts +23 -0
  22. package/dist/components/button/Button.js +159 -0
  23. package/dist/components/button/Button.js.map +1 -0
  24. package/dist/components/calendar/Calendar.d.ts +59 -0
  25. package/dist/components/calendar/Calendar.js +709 -0
  26. package/dist/components/calendar/Calendar.js.map +1 -0
  27. package/dist/components/calendar/date-utils.d.ts +32 -0
  28. package/dist/components/calendar/date-utils.js +112 -0
  29. package/dist/components/calendar/date-utils.js.map +1 -0
  30. package/dist/components/card/Card.d.ts +42 -0
  31. package/dist/components/card/Card.js +82 -0
  32. package/dist/components/card/Card.js.map +1 -0
  33. package/dist/components/choice/Choice.d.ts +32 -0
  34. package/dist/components/choice/Choice.js +371 -0
  35. package/dist/components/choice/Choice.js.map +1 -0
  36. package/dist/components/collapsible/Collapsible.d.ts +15 -0
  37. package/dist/components/collapsible/Collapsible.js +155 -0
  38. package/dist/components/collapsible/Collapsible.js.map +1 -0
  39. package/dist/components/combobox/Combobox.d.ts +68 -0
  40. package/dist/components/combobox/Combobox.js +752 -0
  41. package/dist/components/combobox/Combobox.js.map +1 -0
  42. package/dist/components/command-palette/CommandPalette.d.ts +52 -0
  43. package/dist/components/command-palette/CommandPalette.js +328 -0
  44. package/dist/components/command-palette/CommandPalette.js.map +1 -0
  45. package/dist/components/data-table/DataTable.d.ts +73 -0
  46. package/dist/components/data-table/DataTable.js +478 -0
  47. package/dist/components/data-table/DataTable.js.map +1 -0
  48. package/dist/components/data-table/DataTableContent.d.ts +35 -0
  49. package/dist/components/data-table/DataTableContent.js +550 -0
  50. package/dist/components/data-table/DataTableContent.js.map +1 -0
  51. package/dist/components/data-table/DataTableFilters.d.ts +15 -0
  52. package/dist/components/data-table/DataTableFilters.js +284 -0
  53. package/dist/components/data-table/DataTableFilters.js.map +1 -0
  54. package/dist/components/data-table/DataTableRow.d.ts +33 -0
  55. package/dist/components/data-table/DataTableRow.js +552 -0
  56. package/dist/components/data-table/DataTableRow.js.map +1 -0
  57. package/dist/components/data-table/context.d.ts +5 -0
  58. package/dist/components/data-table/context.js +14 -0
  59. package/dist/components/data-table/context.js.map +1 -0
  60. package/dist/components/data-table/layout.d.ts +60 -0
  61. package/dist/components/data-table/layout.js +272 -0
  62. package/dist/components/data-table/layout.js.map +1 -0
  63. package/dist/components/data-table/types.d.ts +319 -0
  64. package/dist/components/data-table/useDataTable.d.ts +9 -0
  65. package/dist/components/data-table/useDataTable.js +666 -0
  66. package/dist/components/data-table/useDataTable.js.map +1 -0
  67. package/dist/components/date-picker/DatePicker.d.ts +50 -0
  68. package/dist/components/date-picker/DatePicker.js +485 -0
  69. package/dist/components/date-picker/DatePicker.js.map +1 -0
  70. package/dist/components/date-picker/DateRangePicker.d.ts +39 -0
  71. package/dist/components/date-picker/DateRangePicker.js +339 -0
  72. package/dist/components/date-picker/DateRangePicker.js.map +1 -0
  73. package/dist/components/date-picker/PickerField.d.ts +38 -0
  74. package/dist/components/date-picker/PickerField.js +238 -0
  75. package/dist/components/date-picker/PickerField.js.map +1 -0
  76. package/dist/components/dialog/Dialog.d.ts +70 -0
  77. package/dist/components/dialog/Dialog.js +354 -0
  78. package/dist/components/dialog/Dialog.js.map +1 -0
  79. package/dist/components/drawer/Drawer.d.ts +39 -0
  80. package/dist/components/drawer/Drawer.js +225 -0
  81. package/dist/components/drawer/Drawer.js.map +1 -0
  82. package/dist/components/empty-state/EmptyState.d.ts +12 -0
  83. package/dist/components/empty-state/EmptyState.js +116 -0
  84. package/dist/components/empty-state/EmptyState.js.map +1 -0
  85. package/dist/components/field/Field.d.ts +36 -0
  86. package/dist/components/field/Field.js +337 -0
  87. package/dist/components/field/Field.js.map +1 -0
  88. package/dist/components/file-upload/FileUpload.d.ts +91 -0
  89. package/dist/components/file-upload/FileUpload.js +714 -0
  90. package/dist/components/file-upload/FileUpload.js.map +1 -0
  91. package/dist/components/input/Input.d.ts +49 -0
  92. package/dist/components/input/Input.js +538 -0
  93. package/dist/components/input/Input.js.map +1 -0
  94. package/dist/components/link/Link.d.ts +17 -0
  95. package/dist/components/link/Link.js +91 -0
  96. package/dist/components/link/Link.js.map +1 -0
  97. package/dist/components/menu/Menu.d.ts +79 -0
  98. package/dist/components/menu/Menu.js +615 -0
  99. package/dist/components/menu/Menu.js.map +1 -0
  100. package/dist/components/number-field/NumberField.d.ts +16 -0
  101. package/dist/components/number-field/NumberField.js +188 -0
  102. package/dist/components/number-field/NumberField.js.map +1 -0
  103. package/dist/components/pagination/Pagination.d.ts +34 -0
  104. package/dist/components/pagination/Pagination.js +244 -0
  105. package/dist/components/pagination/Pagination.js.map +1 -0
  106. package/dist/components/popover/Popover.d.ts +22 -0
  107. package/dist/components/popover/Popover.js +186 -0
  108. package/dist/components/popover/Popover.js.map +1 -0
  109. package/dist/components/preview-card/PreviewCard.d.ts +20 -0
  110. package/dist/components/preview-card/PreviewCard.js +114 -0
  111. package/dist/components/preview-card/PreviewCard.js.map +1 -0
  112. package/dist/components/progress/Progress.d.ts +20 -0
  113. package/dist/components/progress/Progress.js +169 -0
  114. package/dist/components/progress/Progress.js.map +1 -0
  115. package/dist/components/scroll-area/ScrollArea.d.ts +8 -0
  116. package/dist/components/scroll-area/ScrollArea.js +112 -0
  117. package/dist/components/scroll-area/ScrollArea.js.map +1 -0
  118. package/dist/components/search-input/SearchInput.d.ts +14 -0
  119. package/dist/components/search-input/SearchInput.js +114 -0
  120. package/dist/components/search-input/SearchInput.js.map +1 -0
  121. package/dist/components/select/Select.d.ts +66 -0
  122. package/dist/components/select/Select.js +601 -0
  123. package/dist/components/select/Select.js.map +1 -0
  124. package/dist/components/separator/Separator.d.ts +4 -0
  125. package/dist/components/separator/Separator.js +46 -0
  126. package/dist/components/separator/Separator.js.map +1 -0
  127. package/dist/components/skeleton/Skeleton.d.ts +16 -0
  128. package/dist/components/skeleton/Skeleton.js +135 -0
  129. package/dist/components/skeleton/Skeleton.js.map +1 -0
  130. package/dist/components/slider/Slider.d.ts +11 -0
  131. package/dist/components/slider/Slider.js +107 -0
  132. package/dist/components/slider/Slider.js.map +1 -0
  133. package/dist/components/spinner/Spinner.d.ts +9 -0
  134. package/dist/components/spinner/Spinner.js +78 -0
  135. package/dist/components/spinner/Spinner.js.map +1 -0
  136. package/dist/components/stack/Stack.d.ts +23 -0
  137. package/dist/components/stack/Stack.js +79 -0
  138. package/dist/components/stack/Stack.js.map +1 -0
  139. package/dist/components/stat-card/StatCard.d.ts +22 -0
  140. package/dist/components/stat-card/StatCard.js +153 -0
  141. package/dist/components/stat-card/StatCard.js.map +1 -0
  142. package/dist/components/stepper/Stepper.d.ts +30 -0
  143. package/dist/components/stepper/Stepper.js +131 -0
  144. package/dist/components/stepper/Stepper.js.map +1 -0
  145. package/dist/components/table/Table.d.ts +53 -0
  146. package/dist/components/table/Table.js +221 -0
  147. package/dist/components/table/Table.js.map +1 -0
  148. package/dist/components/tabs/Tabs.d.ts +19 -0
  149. package/dist/components/tabs/Tabs.js +183 -0
  150. package/dist/components/tabs/Tabs.js.map +1 -0
  151. package/dist/components/tag/Tag.d.ts +22 -0
  152. package/dist/components/tag/Tag.js +121 -0
  153. package/dist/components/tag/Tag.js.map +1 -0
  154. package/dist/components/toast/Toast.d.ts +34 -0
  155. package/dist/components/toast/Toast.js +187 -0
  156. package/dist/components/toast/Toast.js.map +1 -0
  157. package/dist/components/toggle/Toggle.d.ts +31 -0
  158. package/dist/components/toggle/Toggle.js +197 -0
  159. package/dist/components/toggle/Toggle.js.map +1 -0
  160. package/dist/components/toolbar/Toolbar.d.ts +21 -0
  161. package/dist/components/toolbar/Toolbar.js +239 -0
  162. package/dist/components/toolbar/Toolbar.js.map +1 -0
  163. package/dist/components/tooltip/Tooltip.d.ts +33 -0
  164. package/dist/components/tooltip/Tooltip.js +182 -0
  165. package/dist/components/tooltip/Tooltip.js.map +1 -0
  166. package/dist/components/typography/Typography.d.ts +32 -0
  167. package/dist/components/typography/Typography.js +183 -0
  168. package/dist/components/typography/Typography.js.map +1 -0
  169. package/dist/fonts.css +3 -0
  170. package/dist/icons/index.d.ts +133 -0
  171. package/dist/icons/index.js +182 -0
  172. package/dist/icons/index.js.map +1 -0
  173. package/dist/index.d.ts +55 -0
  174. package/dist/index.js +58 -0
  175. package/dist/opti-ui.css +5692 -0
  176. package/dist/theme/ThemeProvider.d.ts +22 -0
  177. package/dist/theme/ThemeProvider.js +115 -0
  178. package/dist/theme/ThemeProvider.js.map +1 -0
  179. package/dist/theme/index.d.ts +2 -0
  180. package/dist/utils/cx.d.ts +10 -0
  181. package/dist/utils/cx.js +18 -0
  182. package/dist/utils/cx.js.map +1 -0
  183. package/dist/utils/index.d.ts +2 -0
  184. package/dist/utils/portal.d.ts +8 -0
  185. package/dist/utils/portal.js +16 -0
  186. package/dist/utils/portal.js.map +1 -0
  187. package/dist/utils/primitive.d.ts +13 -0
  188. package/dist/utils/primitive.js +61 -0
  189. package/dist/utils/primitive.js.map +1 -0
  190. package/dist/utils/search.d.ts +4 -0
  191. package/dist/utils/search.js +15 -0
  192. package/dist/utils/search.js.map +1 -0
  193. package/package.json +71 -4
@@ -0,0 +1,9 @@
1
+ import type { DataTableColumn, DataTableInstance, UseDataTableOptions } from './types';
2
+ /** The value a column sorts, searches and filters by. */
3
+ export declare function getColumnValue<T>(column: DataTableColumn<T>, row: T): unknown;
4
+ /**
5
+ * State and row processing of a `DataTable`, without any markup. Pass the
6
+ * result to `DataTable.Root` to lay the parts out yourself, or read `rows`,
7
+ * `filterValues` and the rest to drive something else (an export, a chart).
8
+ */
9
+ export declare function useDataTable<T>({ data, columns, mode, total, loading, error, onRetry, getRowId, locale, searchable, search: searchProp, defaultSearch, onSearchChange, searchDebounce, filter, filters: filtersProp, filterValues: filterValuesProp, defaultFilterValues, onFilterValuesChange, sort: sortProp, defaultSort, onSortChange, paginated, page: pageProp, onPageChange, pageSize: pageSizeProp, defaultPageSize, onPageSizeChange, selection: selectionProp, onSelectionChange, onRowClick, rowLabel, rowActions, rowTone, rowProps, onRowSave, onRowDelete, labels, }: UseDataTableOptions<T>): DataTableInstance<T>;
@@ -0,0 +1,666 @@
1
+ "use client";
2
+ import { datePart, pad } from "../calendar/date-utils.js";
3
+ import { normalizeText } from "../../utils/search.js";
4
+ import { c } from "react/compiler-runtime";
5
+ import * as React from "react";
6
+ //#region src/components/data-table/useDataTable.ts
7
+ var defaultLabels = {
8
+ search: "Search…",
9
+ clearSearch: "Clear search",
10
+ selectAll: "Select all",
11
+ selectRow: (label) => `Select ${label}`,
12
+ count: (count) => `${count} ${count === 1 ? "record" : "records"}`,
13
+ selected: (count) => `${count} selected`,
14
+ emptyTitle: "No records yet",
15
+ emptyDescription: "Records will appear here once added.",
16
+ noMatchTitle: "No matching records",
17
+ noMatchDescription: "Try a different search.",
18
+ loading: "Loading",
19
+ errorTitle: "Could not load records",
20
+ retry: "Try again",
21
+ filters: "Filters",
22
+ filterAll: "All",
23
+ clearFilters: "Clear filters",
24
+ actions: "Actions",
25
+ edit: "Edit",
26
+ save: "Save",
27
+ cancel: "Cancel",
28
+ delete: "Delete"
29
+ };
30
+ function useControlled(value, initial, onChange) {
31
+ const $ = c(5);
32
+ const [inner, setInner] = React.useState(initial);
33
+ let t0;
34
+ if ($[0] !== onChange) {
35
+ t0 = (next) => {
36
+ setInner(next);
37
+ onChange?.(next);
38
+ };
39
+ $[0] = onChange;
40
+ $[1] = t0;
41
+ } else t0 = $[1];
42
+ const set = t0;
43
+ const t1 = value === void 0 ? inner : value;
44
+ let t2;
45
+ if ($[2] !== set || $[3] !== t1) {
46
+ t2 = [t1, set];
47
+ $[2] = set;
48
+ $[3] = t1;
49
+ $[4] = t2;
50
+ } else t2 = $[4];
51
+ return t2;
52
+ }
53
+ /** The value a column sorts, searches and filters by. */
54
+ function getColumnValue(column, row) {
55
+ return column.accessor ? column.accessor(row) : row[column.id];
56
+ }
57
+ function isEmpty(value) {
58
+ return value === null || value === void 0 || value === "";
59
+ }
60
+ function hasValue(column) {
61
+ return column.accessor !== void 0 || column.cell === void 0;
62
+ }
63
+ /** A toggle filter without `match` reads the value as a flag; "No", "false" and "0" count as off. */
64
+ function isOn(value) {
65
+ if (typeof value !== "string") return Boolean(value);
66
+ return ![
67
+ "",
68
+ "no",
69
+ "false",
70
+ "0"
71
+ ].includes(value.trim().toLowerCase());
72
+ }
73
+ /** Local calendar day of a row's date, as `"2026-03-09"`. */
74
+ function dayOf(value) {
75
+ if (isEmpty(value)) return null;
76
+ if (typeof value === "string" && datePart(value)) return datePart(value);
77
+ const date = value instanceof Date ? value : new Date(value);
78
+ if (Number.isNaN(date.getTime())) return null;
79
+ return `${pad(date.getFullYear(), 4)}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
80
+ }
81
+ var WORD_CHARACTER = /[\p{L}\p{N}]/u;
82
+ /** True when `term` occurs in `text` as a whole word (or run of words). */
83
+ function hasWord(text, term) {
84
+ for (let from = text.indexOf(term); from !== -1; from = text.indexOf(term, from + 1)) {
85
+ const before = text[from - 1];
86
+ const after = text[from + term.length];
87
+ if (!(before && WORD_CHARACTER.test(before)) && !(after && WORD_CHARACTER.test(after))) return true;
88
+ }
89
+ return false;
90
+ }
91
+ /** Every term has to occur in one of the columns. */
92
+ function matchesTerms(columns, row, terms) {
93
+ const values = columns.map((column) => ({
94
+ exact: column.searchMode === "exact",
95
+ text: normalizeText(getColumnValue(column, row))
96
+ }));
97
+ return terms.every((term) => values.some(({ exact, text }) => exact ? hasWord(text, term) : text.includes(term)));
98
+ }
99
+ function resolveFilter(filter, read, data, collator) {
100
+ const { id, label } = filter;
101
+ if (filter.type === "toggle") {
102
+ const match = filter.match ?? ((row) => isOn(read(row)));
103
+ return {
104
+ id,
105
+ label,
106
+ type: "toggle",
107
+ options: [],
108
+ test: (row) => match(row)
109
+ };
110
+ }
111
+ const get = filter.value ?? read;
112
+ if (filter.type === "dateRange") {
113
+ const { presets, min, max } = filter;
114
+ return {
115
+ id,
116
+ label,
117
+ type: "dateRange",
118
+ options: [],
119
+ presets,
120
+ min,
121
+ max,
122
+ test: (row, value) => {
123
+ const day = dayOf(get(row));
124
+ const range = value;
125
+ return day !== null && day >= range.start && day <= range.end;
126
+ }
127
+ };
128
+ }
129
+ const items = (row) => {
130
+ const value = get(row);
131
+ return (Array.isArray(value) ? value : [value]).filter((item) => !isEmpty(item)).map(String);
132
+ };
133
+ return {
134
+ id,
135
+ label,
136
+ type: "select",
137
+ options: filter.options ?? [...new Set(data.flatMap(items))].sort(collator.compare).map((value) => ({
138
+ value,
139
+ label: value
140
+ })),
141
+ test: (row, value) => items(row).includes(value)
142
+ };
143
+ }
144
+ /**
145
+ * State and row processing of a `DataTable`, without any markup. Pass the
146
+ * result to `DataTable.Root` to lay the parts out yourself, or read `rows`,
147
+ * `filterValues` and the rest to drive something else (an export, a chart).
148
+ */
149
+ function useDataTable(t0) {
150
+ const $ = c(146);
151
+ const { data, columns, mode: t1, total, loading: t2, error, onRetry, getRowId, locale, searchable: t3, search: searchProp, defaultSearch: t4, onSearchChange, searchDebounce, filter, filters: filtersProp, filterValues: filterValuesProp, defaultFilterValues, onFilterValuesChange, sort: sortProp, defaultSort: t5, onSortChange, paginated: t6, page: pageProp, onPageChange, pageSize: pageSizeProp, defaultPageSize: t7, onPageSizeChange, selection: selectionProp, onSelectionChange, onRowClick, rowLabel, rowActions, rowTone, rowProps, onRowSave, onRowDelete, labels } = t0;
152
+ const mode = t1 === void 0 ? "client" : t1;
153
+ const loading = t2 === void 0 ? false : t2;
154
+ const searchable = t3 === void 0 ? true : t3;
155
+ const defaultSearch = t4 === void 0 ? "" : t4;
156
+ const defaultSort = t5 === void 0 ? null : t5;
157
+ const paginated = t6 === void 0 ? true : t6;
158
+ const defaultPageSize = t7 === void 0 ? 10 : t7;
159
+ const [search, setSearchState] = useControlled(searchProp, defaultSearch, onSearchChange);
160
+ let t8;
161
+ if ($[0] !== defaultFilterValues) {
162
+ t8 = defaultFilterValues ?? {};
163
+ $[0] = defaultFilterValues;
164
+ $[1] = t8;
165
+ } else t8 = $[1];
166
+ const [filterValues, setFilterValues] = useControlled(filterValuesProp, t8, onFilterValuesChange);
167
+ const [sort, setSort] = useControlled(sortProp, defaultSort, onSortChange);
168
+ const [page, setPage] = useControlled(pageProp, 1, onPageChange);
169
+ const [pageSize, setPageSizeState] = useControlled(pageSizeProp, defaultPageSize, onPageSizeChange);
170
+ const [edit, setEdit] = React.useState(null);
171
+ const [saving, setSaving] = React.useState(false);
172
+ const server = mode === "server";
173
+ let activeFilters;
174
+ let currentPage;
175
+ let entries;
176
+ let filters;
177
+ let isSortable;
178
+ let matchCount;
179
+ let pageCount;
180
+ let pageRows;
181
+ let query;
182
+ let rows;
183
+ let selected;
184
+ let selection;
185
+ let t9;
186
+ let text;
187
+ if ($[2] !== columns || $[3] !== data || $[4] !== filter || $[5] !== filterValues || $[6] !== filtersProp || $[7] !== getRowId || $[8] !== labels || $[9] !== locale || $[10] !== page || $[11] !== pageSize || $[12] !== paginated || $[13] !== search || $[14] !== selectionProp || $[15] !== server || $[16] !== sort || $[17] !== total) {
188
+ const collator = new Intl.Collator(locale, {
189
+ numeric: true,
190
+ sensitivity: "base"
191
+ });
192
+ const count = labels?.count ?? defaultLabels.count;
193
+ let t10;
194
+ if ($[32] !== count) {
195
+ t10 = (matches, all) => React.createElement(React.Fragment, null, matches, " / ", count(all));
196
+ $[32] = count;
197
+ $[33] = t10;
198
+ } else t10 = $[33];
199
+ const t11 = labels?.noMatchDescription ?? "Try different filters, or clear them.";
200
+ let t12;
201
+ if ($[34] !== labels || $[35] !== t10 || $[36] !== t11) {
202
+ t12 = {
203
+ ...defaultLabels,
204
+ filteredCount: t10,
205
+ noFilterMatchDescription: t11,
206
+ ...labels
207
+ };
208
+ $[34] = labels;
209
+ $[35] = t10;
210
+ $[36] = t11;
211
+ $[37] = t12;
212
+ } else t12 = $[37];
213
+ text = t12;
214
+ filters = [...columns.flatMap((column) => {
215
+ if (!column.filter) return [];
216
+ const config = typeof column.filter === "string" ? { type: column.filter } : column.filter;
217
+ const label = ("label" in config ? config.label : void 0) ?? column.label ?? (typeof column.header === "string" ? column.header : column.id);
218
+ return [resolveFilter({
219
+ ...config,
220
+ id: column.id,
221
+ label
222
+ }, (row) => getColumnValue(column, row), data, collator)];
223
+ }), ...(filtersProp ?? []).map((definition_0) => resolveFilter(definition_0, (row_0) => row_0[definition_0.id], data, collator))];
224
+ activeFilters = filters.filter((t13) => {
225
+ const { id } = t13;
226
+ return filterValues[id] !== void 0;
227
+ });
228
+ let t14;
229
+ if ($[38] !== getRowId) {
230
+ t14 = (row_1, index) => getRowId?.(row_1, index) ?? String(row_1.id ?? index);
231
+ $[38] = getRowId;
232
+ $[39] = t14;
233
+ } else t14 = $[39];
234
+ const idOf = t14;
235
+ let t15;
236
+ if ($[40] !== idOf) {
237
+ t15 = (row_2, index_0) => ({
238
+ row: row_2,
239
+ id: idOf(row_2, index_0)
240
+ });
241
+ $[40] = idOf;
242
+ $[41] = t15;
243
+ } else t15 = $[41];
244
+ entries = data.map(t15);
245
+ rows = entries;
246
+ if (!server && activeFilters.length) rows = rows.filter((t16) => {
247
+ const { row: row_3 } = t16;
248
+ return activeFilters.every((t17) => {
249
+ const { id: id_0, test } = t17;
250
+ return test(row_3, filterValues[id_0]);
251
+ });
252
+ });
253
+ query = search.trim();
254
+ if (!server && query) {
255
+ const searchColumns = columns.filter(_temp);
256
+ const terms = normalizeText(query).split(/\s+/).filter(Boolean);
257
+ rows = rows.filter((t16) => {
258
+ const { row: row_4 } = t16;
259
+ return filter ? filter(row_4, search) : matchesTerms(searchColumns, row_4, terms);
260
+ });
261
+ }
262
+ isSortable = _temp2;
263
+ const sortColumn = sort && columns.find((candidate) => candidate.id === sort.id);
264
+ if (!server && sort && sortColumn) {
265
+ const direction = sort.direction === "asc" ? 1 : -1;
266
+ rows = [...rows].sort((a, b) => {
267
+ if (sortColumn.compare) return direction * sortColumn.compare(a.row, b.row);
268
+ const [av, bv] = [getColumnValue(sortColumn, a.row), getColumnValue(sortColumn, b.row)];
269
+ if (isEmpty(av) || isEmpty(bv)) return Number(isEmpty(av)) - Number(isEmpty(bv));
270
+ if (typeof av === "number" && typeof bv === "number") return direction * (av - bv);
271
+ if (av instanceof Date && bv instanceof Date) return direction * (av.getTime() - bv.getTime());
272
+ if (typeof av === "boolean" && typeof bv === "boolean") return direction * (Number(av) - Number(bv));
273
+ return direction * collator.compare(String(av), String(bv));
274
+ });
275
+ }
276
+ matchCount = server ? total ?? rows.length : rows.length;
277
+ pageCount = Math.max(1, Math.ceil(matchCount / pageSize));
278
+ currentPage = Math.min(Math.max(1, page), pageCount);
279
+ pageRows = paginated && !server ? rows.slice((currentPage - 1) * pageSize, currentPage * pageSize) : rows;
280
+ let t16;
281
+ if ($[42] !== selectionProp) {
282
+ t16 = selectionProp ?? [];
283
+ $[42] = selectionProp;
284
+ $[43] = t16;
285
+ } else t16 = $[43];
286
+ selection = t16;
287
+ let t17;
288
+ if ($[44] !== selection) {
289
+ t17 = new Set(selection);
290
+ $[44] = selection;
291
+ $[45] = t17;
292
+ } else t17 = $[45];
293
+ selected = t17;
294
+ let t18;
295
+ if ($[46] !== selected) {
296
+ t18 = (t19) => {
297
+ const { id: id_1 } = t19;
298
+ return selected.has(id_1);
299
+ };
300
+ $[46] = selected;
301
+ $[47] = t18;
302
+ } else t18 = $[47];
303
+ t9 = rows.filter(t18);
304
+ $[2] = columns;
305
+ $[3] = data;
306
+ $[4] = filter;
307
+ $[5] = filterValues;
308
+ $[6] = filtersProp;
309
+ $[7] = getRowId;
310
+ $[8] = labels;
311
+ $[9] = locale;
312
+ $[10] = page;
313
+ $[11] = pageSize;
314
+ $[12] = paginated;
315
+ $[13] = search;
316
+ $[14] = selectionProp;
317
+ $[15] = server;
318
+ $[16] = sort;
319
+ $[17] = total;
320
+ $[18] = activeFilters;
321
+ $[19] = currentPage;
322
+ $[20] = entries;
323
+ $[21] = filters;
324
+ $[22] = isSortable;
325
+ $[23] = matchCount;
326
+ $[24] = pageCount;
327
+ $[25] = pageRows;
328
+ $[26] = query;
329
+ $[27] = rows;
330
+ $[28] = selected;
331
+ $[29] = selection;
332
+ $[30] = t9;
333
+ $[31] = text;
334
+ } else {
335
+ activeFilters = $[18];
336
+ currentPage = $[19];
337
+ entries = $[20];
338
+ filters = $[21];
339
+ isSortable = $[22];
340
+ matchCount = $[23];
341
+ pageCount = $[24];
342
+ pageRows = $[25];
343
+ query = $[26];
344
+ rows = $[27];
345
+ selected = $[28];
346
+ selection = $[29];
347
+ t9 = $[30];
348
+ text = $[31];
349
+ }
350
+ const selectedInView = t9.length;
351
+ const allSelected = rows.length > 0 && selectedInView === rows.length;
352
+ let t10;
353
+ if ($[48] !== setPage || $[49] !== setSearchState) {
354
+ t10 = (next) => {
355
+ setSearchState(next);
356
+ setPage(1);
357
+ };
358
+ $[48] = setPage;
359
+ $[49] = setSearchState;
360
+ $[50] = t10;
361
+ } else t10 = $[50];
362
+ const setSearch = t10;
363
+ let t11;
364
+ if ($[51] !== setFilterValues || $[52] !== setPage) {
365
+ t11 = (next_0) => {
366
+ setFilterValues(next_0);
367
+ setPage(1);
368
+ };
369
+ $[51] = setFilterValues;
370
+ $[52] = setPage;
371
+ $[53] = t11;
372
+ } else t11 = $[53];
373
+ const changeFilters = t11;
374
+ let t12;
375
+ if ($[54] !== changeFilters || $[55] !== filterValues) {
376
+ t12 = (id_2, value) => {
377
+ const others = Object.entries(filterValues).filter((t13) => {
378
+ const [key] = t13;
379
+ return key !== id_2;
380
+ });
381
+ changeFilters(Object.fromEntries(value === void 0 ? others : [...others, [id_2, value]]));
382
+ };
383
+ $[54] = changeFilters;
384
+ $[55] = filterValues;
385
+ $[56] = t12;
386
+ } else t12 = $[56];
387
+ const setFilterValue = t12;
388
+ let t13;
389
+ if ($[57] !== edit || $[58] !== entries || $[59] !== onRowSave || $[60] !== saving) {
390
+ t13 = () => {
391
+ const entry = edit && entries.find((t14) => {
392
+ const { id: id_3 } = t14;
393
+ return id_3 === edit.id;
394
+ });
395
+ if (!entry || !onRowSave || saving) return;
396
+ setSaving(true);
397
+ Promise.resolve().then(() => onRowSave({
398
+ ...entry.row,
399
+ ...edit.draft
400
+ }, entry.row)).then(() => setEdit(null), _temp3).then(() => setSaving(false));
401
+ };
402
+ $[57] = edit;
403
+ $[58] = entries;
404
+ $[59] = onRowSave;
405
+ $[60] = saving;
406
+ $[61] = t13;
407
+ } else t13 = $[61];
408
+ const saveEdit = t13;
409
+ let t14;
410
+ if ($[62] !== columns) {
411
+ t14 = columns.filter(_temp4);
412
+ $[62] = columns;
413
+ $[63] = t14;
414
+ } else t14 = $[63];
415
+ const t15 = rows;
416
+ const t16 = server ? matchCount : data.length;
417
+ const t17 = Boolean(query) || activeFilters.length > 0;
418
+ let t18;
419
+ if ($[64] !== changeFilters || $[65] !== setSearchState) {
420
+ t18 = () => {
421
+ setSearchState("");
422
+ changeFilters({});
423
+ };
424
+ $[64] = changeFilters;
425
+ $[65] = setSearchState;
426
+ $[66] = t18;
427
+ } else t18 = $[66];
428
+ const t19 = loading && !rows.length && !error;
429
+ const t20 = searchDebounce ?? (server ? 300 : 0);
430
+ let t21;
431
+ if ($[67] !== changeFilters) {
432
+ t21 = () => changeFilters({});
433
+ $[67] = changeFilters;
434
+ $[68] = t21;
435
+ } else t21 = $[68];
436
+ const t22 = activeFilters.length;
437
+ let t23;
438
+ if ($[69] !== setSort || $[70] !== sort) {
439
+ t23 = (id_4) => setSort(sort?.id !== id_4 ? {
440
+ id: id_4,
441
+ direction: "asc"
442
+ } : sort.direction === "asc" ? {
443
+ id: id_4,
444
+ direction: "desc"
445
+ } : null);
446
+ $[69] = setSort;
447
+ $[70] = sort;
448
+ $[71] = t23;
449
+ } else t23 = $[71];
450
+ let t24;
451
+ if ($[72] !== setPage || $[73] !== setPageSizeState) {
452
+ t24 = (size) => {
453
+ setPageSizeState(size);
454
+ setPage(1);
455
+ };
456
+ $[72] = setPage;
457
+ $[73] = setPageSizeState;
458
+ $[74] = t24;
459
+ } else t24 = $[74];
460
+ const t25 = Boolean(onSelectionChange);
461
+ let t26;
462
+ if ($[75] !== selected) {
463
+ t26 = (id_5) => selected.has(id_5);
464
+ $[75] = selected;
465
+ $[76] = t26;
466
+ } else t26 = $[76];
467
+ let t27;
468
+ if ($[77] !== onSelectionChange || $[78] !== selection) {
469
+ t27 = (id_6, checked) => onSelectionChange?.(checked ? [...selection.filter((item) => item !== id_6), id_6] : selection.filter((item_0) => item_0 !== id_6));
470
+ $[77] = onSelectionChange;
471
+ $[78] = selection;
472
+ $[79] = t27;
473
+ } else t27 = $[79];
474
+ let t28;
475
+ if ($[80] !== onSelectionChange || $[81] !== rows || $[82] !== selection) {
476
+ t28 = (checked_0) => {
477
+ const ids = new Set(rows.map(_temp5));
478
+ const kept = selection.filter((id_8) => !ids.has(id_8));
479
+ onSelectionChange?.(checked_0 ? [...kept, ...ids] : kept);
480
+ };
481
+ $[80] = onSelectionChange;
482
+ $[81] = rows;
483
+ $[82] = selection;
484
+ $[83] = t28;
485
+ } else t28 = $[83];
486
+ const t29 = selectedInView > 0 && !allSelected;
487
+ const t30 = Boolean(onRowSave);
488
+ const t31 = Boolean(onRowDelete);
489
+ const t32 = edit?.id ?? null;
490
+ let t33;
491
+ let t34;
492
+ if ($[84] === Symbol.for("react.memo_cache_sentinel")) {
493
+ t33 = (id_9) => setEdit({
494
+ id: id_9,
495
+ draft: {}
496
+ });
497
+ t34 = () => setEdit(null);
498
+ $[84] = t33;
499
+ $[85] = t34;
500
+ } else {
501
+ t33 = $[84];
502
+ t34 = $[85];
503
+ }
504
+ let t35;
505
+ if ($[86] !== edit) {
506
+ t35 = (row_5, field) => edit && field in edit.draft ? edit.draft[field] : row_5[field];
507
+ $[86] = edit;
508
+ $[87] = t35;
509
+ } else t35 = $[87];
510
+ let t36;
511
+ if ($[88] === Symbol.for("react.memo_cache_sentinel")) {
512
+ t36 = (field_0, value_0) => setEdit((current) => current && {
513
+ ...current,
514
+ draft: {
515
+ ...current.draft,
516
+ [field_0]: value_0
517
+ }
518
+ });
519
+ $[88] = t36;
520
+ } else t36 = $[88];
521
+ let t37;
522
+ if ($[89] !== onRowDelete) {
523
+ t37 = (row_6) => {
524
+ onRowDelete?.(row_6);
525
+ setEdit(null);
526
+ };
527
+ $[89] = onRowDelete;
528
+ $[90] = t37;
529
+ } else t37 = $[90];
530
+ let t38;
531
+ if ($[91] !== activeFilters.length || $[92] !== allSelected || $[93] !== columns || $[94] !== currentPage || $[95] !== entries || $[96] !== error || $[97] !== filterValues || $[98] !== filters || $[99] !== isSortable || $[100] !== loading || $[101] !== locale || $[102] !== matchCount || $[103] !== mode || $[104] !== onRetry || $[105] !== onRowClick || $[106] !== pageCount || $[107] !== pageRows || $[108] !== pageSize || $[109] !== paginated || $[110] !== rowActions || $[111] !== rowLabel || $[112] !== rowProps || $[113] !== rowTone || $[114] !== rows || $[115] !== saveEdit || $[116] !== saving || $[117] !== search || $[118] !== searchable || $[119] !== selection || $[120] !== setFilterValue || $[121] !== setPage || $[122] !== setSearch || $[123] !== setSort || $[124] !== sort || $[125] !== t14 || $[126] !== t16 || $[127] !== t17 || $[128] !== t18 || $[129] !== t19 || $[130] !== t20 || $[131] !== t21 || $[132] !== t23 || $[133] !== t24 || $[134] !== t25 || $[135] !== t26 || $[136] !== t27 || $[137] !== t28 || $[138] !== t29 || $[139] !== t30 || $[140] !== t31 || $[141] !== t32 || $[142] !== t35 || $[143] !== t37 || $[144] !== text) {
532
+ t38 = {
533
+ mode,
534
+ columns,
535
+ visibleColumns: t14,
536
+ labels: text,
537
+ locale,
538
+ allRows: entries,
539
+ rows: t15,
540
+ pageRows,
541
+ count: matchCount,
542
+ totalCount: t16,
543
+ filtered: t17,
544
+ reset: t18,
545
+ loading,
546
+ pending: t19,
547
+ error,
548
+ onRetry,
549
+ searchable,
550
+ search,
551
+ setSearch,
552
+ searchDebounce: t20,
553
+ filters,
554
+ filterValues,
555
+ setFilterValue,
556
+ clearFilters: t21,
557
+ activeFilterCount: t22,
558
+ sort,
559
+ setSort,
560
+ toggleSort: t23,
561
+ isSortable,
562
+ paginated,
563
+ page: currentPage,
564
+ pageCount,
565
+ pageSize,
566
+ setPage,
567
+ setPageSize: t24,
568
+ selectable: t25,
569
+ selection,
570
+ isSelected: t26,
571
+ toggleRow: t27,
572
+ toggleAll: t28,
573
+ allSelected,
574
+ someSelected: t29,
575
+ editable: t30,
576
+ deletable: t31,
577
+ editingId: t32,
578
+ saving,
579
+ startEdit: t33,
580
+ cancelEdit: t34,
581
+ editValue: t35,
582
+ setEditValue: t36,
583
+ saveEdit,
584
+ deleteRow: t37,
585
+ onRowClick,
586
+ rowLabel,
587
+ rowActions,
588
+ rowTone,
589
+ rowProps
590
+ };
591
+ $[91] = activeFilters.length;
592
+ $[92] = allSelected;
593
+ $[93] = columns;
594
+ $[94] = currentPage;
595
+ $[95] = entries;
596
+ $[96] = error;
597
+ $[97] = filterValues;
598
+ $[98] = filters;
599
+ $[99] = isSortable;
600
+ $[100] = loading;
601
+ $[101] = locale;
602
+ $[102] = matchCount;
603
+ $[103] = mode;
604
+ $[104] = onRetry;
605
+ $[105] = onRowClick;
606
+ $[106] = pageCount;
607
+ $[107] = pageRows;
608
+ $[108] = pageSize;
609
+ $[109] = paginated;
610
+ $[110] = rowActions;
611
+ $[111] = rowLabel;
612
+ $[112] = rowProps;
613
+ $[113] = rowTone;
614
+ $[114] = rows;
615
+ $[115] = saveEdit;
616
+ $[116] = saving;
617
+ $[117] = search;
618
+ $[118] = searchable;
619
+ $[119] = selection;
620
+ $[120] = setFilterValue;
621
+ $[121] = setPage;
622
+ $[122] = setSearch;
623
+ $[123] = setSort;
624
+ $[124] = sort;
625
+ $[125] = t14;
626
+ $[126] = t16;
627
+ $[127] = t17;
628
+ $[128] = t18;
629
+ $[129] = t19;
630
+ $[130] = t20;
631
+ $[131] = t21;
632
+ $[132] = t23;
633
+ $[133] = t24;
634
+ $[134] = t25;
635
+ $[135] = t26;
636
+ $[136] = t27;
637
+ $[137] = t28;
638
+ $[138] = t29;
639
+ $[139] = t30;
640
+ $[140] = t31;
641
+ $[141] = t32;
642
+ $[142] = t35;
643
+ $[143] = t37;
644
+ $[144] = text;
645
+ $[145] = t38;
646
+ } else t38 = $[145];
647
+ return t38;
648
+ }
649
+ function _temp5(t0) {
650
+ const { id: id_7 } = t0;
651
+ return id_7;
652
+ }
653
+ function _temp4(column_2) {
654
+ return !column_2.hidden;
655
+ }
656
+ function _temp3() {}
657
+ function _temp2(column_1) {
658
+ return column_1.sortable ?? hasValue(column_1);
659
+ }
660
+ function _temp(column_0) {
661
+ return column_0.searchable ?? hasValue(column_0);
662
+ }
663
+ //#endregion
664
+ export { getColumnValue, useDataTable };
665
+
666
+ //# sourceMappingURL=useDataTable.js.map