@bsol-oss/react-datatable5 7.6.3 → 8.0.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 +41 -0
- package/dist/index.js +57 -28
- package/dist/index.mjs +57 -28
- package/dist/types/components/DataTable/DataTable.d.ts +23 -0
- package/dist/types/components/DataTable/DataTableServer.d.ts +18 -0
- package/dist/types/components/Form/components/IdPicker.d.ts +1 -4
- package/dist/types/components/Form/components/IdViewer.d.ts +1 -4
- package/dist/types/components/Form/components/StringInputField.d.ts +5 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -119,7 +119,20 @@ declare module "@tanstack/react-table" {
|
|
|
119
119
|
}
|
|
120
120
|
interface DataTableProps<TData = unknown> {
|
|
121
121
|
children?: ReactNode | ReactNode[];
|
|
122
|
+
/**
|
|
123
|
+
* Data array for the table.
|
|
124
|
+
*
|
|
125
|
+
* It will pass into as the data in `@tanstack/react-table`
|
|
126
|
+
*
|
|
127
|
+
*/
|
|
122
128
|
data: TData[];
|
|
129
|
+
/**
|
|
130
|
+
* Column definitions for the table.
|
|
131
|
+
*
|
|
132
|
+
* It will pass into as the column definitions in `@tanstack/react-table`
|
|
133
|
+
*
|
|
134
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
135
|
+
*/
|
|
123
136
|
columns: ColumnDef<TData, unknown>[];
|
|
124
137
|
enableRowSelection?: boolean;
|
|
125
138
|
enableMultiRowSelection?: boolean;
|
|
@@ -142,6 +155,16 @@ interface DataTableProps<TData = unknown> {
|
|
|
142
155
|
setDensity: OnChangeFn<DensityState>;
|
|
143
156
|
setColumnVisibility: OnChangeFn<VisibilityState>;
|
|
144
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* DataTable will create a context to hold all values to
|
|
160
|
+
* help the render of the DataTable in serverside
|
|
161
|
+
*
|
|
162
|
+
*
|
|
163
|
+
* The query is required to be a GET request that can receive
|
|
164
|
+
* specified params and return a specified response
|
|
165
|
+
*
|
|
166
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
167
|
+
*/
|
|
145
168
|
declare function DataTable<TData = unknown>({ columns, data, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }: DataTableProps<TData>): react_jsx_runtime.JSX.Element;
|
|
146
169
|
|
|
147
170
|
interface DataTableDefaultState {
|
|
@@ -205,6 +228,13 @@ declare const useDataTableServer: <TData>({ url, default: { sorting: defaultSort
|
|
|
205
228
|
|
|
206
229
|
interface DataTableServerProps<TData extends DataResponse = DataResponse<unknown>> {
|
|
207
230
|
children: ReactNode | ReactNode[];
|
|
231
|
+
/**
|
|
232
|
+
* Column definitions for the table.
|
|
233
|
+
*
|
|
234
|
+
* It will pass into as the column definitions in `@tanstack/react-table`
|
|
235
|
+
*
|
|
236
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
237
|
+
*/
|
|
208
238
|
columns: ColumnDef<TData>[];
|
|
209
239
|
enableRowSelection?: boolean;
|
|
210
240
|
enableMultiRowSelection?: boolean;
|
|
@@ -228,6 +258,17 @@ interface DataTableServerProps<TData extends DataResponse = DataResponse<unknown
|
|
|
228
258
|
query: UseQueryResult<TData>;
|
|
229
259
|
url: string;
|
|
230
260
|
}
|
|
261
|
+
/**
|
|
262
|
+
* DataTableServer will create a context to hold all values to
|
|
263
|
+
* help the render of the DataTable in serverside
|
|
264
|
+
*
|
|
265
|
+
* The query is required to be a GET request that can receive
|
|
266
|
+
* specified params and return a specified response
|
|
267
|
+
*
|
|
268
|
+
* The `useDataTableServer` can help to create the specified request and response
|
|
269
|
+
*
|
|
270
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
271
|
+
*/
|
|
231
272
|
declare function DataTableServer<TData extends DataResponse = DataResponse<unknown>>({ columns, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, children, url, }: DataTableServerProps<TData>): react_jsx_runtime.JSX.Element;
|
|
232
273
|
|
|
233
274
|
interface TableBodyProps {
|
package/dist/index.js
CHANGED
|
@@ -2605,11 +2605,12 @@ const snakeToLabel = (str) => {
|
|
|
2605
2605
|
};
|
|
2606
2606
|
|
|
2607
2607
|
const RecordDisplay = ({ object, boxProps }) => {
|
|
2608
|
+
console.log(object, "dkfos");
|
|
2608
2609
|
if (object === null) {
|
|
2609
2610
|
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: "null" });
|
|
2610
2611
|
}
|
|
2611
|
-
return (jsxRuntime.jsx(react.Grid, { rowGap: 1, overflow: "auto", ...boxProps, children: Object.entries(object).map(([field, value]) => {
|
|
2612
|
-
return (jsxRuntime.jsxs(react.Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsxRuntime.jsx(react.Text, { color: "gray.400", children: snakeToLabel(field) }), jsxRuntime.jsx(
|
|
2612
|
+
return (jsxRuntime.jsx(react.Grid, { rowGap: 1, padding: 1, overflow: "auto", ...boxProps, children: Object.entries(object).map(([field, value]) => {
|
|
2613
|
+
return (jsxRuntime.jsxs(react.Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsxRuntime.jsx(react.Text, { color: "gray.400", children: snakeToLabel(field) }), typeof value === "object" ? (jsxRuntime.jsx(RecordDisplay, { object: value })) : (jsxRuntime.jsx(react.Text, { children: JSON.stringify(value) }))] }, field));
|
|
2613
2614
|
}) }));
|
|
2614
2615
|
};
|
|
2615
2616
|
|
|
@@ -2777,6 +2778,16 @@ const fuzzyFilter = (row, columnId, value, addMeta) => {
|
|
|
2777
2778
|
// Return if the item should be filtered in/out
|
|
2778
2779
|
return itemRank.passed;
|
|
2779
2780
|
};
|
|
2781
|
+
/**
|
|
2782
|
+
* DataTable will create a context to hold all values to
|
|
2783
|
+
* help the render of the DataTable in serverside
|
|
2784
|
+
*
|
|
2785
|
+
*
|
|
2786
|
+
* The query is required to be a GET request that can receive
|
|
2787
|
+
* specified params and return a specified response
|
|
2788
|
+
*
|
|
2789
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
2790
|
+
*/
|
|
2780
2791
|
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, }) {
|
|
2781
2792
|
const table = reactTable.useReactTable({
|
|
2782
2793
|
_features: [DensityFeature],
|
|
@@ -2836,6 +2847,17 @@ const DataTableServerContext = React.createContext({
|
|
|
2836
2847
|
url: "",
|
|
2837
2848
|
});
|
|
2838
2849
|
|
|
2850
|
+
/**
|
|
2851
|
+
* DataTableServer will create a context to hold all values to
|
|
2852
|
+
* help the render of the DataTable in serverside
|
|
2853
|
+
*
|
|
2854
|
+
* The query is required to be a GET request that can receive
|
|
2855
|
+
* specified params and return a specified response
|
|
2856
|
+
*
|
|
2857
|
+
* The `useDataTableServer` can help to create the specified request and response
|
|
2858
|
+
*
|
|
2859
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
2860
|
+
*/
|
|
2839
2861
|
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, }) {
|
|
2840
2862
|
const table = reactTable.useReactTable({
|
|
2841
2863
|
_features: [DensityFeature],
|
|
@@ -3423,7 +3445,7 @@ const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth =
|
|
|
3423
3445
|
// @ts-expect-error find type for unknown
|
|
3424
3446
|
const value = props.row.original[column];
|
|
3425
3447
|
if (typeof value === "object") {
|
|
3426
|
-
return jsxRuntime.jsx(
|
|
3448
|
+
return (jsxRuntime.jsx(react.Grid, { overflow: "auto", children: jsxRuntime.jsx(RecordDisplay, { object: value }) }));
|
|
3427
3449
|
}
|
|
3428
3450
|
return jsxRuntime.jsx(TextCell, { children: value });
|
|
3429
3451
|
},
|
|
@@ -3583,7 +3605,7 @@ const getTableData = async ({ serverUrl, in_table, searching = "", where = [], l
|
|
|
3583
3605
|
}
|
|
3584
3606
|
};
|
|
3585
3607
|
|
|
3586
|
-
const IdPicker = ({ column,
|
|
3608
|
+
const IdPicker = ({ column, isMultiple = false }) => {
|
|
3587
3609
|
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
3588
3610
|
const { schema, serverUrl, displayText } = useSchemaContext();
|
|
3589
3611
|
const { fieldRequired } = displayText;
|
|
@@ -3593,7 +3615,9 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
|
|
|
3593
3615
|
throw new Error("schema properties when using DatePicker");
|
|
3594
3616
|
}
|
|
3595
3617
|
const { total, showing, typeToSearch } = displayText;
|
|
3596
|
-
const { gridColumn, gridRow, title, renderDisplay } = schema
|
|
3618
|
+
const { gridColumn, gridRow, title, renderDisplay, foreign_key } = schema
|
|
3619
|
+
.properties[column];
|
|
3620
|
+
const { table: in_table, column: column_ref, display_column } = foreign_key;
|
|
3597
3621
|
const [searchText, setSearchText] = React.useState();
|
|
3598
3622
|
const [limit, setLimit] = React.useState(10);
|
|
3599
3623
|
const [openSearchResult, setOpenSearchResult] = React.useState();
|
|
@@ -3602,7 +3626,7 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
|
|
|
3602
3626
|
const ref = React.useRef(null);
|
|
3603
3627
|
const selectedIds = watch(column) ?? [];
|
|
3604
3628
|
const query = reactQuery.useQuery({
|
|
3605
|
-
queryKey: [`idpicker`, { searchText,
|
|
3629
|
+
queryKey: [`idpicker`, { searchText, limit, page }],
|
|
3606
3630
|
queryFn: async () => {
|
|
3607
3631
|
const data = await getTableData({
|
|
3608
3632
|
serverUrl,
|
|
@@ -3729,21 +3753,25 @@ const DataListItem = React__namespace.forwardRef(function DataListItem(props, re
|
|
|
3729
3753
|
return (jsxRuntime.jsxs(react.DataList.Item, { ref: ref, ...rest, children: [jsxRuntime.jsxs(react.DataList.ItemLabel, { flex: grow ? "1" : undefined, children: [label, info && jsxRuntime.jsx(InfoTip, { children: info })] }), jsxRuntime.jsx(react.DataList.ItemValue, { flex: grow ? "1" : undefined, children: value }), children] }));
|
|
3730
3754
|
});
|
|
3731
3755
|
|
|
3732
|
-
const IdViewer = ({ value,
|
|
3756
|
+
const IdViewer = ({ value, column }) => {
|
|
3733
3757
|
const { schema, serverUrl } = useSchemaContext();
|
|
3734
3758
|
if (schema.properties == undefined) {
|
|
3735
3759
|
throw new Error("schema properties when using DatePicker");
|
|
3736
3760
|
}
|
|
3737
|
-
const { title } = schema.properties[column];
|
|
3761
|
+
const { title, foreign_key } = schema.properties[column];
|
|
3762
|
+
if (foreign_key === undefined) {
|
|
3763
|
+
throw new Error('foreign_key when variant is id-picker');
|
|
3764
|
+
}
|
|
3765
|
+
const { table, column: foreginKeyColumn, display_column } = foreign_key;
|
|
3738
3766
|
const query = reactQuery.useQuery({
|
|
3739
|
-
queryKey: [`idpicker`,
|
|
3767
|
+
queryKey: [`idpicker`, table, value],
|
|
3740
3768
|
queryFn: async () => {
|
|
3741
3769
|
return await getTableData({
|
|
3742
3770
|
serverUrl,
|
|
3743
|
-
in_table:
|
|
3771
|
+
in_table: foreginKeyColumn ?? '',
|
|
3744
3772
|
where: [
|
|
3745
3773
|
{
|
|
3746
|
-
id:
|
|
3774
|
+
id: column,
|
|
3747
3775
|
value: value,
|
|
3748
3776
|
},
|
|
3749
3777
|
],
|
|
@@ -4514,15 +4542,19 @@ const EnumPicker = ({ column, isMultiple = false }) => {
|
|
|
4514
4542
|
}) }), 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" }))] }));
|
|
4515
4543
|
};
|
|
4516
4544
|
|
|
4517
|
-
const idPickerSanityCheck = (column,
|
|
4518
|
-
if (!!
|
|
4519
|
-
throw new Error(`The key
|
|
4545
|
+
const idPickerSanityCheck = (column, foreign_key) => {
|
|
4546
|
+
if (!!foreign_key == false) {
|
|
4547
|
+
throw new Error(`The key foreign_key does not exist in properties of column ${column} when using id-picker.`);
|
|
4520
4548
|
}
|
|
4521
|
-
|
|
4522
|
-
|
|
4549
|
+
const { table, column: foreignKeyColumn, display_column } = foreign_key;
|
|
4550
|
+
if (!!table == false) {
|
|
4551
|
+
throw new Error(`The key table does not exist in properties of column ${table} when using id-picker.`);
|
|
4523
4552
|
}
|
|
4524
4553
|
if (!!display_column == false) {
|
|
4525
|
-
throw new Error(`The key display_column does not exist in properties of column ${column}.`);
|
|
4554
|
+
throw new Error(`The key display_column does not exist in properties of column ${column} when using id-picker.`);
|
|
4555
|
+
}
|
|
4556
|
+
if (!!foreignKeyColumn == false) {
|
|
4557
|
+
throw new Error(`The key column does not exist in properties of column ${column} when using id-picker.`);
|
|
4526
4558
|
}
|
|
4527
4559
|
};
|
|
4528
4560
|
const FormInternal = () => {
|
|
@@ -4628,14 +4660,11 @@ const FormInternal = () => {
|
|
|
4628
4660
|
if (shouldIgnore) {
|
|
4629
4661
|
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4630
4662
|
}
|
|
4631
|
-
const { type, variant,
|
|
4663
|
+
const { type, variant, gridColumn, gridRow, foreign_key } = values;
|
|
4632
4664
|
if (type === "string") {
|
|
4633
4665
|
if (variant === "id-picker") {
|
|
4634
|
-
idPickerSanityCheck(column,
|
|
4635
|
-
return (jsxRuntime.jsx(IdViewer, { value: (validatedData ?? {})[column],
|
|
4636
|
-
column_ref,
|
|
4637
|
-
display_column,
|
|
4638
|
-
column,
|
|
4666
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4667
|
+
return (jsxRuntime.jsx(IdViewer, { value: (validatedData ?? {})[column], column,
|
|
4639
4668
|
gridColumn,
|
|
4640
4669
|
gridRow }, `form-${key}`));
|
|
4641
4670
|
}
|
|
@@ -4701,14 +4730,14 @@ const FormInternal = () => {
|
|
|
4701
4730
|
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4702
4731
|
}
|
|
4703
4732
|
//@ts-expect-error TODO: add more fields to support form-creation
|
|
4704
|
-
const { type, variant, in_table, column_ref,
|
|
4733
|
+
const { type, variant, in_table, column_ref, foreign_key } = values;
|
|
4705
4734
|
if (type === "string") {
|
|
4706
4735
|
if ((values.enum ?? []).length > 0) {
|
|
4707
4736
|
return jsxRuntime.jsx(EnumPicker, { column: key }, `form-${key}`);
|
|
4708
4737
|
}
|
|
4709
4738
|
if (variant === "id-picker") {
|
|
4710
|
-
idPickerSanityCheck(column,
|
|
4711
|
-
return
|
|
4739
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4740
|
+
return jsxRuntime.jsx(IdPicker, { column: key }, `form-${key}`);
|
|
4712
4741
|
}
|
|
4713
4742
|
if (variant === "date-picker") {
|
|
4714
4743
|
return jsxRuntime.jsx(DatePicker, { column: key }, `form-${key}`);
|
|
@@ -4726,8 +4755,8 @@ const FormInternal = () => {
|
|
|
4726
4755
|
}
|
|
4727
4756
|
if (type === "array") {
|
|
4728
4757
|
if (variant === "id-picker") {
|
|
4729
|
-
idPickerSanityCheck(column,
|
|
4730
|
-
return
|
|
4758
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4759
|
+
return jsxRuntime.jsx(IdPicker, { column: key, isMultiple: true }, `form-${key}`);
|
|
4731
4760
|
}
|
|
4732
4761
|
if (variant === "tag-picker") {
|
|
4733
4762
|
return jsxRuntime.jsx(TagPicker, { column: key }, `form-${key}`);
|
package/dist/index.mjs
CHANGED
|
@@ -2585,11 +2585,12 @@ const snakeToLabel = (str) => {
|
|
|
2585
2585
|
};
|
|
2586
2586
|
|
|
2587
2587
|
const RecordDisplay = ({ object, boxProps }) => {
|
|
2588
|
+
console.log(object, "dkfos");
|
|
2588
2589
|
if (object === null) {
|
|
2589
2590
|
return jsx(Fragment, { children: "null" });
|
|
2590
2591
|
}
|
|
2591
|
-
return (jsx(Grid, { rowGap: 1, overflow: "auto", ...boxProps, children: Object.entries(object).map(([field, value]) => {
|
|
2592
|
-
return (jsxs(Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsx(Text, { color: "gray.400", children: snakeToLabel(field) }), jsx(
|
|
2592
|
+
return (jsx(Grid, { rowGap: 1, padding: 1, overflow: "auto", ...boxProps, children: Object.entries(object).map(([field, value]) => {
|
|
2593
|
+
return (jsxs(Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsx(Text, { color: "gray.400", children: snakeToLabel(field) }), typeof value === "object" ? (jsx(RecordDisplay, { object: value })) : (jsx(Text, { children: JSON.stringify(value) }))] }, field));
|
|
2593
2594
|
}) }));
|
|
2594
2595
|
};
|
|
2595
2596
|
|
|
@@ -2757,6 +2758,16 @@ const fuzzyFilter = (row, columnId, value, addMeta) => {
|
|
|
2757
2758
|
// Return if the item should be filtered in/out
|
|
2758
2759
|
return itemRank.passed;
|
|
2759
2760
|
};
|
|
2761
|
+
/**
|
|
2762
|
+
* DataTable will create a context to hold all values to
|
|
2763
|
+
* help the render of the DataTable in serverside
|
|
2764
|
+
*
|
|
2765
|
+
*
|
|
2766
|
+
* The query is required to be a GET request that can receive
|
|
2767
|
+
* specified params and return a specified response
|
|
2768
|
+
*
|
|
2769
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
2770
|
+
*/
|
|
2760
2771
|
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, }) {
|
|
2761
2772
|
const table = useReactTable({
|
|
2762
2773
|
_features: [DensityFeature],
|
|
@@ -2816,6 +2827,17 @@ const DataTableServerContext = createContext({
|
|
|
2816
2827
|
url: "",
|
|
2817
2828
|
});
|
|
2818
2829
|
|
|
2830
|
+
/**
|
|
2831
|
+
* DataTableServer will create a context to hold all values to
|
|
2832
|
+
* help the render of the DataTable in serverside
|
|
2833
|
+
*
|
|
2834
|
+
* The query is required to be a GET request that can receive
|
|
2835
|
+
* specified params and return a specified response
|
|
2836
|
+
*
|
|
2837
|
+
* The `useDataTableServer` can help to create the specified request and response
|
|
2838
|
+
*
|
|
2839
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
2840
|
+
*/
|
|
2819
2841
|
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, }) {
|
|
2820
2842
|
const table = useReactTable({
|
|
2821
2843
|
_features: [DensityFeature],
|
|
@@ -3403,7 +3425,7 @@ const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth =
|
|
|
3403
3425
|
// @ts-expect-error find type for unknown
|
|
3404
3426
|
const value = props.row.original[column];
|
|
3405
3427
|
if (typeof value === "object") {
|
|
3406
|
-
return jsx(
|
|
3428
|
+
return (jsx(Grid, { overflow: "auto", children: jsx(RecordDisplay, { object: value }) }));
|
|
3407
3429
|
}
|
|
3408
3430
|
return jsx(TextCell, { children: value });
|
|
3409
3431
|
},
|
|
@@ -3563,7 +3585,7 @@ const getTableData = async ({ serverUrl, in_table, searching = "", where = [], l
|
|
|
3563
3585
|
}
|
|
3564
3586
|
};
|
|
3565
3587
|
|
|
3566
|
-
const IdPicker = ({ column,
|
|
3588
|
+
const IdPicker = ({ column, isMultiple = false }) => {
|
|
3567
3589
|
const { watch, formState: { errors }, setValue, } = useFormContext();
|
|
3568
3590
|
const { schema, serverUrl, displayText } = useSchemaContext();
|
|
3569
3591
|
const { fieldRequired } = displayText;
|
|
@@ -3573,7 +3595,9 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
|
|
|
3573
3595
|
throw new Error("schema properties when using DatePicker");
|
|
3574
3596
|
}
|
|
3575
3597
|
const { total, showing, typeToSearch } = displayText;
|
|
3576
|
-
const { gridColumn, gridRow, title, renderDisplay } = schema
|
|
3598
|
+
const { gridColumn, gridRow, title, renderDisplay, foreign_key } = schema
|
|
3599
|
+
.properties[column];
|
|
3600
|
+
const { table: in_table, column: column_ref, display_column } = foreign_key;
|
|
3577
3601
|
const [searchText, setSearchText] = useState();
|
|
3578
3602
|
const [limit, setLimit] = useState(10);
|
|
3579
3603
|
const [openSearchResult, setOpenSearchResult] = useState();
|
|
@@ -3582,7 +3606,7 @@ const IdPicker = ({ column, in_table, column_ref, display_column, isMultiple = f
|
|
|
3582
3606
|
const ref = useRef(null);
|
|
3583
3607
|
const selectedIds = watch(column) ?? [];
|
|
3584
3608
|
const query = useQuery({
|
|
3585
|
-
queryKey: [`idpicker`, { searchText,
|
|
3609
|
+
queryKey: [`idpicker`, { searchText, limit, page }],
|
|
3586
3610
|
queryFn: async () => {
|
|
3587
3611
|
const data = await getTableData({
|
|
3588
3612
|
serverUrl,
|
|
@@ -3709,21 +3733,25 @@ const DataListItem = React.forwardRef(function DataListItem(props, ref) {
|
|
|
3709
3733
|
return (jsxs(DataList.Item, { ref: ref, ...rest, children: [jsxs(DataList.ItemLabel, { flex: grow ? "1" : undefined, children: [label, info && jsx(InfoTip, { children: info })] }), jsx(DataList.ItemValue, { flex: grow ? "1" : undefined, children: value }), children] }));
|
|
3710
3734
|
});
|
|
3711
3735
|
|
|
3712
|
-
const IdViewer = ({ value,
|
|
3736
|
+
const IdViewer = ({ value, column }) => {
|
|
3713
3737
|
const { schema, serverUrl } = useSchemaContext();
|
|
3714
3738
|
if (schema.properties == undefined) {
|
|
3715
3739
|
throw new Error("schema properties when using DatePicker");
|
|
3716
3740
|
}
|
|
3717
|
-
const { title } = schema.properties[column];
|
|
3741
|
+
const { title, foreign_key } = schema.properties[column];
|
|
3742
|
+
if (foreign_key === undefined) {
|
|
3743
|
+
throw new Error('foreign_key when variant is id-picker');
|
|
3744
|
+
}
|
|
3745
|
+
const { table, column: foreginKeyColumn, display_column } = foreign_key;
|
|
3718
3746
|
const query = useQuery({
|
|
3719
|
-
queryKey: [`idpicker`,
|
|
3747
|
+
queryKey: [`idpicker`, table, value],
|
|
3720
3748
|
queryFn: async () => {
|
|
3721
3749
|
return await getTableData({
|
|
3722
3750
|
serverUrl,
|
|
3723
|
-
in_table:
|
|
3751
|
+
in_table: foreginKeyColumn ?? '',
|
|
3724
3752
|
where: [
|
|
3725
3753
|
{
|
|
3726
|
-
id:
|
|
3754
|
+
id: column,
|
|
3727
3755
|
value: value,
|
|
3728
3756
|
},
|
|
3729
3757
|
],
|
|
@@ -4494,15 +4522,19 @@ const EnumPicker = ({ column, isMultiple = false }) => {
|
|
|
4494
4522
|
}) }), 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" }))] }));
|
|
4495
4523
|
};
|
|
4496
4524
|
|
|
4497
|
-
const idPickerSanityCheck = (column,
|
|
4498
|
-
if (!!
|
|
4499
|
-
throw new Error(`The key
|
|
4525
|
+
const idPickerSanityCheck = (column, foreign_key) => {
|
|
4526
|
+
if (!!foreign_key == false) {
|
|
4527
|
+
throw new Error(`The key foreign_key does not exist in properties of column ${column} when using id-picker.`);
|
|
4500
4528
|
}
|
|
4501
|
-
|
|
4502
|
-
|
|
4529
|
+
const { table, column: foreignKeyColumn, display_column } = foreign_key;
|
|
4530
|
+
if (!!table == false) {
|
|
4531
|
+
throw new Error(`The key table does not exist in properties of column ${table} when using id-picker.`);
|
|
4503
4532
|
}
|
|
4504
4533
|
if (!!display_column == false) {
|
|
4505
|
-
throw new Error(`The key display_column does not exist in properties of column ${column}.`);
|
|
4534
|
+
throw new Error(`The key display_column does not exist in properties of column ${column} when using id-picker.`);
|
|
4535
|
+
}
|
|
4536
|
+
if (!!foreignKeyColumn == false) {
|
|
4537
|
+
throw new Error(`The key column does not exist in properties of column ${column} when using id-picker.`);
|
|
4506
4538
|
}
|
|
4507
4539
|
};
|
|
4508
4540
|
const FormInternal = () => {
|
|
@@ -4608,14 +4640,11 @@ const FormInternal = () => {
|
|
|
4608
4640
|
if (shouldIgnore) {
|
|
4609
4641
|
return jsx(Fragment, {});
|
|
4610
4642
|
}
|
|
4611
|
-
const { type, variant,
|
|
4643
|
+
const { type, variant, gridColumn, gridRow, foreign_key } = values;
|
|
4612
4644
|
if (type === "string") {
|
|
4613
4645
|
if (variant === "id-picker") {
|
|
4614
|
-
idPickerSanityCheck(column,
|
|
4615
|
-
return (jsx(IdViewer, { value: (validatedData ?? {})[column],
|
|
4616
|
-
column_ref,
|
|
4617
|
-
display_column,
|
|
4618
|
-
column,
|
|
4646
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4647
|
+
return (jsx(IdViewer, { value: (validatedData ?? {})[column], column,
|
|
4619
4648
|
gridColumn,
|
|
4620
4649
|
gridRow }, `form-${key}`));
|
|
4621
4650
|
}
|
|
@@ -4681,14 +4710,14 @@ const FormInternal = () => {
|
|
|
4681
4710
|
return jsx(Fragment, {});
|
|
4682
4711
|
}
|
|
4683
4712
|
//@ts-expect-error TODO: add more fields to support form-creation
|
|
4684
|
-
const { type, variant, in_table, column_ref,
|
|
4713
|
+
const { type, variant, in_table, column_ref, foreign_key } = values;
|
|
4685
4714
|
if (type === "string") {
|
|
4686
4715
|
if ((values.enum ?? []).length > 0) {
|
|
4687
4716
|
return jsx(EnumPicker, { column: key }, `form-${key}`);
|
|
4688
4717
|
}
|
|
4689
4718
|
if (variant === "id-picker") {
|
|
4690
|
-
idPickerSanityCheck(column,
|
|
4691
|
-
return
|
|
4719
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4720
|
+
return jsx(IdPicker, { column: key }, `form-${key}`);
|
|
4692
4721
|
}
|
|
4693
4722
|
if (variant === "date-picker") {
|
|
4694
4723
|
return jsx(DatePicker, { column: key }, `form-${key}`);
|
|
@@ -4706,8 +4735,8 @@ const FormInternal = () => {
|
|
|
4706
4735
|
}
|
|
4707
4736
|
if (type === "array") {
|
|
4708
4737
|
if (variant === "id-picker") {
|
|
4709
|
-
idPickerSanityCheck(column,
|
|
4710
|
-
return
|
|
4738
|
+
idPickerSanityCheck(column, foreign_key);
|
|
4739
|
+
return jsx(IdPicker, { column: key, isMultiple: true }, `form-${key}`);
|
|
4711
4740
|
}
|
|
4712
4741
|
if (variant === "tag-picker") {
|
|
4713
4742
|
return jsx(TagPicker, { column: key }, `form-${key}`);
|
|
@@ -12,7 +12,20 @@ declare module "@tanstack/react-table" {
|
|
|
12
12
|
}
|
|
13
13
|
export interface DataTableProps<TData = unknown> {
|
|
14
14
|
children?: ReactNode | ReactNode[];
|
|
15
|
+
/**
|
|
16
|
+
* Data array for the table.
|
|
17
|
+
*
|
|
18
|
+
* It will pass into as the data in `@tanstack/react-table`
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
15
21
|
data: TData[];
|
|
22
|
+
/**
|
|
23
|
+
* Column definitions for the table.
|
|
24
|
+
*
|
|
25
|
+
* It will pass into as the column definitions in `@tanstack/react-table`
|
|
26
|
+
*
|
|
27
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
28
|
+
*/
|
|
16
29
|
columns: ColumnDef<TData, unknown>[];
|
|
17
30
|
enableRowSelection?: boolean;
|
|
18
31
|
enableMultiRowSelection?: boolean;
|
|
@@ -35,4 +48,14 @@ export interface DataTableProps<TData = unknown> {
|
|
|
35
48
|
setDensity: OnChangeFn<DensityState>;
|
|
36
49
|
setColumnVisibility: OnChangeFn<VisibilityState>;
|
|
37
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* DataTable will create a context to hold all values to
|
|
53
|
+
* help the render of the DataTable in serverside
|
|
54
|
+
*
|
|
55
|
+
*
|
|
56
|
+
* The query is required to be a GET request that can receive
|
|
57
|
+
* specified params and return a specified response
|
|
58
|
+
*
|
|
59
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
60
|
+
*/
|
|
38
61
|
export declare function DataTable<TData = unknown>({ columns, data, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }: DataTableProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -5,6 +5,13 @@ import { DensityState } from "../Controls/DensityFeature";
|
|
|
5
5
|
import { DataResponse } from "./useDataTableServer";
|
|
6
6
|
export interface DataTableServerProps<TData extends DataResponse = DataResponse<unknown>> {
|
|
7
7
|
children: ReactNode | ReactNode[];
|
|
8
|
+
/**
|
|
9
|
+
* Column definitions for the table.
|
|
10
|
+
*
|
|
11
|
+
* It will pass into as the column definitions in `@tanstack/react-table`
|
|
12
|
+
*
|
|
13
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
14
|
+
*/
|
|
8
15
|
columns: ColumnDef<TData>[];
|
|
9
16
|
enableRowSelection?: boolean;
|
|
10
17
|
enableMultiRowSelection?: boolean;
|
|
@@ -28,4 +35,15 @@ export interface DataTableServerProps<TData extends DataResponse = DataResponse<
|
|
|
28
35
|
query: UseQueryResult<TData>;
|
|
29
36
|
url: string;
|
|
30
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* DataTableServer will create a context to hold all values to
|
|
40
|
+
* help the render of the DataTable in serverside
|
|
41
|
+
*
|
|
42
|
+
* The query is required to be a GET request that can receive
|
|
43
|
+
* specified params and return a specified response
|
|
44
|
+
*
|
|
45
|
+
* The `useDataTableServer` can help to create the specified request and response
|
|
46
|
+
*
|
|
47
|
+
* @link https://tanstack.com/table/latest/docs/guide/column-defs
|
|
48
|
+
*/
|
|
31
49
|
export declare function DataTableServer<TData extends DataResponse = DataResponse<unknown>>({ columns, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, children, url, }: DataTableServerProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
export interface IdPickerProps {
|
|
2
2
|
column: string;
|
|
3
|
-
in_table: string;
|
|
4
|
-
column_ref: string;
|
|
5
|
-
display_column: string;
|
|
6
3
|
isMultiple?: boolean;
|
|
7
4
|
}
|
|
8
|
-
export declare const IdPicker: ({ column,
|
|
5
|
+
export declare const IdPicker: ({ column, isMultiple }: IdPickerProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
export interface IdViewerProps {
|
|
2
2
|
value: string | undefined;
|
|
3
|
-
in_table: string;
|
|
4
|
-
column_ref: string;
|
|
5
|
-
display_column: string;
|
|
6
3
|
column: string;
|
|
7
4
|
}
|
|
8
|
-
export declare const IdViewer: ({ value,
|
|
5
|
+
export declare const IdViewer: ({ value, column }: IdViewerProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -8,5 +8,10 @@ export interface CustomJSONSchema7 extends JSONSchema7 {
|
|
|
8
8
|
title?: string;
|
|
9
9
|
in_table?: string;
|
|
10
10
|
object_id_column?: string;
|
|
11
|
+
foreign_key?: {
|
|
12
|
+
column?: string;
|
|
13
|
+
table?: string;
|
|
14
|
+
display_column: string;
|
|
15
|
+
};
|
|
11
16
|
}
|
|
12
17
|
export declare const StringInputField: ({ column }: StringInputFieldProps) => import("react/jsx-runtime").JSX.Element;
|