@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,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,10 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.adapters = void 0;
5
+ var _option = require("./option");
6
+ const adapters = exports.adapters = {
7
+ option: {
8
+ adapter: _option.optionFilterAdapter
9
+ }
10
+ };
@@ -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;