@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.
- package/LICENSE +21 -0
- package/README.md +9 -0
- package/adapters/boolean.d.ts +10 -0
- package/adapters/boolean.js +38 -0
- package/adapters/index.d.ts +6 -0
- package/adapters/index.js +18 -0
- package/adapters/number-format.d.ts +1 -0
- package/adapters/number-format.js +42 -0
- package/adapters/number.d.ts +12 -0
- package/adapters/number.js +51 -0
- package/adapters/text.d.ts +4 -0
- package/adapters/text.js +9 -0
- package/cell-adapter-type.d.ts +43 -0
- package/cell-adapter-type.js +306 -0
- package/cjs/adapters/boolean.js +43 -0
- package/cjs/adapters/index.js +21 -0
- package/cjs/adapters/number-format.js +46 -0
- package/cjs/adapters/number.js +56 -0
- package/cjs/adapters/text.js +13 -0
- package/cjs/cell-adapter-type.js +312 -0
- package/cjs/classes.js +27 -0
- package/cjs/context.js +14 -0
- package/cjs/data-table-content.js +105 -0
- package/cjs/data-table-pagination.js +38 -0
- package/cjs/data-table-text-filter.js +83 -0
- package/cjs/data-table-toolbar.js +103 -0
- package/cjs/data-table-views-options.js +137 -0
- package/cjs/data-table.js +63 -0
- package/cjs/filter-adapter-type.js +162 -0
- package/cjs/filter-adapters/index.js +10 -0
- package/cjs/filter-adapters/option.js +152 -0
- package/cjs/filter-adapters/use-option-filter.js +195 -0
- package/cjs/filter-classes.js +26 -0
- package/cjs/filter-fn.js +84 -0
- package/cjs/index.js +99 -0
- package/cjs/package.json +3 -0
- package/cjs/pagination-arrow.js +93 -0
- package/cjs/pagination-classes.js +20 -0
- package/cjs/pagination-number.js +66 -0
- package/cjs/pagination-size-options.js +48 -0
- package/cjs/row-button-menu.js +49 -0
- package/cjs/row-popover-menu.js +52 -0
- package/cjs/toolbar-classes.js +24 -0
- package/cjs/types.js +3 -0
- package/cjs/use-data-table.js +768 -0
- package/cjs/use-lexicon.js +155 -0
- package/cjs/use-row-menu.js +60 -0
- package/cjs/use-visibility-column.js +105 -0
- package/cjs/use-visibility-filter.js +149 -0
- package/cjs/utils.js +136 -0
- package/classes.d.ts +34 -0
- package/classes.js +23 -0
- package/context.d.ts +5 -0
- package/context.js +9 -0
- package/data-table-content.d.ts +9 -0
- package/data-table-content.js +98 -0
- package/data-table-pagination.d.ts +5 -0
- package/data-table-pagination.js +31 -0
- package/data-table-text-filter.d.ts +7 -0
- package/data-table-text-filter.js +76 -0
- package/data-table-toolbar.d.ts +5 -0
- package/data-table-toolbar.js +95 -0
- package/data-table-views-options.d.ts +2 -0
- package/data-table-views-options.js +133 -0
- package/data-table.d.ts +18 -0
- package/data-table.js +56 -0
- package/filter-adapter-type.d.ts +9 -0
- package/filter-adapter-type.js +155 -0
- package/filter-adapters/index.d.ts +5 -0
- package/filter-adapters/index.js +7 -0
- package/filter-adapters/option.d.ts +3 -0
- package/filter-adapters/option.js +147 -0
- package/filter-adapters/use-option-filter.d.ts +27 -0
- package/filter-adapters/use-option-filter.js +192 -0
- package/filter-classes.d.ts +32 -0
- package/filter-classes.js +22 -0
- package/filter-fn.d.ts +7 -0
- package/filter-fn.js +76 -0
- package/index.d.ts +16 -0
- package/index.js +16 -0
- package/package.json +97 -0
- package/pagination-arrow.d.ts +5 -0
- package/pagination-arrow.js +86 -0
- package/pagination-classes.d.ts +20 -0
- package/pagination-classes.js +16 -0
- package/pagination-number.d.ts +5 -0
- package/pagination-number.js +59 -0
- package/pagination-size-options.d.ts +3 -0
- package/pagination-size-options.js +44 -0
- package/row-button-menu.d.ts +5 -0
- package/row-button-menu.js +45 -0
- package/row-popover-menu.d.ts +5 -0
- package/row-popover-menu.js +48 -0
- package/styles-filter.css +1 -0
- package/styles-filter.module.css +64 -0
- package/styles-filter.module.scss +65 -0
- package/styles-pagination.css +1 -0
- package/styles-pagination.module.css +28 -0
- package/styles-pagination.module.scss +31 -0
- package/styles-toolbar.css +1 -0
- package/styles-toolbar.module.css +70 -0
- package/styles-toolbar.module.scss +67 -0
- package/styles.css +1 -0
- package/styles.json +8 -0
- package/styles.module.css +39 -0
- package/styles.module.scss +38 -0
- package/toolbar-classes.d.ts +26 -0
- package/toolbar-classes.js +20 -0
- package/types.d.ts +226 -0
- package/types.js +2 -0
- package/use-data-table.d.ts +3 -0
- package/use-data-table.js +768 -0
- package/use-lexicon.d.ts +12 -0
- package/use-lexicon.js +151 -0
- package/use-row-menu.d.ts +7 -0
- package/use-row-menu.js +58 -0
- package/use-visibility-column.d.ts +7 -0
- package/use-visibility-column.js +101 -0
- package/use-visibility-filter.d.ts +7 -0
- package/use-visibility-filter.js +145 -0
- package/utils.d.ts +14 -0
- 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,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
|
+
}
|
package/data-table.d.ts
ADDED
|
@@ -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 };
|