@bsol-oss/react-datatable5 2.2.0 → 3.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
@@ -122,9 +122,70 @@ interface DataTableProps<TData> {
122
122
  }
123
123
  declare const DataTable: <TData>({ columns, data, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }: DataTableProps<TData>) => react_jsx_runtime.JSX.Element;
124
124
 
125
- interface DataTableServerProps<TData> {
126
- children: JSX.Element | JSX.Element[];
125
+ interface UseDataFromUrlReturn<T> {
126
+ data: T;
127
+ loading: boolean;
128
+ hasError: boolean;
129
+ refreshData: () => void;
130
+ }
131
+ interface UseDataFromUrlProps<T> {
127
132
  url: string;
133
+ params?: object;
134
+ defaultData: T;
135
+ disableFirstFetch?: boolean;
136
+ onFetchSuccess?: (data: T) => void;
137
+ }
138
+ declare const useDataFromUrl: <T>({ url, params, disableFirstFetch, onFetchSuccess, defaultData, }: UseDataFromUrlProps<T>) => UseDataFromUrlReturn<T>;
139
+
140
+ interface UseDataTableProps {
141
+ default?: {
142
+ sorting?: SortingState;
143
+ columnFilters?: ColumnFiltersState;
144
+ pagination?: PaginationState;
145
+ rowSelection?: RowSelectionState;
146
+ columnOrder?: ColumnOrderState;
147
+ globalFilter?: string;
148
+ columnVisibility?: VisibilityState;
149
+ density?: DensityState;
150
+ };
151
+ }
152
+ interface UseDataTableReturn {
153
+ sorting: SortingState;
154
+ columnFilters: ColumnFiltersState;
155
+ pagination: PaginationState;
156
+ rowSelection: RowSelectionState;
157
+ columnOrder: ColumnOrderState;
158
+ globalFilter: string;
159
+ columnVisibility: VisibilityState;
160
+ density: DensityState;
161
+ setPagination: OnChangeFn<PaginationState>;
162
+ setSorting: OnChangeFn<SortingState>;
163
+ setColumnFilters: OnChangeFn<ColumnFiltersState>;
164
+ setRowSelection: OnChangeFn<RowSelectionState>;
165
+ setGlobalFilter: OnChangeFn<string>;
166
+ setColumnOrder: OnChangeFn<ColumnOrderState>;
167
+ setDensity: OnChangeFn<DensityState>;
168
+ setColumnVisibility: OnChangeFn<VisibilityState>;
169
+ }
170
+ declare const useDataTable: ({ default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, }?: UseDataTableProps) => UseDataTableReturn;
171
+
172
+ interface UseDataTableServerProps<TData> extends Omit<UseDataFromUrlProps<DataResponse<TData>>, keyof {
173
+ defaultData: any;
174
+ }>, UseDataTableProps {
175
+ }
176
+ interface UseDataTableServerReturn<TData> extends UseDataFromUrlReturn<DataResponse<TData>>, UseDataTableReturn {
177
+ }
178
+ interface Result<T> {
179
+ results: T[];
180
+ }
181
+ interface DataResponse<T> extends Result<T> {
182
+ success: boolean;
183
+ count: number;
184
+ }
185
+ declare const useDataTableServer: <TData>({ url, onFetchSuccess, default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, }: UseDataTableServerProps<TData>) => UseDataTableServerReturn<TData>;
186
+
187
+ interface DataTableServerProps<TData> extends UseDataFromUrlReturn<DataResponse<TData>> {
188
+ children: JSX.Element | JSX.Element[];
128
189
  columns: ColumnDef<TData, any>[];
129
190
  enableRowSelection?: boolean;
130
191
  enableMultiRowSelection?: boolean;
@@ -146,16 +207,8 @@ interface DataTableServerProps<TData> {
146
207
  setColumnOrder: OnChangeFn<ColumnOrderState>;
147
208
  setDensity: OnChangeFn<DensityState>;
148
209
  setColumnVisibility: OnChangeFn<VisibilityState>;
149
- onFetchSuccess?: (response: DataResponse<TData>) => void;
150
210
  }
151
- interface Result<T> {
152
- results: T[];
153
- }
154
- interface DataResponse<T> extends Result<T> {
155
- success: boolean;
156
- count: number;
157
- }
158
- declare const DataTableServer: <TData>({ columns, url, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, onFetchSuccess, children, }: DataTableServerProps<TData>) => react_jsx_runtime.JSX.Element;
211
+ declare const DataTableServer: <TData>({ columns, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, data, loading, hasError, refreshData, children, }: DataTableServerProps<TData>) => react_jsx_runtime.JSX.Element;
159
212
 
160
213
  interface TableControlsProps {
161
214
  totalText?: string;
@@ -269,53 +322,6 @@ interface TextCellProps extends TextProps {
269
322
  }
270
323
  declare const TextCell: ({ label, noOfLines, padding, children, tooltipProps, ...props }: TextCellProps) => react_jsx_runtime.JSX.Element;
271
324
 
272
- interface useDataFromUrlReturn<T> {
273
- data: T;
274
- loading: boolean;
275
- hasError: boolean;
276
- refreshData: () => void;
277
- }
278
- interface useDataFromUrlProps<T> {
279
- url: string;
280
- params?: object;
281
- defaultData: T;
282
- disableFirstFetch?: boolean;
283
- onFetchSuccess?: (data: T) => void;
284
- }
285
- declare const useDataFromUrl: <T>({ url, params, disableFirstFetch, onFetchSuccess, defaultData, }: useDataFromUrlProps<T>) => useDataFromUrlReturn<T>;
286
-
287
- interface UseDataTableProps {
288
- default: {
289
- sorting?: SortingState;
290
- columnFilters?: ColumnFiltersState;
291
- pagination?: PaginationState;
292
- rowSelection?: RowSelectionState;
293
- columnOrder?: ColumnOrderState;
294
- globalFilter?: string;
295
- columnVisibility?: VisibilityState;
296
- density?: DensityState;
297
- };
298
- }
299
- interface UseDataTableReturn {
300
- sorting: SortingState;
301
- columnFilters: ColumnFiltersState;
302
- pagination: PaginationState;
303
- rowSelection: RowSelectionState;
304
- columnOrder: ColumnOrderState;
305
- globalFilter: string;
306
- columnVisibility: VisibilityState;
307
- density: DensityState;
308
- setPagination: OnChangeFn<PaginationState>;
309
- setSorting: OnChangeFn<SortingState>;
310
- setColumnFilters: OnChangeFn<ColumnFiltersState>;
311
- setRowSelection: OnChangeFn<RowSelectionState>;
312
- setGlobalFilter: OnChangeFn<string>;
313
- setColumnOrder: OnChangeFn<ColumnOrderState>;
314
- setDensity: OnChangeFn<DensityState>;
315
- setColumnVisibility: OnChangeFn<VisibilityState>;
316
- }
317
- declare const useDataTable: ({ default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, }?: UseDataTableProps) => UseDataTableReturn;
318
-
319
325
  declare const useDataTableContext: () => {
320
326
  table: _tanstack_table_core.Table<any>;
321
327
  refreshData: () => void;
@@ -386,4 +392,4 @@ declare module "@tanstack/react-table" {
386
392
  }
387
393
  }
388
394
 
389
- export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, DefaultTable, type DefaultTableProps, DensityToggleButton, type DensityToggleButtonProps, EditFilterButton, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, EditViewButton, type EditViewButtonProps, FilterOptions, type FilterOptionsProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, type PaginationProps, ReloadButton, type ReloadButtonProps, ResetFilteringButton, type ResetFilteringButtonProps, ResetSelectionButton, type ResetSelectionButtonProps, ResetSortingButton, type ResetSortingButtonProps, type Result, RowCountText, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableComponent, TableControls, type TableControlsProps, TableFilter, TableFilterTags, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableLoadingComponent, type TableLoadingComponentProps, TableOrderer, TablePagination, type TableProps, type TableRendererProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, type UseDataTableProps, type UseDataTableReturn, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable, useDataTableContext };
395
+ export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, DefaultTable, type DefaultTableProps, DensityToggleButton, type DensityToggleButtonProps, EditFilterButton, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, EditViewButton, type EditViewButtonProps, FilterOptions, type FilterOptionsProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, type PaginationProps, ReloadButton, type ReloadButtonProps, ResetFilteringButton, type ResetFilteringButtonProps, ResetSelectionButton, type ResetSelectionButtonProps, ResetSortingButton, type ResetSortingButtonProps, type Result, RowCountText, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableComponent, TableControls, type TableControlsProps, TableFilter, TableFilterTags, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableLoadingComponent, type TableLoadingComponentProps, TableOrderer, TablePagination, type TableProps, type TableRendererProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, type UseDataFromUrlProps, type UseDataFromUrlReturn, type UseDataTableProps, type UseDataTableReturn, type UseDataTableServerProps, type UseDataTableServerReturn, useDataFromUrl, useDataTable, useDataTableContext, useDataTableServer };
package/dist/index.js CHANGED
@@ -9,13 +9,13 @@ var react$1 = require('react');
9
9
  var io = require('react-icons/io');
10
10
  var reactTable = require('@tanstack/react-table');
11
11
  var matchSorterUtils = require('@tanstack/match-sorter-utils');
12
- var axios = require('axios');
13
12
  var table = require('@chakra-ui/table');
14
13
  var bs = require('react-icons/bs');
15
14
  var gr = require('react-icons/gr');
16
15
  var io5 = require('react-icons/io5');
17
16
  var reactBeautifulDnd = require('react-beautiful-dnd');
18
17
  var fa = require('react-icons/fa');
18
+ var axios = require('axios');
19
19
 
20
20
  const DensityToggleButton = ({ text, icon = jsxRuntime.jsx(ai.AiOutlineColumnWidth, {}), }) => {
21
21
  const { table } = useDataTableContext();
@@ -263,66 +263,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
263
263
  }, children: children }));
264
264
  };
265
265
 
266
- const useDataFromUrl = ({ url, params = {}, disableFirstFetch = false, onFetchSuccess = () => { }, defaultData, }) => {
267
- const [loading, setLoading] = react$1.useState(true);
268
- const [hasError, setHasError] = react$1.useState(false);
269
- const [data, setData] = react$1.useState(defaultData);
270
- const refreshData = async () => {
271
- await getData();
272
- };
273
- const getData = async () => {
274
- try {
275
- setHasError(false);
276
- setLoading(true);
277
- const { data } = await axios.get(url, { params: params });
278
- console.debug("get DataFromUrl success", data);
279
- onFetchSuccess(data);
280
- setLoading(false);
281
- setData(data);
282
- }
283
- catch (e) {
284
- console.log("Error", e);
285
- setLoading(false);
286
- setHasError(true);
287
- }
288
- };
289
- react$1.useEffect(() => {
290
- if (disableFirstFetch) {
291
- return;
292
- }
293
- getData().catch((e) => {
294
- console.error(e);
295
- });
296
- }, [url]);
297
- return { data, loading, hasError, refreshData };
298
- };
299
-
300
- const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, onFetchSuccess, children, }) => {
301
- const { data, loading, hasError, refreshData } = useDataFromUrl({
302
- url: url,
303
- defaultData: {
304
- success: false,
305
- results: [],
306
- count: 0,
307
- },
308
- params: {
309
- pagination: JSON.stringify({
310
- offset: pagination.pageIndex * pagination.pageSize,
311
- rows: pagination.pageSize,
312
- }),
313
- sorting: JSON.stringify(sorting.length > 0
314
- ? { field: sorting[0].id, sort: sorting[0].desc ? "desc" : "asc" }
315
- : {}),
316
- where: JSON.stringify(columnFilters.reduce((accumulator, filter) => {
317
- const obj = {};
318
- obj[filter.id] = filter.value;
319
- return { ...accumulator, ...obj };
320
- }, {})),
321
- searching: globalFilter,
322
- },
323
- disableFirstFetch: true,
324
- onFetchSuccess: onFetchSuccess,
325
- });
266
+ const DataTableServer = ({ columns, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, data, loading, hasError, refreshData, children, }) => {
326
267
  const table = reactTable.useReactTable({
327
268
  _features: [DensityFeature],
328
269
  data: data.results,
@@ -370,9 +311,6 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
370
311
  },
371
312
  // for tanstack-table ts bug end
372
313
  });
373
- react$1.useEffect(() => {
374
- refreshData();
375
- }, [pagination, sorting, columnFilters, globalFilter, url]);
376
314
  react$1.useEffect(() => {
377
315
  setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
378
316
  }, []);
@@ -381,7 +319,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
381
319
  }, [table.getState().rowSelection]);
382
320
  react$1.useEffect(() => {
383
321
  table.resetPagination();
384
- }, [sorting, columnFilters, globalFilter, url]);
322
+ }, [sorting, columnFilters, globalFilter]);
385
323
  return (jsxRuntime.jsx(TableContext.Provider, { value: {
386
324
  table: { ...table },
387
325
  refreshData: refreshData,
@@ -847,6 +785,40 @@ const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipP
847
785
  return (jsxRuntime.jsx(react.Flex, { alignItems: "center", height: "100%", padding: padding, children: jsxRuntime.jsx(react.Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }));
848
786
  };
849
787
 
788
+ const useDataFromUrl = ({ url, params = {}, disableFirstFetch = false, onFetchSuccess = () => { }, defaultData, }) => {
789
+ const [loading, setLoading] = react$1.useState(true);
790
+ const [hasError, setHasError] = react$1.useState(false);
791
+ const [data, setData] = react$1.useState(defaultData);
792
+ const refreshData = async () => {
793
+ await getData();
794
+ };
795
+ const getData = async () => {
796
+ try {
797
+ setHasError(false);
798
+ setLoading(true);
799
+ const { data } = await axios.get(url, { params: params });
800
+ console.debug("get DataFromUrl success", data);
801
+ onFetchSuccess(data);
802
+ setLoading(false);
803
+ setData(data);
804
+ }
805
+ catch (e) {
806
+ console.log("Error", e);
807
+ setLoading(false);
808
+ setHasError(true);
809
+ }
810
+ };
811
+ react$1.useEffect(() => {
812
+ if (disableFirstFetch) {
813
+ return;
814
+ }
815
+ getData().catch((e) => {
816
+ console.error(e);
817
+ });
818
+ }, [url]);
819
+ return { data, loading, hasError, refreshData };
820
+ };
821
+
850
822
  const useDataTable = ({ default: { sorting: defaultSorting = [], pagination: defaultPagination = {
851
823
  pageIndex: 0, //initial page index
852
824
  pageSize: 10, //default page size
@@ -905,6 +877,82 @@ const useDataTable = ({ default: { sorting: defaultSorting = [], pagination: def
905
877
  };
906
878
  };
907
879
 
880
+ const useDataTableServer = ({ url, onFetchSuccess = () => { }, default: { sorting: defaultSorting = [], pagination: defaultPagination = {
881
+ pageIndex: 0, //initial page index
882
+ pageSize: 10, //default page size
883
+ }, rowSelection: defaultRowSelection = {}, columnFilters: defaultColumnFilters = [], columnOrder: defaultColumnOrder = [], columnVisibility: defaultColumnVisibility = {}, globalFilter: defaultGlobalFilter = "", density: defaultDensity = "sm", } = {
884
+ sorting: [],
885
+ pagination: {
886
+ pageIndex: 0, //initial page index
887
+ pageSize: 10, //age size
888
+ },
889
+ rowSelection: {},
890
+ columnFilters: [],
891
+ columnOrder: [],
892
+ columnVisibility: {},
893
+ globalFilter: "",
894
+ density: "sm",
895
+ }, }) => {
896
+ const [sorting, setSorting] = react$1.useState(defaultSorting);
897
+ const [columnFilters, setColumnFilters] = react$1.useState(defaultColumnFilters); // can set initial column filter state here
898
+ const [pagination, setPagination] = react$1.useState(defaultPagination);
899
+ const [rowSelection, setRowSelection] = react$1.useState(defaultRowSelection);
900
+ const [columnOrder, setColumnOrder] = react$1.useState(defaultColumnOrder);
901
+ const [globalFilter, setGlobalFilter] = react$1.useState(defaultGlobalFilter);
902
+ const [density, setDensity] = react$1.useState(defaultDensity);
903
+ const [columnVisibility, setColumnVisibility] = react$1.useState(defaultColumnVisibility);
904
+ const { data, loading, hasError, refreshData } = useDataFromUrl({
905
+ url: url,
906
+ defaultData: {
907
+ success: false,
908
+ results: [],
909
+ count: 0,
910
+ },
911
+ params: {
912
+ pagination: JSON.stringify({
913
+ offset: pagination.pageIndex * pagination.pageSize,
914
+ rows: pagination.pageSize,
915
+ }),
916
+ sorting: JSON.stringify(sorting.length > 0
917
+ ? { field: sorting[0].id, sort: sorting[0].desc ? "desc" : "asc" }
918
+ : {}),
919
+ where: JSON.stringify(columnFilters.reduce((accumulator, filter) => {
920
+ const obj = {};
921
+ obj[filter.id] = filter.value;
922
+ return { ...accumulator, ...obj };
923
+ }, {})),
924
+ searching: globalFilter,
925
+ },
926
+ disableFirstFetch: true,
927
+ onFetchSuccess: onFetchSuccess,
928
+ });
929
+ react$1.useEffect(() => {
930
+ refreshData();
931
+ }, [pagination, sorting, columnFilters, globalFilter, url]);
932
+ return {
933
+ sorting,
934
+ setSorting,
935
+ columnFilters,
936
+ setColumnFilters,
937
+ pagination,
938
+ setPagination,
939
+ rowSelection,
940
+ setRowSelection,
941
+ columnOrder,
942
+ setColumnOrder,
943
+ globalFilter,
944
+ setGlobalFilter,
945
+ density,
946
+ setDensity,
947
+ columnVisibility,
948
+ setColumnVisibility,
949
+ data,
950
+ loading,
951
+ hasError,
952
+ refreshData,
953
+ };
954
+ };
955
+
908
956
  const FilterOptions = ({ column }) => {
909
957
  const { table } = useDataTableContext();
910
958
  const tableColumn = table.getColumn(column);
@@ -971,3 +1019,4 @@ exports.TextCell = TextCell;
971
1019
  exports.useDataFromUrl = useDataFromUrl;
972
1020
  exports.useDataTable = useDataTable;
973
1021
  exports.useDataTableContext = useDataTableContext;
1022
+ exports.useDataTableServer = useDataTableServer;
package/dist/index.mjs CHANGED
@@ -7,13 +7,13 @@ import { createContext, useContext, useEffect, useState } from 'react';
7
7
  import { IoMdEye, IoMdCheckbox } from 'react-icons/io';
8
8
  import { makeStateUpdater, functionalUpdate, useReactTable, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getPaginationRowModel, flexRender } from '@tanstack/react-table';
9
9
  import { rankItem } from '@tanstack/match-sorter-utils';
10
- import axios from 'axios';
11
10
  import { Tbody, Tr, Td } from '@chakra-ui/table';
12
11
  import { BsExclamationCircleFill } from 'react-icons/bs';
13
12
  import { GrAscend, GrDescend } from 'react-icons/gr';
14
13
  import { IoReload } from 'react-icons/io5';
15
14
  import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
16
15
  import { FaGripLinesVertical } from 'react-icons/fa';
16
+ import axios from 'axios';
17
17
 
18
18
  const DensityToggleButton = ({ text, icon = jsx(AiOutlineColumnWidth, {}), }) => {
19
19
  const { table } = useDataTableContext();
@@ -261,66 +261,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
261
261
  }, children: children }));
262
262
  };
263
263
 
264
- const useDataFromUrl = ({ url, params = {}, disableFirstFetch = false, onFetchSuccess = () => { }, defaultData, }) => {
265
- const [loading, setLoading] = useState(true);
266
- const [hasError, setHasError] = useState(false);
267
- const [data, setData] = useState(defaultData);
268
- const refreshData = async () => {
269
- await getData();
270
- };
271
- const getData = async () => {
272
- try {
273
- setHasError(false);
274
- setLoading(true);
275
- const { data } = await axios.get(url, { params: params });
276
- console.debug("get DataFromUrl success", data);
277
- onFetchSuccess(data);
278
- setLoading(false);
279
- setData(data);
280
- }
281
- catch (e) {
282
- console.log("Error", e);
283
- setLoading(false);
284
- setHasError(true);
285
- }
286
- };
287
- useEffect(() => {
288
- if (disableFirstFetch) {
289
- return;
290
- }
291
- getData().catch((e) => {
292
- console.error(e);
293
- });
294
- }, [url]);
295
- return { data, loading, hasError, refreshData };
296
- };
297
-
298
- const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, onFetchSuccess, children, }) => {
299
- const { data, loading, hasError, refreshData } = useDataFromUrl({
300
- url: url,
301
- defaultData: {
302
- success: false,
303
- results: [],
304
- count: 0,
305
- },
306
- params: {
307
- pagination: JSON.stringify({
308
- offset: pagination.pageIndex * pagination.pageSize,
309
- rows: pagination.pageSize,
310
- }),
311
- sorting: JSON.stringify(sorting.length > 0
312
- ? { field: sorting[0].id, sort: sorting[0].desc ? "desc" : "asc" }
313
- : {}),
314
- where: JSON.stringify(columnFilters.reduce((accumulator, filter) => {
315
- const obj = {};
316
- obj[filter.id] = filter.value;
317
- return { ...accumulator, ...obj };
318
- }, {})),
319
- searching: globalFilter,
320
- },
321
- disableFirstFetch: true,
322
- onFetchSuccess: onFetchSuccess,
323
- });
264
+ const DataTableServer = ({ columns, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, data, loading, hasError, refreshData, children, }) => {
324
265
  const table = useReactTable({
325
266
  _features: [DensityFeature],
326
267
  data: data.results,
@@ -368,9 +309,6 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
368
309
  },
369
310
  // for tanstack-table ts bug end
370
311
  });
371
- useEffect(() => {
372
- refreshData();
373
- }, [pagination, sorting, columnFilters, globalFilter, url]);
374
312
  useEffect(() => {
375
313
  setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
376
314
  }, []);
@@ -379,7 +317,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
379
317
  }, [table.getState().rowSelection]);
380
318
  useEffect(() => {
381
319
  table.resetPagination();
382
- }, [sorting, columnFilters, globalFilter, url]);
320
+ }, [sorting, columnFilters, globalFilter]);
383
321
  return (jsx(TableContext.Provider, { value: {
384
322
  table: { ...table },
385
323
  refreshData: refreshData,
@@ -845,6 +783,40 @@ const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipP
845
783
  return (jsx(Flex, { alignItems: "center", height: "100%", padding: padding, children: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }));
846
784
  };
847
785
 
786
+ const useDataFromUrl = ({ url, params = {}, disableFirstFetch = false, onFetchSuccess = () => { }, defaultData, }) => {
787
+ const [loading, setLoading] = useState(true);
788
+ const [hasError, setHasError] = useState(false);
789
+ const [data, setData] = useState(defaultData);
790
+ const refreshData = async () => {
791
+ await getData();
792
+ };
793
+ const getData = async () => {
794
+ try {
795
+ setHasError(false);
796
+ setLoading(true);
797
+ const { data } = await axios.get(url, { params: params });
798
+ console.debug("get DataFromUrl success", data);
799
+ onFetchSuccess(data);
800
+ setLoading(false);
801
+ setData(data);
802
+ }
803
+ catch (e) {
804
+ console.log("Error", e);
805
+ setLoading(false);
806
+ setHasError(true);
807
+ }
808
+ };
809
+ useEffect(() => {
810
+ if (disableFirstFetch) {
811
+ return;
812
+ }
813
+ getData().catch((e) => {
814
+ console.error(e);
815
+ });
816
+ }, [url]);
817
+ return { data, loading, hasError, refreshData };
818
+ };
819
+
848
820
  const useDataTable = ({ default: { sorting: defaultSorting = [], pagination: defaultPagination = {
849
821
  pageIndex: 0, //initial page index
850
822
  pageSize: 10, //default page size
@@ -903,6 +875,82 @@ const useDataTable = ({ default: { sorting: defaultSorting = [], pagination: def
903
875
  };
904
876
  };
905
877
 
878
+ const useDataTableServer = ({ url, onFetchSuccess = () => { }, default: { sorting: defaultSorting = [], pagination: defaultPagination = {
879
+ pageIndex: 0, //initial page index
880
+ pageSize: 10, //default page size
881
+ }, rowSelection: defaultRowSelection = {}, columnFilters: defaultColumnFilters = [], columnOrder: defaultColumnOrder = [], columnVisibility: defaultColumnVisibility = {}, globalFilter: defaultGlobalFilter = "", density: defaultDensity = "sm", } = {
882
+ sorting: [],
883
+ pagination: {
884
+ pageIndex: 0, //initial page index
885
+ pageSize: 10, //age size
886
+ },
887
+ rowSelection: {},
888
+ columnFilters: [],
889
+ columnOrder: [],
890
+ columnVisibility: {},
891
+ globalFilter: "",
892
+ density: "sm",
893
+ }, }) => {
894
+ const [sorting, setSorting] = useState(defaultSorting);
895
+ const [columnFilters, setColumnFilters] = useState(defaultColumnFilters); // can set initial column filter state here
896
+ const [pagination, setPagination] = useState(defaultPagination);
897
+ const [rowSelection, setRowSelection] = useState(defaultRowSelection);
898
+ const [columnOrder, setColumnOrder] = useState(defaultColumnOrder);
899
+ const [globalFilter, setGlobalFilter] = useState(defaultGlobalFilter);
900
+ const [density, setDensity] = useState(defaultDensity);
901
+ const [columnVisibility, setColumnVisibility] = useState(defaultColumnVisibility);
902
+ const { data, loading, hasError, refreshData } = useDataFromUrl({
903
+ url: url,
904
+ defaultData: {
905
+ success: false,
906
+ results: [],
907
+ count: 0,
908
+ },
909
+ params: {
910
+ pagination: JSON.stringify({
911
+ offset: pagination.pageIndex * pagination.pageSize,
912
+ rows: pagination.pageSize,
913
+ }),
914
+ sorting: JSON.stringify(sorting.length > 0
915
+ ? { field: sorting[0].id, sort: sorting[0].desc ? "desc" : "asc" }
916
+ : {}),
917
+ where: JSON.stringify(columnFilters.reduce((accumulator, filter) => {
918
+ const obj = {};
919
+ obj[filter.id] = filter.value;
920
+ return { ...accumulator, ...obj };
921
+ }, {})),
922
+ searching: globalFilter,
923
+ },
924
+ disableFirstFetch: true,
925
+ onFetchSuccess: onFetchSuccess,
926
+ });
927
+ useEffect(() => {
928
+ refreshData();
929
+ }, [pagination, sorting, columnFilters, globalFilter, url]);
930
+ return {
931
+ sorting,
932
+ setSorting,
933
+ columnFilters,
934
+ setColumnFilters,
935
+ pagination,
936
+ setPagination,
937
+ rowSelection,
938
+ setRowSelection,
939
+ columnOrder,
940
+ setColumnOrder,
941
+ globalFilter,
942
+ setGlobalFilter,
943
+ density,
944
+ setDensity,
945
+ columnVisibility,
946
+ setColumnVisibility,
947
+ data,
948
+ loading,
949
+ hasError,
950
+ refreshData,
951
+ };
952
+ };
953
+
906
954
  const FilterOptions = ({ column }) => {
907
955
  const { table } = useDataTableContext();
908
956
  const tableColumn = table.getColumn(column);
@@ -933,4 +981,4 @@ const GlobalFilter = ({ icon = MdSearch }) => {
933
981
  } })] }) }) }));
934
982
  };
935
983
 
936
- export { DataTable, DataTableServer, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, FilterOptions, GlobalFilter, PageSizeControl, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, useDataFromUrl, useDataTable, useDataTableContext };
984
+ export { DataTable, DataTableServer, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, FilterOptions, GlobalFilter, PageSizeControl, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, useDataFromUrl, useDataTable, useDataTableContext, useDataTableServer };
@@ -1,9 +1,10 @@
1
1
  /// <reference types="react" />
2
2
  import { ColumnDef, ColumnFiltersState, ColumnOrderState, OnChangeFn, PaginationState, RowSelectionState, SortingState, VisibilityState } from "@tanstack/react-table";
3
3
  import { DensityState } from "../Controls/DensityFeature";
4
- export interface DataTableServerProps<TData> {
4
+ import { UseDataFromUrlReturn } from "./useDataFromUrl";
5
+ import { DataResponse } from "./useDataTableServer";
6
+ export interface DataTableServerProps<TData> extends UseDataFromUrlReturn<DataResponse<TData>> {
5
7
  children: JSX.Element | JSX.Element[];
6
- url: string;
7
8
  columns: ColumnDef<TData, any>[];
8
9
  enableRowSelection?: boolean;
9
10
  enableMultiRowSelection?: boolean;
@@ -25,13 +26,5 @@ export interface DataTableServerProps<TData> {
25
26
  setColumnOrder: OnChangeFn<ColumnOrderState>;
26
27
  setDensity: OnChangeFn<DensityState>;
27
28
  setColumnVisibility: OnChangeFn<VisibilityState>;
28
- onFetchSuccess?: (response: DataResponse<TData>) => void;
29
29
  }
30
- export interface Result<T> {
31
- results: T[];
32
- }
33
- export interface DataResponse<T> extends Result<T> {
34
- success: boolean;
35
- count: number;
36
- }
37
- export declare const DataTableServer: <TData>({ columns, url, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, onFetchSuccess, children, }: DataTableServerProps<TData>) => import("react/jsx-runtime").JSX.Element;
30
+ export declare const DataTableServer: <TData>({ columns, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, data, loading, hasError, refreshData, children, }: DataTableServerProps<TData>) => import("react/jsx-runtime").JSX.Element;
@@ -1,14 +1,14 @@
1
- export interface useDataFromUrlReturn<T> {
1
+ export interface UseDataFromUrlReturn<T> {
2
2
  data: T;
3
3
  loading: boolean;
4
4
  hasError: boolean;
5
5
  refreshData: () => void;
6
6
  }
7
- export interface useDataFromUrlProps<T> {
7
+ export interface UseDataFromUrlProps<T> {
8
8
  url: string;
9
9
  params?: object;
10
10
  defaultData: T;
11
11
  disableFirstFetch?: boolean;
12
12
  onFetchSuccess?: (data: T) => void;
13
13
  }
14
- export declare const useDataFromUrl: <T>({ url, params, disableFirstFetch, onFetchSuccess, defaultData, }: useDataFromUrlProps<T>) => useDataFromUrlReturn<T>;
14
+ export declare const useDataFromUrl: <T>({ url, params, disableFirstFetch, onFetchSuccess, defaultData, }: UseDataFromUrlProps<T>) => UseDataFromUrlReturn<T>;
@@ -1,7 +1,7 @@
1
1
  import { ColumnFiltersState, ColumnOrderState, OnChangeFn, PaginationState, RowSelectionState, SortingState, VisibilityState } from "@tanstack/react-table";
2
2
  import { DensityState } from "../Controls/DensityFeature";
3
3
  export interface UseDataTableProps {
4
- default: {
4
+ default?: {
5
5
  sorting?: SortingState;
6
6
  columnFilters?: ColumnFiltersState;
7
7
  pagination?: PaginationState;
@@ -0,0 +1,16 @@
1
+ import { UseDataFromUrlProps, UseDataFromUrlReturn } from "./useDataFromUrl";
2
+ import { UseDataTableProps, UseDataTableReturn } from "./useDataTable";
3
+ export interface UseDataTableServerProps<TData> extends Omit<UseDataFromUrlProps<DataResponse<TData>>, keyof {
4
+ defaultData: any;
5
+ }>, UseDataTableProps {
6
+ }
7
+ export interface UseDataTableServerReturn<TData> extends UseDataFromUrlReturn<DataResponse<TData>>, UseDataTableReturn {
8
+ }
9
+ export interface Result<T> {
10
+ results: T[];
11
+ }
12
+ export interface DataResponse<T> extends Result<T> {
13
+ success: boolean;
14
+ count: number;
15
+ }
16
+ export declare const useDataTableServer: <TData>({ url, onFetchSuccess, default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, }: UseDataTableServerProps<TData>) => UseDataTableServerReturn<TData>;
@@ -84,6 +84,7 @@ export * from "./components/DataTable/TableViewer";
84
84
  export * from "./components/DataTable/TextCell";
85
85
  export * from "./components/DataTable/useDataFromUrl";
86
86
  export * from "./components/DataTable/useDataTable";
87
+ export * from "./components/DataTable/useDataTableServer";
87
88
  export * from "./components/DataTable/useDataTableContext";
88
89
  export * from "./components/Filter/FilterOptions";
89
90
  export * from "./components/Filter/GlobalFilter";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "2.2.0",
3
+ "version": "3.0.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",