@bsol-oss/react-datatable5 7.1.0 → 7.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.
package/dist/index.mjs CHANGED
@@ -1,12 +1,15 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, useDisclosure, Box, Flex, DialogBackdrop, Menu, Text, createRecipeContext, createContext as createContext$1, Pagination, usePaginationContext, HStack, Tag as Tag$1, Grid, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$1, VStack, List, RadioGroup as RadioGroup$1, Slider as Slider$1, For, Input, CheckboxCard as CheckboxCard$1, Group, InputElement, Popover, RadioCard, Field as Field$1, NumberInput, Accordion, Show, CheckboxGroup, Heading, Alert, Center } from '@chakra-ui/react';
2
+ import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Flex, Text, Tag as Tag$1, Input, useDisclosure, DialogBackdrop, Menu, createRecipeContext, createContext as createContext$1, Pagination, usePaginationContext, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$2, VStack, List, CheckboxCard as CheckboxCard$1, Alert, Group, InputElement, Popover, Field as Field$1, NumberInput, Accordion, Show, RadioCard, CheckboxGroup, Heading, Center } from '@chakra-ui/react';
3
3
  import { AiOutlineColumnWidth } from 'react-icons/ai';
4
4
  import * as React from 'react';
5
- import React__default, { createContext, useContext, useEffect, useState, useRef } from 'react';
6
- import { MdFilterAlt, MdOutlineMoveDown, MdOutlineSort, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear, MdArrowUpward, MdArrowDownward, MdOutlineChecklist, MdClose, MdSearch } from 'react-icons/md';
5
+ import React__default, { createContext, useContext, useState, useEffect, useRef, useMemo } from 'react';
6
+ import { MdFilterAlt, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear, MdOutlineChecklist, MdClose, MdSearch } from 'react-icons/md';
7
7
  import { LuX, LuCheck, LuChevronRight, LuChevronDown } from 'react-icons/lu';
8
- import { IoMdEye, IoMdCheckbox } from 'react-icons/io';
8
+ import Dayzed from '@bsol-oss/dayzed-react19';
9
+ import { FaUpDown, FaGripLinesVertical } from 'react-icons/fa6';
9
10
  import { BiDownArrow, BiUpArrow } from 'react-icons/bi';
11
+ import { CgClose } from 'react-icons/cg';
12
+ import { IoMdEye, IoMdCheckbox } from 'react-icons/io';
10
13
  import { HiMiniEllipsisHorizontal, HiChevronLeft, HiChevronRight } from 'react-icons/hi2';
11
14
  import { makeStateUpdater, functionalUpdate, useReactTable, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getPaginationRowModel, flexRender, createColumnHelper } from '@tanstack/react-table';
12
15
  import { rankItem } from '@tanstack/match-sorter-utils';
@@ -15,12 +18,10 @@ import { GrAscend, GrDescend } from 'react-icons/gr';
15
18
  import { useQueryClient, useQuery, QueryClient, QueryClientProvider } from '@tanstack/react-query';
16
19
  import { IoReload } from 'react-icons/io5';
17
20
  import { HiColorSwatch, HiOutlineInformationCircle } from 'react-icons/hi';
18
- import Dayzed from '@bsol-oss/dayzed-react19';
19
- import { FaUpDown, FaGripLinesVertical } from 'react-icons/fa6';
20
- import { CgClose } from 'react-icons/cg';
21
21
  import { monitorForElements, draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
22
22
  import invariant from 'tiny-invariant';
23
23
  import axios from 'axios';
24
+ import { useDebounce } from '@uidotdev/usehooks';
24
25
  import { useFormContext, useForm, FormProvider } from 'react-hook-form';
25
26
  import dayjs from 'dayjs';
26
27
  import { dropTargetForExternal } from '@atlaskit/pragmatic-drag-and-drop/external/adapter';
@@ -31,6 +32,7 @@ const DataTableContext = createContext({
31
32
  table: {},
32
33
  globalFilter: "",
33
34
  setGlobalFilter: () => { },
35
+ type: "client",
34
36
  });
35
37
 
36
38
  const useDataTableContext = () => {
@@ -72,13 +74,363 @@ Dialog.Description;
72
74
  const DialogTrigger = Dialog.Trigger;
73
75
  const DialogActionTrigger = Dialog.ActionTrigger;
74
76
 
77
+ const Radio = React.forwardRef(function Radio(props, ref) {
78
+ const { children, inputProps, rootRef, ...rest } = props;
79
+ return (jsxs(RadioGroup$1.Item, { ref: rootRef, ...rest, children: [jsx(RadioGroup$1.ItemHiddenInput, { ref: ref, ...inputProps }), jsx(RadioGroup$1.ItemIndicator, {}), children && (jsx(RadioGroup$1.ItemText, { children: children }))] }));
80
+ });
81
+ const RadioGroup = RadioGroup$1.Root;
82
+
83
+ const monthNamesFull = [
84
+ "January",
85
+ "February",
86
+ "March",
87
+ "April",
88
+ "May",
89
+ "June",
90
+ "July",
91
+ "August",
92
+ "September",
93
+ "October",
94
+ "November",
95
+ "December",
96
+ ];
97
+ const weekdayNamesShort$1 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
98
+ function Calendar$1({ calendars, getBackProps, getForwardProps, getDateProps, selected = [], firstDayOfWeek = 0, }) {
99
+ const [hoveredDate, setHoveredDate] = useState();
100
+ const onMouseLeave = () => {
101
+ setHoveredDate(undefined);
102
+ };
103
+ const onMouseEnter = (date) => {
104
+ setHoveredDate(date);
105
+ };
106
+ const isInRange = (date) => {
107
+ if (selected.length) {
108
+ const firstSelected = selected[0].getTime();
109
+ if (selected.length === 2) {
110
+ const secondSelected = selected[1].getTime();
111
+ return (firstSelected < date.getTime() && secondSelected > date.getTime());
112
+ }
113
+ else {
114
+ return !!(hoveredDate &&
115
+ ((firstSelected < date.getTime() &&
116
+ hoveredDate.getTime() >= date.getTime()) ||
117
+ (date.getTime() < firstSelected &&
118
+ date.getTime() >= hoveredDate.getTime())));
119
+ }
120
+ }
121
+ return false;
122
+ };
123
+ if (calendars.length) {
124
+ return (jsxs(Grid, { onMouseLeave: onMouseLeave, children: [jsxs(Grid, { templateColumns: "repeat(4, auto)", justifyContent: "center", children: [jsx(Button$1, { variant: "ghost", ...getBackProps({
125
+ calendars,
126
+ offset: 12,
127
+ }), children: "<<" }), jsx(Button$1, { variant: "ghost", ...getBackProps({ calendars }), children: "Back" }), jsx(Button$1, { variant: "ghost", ...getForwardProps({ calendars }), children: "Next" }), jsx(Button$1, { variant: "ghost", ...getForwardProps({
128
+ calendars,
129
+ offset: 12,
130
+ }), children: ">>" })] }), jsx(Grid, { templateColumns: "repeat(2, auto)", justifyContent: "center", gap: 4, children: calendars.map((calendar) => (jsxs(Grid, { gap: 4, children: [jsxs(Grid, { justifyContent: "center", children: [monthNamesFull[calendar.month], " ", calendar.year] }), jsx(Grid, { templateColumns: "repeat(7, auto)", justifyContent: "center", children: [0, 1, 2, 3, 4, 5, 6].map((weekdayNum) => {
131
+ const weekday = (weekdayNum + firstDayOfWeek) % 7;
132
+ return (jsx(Box, { minWidth: "48px", textAlign: "center", children: weekdayNamesShort$1[weekday] }, `${calendar.month}${calendar.year}${weekday}`));
133
+ }) }), jsx(Grid, { templateColumns: "repeat(7, auto)", justifyContent: "center", children: calendar.weeks.map((week, windex) => week.map((dateObj, index) => {
134
+ const key = `${calendar.month}${calendar.year}${windex}${index}`;
135
+ if (!dateObj) {
136
+ return jsx(Box, {}, key);
137
+ }
138
+ const { date, selected, selectable, today } = dateObj;
139
+ const getStyle = ({ selected, unavailable, today, isInRange, }) => {
140
+ if (unavailable) {
141
+ return {
142
+ colorPalette: "gray",
143
+ variant: "solid",
144
+ };
145
+ }
146
+ if (selected) {
147
+ return {
148
+ colorPalette: "blue",
149
+ variant: "solid",
150
+ };
151
+ }
152
+ if (isInRange) {
153
+ return {
154
+ colorPalette: "blue",
155
+ variant: "subtle",
156
+ };
157
+ }
158
+ if (today) {
159
+ return {
160
+ colorPalette: "green",
161
+ variant: "solid",
162
+ };
163
+ }
164
+ return { variant: "ghost" };
165
+ };
166
+ return (jsx(Button$1, { ...getDateProps({
167
+ dateObj,
168
+ onMouseEnter: () => {
169
+ onMouseEnter(date);
170
+ },
171
+ }), ...getStyle({
172
+ selected,
173
+ unavailable: !selectable,
174
+ today,
175
+ isInRange: isInRange(date),
176
+ }), children: selectable ? date.getDate() : "X" }, key));
177
+ })) })] }, `${calendar.month}${calendar.year}`))) })] }));
178
+ }
179
+ return null;
180
+ }
181
+ class RangeDatePicker extends React__default.Component {
182
+ render() {
183
+ return (jsx(Dayzed, { onDateSelected: this.props.onDateSelected, selected: this.props.selected, firstDayOfWeek: this.props.firstDayOfWeek, showOutsideDays: this.props.showOutsideDays, date: this.props.date, minDate: this.props.minDate, maxDate: this.props.maxDate, monthsToDisplay: this.props.monthsToDisplay, render: (dayzedData) => (jsx(Calendar$1, { ...dayzedData,
184
+ firstDayOfWeek: this.props.firstDayOfWeek,
185
+ selected: this.props.selected })) }));
186
+ }
187
+ }
188
+
189
+ const getRangeDates = ({ selectable, date, selectedDates, }) => {
190
+ if (!selectable) {
191
+ return;
192
+ }
193
+ const dateTime = date.getTime();
194
+ const newDates = [...selectedDates];
195
+ if (selectedDates.length) {
196
+ if (selectedDates.length === 1) {
197
+ const firstTime = selectedDates[0].getTime();
198
+ if (firstTime < dateTime) {
199
+ newDates.push(date);
200
+ }
201
+ else {
202
+ newDates.unshift(date);
203
+ }
204
+ return newDates;
205
+ }
206
+ else if (newDates.length === 2) {
207
+ return [date];
208
+ }
209
+ }
210
+ else {
211
+ newDates.push(date);
212
+ return newDates;
213
+ }
214
+ };
215
+
216
+ const Slider = React.forwardRef(function Slider(props, ref) {
217
+ const { marks: marksProp, label, showValue, ...rest } = props;
218
+ const value = props.defaultValue ?? props.value;
219
+ const marks = marksProp?.map((mark) => {
220
+ if (typeof mark === "number")
221
+ return { value: mark, label: undefined };
222
+ return mark;
223
+ });
224
+ const hasMarkLabel = !!marks?.some((mark) => mark.label);
225
+ return (jsxs(Slider$1.Root, { ref: ref, thumbAlignment: "center", ...rest, children: [label && !showValue && (jsx(Slider$1.Label, { children: label })), label && showValue && (jsxs(HStack, { justify: "space-between", children: [jsx(Slider$1.Label, { children: label }), jsx(Slider$1.ValueText, {})] })), jsxs(Slider$1.Control, { "data-has-mark-label": hasMarkLabel || undefined, children: [jsx(Slider$1.Track, { children: jsx(Slider$1.Range, {}) }), jsx(SliderThumbs, { value: value }), jsx(SliderMarks, { marks: marks })] })] }));
226
+ });
227
+ function SliderThumbs(props) {
228
+ const { value } = props;
229
+ return (jsx(For, { each: value, children: (_, index) => (jsx(Slider$1.Thumb, { index: index, children: jsx(Slider$1.HiddenInput, {}) }, index)) }));
230
+ }
231
+ const SliderMarks = React.forwardRef(function SliderMarks(props, ref) {
232
+ const { marks } = props;
233
+ if (!marks?.length)
234
+ return null;
235
+ return (jsx(Slider$1.MarkerGroup, { ref: ref, children: marks.map((mark, index) => {
236
+ const value = typeof mark === "number" ? mark : mark.value;
237
+ const label = typeof mark === "number" ? undefined : mark.label;
238
+ return (jsxs(Slider$1.Marker, { value: value, children: [jsx(Slider$1.MarkerIndicator, {}), label] }, index));
239
+ }) }));
240
+ });
241
+
242
+ const RangeFilter = ({ range, setRange, defaultValue, min, max, step, }) => {
243
+ return (jsxs(Flex, { p: 2, gap: 2, flexFlow: 'column', children: [jsx(Text, { children: `${range[0]} - ${range[1]}` }), jsx(Slider, { width: "full", min: min, max: max, defaultValue: defaultValue, step: step, name: `Selected Range: ${range[0]} - ${range[1]}`,
244
+ // value={field.value}
245
+ onValueChange: (val) => setRange(val.value) })] }));
246
+ };
247
+
248
+ const Tag = React.forwardRef(function Tag(props, ref) {
249
+ const { startElement, endElement, onClose, closable = !!onClose, children, ...rest } = props;
250
+ return (jsxs(Tag$1.Root, { ref: ref, ...rest, children: [startElement && (jsx(Tag$1.StartElement, { children: startElement })), jsx(Tag$1.Label, { children: children }), endElement && (jsx(Tag$1.EndElement, { children: endElement })), closable && (jsx(Tag$1.EndElement, { children: jsx(Tag$1.CloseTrigger, { onClick: onClose }) }))] }));
251
+ });
252
+
253
+ const TagFilter = ({ availableTags, selectedTags, onTagChange, }) => {
254
+ const toggleTag = (tag) => {
255
+ if (selectedTags.includes(tag)) {
256
+ onTagChange(selectedTags.filter((t) => t !== tag));
257
+ }
258
+ else {
259
+ onTagChange([...selectedTags, tag]);
260
+ }
261
+ };
262
+ return (jsx(Flex, { flexFlow: "wrap", p: "0.5rem", gap: "0.5rem", children: availableTags.map((tag) => (jsx(Tag, { variant: selectedTags.includes(tag) ? "solid" : "outline", cursor: "pointer", closable: selectedTags.includes(tag) ? true : undefined, onClick: () => toggleTag(tag), children: tag }))) }));
263
+ };
264
+
265
+ const Filter = ({ column }) => {
266
+ const { filterVariant } = column.columnDef.meta ?? {};
267
+ const displayName = column.columnDef.meta?.displayName ?? column.id;
268
+ const filterOptions = column.columnDef.meta?.filterOptions ?? [];
269
+ if (column.columns.length > 0) {
270
+ return (jsxs(Flex, { flexFlow: "column", gap: 1, children: [jsx(Text, { children: displayName }), jsx(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(20rem, 1fr))", gap: 1, children: column.columns.map((column) => {
271
+ return jsx(Filter, { column: column }, column.id);
272
+ }) }, column.id)] }));
273
+ }
274
+ if (!column.getCanFilter()) {
275
+ return jsx(Fragment, {});
276
+ }
277
+ if (filterVariant === "select") {
278
+ return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(RadioGroup, { value: column.getFilterValue() ? String(column.getFilterValue()) : "", onValueChange: (details) => {
279
+ column.setFilterValue(details.value);
280
+ }, children: jsx(Flex, { flexFlow: "wrap", gap: "0.5rem", children: filterOptions.map((item) => (jsx(Radio, { value: item, children: item }, item))) }) })] }, column.id));
281
+ }
282
+ if (filterVariant === "tag") {
283
+ return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(TagFilter, { availableTags: filterOptions, selectedTags: (column.getFilterValue() ?? []), onTagChange: (tags) => {
284
+ if (tags.length === 0) {
285
+ return column.setFilterValue(undefined);
286
+ }
287
+ column.setFilterValue(tags);
288
+ } })] }, column.id));
289
+ }
290
+ if (filterVariant === "boolean") {
291
+ return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(TagFilter, { availableTags: ["true", "false"], selectedTags: (column.getFilterValue() ?? []), onTagChange: (tags) => {
292
+ if (tags.length === 0) {
293
+ return column.setFilterValue(undefined);
294
+ }
295
+ column.setFilterValue(tags);
296
+ } })] }, column.id));
297
+ }
298
+ if (filterVariant === "range") {
299
+ const filterValue = column.getFilterValue() ?? [
300
+ undefined,
301
+ undefined,
302
+ ];
303
+ const { min, max, step, defaultValue } = column.columnDef.meta
304
+ ?.filterRangeConfig ?? {
305
+ min: 0,
306
+ max: 100,
307
+ step: 1,
308
+ defaultValue: [4, 50],
309
+ };
310
+ return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(RangeFilter, { range: filterValue, setRange: function (value) {
311
+ // throw new Error("Function not implemented.");
312
+ column.setFilterValue(value);
313
+ }, defaultValue: defaultValue, min: min, max: max, step: step })] }, column.id));
314
+ }
315
+ if (filterVariant === "dateRange") {
316
+ const filterValue = column.getFilterValue() ?? [];
317
+ return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(RangeDatePicker, { selected: filterValue, onDateSelected: ({ selected, selectable, date }) => {
318
+ const newDates = getRangeDates({
319
+ selectable,
320
+ date,
321
+ selectedDates: filterValue,
322
+ }) ?? [];
323
+ column.setFilterValue(() => {
324
+ return newDates;
325
+ });
326
+ } })] }, column.id));
327
+ }
328
+ if (filterVariant === "custom") {
329
+ const renderFilter = column.columnDef.meta?.renderFilter;
330
+ if (renderFilter === undefined) {
331
+ throw new Error("renderFilter is undefined");
332
+ }
333
+ return jsx(Fragment, { children: renderFilter(column) });
334
+ }
335
+ return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(Input, { value: column.getFilterValue() ? String(column.getFilterValue()) : "", onChange: (e) => {
336
+ column.setFilterValue(e.target.value);
337
+ } })] }, column.id));
338
+ };
339
+ const TableFilter = () => {
340
+ const { table } = useDataTableContext();
341
+ return (jsx(Fragment, { children: table.getAllColumns().map((column) => {
342
+ return jsx(Filter, { column: column }, column.id);
343
+ }) }));
344
+ };
345
+
346
+ const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
347
+ const { table } = useDataTableContext();
348
+ return (jsx(Button$1, { onClick: () => {
349
+ table.resetColumnFilters();
350
+ }, children: text }));
351
+ };
352
+
75
353
  const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsx(MdFilterAlt, {}), }) => {
76
354
  const filterModal = useDisclosure();
77
- return (jsx(Fragment, { children: jsx(DialogRoot, { size: ["full", "full", "md", "md"], open: filterModal.open, children: jsxs(DialogRoot, { children: [jsx(DialogTrigger, { asChild: true, children: jsxs(Button$1, { as: Box, variant: 'ghost', onClick: filterModal.onOpen, children: [icon, " ", text] }) }), jsxs(DialogContent, { children: [jsx(DialogHeader, { children: jsx(DialogTitle, { children: title }) }), jsx(DialogBody, { children: jsxs(Flex, { flexFlow: "column", gap: "1rem", children: [jsx(TableFilter, {}), jsx(ResetFilteringButton, { text: resetText })] }) }), jsxs(DialogFooter, { children: [jsx(DialogActionTrigger, { asChild: true, children: jsx(Button$1, { onClick: filterModal.onClose, children: closeText }) }), jsx(Button$1, { children: "Save" })] }), jsx(DialogCloseTrigger, {})] })] }) }) }));
355
+ return (jsx(Fragment, { children: jsx(DialogRoot, { size: ["full", "full", "md", "md"], open: filterModal.open, children: jsxs(DialogRoot, { children: [jsx(DialogTrigger, { asChild: true, children: jsxs(Button$1, { as: Box, variant: "ghost", onClick: filterModal.onOpen, children: [icon, " ", text] }) }), jsxs(DialogContent, { children: [jsx(DialogHeader, { children: jsx(DialogTitle, { children: title }) }), jsx(DialogBody, { children: jsxs(Flex, { flexFlow: "column", gap: "1rem", children: [jsx(TableFilter, {}), jsx(ResetFilteringButton, { text: resetText })] }) }), jsxs(DialogFooter, { children: [jsx(DialogActionTrigger, { asChild: true, children: jsx(Button$1, { onClick: filterModal.onClose, children: closeText }) }), jsx(Button$1, { children: "Save" })] }), jsx(DialogCloseTrigger, {})] })] }) }) }));
356
+ };
357
+
358
+ const ColumnOrderChanger = ({ columns }) => {
359
+ const [order, setOrder] = useState([]);
360
+ const [originalOrder, setOriginalOrder] = useState([]);
361
+ const { table } = useDataTableContext();
362
+ const handleChangeOrder = (startIndex, endIndex) => {
363
+ const newOrder = Array.from(order);
364
+ const [removed] = newOrder.splice(startIndex, 1);
365
+ newOrder.splice(endIndex, 0, removed);
366
+ setOrder(newOrder);
367
+ };
368
+ useEffect(() => {
369
+ setOrder(columns);
370
+ }, [columns]);
371
+ useEffect(() => {
372
+ if (originalOrder.length > 0) {
373
+ return;
374
+ }
375
+ if (columns.length <= 0) {
376
+ return;
377
+ }
378
+ setOriginalOrder(columns);
379
+ }, [columns]);
380
+ return (jsxs(Flex, { gap: 2, flexFlow: "column", children: [jsx(Flex, { gap: 2, flexFlow: "column", children: order.map((columnId, index) => (jsxs(Flex, { gap: 2, alignItems: "center", justifyContent: "space-between", children: [jsx(IconButton, { onClick: () => {
381
+ const prevIndex = index - 1;
382
+ if (prevIndex >= 0) {
383
+ handleChangeOrder(index, prevIndex);
384
+ }
385
+ }, disabled: index === 0, "aria-label": "", children: jsx(MdArrowUpward, {}) }), table
386
+ .getAllFlatColumns()
387
+ .filter((column) => {
388
+ return column.id === columnId;
389
+ })
390
+ .map((column) => {
391
+ const displayName = column.columnDef.meta === undefined
392
+ ? column.id
393
+ : column.columnDef.meta.displayName;
394
+ return jsx("span", { children: displayName }, column.id);
395
+ }), jsx(IconButton, { onClick: () => {
396
+ const nextIndex = index + 1;
397
+ if (nextIndex < order.length) {
398
+ handleChangeOrder(index, nextIndex);
399
+ }
400
+ }, disabled: index === order.length - 1, "aria-label": "", children: jsx(MdArrowDownward, {}) })] }, columnId))) }), jsxs(Flex, { gap: "0.25rem", children: [jsx(Button$1, { onClick: () => {
401
+ table.setColumnOrder(order);
402
+ }, children: "Apply" }), jsx(Button$1, { onClick: () => {
403
+ table.setColumnOrder(originalOrder);
404
+ }, children: "Reset" })] })] }));
405
+ };
406
+ const TableOrderer = () => {
407
+ const { table } = useDataTableContext();
408
+ return (jsx(Fragment, { children: jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
409
+ };
410
+
411
+ const EditOrderButton = ({ text, icon = jsx(MdOutlineMoveDown, {}), title = "Change Order", }) => {
412
+ return (jsx(Fragment, { children: jsxs(DialogRoot, { size: "cover", children: [jsx(DialogBackdrop, {}), jsx(DialogTrigger, { asChild: true, children: jsxs(Button$1, { as: Box, variant: "ghost", children: [icon, " ", text] }) }), jsxs(DialogContent, { children: [jsx(DialogCloseTrigger, {}), jsxs(DialogHeader, { children: [jsx(DialogTitle, {}), title] }), jsx(DialogBody, { children: jsx(Flex, { flexFlow: "column", gap: "0.25rem", children: jsx(TableOrderer, {}) }) }), jsx(DialogFooter, {})] })] }) }));
413
+ };
414
+
415
+ const TableSorter = () => {
416
+ const { table } = useDataTableContext();
417
+ return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
418
+ const displayName = header.column.columnDef.meta === undefined
419
+ ? header.column.id
420
+ : header.column.columnDef.meta.displayName;
421
+ return (jsx(Fragment, { children: header.column.getCanSort() && (jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Text, { children: displayName }), jsxs(Button$1, { variant: "ghost", onClick: () => {
422
+ header.column.toggleSorting();
423
+ }, children: [header.column.getIsSorted() === false && jsx(FaUpDown, {}), header.column.getIsSorted() === "asc" && jsx(BiDownArrow, {}), header.column.getIsSorted() === "desc" && jsx(BiUpArrow, {})] }), header.column.getIsSorted() && (jsx(Button$1, { onClick: () => {
424
+ header.column.clearSorting();
425
+ }, children: jsx(CgClose, {}) }))] })) }));
426
+ }) }))) }));
78
427
  };
79
428
 
80
- const EditOrderButton = ({ text, icon = jsx(MdOutlineMoveDown, {}), title = "Change Order", }) => {
81
- return (jsx(Fragment, { children: jsxs(DialogRoot, { size: "cover", children: [jsx(DialogBackdrop, {}), jsx(DialogTrigger, { asChild: true, children: jsxs(Button$1, { as: Box, variant: "ghost", children: [icon, " ", text] }) }), jsxs(DialogContent, { children: [jsx(DialogCloseTrigger, {}), jsxs(DialogHeader, { children: [jsx(DialogTitle, {}), title] }), jsx(DialogBody, { children: jsx(Flex, { flexFlow: "column", gap: "0.25rem", children: jsx(TableOrderer, {}) }) }), jsx(DialogFooter, {})] })] }) }));
429
+ const ResetSortingButton = ({ text = "Reset Sorting", }) => {
430
+ const { table } = useDataTableContext();
431
+ return (jsx(Button$1, { onClick: () => {
432
+ table.resetSorting();
433
+ }, children: text }));
82
434
  };
83
435
 
84
436
  const EditSortingButton = ({ text, icon = jsx(MdOutlineSort, {}), title = "Edit Sorting", }) => {
@@ -129,13 +481,6 @@ const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
129
481
  }, children: pageSize }, `chakra-table-pageSize-${pageSize}`))) })] }) }));
130
482
  };
131
483
 
132
- const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
133
- const { table } = useDataTableContext();
134
- return (jsx(Button$1, { onClick: () => {
135
- table.resetColumnFilters();
136
- }, children: text }));
137
- };
138
-
139
484
  const ResetSelectionButton = ({ text = "Reset Selection", }) => {
140
485
  const { table } = useDataTableContext();
141
486
  return (jsx(Button$1, { onClick: () => {
@@ -143,16 +488,15 @@ const ResetSelectionButton = ({ text = "Reset Selection", }) => {
143
488
  }, children: text }));
144
489
  };
145
490
 
146
- const ResetSortingButton = ({ text = "Reset Sorting", }) => {
147
- const { table } = useDataTableContext();
148
- return (jsx(Button$1, { onClick: () => {
149
- table.resetSorting();
150
- }, children: text }));
151
- };
152
-
153
491
  const RowCountText = () => {
154
- const { table } = useDataTableContext();
155
- return jsx(Text, { children: table.getFilteredRowModel().flatRows.length ?? 0 });
492
+ const { table, type } = useDataTableContext();
493
+ const getCount = () => {
494
+ if (type === "client") {
495
+ return table.getFilteredRowModel().flatRows.length ?? 0;
496
+ }
497
+ return table.getRowCount();
498
+ };
499
+ return jsx(Text, { children: getCount() });
156
500
  };
157
501
 
158
502
  const { withContext } = createRecipeContext({ key: "button" });
@@ -221,17 +565,18 @@ React.forwardRef(function PaginationPageText(props, ref) {
221
565
 
222
566
  // TODO: not working in client side
223
567
  const TablePagination = () => {
224
- const { table } = useDataTableContext();
225
- return (jsx(PaginationRoot, { page: table.getState().pagination.pageIndex + 1, count: table.getFilteredRowModel().flatRows.length ?? 0, pageSize: table.getState().pagination.pageSize, onPageChange: (e) => {
568
+ const { table, type } = useDataTableContext();
569
+ const getCount = () => {
570
+ if (type === "client") {
571
+ return table.getFilteredRowModel().flatRows.length ?? 0;
572
+ }
573
+ return table.getRowCount();
574
+ };
575
+ return (jsx(PaginationRoot, { page: table.getState().pagination.pageIndex + 1, count: getCount(), pageSize: table.getState().pagination.pageSize, onPageChange: (e) => {
226
576
  table.setPageIndex(e.page - 1);
227
577
  }, children: jsxs(HStack, { children: [jsx(PaginationPrevTrigger, {}), jsx(PaginationItems, {}), jsx(PaginationNextTrigger, {})] }) }));
228
578
  };
229
579
 
230
- const Tag = React.forwardRef(function Tag(props, ref) {
231
- const { startElement, endElement, onClose, closable = !!onClose, children, ...rest } = props;
232
- return (jsxs(Tag$1.Root, { ref: ref, ...rest, children: [startElement && (jsx(Tag$1.StartElement, { children: startElement })), jsx(Tag$1.Label, { children: children }), endElement && (jsx(Tag$1.EndElement, { children: endElement })), closable && (jsx(Tag$1.EndElement, { children: jsx(Tag$1.CloseTrigger, { onClick: onClose }) }))] }));
233
- });
234
-
235
580
  const CardHeader = ({ row, imageColumnId = undefined, titleColumnId = undefined, tagColumnId = undefined, tagIcon = undefined, showTag = true, imageProps = {}, }) => {
236
581
  if (!!row.original === false) {
237
582
  return jsx(Fragment, {});
@@ -369,7 +714,7 @@ const fuzzyFilter = (row, columnId, value, addMeta) => {
369
714
  // Return if the item should be filtered in/out
370
715
  return itemRank.passed;
371
716
  };
372
- const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }) => {
717
+ function DataTable({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }) {
373
718
  const table = useReactTable({
374
719
  _features: [DensityFeature],
375
720
  data: data,
@@ -416,24 +761,19 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
416
761
  onDensityChange: setDensity,
417
762
  onColumnVisibilityChange: setColumnVisibility,
418
763
  });
419
- useEffect(() => {
420
- setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
421
- }, [table, setColumnOrder]);
422
- useEffect(() => {
423
- onRowSelect(table.getState().rowSelection, data);
424
- }, [data, onRowSelect, table]);
425
764
  return (jsx(DataTableContext.Provider, { value: {
426
765
  table: { ...table },
427
766
  globalFilter: globalFilter,
428
767
  setGlobalFilter: setGlobalFilter,
768
+ type: "client",
429
769
  }, children: children }));
430
- };
770
+ }
431
771
 
432
772
  const DataTableServerContext = createContext({
433
773
  url: "",
434
774
  });
435
775
 
436
- const DataTableServer = ({ columns, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, children, url, }) => {
776
+ function DataTableServer({ columns, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, children, url, }) {
437
777
  const table = useReactTable({
438
778
  _features: [DensityFeature],
439
779
  data: query.data?.data ?? [],
@@ -485,8 +825,9 @@ const DataTableServer = ({ columns, enableRowSelection = true, enableMultiRowSel
485
825
  table: { ...table },
486
826
  globalFilter,
487
827
  setGlobalFilter,
828
+ type: "server",
488
829
  }, children: jsx(DataTableServerContext.Provider, { value: { url }, children: children }) }));
489
- };
830
+ }
490
831
 
491
832
  const Checkbox = React.forwardRef(function Checkbox(props, ref) {
492
833
  const { icon, children, inputProps, rootRef, ...rest } = props;
@@ -576,8 +917,8 @@ const Tooltip = React.forwardRef(function Tooltip(props, ref) {
576
917
  return (jsxs(Tooltip$1.Root, { ...rest, children: [jsx(Tooltip$1.Trigger, { asChild: true, children: children }), jsx(Portal, { disabled: !portalled, container: portalRef, children: jsx(Tooltip$1.Positioner, { children: jsxs(Tooltip$1.Content, { ref: ref, ...contentProps, children: [showArrow && (jsx(Tooltip$1.Arrow, { children: jsx(Tooltip$1.ArrowTip, {}) })), content] }) }) })] }));
577
918
  });
578
919
 
579
- const TableControls = ({ totalText = "Total:", showFilter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsx(Fragment, {}), showFilterName = false, showFilterTags = false, showReload = false, filterOptions = [], extraItems = jsx(Fragment, {}), loading = false, hasError = false, }) => {
580
- return (jsxs(Grid, { templateRows: "auto 1fr auto", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", justifySelf: "center", alignSelf: "center", gap: "0.5rem", children: [jsxs(Flex, { flexFlow: "column", gap: 2, children: [jsxs(Flex, { justifyContent: "space-between", children: [jsx(Box, { children: jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { content: "An error occurred while fetching data", children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) })), showFilter && (jsxs(Fragment, { children: [jsx(GlobalFilter, {}), jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" })] })), showReload && jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsx(Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
920
+ const TableControls = ({ totalText = "Total:", fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsx(Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, filterOptions = [], extraItems = jsx(Fragment, {}), loading = false, hasError = false, }) => {
921
+ return (jsxs(Grid, { templateRows: "auto 1fr auto", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", justifySelf: "center", alignSelf: "center", gap: "0.5rem", children: [jsxs(Flex, { flexFlow: "column", gap: 2, children: [jsxs(Flex, { justifyContent: "space-between", children: [jsx(Box, { children: jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { content: "An error occurred while fetching data", children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsx(GlobalFilter, {}), showFilter && (jsx(Fragment, { children: jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" }) })), showReload && jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsx(Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
581
922
  return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [column, ":"] }), jsx(FilterOptions, { column: column })] }, column));
582
923
  }) })), showFilterTags && (jsx(Flex, { children: jsx(TableFilterTags, {}) }))] }), jsx(Box, { overflow: "auto", width: "100%", height: "100%", backgroundColor: "gray.50", _dark: {
583
924
  backgroundColor: "gray.900",
@@ -767,317 +1108,53 @@ const ReloadButton = ({ text = "Reload", variant = "icon", }) => {
767
1108
  queryClient.invalidateQueries({ queryKey: [url] });
768
1109
  }, children: [jsx(IoReload, {}), " ", text] }));
769
1110
  };
770
-
771
- const EmptyState = React.forwardRef(function EmptyState(props, ref) {
772
- const { title, description, icon, children, ...rest } = props;
773
- return (jsx(EmptyState$1.Root, { ref: ref, ...rest, children: jsxs(EmptyState$1.Content, { children: [icon && (jsx(EmptyState$1.Indicator, { children: icon })), description ? (jsxs(VStack, { textAlign: "center", children: [jsx(EmptyState$1.Title, { children: title }), jsx(EmptyState$1.Description, { children: description })] })) : (jsx(EmptyState$1.Title, { children: title })), children] }) }));
774
- });
775
-
776
- const EmptyResult = (jsx(EmptyState, { icon: jsx(HiColorSwatch, {}), title: "No results found", description: "Try adjusting your search", children: jsxs(List.Root, { variant: "marker", children: [jsx(List.Item, { children: "Try removing filters" }), jsx(List.Item, { children: "Try different keywords" })] }) }));
777
- const Table = ({ children, emptyComponent = EmptyResult, canResize = true, ...props }) => {
778
- const { table } = useDataTableContext();
779
- if (table.getRowModel().rows.length <= 0) {
780
- return emptyComponent;
781
- }
782
- return (jsx(Table$1.Root, { stickyHeader: true, variant: "outline", width: canResize ? table.getCenterTotalSize() : undefined, ...props, children: children }));
783
- };
784
-
785
- const TableCardContainer = ({ children, variant = "", ...props }) => {
786
- if (variant === "carousel") {
787
- return (jsx(Flex, { overflow: "scroll", gap: "1rem", children: children }));
788
- }
789
- return (jsx(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(20rem, 1fr))", gap: "0.5rem", ...props, children: children }));
790
- };
791
-
792
- const DefaultCardTitle = () => {
793
- return jsx(Fragment, {});
794
- };
795
- const TableCards = ({ isSelectable = false, showDisplayNameOnly = false, renderTitle = DefaultCardTitle, cardBodyProps = {}, }) => {
796
- const { table } = useDataTableContext();
797
- return (jsx(Fragment, { children: table.getRowModel().rows.map((row) => {
798
- return (jsx(Card.Root, { flex: "1 0 20rem", children: jsxs(Card.Body, { display: "flex", flexFlow: "column", gap: "0.5rem", ...cardBodyProps, children: [isSelectable && (jsx(Checkbox, { isChecked: row.getIsSelected(),
799
- disabled: !row.getCanSelect(),
800
- // indeterminate: row.getIsSomeSelected(),
801
- onChange: row.getToggleSelectedHandler() })), renderTitle(row), jsx(Grid, { templateColumns: "auto 1fr", gap: "1rem", children: row.getVisibleCells().map((cell) => {
802
- return (jsxs(Fragment, { children: [jsxs(Box, { children: [showDisplayNameOnly && (jsx(Text, { fontWeight: "bold", children: cell.column.columnDef.meta?.displayName ??
803
- cell.column.id })), !showDisplayNameOnly && (jsx(Fragment, { children: flexRender(cell.column.columnDef.header,
804
- // @ts-expect-error Assuming the CellContext interface is the same as HeaderContext
805
- cell.getContext()) }))] }, `chakra-table-cardcolumnid-${row.id}`), jsx(Box, { justifySelf: "end", children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, `chakra-table-cardcolumn-${row.id}`)] }));
806
- }) })] }) }, `chakra-table-card-${row.id}`));
807
- }) }));
808
- };
809
-
810
- const TableComponent = ({ render = () => {
811
- throw Error("Not Implemented");
812
- }, }) => {
813
- const { table } = useDataTableContext();
814
- return render(table);
815
- };
816
-
817
- const Radio = React.forwardRef(function Radio(props, ref) {
818
- const { children, inputProps, rootRef, ...rest } = props;
819
- return (jsxs(RadioGroup$1.Item, { ref: rootRef, ...rest, children: [jsx(RadioGroup$1.ItemHiddenInput, { ref: ref, ...inputProps }), jsx(RadioGroup$1.ItemIndicator, {}), children && (jsx(RadioGroup$1.ItemText, { children: children }))] }));
820
- });
821
- const RadioGroup = RadioGroup$1.Root;
822
-
823
- const monthNamesFull = [
824
- "January",
825
- "February",
826
- "March",
827
- "April",
828
- "May",
829
- "June",
830
- "July",
831
- "August",
832
- "September",
833
- "October",
834
- "November",
835
- "December",
836
- ];
837
- const weekdayNamesShort$1 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
838
- function Calendar$1({ calendars, getBackProps, getForwardProps, getDateProps, selected = [], firstDayOfWeek = 0, }) {
839
- const [hoveredDate, setHoveredDate] = useState();
840
- const onMouseLeave = () => {
841
- setHoveredDate(undefined);
842
- };
843
- const onMouseEnter = (date) => {
844
- setHoveredDate(date);
845
- };
846
- const isInRange = (date) => {
847
- if (selected.length) {
848
- const firstSelected = selected[0].getTime();
849
- if (selected.length === 2) {
850
- const secondSelected = selected[1].getTime();
851
- return (firstSelected < date.getTime() && secondSelected > date.getTime());
852
- }
853
- else {
854
- return !!(hoveredDate &&
855
- ((firstSelected < date.getTime() &&
856
- hoveredDate.getTime() >= date.getTime()) ||
857
- (date.getTime() < firstSelected &&
858
- date.getTime() >= hoveredDate.getTime())));
859
- }
860
- }
861
- return false;
862
- };
863
- if (calendars.length) {
864
- return (jsxs(Grid, { onMouseLeave: onMouseLeave, children: [jsxs(Grid, { templateColumns: "repeat(4, auto)", justifyContent: "center", children: [jsx(Button$1, { variant: "ghost", ...getBackProps({
865
- calendars,
866
- offset: 12,
867
- }), children: "<<" }), jsx(Button$1, { variant: "ghost", ...getBackProps({ calendars }), children: "Back" }), jsx(Button$1, { variant: "ghost", ...getForwardProps({ calendars }), children: "Next" }), jsx(Button$1, { variant: "ghost", ...getForwardProps({
868
- calendars,
869
- offset: 12,
870
- }), children: ">>" })] }), jsx(Grid, { templateColumns: "repeat(2, auto)", justifyContent: "center", gap: 4, children: calendars.map((calendar) => (jsxs(Grid, { gap: 4, children: [jsxs(Grid, { justifyContent: "center", children: [monthNamesFull[calendar.month], " ", calendar.year] }), jsx(Grid, { templateColumns: "repeat(7, auto)", justifyContent: "center", children: [0, 1, 2, 3, 4, 5, 6].map((weekdayNum) => {
871
- const weekday = (weekdayNum + firstDayOfWeek) % 7;
872
- return (jsx(Box, { minWidth: "48px", textAlign: "center", children: weekdayNamesShort$1[weekday] }, `${calendar.month}${calendar.year}${weekday}`));
873
- }) }), jsx(Grid, { templateColumns: "repeat(7, auto)", justifyContent: "center", children: calendar.weeks.map((week, windex) => week.map((dateObj, index) => {
874
- const key = `${calendar.month}${calendar.year}${windex}${index}`;
875
- if (!dateObj) {
876
- return jsx(Box, {}, key);
877
- }
878
- const { date, selected, selectable, today } = dateObj;
879
- const getStyle = ({ selected, unavailable, today, isInRange, }) => {
880
- if (unavailable) {
881
- return {
882
- colorPalette: "gray",
883
- variant: "solid",
884
- };
885
- }
886
- if (selected) {
887
- return {
888
- colorPalette: "blue",
889
- variant: "solid",
890
- };
891
- }
892
- if (isInRange) {
893
- return {
894
- colorPalette: "blue",
895
- variant: "subtle",
896
- };
897
- }
898
- if (today) {
899
- return {
900
- colorPalette: "green",
901
- variant: "solid",
902
- };
903
- }
904
- return { variant: "ghost" };
905
- };
906
- return (jsx(Button$1, { ...getDateProps({
907
- dateObj,
908
- onMouseEnter: () => {
909
- onMouseEnter(date);
910
- },
911
- }), ...getStyle({
912
- selected,
913
- unavailable: !selectable,
914
- today,
915
- isInRange: isInRange(date),
916
- }), children: selectable ? date.getDate() : "X" }, key));
917
- })) })] }, `${calendar.month}${calendar.year}`))) })] }));
918
- }
919
- return null;
920
- }
921
- class RangeDatePicker extends React__default.Component {
922
- render() {
923
- return (jsx(Dayzed, { onDateSelected: this.props.onDateSelected, selected: this.props.selected, firstDayOfWeek: this.props.firstDayOfWeek, showOutsideDays: this.props.showOutsideDays, date: this.props.date, minDate: this.props.minDate, maxDate: this.props.maxDate, monthsToDisplay: this.props.monthsToDisplay, render: (dayzedData) => (jsx(Calendar$1, { ...dayzedData,
924
- firstDayOfWeek: this.props.firstDayOfWeek,
925
- selected: this.props.selected })) }));
926
- }
927
- }
928
-
929
- const getRangeDates = ({ selectable, date, selectedDates, }) => {
930
- if (!selectable) {
931
- return;
932
- }
933
- const dateTime = date.getTime();
934
- const newDates = [...selectedDates];
935
- if (selectedDates.length) {
936
- if (selectedDates.length === 1) {
937
- const firstTime = selectedDates[0].getTime();
938
- if (firstTime < dateTime) {
939
- newDates.push(date);
940
- }
941
- else {
942
- newDates.unshift(date);
943
- }
944
- return newDates;
945
- }
946
- else if (newDates.length === 2) {
947
- return [date];
948
- }
949
- }
950
- else {
951
- newDates.push(date);
952
- return newDates;
953
- }
954
- };
955
-
956
- const Slider = React.forwardRef(function Slider(props, ref) {
957
- const { marks: marksProp, label, showValue, ...rest } = props;
958
- const value = props.defaultValue ?? props.value;
959
- const marks = marksProp?.map((mark) => {
960
- if (typeof mark === "number")
961
- return { value: mark, label: undefined };
962
- return mark;
963
- });
964
- const hasMarkLabel = !!marks?.some((mark) => mark.label);
965
- return (jsxs(Slider$1.Root, { ref: ref, thumbAlignment: "center", ...rest, children: [label && !showValue && (jsx(Slider$1.Label, { children: label })), label && showValue && (jsxs(HStack, { justify: "space-between", children: [jsx(Slider$1.Label, { children: label }), jsx(Slider$1.ValueText, {})] })), jsxs(Slider$1.Control, { "data-has-mark-label": hasMarkLabel || undefined, children: [jsx(Slider$1.Track, { children: jsx(Slider$1.Range, {}) }), jsx(SliderThumbs, { value: value }), jsx(SliderMarks, { marks: marks })] })] }));
966
- });
967
- function SliderThumbs(props) {
968
- const { value } = props;
969
- return (jsx(For, { each: value, children: (_, index) => (jsx(Slider$1.Thumb, { index: index, children: jsx(Slider$1.HiddenInput, {}) }, index)) }));
970
- }
971
- const SliderMarks = React.forwardRef(function SliderMarks(props, ref) {
972
- const { marks } = props;
973
- if (!marks?.length)
974
- return null;
975
- return (jsx(Slider$1.MarkerGroup, { ref: ref, children: marks.map((mark, index) => {
976
- const value = typeof mark === "number" ? mark : mark.value;
977
- const label = typeof mark === "number" ? undefined : mark.label;
978
- return (jsxs(Slider$1.Marker, { value: value, children: [jsx(Slider$1.MarkerIndicator, {}), label] }, index));
979
- }) }));
1111
+
1112
+ const EmptyState$1 = React.forwardRef(function EmptyState(props, ref) {
1113
+ const { title, description, icon, children, ...rest } = props;
1114
+ return (jsx(EmptyState$2.Root, { ref: ref, ...rest, children: jsxs(EmptyState$2.Content, { children: [icon && (jsx(EmptyState$2.Indicator, { children: icon })), description ? (jsxs(VStack, { textAlign: "center", children: [jsx(EmptyState$2.Title, { children: title }), jsx(EmptyState$2.Description, { children: description })] })) : (jsx(EmptyState$2.Title, { children: title })), children] }) }));
980
1115
  });
981
1116
 
982
- const RangeFilter = ({ range, setRange, defaultValue, min, max, step, }) => {
983
- return (jsxs(Flex, { p: 2, gap: 2, flexFlow: 'column', children: [jsx(Text, { children: `${range[0]} - ${range[1]}` }), jsx(Slider, { width: "full", min: min, max: max, defaultValue: defaultValue, step: step, name: `Selected Range: ${range[0]} - ${range[1]}`,
984
- // value={field.value}
985
- onValueChange: (val) => setRange(val.value) })] }));
1117
+ const EmptyResult = (jsx(EmptyState$1, { icon: jsx(HiColorSwatch, {}), title: "No results found", description: "Try adjusting your search", children: jsxs(List.Root, { variant: "marker", children: [jsx(List.Item, { children: "Try removing filters" }), jsx(List.Item, { children: "Try different keywords" })] }) }));
1118
+ const Table = ({ children, emptyComponent = EmptyResult, canResize = true, ...props }) => {
1119
+ const { table } = useDataTableContext();
1120
+ if (table.getRowModel().rows.length <= 0) {
1121
+ return emptyComponent;
1122
+ }
1123
+ return (jsx(Table$1.Root, { stickyHeader: true, variant: "outline", width: canResize ? table.getCenterTotalSize() : undefined, ...props, children: children }));
986
1124
  };
987
1125
 
988
- const TagFilter = ({ availableTags, selectedTags, onTagChange, }) => {
989
- const toggleTag = (tag) => {
990
- if (selectedTags.includes(tag)) {
991
- onTagChange(selectedTags.filter((t) => t !== tag));
992
- }
993
- else {
994
- onTagChange([...selectedTags, tag]);
995
- }
996
- };
997
- return (jsx(Flex, { flexFlow: "wrap", p: "0.5rem", gap: "0.5rem", children: availableTags.map((tag) => (jsx(Tag, { variant: selectedTags.includes(tag) ? "solid" : "outline", cursor: "pointer", closable: selectedTags.includes(tag) ? true : undefined, onClick: () => toggleTag(tag), children: tag }))) }));
1126
+ const TableCardContainer = ({ children, variant = "", ...props }) => {
1127
+ if (variant === "carousel") {
1128
+ return (jsx(Flex, { overflow: "scroll", gap: "1rem", children: children }));
1129
+ }
1130
+ return (jsx(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(20rem, 1fr))", gap: "0.5rem", ...props, children: children }));
998
1131
  };
999
1132
 
1000
- const Filter = ({ column }) => {
1001
- const { filterVariant } = column.columnDef.meta ?? {};
1002
- const displayName = column.columnDef.meta?.displayName ?? column.id;
1003
- const filterOptions = column.columnDef.meta?.filterOptions ?? [];
1004
- if (column.columns.length > 0) {
1005
- return (jsxs(Flex, { flexFlow: "column", gap: 1, children: [jsx(Text, { children: displayName }), jsx(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(20rem, 1fr))", gap: 1, children: column.columns.map((column) => {
1006
- return jsx(Filter, { column: column }, column.id);
1007
- }) }, column.id)] }));
1008
- }
1009
- if (!column.getCanFilter()) {
1010
- return jsx(Fragment, {});
1011
- }
1012
- if (filterVariant === "select") {
1013
- return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(RadioGroup, { value: column.getFilterValue() ? String(column.getFilterValue()) : "", onValueChange: (details) => {
1014
- column.setFilterValue(details.value);
1015
- }, children: jsx(Flex, { flexFlow: "wrap", gap: "0.5rem", children: filterOptions.map((item) => (jsx(Radio, { value: item, children: item }, item))) }) })] }, column.id));
1016
- }
1017
- if (filterVariant === "tag") {
1018
- return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(TagFilter, { availableTags: filterOptions, selectedTags: (column.getFilterValue() ?? []), onTagChange: (tags) => {
1019
- if (tags.length === 0) {
1020
- return column.setFilterValue(undefined);
1021
- }
1022
- column.setFilterValue(tags);
1023
- } })] }, column.id));
1024
- }
1025
- if (filterVariant === "boolean") {
1026
- return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(TagFilter, { availableTags: ["true", "false"], selectedTags: (column.getFilterValue() ?? []), onTagChange: (tags) => {
1027
- if (tags.length === 0) {
1028
- return column.setFilterValue(undefined);
1029
- }
1030
- column.setFilterValue(tags);
1031
- } })] }, column.id));
1032
- }
1033
- if (filterVariant === "range") {
1034
- const filterValue = column.getFilterValue() ?? [
1035
- undefined,
1036
- undefined,
1037
- ];
1038
- const { min, max, step, defaultValue } = column.columnDef.meta
1039
- ?.filterRangeConfig ?? {
1040
- min: 0,
1041
- max: 100,
1042
- step: 1,
1043
- defaultValue: [4, 50],
1044
- };
1045
- return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(RangeFilter, { range: filterValue, setRange: function (value) {
1046
- // throw new Error("Function not implemented.");
1047
- column.setFilterValue(value);
1048
- }, defaultValue: defaultValue, min: min, max: max, step: step })] }, column.id));
1049
- }
1050
- if (filterVariant === "dateRange") {
1051
- const filterValue = column.getFilterValue() ?? [];
1052
- return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(RangeDatePicker, { selected: filterValue, onDateSelected: ({ selected, selectable, date }) => {
1053
- const newDates = getRangeDates({
1054
- selectable,
1055
- date,
1056
- selectedDates: filterValue,
1057
- }) ?? [];
1058
- column.setFilterValue(() => {
1059
- return newDates;
1060
- });
1061
- } })] }, column.id));
1062
- }
1063
- if (filterVariant === "custom") {
1064
- const renderFilter = column.columnDef.meta?.renderFilter;
1065
- if (renderFilter === undefined) {
1066
- throw new Error("renderFilter is undefined");
1067
- }
1068
- return jsx(Fragment, { children: renderFilter(column) });
1069
- }
1070
- return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(Input, { value: column.getFilterValue() ? String(column.getFilterValue()) : "", onChange: (e) => {
1071
- column.setFilterValue(e.target.value);
1072
- } })] }, column.id));
1133
+ const DefaultCardTitle = () => {
1134
+ return jsx(Fragment, {});
1073
1135
  };
1074
- const TableFilter = () => {
1136
+ const TableCards = ({ isSelectable = false, showDisplayNameOnly = false, renderTitle = DefaultCardTitle, cardBodyProps = {}, }) => {
1075
1137
  const { table } = useDataTableContext();
1076
- return (jsx(Fragment, { children: table.getAllColumns().map((column) => {
1077
- return jsx(Filter, { column: column }, column.id);
1138
+ return (jsx(Fragment, { children: table.getRowModel().rows.map((row) => {
1139
+ return (jsx(Card.Root, { flex: "1 0 20rem", children: jsxs(Card.Body, { display: "flex", flexFlow: "column", gap: "0.5rem", ...cardBodyProps, children: [isSelectable && (jsx(Checkbox, { isChecked: row.getIsSelected(),
1140
+ disabled: !row.getCanSelect(),
1141
+ // indeterminate: row.getIsSomeSelected(),
1142
+ onChange: row.getToggleSelectedHandler() })), renderTitle(row), jsx(Grid, { templateColumns: "auto 1fr", gap: "1rem", children: row.getVisibleCells().map((cell) => {
1143
+ return (jsxs(Fragment, { children: [jsxs(Box, { children: [showDisplayNameOnly && (jsx(Text, { fontWeight: "bold", children: cell.column.columnDef.meta?.displayName ??
1144
+ cell.column.id })), !showDisplayNameOnly && (jsx(Fragment, { children: flexRender(cell.column.columnDef.header,
1145
+ // @ts-expect-error Assuming the CellContext interface is the same as HeaderContext
1146
+ cell.getContext()) }))] }, `chakra-table-cardcolumnid-${row.id}`), jsx(Box, { justifySelf: "end", children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, `chakra-table-cardcolumn-${row.id}`)] }));
1147
+ }) })] }) }, `chakra-table-card-${row.id}`));
1078
1148
  }) }));
1079
1149
  };
1080
1150
 
1151
+ const TableComponent = ({ render = () => {
1152
+ throw Error("Not Implemented");
1153
+ }, }) => {
1154
+ const { table } = useDataTableContext();
1155
+ return render(table);
1156
+ };
1157
+
1081
1158
  const TableFilterTags = () => {
1082
1159
  const { table } = useDataTableContext();
1083
1160
  return (jsx(Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }) => {
@@ -1094,59 +1171,6 @@ const TableLoadingComponent = ({ render, }) => {
1094
1171
  return jsx(Fragment, { children: render(loading) });
1095
1172
  };
1096
1173
 
1097
- const ColumnOrderChanger = ({ columns }) => {
1098
- const [order, setOrder] = useState([]);
1099
- const [originalOrder, setOriginalOrder] = useState([]);
1100
- const { table } = useDataTableContext();
1101
- const handleChangeOrder = (startIndex, endIndex) => {
1102
- const newOrder = Array.from(order);
1103
- const [removed] = newOrder.splice(startIndex, 1);
1104
- newOrder.splice(endIndex, 0, removed);
1105
- setOrder(newOrder);
1106
- };
1107
- useEffect(() => {
1108
- setOrder(columns);
1109
- }, [columns]);
1110
- useEffect(() => {
1111
- if (originalOrder.length > 0) {
1112
- return;
1113
- }
1114
- if (columns.length <= 0) {
1115
- return;
1116
- }
1117
- setOriginalOrder(columns);
1118
- }, [columns]);
1119
- return (jsxs(Flex, { gap: 2, flexFlow: "column", children: [jsx(Flex, { gap: 2, flexFlow: "column", children: order.map((columnId, index) => (jsxs(Flex, { gap: 2, alignItems: "center", justifyContent: "space-between", children: [jsx(IconButton, { onClick: () => {
1120
- const prevIndex = index - 1;
1121
- if (prevIndex >= 0) {
1122
- handleChangeOrder(index, prevIndex);
1123
- }
1124
- }, disabled: index === 0, "aria-label": "", children: jsx(MdArrowUpward, {}) }), table
1125
- .getAllFlatColumns()
1126
- .filter((column) => {
1127
- return column.id === columnId;
1128
- })
1129
- .map((column) => {
1130
- const displayName = column.columnDef.meta === undefined
1131
- ? column.id
1132
- : column.columnDef.meta.displayName;
1133
- return jsx("span", { children: displayName }, column.id);
1134
- }), jsx(IconButton, { onClick: () => {
1135
- const nextIndex = index + 1;
1136
- if (nextIndex < order.length) {
1137
- handleChangeOrder(index, nextIndex);
1138
- }
1139
- }, disabled: index === order.length - 1, "aria-label": "", children: jsx(MdArrowDownward, {}) })] }, columnId))) }), jsxs(Flex, { gap: "0.25rem", children: [jsx(Button$1, { onClick: () => {
1140
- table.setColumnOrder(order);
1141
- }, children: "Apply" }), jsx(Button$1, { onClick: () => {
1142
- table.setColumnOrder(originalOrder);
1143
- }, children: "Reset" })] })] }));
1144
- };
1145
- const TableOrderer = () => {
1146
- const { table } = useDataTableContext();
1147
- return (jsx(Fragment, { children: jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
1148
- };
1149
-
1150
1174
  const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText = "", clearAllText = "", }) => {
1151
1175
  const { table } = useDataTableContext();
1152
1176
  return (jsxs(Fragment, { children: [!!selectAllText === false && (jsx(IconButton, { variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? clearAllText : selectAllText, onClick: (event) => {
@@ -1163,20 +1187,6 @@ const TableSelector = () => {
1163
1187
  }, "aria-label": "reset selection", children: jsx(MdClear, {}) }))] }));
1164
1188
  };
1165
1189
 
1166
- const TableSorter = () => {
1167
- const { table } = useDataTableContext();
1168
- return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
1169
- const displayName = header.column.columnDef.meta === undefined
1170
- ? header.column.id
1171
- : header.column.columnDef.meta.displayName;
1172
- return (jsx(Fragment, { children: header.column.getCanSort() && (jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Text, { children: displayName }), jsxs(Button$1, { variant: "ghost", onClick: () => {
1173
- header.column.toggleSorting();
1174
- }, children: [header.column.getIsSorted() === false && jsx(FaUpDown, {}), header.column.getIsSorted() === "asc" && jsx(BiDownArrow, {}), header.column.getIsSorted() === "desc" && jsx(BiUpArrow, {})] }), header.column.getIsSorted() && (jsx(Button$1, { onClick: () => {
1175
- header.column.clearSorting();
1176
- }, children: jsx(CgClose, {}) }))] })) }));
1177
- }) }))) }));
1178
- };
1179
-
1180
1190
  const CheckboxCard = React.forwardRef(function CheckboxCard(props, ref) {
1181
1191
  const { inputProps, label, description, icon, addon, indicator = jsx(CheckboxCard$1.Indicator, {}), indicatorPlacement = "end", ...rest } = props;
1182
1192
  const hasContent = label || description || icon;
@@ -1378,7 +1388,7 @@ const useDataTableServer = ({ url, default: { sorting: defaultSorting = [], pagi
1378
1388
  searching: globalFilter,
1379
1389
  };
1380
1390
  const query = useQuery({
1381
- queryKey: [url, params],
1391
+ queryKey: [url, JSON.stringify(params)],
1382
1392
  queryFn: () => {
1383
1393
  return axios
1384
1394
  .get(url, {
@@ -1470,6 +1480,18 @@ const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth =
1470
1480
  return columns;
1471
1481
  };
1472
1482
 
1483
+ const EmptyState = ({ title = "No records", description = "Add a new events to get started or refine your search", }) => {
1484
+ const { query } = useDataTableContext();
1485
+ const { data } = query;
1486
+ return (jsx(Fragment, { children: (data ?? { count: 0 }).count <= 0 && (jsx(EmptyState$2.Root, { children: jsxs(EmptyState$2.Content, { children: [jsx(EmptyState$2.Indicator, { children: jsx(HiColorSwatch, {}) }), jsxs(VStack, { textAlign: "center", children: [jsx(EmptyState$2.Title, { children: title }), jsx(EmptyState$2.Description, { children: description })] })] }) })) }));
1487
+ };
1488
+
1489
+ const ErrorAlert = ({ showMessage }) => {
1490
+ const { query } = useDataTableContext();
1491
+ const { isError, error } = query;
1492
+ return (jsx(Fragment, { children: isError && (jsxs(Alert.Root, { status: "error", children: [jsx(Alert.Indicator, {}), jsxs(Alert.Content, { children: [jsx(Alert.Title, { children: error.name }), showMessage && (jsx(Alert.Description, { children: error.message }))] })] })) }));
1493
+ };
1494
+
1473
1495
  const FilterOptions = ({ column }) => {
1474
1496
  const { table } = useDataTableContext();
1475
1497
  const tableColumn = table.getColumn(column);
@@ -1504,8 +1526,16 @@ const InputGroup = React.forwardRef(function InputGroup(props, ref) {
1504
1526
 
1505
1527
  const GlobalFilter = () => {
1506
1528
  const { table } = useDataTableContext();
1529
+ const [searchTerm, setSearchTerm] = useState("");
1530
+ const debouncedSearchTerm = useDebounce(searchTerm, 500);
1531
+ useEffect(() => {
1532
+ const searchHN = async () => {
1533
+ table.setGlobalFilter(debouncedSearchTerm);
1534
+ };
1535
+ searchHN();
1536
+ }, [debouncedSearchTerm]);
1507
1537
  return (jsx(Fragment, { children: jsx(InputGroup, { flex: "1", startElement: jsx(MdSearch, {}), children: jsx(Input, { placeholder: "Outline", variant: "outline", onChange: (e) => {
1508
- table.setGlobalFilter(e.target.value);
1538
+ setSearchTerm(e.target.value);
1509
1539
  } }) }) }));
1510
1540
  };
1511
1541
 
@@ -1539,16 +1569,6 @@ const PopoverRoot = Popover.Root;
1539
1569
  const PopoverBody = Popover.Body;
1540
1570
  const PopoverTrigger = Popover.Trigger;
1541
1571
 
1542
- const RadioCardItem = React.forwardRef(function RadioCardItem(props, ref) {
1543
- const { inputProps, label, description, addon, icon, indicator = jsx(RadioCard.ItemIndicator, {}), indicatorPlacement = "end", ...rest } = props;
1544
- const hasContent = label || description || icon;
1545
- const ContentWrapper = indicator ? RadioCard.ItemContent : React.Fragment;
1546
- return (jsxs(RadioCard.Item, { ...rest, children: [jsx(RadioCard.ItemHiddenInput, { ref: ref, ...inputProps }), jsxs(RadioCard.ItemControl, { children: [indicatorPlacement === "start" && indicator, hasContent && (jsxs(ContentWrapper, { children: [icon, label && jsx(RadioCard.ItemText, { children: label }), description && (jsx(RadioCard.ItemDescription, { children: description })), indicatorPlacement === "inside" && indicator] })), indicatorPlacement === "end" && indicator] }), addon && jsx(RadioCard.ItemAddon, { children: addon })] }));
1547
- });
1548
- const RadioCardRoot = RadioCard.Root;
1549
- RadioCard.Label;
1550
- RadioCard.ItemIndicator;
1551
-
1552
1572
  const Field = React.forwardRef(function Field(props, ref) {
1553
1573
  const { label, children, helperText, errorText, optionalText, ...rest } = props;
1554
1574
  return (jsxs(Field$1.Root, { ref: ref, ...rest, children: [label && (jsxs(Field$1.Label, { children: [label, jsx(Field$1.RequiredIndicator, { fallback: optionalText })] })), children, helperText && (jsx(Field$1.HelperText, { children: helperText })), errorText && (jsx(Field$1.ErrorText, { children: errorText }))] }));
@@ -1608,11 +1628,13 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1608
1628
  if (schema.properties == undefined) {
1609
1629
  throw new Error("schema properties when using DatePicker");
1610
1630
  }
1611
- const { gridColumn, gridRow, title } = schema.properties[column];
1631
+ const { total, showing, close, typeToSearch, showMore } = displayText;
1632
+ const { gridColumn, gridRow, title, renderDisplay } = schema.properties[column];
1612
1633
  const [selectedIds, setSelectedIds] = useState([]);
1613
1634
  const [searchText, setSearchText] = useState();
1614
1635
  const [limit, setLimit] = useState(10);
1615
1636
  const [openSearchResult, setOpenSearchResult] = useState();
1637
+ const [idMap, setIdMap] = useState({});
1616
1638
  const ref = useRef(null);
1617
1639
  const query = useQuery({
1618
1640
  queryKey: [`idpicker`, searchText, in_table, limit],
@@ -1634,68 +1656,70 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1634
1656
  setSearchText(event.target.value);
1635
1657
  setLimit(10);
1636
1658
  };
1637
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1638
- const getItemList = (data) => {
1639
- return data.map((item) => {
1640
- return {
1641
- label: item[display_column],
1642
- key: item[column_ref],
1643
- value: item[column_ref],
1644
- };
1659
+ const ids = (watch(column) ?? []);
1660
+ const newIdMap = useMemo(() => Object.fromEntries(dataList.map((item) => {
1661
+ return [
1662
+ item[column_ref],
1663
+ {
1664
+ ...item,
1665
+ },
1666
+ ];
1667
+ })), [dataList, column_ref]);
1668
+ useEffect(() => {
1669
+ setIdMap((state) => {
1670
+ return { ...state, ...newIdMap };
1645
1671
  });
1646
- };
1647
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1648
- const getIdMap = (data) => {
1649
- return Object.fromEntries(data.map((item) => {
1650
- return [
1651
- item[column_ref],
1652
- {
1653
- ...item,
1654
- },
1655
- ];
1656
- }));
1657
- };
1658
- const getSelectedName = (id) => {
1659
- const selectedItem = getIdMap(dataList)[id];
1660
- if (selectedItem == undefined) {
1661
- return "";
1662
- }
1663
- return selectedItem[display_column];
1664
- };
1665
- if (selectedIds.length >= 1 && isMultiple === false) {
1666
- return (jsx(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, gridColumn,
1667
- gridRow, children: jsx(Tag, { closable: true, onClick: () => {
1668
- setSelectedIds([]);
1669
- setValue(column, "");
1670
- }, children: getSelectedName(selectedIds[0]) }) }));
1671
- }
1672
+ }, [newIdMap]);
1672
1673
  return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
1673
- gridRow, children: [selectedIds.map((id) => {
1674
- return (jsx(Tag, { closable: true, onClick: () => {
1675
- setSelectedIds([]);
1676
- setValue(column, "");
1677
- }, children: getSelectedName(id) }));
1678
- }), jsx(Input, { placeholder: "Type to search", onChange: (event) => {
1679
- onSearchChange(event);
1674
+ gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [selectedIds.map((id) => {
1675
+ const item = idMap[id];
1676
+ if (item === undefined) {
1677
+ return jsx(Fragment, { children: "undefined" });
1678
+ }
1679
+ return (jsx(Tag, { closable: true, onClick: () => {
1680
+ setSelectedIds((state) => state.filter((id) => id != item[column_ref]));
1681
+ setValue(column, ids.filter((id) => id != item[column_ref]));
1682
+ }, children: !!renderDisplay === true
1683
+ ? renderDisplay(item)
1684
+ : item[display_column] }));
1685
+ }), jsx(Tag, { cursor: "pointer", onClick: () => {
1686
+ setOpenSearchResult(true);
1687
+ }, children: "Add" })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: (event) => {
1680
1688
  setOpenSearchResult(true);
1681
- }, autoComplete: "off", ref: ref }), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsxs(RadioCardRoot, { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [isFetching && jsx(Fragment, { children: "isFetching" }), isLoading && jsx(Fragment, { children: "isLoading" }), isPending && jsx(Fragment, { children: "isPending" }), isError && jsx(Fragment, { children: "isError" }), jsx(Text, { children: `Search Result: ${count}, Showing ${limit}` }), jsx(Button, { onClick: async () => {
1682
- setOpenSearchResult(false);
1683
- }, children: "close" }),
1684
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1685
- getItemList(dataList).map((item) => (jsx(RadioCardItem, { label: item.label, description: item.description, value: item.value, onClick: () => {
1686
- const ids = watch(column);
1687
- setSelectedIds((state) => [...state, item.key]);
1688
- setValue(column, [...(ids ?? []), item.key]);
1689
+ }, children: selectedIds[0] ? idMap[selectedIds[0]][display_column] ?? "" : "" })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { children: jsxs(PopoverBody, { children: [jsx(Input, { placeholder: typeToSearch, onChange: (event) => {
1690
+ onSearchChange(event);
1691
+ setOpenSearchResult(true);
1692
+ }, autoComplete: "off", ref: ref }), jsx(PopoverTitle, {}), jsxs(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [isFetching && jsx(Fragment, { children: "isFetching" }), isLoading && jsx(Fragment, { children: "isLoading" }), isPending && jsx(Fragment, { children: "isPending" }), isError && jsx(Fragment, { children: "isError" }), jsx(Text, { children: `${total ?? "Total"} ${count}, ${showing ?? "Showing"} ${limit}` }), jsx(Button, { onClick: async () => {
1689
1693
  setOpenSearchResult(false);
1690
- }, indicator: false }, item.key))), isDirty && (jsxs(Fragment, { children: [dataList.length <= 0 && jsx(Fragment, { children: "Empty Search Result" }), " ", count > dataList.length && (jsx(Fragment, { children: jsx(Button, { onClick: async () => {
1691
- setLimit((limit) => limit + 10);
1692
- await getTableData({
1693
- serverUrl,
1694
- searching: searchText ?? "",
1695
- in_table: in_table,
1696
- limit: limit + 10,
1697
- });
1698
- }, children: "show more" }) }))] }))] })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
1694
+ }, children: close ?? "Close" }), jsx(Flex, { flexFlow: "column wrap", children:
1695
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1696
+ dataList.map((item) => {
1697
+ const selected = ids.some((id) => item[column_ref] === id);
1698
+ return (jsx(Box, { cursor: "pointer", onClick: () => {
1699
+ if (!isMultiple) {
1700
+ setOpenSearchResult(false);
1701
+ setSelectedIds(() => [item[column_ref]]);
1702
+ setValue(column, [item[column_ref]]);
1703
+ return;
1704
+ }
1705
+ const newSet = new Set([
1706
+ ...(ids ?? []),
1707
+ item[column_ref],
1708
+ ]);
1709
+ setSelectedIds(() => [...newSet]);
1710
+ setValue(column, [...newSet]);
1711
+ }, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
1712
+ ? renderDisplay(item)
1713
+ : item[display_column] }));
1714
+ }) }), isDirty && (jsxs(Fragment, { children: [dataList.length <= 0 && jsx(Fragment, { children: "Empty Search Result" }), " "] })), count > dataList.length && (jsx(Fragment, { children: jsx(Button, { onClick: async () => {
1715
+ setLimit((limit) => limit + 10);
1716
+ await getTableData({
1717
+ serverUrl,
1718
+ searching: searchText ?? "",
1719
+ in_table: in_table,
1720
+ limit: limit + 10,
1721
+ });
1722
+ }, children: showMore ?? "Show More" }) }))] })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
1699
1723
  };
1700
1724
 
1701
1725
  const ToggleTip = React.forwardRef(function ToggleTip(props, ref) {
@@ -1903,7 +1927,6 @@ const DatePicker = ({ column }) => {
1903
1927
  }, children: getValues(column) !== undefined
1904
1928
  ? dayjs(getValues(column)).format("YYYY-MM-DD")
1905
1929
  : "" }) }), jsx(PopoverContent, { width: "auto", children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsx(DatePicker$1, { selected: new Date(getValues(column)), onDateSelected: ({ selected, selectable, date }) => {
1906
- console.log(date, selected, selectable, "jasdio");
1907
1930
  setValue(column, dayjs(date).format("YYYY-MM-DD"));
1908
1931
  setOpen(false);
1909
1932
  } })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
@@ -1966,6 +1989,16 @@ const ObjectInput = ({ column }) => {
1966
1989
  }, children: addNew ?? "Add New" }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
1967
1990
  };
1968
1991
 
1992
+ const RadioCardItem = React.forwardRef(function RadioCardItem(props, ref) {
1993
+ const { inputProps, label, description, addon, icon, indicator = jsx(RadioCard.ItemIndicator, {}), indicatorPlacement = "end", ...rest } = props;
1994
+ const hasContent = label || description || icon;
1995
+ const ContentWrapper = indicator ? RadioCard.ItemContent : React.Fragment;
1996
+ return (jsxs(RadioCard.Item, { ...rest, children: [jsx(RadioCard.ItemHiddenInput, { ref: ref, ...inputProps }), jsxs(RadioCard.ItemControl, { children: [indicatorPlacement === "start" && indicator, hasContent && (jsxs(ContentWrapper, { children: [icon, label && jsx(RadioCard.ItemText, { children: label }), description && (jsx(RadioCard.ItemDescription, { children: description })), indicatorPlacement === "inside" && indicator] })), indicatorPlacement === "end" && indicator] }), addon && jsx(RadioCard.ItemAddon, { children: addon })] }));
1997
+ });
1998
+ const RadioCardRoot = RadioCard.Root;
1999
+ RadioCard.Label;
2000
+ RadioCard.ItemIndicator;
2001
+
1969
2002
  const TagPicker = ({ column }) => {
1970
2003
  const { watch, formState: { errors }, setValue, } = useFormContext();
1971
2004
  const { schema, serverUrl } = useSchemaContext();
@@ -2006,7 +2039,7 @@ const TagPicker = ({ column }) => {
2006
2039
  where: [
2007
2040
  {
2008
2041
  id: object_id_column,
2009
- value: [object_id],
2042
+ value: object_id[0],
2010
2043
  },
2011
2044
  ],
2012
2045
  limit: 100,
@@ -2123,6 +2156,65 @@ const FilePicker = ({ column }) => {
2123
2156
  }) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
2124
2157
  };
2125
2158
 
2159
+ const EnumPicker = ({ column, isMultiple = false }) => {
2160
+ const { watch, formState: { errors }, setValue, } = useFormContext();
2161
+ const { schema, serverUrl, displayText } = useSchemaContext();
2162
+ const { fieldRequired } = displayText;
2163
+ const { required } = schema;
2164
+ const isRequired = required?.some((columnId) => columnId === column);
2165
+ if (schema.properties == undefined) {
2166
+ throw new Error("schema properties when using DatePicker");
2167
+ }
2168
+ const { gridColumn, gridRow, title, renderDisplay } = schema.properties[column];
2169
+ const [selectedEnums, setSelectedEnums] = useState([]);
2170
+ const [searchText, setSearchText] = useState();
2171
+ const [limit, setLimit] = useState(10);
2172
+ const [openSearchResult, setOpenSearchResult] = useState();
2173
+ const ref = useRef(null);
2174
+ const watchEnums = (watch(column) ?? []);
2175
+ const properties = (schema.properties[column] ?? {});
2176
+ const dataList = properties.enum ?? [];
2177
+ const count = properties.enum?.length ?? 0;
2178
+ const isDirty = (searchText?.length ?? 0) > 0;
2179
+ const onSearchChange = async (event) => {
2180
+ setSearchText(event.target.value);
2181
+ setLimit(10);
2182
+ };
2183
+ return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
2184
+ gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [selectedEnums.map((enumValue) => {
2185
+ const item = enumValue;
2186
+ if (item === undefined) {
2187
+ return jsx(Fragment, { children: "undefined" });
2188
+ }
2189
+ return (jsx(Tag, { closable: true, onClick: () => {
2190
+ setSelectedEnums((state) => state.filter((id) => id != item));
2191
+ setValue(column, watchEnums.filter((id) => id != item));
2192
+ }, children: !!renderDisplay === true ? renderDisplay(item) : item }));
2193
+ }), jsx(Tag, { cursor: "pointer", onClick: () => {
2194
+ setOpenSearchResult(true);
2195
+ }, children: "Add" })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: (event) => {
2196
+ setOpenSearchResult(true);
2197
+ }, children: selectedEnums[0] })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { children: jsxs(PopoverBody, { children: [jsx(Input, { placeholder: "Type to search", onChange: (event) => {
2198
+ onSearchChange(event);
2199
+ setOpenSearchResult(true);
2200
+ }, autoComplete: "off", ref: ref }), jsx(PopoverTitle, {}), jsxs(Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [jsx(Text, { children: `Search Result: ${count}, Showing ${limit}` }), jsx(Button, { onClick: async () => {
2201
+ setOpenSearchResult(false);
2202
+ }, children: "close" }), jsx(Flex, { flexFlow: "column wrap", children: dataList.map((item) => {
2203
+ const selected = watchEnums.some((enumValue) => item === enumValue);
2204
+ return (jsx(Box, { cursor: "pointer", onClick: () => {
2205
+ if (!isMultiple) {
2206
+ setOpenSearchResult(false);
2207
+ setSelectedEnums(() => [item]);
2208
+ setValue(column, [item]);
2209
+ return;
2210
+ }
2211
+ const newSet = new Set([...(watchEnums ?? []), item]);
2212
+ setSelectedEnums(() => [...newSet]);
2213
+ setValue(column, [...newSet]);
2214
+ }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true ? renderDisplay(item) : item }, `${column}-${item}`));
2215
+ }) }), isDirty && (jsxs(Fragment, { children: [dataList.length <= 0 && jsx(Fragment, { children: "Empty Search Result" }), " "] }))] })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
2216
+ };
2217
+
2126
2218
  const idPickerSanityCheck = (column, in_table, column_ref, display_column) => {
2127
2219
  if (!!in_table == false) {
2128
2220
  throw new Error(`The key in_table does not exist in properties of column ${column}.`);
@@ -2320,6 +2412,9 @@ const FormInternal = () => {
2320
2412
  //@ts-expect-error TODO: add more fields to support form-creation
2321
2413
  const { type, variant, in_table, column_ref, display_column } = values;
2322
2414
  if (type === "string") {
2415
+ if ((values.enum ?? []).length > 0) {
2416
+ return jsx(EnumPicker, { column: key }, `form-${key}`);
2417
+ }
2323
2418
  if (variant === "id-picker") {
2324
2419
  idPickerSanityCheck(column, in_table, column_ref, display_column);
2325
2420
  return (jsx(IdPicker, { column: key, in_table: in_table, column_ref: column_ref, display_column: display_column }, `form-${key}`));
@@ -2395,4 +2490,4 @@ const getMultiDates = ({ selected, selectedDate, selectedDates, selectable, }) =
2395
2490
  }
2396
2491
  };
2397
2492
 
2398
- export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, FilterOptions, Form, GlobalFilter, PageSizeControl, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, widthSanityCheck };
2493
+ export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, EmptyState, ErrorAlert, FilterOptions, Form, GlobalFilter, PageSizeControl, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, widthSanityCheck };