@bsol-oss/react-datatable5 12.0.0-beta.50 → 12.0.0-beta.52

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
@@ -144,7 +144,7 @@ interface DataTableProps<TData = unknown> {
144
144
  setDensity: OnChangeFn<DensityState>;
145
145
  setColumnVisibility: OnChangeFn<VisibilityState>;
146
146
  translate: UseTranslationResponse<any, any>;
147
- tableLabel: DataTableLabel;
147
+ tableLabel?: DataTableLabel;
148
148
  }
149
149
  /**
150
150
  * DataTable will create a context to hold all values to
@@ -282,6 +282,7 @@ interface DataTableServerProps<TData extends DataResponse = DataResponse<unknown
282
282
  query: UseQueryResult<TData>;
283
283
  url: string;
284
284
  translate: UseTranslationResponse<any, any>;
285
+ tableLabel: DataTableLabel;
285
286
  }
286
287
  /**
287
288
  * DataTableServer will create a context to hold all values to
@@ -294,7 +295,7 @@ interface DataTableServerProps<TData extends DataResponse = DataResponse<unknown
294
295
  *
295
296
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
296
297
  */
297
- 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, url, translate, children, }: DataTableServerProps<TData>): react_jsx_runtime.JSX.Element;
298
+ 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, url, translate, children, tableLabel, }: DataTableServerProps<TData>): react_jsx_runtime.JSX.Element;
298
299
 
299
300
  interface TableControlsProps {
300
301
  totalText?: string;
@@ -310,16 +311,19 @@ interface TableControlsProps {
310
311
  showPageSizeControl?: boolean;
311
312
  showPageCountText?: boolean;
312
313
  showView?: boolean;
313
- filterOptions?: {
314
- label: string;
315
- value: string;
314
+ filterTagsOptions?: {
315
+ column: string;
316
+ options: {
317
+ label: string;
318
+ value: string;
319
+ }[];
316
320
  }[];
317
321
  extraItems?: ReactNode;
318
322
  loading?: boolean;
319
323
  hasError?: boolean;
320
324
  gridProps?: GridProps;
321
325
  }
322
- declare const TableControls: ({ fitTableWidth, fitTableHeight, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, showView, filterOptions, extraItems, loading, hasError, gridProps, }: TableControlsProps) => react_jsx_runtime.JSX.Element;
326
+ declare const TableControls: ({ fitTableWidth, fitTableHeight, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, showView, filterTagsOptions, extraItems, loading, hasError, gridProps, }: TableControlsProps) => react_jsx_runtime.JSX.Element;
323
327
 
324
328
  interface TableProps extends TableRootProps {
325
329
  showLoading?: boolean;
@@ -490,11 +494,6 @@ interface TableDataDisplayProps {
490
494
  }
491
495
  declare const TableDataDisplay: ({ colorPalette, emptyComponent, }: TableDataDisplayProps) => react_jsx_runtime.JSX.Element;
492
496
 
493
- interface FilterOptionsProps {
494
- column: string;
495
- }
496
- declare const FilterOptions: ({ column }: FilterOptionsProps) => react_jsx_runtime.JSX.Element;
497
-
498
497
  declare const GlobalFilter: () => react_jsx_runtime.JSX.Element;
499
498
 
500
499
  interface ForeignKeyProps {
@@ -707,4 +706,4 @@ declare module "@tanstack/react-table" {
707
706
  }
708
707
  }
709
708
 
710
- export { type CalendarProps, CardHeader, type CardHeaderProps, type CustomJSONSchema7Definition, DataDisplay, type DataDisplayProps, type DataResponse, DataTable, type DataTableDefaultState, type DataTableProps, DataTableServer, type DataTableServerProps, type DatePickerProps, DefaultCardTitle, DefaultForm, type DefaultFormProps, DefaultTable, type DefaultTableProps, DensityToggleButton, type DensityToggleButtonProps, type EditFilterButtonProps, EditSortingButton, type EditSortingButtonProps, type EditViewButtonProps, EmptyState, type EmptyStateProps, ErrorAlert, type ErrorAlertProps, FilterDialog, FilterOptions, type FilterOptionsProps, FormBody, FormRoot, type FormRootProps, FormTitle, type GetColumnsConfigs, type GetDateColorProps, type GetMultiDatesProps, type GetRangeDatesProps, type GetStyleProps, type GetVariantProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, Pagination, type RangeCalendarProps, type RangeDatePickerProps, RecordDisplay, type RecordDisplayProps, ReloadButton, type ReloadButtonProps, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, type Result, RowCountText, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableComponent, TableControls, type TableControlsProps, TableDataDisplay, type TableDataDisplayProps, TableFilter, TableFilterTags, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, type TableHeaderTexts, TableLoadingComponent, type TableLoadingComponentProps, type TableProps, type TableRendererProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, type UseDataTableProps, type UseDataTableReturn, type UseDataTableServerProps, type UseDataTableServerReturn, type UseFormProps, ViewDialog, getColumns, getMultiDates, getRangeDates, idPickerSanityCheck, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
709
+ export { type CalendarProps, CardHeader, type CardHeaderProps, type CustomJSONSchema7Definition, DataDisplay, type DataDisplayProps, type DataResponse, DataTable, type DataTableDefaultState, type DataTableProps, DataTableServer, type DataTableServerProps, type DatePickerProps, DefaultCardTitle, DefaultForm, type DefaultFormProps, DefaultTable, type DefaultTableProps, DensityToggleButton, type DensityToggleButtonProps, type EditFilterButtonProps, EditSortingButton, type EditSortingButtonProps, type EditViewButtonProps, EmptyState, type EmptyStateProps, ErrorAlert, type ErrorAlertProps, FilterDialog, FormBody, FormRoot, type FormRootProps, FormTitle, type GetColumnsConfigs, type GetDateColorProps, type GetMultiDatesProps, type GetRangeDatesProps, type GetStyleProps, type GetVariantProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, Pagination, type RangeCalendarProps, type RangeDatePickerProps, RecordDisplay, type RecordDisplayProps, ReloadButton, type ReloadButtonProps, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, type Result, RowCountText, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableComponent, TableControls, type TableControlsProps, TableDataDisplay, type TableDataDisplayProps, TableFilter, TableFilterTags, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, type TableHeaderTexts, TableLoadingComponent, type TableLoadingComponentProps, type TableProps, type TableRendererProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, type UseDataTableProps, type UseDataTableReturn, type UseDataTableServerProps, type UseDataTableServerReturn, type UseFormProps, ViewDialog, getColumns, getMultiDates, getRangeDates, idPickerSanityCheck, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
package/dist/index.js CHANGED
@@ -350,8 +350,17 @@ const Tag = React__namespace.forwardRef(function Tag(props, ref) {
350
350
  return (jsxRuntime.jsxs(react.Tag.Root, { ref: ref, ...rest, children: [startElement && (jsxRuntime.jsx(react.Tag.StartElement, { children: startElement })), jsxRuntime.jsx(react.Tag.Label, { children: children }), endElement && (jsxRuntime.jsx(react.Tag.EndElement, { children: endElement })), closable && (jsxRuntime.jsx(react.Tag.EndElement, { children: jsxRuntime.jsx(react.Tag.CloseTrigger, { onClick: onClose }) }))] }));
351
351
  });
352
352
 
353
- const TagFilter = ({ availableTags, selectedTags, onTagChange, }) => {
353
+ const TagFilter = ({ availableTags, selectedTags, onTagChange, selectOne = false, }) => {
354
354
  const toggleTag = (tag) => {
355
+ if (selectOne) {
356
+ if (selectedTags.includes(tag)) {
357
+ onTagChange([]);
358
+ }
359
+ else {
360
+ onTagChange([tag]);
361
+ }
362
+ return;
363
+ }
355
364
  if (selectedTags.includes(tag)) {
356
365
  onTagChange(selectedTags.filter((t) => t !== tag));
357
366
  }
@@ -2915,7 +2924,20 @@ function DataTable({ columns, data, enableRowSelection = true, enableMultiRowSel
2915
2924
  *
2916
2925
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
2917
2926
  */
2918
- 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, url, translate, children, }) {
2927
+ 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, url, translate, children, tableLabel = {
2928
+ view: "View",
2929
+ edit: "Edit",
2930
+ filterButtonText: "Filter",
2931
+ filterTitle: "Filter",
2932
+ filterReset: "Reset",
2933
+ filterClose: "Close",
2934
+ reloadTooltip: "Reload",
2935
+ reloadButtonText: "Reload",
2936
+ resetSelection: "Reset Selection",
2937
+ resetSorting: "Reset Sorting",
2938
+ rowCountText: "Row Count",
2939
+ hasErrorText: "Has Error",
2940
+ }, }) {
2919
2941
  const table = reactTable.useReactTable({
2920
2942
  _features: [DensityFeature],
2921
2943
  data: (query.data?.data ?? []),
@@ -2985,16 +3007,10 @@ function DataTableServer({ columns, enableRowSelection = true, enableMultiRowSel
2985
3007
  columnVisibility,
2986
3008
  setColumnVisibility,
2987
3009
  data: query.data?.data ?? [],
3010
+ tableLabel,
2988
3011
  }, children: jsxRuntime.jsx(DataTableServerContext.Provider, { value: { url, query }, children: children }) }));
2989
3012
  }
2990
3013
 
2991
- const Tooltip = React__namespace.forwardRef(function Tooltip(props, ref) {
2992
- const { showArrow, children, disabled, portalled, content, contentProps, portalRef, ...rest } = props;
2993
- if (disabled)
2994
- return children;
2995
- 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] }) }) })] }));
2996
- });
2997
-
2998
3014
  const InputGroup = React__namespace.forwardRef(function InputGroup(props, ref) {
2999
3015
  const { startElement, startElementProps, endElement, endElementProps, children, startOffset = "6px", endOffset = "6px", ...rest } = props;
3000
3016
  return (jsxRuntime.jsxs(react.Group, { ref: ref, ...rest, children: [startElement && (jsxRuntime.jsx(react.InputElement, { pointerEvents: "none", ...startElementProps, children: startElement })), React__namespace.cloneElement(children, {
@@ -3022,6 +3038,13 @@ const GlobalFilter = () => {
3022
3038
  } }) }) }));
3023
3039
  };
3024
3040
 
3041
+ const Tooltip = React__namespace.forwardRef(function Tooltip(props, ref) {
3042
+ const { showArrow, children, disabled, portalled, content, contentProps, portalRef, ...rest } = props;
3043
+ if (disabled)
3044
+ return children;
3045
+ 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] }) }) })] }));
3046
+ });
3047
+
3025
3048
  const ReloadButton = ({ variant = "icon", }) => {
3026
3049
  const { url } = useDataTableServerContext();
3027
3050
  const queryClient = reactQuery.useQueryClient();
@@ -3037,27 +3060,6 @@ const ReloadButton = ({ variant = "icon", }) => {
3037
3060
  }, children: [jsxRuntime.jsx(io5.IoReload, {}), " ", reloadButtonText] }));
3038
3061
  };
3039
3062
 
3040
- const FilterOptions = ({ column }) => {
3041
- const { table } = useDataTableContext();
3042
- const tableColumn = table.getColumn(column);
3043
- const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
3044
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: options.map((option) => {
3045
- const selected = table.getColumn(column)?.getFilterValue() === option;
3046
- const { label, value } = option;
3047
- return (jsxRuntime.jsxs(react.Button, { size: "sm", onClick: () => {
3048
- if (selected) {
3049
- table.setColumnFilters((state) => {
3050
- return state.filter((filter) => {
3051
- return filter.id !== column;
3052
- });
3053
- });
3054
- return;
3055
- }
3056
- table.getColumn(column)?.setFilterValue(value);
3057
- }, variant: selected ? "solid" : "outline", display: "flex", gap: "0.25rem", children: [label, selected && jsxRuntime.jsx(md.MdClose, {})] }, option.value));
3058
- }) }));
3059
- };
3060
-
3061
3063
  const TableFilterTags = () => {
3062
3064
  const { table } = useDataTableContext();
3063
3065
  return (jsxRuntime.jsx(react.Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }) => {
@@ -3069,12 +3071,18 @@ const TableFilterTags = () => {
3069
3071
  }) }));
3070
3072
  };
3071
3073
 
3072
- const TableControls = ({ fitTableWidth = false, fitTableHeight = false, children = jsxRuntime.jsx(jsxRuntime.Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, showView = true, filterOptions = [], extraItems = jsxRuntime.jsx(jsxRuntime.Fragment, {}), loading = false, hasError = false, gridProps = {}, }) => {
3073
- const { tableLabel } = useDataTableContext();
3074
+ const TableControls = ({ fitTableWidth = false, fitTableHeight = false, children = jsxRuntime.jsx(jsxRuntime.Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, showView = true, filterTagsOptions = [], extraItems = jsxRuntime.jsx(jsxRuntime.Fragment, {}), loading = false, hasError = false, gridProps = {}, }) => {
3075
+ const { tableLabel, table } = useDataTableContext();
3074
3076
  const { rowCountText, hasErrorText } = tableLabel;
3075
- return (jsxRuntime.jsxs(react.Grid, { templateRows: "auto 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", ...gridProps, children: [jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 2, children: [jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsx(react.Box, { children: showView && jsxRuntime.jsx(ViewDialog, { 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: hasErrorText, children: jsxRuntime.jsx(react.Icon, { as: bs.BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsxRuntime.jsx(GlobalFilter, {}), showFilter && jsxRuntime.jsx(FilterDialog, {}), showReload && jsxRuntime.jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((option) => {
3076
- const { label, value } = option;
3077
- return (jsxRuntime.jsxs(react.Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxRuntime.jsxs(react.Text, { children: [label, ":"] }), jsxRuntime.jsx(FilterOptions, { column: value })] }, value));
3077
+ return (jsxRuntime.jsxs(react.Grid, { templateRows: "auto 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", ...gridProps, children: [jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 2, children: [jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsx(react.Box, { children: showView && jsxRuntime.jsx(ViewDialog, { 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: hasErrorText, children: jsxRuntime.jsx(react.Icon, { as: bs.BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsxRuntime.jsx(GlobalFilter, {}), showFilter && jsxRuntime.jsx(FilterDialog, {}), showReload && jsxRuntime.jsx(ReloadButton, {}), extraItems] })] }), filterTagsOptions.length > 0 && (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "0.5rem", children: filterTagsOptions.map((option) => {
3078
+ const { column, options } = option;
3079
+ const tableColumn = table.getColumn(column);
3080
+ return (jsxRuntime.jsxs(react.Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxRuntime.jsxs(react.Text, { children: [column, ":"] }), jsxRuntime.jsx(TagFilter, { availableTags: options.map((item) => item.value), selectedTags: tableColumn?.getFilterValue() ?? [], selectOne: true, onTagChange: (tags) => {
3081
+ if (tags.length === 0) {
3082
+ return tableColumn?.setFilterValue(undefined);
3083
+ }
3084
+ tableColumn?.setFilterValue(tags);
3085
+ } })] }, column));
3078
3086
  }) })), showFilterTags && (jsxRuntime.jsx(react.Flex, { children: jsxRuntime.jsx(TableFilterTags, {}) }))] }), jsxRuntime.jsx(react.Grid, { overflow: "auto", bg: { base: "colorPalette.50", _dark: "colorPalette.950" }, children: children }), (showPageSizeControl || showPageCountText || showPagination) && (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: rowCountText }), jsxRuntime.jsx(RowCountText, {})] }))] }), jsxRuntime.jsx(react.Box, { justifySelf: "end", children: showPagination && jsxRuntime.jsx(Pagination, {}) })] }))] }));
3079
3087
  };
3080
3088
 
@@ -5599,7 +5607,6 @@ exports.EditSortingButton = EditSortingButton;
5599
5607
  exports.EmptyState = EmptyState$1;
5600
5608
  exports.ErrorAlert = ErrorAlert;
5601
5609
  exports.FilterDialog = FilterDialog;
5602
- exports.FilterOptions = FilterOptions;
5603
5610
  exports.FormBody = FormBody;
5604
5611
  exports.FormRoot = FormRoot;
5605
5612
  exports.FormTitle = FormTitle;
package/dist/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, Flex, Text, useDisclosure, DialogBackdrop, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Tag as Tag$1, Input, Menu, createRecipeContext, createContext as createContext$1, Pagination as Pagination$1, usePaginationContext, CheckboxCard as CheckboxCard$1, Image, EmptyState as EmptyState$2, VStack, Alert, Card, Tooltip as Tooltip$1, Group, InputElement, Icon, List, Table as Table$1, Checkbox as Checkbox$1, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, Accordion, Field as Field$1, Popover, NumberInput, Show, RadioCard, CheckboxGroup, Textarea, Center, Heading } from '@chakra-ui/react';
2
+ import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, Flex, Text, useDisclosure, DialogBackdrop, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Tag as Tag$1, Input, Menu, createRecipeContext, createContext as createContext$1, Pagination as Pagination$1, usePaginationContext, CheckboxCard as CheckboxCard$1, Image, EmptyState as EmptyState$2, VStack, Alert, Card, Group, InputElement, Tooltip as Tooltip$1, Icon, List, Table as Table$1, Checkbox as Checkbox$1, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, Accordion, Field as Field$1, Popover, NumberInput, Show, RadioCard, CheckboxGroup, Textarea, Center, Heading } 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
6
  import { LuX, LuCheck, LuChevronRight, LuChevronDown } from 'react-icons/lu';
7
- import { MdOutlineSort, MdFilterAlt, MdSearch, MdClose, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear, MdOutlineChecklist, MdDateRange } from 'react-icons/md';
7
+ import { MdOutlineSort, MdFilterAlt, MdSearch, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear, MdOutlineChecklist, MdDateRange } from 'react-icons/md';
8
8
  import { FaUpDown, FaGripLinesVertical } from 'react-icons/fa6';
9
9
  import { BiDownArrow, BiUpArrow, BiError } from 'react-icons/bi';
10
10
  import { CgClose, CgTrash } from 'react-icons/cg';
@@ -330,8 +330,17 @@ const Tag = React.forwardRef(function Tag(props, ref) {
330
330
  return (jsxs(Tag$1.Root, { ref: ref, ...rest, children: [startElement && (jsx(Tag$1.StartElement, { children: startElement })), jsx(Tag$1.Label, { children: children }), endElement && (jsx(Tag$1.EndElement, { children: endElement })), closable && (jsx(Tag$1.EndElement, { children: jsx(Tag$1.CloseTrigger, { onClick: onClose }) }))] }));
331
331
  });
332
332
 
333
- const TagFilter = ({ availableTags, selectedTags, onTagChange, }) => {
333
+ const TagFilter = ({ availableTags, selectedTags, onTagChange, selectOne = false, }) => {
334
334
  const toggleTag = (tag) => {
335
+ if (selectOne) {
336
+ if (selectedTags.includes(tag)) {
337
+ onTagChange([]);
338
+ }
339
+ else {
340
+ onTagChange([tag]);
341
+ }
342
+ return;
343
+ }
335
344
  if (selectedTags.includes(tag)) {
336
345
  onTagChange(selectedTags.filter((t) => t !== tag));
337
346
  }
@@ -2895,7 +2904,20 @@ function DataTable({ columns, data, enableRowSelection = true, enableMultiRowSel
2895
2904
  *
2896
2905
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
2897
2906
  */
2898
- 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, url, translate, children, }) {
2907
+ 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, url, translate, children, tableLabel = {
2908
+ view: "View",
2909
+ edit: "Edit",
2910
+ filterButtonText: "Filter",
2911
+ filterTitle: "Filter",
2912
+ filterReset: "Reset",
2913
+ filterClose: "Close",
2914
+ reloadTooltip: "Reload",
2915
+ reloadButtonText: "Reload",
2916
+ resetSelection: "Reset Selection",
2917
+ resetSorting: "Reset Sorting",
2918
+ rowCountText: "Row Count",
2919
+ hasErrorText: "Has Error",
2920
+ }, }) {
2899
2921
  const table = useReactTable({
2900
2922
  _features: [DensityFeature],
2901
2923
  data: (query.data?.data ?? []),
@@ -2965,16 +2987,10 @@ function DataTableServer({ columns, enableRowSelection = true, enableMultiRowSel
2965
2987
  columnVisibility,
2966
2988
  setColumnVisibility,
2967
2989
  data: query.data?.data ?? [],
2990
+ tableLabel,
2968
2991
  }, children: jsx(DataTableServerContext.Provider, { value: { url, query }, children: children }) }));
2969
2992
  }
2970
2993
 
2971
- const Tooltip = React.forwardRef(function Tooltip(props, ref) {
2972
- const { showArrow, children, disabled, portalled, content, contentProps, portalRef, ...rest } = props;
2973
- if (disabled)
2974
- return children;
2975
- 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] }) }) })] }));
2976
- });
2977
-
2978
2994
  const InputGroup = React.forwardRef(function InputGroup(props, ref) {
2979
2995
  const { startElement, startElementProps, endElement, endElementProps, children, startOffset = "6px", endOffset = "6px", ...rest } = props;
2980
2996
  return (jsxs(Group, { ref: ref, ...rest, children: [startElement && (jsx(InputElement, { pointerEvents: "none", ...startElementProps, children: startElement })), React.cloneElement(children, {
@@ -3002,6 +3018,13 @@ const GlobalFilter = () => {
3002
3018
  } }) }) }));
3003
3019
  };
3004
3020
 
3021
+ const Tooltip = React.forwardRef(function Tooltip(props, ref) {
3022
+ const { showArrow, children, disabled, portalled, content, contentProps, portalRef, ...rest } = props;
3023
+ if (disabled)
3024
+ return children;
3025
+ 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] }) }) })] }));
3026
+ });
3027
+
3005
3028
  const ReloadButton = ({ variant = "icon", }) => {
3006
3029
  const { url } = useDataTableServerContext();
3007
3030
  const queryClient = useQueryClient();
@@ -3017,27 +3040,6 @@ const ReloadButton = ({ variant = "icon", }) => {
3017
3040
  }, children: [jsx(IoReload, {}), " ", reloadButtonText] }));
3018
3041
  };
3019
3042
 
3020
- const FilterOptions = ({ column }) => {
3021
- const { table } = useDataTableContext();
3022
- const tableColumn = table.getColumn(column);
3023
- const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
3024
- return (jsx(Fragment, { children: options.map((option) => {
3025
- const selected = table.getColumn(column)?.getFilterValue() === option;
3026
- const { label, value } = option;
3027
- return (jsxs(Button$1, { size: "sm", onClick: () => {
3028
- if (selected) {
3029
- table.setColumnFilters((state) => {
3030
- return state.filter((filter) => {
3031
- return filter.id !== column;
3032
- });
3033
- });
3034
- return;
3035
- }
3036
- table.getColumn(column)?.setFilterValue(value);
3037
- }, variant: selected ? "solid" : "outline", display: "flex", gap: "0.25rem", children: [label, selected && jsx(MdClose, {})] }, option.value));
3038
- }) }));
3039
- };
3040
-
3041
3043
  const TableFilterTags = () => {
3042
3044
  const { table } = useDataTableContext();
3043
3045
  return (jsx(Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }) => {
@@ -3049,12 +3051,18 @@ const TableFilterTags = () => {
3049
3051
  }) }));
3050
3052
  };
3051
3053
 
3052
- const TableControls = ({ fitTableWidth = false, fitTableHeight = false, children = jsx(Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, showView = true, filterOptions = [], extraItems = jsx(Fragment, {}), loading = false, hasError = false, gridProps = {}, }) => {
3053
- const { tableLabel } = useDataTableContext();
3054
+ const TableControls = ({ fitTableWidth = false, fitTableHeight = false, children = jsx(Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, showView = true, filterTagsOptions = [], extraItems = jsx(Fragment, {}), loading = false, hasError = false, gridProps = {}, }) => {
3055
+ const { tableLabel, table } = useDataTableContext();
3054
3056
  const { rowCountText, hasErrorText } = tableLabel;
3055
- return (jsxs(Grid, { templateRows: "auto 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", ...gridProps, children: [jsxs(Flex, { flexFlow: "column", gap: 2, children: [jsxs(Flex, { justifyContent: "space-between", children: [jsx(Box, { children: showView && jsx(ViewDialog, { icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { content: hasErrorText, children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsx(GlobalFilter, {}), showFilter && jsx(FilterDialog, {}), showReload && jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsx(Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((option) => {
3056
- const { label, value } = option;
3057
- return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [label, ":"] }), jsx(FilterOptions, { column: value })] }, value));
3057
+ return (jsxs(Grid, { templateRows: "auto 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", ...gridProps, children: [jsxs(Flex, { flexFlow: "column", gap: 2, children: [jsxs(Flex, { justifyContent: "space-between", children: [jsx(Box, { children: showView && jsx(ViewDialog, { icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { content: hasErrorText, children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsx(GlobalFilter, {}), showFilter && jsx(FilterDialog, {}), showReload && jsx(ReloadButton, {}), extraItems] })] }), filterTagsOptions.length > 0 && (jsx(Flex, { flexFlow: "column", gap: "0.5rem", children: filterTagsOptions.map((option) => {
3058
+ const { column, options } = option;
3059
+ const tableColumn = table.getColumn(column);
3060
+ return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [column, ":"] }), jsx(TagFilter, { availableTags: options.map((item) => item.value), selectedTags: tableColumn?.getFilterValue() ?? [], selectOne: true, onTagChange: (tags) => {
3061
+ if (tags.length === 0) {
3062
+ return tableColumn?.setFilterValue(undefined);
3063
+ }
3064
+ tableColumn?.setFilterValue(tags);
3065
+ } })] }, column));
3058
3066
  }) })), showFilterTags && (jsx(Flex, { children: jsx(TableFilterTags, {}) }))] }), jsx(Grid, { overflow: "auto", bg: { base: "colorPalette.50", _dark: "colorPalette.950" }, children: children }), (showPageSizeControl || showPageCountText || showPagination) && (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: rowCountText }), jsx(RowCountText, {})] }))] }), jsx(Box, { justifySelf: "end", children: showPagination && jsx(Pagination, {}) })] }))] }));
3059
3067
  };
3060
3068
 
@@ -5567,4 +5575,4 @@ const getMultiDates = ({ selected, selectedDate, selectedDates, selectable, }) =
5567
5575
  }
5568
5576
  };
5569
5577
 
5570
- export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultForm, DefaultTable, DensityToggleButton, EditSortingButton, EmptyState$1 as EmptyState, ErrorAlert, FilterDialog, FilterOptions, FormBody, FormRoot, FormTitle, GlobalFilter, PageSizeControl, Pagination, RecordDisplay, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableDataDisplay, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableSelector, TableSorter, TableViewer, TextCell, ViewDialog, getColumns, getMultiDates, getRangeDates, idPickerSanityCheck, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
5578
+ export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultForm, DefaultTable, DensityToggleButton, EditSortingButton, EmptyState$1 as EmptyState, ErrorAlert, FilterDialog, FormBody, FormRoot, FormTitle, GlobalFilter, PageSizeControl, Pagination, RecordDisplay, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableDataDisplay, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableSelector, TableSorter, TableViewer, TextCell, ViewDialog, getColumns, getMultiDates, getRangeDates, idPickerSanityCheck, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
@@ -50,7 +50,7 @@ export interface DataTableProps<TData = unknown> {
50
50
  setDensity: OnChangeFn<DensityState>;
51
51
  setColumnVisibility: OnChangeFn<VisibilityState>;
52
52
  translate: UseTranslationResponse<any, any>;
53
- tableLabel: DataTableLabel;
53
+ tableLabel?: DataTableLabel;
54
54
  }
55
55
  /**
56
56
  * DataTable will create a context to hold all values to
@@ -2,6 +2,7 @@ import { ReactNode } from "react";
2
2
  import { UseQueryResult } from "@tanstack/react-query";
3
3
  import { ColumnDef, ColumnFiltersState, ColumnOrderState, OnChangeFn, PaginationState, RowSelectionState, SortingState, VisibilityState } from "@tanstack/react-table";
4
4
  import { DensityState } from "./controls/DensityFeature";
5
+ import { DataTableLabel } from "./context/DataTableContext";
5
6
  import { DataResponse } from "./useDataTableServer";
6
7
  import { UseTranslationResponse } from "react-i18next";
7
8
  export interface DataTableServerProps<TData extends DataResponse = DataResponse<unknown>> {
@@ -36,6 +37,7 @@ export interface DataTableServerProps<TData extends DataResponse = DataResponse<
36
37
  query: UseQueryResult<TData>;
37
38
  url: string;
38
39
  translate: UseTranslationResponse<any, any>;
40
+ tableLabel: DataTableLabel;
39
41
  }
40
42
  /**
41
43
  * DataTableServer will create a context to hold all values to
@@ -48,4 +50,4 @@ export interface DataTableServerProps<TData extends DataResponse = DataResponse<
48
50
  *
49
51
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
50
52
  */
51
- 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, url, translate, children, }: DataTableServerProps<TData>): import("react/jsx-runtime").JSX.Element;
53
+ 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, url, translate, children, tableLabel, }: DataTableServerProps<TData>): import("react/jsx-runtime").JSX.Element;
@@ -14,13 +14,16 @@ export interface TableControlsProps {
14
14
  showPageSizeControl?: boolean;
15
15
  showPageCountText?: boolean;
16
16
  showView?: boolean;
17
- filterOptions?: {
18
- label: string;
19
- value: string;
17
+ filterTagsOptions?: {
18
+ column: string;
19
+ options: {
20
+ label: string;
21
+ value: string;
22
+ }[];
20
23
  }[];
21
24
  extraItems?: ReactNode;
22
25
  loading?: boolean;
23
26
  hasError?: boolean;
24
27
  gridProps?: GridProps;
25
28
  }
26
- export declare const TableControls: ({ fitTableWidth, fitTableHeight, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, showView, filterOptions, extraItems, loading, hasError, gridProps, }: TableControlsProps) => import("react/jsx-runtime").JSX.Element;
29
+ export declare const TableControls: ({ fitTableWidth, fitTableHeight, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, showView, filterTagsOptions, extraItems, loading, hasError, gridProps, }: TableControlsProps) => import("react/jsx-runtime").JSX.Element;
@@ -2,6 +2,7 @@ import React from "react";
2
2
  interface TagFilterProps {
3
3
  availableTags: string[];
4
4
  selectedTags: string[];
5
+ selectOne?: boolean;
5
6
  onTagChange: (tags: string[]) => void;
6
7
  }
7
8
  export declare const TagFilter: React.FC<TagFilterProps>;
@@ -110,7 +110,6 @@ export * from "./components/DataTable/useDataTable";
110
110
  export * from "./components/DataTable/useDataTableServer";
111
111
  export * from "./components/DataTable/utils/getColumns";
112
112
  export * from "./components/DataTable/display/TableDataDisplay";
113
- export * from "./components/Filter/FilterOptions";
114
113
  export * from "./components/Filter/GlobalFilter";
115
114
  export * from "./components/Form/components/core/DefaultForm";
116
115
  export * from "./components/Form/components/core/FormRoot";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "12.0.0-beta.50",
3
+ "version": "12.0.0-beta.52",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",