@bsol-oss/react-datatable5 8.0.2 → 8.1.2

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
@@ -3,7 +3,7 @@ import { Row, RowData, OnChangeFn, Updater, FilterFn, ColumnDef, RowSelectionSta
3
3
  import * as React$1 from 'react';
4
4
  import React__default, { ReactNode } from 'react';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
6
- import { ImageProps, TableHeaderProps as TableHeaderProps$1, TableRootProps, GridProps, CardBodyProps, FlexProps, TextProps } from '@chakra-ui/react';
6
+ import { ImageProps, TableHeaderProps as TableHeaderProps$1, TableRootProps, GridProps, CardBodyProps, FlexProps, TextProps, BoxProps } from '@chakra-ui/react';
7
7
  import { IconType } from 'react-icons';
8
8
  import { RankingInfo } from '@tanstack/match-sorter-utils';
9
9
  import { UseQueryResult } from '@tanstack/react-query';
@@ -304,12 +304,15 @@ interface TableControlsProps {
304
304
  showFilterName?: boolean;
305
305
  showFilterTags?: boolean;
306
306
  showReload?: boolean;
307
+ showPagination?: boolean;
308
+ showPageSizeControl?: boolean;
309
+ showPageCountText?: boolean;
307
310
  filterOptions?: string[];
308
311
  extraItems?: ReactNode;
309
312
  loading?: boolean;
310
313
  hasError?: boolean;
311
314
  }
312
- declare const TableControls: ({ totalText, fitTableWidth, fitTableHeight, isMobile, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, filterOptions, extraItems, loading, hasError, }: TableControlsProps) => react_jsx_runtime.JSX.Element;
315
+ declare const TableControls: ({ totalText, fitTableWidth, fitTableHeight, isMobile, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, filterOptions, extraItems, loading, hasError, }: TableControlsProps) => react_jsx_runtime.JSX.Element;
313
316
 
314
317
  interface TableFooterProps {
315
318
  pinnedBgColor?: {
@@ -530,6 +533,12 @@ interface GetStyleProps {
530
533
  interface RangeDatePickerProps extends Props, RangeCalendarProps {
531
534
  }
532
535
 
536
+ interface RecordDisplayProps {
537
+ object: object | null;
538
+ boxProps?: BoxProps;
539
+ }
540
+ declare const RecordDisplay: ({ object, boxProps }: RecordDisplayProps) => react_jsx_runtime.JSX.Element;
541
+
533
542
  declare module "@tanstack/react-table" {
534
543
  interface ColumnMeta<TData extends RowData, TValue> {
535
544
  /**
@@ -588,4 +597,4 @@ declare module "@tanstack/react-table" {
588
597
  }
589
598
  }
590
599
 
591
- export { type CalendarProps, CardHeader, type CardHeaderProps, type CustomJSONSchema7Definition, DataDisplay, type DataDisplayProps, type DataResponse, DataTable, type DataTableDefaultState, type DataTableProps, DataTableServer, type DataTableServerProps, type DatePickerProps, DefaultCardTitle, DefaultTable, type DefaultTableProps, DensityToggleButton, type DensityToggleButtonProps, type DisplayTextProps, EditFilterButton, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, EditViewButton, type EditViewButtonProps, EmptyState, type EmptyStateProps, ErrorAlert, type ErrorAlertProps, FilterOptions, type FilterOptionsProps, Form, type FormProps, type GetColumnsConfigs, type GetDateColorProps, type GetMultiDatesProps, type GetRangeDatesProps, type GetStyleProps, type GetVariantProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, type RangeCalendarProps, type RangeDatePickerProps, 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, type UseDataTableServerProps, type UseDataTableServerReturn, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, widthSanityCheck };
600
+ export { type CalendarProps, CardHeader, type CardHeaderProps, type CustomJSONSchema7Definition, DataDisplay, type DataDisplayProps, type DataResponse, DataTable, type DataTableDefaultState, type DataTableProps, DataTableServer, type DataTableServerProps, type DatePickerProps, DefaultCardTitle, DefaultTable, type DefaultTableProps, DensityToggleButton, type DensityToggleButtonProps, type DisplayTextProps, EditFilterButton, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, EditViewButton, type EditViewButtonProps, EmptyState, type EmptyStateProps, ErrorAlert, type ErrorAlertProps, FilterOptions, type FilterOptionsProps, Form, type FormProps, type GetColumnsConfigs, type GetDateColorProps, type GetMultiDatesProps, type GetRangeDatesProps, type GetStyleProps, type GetVariantProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, type RangeCalendarProps, type RangeDatePickerProps, RecordDisplay, type RecordDisplayProps, 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, type UseDataTableServerProps, type UseDataTableServerReturn, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, widthSanityCheck };
package/dist/index.js CHANGED
@@ -21,12 +21,12 @@ var hi2 = require('react-icons/hi2');
21
21
  var reactTable = require('@tanstack/react-table');
22
22
  var matchSorterUtils = require('@tanstack/match-sorter-utils');
23
23
  var bs = require('react-icons/bs');
24
- var gr = require('react-icons/gr');
25
- var hi = require('react-icons/hi');
24
+ var usehooks = require('@uidotdev/usehooks');
26
25
  var reactQuery = require('@tanstack/react-query');
27
26
  var io5 = require('react-icons/io5');
27
+ var gr = require('react-icons/gr');
28
+ var hi = require('react-icons/hi');
28
29
  var axios = require('axios');
29
- var usehooks = require('@uidotdev/usehooks');
30
30
  var reactHookForm = require('react-hook-form');
31
31
  var dayjs = require('dayjs');
32
32
 
@@ -2605,7 +2605,6 @@ const snakeToLabel = (str) => {
2605
2605
  };
2606
2606
 
2607
2607
  const RecordDisplay = ({ object, boxProps }) => {
2608
- console.log(object, "dkfos");
2609
2608
  if (object === null) {
2610
2609
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: "null" });
2611
2610
  }
@@ -3002,12 +3001,90 @@ const Tooltip = React__namespace.forwardRef(function Tooltip(props, ref) {
3002
3001
  return (jsxRuntime.jsxs(react.Tooltip.Root, { ...rest, children: [jsxRuntime.jsx(react.Tooltip.Trigger, { asChild: true, children: children }), jsxRuntime.jsx(react.Portal, { disabled: !portalled, container: portalRef, children: jsxRuntime.jsx(react.Tooltip.Positioner, { children: jsxRuntime.jsxs(react.Tooltip.Content, { ref: ref, ...contentProps, children: [showArrow && (jsxRuntime.jsx(react.Tooltip.Arrow, { children: jsxRuntime.jsx(react.Tooltip.ArrowTip, {}) })), content] }) }) })] }));
3003
3002
  });
3004
3003
 
3005
- const TableControls = ({ totalText = "Total:", fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsxRuntime.jsx(jsxRuntime.Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, filterOptions = [], extraItems = jsxRuntime.jsx(jsxRuntime.Fragment, {}), loading = false, hasError = false, }) => {
3004
+ const InputGroup = React__namespace.forwardRef(function InputGroup(props, ref) {
3005
+ const { startElement, startElementProps, endElement, endElementProps, children, startOffset = "6px", endOffset = "6px", ...rest } = props;
3006
+ return (jsxRuntime.jsxs(react.Group, { ref: ref, ...rest, children: [startElement && (jsxRuntime.jsx(react.InputElement, { pointerEvents: "none", ...startElementProps, children: startElement })), React__namespace.cloneElement(children, {
3007
+ ...(startElement && {
3008
+ ps: `calc(var(--input-height) - ${startOffset})`,
3009
+ }),
3010
+ ...(endElement && { pe: `calc(var(--input-height) - ${endOffset})` }),
3011
+ // @ts-expect-error chakra generated files
3012
+ ...children.props,
3013
+ }), endElement && (jsxRuntime.jsx(react.InputElement, { placement: "end", ...endElementProps, children: endElement }))] }));
3014
+ });
3015
+
3016
+ const GlobalFilter = () => {
3017
+ const { table } = useDataTableContext();
3018
+ const [searchTerm, setSearchTerm] = React.useState("");
3019
+ const debouncedSearchTerm = usehooks.useDebounce(searchTerm, 500);
3020
+ React.useEffect(() => {
3021
+ const searchHN = async () => {
3022
+ table.setGlobalFilter(debouncedSearchTerm);
3023
+ };
3024
+ searchHN();
3025
+ }, [debouncedSearchTerm]);
3026
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(InputGroup, { flex: "1", startElement: jsxRuntime.jsx(md.MdSearch, {}), children: jsxRuntime.jsx(react.Input, { placeholder: "Outline", variant: "outline", onChange: (e) => {
3027
+ setSearchTerm(e.target.value);
3028
+ } }) }) }));
3029
+ };
3030
+
3031
+ const useDataTableServerContext = () => {
3032
+ const context = React.useContext(DataTableServerContext);
3033
+ const { query } = context;
3034
+ const isEmpty = (query.data?.count ?? 0) <= 0;
3035
+ return { ...context, isEmpty };
3036
+ };
3037
+
3038
+ const ReloadButton = ({ text = "Reload", variant = "icon", }) => {
3039
+ const { url } = useDataTableServerContext();
3040
+ const queryClient = reactQuery.useQueryClient();
3041
+ if (variant === "icon") {
3042
+ return (jsxRuntime.jsx(Tooltip, { showArrow: true, content: "This is the tooltip content", children: jsxRuntime.jsx(Button, { variant: "ghost", onClick: () => {
3043
+ queryClient.invalidateQueries({ queryKey: [url] });
3044
+ }, "aria-label": "refresh", children: jsxRuntime.jsx(io5.IoReload, {}) }) }));
3045
+ }
3046
+ return (jsxRuntime.jsxs(Button, { variant: "ghost", onClick: () => {
3047
+ queryClient.invalidateQueries({ queryKey: [url] });
3048
+ }, children: [jsxRuntime.jsx(io5.IoReload, {}), " ", text] }));
3049
+ };
3050
+
3051
+ const FilterOptions = ({ column }) => {
3052
+ const { table } = useDataTableContext();
3053
+ const tableColumn = table.getColumn(column);
3054
+ const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
3055
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: options.map((option) => {
3056
+ const selected = table.getColumn(column)?.getFilterValue() === option;
3057
+ return (jsxRuntime.jsxs(react.Button, { size: "sm", onClick: () => {
3058
+ if (selected) {
3059
+ table.setColumnFilters((state) => {
3060
+ return state.filter((filter) => {
3061
+ return filter.id !== column;
3062
+ });
3063
+ });
3064
+ return;
3065
+ }
3066
+ table.getColumn(column)?.setFilterValue(option);
3067
+ }, variant: selected ? "solid" : "outline", display: "flex", gap: "0.25rem", children: [option, selected && jsxRuntime.jsx(md.MdClose, {})] }, option));
3068
+ }) }));
3069
+ };
3070
+
3071
+ const TableFilterTags = () => {
3072
+ const { table } = useDataTableContext();
3073
+ return (jsxRuntime.jsx(react.Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }) => {
3074
+ return (jsxRuntime.jsx(Tag, { gap: "0.5rem", closable: true, cursor: "pointer", onClick: () => {
3075
+ table.setColumnFilters(table.getState().columnFilters.filter((filter) => {
3076
+ return filter.value != value;
3077
+ }));
3078
+ }, children: `${id}: ${value}` }, `${id}-${value}`));
3079
+ }) }));
3080
+ };
3081
+
3082
+ const TableControls = ({ totalText = "Total:", fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsxRuntime.jsx(jsxRuntime.Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, filterOptions = [], extraItems = jsxRuntime.jsx(jsxRuntime.Fragment, {}), loading = false, hasError = false, }) => {
3006
3083
  return (jsxRuntime.jsxs(react.Grid, { templateRows: "auto 1fr auto", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", children: [jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 2, children: [jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsx(react.Box, { children: jsxRuntime.jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsxRuntime.jsx(md.MdOutlineViewColumn, {}) }) }), jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsxRuntime.jsx(react.Spinner, { size: "sm" }), hasError && (jsxRuntime.jsx(Tooltip, { content: "An error occurred while fetching data", children: jsxRuntime.jsx(react.Icon, { as: bs.BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsxRuntime.jsx(GlobalFilter, {}), showFilter && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" }) })), showReload && jsxRuntime.jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
3007
3084
  return (jsxRuntime.jsxs(react.Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxRuntime.jsxs(react.Text, { children: [column, ":"] }), jsxRuntime.jsx(FilterOptions, { column: column })] }, column));
3008
3085
  }) })), showFilterTags && (jsxRuntime.jsx(react.Flex, { children: jsxRuntime.jsx(TableFilterTags, {}) }))] }), jsxRuntime.jsx(react.Grid, { overflow: "auto", backgroundColor: "gray.50", _dark: {
3009
3086
  backgroundColor: "gray.900",
3010
- }, children: children }), jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsxs(react.Flex, { gap: "1rem", alignItems: "center", children: [jsxRuntime.jsx(PageSizeControl, {}), jsxRuntime.jsxs(react.Flex, { children: [jsxRuntime.jsx(react.Text, { paddingRight: "0.5rem", children: totalText }), jsxRuntime.jsx(RowCountText, {})] })] }), jsxRuntime.jsx(react.Box, { justifySelf: "end", children: jsxRuntime.jsx(TablePagination, {}) })] })] }));
3087
+ }, children: children }), jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsxs(react.Flex, { gap: "1rem", alignItems: "center", children: [showPageSizeControl && jsxRuntime.jsx(PageSizeControl, {}), showPageCountText && (jsxRuntime.jsxs(react.Flex, { children: [jsxRuntime.jsx(react.Text, { paddingRight: "0.5rem", children: totalText }), jsxRuntime.jsx(RowCountText, {})] }))] }), jsxRuntime.jsx(react.Box, { justifySelf: "end", children: showPagination && jsxRuntime.jsx(TablePagination, {}) })] })] }));
3011
3088
  };
3012
3089
 
3013
3090
  const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector = false, alwaysShowSelector = true, }) => {
@@ -3191,26 +3268,6 @@ const DefaultTable = ({ showFooter = false, tableProps = {}, tableHeaderProps =
3191
3268
  return (jsxRuntime.jsx(TableControls, { ...controlProps, children: jsxRuntime.jsxs(Table, { ...tableProps, children: [jsxRuntime.jsx(TableHeader, { ...tableHeaderProps }), jsxRuntime.jsx(TableBody, { ...tableBodyProps }), showFooter && jsxRuntime.jsx(TableFooter, { ...tableFooterProps })] }) }));
3192
3269
  };
3193
3270
 
3194
- const useDataTableServerContext = () => {
3195
- const context = React.useContext(DataTableServerContext);
3196
- const { query } = context;
3197
- const isEmpty = (query.data?.count ?? 0) <= 0;
3198
- return { ...context, isEmpty };
3199
- };
3200
-
3201
- const ReloadButton = ({ text = "Reload", variant = "icon", }) => {
3202
- const { url } = useDataTableServerContext();
3203
- const queryClient = reactQuery.useQueryClient();
3204
- if (variant === "icon") {
3205
- return (jsxRuntime.jsx(Tooltip, { showArrow: true, content: "This is the tooltip content", children: jsxRuntime.jsx(Button, { variant: "ghost", onClick: () => {
3206
- queryClient.invalidateQueries({ queryKey: [url] });
3207
- }, "aria-label": "refresh", children: jsxRuntime.jsx(io5.IoReload, {}) }) }));
3208
- }
3209
- return (jsxRuntime.jsxs(Button, { variant: "ghost", onClick: () => {
3210
- queryClient.invalidateQueries({ queryKey: [url] });
3211
- }, children: [jsxRuntime.jsx(io5.IoReload, {}), " ", text] }));
3212
- };
3213
-
3214
3271
  const TableCardContainer = ({ children, variant = "", ...props }) => {
3215
3272
  if (variant === "carousel") {
3216
3273
  return (jsxRuntime.jsx(react.Flex, { overflow: "scroll", gap: "1rem", children: children }));
@@ -3243,17 +3300,6 @@ const TableComponent = ({ render = () => {
3243
3300
  return render(table);
3244
3301
  };
3245
3302
 
3246
- const TableFilterTags = () => {
3247
- const { table } = useDataTableContext();
3248
- return (jsxRuntime.jsx(react.Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }) => {
3249
- return (jsxRuntime.jsx(Tag, { gap: "0.5rem", closable: true, cursor: "pointer", onClick: () => {
3250
- table.setColumnFilters(table.getState().columnFilters.filter((filter) => {
3251
- return filter.value != value;
3252
- }));
3253
- }, children: `${id}: ${value}` }, `${id}-${value}`));
3254
- }) }));
3255
- };
3256
-
3257
3303
  const TableLoadingComponent = ({ render, }) => {
3258
3304
  const { loading } = useDataTableContext();
3259
3305
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: render(loading) });
@@ -3478,53 +3524,6 @@ const ErrorAlert = ({ showMessage = true }) => {
3478
3524
  return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: isError && (jsxRuntime.jsxs(react.Alert.Root, { status: "error", children: [jsxRuntime.jsx(react.Alert.Indicator, {}), jsxRuntime.jsxs(react.Alert.Content, { children: [jsxRuntime.jsx(react.Alert.Title, { children: error.name }), showMessage && (jsxRuntime.jsx(react.Alert.Description, { children: error.message }))] })] })) }));
3479
3525
  };
3480
3526
 
3481
- const FilterOptions = ({ column }) => {
3482
- const { table } = useDataTableContext();
3483
- const tableColumn = table.getColumn(column);
3484
- const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
3485
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: options.map((option) => {
3486
- const selected = table.getColumn(column)?.getFilterValue() === option;
3487
- return (jsxRuntime.jsxs(react.Button, { size: "sm", onClick: () => {
3488
- if (selected) {
3489
- table.setColumnFilters((state) => {
3490
- return state.filter((filter) => {
3491
- return filter.id !== column;
3492
- });
3493
- });
3494
- return;
3495
- }
3496
- table.getColumn(column)?.setFilterValue(option);
3497
- }, variant: selected ? "solid" : "outline", display: "flex", gap: "0.25rem", children: [option, selected && jsxRuntime.jsx(md.MdClose, {})] }, option));
3498
- }) }));
3499
- };
3500
-
3501
- const InputGroup = React__namespace.forwardRef(function InputGroup(props, ref) {
3502
- const { startElement, startElementProps, endElement, endElementProps, children, startOffset = "6px", endOffset = "6px", ...rest } = props;
3503
- return (jsxRuntime.jsxs(react.Group, { ref: ref, ...rest, children: [startElement && (jsxRuntime.jsx(react.InputElement, { pointerEvents: "none", ...startElementProps, children: startElement })), React__namespace.cloneElement(children, {
3504
- ...(startElement && {
3505
- ps: `calc(var(--input-height) - ${startOffset})`,
3506
- }),
3507
- ...(endElement && { pe: `calc(var(--input-height) - ${endOffset})` }),
3508
- // @ts-expect-error chakra generated files
3509
- ...children.props,
3510
- }), endElement && (jsxRuntime.jsx(react.InputElement, { placement: "end", ...endElementProps, children: endElement }))] }));
3511
- });
3512
-
3513
- const GlobalFilter = () => {
3514
- const { table } = useDataTableContext();
3515
- const [searchTerm, setSearchTerm] = React.useState("");
3516
- const debouncedSearchTerm = usehooks.useDebounce(searchTerm, 500);
3517
- React.useEffect(() => {
3518
- const searchHN = async () => {
3519
- table.setGlobalFilter(debouncedSearchTerm);
3520
- };
3521
- searchHN();
3522
- }, [debouncedSearchTerm]);
3523
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(InputGroup, { flex: "1", startElement: jsxRuntime.jsx(md.MdSearch, {}), children: jsxRuntime.jsx(react.Input, { placeholder: "Outline", variant: "outline", onChange: (e) => {
3524
- setSearchTerm(e.target.value);
3525
- } }) }) }));
3526
- };
3527
-
3528
3527
  //@ts-expect-error TODO: find appropriate type
3529
3528
  const SchemaFormContext = React.createContext({
3530
3529
  schema: {},
@@ -4807,6 +4806,7 @@ exports.FilterOptions = FilterOptions;
4807
4806
  exports.Form = Form;
4808
4807
  exports.GlobalFilter = GlobalFilter;
4809
4808
  exports.PageSizeControl = PageSizeControl;
4809
+ exports.RecordDisplay = RecordDisplay;
4810
4810
  exports.ReloadButton = ReloadButton;
4811
4811
  exports.ResetFilteringButton = ResetFilteringButton;
4812
4812
  exports.ResetSelectionButton = ResetSelectionButton;
package/dist/index.mjs CHANGED
@@ -1,9 +1,9 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Flex, Text, Tag as Tag$1, Input, useDisclosure, DialogBackdrop, CheckboxCard as CheckboxCard$1, Menu, createRecipeContext, createContext as createContext$1, Pagination, usePaginationContext, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$2, VStack, List, Alert, Group, InputElement, Popover, Field as Field$1, NumberInput, Accordion, Show, RadioCard, CheckboxGroup, Heading, Center } from '@chakra-ui/react';
2
+ import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Flex, Text, Tag as Tag$1, Input, useDisclosure, DialogBackdrop, CheckboxCard as CheckboxCard$1, Menu, createRecipeContext, createContext as createContext$1, Pagination, usePaginationContext, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Group, InputElement, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$2, VStack, List, Alert, Popover, Field as Field$1, NumberInput, Accordion, Show, RadioCard, CheckboxGroup, Heading, Center } from '@chakra-ui/react';
3
3
  import { AiOutlineColumnWidth } from 'react-icons/ai';
4
4
  import * as React from 'react';
5
5
  import React__default, { createContext, useContext, useState, useEffect, useRef } from 'react';
6
- import { MdFilterAlt, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear, MdOutlineChecklist, MdClose, MdSearch } from 'react-icons/md';
6
+ import { MdFilterAlt, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdSearch, MdClose, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear, MdOutlineChecklist } from 'react-icons/md';
7
7
  import { LuX, LuCheck, LuChevronRight, LuChevronDown } from 'react-icons/lu';
8
8
  import Dayzed from '@bsol-oss/dayzed-react19';
9
9
  import { FaUpDown, FaGripLinesVertical } from 'react-icons/fa6';
@@ -20,12 +20,12 @@ import { HiMiniEllipsisHorizontal, HiChevronLeft, HiChevronRight } from 'react-i
20
20
  import { flexRender, makeStateUpdater, functionalUpdate, useReactTable, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getPaginationRowModel, createColumnHelper } from '@tanstack/react-table';
21
21
  import { rankItem } from '@tanstack/match-sorter-utils';
22
22
  import { BsExclamationCircleFill } from 'react-icons/bs';
23
- import { GrAscend, GrDescend } from 'react-icons/gr';
24
- import { HiColorSwatch, HiOutlineInformationCircle } from 'react-icons/hi';
23
+ import { useDebounce } from '@uidotdev/usehooks';
25
24
  import { useQueryClient, useQuery, QueryClient, QueryClientProvider } from '@tanstack/react-query';
26
25
  import { IoReload } from 'react-icons/io5';
26
+ import { GrAscend, GrDescend } from 'react-icons/gr';
27
+ import { HiColorSwatch, HiOutlineInformationCircle } from 'react-icons/hi';
27
28
  import axios from 'axios';
28
- import { useDebounce } from '@uidotdev/usehooks';
29
29
  import { useFormContext, useForm, FormProvider } from 'react-hook-form';
30
30
  import dayjs from 'dayjs';
31
31
 
@@ -2585,7 +2585,6 @@ const snakeToLabel = (str) => {
2585
2585
  };
2586
2586
 
2587
2587
  const RecordDisplay = ({ object, boxProps }) => {
2588
- console.log(object, "dkfos");
2589
2588
  if (object === null) {
2590
2589
  return jsx(Fragment, { children: "null" });
2591
2590
  }
@@ -2982,12 +2981,90 @@ const Tooltip = React.forwardRef(function Tooltip(props, ref) {
2982
2981
  return (jsxs(Tooltip$1.Root, { ...rest, children: [jsx(Tooltip$1.Trigger, { asChild: true, children: children }), jsx(Portal, { disabled: !portalled, container: portalRef, children: jsx(Tooltip$1.Positioner, { children: jsxs(Tooltip$1.Content, { ref: ref, ...contentProps, children: [showArrow && (jsx(Tooltip$1.Arrow, { children: jsx(Tooltip$1.ArrowTip, {}) })), content] }) }) })] }));
2983
2982
  });
2984
2983
 
2985
- const TableControls = ({ totalText = "Total:", fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsx(Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, filterOptions = [], extraItems = jsx(Fragment, {}), loading = false, hasError = false, }) => {
2984
+ const InputGroup = React.forwardRef(function InputGroup(props, ref) {
2985
+ const { startElement, startElementProps, endElement, endElementProps, children, startOffset = "6px", endOffset = "6px", ...rest } = props;
2986
+ return (jsxs(Group, { ref: ref, ...rest, children: [startElement && (jsx(InputElement, { pointerEvents: "none", ...startElementProps, children: startElement })), React.cloneElement(children, {
2987
+ ...(startElement && {
2988
+ ps: `calc(var(--input-height) - ${startOffset})`,
2989
+ }),
2990
+ ...(endElement && { pe: `calc(var(--input-height) - ${endOffset})` }),
2991
+ // @ts-expect-error chakra generated files
2992
+ ...children.props,
2993
+ }), endElement && (jsx(InputElement, { placement: "end", ...endElementProps, children: endElement }))] }));
2994
+ });
2995
+
2996
+ const GlobalFilter = () => {
2997
+ const { table } = useDataTableContext();
2998
+ const [searchTerm, setSearchTerm] = useState("");
2999
+ const debouncedSearchTerm = useDebounce(searchTerm, 500);
3000
+ useEffect(() => {
3001
+ const searchHN = async () => {
3002
+ table.setGlobalFilter(debouncedSearchTerm);
3003
+ };
3004
+ searchHN();
3005
+ }, [debouncedSearchTerm]);
3006
+ return (jsx(Fragment, { children: jsx(InputGroup, { flex: "1", startElement: jsx(MdSearch, {}), children: jsx(Input, { placeholder: "Outline", variant: "outline", onChange: (e) => {
3007
+ setSearchTerm(e.target.value);
3008
+ } }) }) }));
3009
+ };
3010
+
3011
+ const useDataTableServerContext = () => {
3012
+ const context = useContext(DataTableServerContext);
3013
+ const { query } = context;
3014
+ const isEmpty = (query.data?.count ?? 0) <= 0;
3015
+ return { ...context, isEmpty };
3016
+ };
3017
+
3018
+ const ReloadButton = ({ text = "Reload", variant = "icon", }) => {
3019
+ const { url } = useDataTableServerContext();
3020
+ const queryClient = useQueryClient();
3021
+ if (variant === "icon") {
3022
+ return (jsx(Tooltip, { showArrow: true, content: "This is the tooltip content", children: jsx(Button, { variant: "ghost", onClick: () => {
3023
+ queryClient.invalidateQueries({ queryKey: [url] });
3024
+ }, "aria-label": "refresh", children: jsx(IoReload, {}) }) }));
3025
+ }
3026
+ return (jsxs(Button, { variant: "ghost", onClick: () => {
3027
+ queryClient.invalidateQueries({ queryKey: [url] });
3028
+ }, children: [jsx(IoReload, {}), " ", text] }));
3029
+ };
3030
+
3031
+ const FilterOptions = ({ column }) => {
3032
+ const { table } = useDataTableContext();
3033
+ const tableColumn = table.getColumn(column);
3034
+ const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
3035
+ return (jsx(Fragment, { children: options.map((option) => {
3036
+ const selected = table.getColumn(column)?.getFilterValue() === option;
3037
+ return (jsxs(Button$1, { size: "sm", onClick: () => {
3038
+ if (selected) {
3039
+ table.setColumnFilters((state) => {
3040
+ return state.filter((filter) => {
3041
+ return filter.id !== column;
3042
+ });
3043
+ });
3044
+ return;
3045
+ }
3046
+ table.getColumn(column)?.setFilterValue(option);
3047
+ }, variant: selected ? "solid" : "outline", display: "flex", gap: "0.25rem", children: [option, selected && jsx(MdClose, {})] }, option));
3048
+ }) }));
3049
+ };
3050
+
3051
+ const TableFilterTags = () => {
3052
+ const { table } = useDataTableContext();
3053
+ return (jsx(Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }) => {
3054
+ return (jsx(Tag, { gap: "0.5rem", closable: true, cursor: "pointer", onClick: () => {
3055
+ table.setColumnFilters(table.getState().columnFilters.filter((filter) => {
3056
+ return filter.value != value;
3057
+ }));
3058
+ }, children: `${id}: ${value}` }, `${id}-${value}`));
3059
+ }) }));
3060
+ };
3061
+
3062
+ const TableControls = ({ totalText = "Total:", fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsx(Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, filterOptions = [], extraItems = jsx(Fragment, {}), loading = false, hasError = false, }) => {
2986
3063
  return (jsxs(Grid, { templateRows: "auto 1fr auto", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", children: [jsxs(Flex, { flexFlow: "column", gap: 2, children: [jsxs(Flex, { justifyContent: "space-between", children: [jsx(Box, { children: jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { content: "An error occurred while fetching data", children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsx(GlobalFilter, {}), showFilter && (jsx(Fragment, { children: jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" }) })), showReload && jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsx(Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
2987
3064
  return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [column, ":"] }), jsx(FilterOptions, { column: column })] }, column));
2988
3065
  }) })), showFilterTags && (jsx(Flex, { children: jsx(TableFilterTags, {}) }))] }), jsx(Grid, { overflow: "auto", backgroundColor: "gray.50", _dark: {
2989
3066
  backgroundColor: "gray.900",
2990
- }, children: children }), jsxs(Flex, { justifyContent: "space-between", children: [jsxs(Flex, { gap: "1rem", alignItems: "center", children: [jsx(PageSizeControl, {}), jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: totalText }), jsx(RowCountText, {})] })] }), jsx(Box, { justifySelf: "end", children: jsx(TablePagination, {}) })] })] }));
3067
+ }, children: children }), jsxs(Flex, { justifyContent: "space-between", children: [jsxs(Flex, { gap: "1rem", alignItems: "center", children: [showPageSizeControl && jsx(PageSizeControl, {}), showPageCountText && (jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: totalText }), jsx(RowCountText, {})] }))] }), jsx(Box, { justifySelf: "end", children: showPagination && jsx(TablePagination, {}) })] })] }));
2991
3068
  };
2992
3069
 
2993
3070
  const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector = false, alwaysShowSelector = true, }) => {
@@ -3171,26 +3248,6 @@ const DefaultTable = ({ showFooter = false, tableProps = {}, tableHeaderProps =
3171
3248
  return (jsx(TableControls, { ...controlProps, children: jsxs(Table, { ...tableProps, children: [jsx(TableHeader, { ...tableHeaderProps }), jsx(TableBody, { ...tableBodyProps }), showFooter && jsx(TableFooter, { ...tableFooterProps })] }) }));
3172
3249
  };
3173
3250
 
3174
- const useDataTableServerContext = () => {
3175
- const context = useContext(DataTableServerContext);
3176
- const { query } = context;
3177
- const isEmpty = (query.data?.count ?? 0) <= 0;
3178
- return { ...context, isEmpty };
3179
- };
3180
-
3181
- const ReloadButton = ({ text = "Reload", variant = "icon", }) => {
3182
- const { url } = useDataTableServerContext();
3183
- const queryClient = useQueryClient();
3184
- if (variant === "icon") {
3185
- return (jsx(Tooltip, { showArrow: true, content: "This is the tooltip content", children: jsx(Button, { variant: "ghost", onClick: () => {
3186
- queryClient.invalidateQueries({ queryKey: [url] });
3187
- }, "aria-label": "refresh", children: jsx(IoReload, {}) }) }));
3188
- }
3189
- return (jsxs(Button, { variant: "ghost", onClick: () => {
3190
- queryClient.invalidateQueries({ queryKey: [url] });
3191
- }, children: [jsx(IoReload, {}), " ", text] }));
3192
- };
3193
-
3194
3251
  const TableCardContainer = ({ children, variant = "", ...props }) => {
3195
3252
  if (variant === "carousel") {
3196
3253
  return (jsx(Flex, { overflow: "scroll", gap: "1rem", children: children }));
@@ -3223,17 +3280,6 @@ const TableComponent = ({ render = () => {
3223
3280
  return render(table);
3224
3281
  };
3225
3282
 
3226
- const TableFilterTags = () => {
3227
- const { table } = useDataTableContext();
3228
- return (jsx(Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }) => {
3229
- return (jsx(Tag, { gap: "0.5rem", closable: true, cursor: "pointer", onClick: () => {
3230
- table.setColumnFilters(table.getState().columnFilters.filter((filter) => {
3231
- return filter.value != value;
3232
- }));
3233
- }, children: `${id}: ${value}` }, `${id}-${value}`));
3234
- }) }));
3235
- };
3236
-
3237
3283
  const TableLoadingComponent = ({ render, }) => {
3238
3284
  const { loading } = useDataTableContext();
3239
3285
  return jsx(Fragment, { children: render(loading) });
@@ -3458,53 +3504,6 @@ const ErrorAlert = ({ showMessage = true }) => {
3458
3504
  return (jsx(Fragment, { children: isError && (jsxs(Alert.Root, { status: "error", children: [jsx(Alert.Indicator, {}), jsxs(Alert.Content, { children: [jsx(Alert.Title, { children: error.name }), showMessage && (jsx(Alert.Description, { children: error.message }))] })] })) }));
3459
3505
  };
3460
3506
 
3461
- const FilterOptions = ({ column }) => {
3462
- const { table } = useDataTableContext();
3463
- const tableColumn = table.getColumn(column);
3464
- const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
3465
- return (jsx(Fragment, { children: options.map((option) => {
3466
- const selected = table.getColumn(column)?.getFilterValue() === option;
3467
- return (jsxs(Button$1, { size: "sm", onClick: () => {
3468
- if (selected) {
3469
- table.setColumnFilters((state) => {
3470
- return state.filter((filter) => {
3471
- return filter.id !== column;
3472
- });
3473
- });
3474
- return;
3475
- }
3476
- table.getColumn(column)?.setFilterValue(option);
3477
- }, variant: selected ? "solid" : "outline", display: "flex", gap: "0.25rem", children: [option, selected && jsx(MdClose, {})] }, option));
3478
- }) }));
3479
- };
3480
-
3481
- const InputGroup = React.forwardRef(function InputGroup(props, ref) {
3482
- const { startElement, startElementProps, endElement, endElementProps, children, startOffset = "6px", endOffset = "6px", ...rest } = props;
3483
- return (jsxs(Group, { ref: ref, ...rest, children: [startElement && (jsx(InputElement, { pointerEvents: "none", ...startElementProps, children: startElement })), React.cloneElement(children, {
3484
- ...(startElement && {
3485
- ps: `calc(var(--input-height) - ${startOffset})`,
3486
- }),
3487
- ...(endElement && { pe: `calc(var(--input-height) - ${endOffset})` }),
3488
- // @ts-expect-error chakra generated files
3489
- ...children.props,
3490
- }), endElement && (jsx(InputElement, { placement: "end", ...endElementProps, children: endElement }))] }));
3491
- });
3492
-
3493
- const GlobalFilter = () => {
3494
- const { table } = useDataTableContext();
3495
- const [searchTerm, setSearchTerm] = useState("");
3496
- const debouncedSearchTerm = useDebounce(searchTerm, 500);
3497
- useEffect(() => {
3498
- const searchHN = async () => {
3499
- table.setGlobalFilter(debouncedSearchTerm);
3500
- };
3501
- searchHN();
3502
- }, [debouncedSearchTerm]);
3503
- return (jsx(Fragment, { children: jsx(InputGroup, { flex: "1", startElement: jsx(MdSearch, {}), children: jsx(Input, { placeholder: "Outline", variant: "outline", onChange: (e) => {
3504
- setSearchTerm(e.target.value);
3505
- } }) }) }));
3506
- };
3507
-
3508
3507
  //@ts-expect-error TODO: find appropriate type
3509
3508
  const SchemaFormContext = createContext({
3510
3509
  schema: {},
@@ -4770,4 +4769,4 @@ const getMultiDates = ({ selected, selectedDate, selectedDates, selectable, }) =
4770
4769
  }
4771
4770
  };
4772
4771
 
4773
- export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, EmptyState, ErrorAlert, FilterOptions, Form, GlobalFilter, PageSizeControl, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, widthSanityCheck };
4772
+ export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, EmptyState, ErrorAlert, FilterOptions, Form, GlobalFilter, PageSizeControl, RecordDisplay, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, widthSanityCheck };
@@ -10,9 +10,12 @@ export interface TableControlsProps {
10
10
  showFilterName?: boolean;
11
11
  showFilterTags?: boolean;
12
12
  showReload?: boolean;
13
+ showPagination?: boolean;
14
+ showPageSizeControl?: boolean;
15
+ showPageCountText?: boolean;
13
16
  filterOptions?: string[];
14
17
  extraItems?: ReactNode;
15
18
  loading?: boolean;
16
19
  hasError?: boolean;
17
20
  }
18
- export declare const TableControls: ({ totalText, fitTableWidth, fitTableHeight, isMobile, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, filterOptions, extraItems, loading, hasError, }: TableControlsProps) => import("react/jsx-runtime").JSX.Element;
21
+ export declare const TableControls: ({ totalText, fitTableWidth, fitTableHeight, isMobile, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, filterOptions, extraItems, loading, hasError, }: TableControlsProps) => import("react/jsx-runtime").JSX.Element;
@@ -103,3 +103,4 @@ export * from "./components/DatePicker/DatePicker";
103
103
  export * from "./components/DatePicker/getMultiDates";
104
104
  export * from "./components/DatePicker/getRangeDates";
105
105
  export * from "./components/DatePicker/RangeDatePicker";
106
+ export * from "./components/DataTable/components/RecordDisplay";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "8.0.2",
3
+ "version": "8.1.2",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",