@bsol-oss/react-datatable5 7.3.3 → 7.3.4

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 CHANGED
@@ -372,7 +372,7 @@ interface DataTableContext<TData> {
372
372
  setGlobalFilter: OnChangeFn<string>;
373
373
  type: "client" | "server";
374
374
  }
375
- declare const DataTableContext: React$1.Context<DataTableContext<any>>;
375
+ declare const DataTableContext: React$1.Context<DataTableContext<unknown>>;
376
376
 
377
377
  declare const useDataTableContext: <TData>() => DataTableContext<TData>;
378
378
 
@@ -389,7 +389,6 @@ declare const widthSanityCheck: <K extends unknown>(widthList: number[], ignoreL
389
389
  declare const getColumns: <TData extends unknown>({ schema, ignore, width, meta, defaultWidth, }: GetColumnsConfigs<TData>) => ColumnDef<TData>[];
390
390
 
391
391
  interface EmptyStateProps {
392
- query: UseQueryResult;
393
392
  title?: string;
394
393
  description?: string;
395
394
  }
package/dist/index.js CHANGED
@@ -1568,7 +1568,6 @@ const SchemaFormContext = React.createContext({
1568
1568
  order: [],
1569
1569
  ignore: [],
1570
1570
  onSubmit: async () => { },
1571
- preLoadedValues: {},
1572
1571
  rowNumber: 0,
1573
1572
  displayText: {},
1574
1573
  });
@@ -1652,12 +1651,12 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1652
1651
  }
1653
1652
  const { total, showing, close, typeToSearch, showMore } = displayText;
1654
1653
  const { gridColumn, gridRow, title, renderDisplay } = schema.properties[column];
1655
- const [selectedIds, setSelectedIds] = React.useState([]);
1656
1654
  const [searchText, setSearchText] = React.useState();
1657
1655
  const [limit, setLimit] = React.useState(10);
1658
1656
  const [openSearchResult, setOpenSearchResult] = React.useState();
1659
1657
  const [idMap, setIdMap] = React.useState({});
1660
1658
  const ref = React.useRef(null);
1659
+ const selectedIds = watch(column) ?? [];
1661
1660
  const query = reactQuery.useQuery({
1662
1661
  queryKey: [`idpicker`, searchText, in_table, limit],
1663
1662
  queryFn: async () => {
@@ -1668,10 +1667,24 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1668
1667
  limit: limit,
1669
1668
  });
1670
1669
  },
1670
+ enabled: (searchText ?? "")?.length > 0,
1671
+ staleTime: 10000,
1672
+ });
1673
+ const idQuery = reactQuery.useQuery({
1674
+ queryKey: [`idpicker`, ...selectedIds],
1675
+ queryFn: async () => {
1676
+ return await getTableData({
1677
+ serverUrl,
1678
+ searching: searchText ?? "",
1679
+ in_table: in_table,
1680
+ limit: limit,
1681
+ });
1682
+ },
1683
+ enabled: (selectedIds ?? []).length > 0,
1671
1684
  staleTime: 10000,
1672
1685
  });
1673
1686
  const { isLoading, isFetching, data, isPending, isError } = query;
1674
- const dataList = data?.data ?? [];
1687
+ const dataList = React.useMemo(() => data?.data ?? [], [data]);
1675
1688
  const count = data?.count ?? 0;
1676
1689
  const isDirty = (searchText?.length ?? 0) > 0;
1677
1690
  const onSearchChange = async (event) => {
@@ -1679,19 +1692,44 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1679
1692
  setLimit(10);
1680
1693
  };
1681
1694
  const ids = (watch(column) ?? []);
1682
- const newIdMap = React.useMemo(() => Object.fromEntries(dataList.map((item) => {
1695
+ const newIdMap = React.useMemo(() => {
1696
+ if (dataList === undefined)
1697
+ return;
1698
+ return Object.fromEntries(dataList.map((item) => {
1699
+ return [
1700
+ item[column_ref],
1701
+ {
1702
+ ...item,
1703
+ },
1704
+ ];
1705
+ }));
1706
+ }, [dataList, column_ref]);
1707
+ const existingIds = React.useMemo(() => Object.fromEntries((idQuery?.data ?? { data: [] }).data.map((item) => {
1683
1708
  return [
1684
1709
  item[column_ref],
1685
1710
  {
1686
1711
  ...item,
1687
1712
  },
1688
1713
  ];
1689
- })), [dataList, column_ref]);
1714
+ })), [idQuery, column_ref]);
1715
+ const getPickedValue = () => {
1716
+ if (selectedIds.length <= 0) {
1717
+ return "";
1718
+ }
1719
+ if (Object.keys(idMap).length <= 0) {
1720
+ return "";
1721
+ }
1722
+ const record = idMap[selectedIds[0]];
1723
+ if (record === undefined) {
1724
+ return "";
1725
+ }
1726
+ return record[display_column];
1727
+ };
1690
1728
  React.useEffect(() => {
1691
1729
  setIdMap((state) => {
1692
- return { ...state, ...newIdMap };
1730
+ return { ...state, ...newIdMap, ...existingIds };
1693
1731
  });
1694
- }, [newIdMap]);
1732
+ }, [newIdMap, existingIds]);
1695
1733
  return (jsxRuntime.jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
1696
1734
  gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [selectedIds.map((id) => {
1697
1735
  const item = idMap[id];
@@ -1699,16 +1737,15 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1699
1737
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: "undefined" });
1700
1738
  }
1701
1739
  return (jsxRuntime.jsx(Tag, { closable: true, onClick: () => {
1702
- setSelectedIds((state) => state.filter((id) => id != item[column_ref]));
1703
1740
  setValue(column, ids.filter((id) => id != item[column_ref]));
1704
1741
  }, children: !!renderDisplay === true
1705
1742
  ? renderDisplay(item)
1706
1743
  : item[display_column] }));
1707
1744
  }), jsxRuntime.jsx(Tag, { cursor: "pointer", onClick: () => {
1708
1745
  setOpenSearchResult(true);
1709
- }, children: "Add" })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: (event) => {
1746
+ }, children: "Add" })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
1710
1747
  setOpenSearchResult(true);
1711
- }, children: selectedIds[0] ? idMap[selectedIds[0]][display_column] ?? "" : "" })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(react.Input, { placeholder: typeToSearch, onChange: (event) => {
1748
+ }, children: getPickedValue() })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(react.Input, { placeholder: typeToSearch, onChange: (event) => {
1712
1749
  onSearchChange(event);
1713
1750
  setOpenSearchResult(true);
1714
1751
  }, autoComplete: "off", ref: ref }), jsxRuntime.jsx(PopoverTitle, {}), jsxRuntime.jsxs(react.Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [isFetching && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isFetching" }), isLoading && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isLoading" }), isPending && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isPending" }), isError && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "isError" }), jsxRuntime.jsx(react.Text, { children: `${total ?? "Total"} ${count}, ${showing ?? "Showing"} ${limit}` }), jsxRuntime.jsx(Button, { onClick: async () => {
@@ -1720,7 +1757,6 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1720
1757
  return (jsxRuntime.jsx(react.Box, { cursor: "pointer", onClick: () => {
1721
1758
  if (!isMultiple) {
1722
1759
  setOpenSearchResult(false);
1723
- setSelectedIds(() => [item[column_ref]]);
1724
1760
  setValue(column, [item[column_ref]]);
1725
1761
  return;
1726
1762
  }
@@ -1728,7 +1764,6 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1728
1764
  ...(ids ?? []),
1729
1765
  item[column_ref],
1730
1766
  ]);
1731
- setSelectedIds(() => [...newSet]);
1732
1767
  setValue(column, [...newSet]);
1733
1768
  }, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
1734
1769
  ? renderDisplay(item)
@@ -1844,21 +1879,18 @@ const AccordionRoot = react.Accordion.Root;
1844
1879
  const AccordionItem = react.Accordion.Item;
1845
1880
 
1846
1881
  const BooleanPicker = ({ column }) => {
1847
- const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
1882
+ const { watch, formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
1848
1883
  const { schema, displayText } = useSchemaContext();
1849
1884
  const { fieldRequired } = displayText;
1850
1885
  const { required } = schema;
1851
1886
  const isRequired = required?.some((columnId) => columnId === column);
1887
+ const value = watch(column);
1852
1888
  if (schema.properties == undefined) {
1853
1889
  throw new Error("schema properties when using BooleanPicker");
1854
1890
  }
1855
1891
  const { gridColumn, gridRow, title } = schema.properties[column];
1856
1892
  return (jsxRuntime.jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
1857
- gridRow, children: [jsxRuntime.jsx(CheckboxCard
1858
- // label={snakeToLabel(column)}
1859
- , {
1860
- // label={snakeToLabel(column)}
1861
- value: getValues(column), variant: "surface", onSelect: () => {
1893
+ gridRow, children: [jsxRuntime.jsx(CheckboxCard, { checked: value, variant: "surface", onSelect: () => {
1862
1894
  setValue(column, !getValues(column));
1863
1895
  } }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
1864
1896
  };
@@ -1933,22 +1965,21 @@ let DatePicker$1 = class DatePicker extends React.Component {
1933
1965
  };
1934
1966
 
1935
1967
  const DatePicker = ({ column }) => {
1936
- const { formState: { errors }, setValue, getValues, } = reactHookForm.useFormContext();
1968
+ const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
1937
1969
  const { schema, displayText } = useSchemaContext();
1938
1970
  const { fieldRequired } = displayText;
1939
1971
  const { required } = schema;
1940
1972
  const isRequired = required?.some((columnId) => columnId === column);
1941
1973
  const [open, setOpen] = React.useState(false);
1974
+ const selectedDate = watch(column);
1942
1975
  if (schema.properties == undefined) {
1943
1976
  throw new Error("schema properties when using DatePicker");
1944
1977
  }
1945
1978
  const { gridColumn, gridRow, title } = schema.properties[column];
1946
1979
  return (jsxRuntime.jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
1947
- gridRow, children: [jsxRuntime.jsxs(PopoverRoot, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, positioning: { sameWidth: true }, children: [jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: jsxRuntime.jsx(Button, { size: "sm", variant: "outline", onClick: () => {
1980
+ gridRow, children: [jsxRuntime.jsxs(PopoverRoot, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: jsxRuntime.jsx(Button, { size: "sm", variant: "outline", onClick: () => {
1948
1981
  setOpen(true);
1949
- }, children: getValues(column) !== undefined
1950
- ? dayjs(getValues(column)).format("YYYY-MM-DD")
1951
- : "" }) }), jsxRuntime.jsx(PopoverContent, { width: "auto", children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(PopoverTitle, {}), jsxRuntime.jsx(DatePicker$1, { selected: new Date(getValues(column)), onDateSelected: ({ selected, selectable, date }) => {
1982
+ }, children: selectedDate !== undefined ? selectedDate : "" }) }), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(PopoverTitle, {}), jsxRuntime.jsx(DatePicker$1, { selected: new Date(selectedDate), onDateSelected: ({ selected, selectable, date }) => {
1952
1983
  setValue(column, dayjs(date).format("YYYY-MM-DD"));
1953
1984
  setOpen(false);
1954
1985
  } })] }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
@@ -2180,7 +2211,7 @@ const FilePicker = ({ column }) => {
2180
2211
 
2181
2212
  const EnumPicker = ({ column, isMultiple = false }) => {
2182
2213
  const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
2183
- const { schema, serverUrl, displayText } = useSchemaContext();
2214
+ const { schema, displayText } = useSchemaContext();
2184
2215
  const { fieldRequired } = displayText;
2185
2216
  const { required } = schema;
2186
2217
  const isRequired = required?.some((columnId) => columnId === column);
@@ -2188,7 +2219,6 @@ const EnumPicker = ({ column, isMultiple = false }) => {
2188
2219
  throw new Error("schema properties when using DatePicker");
2189
2220
  }
2190
2221
  const { gridColumn, gridRow, title, renderDisplay } = schema.properties[column];
2191
- const [selectedEnums, setSelectedEnums] = React.useState([]);
2192
2222
  const [searchText, setSearchText] = React.useState();
2193
2223
  const [limit, setLimit] = React.useState(10);
2194
2224
  const [openSearchResult, setOpenSearchResult] = React.useState();
@@ -2203,7 +2233,7 @@ const EnumPicker = ({ column, isMultiple = false }) => {
2203
2233
  setLimit(10);
2204
2234
  };
2205
2235
  return (jsxRuntime.jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
2206
- gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [selectedEnums.map((enumValue) => {
2236
+ gridRow, children: [isMultiple && (jsxRuntime.jsxs(react.Flex, { flexFlow: "wrap", gap: 1, children: [watchEnums.map((enumValue) => {
2207
2237
  const item = enumValue;
2208
2238
  if (item === undefined) {
2209
2239
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: "undefined" });
@@ -2214,9 +2244,9 @@ const EnumPicker = ({ column, isMultiple = false }) => {
2214
2244
  }, children: !!renderDisplay === true ? renderDisplay(item) : item }));
2215
2245
  }), jsxRuntime.jsx(Tag, { cursor: "pointer", onClick: () => {
2216
2246
  setOpenSearchResult(true);
2217
- }, children: "Add" })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: (event) => {
2247
+ }, children: "Add" })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
2218
2248
  setOpenSearchResult(true);
2219
- }, children: selectedEnums[0] })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(react.Input, { placeholder: "Type to search", onChange: (event) => {
2249
+ }, children: watchEnums[0] })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { children: jsxRuntime.jsxs(PopoverBody, { children: [jsxRuntime.jsx(react.Input, { placeholder: "Type to search", onChange: (event) => {
2220
2250
  onSearchChange(event);
2221
2251
  setOpenSearchResult(true);
2222
2252
  }, autoComplete: "off", ref: ref }), jsxRuntime.jsx(PopoverTitle, {}), jsxRuntime.jsxs(react.Grid, { gridTemplateColumns: "repeat(auto-fit, minmax(15rem, 1fr))", overflow: "auto", maxHeight: "50vh", children: [jsxRuntime.jsx(react.Text, { children: `Search Result: ${count}, Showing ${limit}` }), jsxRuntime.jsx(Button, { onClick: async () => {
@@ -2226,12 +2256,10 @@ const EnumPicker = ({ column, isMultiple = false }) => {
2226
2256
  return (jsxRuntime.jsx(react.Box, { cursor: "pointer", onClick: () => {
2227
2257
  if (!isMultiple) {
2228
2258
  setOpenSearchResult(false);
2229
- setSelectedEnums(() => [item]);
2230
2259
  setValue(column, [item]);
2231
2260
  return;
2232
2261
  }
2233
2262
  const newSet = new Set([...(watchEnums ?? []), item]);
2234
- setSelectedEnums(() => [...newSet]);
2235
2263
  setValue(column, [...newSet]);
2236
2264
  }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true ? renderDisplay(item) : item }, `${column}-${item}`));
2237
2265
  }) }), isDirty && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [dataList.length <= 0 && jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Empty Search Result" }), " "] }))] })] }) })] }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
@@ -2249,7 +2277,7 @@ const idPickerSanityCheck = (column, in_table, column_ref, display_column) => {
2249
2277
  }
2250
2278
  };
2251
2279
  const FormInternal = () => {
2252
- const { schema, serverUrl, displayText, order, ignore, onSubmit, preLoadedValues, rowNumber, } = useSchemaContext();
2280
+ const { schema, serverUrl, displayText, order, ignore, onSubmit, rowNumber } = useSchemaContext();
2253
2281
  const { title, submit, empty, cancel, submitSuccess, submitAgain, confirm } = displayText;
2254
2282
  const methods = reactHookForm.useFormContext();
2255
2283
  const [isSuccess, setIsSuccess] = React.useState(false);
@@ -2328,14 +2356,6 @@ const FormInternal = () => {
2328
2356
  value: value,
2329
2357
  };
2330
2358
  };
2331
- React.useEffect(() => {
2332
- const loadData = () => {
2333
- Object.entries(preLoadedValues).map(([column, value]) => {
2334
- methods.setValue(column, value);
2335
- });
2336
- };
2337
- loadData();
2338
- }, [preLoadedValues, methods]);
2339
2359
  if (isSuccess) {
2340
2360
  return (jsxRuntime.jsxs(react.Grid, { gap: 2, children: [jsxRuntime.jsx(react.Heading, { children: title ?? snakeToLabel(schema.title ?? "") }), jsxRuntime.jsxs(react.Alert.Root, { status: "success", children: [jsxRuntime.jsx(react.Alert.Indicator, {}), jsxRuntime.jsx(react.Alert.Title, { children: submitSuccess ?? "Data uploaded to the server. Fire on!" })] }), jsxRuntime.jsx(Button, { onClick: () => {
2341
2361
  setIsError(false);
@@ -2478,7 +2498,7 @@ const FormInternal = () => {
2478
2498
  };
2479
2499
  const Form = ({ schema, serverUrl, order = [], ignore = [], onSubmit = undefined, preLoadedValues = {}, rowNumber = undefined, displayText = {}, }) => {
2480
2500
  const queryClient = new reactQuery.QueryClient();
2481
- const methods = reactHookForm.useForm();
2501
+ const methods = reactHookForm.useForm({ values: preLoadedValues });
2482
2502
  const { properties } = schema;
2483
2503
  idListSanityCheck("order", order, properties);
2484
2504
  idListSanityCheck("ignore", ignore, properties);
@@ -2491,7 +2511,6 @@ const Form = ({ schema, serverUrl, order = [], ignore = [], onSubmit = undefined
2491
2511
  ignore,
2492
2512
  // @ts-expect-error TODO: find appropriate types
2493
2513
  onSubmit,
2494
- preLoadedValues,
2495
2514
  rowNumber,
2496
2515
  }, children: jsxRuntime.jsx(reactHookForm.FormProvider, { ...methods, children: jsxRuntime.jsx(FormInternal, {}) }) }) }));
2497
2516
  };
package/dist/index.mjs CHANGED
@@ -1548,7 +1548,6 @@ const SchemaFormContext = createContext({
1548
1548
  order: [],
1549
1549
  ignore: [],
1550
1550
  onSubmit: async () => { },
1551
- preLoadedValues: {},
1552
1551
  rowNumber: 0,
1553
1552
  displayText: {},
1554
1553
  });
@@ -1632,12 +1631,12 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1632
1631
  }
1633
1632
  const { total, showing, close, typeToSearch, showMore } = displayText;
1634
1633
  const { gridColumn, gridRow, title, renderDisplay } = schema.properties[column];
1635
- const [selectedIds, setSelectedIds] = useState([]);
1636
1634
  const [searchText, setSearchText] = useState();
1637
1635
  const [limit, setLimit] = useState(10);
1638
1636
  const [openSearchResult, setOpenSearchResult] = useState();
1639
1637
  const [idMap, setIdMap] = useState({});
1640
1638
  const ref = useRef(null);
1639
+ const selectedIds = watch(column) ?? [];
1641
1640
  const query = useQuery({
1642
1641
  queryKey: [`idpicker`, searchText, in_table, limit],
1643
1642
  queryFn: async () => {
@@ -1648,10 +1647,24 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1648
1647
  limit: limit,
1649
1648
  });
1650
1649
  },
1650
+ enabled: (searchText ?? "")?.length > 0,
1651
+ staleTime: 10000,
1652
+ });
1653
+ const idQuery = useQuery({
1654
+ queryKey: [`idpicker`, ...selectedIds],
1655
+ queryFn: async () => {
1656
+ return await getTableData({
1657
+ serverUrl,
1658
+ searching: searchText ?? "",
1659
+ in_table: in_table,
1660
+ limit: limit,
1661
+ });
1662
+ },
1663
+ enabled: (selectedIds ?? []).length > 0,
1651
1664
  staleTime: 10000,
1652
1665
  });
1653
1666
  const { isLoading, isFetching, data, isPending, isError } = query;
1654
- const dataList = data?.data ?? [];
1667
+ const dataList = useMemo(() => data?.data ?? [], [data]);
1655
1668
  const count = data?.count ?? 0;
1656
1669
  const isDirty = (searchText?.length ?? 0) > 0;
1657
1670
  const onSearchChange = async (event) => {
@@ -1659,19 +1672,44 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1659
1672
  setLimit(10);
1660
1673
  };
1661
1674
  const ids = (watch(column) ?? []);
1662
- const newIdMap = useMemo(() => Object.fromEntries(dataList.map((item) => {
1675
+ const newIdMap = useMemo(() => {
1676
+ if (dataList === undefined)
1677
+ return;
1678
+ return Object.fromEntries(dataList.map((item) => {
1679
+ return [
1680
+ item[column_ref],
1681
+ {
1682
+ ...item,
1683
+ },
1684
+ ];
1685
+ }));
1686
+ }, [dataList, column_ref]);
1687
+ const existingIds = useMemo(() => Object.fromEntries((idQuery?.data ?? { data: [] }).data.map((item) => {
1663
1688
  return [
1664
1689
  item[column_ref],
1665
1690
  {
1666
1691
  ...item,
1667
1692
  },
1668
1693
  ];
1669
- })), [dataList, column_ref]);
1694
+ })), [idQuery, column_ref]);
1695
+ const getPickedValue = () => {
1696
+ if (selectedIds.length <= 0) {
1697
+ return "";
1698
+ }
1699
+ if (Object.keys(idMap).length <= 0) {
1700
+ return "";
1701
+ }
1702
+ const record = idMap[selectedIds[0]];
1703
+ if (record === undefined) {
1704
+ return "";
1705
+ }
1706
+ return record[display_column];
1707
+ };
1670
1708
  useEffect(() => {
1671
1709
  setIdMap((state) => {
1672
- return { ...state, ...newIdMap };
1710
+ return { ...state, ...newIdMap, ...existingIds };
1673
1711
  });
1674
- }, [newIdMap]);
1712
+ }, [newIdMap, existingIds]);
1675
1713
  return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
1676
1714
  gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [selectedIds.map((id) => {
1677
1715
  const item = idMap[id];
@@ -1679,16 +1717,15 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1679
1717
  return jsx(Fragment, { children: "undefined" });
1680
1718
  }
1681
1719
  return (jsx(Tag, { closable: true, onClick: () => {
1682
- setSelectedIds((state) => state.filter((id) => id != item[column_ref]));
1683
1720
  setValue(column, ids.filter((id) => id != item[column_ref]));
1684
1721
  }, children: !!renderDisplay === true
1685
1722
  ? renderDisplay(item)
1686
1723
  : item[display_column] }));
1687
1724
  }), jsx(Tag, { cursor: "pointer", onClick: () => {
1688
1725
  setOpenSearchResult(true);
1689
- }, children: "Add" })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: (event) => {
1726
+ }, children: "Add" })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
1690
1727
  setOpenSearchResult(true);
1691
- }, 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) => {
1728
+ }, children: getPickedValue() })), 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) => {
1692
1729
  onSearchChange(event);
1693
1730
  setOpenSearchResult(true);
1694
1731
  }, 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 () => {
@@ -1700,7 +1737,6 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1700
1737
  return (jsx(Box, { cursor: "pointer", onClick: () => {
1701
1738
  if (!isMultiple) {
1702
1739
  setOpenSearchResult(false);
1703
- setSelectedIds(() => [item[column_ref]]);
1704
1740
  setValue(column, [item[column_ref]]);
1705
1741
  return;
1706
1742
  }
@@ -1708,7 +1744,6 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
1708
1744
  ...(ids ?? []),
1709
1745
  item[column_ref],
1710
1746
  ]);
1711
- setSelectedIds(() => [...newSet]);
1712
1747
  setValue(column, [...newSet]);
1713
1748
  }, opacity: 0.7, _hover: { opacity: 1 }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true
1714
1749
  ? renderDisplay(item)
@@ -1824,21 +1859,18 @@ const AccordionRoot = Accordion.Root;
1824
1859
  const AccordionItem = Accordion.Item;
1825
1860
 
1826
1861
  const BooleanPicker = ({ column }) => {
1827
- const { formState: { errors }, setValue, getValues, } = useFormContext();
1862
+ const { watch, formState: { errors }, setValue, getValues, } = useFormContext();
1828
1863
  const { schema, displayText } = useSchemaContext();
1829
1864
  const { fieldRequired } = displayText;
1830
1865
  const { required } = schema;
1831
1866
  const isRequired = required?.some((columnId) => columnId === column);
1867
+ const value = watch(column);
1832
1868
  if (schema.properties == undefined) {
1833
1869
  throw new Error("schema properties when using BooleanPicker");
1834
1870
  }
1835
1871
  const { gridColumn, gridRow, title } = schema.properties[column];
1836
1872
  return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
1837
- gridRow, children: [jsx(CheckboxCard
1838
- // label={snakeToLabel(column)}
1839
- , {
1840
- // label={snakeToLabel(column)}
1841
- value: getValues(column), variant: "surface", onSelect: () => {
1873
+ gridRow, children: [jsx(CheckboxCard, { checked: value, variant: "surface", onSelect: () => {
1842
1874
  setValue(column, !getValues(column));
1843
1875
  } }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
1844
1876
  };
@@ -1913,22 +1945,21 @@ let DatePicker$1 = class DatePicker extends React__default.Component {
1913
1945
  };
1914
1946
 
1915
1947
  const DatePicker = ({ column }) => {
1916
- const { formState: { errors }, setValue, getValues, } = useFormContext();
1948
+ const { watch, formState: { errors }, setValue, } = useFormContext();
1917
1949
  const { schema, displayText } = useSchemaContext();
1918
1950
  const { fieldRequired } = displayText;
1919
1951
  const { required } = schema;
1920
1952
  const isRequired = required?.some((columnId) => columnId === column);
1921
1953
  const [open, setOpen] = useState(false);
1954
+ const selectedDate = watch(column);
1922
1955
  if (schema.properties == undefined) {
1923
1956
  throw new Error("schema properties when using DatePicker");
1924
1957
  }
1925
1958
  const { gridColumn, gridRow, title } = schema.properties[column];
1926
1959
  return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
1927
- gridRow, children: [jsxs(PopoverRoot, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, positioning: { sameWidth: true }, children: [jsx(PopoverTrigger, { asChild: true, children: jsx(Button, { size: "sm", variant: "outline", onClick: () => {
1960
+ gridRow, children: [jsxs(PopoverRoot, { open: open, onOpenChange: (e) => setOpen(e.open), closeOnInteractOutside: true, children: [jsx(PopoverTrigger, { asChild: true, children: jsx(Button, { size: "sm", variant: "outline", onClick: () => {
1928
1961
  setOpen(true);
1929
- }, children: getValues(column) !== undefined
1930
- ? dayjs(getValues(column)).format("YYYY-MM-DD")
1931
- : "" }) }), jsx(PopoverContent, { width: "auto", children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsx(DatePicker$1, { selected: new Date(getValues(column)), onDateSelected: ({ selected, selectable, date }) => {
1962
+ }, children: selectedDate !== undefined ? selectedDate : "" }) }), jsx(PopoverContent, { children: jsxs(PopoverBody, { children: [jsx(PopoverTitle, {}), jsx(DatePicker$1, { selected: new Date(selectedDate), onDateSelected: ({ selected, selectable, date }) => {
1932
1963
  setValue(column, dayjs(date).format("YYYY-MM-DD"));
1933
1964
  setOpen(false);
1934
1965
  } })] }) })] }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: fieldRequired ?? "The field is requried" }))] }));
@@ -2160,7 +2191,7 @@ const FilePicker = ({ column }) => {
2160
2191
 
2161
2192
  const EnumPicker = ({ column, isMultiple = false }) => {
2162
2193
  const { watch, formState: { errors }, setValue, } = useFormContext();
2163
- const { schema, serverUrl, displayText } = useSchemaContext();
2194
+ const { schema, displayText } = useSchemaContext();
2164
2195
  const { fieldRequired } = displayText;
2165
2196
  const { required } = schema;
2166
2197
  const isRequired = required?.some((columnId) => columnId === column);
@@ -2168,7 +2199,6 @@ const EnumPicker = ({ column, isMultiple = false }) => {
2168
2199
  throw new Error("schema properties when using DatePicker");
2169
2200
  }
2170
2201
  const { gridColumn, gridRow, title, renderDisplay } = schema.properties[column];
2171
- const [selectedEnums, setSelectedEnums] = useState([]);
2172
2202
  const [searchText, setSearchText] = useState();
2173
2203
  const [limit, setLimit] = useState(10);
2174
2204
  const [openSearchResult, setOpenSearchResult] = useState();
@@ -2183,7 +2213,7 @@ const EnumPicker = ({ column, isMultiple = false }) => {
2183
2213
  setLimit(10);
2184
2214
  };
2185
2215
  return (jsxs(Field, { label: `${title ?? snakeToLabel(column)}`, required: isRequired, alignItems: "stretch", gridColumn,
2186
- gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [selectedEnums.map((enumValue) => {
2216
+ gridRow, children: [isMultiple && (jsxs(Flex, { flexFlow: "wrap", gap: 1, children: [watchEnums.map((enumValue) => {
2187
2217
  const item = enumValue;
2188
2218
  if (item === undefined) {
2189
2219
  return jsx(Fragment, { children: "undefined" });
@@ -2194,9 +2224,9 @@ const EnumPicker = ({ column, isMultiple = false }) => {
2194
2224
  }, children: !!renderDisplay === true ? renderDisplay(item) : item }));
2195
2225
  }), jsx(Tag, { cursor: "pointer", onClick: () => {
2196
2226
  setOpenSearchResult(true);
2197
- }, children: "Add" })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: (event) => {
2227
+ }, children: "Add" })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
2198
2228
  setOpenSearchResult(true);
2199
- }, 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) => {
2229
+ }, children: watchEnums[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) => {
2200
2230
  onSearchChange(event);
2201
2231
  setOpenSearchResult(true);
2202
2232
  }, 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 () => {
@@ -2206,12 +2236,10 @@ const EnumPicker = ({ column, isMultiple = false }) => {
2206
2236
  return (jsx(Box, { cursor: "pointer", onClick: () => {
2207
2237
  if (!isMultiple) {
2208
2238
  setOpenSearchResult(false);
2209
- setSelectedEnums(() => [item]);
2210
2239
  setValue(column, [item]);
2211
2240
  return;
2212
2241
  }
2213
2242
  const newSet = new Set([...(watchEnums ?? []), item]);
2214
- setSelectedEnums(() => [...newSet]);
2215
2243
  setValue(column, [...newSet]);
2216
2244
  }, ...(selected ? { color: "gray.400/50" } : {}), children: !!renderDisplay === true ? renderDisplay(item) : item }, `${column}-${item}`));
2217
2245
  }) }), 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" }))] }));
@@ -2229,7 +2257,7 @@ const idPickerSanityCheck = (column, in_table, column_ref, display_column) => {
2229
2257
  }
2230
2258
  };
2231
2259
  const FormInternal = () => {
2232
- const { schema, serverUrl, displayText, order, ignore, onSubmit, preLoadedValues, rowNumber, } = useSchemaContext();
2260
+ const { schema, serverUrl, displayText, order, ignore, onSubmit, rowNumber } = useSchemaContext();
2233
2261
  const { title, submit, empty, cancel, submitSuccess, submitAgain, confirm } = displayText;
2234
2262
  const methods = useFormContext();
2235
2263
  const [isSuccess, setIsSuccess] = useState(false);
@@ -2308,14 +2336,6 @@ const FormInternal = () => {
2308
2336
  value: value,
2309
2337
  };
2310
2338
  };
2311
- useEffect(() => {
2312
- const loadData = () => {
2313
- Object.entries(preLoadedValues).map(([column, value]) => {
2314
- methods.setValue(column, value);
2315
- });
2316
- };
2317
- loadData();
2318
- }, [preLoadedValues, methods]);
2319
2339
  if (isSuccess) {
2320
2340
  return (jsxs(Grid, { gap: 2, children: [jsx(Heading, { children: title ?? snakeToLabel(schema.title ?? "") }), jsxs(Alert.Root, { status: "success", children: [jsx(Alert.Indicator, {}), jsx(Alert.Title, { children: submitSuccess ?? "Data uploaded to the server. Fire on!" })] }), jsx(Button, { onClick: () => {
2321
2341
  setIsError(false);
@@ -2458,7 +2478,7 @@ const FormInternal = () => {
2458
2478
  };
2459
2479
  const Form = ({ schema, serverUrl, order = [], ignore = [], onSubmit = undefined, preLoadedValues = {}, rowNumber = undefined, displayText = {}, }) => {
2460
2480
  const queryClient = new QueryClient();
2461
- const methods = useForm();
2481
+ const methods = useForm({ values: preLoadedValues });
2462
2482
  const { properties } = schema;
2463
2483
  idListSanityCheck("order", order, properties);
2464
2484
  idListSanityCheck("ignore", ignore, properties);
@@ -2471,7 +2491,6 @@ const Form = ({ schema, serverUrl, order = [], ignore = [], onSubmit = undefined
2471
2491
  ignore,
2472
2492
  // @ts-expect-error TODO: find appropriate types
2473
2493
  onSubmit,
2474
- preLoadedValues,
2475
2494
  rowNumber,
2476
2495
  }, children: jsx(FormProvider, { ...methods, children: jsx(FormInternal, {}) }) }) }));
2477
2496
  };
@@ -1,6 +1,4 @@
1
- import { UseQueryResult } from "@tanstack/react-query";
2
1
  export interface EmptyStateProps {
3
- query: UseQueryResult;
4
2
  title?: string;
5
3
  description?: string;
6
4
  }
@@ -6,4 +6,4 @@ export interface DataTableContext<TData> {
6
6
  setGlobalFilter: OnChangeFn<string>;
7
7
  type: "client" | "server";
8
8
  }
9
- export declare const DataTableContext: import("react").Context<DataTableContext<any>>;
9
+ export declare const DataTableContext: import("react").Context<DataTableContext<unknown>>;
@@ -9,7 +9,6 @@ export interface SchemaFormContext<TData extends FieldValues> {
9
9
  ignore: string[];
10
10
  displayText: DisplayTextProps;
11
11
  onSubmit?: (data: TData) => Promise<void>;
12
- preLoadedValues: object;
13
12
  rowNumber?: number | string;
14
13
  }
15
14
  export declare const SchemaFormContext: import("react").Context<SchemaFormContext<unknown>>;
@@ -4,7 +4,7 @@ export declare const useSchemaContext: () => {
4
4
  order: string[];
5
5
  ignore: string[];
6
6
  onSubmit: ((data: unknown) => Promise<void>) | undefined;
7
- preLoadedValues: object;
7
+ preLoadedValues: any;
8
8
  rowNumber: string | number | undefined;
9
9
  displayText: import("./Form").DisplayTextProps;
10
10
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "7.3.3",
3
+ "version": "7.3.4",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",