@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.d.ts +24 -7
- package/dist/index.js +578 -481
- package/dist/index.mjs +581 -486
- package/dist/types/components/DataTable/DataTable.d.ts +1 -1
- package/dist/types/components/DataTable/DataTableServer.d.ts +1 -2
- package/dist/types/components/DataTable/TableControls.d.ts +3 -2
- package/dist/types/components/DataTable/TableFilters.d.ts +1 -0
- package/dist/types/components/DataTable/components/EmptyState.d.ts +5 -0
- package/dist/types/components/DataTable/components/ErrorAlert.d.ts +4 -0
- package/dist/types/components/DataTable/context/DataTableContext.d.ts +1 -0
- package/dist/types/components/Form/Form.d.ts +6 -1
- package/dist/types/components/Form/components/EnumPicker.d.ts +5 -0
- package/dist/types/index.d.ts +3 -1
- package/package.json +6 -4
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,
|
|
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,
|
|
6
|
-
import { MdFilterAlt, MdOutlineMoveDown, MdOutlineSort, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear,
|
|
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
|
|
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:
|
|
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
|
|
81
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:",
|
|
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" }) })),
|
|
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$
|
|
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
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
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
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
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
|
|
1001
|
-
|
|
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
|
|
1136
|
+
const TableCards = ({ isSelectable = false, showDisplayNameOnly = false, renderTitle = DefaultCardTitle, cardBodyProps = {}, }) => {
|
|
1075
1137
|
const { table } = useDataTableContext();
|
|
1076
|
-
return (jsx(Fragment, { children: table.
|
|
1077
|
-
return jsx(
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
1638
|
-
const
|
|
1639
|
-
return
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
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
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
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
|
-
},
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
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
|
-
},
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
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: [
|
|
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 };
|