@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 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(react.Text, { children: typeof value === "object" ? JSON.stringify(value) : value })] }, field));
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(TextCell, { children: JSON.stringify(value) });
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, in_table, column_ref, display_column, isMultiple = false, }) => {
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.properties[column];
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, in_table, limit, page }],
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, in_table, column_ref, display_column, column, }) => {
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`, in_table, value],
3767
+ queryKey: [`idpicker`, table, value],
3740
3768
  queryFn: async () => {
3741
3769
  return await getTableData({
3742
3770
  serverUrl,
3743
- in_table: in_table,
3771
+ in_table: foreginKeyColumn ?? '',
3744
3772
  where: [
3745
3773
  {
3746
- id: column_ref,
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, in_table, column_ref, display_column) => {
4518
- if (!!in_table == false) {
4519
- throw new Error(`The key in_table does not exist in properties of column ${column}.`);
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
- if (!!column_ref == false) {
4522
- throw new Error(`The key column_ref does not exist in properties of column ${column}.`);
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, in_table, column_ref, display_column, gridColumn, gridRow, } = values;
4663
+ const { type, variant, gridColumn, gridRow, foreign_key } = values;
4632
4664
  if (type === "string") {
4633
4665
  if (variant === "id-picker") {
4634
- idPickerSanityCheck(column, in_table, column_ref, display_column);
4635
- return (jsxRuntime.jsx(IdViewer, { value: (validatedData ?? {})[column], in_table,
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, display_column } = values;
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, in_table, column_ref, display_column);
4711
- return (jsxRuntime.jsx(IdPicker, { column: key, in_table: in_table, column_ref: column_ref, display_column: display_column }, `form-${key}`));
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, in_table, column_ref, display_column);
4730
- return (jsxRuntime.jsx(IdPicker, { column: key, in_table: in_table, column_ref: column_ref, display_column: display_column, isMultiple: true }, `form-${key}`));
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(Text, { children: typeof value === "object" ? JSON.stringify(value) : value })] }, field));
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(TextCell, { children: JSON.stringify(value) });
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, in_table, column_ref, display_column, isMultiple = false, }) => {
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.properties[column];
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, in_table, limit, page }],
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, in_table, column_ref, display_column, column, }) => {
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`, in_table, value],
3747
+ queryKey: [`idpicker`, table, value],
3720
3748
  queryFn: async () => {
3721
3749
  return await getTableData({
3722
3750
  serverUrl,
3723
- in_table: in_table,
3751
+ in_table: foreginKeyColumn ?? '',
3724
3752
  where: [
3725
3753
  {
3726
- id: column_ref,
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, in_table, column_ref, display_column) => {
4498
- if (!!in_table == false) {
4499
- throw new Error(`The key in_table does not exist in properties of column ${column}.`);
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
- if (!!column_ref == false) {
4502
- throw new Error(`The key column_ref does not exist in properties of column ${column}.`);
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, in_table, column_ref, display_column, gridColumn, gridRow, } = values;
4643
+ const { type, variant, gridColumn, gridRow, foreign_key } = values;
4612
4644
  if (type === "string") {
4613
4645
  if (variant === "id-picker") {
4614
- idPickerSanityCheck(column, in_table, column_ref, display_column);
4615
- return (jsx(IdViewer, { value: (validatedData ?? {})[column], in_table,
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, display_column } = values;
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, in_table, column_ref, display_column);
4691
- return (jsx(IdPicker, { column: key, in_table: in_table, column_ref: column_ref, display_column: display_column }, `form-${key}`));
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, in_table, column_ref, display_column);
4710
- return (jsx(IdPicker, { column: key, in_table: in_table, column_ref: column_ref, display_column: display_column, isMultiple: true }, `form-${key}`));
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, in_table, column_ref, display_column, isMultiple, }: IdPickerProps) => import("react/jsx-runtime").JSX.Element;
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, in_table, column_ref, display_column, column, }: IdViewerProps) => import("react/jsx-runtime").JSX.Element;
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "7.6.3",
3
+ "version": "8.0.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",