@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,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
6
|
+
exports.__esModule = true;
|
|
7
|
+
exports.DataTableToolbar = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
10
|
+
var React = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _clsx = _interopRequireDefault(require("clsx"));
|
|
12
|
+
var _button = require("@tint-ui/button");
|
|
13
|
+
var _svgIcon = require("@tint-ui/svg-icon");
|
|
14
|
+
var _slideNavigator = require("@tint-ui/slide-navigator");
|
|
15
|
+
var _useMediaQuery = require("@tint-ui/tools/use-media-query");
|
|
16
|
+
var _context = require("./context");
|
|
17
|
+
var _toolbarClasses = require("./toolbar-classes");
|
|
18
|
+
var _dataTableViewsOptions = require("./data-table-views-options");
|
|
19
|
+
var _dataTableTextFilter = require("./data-table-text-filter");
|
|
20
|
+
var _filterAdapterType = require("./filter-adapter-type");
|
|
21
|
+
const _excluded = ["className"];
|
|
22
|
+
// label
|
|
23
|
+
const DataTableToolbar = exports.DataTableToolbar = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
24
|
+
let {
|
|
25
|
+
className
|
|
26
|
+
} = _ref,
|
|
27
|
+
props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
|
|
28
|
+
const classes = (0, _toolbarClasses.useDataTableToolbarClasses)();
|
|
29
|
+
const {
|
|
30
|
+
lexicon,
|
|
31
|
+
table,
|
|
32
|
+
filterVisible,
|
|
33
|
+
toolbar: {
|
|
34
|
+
size,
|
|
35
|
+
resetIconOnly,
|
|
36
|
+
onFilterReset
|
|
37
|
+
}
|
|
38
|
+
} = (0, _context.useDataTableContext)();
|
|
39
|
+
const isMobile = (0, _useMediaQuery.useMediaQuery)("(max-width: 639px)", {
|
|
40
|
+
noSsr: true
|
|
41
|
+
});
|
|
42
|
+
const state = table.getState();
|
|
43
|
+
const isFiltered = state.columnFilters.length > 0 || String(state.globalFilter ?? "").length > 0;
|
|
44
|
+
const filters = filterVisible.getVisibleFilters();
|
|
45
|
+
const isHeading = filters.length === 0 && !filterVisible.filterText && !isFiltered;
|
|
46
|
+
let body;
|
|
47
|
+
if (isHeading) {
|
|
48
|
+
body = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h2", {
|
|
49
|
+
className: classes.heading
|
|
50
|
+
}, lexicon.title), /*#__PURE__*/React.createElement(_dataTableViewsOptions.DataTableViewOptions, null));
|
|
51
|
+
} else {
|
|
52
|
+
const col1 = filterVisible.filterText ? /*#__PURE__*/React.createElement("div", {
|
|
53
|
+
key: "search",
|
|
54
|
+
className: classes.search
|
|
55
|
+
}, /*#__PURE__*/React.createElement(_dataTableTextFilter.DataTableTextFilter, {
|
|
56
|
+
isMobile: isMobile
|
|
57
|
+
})) : /*#__PURE__*/React.createElement("h2", {
|
|
58
|
+
key: "heading",
|
|
59
|
+
className: classes.heading
|
|
60
|
+
}, lexicon.title);
|
|
61
|
+
const col2 = filters.length > 0 ? /*#__PURE__*/React.createElement(_slideNavigator.SlideNavigator, {
|
|
62
|
+
key: "filters",
|
|
63
|
+
size: size,
|
|
64
|
+
arrow: "auto",
|
|
65
|
+
className: classes.filters
|
|
66
|
+
}, filters.map(filter => /*#__PURE__*/React.createElement(_slideNavigator.Slide, {
|
|
67
|
+
key: filter.name,
|
|
68
|
+
asChild: true
|
|
69
|
+
}, (0, _filterAdapterType.renderDataTableFilter)(filter)))) : isMobile ? null : /*#__PURE__*/React.createElement("div", {
|
|
70
|
+
key: "empty-filters",
|
|
71
|
+
className: classes.filters
|
|
72
|
+
});
|
|
73
|
+
const col3 = /*#__PURE__*/React.createElement("div", {
|
|
74
|
+
key: "reset",
|
|
75
|
+
className: classes.reset
|
|
76
|
+
}, isFiltered && /*#__PURE__*/React.createElement(_button.Button, {
|
|
77
|
+
variant: "secondary",
|
|
78
|
+
"data-type": "toolbar-button-reset",
|
|
79
|
+
size: size,
|
|
80
|
+
onClick: onFilterReset,
|
|
81
|
+
iconLeft: /*#__PURE__*/React.createElement(_svgIcon.SvgThemeIcon, {
|
|
82
|
+
icon: "x",
|
|
83
|
+
"aria-hidden": "true"
|
|
84
|
+
}),
|
|
85
|
+
iconOnly: resetIconOnly
|
|
86
|
+
}, resetIconOnly ? null : lexicon.filterReset));
|
|
87
|
+
const col4 = /*#__PURE__*/React.createElement("div", {
|
|
88
|
+
key: "options",
|
|
89
|
+
className: classes.options
|
|
90
|
+
}, /*#__PURE__*/React.createElement(_dataTableViewsOptions.DataTableViewOptions, null));
|
|
91
|
+
body = isMobile ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
92
|
+
className: classes.mobile
|
|
93
|
+
}, col1, col3, col4), col2 == null ? null : /*#__PURE__*/React.createElement("div", {
|
|
94
|
+
className: classes.mobile
|
|
95
|
+
}, col2)) : /*#__PURE__*/React.createElement(React.Fragment, null, col1, col2, col3, col4);
|
|
96
|
+
}
|
|
97
|
+
return /*#__PURE__*/React.createElement("div", (0, _extends2.default)({}, props, {
|
|
98
|
+
"data-size": size,
|
|
99
|
+
className: (0, _clsx.default)(className, classes.toolbar, !isHeading && (isMobile ? classes.withFilterGroup : classes.withFilter)),
|
|
100
|
+
ref: ref
|
|
101
|
+
}), body);
|
|
102
|
+
});
|
|
103
|
+
DataTableToolbar.displayName = "DataTableToolbar";
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.DataTableViewOptions = DataTableViewOptions;
|
|
7
|
+
var React = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _button = require("@tint-ui/button");
|
|
9
|
+
var _dropdownMenu = require("@tint-ui/dropdown-menu");
|
|
10
|
+
var _context = require("./context");
|
|
11
|
+
var _svgIcon = require("@tint-ui/svg-icon");
|
|
12
|
+
const preventHandler = event => {
|
|
13
|
+
event.preventDefault();
|
|
14
|
+
};
|
|
15
|
+
const menuColumns = function (table) {
|
|
16
|
+
return table.getAllColumns().filter(column => typeof column.accessorFn !== "undefined" && column.getCanHide()).map(column => {
|
|
17
|
+
const cell = column.columnDef.meta?._cell;
|
|
18
|
+
return /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuCheckboxItem, {
|
|
19
|
+
key: column.id,
|
|
20
|
+
checked: column.getIsVisible(),
|
|
21
|
+
onSelect: preventHandler,
|
|
22
|
+
onCheckedChange: value => {
|
|
23
|
+
column.toggleVisibility(value);
|
|
24
|
+
}
|
|
25
|
+
}, cell ? cell.label : column.id);
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
const menuSorts = function (table) {
|
|
29
|
+
return table.getAllColumns().filter(column => typeof column.accessorFn !== "undefined" && column.getCanSort()).map(column => {
|
|
30
|
+
const cell = column.columnDef.meta?._cell;
|
|
31
|
+
const direction = column.getIsSorted();
|
|
32
|
+
const fn = column.getToggleSortingHandler();
|
|
33
|
+
return /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuItem, {
|
|
34
|
+
key: column.id,
|
|
35
|
+
onSelect: event => {
|
|
36
|
+
if (fn) {
|
|
37
|
+
fn(event);
|
|
38
|
+
event.preventDefault();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}, /*#__PURE__*/React.createElement(_svgIcon.SvgThemeIcon, {
|
|
42
|
+
icon: !direction ? "selector" : direction === "desc" ? "sort-desc" : "sort-asc"
|
|
43
|
+
}), cell ? cell.label : column.id);
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
const menuFilters = function (filterVisible) {
|
|
47
|
+
return filterVisible.getFilters().map(filter => {
|
|
48
|
+
const {
|
|
49
|
+
name
|
|
50
|
+
} = filter;
|
|
51
|
+
return /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuCheckboxItem, {
|
|
52
|
+
key: name,
|
|
53
|
+
checked: filterVisible.hasFilterVisible(name),
|
|
54
|
+
onSelect: preventHandler,
|
|
55
|
+
onCheckedChange: value => {
|
|
56
|
+
filterVisible.onFilterVisibleChange(name, value);
|
|
57
|
+
}
|
|
58
|
+
}, filter.label);
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const menuFilterText = function (filterVisible, label) {
|
|
62
|
+
return /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuCheckboxItem, {
|
|
63
|
+
key: "filter-text",
|
|
64
|
+
checked: filterVisible.filterText,
|
|
65
|
+
onSelect: preventHandler,
|
|
66
|
+
onCheckedChange: value => {
|
|
67
|
+
filterVisible.onFilterTextVisibleChange(value);
|
|
68
|
+
}
|
|
69
|
+
}, label);
|
|
70
|
+
};
|
|
71
|
+
function DataTableViewOptions() {
|
|
72
|
+
const {
|
|
73
|
+
table,
|
|
74
|
+
filterVisible,
|
|
75
|
+
dynamic,
|
|
76
|
+
toolbar: {
|
|
77
|
+
size,
|
|
78
|
+
viewIconOnly
|
|
79
|
+
},
|
|
80
|
+
lexicon
|
|
81
|
+
} = (0, _context.useDataTableContext)();
|
|
82
|
+
let count = 0;
|
|
83
|
+
if (dynamic.column) {
|
|
84
|
+
count++;
|
|
85
|
+
}
|
|
86
|
+
if (dynamic.filter) {
|
|
87
|
+
count++;
|
|
88
|
+
}
|
|
89
|
+
if (dynamic.filterText) {
|
|
90
|
+
count++;
|
|
91
|
+
}
|
|
92
|
+
if (dynamic.sort) {
|
|
93
|
+
count++;
|
|
94
|
+
}
|
|
95
|
+
if (count === 0) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const getTitle = () => {
|
|
99
|
+
if (count > 1) {
|
|
100
|
+
return lexicon.viewOptions;
|
|
101
|
+
}
|
|
102
|
+
if (dynamic.sort) return lexicon.viewSortBy;
|
|
103
|
+
if (dynamic.column) return lexicon.viewColumn;
|
|
104
|
+
if (dynamic.filter) return lexicon.viewFilter;
|
|
105
|
+
if (dynamic.filterText) return lexicon.viewFilterText;
|
|
106
|
+
return null;
|
|
107
|
+
};
|
|
108
|
+
const renderOnce = () => {
|
|
109
|
+
if (dynamic.sort) return menuSorts(table);
|
|
110
|
+
if (dynamic.column) return menuColumns(table);
|
|
111
|
+
if (dynamic.filter) return menuFilters(filterVisible);
|
|
112
|
+
if (dynamic.filterText) return menuFilterText(filterVisible, lexicon.viewFilterText);
|
|
113
|
+
return null;
|
|
114
|
+
};
|
|
115
|
+
return /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenu, null, /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuTrigger, {
|
|
116
|
+
asChild: true
|
|
117
|
+
}, /*#__PURE__*/React.createElement(_button.Button, {
|
|
118
|
+
variant: "outline",
|
|
119
|
+
"data-type": "toolbar-button-options",
|
|
120
|
+
size: size,
|
|
121
|
+
iconLeft: /*#__PURE__*/React.createElement(_svgIcon.SvgThemeIcon, {
|
|
122
|
+
icon: "data-table-view"
|
|
123
|
+
}),
|
|
124
|
+
iconOnly: viewIconOnly
|
|
125
|
+
}, viewIconOnly ? null : lexicon.view)), /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuPortal, null, /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuContent, {
|
|
126
|
+
align: "end",
|
|
127
|
+
onCloseAutoFocus: event => {
|
|
128
|
+
event.preventDefault();
|
|
129
|
+
}
|
|
130
|
+
}, /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuLabel, null, getTitle()), /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuSeparator, null), count > 1 ? /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuGroup, null, dynamic.column && /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuSub, null, /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuSubTrigger, null, /*#__PURE__*/React.createElement(_svgIcon.SvgThemeIcon, {
|
|
131
|
+
icon: "data-table-view-columns"
|
|
132
|
+
}), lexicon.viewColumn), /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuPortal, null, /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuSubContent, null, menuColumns(table)))), dynamic.sort && /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuSub, null, /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuSubTrigger, null, /*#__PURE__*/React.createElement(_svgIcon.SvgThemeIcon, {
|
|
133
|
+
icon: "data-table-view-sorts"
|
|
134
|
+
}), lexicon.viewSortBy), /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuPortal, null, /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuSubContent, null, menuSorts(table)))), dynamic.filter && /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuSub, null, /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuSubTrigger, null, /*#__PURE__*/React.createElement(_svgIcon.SvgThemeIcon, {
|
|
135
|
+
icon: "data-table-view-filters"
|
|
136
|
+
}), lexicon.viewFilter), /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuPortal, null, /*#__PURE__*/React.createElement(_dropdownMenu.DropdownMenuSubContent, null, menuFilters(filterVisible)))), dynamic.filterText && menuFilterText(filterVisible, lexicon.viewFilterText)) : renderOnce())));
|
|
137
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
6
|
+
exports.__esModule = true;
|
|
7
|
+
exports.DataTable = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
10
|
+
var React = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _useDataTable = require("./use-data-table");
|
|
12
|
+
var _context = require("./context");
|
|
13
|
+
var _dataTableToolbar = require("./data-table-toolbar");
|
|
14
|
+
var _dataTableContent = require("./data-table-content");
|
|
15
|
+
var _dataTablePagination = require("./data-table-pagination");
|
|
16
|
+
const _excluded = ["themePropsType", "header", "table", "data", "navbar", "initialData", "limit", "offset", "lexicon", "total", "onRowClick", "filter", "filterText", "sortBy", "sortDir", "toolbar", "cacheable"];
|
|
17
|
+
const DataTable = exports.DataTable = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
18
|
+
let {
|
|
19
|
+
themePropsType = "data-table",
|
|
20
|
+
header = "top",
|
|
21
|
+
table: tableProp,
|
|
22
|
+
data,
|
|
23
|
+
navbar,
|
|
24
|
+
initialData,
|
|
25
|
+
limit,
|
|
26
|
+
offset,
|
|
27
|
+
lexicon,
|
|
28
|
+
total,
|
|
29
|
+
onRowClick,
|
|
30
|
+
filter,
|
|
31
|
+
filterText,
|
|
32
|
+
sortBy,
|
|
33
|
+
sortDir,
|
|
34
|
+
toolbar,
|
|
35
|
+
cacheable
|
|
36
|
+
} = _ref,
|
|
37
|
+
props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
|
|
38
|
+
const context = (0, _useDataTable.useDataTable)({
|
|
39
|
+
table: tableProp,
|
|
40
|
+
data,
|
|
41
|
+
navbar,
|
|
42
|
+
toolbar,
|
|
43
|
+
initialData,
|
|
44
|
+
limit,
|
|
45
|
+
offset,
|
|
46
|
+
lexicon,
|
|
47
|
+
total,
|
|
48
|
+
filter,
|
|
49
|
+
filterText,
|
|
50
|
+
sortBy,
|
|
51
|
+
sortDir,
|
|
52
|
+
header,
|
|
53
|
+
onRowClick,
|
|
54
|
+
cacheable
|
|
55
|
+
});
|
|
56
|
+
return /*#__PURE__*/React.createElement(_context.DataTableContext.Provider, {
|
|
57
|
+
value: context
|
|
58
|
+
}, /*#__PURE__*/React.createElement(_dataTableToolbar.DataTableToolbar, null), /*#__PURE__*/React.createElement(_dataTableContent.DataTableContent, (0, _extends2.default)({}, props, {
|
|
59
|
+
themePropsType: themePropsType,
|
|
60
|
+
ref: ref
|
|
61
|
+
})), /*#__PURE__*/React.createElement(_dataTablePagination.DataTablePagination, null));
|
|
62
|
+
});
|
|
63
|
+
DataTable.displayName = "DataTable";
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.renderDataTableFilter = exports.hasFilterAdapter = exports.addFilterAdapterAsync = exports.addFilterAdapter = void 0;
|
|
7
|
+
var React = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _proof = require("@tint-ui/tools/proof");
|
|
9
|
+
var _errorMessage = require("@tint-ui/tools/error-message");
|
|
10
|
+
var _filterAdapters = require("./filter-adapters");
|
|
11
|
+
var _classes = require("./classes");
|
|
12
|
+
const adapters = new Map();
|
|
13
|
+
const defaultAdapters = new Map();
|
|
14
|
+
Object.entries(_filterAdapters.adapters).forEach(([name, {
|
|
15
|
+
adapter
|
|
16
|
+
}]) => {
|
|
17
|
+
defaultAdapters.set(name, {
|
|
18
|
+
adapter
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
const getAdapt = type => {
|
|
22
|
+
const adapter = adapters.get(type) || defaultAdapters.get(type);
|
|
23
|
+
if (!adapter) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return adapter;
|
|
27
|
+
};
|
|
28
|
+
const privateTypes = [];
|
|
29
|
+
const checkAdapt = type => {
|
|
30
|
+
if (!type) {
|
|
31
|
+
throw new Error(`Adapter type is empty`);
|
|
32
|
+
}
|
|
33
|
+
if (privateTypes.includes(type)) {
|
|
34
|
+
throw new Error(`The ${type} type is private`);
|
|
35
|
+
}
|
|
36
|
+
if (adapters.has(type)) {
|
|
37
|
+
throw new Error(`The ${type} form adapter already exists`);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const hasFilterAdapter = type => adapters.has(type);
|
|
41
|
+
exports.hasFilterAdapter = hasFilterAdapter;
|
|
42
|
+
const addFilterAdapter = function (name, adapter) {
|
|
43
|
+
checkAdapt(name);
|
|
44
|
+
adapters.set(name, {
|
|
45
|
+
adapter
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
exports.addFilterAdapter = addFilterAdapter;
|
|
49
|
+
const addFilterAdapterAsync = function (name, handler) {
|
|
50
|
+
checkAdapt(name);
|
|
51
|
+
adapters.set(name, {
|
|
52
|
+
adapter: createAsyncAdapterCallback(name, handler)
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
exports.addFilterAdapterAsync = addFilterAdapterAsync;
|
|
56
|
+
const getAsyncAdapter = function (type, result) {
|
|
57
|
+
const adapter = result?.default;
|
|
58
|
+
(0, _proof.invariant)(typeof adapter === "function", `Async ${type} adapter failure: default is not function`);
|
|
59
|
+
return adapter;
|
|
60
|
+
};
|
|
61
|
+
const createAsyncAdapterCallback = function (type, handler) {
|
|
62
|
+
const adapt = {
|
|
63
|
+
waiters: new Set(),
|
|
64
|
+
handler,
|
|
65
|
+
error: null
|
|
66
|
+
};
|
|
67
|
+
const adapter = filter => {
|
|
68
|
+
return /*#__PURE__*/React.createElement(DataTableFilterAdapterAsync, {
|
|
69
|
+
adapt: adapt,
|
|
70
|
+
type: type,
|
|
71
|
+
filter: filter
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
adapt.adapter = adapter;
|
|
75
|
+
return adapter;
|
|
76
|
+
};
|
|
77
|
+
const createAsyncPromise = async (type, adapt) => {
|
|
78
|
+
try {
|
|
79
|
+
const result = await adapt.handler();
|
|
80
|
+
const adapter = getAsyncAdapter(type, result);
|
|
81
|
+
adapt.error = null;
|
|
82
|
+
adapt.adapter = adapter;
|
|
83
|
+
adapters.set(type, {
|
|
84
|
+
adapter
|
|
85
|
+
});
|
|
86
|
+
} catch (err) {
|
|
87
|
+
adapt.error = (0, _errorMessage.errorMessage)(err).message;
|
|
88
|
+
}
|
|
89
|
+
let event;
|
|
90
|
+
if (adapt.error != null) {
|
|
91
|
+
event = {
|
|
92
|
+
error: adapt.error
|
|
93
|
+
};
|
|
94
|
+
} else if (adapt.adapter) {
|
|
95
|
+
event = {
|
|
96
|
+
adapter: adapt.adapter
|
|
97
|
+
};
|
|
98
|
+
} else {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const handlers = Array.from(adapt.waiters.values());
|
|
102
|
+
adapt.waiters.clear();
|
|
103
|
+
handlers.forEach(handler => {
|
|
104
|
+
handler(event);
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
const DataTableFilterAdapterAsync = props => {
|
|
108
|
+
const classes = (0, _classes.useDataTableClasses)();
|
|
109
|
+
const {
|
|
110
|
+
adapt,
|
|
111
|
+
filter,
|
|
112
|
+
type
|
|
113
|
+
} = props;
|
|
114
|
+
const [state, setState] = React.useState(() => {
|
|
115
|
+
return adapt.adapter ? {
|
|
116
|
+
adapter: adapt.adapter
|
|
117
|
+
} : adapt.error != null ? {
|
|
118
|
+
error: adapt.error
|
|
119
|
+
} : null;
|
|
120
|
+
});
|
|
121
|
+
React.useEffect(() => {
|
|
122
|
+
const {
|
|
123
|
+
adapter,
|
|
124
|
+
error,
|
|
125
|
+
promise
|
|
126
|
+
} = adapt;
|
|
127
|
+
if (error != null || adapter != null) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (promise == null) {
|
|
131
|
+
adapt.promise = createAsyncPromise(type, adapt);
|
|
132
|
+
}
|
|
133
|
+
adapt.waiters.add(setState);
|
|
134
|
+
return () => {
|
|
135
|
+
adapt.waiters.delete(setState);
|
|
136
|
+
};
|
|
137
|
+
}, [type, adapt]);
|
|
138
|
+
if (state == null) {
|
|
139
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
140
|
+
className: classes.loader
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
if ("error" in state) {
|
|
144
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
145
|
+
className: classes.error
|
|
146
|
+
}, state.error);
|
|
147
|
+
}
|
|
148
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, state.adapter(filter));
|
|
149
|
+
};
|
|
150
|
+
DataTableFilterAdapterAsync.displayName = "DataTableFilterAdapterAsync";
|
|
151
|
+
const renderDataTableFilter = function (filter) {
|
|
152
|
+
const {
|
|
153
|
+
type = "option"
|
|
154
|
+
} = filter;
|
|
155
|
+
const adapt = getAdapt(type);
|
|
156
|
+
if (!adapt) {
|
|
157
|
+
(0, _proof.warningOnce)(`table-filter:${type}`, false, `The ${type} filter type not found`);
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
return adapt.adapter(filter);
|
|
161
|
+
};
|
|
162
|
+
exports.renderDataTableFilter = renderDataTableFilter;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
5
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
6
|
+
exports.__esModule = true;
|
|
7
|
+
exports.optionFilterAdapter = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
var React = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _svgIcon = require("@tint-ui/svg-icon");
|
|
11
|
+
var _clsx = _interopRequireDefault(require("clsx"));
|
|
12
|
+
var _isEmpty = require("@tint-ui/tools/is-empty");
|
|
13
|
+
var _badge = require("@tint-ui/badge");
|
|
14
|
+
var _button = require("@tint-ui/button");
|
|
15
|
+
var _command = require("@tint-ui/command");
|
|
16
|
+
var _popover = require("@tint-ui/popover");
|
|
17
|
+
var _useOptionFilter = require("./use-option-filter");
|
|
18
|
+
var _filterClasses = require("../filter-classes");
|
|
19
|
+
const createOptionGroups = (options, groupBy) => {
|
|
20
|
+
const root = [];
|
|
21
|
+
const optionGroup = [];
|
|
22
|
+
const cache = new Map();
|
|
23
|
+
for (const option of options) {
|
|
24
|
+
const {
|
|
25
|
+
config
|
|
26
|
+
} = option;
|
|
27
|
+
if (config && groupBy in config && config[groupBy]) {
|
|
28
|
+
const heading = String(config[groupBy]).trim();
|
|
29
|
+
let options = cache.get(heading);
|
|
30
|
+
if (!options) {
|
|
31
|
+
options = [];
|
|
32
|
+
cache.set(heading, options);
|
|
33
|
+
optionGroup.push({
|
|
34
|
+
heading,
|
|
35
|
+
options
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
options.push(option);
|
|
39
|
+
} else {
|
|
40
|
+
root.push(option);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (root.length) {
|
|
44
|
+
optionGroup.push({
|
|
45
|
+
options: root
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return optionGroup;
|
|
49
|
+
};
|
|
50
|
+
const FilterOptionType = ({
|
|
51
|
+
filter
|
|
52
|
+
}) => {
|
|
53
|
+
const classes = (0, _filterClasses.useDataTableFilterClasses)();
|
|
54
|
+
const ctx = (0, _useOptionFilter.useOptionFilter)(filter);
|
|
55
|
+
const column = ctx.column;
|
|
56
|
+
if (!column) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const {
|
|
60
|
+
value,
|
|
61
|
+
options,
|
|
62
|
+
getSelectedOptions,
|
|
63
|
+
manual,
|
|
64
|
+
inputProps,
|
|
65
|
+
lexicon,
|
|
66
|
+
icon,
|
|
67
|
+
groupBy = null,
|
|
68
|
+
disableSearch = false
|
|
69
|
+
} = ctx;
|
|
70
|
+
const selectedOptions = getSelectedOptions();
|
|
71
|
+
const optionGroups = React.useMemo(() => groupBy ? createOptionGroups(options, groupBy) : [{
|
|
72
|
+
options
|
|
73
|
+
}], [options, groupBy]);
|
|
74
|
+
return /*#__PURE__*/React.createElement(_popover.Popover, null, /*#__PURE__*/React.createElement(_popover.PopoverTrigger, {
|
|
75
|
+
asChild: true
|
|
76
|
+
}, /*#__PURE__*/React.createElement(_button.Button, {
|
|
77
|
+
variant: "outline",
|
|
78
|
+
size: ctx.size,
|
|
79
|
+
className: classes.button,
|
|
80
|
+
iconLeft: /*#__PURE__*/React.createElement(_svgIcon.SvgThemeIcon, {
|
|
81
|
+
icon: icon || "data-table-add-filter"
|
|
82
|
+
})
|
|
83
|
+
}, /*#__PURE__*/React.createElement("span", null, filter.label), selectedOptions.length > 0 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_badge.Badge, {
|
|
84
|
+
variant: "secondary",
|
|
85
|
+
className: (0, _clsx.default)(classes.badge, classes.mobile)
|
|
86
|
+
}, selectedOptions.length), /*#__PURE__*/React.createElement("div", {
|
|
87
|
+
className: (0, _clsx.default)(classes.badges, classes.desktop)
|
|
88
|
+
}, selectedOptions.length > 2 ? /*#__PURE__*/React.createElement(_badge.Badge, {
|
|
89
|
+
variant: "secondary",
|
|
90
|
+
className: classes.badge
|
|
91
|
+
}, lexicon.filterSelected(selectedOptions.length)) : selectedOptions.map(option => /*#__PURE__*/React.createElement(_badge.Badge, {
|
|
92
|
+
variant: "secondary",
|
|
93
|
+
key: option.value,
|
|
94
|
+
className: classes.badge
|
|
95
|
+
}, option.label)))))), /*#__PURE__*/React.createElement(_popover.PopoverContent, {
|
|
96
|
+
className: classes.popover,
|
|
97
|
+
align: "start"
|
|
98
|
+
}, /*#__PURE__*/React.createElement(_command.Command, null, (manual || options.length > 5 && !disableSearch) && /*#__PURE__*/React.createElement(_command.CommandInput, (0, _extends2.default)({
|
|
99
|
+
placeholder: lexicon.filterSearch(filter.label)
|
|
100
|
+
}, manual ? inputProps : null)), /*#__PURE__*/React.createElement(_command.CommandList, null, /*#__PURE__*/React.createElement(_command.CommandEmpty, null, lexicon.filterNotFound), optionGroups.map(({
|
|
101
|
+
heading,
|
|
102
|
+
options
|
|
103
|
+
}, index) => /*#__PURE__*/React.createElement(_command.CommandGroup, {
|
|
104
|
+
key: index,
|
|
105
|
+
heading: heading
|
|
106
|
+
}, options.map(option => {
|
|
107
|
+
const optionValue = option.value;
|
|
108
|
+
const isSelected = value.includes(optionValue);
|
|
109
|
+
const {
|
|
110
|
+
icon
|
|
111
|
+
} = option.config || {};
|
|
112
|
+
return /*#__PURE__*/React.createElement(_command.CommandItem, {
|
|
113
|
+
key: option.value,
|
|
114
|
+
onSelect: () => {
|
|
115
|
+
const selectedValues = new Set(value);
|
|
116
|
+
if (isSelected) {
|
|
117
|
+
selectedValues.delete(optionValue);
|
|
118
|
+
} else {
|
|
119
|
+
if (!filter.multiple) {
|
|
120
|
+
selectedValues.clear();
|
|
121
|
+
}
|
|
122
|
+
selectedValues.add(optionValue);
|
|
123
|
+
}
|
|
124
|
+
column.setFilterValue(Array.from(selectedValues));
|
|
125
|
+
}
|
|
126
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
127
|
+
className: (0, _clsx.default)(classes.checkbox, isSelected && classes.selected)
|
|
128
|
+
}, /*#__PURE__*/React.createElement(_svgIcon.SvgThemeIcon, {
|
|
129
|
+
icon: "check",
|
|
130
|
+
"aria-hidden": "true"
|
|
131
|
+
})), !(0, _isEmpty.isEmptyString)(icon) && /*#__PURE__*/React.createElement(_svgIcon.SvgThemeIcon, {
|
|
132
|
+
icon: icon,
|
|
133
|
+
className: classes.icon,
|
|
134
|
+
"aria-hidden": "true"
|
|
135
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
136
|
+
className: classes.label
|
|
137
|
+
}, option.label));
|
|
138
|
+
}))), value.length > 0 && /*#__PURE__*/React.createElement(_command.CommandGroup, {
|
|
139
|
+
forceMount: true
|
|
140
|
+
}, /*#__PURE__*/React.createElement(_command.CommandSeparator, null), /*#__PURE__*/React.createElement(_command.CommandItem, {
|
|
141
|
+
onSelect: () => {
|
|
142
|
+
column.setFilterValue(undefined);
|
|
143
|
+
}
|
|
144
|
+
}, lexicon.filterClear))))));
|
|
145
|
+
};
|
|
146
|
+
FilterOptionType.displayName = "FilterOptionType";
|
|
147
|
+
const optionFilterAdapter = filter => {
|
|
148
|
+
return /*#__PURE__*/React.createElement(FilterOptionType, {
|
|
149
|
+
filter: filter
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
exports.optionFilterAdapter = optionFilterAdapter;
|