@bsol-oss/react-datatable5 12.0.0-beta.69 → 12.0.0-beta.70
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
|
@@ -550,10 +550,27 @@ declare const TableDataDisplay: ({ colorPalette, emptyComponent, }: TableDataDis
|
|
|
550
550
|
|
|
551
551
|
declare const GlobalFilter: () => react_jsx_runtime.JSX.Element;
|
|
552
552
|
|
|
553
|
+
interface CustomQueryFnResponse {
|
|
554
|
+
/**
|
|
555
|
+
* The data of the query
|
|
556
|
+
*/
|
|
557
|
+
data: any;
|
|
558
|
+
/**
|
|
559
|
+
* The id map of the data
|
|
560
|
+
*/
|
|
561
|
+
idMap: Record<string, any>;
|
|
562
|
+
}
|
|
563
|
+
interface CustomQueryFnParams {
|
|
564
|
+
searching: string;
|
|
565
|
+
limit: number;
|
|
566
|
+
offset: number;
|
|
567
|
+
}
|
|
568
|
+
type CustomQueryFn = (params: CustomQueryFnParams) => Promise<CustomQueryFnResponse>;
|
|
553
569
|
interface ForeignKeyProps {
|
|
554
570
|
column: string;
|
|
555
571
|
table: string;
|
|
556
572
|
display_column: string;
|
|
573
|
+
customQueryFn?: CustomQueryFn;
|
|
557
574
|
}
|
|
558
575
|
|
|
559
576
|
interface CustomJSONSchema7 extends JSONSchema7 {
|
package/dist/index.js
CHANGED
|
@@ -4560,7 +4560,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4560
4560
|
const { serverUrl, idMap, setIdMap, translate, schema: parentSchema, } = useSchemaContext();
|
|
4561
4561
|
const { required, gridColumn = "span 4", gridRow = "span 1", renderDisplay, foreign_key, } = schema;
|
|
4562
4562
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4563
|
-
const { table, column: column_ref, display_column, } = foreign_key;
|
|
4563
|
+
const { table, column: column_ref, display_column, customQueryFn, } = foreign_key;
|
|
4564
4564
|
const [searchText, setSearchText] = React.useState("");
|
|
4565
4565
|
const [limit, setLimit] = React.useState(10);
|
|
4566
4566
|
const [openSearchResult, setOpenSearchResult] = React.useState();
|
|
@@ -4573,6 +4573,17 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4573
4573
|
const query = reactQuery.useQuery({
|
|
4574
4574
|
queryKey: [`idpicker`, { column, searchText, limit, page }],
|
|
4575
4575
|
queryFn: async () => {
|
|
4576
|
+
if (customQueryFn) {
|
|
4577
|
+
const { data, idMap } = await customQueryFn({
|
|
4578
|
+
searching: searchText ?? "",
|
|
4579
|
+
limit: limit,
|
|
4580
|
+
offset: page * limit,
|
|
4581
|
+
});
|
|
4582
|
+
setIdMap((state) => {
|
|
4583
|
+
return { ...state, ...idMap };
|
|
4584
|
+
});
|
|
4585
|
+
return data;
|
|
4586
|
+
}
|
|
4576
4587
|
const data = await getTableData({
|
|
4577
4588
|
serverUrl,
|
|
4578
4589
|
searching: searchText ?? "",
|
|
@@ -4603,6 +4614,17 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4603
4614
|
{ form: parentSchema.title, column, id: isMultiple ? watchIds : watchId },
|
|
4604
4615
|
],
|
|
4605
4616
|
queryFn: async () => {
|
|
4617
|
+
if (customQueryFn) {
|
|
4618
|
+
const { data, idMap } = await customQueryFn({
|
|
4619
|
+
searching: watchIds.join(","),
|
|
4620
|
+
limit: isMultiple ? watchIds.length : 1,
|
|
4621
|
+
offset: 0,
|
|
4622
|
+
});
|
|
4623
|
+
setIdMap((state) => {
|
|
4624
|
+
return { ...state, ...idMap };
|
|
4625
|
+
});
|
|
4626
|
+
return data;
|
|
4627
|
+
}
|
|
4606
4628
|
if (!watchId && (!watchIds || watchIds.length === 0)) {
|
|
4607
4629
|
return { data: [] };
|
|
4608
4630
|
}
|
|
@@ -4695,7 +4717,9 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4695
4717
|
setOpenSearchResult(true);
|
|
4696
4718
|
}, children: translate.t(removeIndex(`${colLabel}.add_more`)) })] })), !isMultiple && (jsxRuntime.jsx(Button, { variant: "outline", onClick: () => {
|
|
4697
4719
|
setOpenSearchResult(true);
|
|
4698
|
-
}, justifyContent: "start", children: queryDefault.isLoading ? jsxRuntime.jsx(react.Spinner, { size: "sm" }) : getPickedValue() })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { portalled: false, children: jsxRuntime.jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsxRuntime.jsx(react.Input, { placeholder: translate.t(removeIndex(`${colLabel}.type_to_search`)), onChange: onSearchChange, autoComplete: "off", ref: ref, value: searchText }), jsxRuntime.jsx(PopoverTitle, {}), openSearchResult && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [(isFetching || isLoading || isPending) && jsxRuntime.jsx(react.Spinner, {}), isError && (jsxRuntime.jsx(react.Icon, { color: "red.400", children: jsxRuntime.jsx(bi.BiError, {}) })), jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", alignItems: "center", children: [jsxRuntime.jsxs(react.Flex, { alignItems: "center", gap: "2", children: [jsxRuntime.jsx(InfoTip, { children: `${translate.t(removeIndex(`${colLabel}.total`))} ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit} ${translate.t(removeIndex(`${colLabel}.per_page`), "per page")}` }), jsxRuntime.jsxs(react.Text, { fontSize: "sm", fontWeight: "bold", children: [count, jsxRuntime.jsxs(react.Text, { as: "span", fontSize: "xs", ml: "1", color: "gray.500", children: ["/
|
|
4720
|
+
}, justifyContent: "start", children: queryDefault.isLoading ? jsxRuntime.jsx(react.Spinner, { size: "sm" }) : getPickedValue() })), jsxRuntime.jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsxRuntime.jsx(PopoverTrigger, {}), jsxRuntime.jsx(PopoverContent, { portalled: false, children: jsxRuntime.jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsxRuntime.jsx(react.Input, { placeholder: translate.t(removeIndex(`${colLabel}.type_to_search`)), onChange: onSearchChange, autoComplete: "off", ref: ref, value: searchText }), jsxRuntime.jsx(PopoverTitle, {}), openSearchResult && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [(isFetching || isLoading || isPending) && jsxRuntime.jsx(react.Spinner, {}), isError && (jsxRuntime.jsx(react.Icon, { color: "red.400", children: jsxRuntime.jsx(bi.BiError, {}) })), jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", alignItems: "center", children: [jsxRuntime.jsxs(react.Flex, { alignItems: "center", gap: "2", children: [jsxRuntime.jsx(InfoTip, { children: `${translate.t(removeIndex(`${colLabel}.total`))} ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit} ${translate.t(removeIndex(`${colLabel}.per_page`), "per page")}` }), jsxRuntime.jsxs(react.Text, { fontSize: "sm", fontWeight: "bold", children: [count, jsxRuntime.jsxs(react.Text, { as: "span", fontSize: "xs", ml: "1", color: "gray.500", children: ["/", " ", count > 0
|
|
4721
|
+
? `${page * limit + 1}-${Math.min((page + 1) * limit, count)}`
|
|
4722
|
+
: "0"] })] })] }), jsxRuntime.jsx(react.Box, { children: jsxRuntime.jsxs("select", { value: limit, onChange: handleLimitChange, style: {
|
|
4699
4723
|
padding: "4px 8px",
|
|
4700
4724
|
borderRadius: "4px",
|
|
4701
4725
|
border: "1px solid #ccc",
|
|
@@ -4719,7 +4743,10 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4719
4743
|
]);
|
|
4720
4744
|
setValue(colLabel, [...newSet]);
|
|
4721
4745
|
}, opacity: 0.7, _hover: { opacity: 1 }, ...(selected
|
|
4722
|
-
? {
|
|
4746
|
+
? {
|
|
4747
|
+
color: "colorPalette.400/50",
|
|
4748
|
+
fontWeight: "bold",
|
|
4749
|
+
}
|
|
4723
4750
|
: {}), children: !!renderDisplay === true
|
|
4724
4751
|
? renderDisplay(item)
|
|
4725
4752
|
: item[display_column] }, item[column_ref]));
|
package/dist/index.mjs
CHANGED
|
@@ -4540,7 +4540,7 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4540
4540
|
const { serverUrl, idMap, setIdMap, translate, schema: parentSchema, } = useSchemaContext();
|
|
4541
4541
|
const { required, gridColumn = "span 4", gridRow = "span 1", renderDisplay, foreign_key, } = schema;
|
|
4542
4542
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
4543
|
-
const { table, column: column_ref, display_column, } = foreign_key;
|
|
4543
|
+
const { table, column: column_ref, display_column, customQueryFn, } = foreign_key;
|
|
4544
4544
|
const [searchText, setSearchText] = useState("");
|
|
4545
4545
|
const [limit, setLimit] = useState(10);
|
|
4546
4546
|
const [openSearchResult, setOpenSearchResult] = useState();
|
|
@@ -4553,6 +4553,17 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4553
4553
|
const query = useQuery({
|
|
4554
4554
|
queryKey: [`idpicker`, { column, searchText, limit, page }],
|
|
4555
4555
|
queryFn: async () => {
|
|
4556
|
+
if (customQueryFn) {
|
|
4557
|
+
const { data, idMap } = await customQueryFn({
|
|
4558
|
+
searching: searchText ?? "",
|
|
4559
|
+
limit: limit,
|
|
4560
|
+
offset: page * limit,
|
|
4561
|
+
});
|
|
4562
|
+
setIdMap((state) => {
|
|
4563
|
+
return { ...state, ...idMap };
|
|
4564
|
+
});
|
|
4565
|
+
return data;
|
|
4566
|
+
}
|
|
4556
4567
|
const data = await getTableData({
|
|
4557
4568
|
serverUrl,
|
|
4558
4569
|
searching: searchText ?? "",
|
|
@@ -4583,6 +4594,17 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4583
4594
|
{ form: parentSchema.title, column, id: isMultiple ? watchIds : watchId },
|
|
4584
4595
|
],
|
|
4585
4596
|
queryFn: async () => {
|
|
4597
|
+
if (customQueryFn) {
|
|
4598
|
+
const { data, idMap } = await customQueryFn({
|
|
4599
|
+
searching: watchIds.join(","),
|
|
4600
|
+
limit: isMultiple ? watchIds.length : 1,
|
|
4601
|
+
offset: 0,
|
|
4602
|
+
});
|
|
4603
|
+
setIdMap((state) => {
|
|
4604
|
+
return { ...state, ...idMap };
|
|
4605
|
+
});
|
|
4606
|
+
return data;
|
|
4607
|
+
}
|
|
4586
4608
|
if (!watchId && (!watchIds || watchIds.length === 0)) {
|
|
4587
4609
|
return { data: [] };
|
|
4588
4610
|
}
|
|
@@ -4675,7 +4697,9 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4675
4697
|
setOpenSearchResult(true);
|
|
4676
4698
|
}, children: translate.t(removeIndex(`${colLabel}.add_more`)) })] })), !isMultiple && (jsx(Button, { variant: "outline", onClick: () => {
|
|
4677
4699
|
setOpenSearchResult(true);
|
|
4678
|
-
}, justifyContent: "start", children: queryDefault.isLoading ? jsx(Spinner, { size: "sm" }) : getPickedValue() })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { portalled: false, children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: translate.t(removeIndex(`${colLabel}.type_to_search`)), onChange: onSearchChange, autoComplete: "off", ref: ref, value: searchText }), jsx(PopoverTitle, {}), openSearchResult && (jsxs(Fragment, { children: [(isFetching || isLoading || isPending) && jsx(Spinner, {}), isError && (jsx(Icon, { color: "red.400", children: jsx(BiError, {}) })), jsxs(Flex, { justifyContent: "space-between", alignItems: "center", children: [jsxs(Flex, { alignItems: "center", gap: "2", children: [jsx(InfoTip, { children: `${translate.t(removeIndex(`${colLabel}.total`))} ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit} ${translate.t(removeIndex(`${colLabel}.per_page`), "per page")}` }), jsxs(Text, { fontSize: "sm", fontWeight: "bold", children: [count, jsxs(Text, { as: "span", fontSize: "xs", ml: "1", color: "gray.500", children: ["/
|
|
4700
|
+
}, justifyContent: "start", children: queryDefault.isLoading ? jsx(Spinner, { size: "sm" }) : getPickedValue() })), jsxs(PopoverRoot, { open: openSearchResult, onOpenChange: (e) => setOpenSearchResult(e.open), closeOnInteractOutside: true, initialFocusEl: () => ref.current, positioning: { placement: "bottom-start", strategy: "fixed" }, children: [jsx(PopoverTrigger, {}), jsx(PopoverContent, { portalled: false, children: jsxs(PopoverBody, { display: "grid", gap: 1, children: [jsx(Input, { placeholder: translate.t(removeIndex(`${colLabel}.type_to_search`)), onChange: onSearchChange, autoComplete: "off", ref: ref, value: searchText }), jsx(PopoverTitle, {}), openSearchResult && (jsxs(Fragment, { children: [(isFetching || isLoading || isPending) && jsx(Spinner, {}), isError && (jsx(Icon, { color: "red.400", children: jsx(BiError, {}) })), jsxs(Flex, { justifyContent: "space-between", alignItems: "center", children: [jsxs(Flex, { alignItems: "center", gap: "2", children: [jsx(InfoTip, { children: `${translate.t(removeIndex(`${colLabel}.total`))} ${count}, ${translate.t(removeIndex(`${colLabel}.showing`))} ${limit} ${translate.t(removeIndex(`${colLabel}.per_page`), "per page")}` }), jsxs(Text, { fontSize: "sm", fontWeight: "bold", children: [count, jsxs(Text, { as: "span", fontSize: "xs", ml: "1", color: "gray.500", children: ["/", " ", count > 0
|
|
4701
|
+
? `${page * limit + 1}-${Math.min((page + 1) * limit, count)}`
|
|
4702
|
+
: "0"] })] })] }), jsx(Box, { children: jsxs("select", { value: limit, onChange: handleLimitChange, style: {
|
|
4679
4703
|
padding: "4px 8px",
|
|
4680
4704
|
borderRadius: "4px",
|
|
4681
4705
|
border: "1px solid #ccc",
|
|
@@ -4699,7 +4723,10 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
4699
4723
|
]);
|
|
4700
4724
|
setValue(colLabel, [...newSet]);
|
|
4701
4725
|
}, opacity: 0.7, _hover: { opacity: 1 }, ...(selected
|
|
4702
|
-
? {
|
|
4726
|
+
? {
|
|
4727
|
+
color: "colorPalette.400/50",
|
|
4728
|
+
fontWeight: "bold",
|
|
4729
|
+
}
|
|
4703
4730
|
: {}), children: !!renderDisplay === true
|
|
4704
4731
|
? renderDisplay(item)
|
|
4705
4732
|
: item[display_column] }, item[column_ref]));
|
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
import { InputDefaultProps } from "./types";
|
|
2
2
|
export interface StringInputFieldProps extends InputDefaultProps {
|
|
3
3
|
}
|
|
4
|
+
export interface CustomQueryFnResponse {
|
|
5
|
+
/**
|
|
6
|
+
* The data of the query
|
|
7
|
+
*/
|
|
8
|
+
data: any;
|
|
9
|
+
/**
|
|
10
|
+
* The id map of the data
|
|
11
|
+
*/
|
|
12
|
+
idMap: Record<string, any>;
|
|
13
|
+
}
|
|
14
|
+
export interface CustomQueryFnParams {
|
|
15
|
+
searching: string;
|
|
16
|
+
limit: number;
|
|
17
|
+
offset: number;
|
|
18
|
+
}
|
|
19
|
+
export type CustomQueryFn = (params: CustomQueryFnParams) => Promise<CustomQueryFnResponse>;
|
|
4
20
|
export interface ForeignKeyProps {
|
|
5
21
|
column: string;
|
|
6
22
|
table: string;
|
|
7
23
|
display_column: string;
|
|
24
|
+
customQueryFn?: CustomQueryFn;
|
|
8
25
|
}
|
|
9
26
|
export declare const StringInputField: ({ column, schema, prefix, }: StringInputFieldProps) => import("react/jsx-runtime").JSX.Element;
|