@tint-ui/data-table 0.3.5

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.
Files changed (122) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/adapters/boolean.d.ts +10 -0
  4. package/adapters/boolean.js +38 -0
  5. package/adapters/index.d.ts +6 -0
  6. package/adapters/index.js +18 -0
  7. package/adapters/number-format.d.ts +1 -0
  8. package/adapters/number-format.js +42 -0
  9. package/adapters/number.d.ts +12 -0
  10. package/adapters/number.js +51 -0
  11. package/adapters/text.d.ts +4 -0
  12. package/adapters/text.js +9 -0
  13. package/cell-adapter-type.d.ts +43 -0
  14. package/cell-adapter-type.js +306 -0
  15. package/cjs/adapters/boolean.js +43 -0
  16. package/cjs/adapters/index.js +21 -0
  17. package/cjs/adapters/number-format.js +46 -0
  18. package/cjs/adapters/number.js +56 -0
  19. package/cjs/adapters/text.js +13 -0
  20. package/cjs/cell-adapter-type.js +312 -0
  21. package/cjs/classes.js +27 -0
  22. package/cjs/context.js +14 -0
  23. package/cjs/data-table-content.js +105 -0
  24. package/cjs/data-table-pagination.js +38 -0
  25. package/cjs/data-table-text-filter.js +83 -0
  26. package/cjs/data-table-toolbar.js +103 -0
  27. package/cjs/data-table-views-options.js +137 -0
  28. package/cjs/data-table.js +63 -0
  29. package/cjs/filter-adapter-type.js +162 -0
  30. package/cjs/filter-adapters/index.js +10 -0
  31. package/cjs/filter-adapters/option.js +152 -0
  32. package/cjs/filter-adapters/use-option-filter.js +195 -0
  33. package/cjs/filter-classes.js +26 -0
  34. package/cjs/filter-fn.js +84 -0
  35. package/cjs/index.js +99 -0
  36. package/cjs/package.json +3 -0
  37. package/cjs/pagination-arrow.js +93 -0
  38. package/cjs/pagination-classes.js +20 -0
  39. package/cjs/pagination-number.js +66 -0
  40. package/cjs/pagination-size-options.js +48 -0
  41. package/cjs/row-button-menu.js +49 -0
  42. package/cjs/row-popover-menu.js +52 -0
  43. package/cjs/toolbar-classes.js +24 -0
  44. package/cjs/types.js +3 -0
  45. package/cjs/use-data-table.js +768 -0
  46. package/cjs/use-lexicon.js +155 -0
  47. package/cjs/use-row-menu.js +60 -0
  48. package/cjs/use-visibility-column.js +105 -0
  49. package/cjs/use-visibility-filter.js +149 -0
  50. package/cjs/utils.js +136 -0
  51. package/classes.d.ts +34 -0
  52. package/classes.js +23 -0
  53. package/context.d.ts +5 -0
  54. package/context.js +9 -0
  55. package/data-table-content.d.ts +9 -0
  56. package/data-table-content.js +98 -0
  57. package/data-table-pagination.d.ts +5 -0
  58. package/data-table-pagination.js +31 -0
  59. package/data-table-text-filter.d.ts +7 -0
  60. package/data-table-text-filter.js +76 -0
  61. package/data-table-toolbar.d.ts +5 -0
  62. package/data-table-toolbar.js +95 -0
  63. package/data-table-views-options.d.ts +2 -0
  64. package/data-table-views-options.js +133 -0
  65. package/data-table.d.ts +18 -0
  66. package/data-table.js +56 -0
  67. package/filter-adapter-type.d.ts +9 -0
  68. package/filter-adapter-type.js +155 -0
  69. package/filter-adapters/index.d.ts +5 -0
  70. package/filter-adapters/index.js +7 -0
  71. package/filter-adapters/option.d.ts +3 -0
  72. package/filter-adapters/option.js +147 -0
  73. package/filter-adapters/use-option-filter.d.ts +27 -0
  74. package/filter-adapters/use-option-filter.js +192 -0
  75. package/filter-classes.d.ts +32 -0
  76. package/filter-classes.js +22 -0
  77. package/filter-fn.d.ts +7 -0
  78. package/filter-fn.js +76 -0
  79. package/index.d.ts +16 -0
  80. package/index.js +16 -0
  81. package/package.json +97 -0
  82. package/pagination-arrow.d.ts +5 -0
  83. package/pagination-arrow.js +86 -0
  84. package/pagination-classes.d.ts +20 -0
  85. package/pagination-classes.js +16 -0
  86. package/pagination-number.d.ts +5 -0
  87. package/pagination-number.js +59 -0
  88. package/pagination-size-options.d.ts +3 -0
  89. package/pagination-size-options.js +44 -0
  90. package/row-button-menu.d.ts +5 -0
  91. package/row-button-menu.js +45 -0
  92. package/row-popover-menu.d.ts +5 -0
  93. package/row-popover-menu.js +48 -0
  94. package/styles-filter.css +1 -0
  95. package/styles-filter.module.css +64 -0
  96. package/styles-filter.module.scss +65 -0
  97. package/styles-pagination.css +1 -0
  98. package/styles-pagination.module.css +28 -0
  99. package/styles-pagination.module.scss +31 -0
  100. package/styles-toolbar.css +1 -0
  101. package/styles-toolbar.module.css +70 -0
  102. package/styles-toolbar.module.scss +67 -0
  103. package/styles.css +1 -0
  104. package/styles.json +8 -0
  105. package/styles.module.css +39 -0
  106. package/styles.module.scss +38 -0
  107. package/toolbar-classes.d.ts +26 -0
  108. package/toolbar-classes.js +20 -0
  109. package/types.d.ts +226 -0
  110. package/types.js +2 -0
  111. package/use-data-table.d.ts +3 -0
  112. package/use-data-table.js +768 -0
  113. package/use-lexicon.d.ts +12 -0
  114. package/use-lexicon.js +151 -0
  115. package/use-row-menu.d.ts +7 -0
  116. package/use-row-menu.js +58 -0
  117. package/use-visibility-column.d.ts +7 -0
  118. package/use-visibility-column.js +101 -0
  119. package/use-visibility-filter.d.ts +7 -0
  120. package/use-visibility-filter.js +145 -0
  121. package/utils.d.ts +14 -0
  122. package/utils.js +128 -0
@@ -0,0 +1,98 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from "react";
3
+ import clsx from "clsx";
4
+ import { flexRender } from "@tanstack/react-table";
5
+ import { Table, TableHeader, TableFooter, TableBody, TableRow, TableCell } from "@tint-ui/table";
6
+ import { isEmpty } from "@tint-ui/tools/is-empty";
7
+ import { useDataTableContext } from "./context.js";
8
+ import { DataTableCell, DataTableHead } from "./cell-adapter-type.js";
9
+ import { useDataTableClasses } from "./classes.js";
10
+ const DataTableContent = /*#__PURE__*/React.forwardRef(({
11
+ themePropsType,
12
+ className,
13
+ wrapperProps = {},
14
+ ...props
15
+ }, ref) => {
16
+ const context = useDataTableContext();
17
+ const classes = useDataTableClasses();
18
+ const {
19
+ table,
20
+ header: {
21
+ top,
22
+ bottom
23
+ },
24
+ invisible
25
+ } = context;
26
+ const rows = table.getRowModel().rows;
27
+ const widthArea = {
28
+ top: top,
29
+ bottom: bottom && !top,
30
+ cell: !top && !bottom
31
+ };
32
+ let notFound = "";
33
+ if (rows.length === 0) {
34
+ const {
35
+ lexicon
36
+ } = context;
37
+ const state = table.getState();
38
+ if (isEmpty(state.globalFilter) && state.columnFilters.length === 0 && state.pagination.pageIndex === 0) {
39
+ notFound = lexicon.notFound;
40
+ } else {
41
+ notFound = lexicon.notFoundFiltered;
42
+ }
43
+ }
44
+ return /*#__PURE__*/React.createElement(Table, _extends({}, props, {
45
+ wrapperProps: {
46
+ ...wrapperProps,
47
+ className: clsx(wrapperProps.className, classes.dataTable)
48
+ },
49
+ className: clsx(className, classes.table),
50
+ themePropsType: themePropsType,
51
+ ref: ref
52
+ }), top && /*#__PURE__*/React.createElement(TableHeader, {
53
+ themePropsType: themePropsType
54
+ }, table.getHeaderGroups().map(group => /*#__PURE__*/React.createElement(TableRow, {
55
+ key: group.id,
56
+ themePropsType: themePropsType
57
+ }, group.headers.map(header => invisible[header.column.id] ? null : /*#__PURE__*/React.createElement(DataTableHead, {
58
+ key: header.id,
59
+ header: header,
60
+ themePropsType: themePropsType,
61
+ withWidth: widthArea.top
62
+ }))))), /*#__PURE__*/React.createElement(TableBody, {
63
+ themePropsType: themePropsType
64
+ }, rows.length === 0 ? /*#__PURE__*/React.createElement(TableRow, {
65
+ key: "empty",
66
+ themePropsType: themePropsType
67
+ }, /*#__PURE__*/React.createElement(TableCell, {
68
+ colSpan: table.getVisibleLeafColumns().filter(cell => invisible[cell.id] !== true).length,
69
+ className: classes.cellNotFound
70
+ }, notFound)) : rows.map((row, index) => {
71
+ const clickHandler = context.getRowClickHandler(row.original);
72
+ return /*#__PURE__*/React.createElement(TableRow, {
73
+ key: row.id,
74
+ themePropsType: themePropsType,
75
+ onClick: clickHandler,
76
+ "data-click": clickHandler != null
77
+ }, row.getVisibleCells().map(cell => {
78
+ return invisible[cell.column.id] ? null : /*#__PURE__*/React.createElement(DataTableCell, {
79
+ key: cell.id,
80
+ cell: cell,
81
+ themePropsType: themePropsType,
82
+ withWidth: widthArea.cell && index === 0
83
+ }, flexRender(cell.column.columnDef.cell, cell.getContext()));
84
+ }));
85
+ })), bottom && /*#__PURE__*/React.createElement(TableFooter, {
86
+ themePropsType: themePropsType
87
+ }, table.getHeaderGroups().map(group => /*#__PURE__*/React.createElement(TableRow, {
88
+ key: group.id,
89
+ themePropsType: themePropsType
90
+ }, group.headers.map(header => invisible[header.column.id] ? null : /*#__PURE__*/React.createElement(DataTableHead, {
91
+ key: header.id,
92
+ header: header,
93
+ themePropsType: themePropsType,
94
+ withWidth: widthArea.bottom
95
+ }))))));
96
+ });
97
+ DataTableContent.displayName = "DataTableContent";
98
+ export { DataTableContent };
@@ -0,0 +1,5 @@
1
+ import * as React from "react";
2
+ declare const DataTablePagination: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
3
+ type DataTablePaginationProps = React.ComponentProps<typeof DataTablePagination>;
4
+ export { DataTablePagination };
5
+ export type { DataTablePaginationProps };
@@ -0,0 +1,31 @@
1
+ "use client";
2
+
3
+ import _extends from "@babel/runtime/helpers/esm/extends";
4
+ import * as React from "react";
5
+ import clsx from "clsx";
6
+ import { useDataTablePaginationClasses } from "./pagination-classes.js";
7
+ import { useDataTableContext } from "./context.js";
8
+ import { PaginationSizeOptions } from "./pagination-size-options.js";
9
+ import { PaginationArrow } from "./pagination-arrow.js";
10
+ import { PaginationNumber } from "./pagination-number.js";
11
+ const DataTablePagination = /*#__PURE__*/React.forwardRef(({
12
+ className,
13
+ ...props
14
+ }, ref) => {
15
+ const classes = useDataTablePaginationClasses();
16
+ const {
17
+ navbar: {
18
+ mode,
19
+ size
20
+ }
21
+ } = useDataTableContext();
22
+ return /*#__PURE__*/React.createElement("div", _extends({}, props, {
23
+ "data-navbar-size": size,
24
+ className: clsx(classes.pagination, className),
25
+ ref: ref
26
+ }), /*#__PURE__*/React.createElement("span", {
27
+ className: classes.divider
28
+ }), /*#__PURE__*/React.createElement(PaginationSizeOptions, null), mode === "arrow" ? /*#__PURE__*/React.createElement(PaginationArrow, null) : /*#__PURE__*/React.createElement(PaginationNumber, null));
29
+ });
30
+ DataTablePagination.displayName = "DataTablePagination";
31
+ export { DataTablePagination };
@@ -0,0 +1,7 @@
1
+ import * as React from "react";
2
+ declare const DataTableTextFilter: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLDivElement> & React.HTMLAttributes<HTMLDivElement> & {
3
+ isMobile?: boolean | undefined;
4
+ }, "ref"> & React.RefAttributes<HTMLDivElement>>;
5
+ type DataTableTextFilterProps = React.ComponentProps<typeof DataTableTextFilter>;
6
+ export { DataTableTextFilter };
7
+ export type { DataTableTextFilterProps };
@@ -0,0 +1,76 @@
1
+ "use client";
2
+
3
+ import _extends from "@babel/runtime/helpers/esm/extends";
4
+ import * as React from "react";
5
+ import { SvgThemeIcon } from "@tint-ui/svg-icon";
6
+ import { InputGroup, InputAddon, InputText } from "@tint-ui/input";
7
+ import { useDataTableFilterClasses } from "./filter-classes.js";
8
+ import { useDataTableContext } from "./context.js";
9
+ import clsx from "clsx";
10
+ const getFilterText = table => {
11
+ const text = table.getState().globalFilter;
12
+ return typeof text === "string" ? text : "";
13
+ };
14
+ const DataTableTextFilter = /*#__PURE__*/React.forwardRef(({
15
+ className,
16
+ isMobile = false,
17
+ ...props
18
+ }, ref) => {
19
+ const classes = useDataTableFilterClasses();
20
+ const {
21
+ lexicon,
22
+ table,
23
+ toolbar: {
24
+ size
25
+ }
26
+ } = useDataTableContext();
27
+ const [text, setText] = React.useState(() => getFilterText(table));
28
+ const focusRef = React.useRef(false);
29
+ const {
30
+ resetHandler,
31
+ inputProps
32
+ } = React.useMemo(() => {
33
+ const resetHandler = () => {
34
+ setText(getFilterText(table));
35
+ };
36
+ return {
37
+ resetHandler,
38
+ inputProps: {
39
+ onFocus() {
40
+ focusRef.current = true;
41
+ },
42
+ onBlur() {
43
+ focusRef.current = false;
44
+ resetHandler();
45
+ }
46
+ }
47
+ };
48
+ }, [table]);
49
+ const filterText = getFilterText(table);
50
+ React.useEffect(() => {
51
+ if (filterText !== text && !focusRef.current) {
52
+ resetHandler();
53
+ }
54
+ }, [filterText]);
55
+ return /*#__PURE__*/React.createElement(InputGroup, _extends({}, props, {
56
+ size: size,
57
+ className: clsx(classes.text, isMobile && classes.textMobile, className),
58
+ ref: ref
59
+ }), /*#__PURE__*/React.createElement(InputAddon, {
60
+ size: size,
61
+ variant: "label"
62
+ }, /*#__PURE__*/React.createElement(SvgThemeIcon, {
63
+ icon: "search"
64
+ })), /*#__PURE__*/React.createElement(InputText, _extends({}, inputProps, {
65
+ size: size,
66
+ placeholder: lexicon.search,
67
+ value: text,
68
+ onChange: event => {
69
+ const value = event.target.value;
70
+ setText(value);
71
+ table.setGlobalFilter(value);
72
+ }
73
+ })));
74
+ });
75
+ DataTableTextFilter.displayName = "DataTableTextFilter";
76
+ export { DataTableTextFilter };
@@ -0,0 +1,5 @@
1
+ import * as React from "react";
2
+ declare const DataTableToolbar: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
3
+ type DataTableToolbarProps = React.ComponentProps<typeof DataTableToolbar>;
4
+ export { DataTableToolbar };
5
+ export type { DataTableToolbarProps };
@@ -0,0 +1,95 @@
1
+ "use client";
2
+
3
+ import _extends from "@babel/runtime/helpers/esm/extends";
4
+ import * as React from "react";
5
+ import clsx from "clsx";
6
+ import { Button } from "@tint-ui/button";
7
+ import { SvgThemeIcon } from "@tint-ui/svg-icon";
8
+ import { SlideNavigator, Slide } from "@tint-ui/slide-navigator";
9
+ import { useMediaQuery } from "@tint-ui/tools/use-media-query";
10
+ import { useDataTableContext } from "./context.js";
11
+ import { useDataTableToolbarClasses } from "./toolbar-classes.js";
12
+ import { DataTableViewOptions } from "./data-table-views-options.js";
13
+ import { DataTableTextFilter } from "./data-table-text-filter.js";
14
+ import { renderDataTableFilter } from "./filter-adapter-type.js"; // label
15
+ const DataTableToolbar = /*#__PURE__*/React.forwardRef(({
16
+ className,
17
+ ...props
18
+ }, ref) => {
19
+ const classes = useDataTableToolbarClasses();
20
+ const {
21
+ lexicon,
22
+ table,
23
+ filterVisible,
24
+ toolbar: {
25
+ size,
26
+ resetIconOnly,
27
+ onFilterReset
28
+ }
29
+ } = useDataTableContext();
30
+ const isMobile = useMediaQuery("(max-width: 639px)", {
31
+ noSsr: true
32
+ });
33
+ const state = table.getState();
34
+ const isFiltered = state.columnFilters.length > 0 || String(state.globalFilter ?? "").length > 0;
35
+ const filters = filterVisible.getVisibleFilters();
36
+ const isHeading = filters.length === 0 && !filterVisible.filterText && !isFiltered;
37
+ let body;
38
+ if (isHeading) {
39
+ body = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h2", {
40
+ className: classes.heading
41
+ }, lexicon.title), /*#__PURE__*/React.createElement(DataTableViewOptions, null));
42
+ } else {
43
+ const col1 = filterVisible.filterText ? /*#__PURE__*/React.createElement("div", {
44
+ key: "search",
45
+ className: classes.search
46
+ }, /*#__PURE__*/React.createElement(DataTableTextFilter, {
47
+ isMobile: isMobile
48
+ })) : /*#__PURE__*/React.createElement("h2", {
49
+ key: "heading",
50
+ className: classes.heading
51
+ }, lexicon.title);
52
+ const col2 = filters.length > 0 ? /*#__PURE__*/React.createElement(SlideNavigator, {
53
+ key: "filters",
54
+ size: size,
55
+ arrow: "auto",
56
+ className: classes.filters
57
+ }, filters.map(filter => /*#__PURE__*/React.createElement(Slide, {
58
+ key: filter.name,
59
+ asChild: true
60
+ }, renderDataTableFilter(filter)))) : isMobile ? null : /*#__PURE__*/React.createElement("div", {
61
+ key: "empty-filters",
62
+ className: classes.filters
63
+ });
64
+ const col3 = /*#__PURE__*/React.createElement("div", {
65
+ key: "reset",
66
+ className: classes.reset
67
+ }, isFiltered && /*#__PURE__*/React.createElement(Button, {
68
+ variant: "secondary",
69
+ "data-type": "toolbar-button-reset",
70
+ size: size,
71
+ onClick: onFilterReset,
72
+ iconLeft: /*#__PURE__*/React.createElement(SvgThemeIcon, {
73
+ icon: "x",
74
+ "aria-hidden": "true"
75
+ }),
76
+ iconOnly: resetIconOnly
77
+ }, resetIconOnly ? null : lexicon.filterReset));
78
+ const col4 = /*#__PURE__*/React.createElement("div", {
79
+ key: "options",
80
+ className: classes.options
81
+ }, /*#__PURE__*/React.createElement(DataTableViewOptions, null));
82
+ body = isMobile ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
83
+ className: classes.mobile
84
+ }, col1, col3, col4), col2 == null ? null : /*#__PURE__*/React.createElement("div", {
85
+ className: classes.mobile
86
+ }, col2)) : /*#__PURE__*/React.createElement(React.Fragment, null, col1, col2, col3, col4);
87
+ }
88
+ return /*#__PURE__*/React.createElement("div", _extends({}, props, {
89
+ "data-size": size,
90
+ className: clsx(className, classes.toolbar, !isHeading && (isMobile ? classes.withFilterGroup : classes.withFilter)),
91
+ ref: ref
92
+ }), body);
93
+ });
94
+ DataTableToolbar.displayName = "DataTableToolbar";
95
+ export { DataTableToolbar };
@@ -0,0 +1,2 @@
1
+ import * as React from "react";
2
+ export declare function DataTableViewOptions<TData>(): React.JSX.Element | null;
@@ -0,0 +1,133 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import { Button } from "@tint-ui/button";
5
+ import { DropdownMenu, DropdownMenuSub, DropdownMenuGroup, DropdownMenuCheckboxItem, DropdownMenuItem, DropdownMenuContent, DropdownMenuSubContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, DropdownMenuSubTrigger, DropdownMenuPortal } from "@tint-ui/dropdown-menu";
6
+ import { useDataTableContext } from "./context.js";
7
+ import { SvgThemeIcon } from "@tint-ui/svg-icon";
8
+ const preventHandler = event => {
9
+ event.preventDefault();
10
+ };
11
+ const menuColumns = function (table) {
12
+ return table.getAllColumns().filter(column => typeof column.accessorFn !== "undefined" && column.getCanHide()).map(column => {
13
+ const cell = column.columnDef.meta?._cell;
14
+ return /*#__PURE__*/React.createElement(DropdownMenuCheckboxItem, {
15
+ key: column.id,
16
+ checked: column.getIsVisible(),
17
+ onSelect: preventHandler,
18
+ onCheckedChange: value => {
19
+ column.toggleVisibility(value);
20
+ }
21
+ }, cell ? cell.label : column.id);
22
+ });
23
+ };
24
+ const menuSorts = function (table) {
25
+ return table.getAllColumns().filter(column => typeof column.accessorFn !== "undefined" && column.getCanSort()).map(column => {
26
+ const cell = column.columnDef.meta?._cell;
27
+ const direction = column.getIsSorted();
28
+ const fn = column.getToggleSortingHandler();
29
+ return /*#__PURE__*/React.createElement(DropdownMenuItem, {
30
+ key: column.id,
31
+ onSelect: event => {
32
+ if (fn) {
33
+ fn(event);
34
+ event.preventDefault();
35
+ }
36
+ }
37
+ }, /*#__PURE__*/React.createElement(SvgThemeIcon, {
38
+ icon: !direction ? "selector" : direction === "desc" ? "sort-desc" : "sort-asc"
39
+ }), cell ? cell.label : column.id);
40
+ });
41
+ };
42
+ const menuFilters = function (filterVisible) {
43
+ return filterVisible.getFilters().map(filter => {
44
+ const {
45
+ name
46
+ } = filter;
47
+ return /*#__PURE__*/React.createElement(DropdownMenuCheckboxItem, {
48
+ key: name,
49
+ checked: filterVisible.hasFilterVisible(name),
50
+ onSelect: preventHandler,
51
+ onCheckedChange: value => {
52
+ filterVisible.onFilterVisibleChange(name, value);
53
+ }
54
+ }, filter.label);
55
+ });
56
+ };
57
+ const menuFilterText = function (filterVisible, label) {
58
+ return /*#__PURE__*/React.createElement(DropdownMenuCheckboxItem, {
59
+ key: "filter-text",
60
+ checked: filterVisible.filterText,
61
+ onSelect: preventHandler,
62
+ onCheckedChange: value => {
63
+ filterVisible.onFilterTextVisibleChange(value);
64
+ }
65
+ }, label);
66
+ };
67
+ export function DataTableViewOptions() {
68
+ const {
69
+ table,
70
+ filterVisible,
71
+ dynamic,
72
+ toolbar: {
73
+ size,
74
+ viewIconOnly
75
+ },
76
+ lexicon
77
+ } = useDataTableContext();
78
+ let count = 0;
79
+ if (dynamic.column) {
80
+ count++;
81
+ }
82
+ if (dynamic.filter) {
83
+ count++;
84
+ }
85
+ if (dynamic.filterText) {
86
+ count++;
87
+ }
88
+ if (dynamic.sort) {
89
+ count++;
90
+ }
91
+ if (count === 0) {
92
+ return null;
93
+ }
94
+ const getTitle = () => {
95
+ if (count > 1) {
96
+ return lexicon.viewOptions;
97
+ }
98
+ if (dynamic.sort) return lexicon.viewSortBy;
99
+ if (dynamic.column) return lexicon.viewColumn;
100
+ if (dynamic.filter) return lexicon.viewFilter;
101
+ if (dynamic.filterText) return lexicon.viewFilterText;
102
+ return null;
103
+ };
104
+ const renderOnce = () => {
105
+ if (dynamic.sort) return menuSorts(table);
106
+ if (dynamic.column) return menuColumns(table);
107
+ if (dynamic.filter) return menuFilters(filterVisible);
108
+ if (dynamic.filterText) return menuFilterText(filterVisible, lexicon.viewFilterText);
109
+ return null;
110
+ };
111
+ return /*#__PURE__*/React.createElement(DropdownMenu, null, /*#__PURE__*/React.createElement(DropdownMenuTrigger, {
112
+ asChild: true
113
+ }, /*#__PURE__*/React.createElement(Button, {
114
+ variant: "outline",
115
+ "data-type": "toolbar-button-options",
116
+ size: size,
117
+ iconLeft: /*#__PURE__*/React.createElement(SvgThemeIcon, {
118
+ icon: "data-table-view"
119
+ }),
120
+ iconOnly: viewIconOnly
121
+ }, viewIconOnly ? null : lexicon.view)), /*#__PURE__*/React.createElement(DropdownMenuPortal, null, /*#__PURE__*/React.createElement(DropdownMenuContent, {
122
+ align: "end",
123
+ onCloseAutoFocus: event => {
124
+ event.preventDefault();
125
+ }
126
+ }, /*#__PURE__*/React.createElement(DropdownMenuLabel, null, getTitle()), /*#__PURE__*/React.createElement(DropdownMenuSeparator, null), count > 1 ? /*#__PURE__*/React.createElement(DropdownMenuGroup, null, dynamic.column && /*#__PURE__*/React.createElement(DropdownMenuSub, null, /*#__PURE__*/React.createElement(DropdownMenuSubTrigger, null, /*#__PURE__*/React.createElement(SvgThemeIcon, {
127
+ icon: "data-table-view-columns"
128
+ }), lexicon.viewColumn), /*#__PURE__*/React.createElement(DropdownMenuPortal, null, /*#__PURE__*/React.createElement(DropdownMenuSubContent, null, menuColumns(table)))), dynamic.sort && /*#__PURE__*/React.createElement(DropdownMenuSub, null, /*#__PURE__*/React.createElement(DropdownMenuSubTrigger, null, /*#__PURE__*/React.createElement(SvgThemeIcon, {
129
+ icon: "data-table-view-sorts"
130
+ }), lexicon.viewSortBy), /*#__PURE__*/React.createElement(DropdownMenuPortal, null, /*#__PURE__*/React.createElement(DropdownMenuSubContent, null, menuSorts(table)))), dynamic.filter && /*#__PURE__*/React.createElement(DropdownMenuSub, null, /*#__PURE__*/React.createElement(DropdownMenuSubTrigger, null, /*#__PURE__*/React.createElement(SvgThemeIcon, {
131
+ icon: "data-table-view-filters"
132
+ }), lexicon.viewFilter), /*#__PURE__*/React.createElement(DropdownMenuPortal, null, /*#__PURE__*/React.createElement(DropdownMenuSubContent, null, menuFilters(filterVisible)))), dynamic.filterText && menuFilterText(filterVisible, lexicon.viewFilterText)) : renderOnce())));
133
+ }
@@ -0,0 +1,18 @@
1
+ import type { DataTableCoreProps } from "./types";
2
+ import * as React from "react";
3
+ type DataTablePropsNoRef<TData extends object> = Omit<React.HTMLAttributes<HTMLTableElement>, keyof DataTableCoreProps<TData>> & {
4
+ wrapperProps?: React.HTMLAttributes<HTMLDivElement>;
5
+ themePropsType?: string;
6
+ } & DataTableCoreProps<TData>;
7
+ declare const DataTable: (<TData extends object>(props: Omit<React.HTMLAttributes<HTMLTableElement>, keyof DataTableCoreProps<TData_1>> & {
8
+ wrapperProps?: React.HTMLAttributes<HTMLDivElement> | undefined;
9
+ themePropsType?: string | undefined;
10
+ } & DataTableCoreProps<TData> & {
11
+ ref?: React.Ref<HTMLTableElement> | undefined;
12
+ }) => React.ReactElement) & {
13
+ readonly $$typeof: symbol;
14
+ displayName?: string | undefined;
15
+ };
16
+ type DataTableProps = React.ComponentProps<typeof DataTable>;
17
+ export { DataTable };
18
+ export type { DataTableProps };
package/data-table.js ADDED
@@ -0,0 +1,56 @@
1
+ "use client";
2
+
3
+ import _extends from "@babel/runtime/helpers/esm/extends";
4
+ import * as React from "react";
5
+ import { useDataTable } from "./use-data-table.js";
6
+ import { DataTableContext } from "./context.js";
7
+ import { DataTableToolbar } from "./data-table-toolbar.js";
8
+ import { DataTableContent } from "./data-table-content.js";
9
+ import { DataTablePagination } from "./data-table-pagination.js";
10
+ const DataTable = /*#__PURE__*/React.forwardRef(({
11
+ themePropsType = "data-table",
12
+ header = "top",
13
+ table: tableProp,
14
+ data,
15
+ navbar,
16
+ initialData,
17
+ limit,
18
+ offset,
19
+ lexicon,
20
+ total,
21
+ onRowClick,
22
+ filter,
23
+ filterText,
24
+ sortBy,
25
+ sortDir,
26
+ toolbar,
27
+ cacheable,
28
+ ...props
29
+ }, ref) => {
30
+ const context = useDataTable({
31
+ table: tableProp,
32
+ data,
33
+ navbar,
34
+ toolbar,
35
+ initialData,
36
+ limit,
37
+ offset,
38
+ lexicon,
39
+ total,
40
+ filter,
41
+ filterText,
42
+ sortBy,
43
+ sortDir,
44
+ header,
45
+ onRowClick,
46
+ cacheable
47
+ });
48
+ return /*#__PURE__*/React.createElement(DataTableContext.Provider, {
49
+ value: context
50
+ }, /*#__PURE__*/React.createElement(DataTableToolbar, null), /*#__PURE__*/React.createElement(DataTableContent, _extends({}, props, {
51
+ themePropsType: themePropsType,
52
+ ref: ref
53
+ })), /*#__PURE__*/React.createElement(DataTablePagination, null));
54
+ });
55
+ DataTable.displayName = "DataTable";
56
+ export { DataTable };
@@ -0,0 +1,9 @@
1
+ import type { DataTableFilterAdapter, DataTableDisplayFilter } from "./types";
2
+ import * as React from "react";
3
+ declare const hasFilterAdapter: (type: string) => boolean;
4
+ declare const addFilterAdapter: (name: string, adapter: DataTableFilterAdapter) => void;
5
+ declare const addFilterAdapterAsync: (name: string, handler: () => Promise<{
6
+ default: DataTableFilterAdapter;
7
+ }>) => void;
8
+ declare const renderDataTableFilter: <TName = string, FConfig extends object = any>(filter: DataTableDisplayFilter<TName, FConfig>) => React.ReactNode;
9
+ export { hasFilterAdapter, addFilterAdapter, addFilterAdapterAsync, renderDataTableFilter };