@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,155 @@
1
+ "use strict";
2
+ "use client";
3
+
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ exports.__esModule = true;
6
+ exports.useLexicon = void 0;
7
+ var React = _interopRequireWildcard(require("react"));
8
+ var _app = require("@tint-ui/app");
9
+ const defaultLexicon = {
10
+ filterClear: "Clear filter",
11
+ filterSelected: "{{ selected }} selected",
12
+ filterNotFound: "Filter options not found",
13
+ filterReset: "Reset filter",
14
+ view: "View",
15
+ viewOptions: "Options",
16
+ viewColumn: "Toggle columns",
17
+ viewSortBy: "Sort By",
18
+ viewFilter: "Filters",
19
+ viewFilterText: "Search...",
20
+ pageFirst: "Go to first page",
21
+ pageLast: "Go to last page",
22
+ pagePrevious: "Go to previous page",
23
+ pageNext: "Go to next page",
24
+ pageOf: "{{ pageNumber }} page of {{ pageCount }}",
25
+ search: "Search...",
26
+ notFound: "Empty data",
27
+ notFoundFiltered: "Records not found",
28
+ title: "{{ size }} row(s) out of {{ total }}",
29
+ onePageTitle: "{{ size }} row(s)",
30
+ selected: "{{ selected }} of {{ size }} row(s) selected"
31
+ };
32
+ const plainKeyList = ["search", "notFound", "notFoundFiltered", "filterClear", "filterReset", "filterNotFound", "view", "viewOptions", "viewFilterText", "viewFilter", "viewSortBy", "viewColumn", "pageFirst", "pageLast", "pagePrevious", "pageNext"];
33
+ const useLexicon = (customLexicon, replacement) => {
34
+ const app = (0, _app.useApp)();
35
+ const ref = React.useRef(customLexicon);
36
+ const refReplacement = React.useRef(replacement);
37
+ ref.current = customLexicon;
38
+ refReplacement.current = replacement;
39
+ const lexicon = React.useMemo(() => {
40
+ const defaultText = key => {
41
+ const line = app.line(`dataTable.${key}`);
42
+ if (typeof line === "string") {
43
+ return line;
44
+ }
45
+ return defaultLexicon[key];
46
+ };
47
+ const plain = key => {
48
+ const value = ref.current[key];
49
+ if (!value) {
50
+ return defaultText(key);
51
+ }
52
+ return typeof value === "function" ? value() : value;
53
+ };
54
+ const createPlainFn = key => () => {
55
+ return plain(key);
56
+ };
57
+ const replaceFn = (key, replacement) => {
58
+ const value = ref.current[key] || defaultText(key);
59
+ return typeof value === "function" ? value(replacement) : app.replace(value, replacement);
60
+ };
61
+ const lexicon = {
62
+ filterSearch(label) {
63
+ const value = ref.current.filterSearch;
64
+ if (!value) {
65
+ const line = app.line(`dataTable.filterSearch`);
66
+ if (typeof line === "string") {
67
+ return app.replace(line, {
68
+ label
69
+ });
70
+ }
71
+ return label;
72
+ }
73
+ return typeof value === "function" ? value({
74
+ label
75
+ }) : value;
76
+ },
77
+ filterSelected(selected) {
78
+ return replaceFn("filterSelected", {
79
+ selected
80
+ });
81
+ },
82
+ get pageOf() {
83
+ const {
84
+ pageNumber,
85
+ pageCount
86
+ } = refReplacement.current;
87
+ return replaceFn("pageOf", {
88
+ pageNumber,
89
+ pageCount
90
+ });
91
+ },
92
+ get selected() {
93
+ const {
94
+ size,
95
+ selected
96
+ } = refReplacement.current;
97
+ return replaceFn("selected", {
98
+ size,
99
+ selected
100
+ });
101
+ },
102
+ get onePageTitle() {
103
+ const {
104
+ size
105
+ } = refReplacement.current;
106
+ return replaceFn("onePageTitle", {
107
+ size
108
+ });
109
+ },
110
+ get title() {
111
+ const curr = ref.current;
112
+ const {
113
+ size,
114
+ offset,
115
+ pageCount,
116
+ pageNumber,
117
+ total,
118
+ limit
119
+ } = refReplacement.current;
120
+ if (size === total) {
121
+ let value = curr.onePageTitle;
122
+ if (!value && !curr.title) {
123
+ value = defaultText("onePageTitle");
124
+ }
125
+ if (value) {
126
+ const replacement = {
127
+ size
128
+ };
129
+ return typeof value === "function" ? value(replacement) : app.replace(value, replacement);
130
+ }
131
+ }
132
+ const replacement = {
133
+ size,
134
+ offset,
135
+ total,
136
+ limit,
137
+ pageCount,
138
+ pageNumber
139
+ };
140
+ const value = curr.title || defaultText("title");
141
+ return typeof value === "function" ? value(replacement) : app.replace(value, replacement);
142
+ }
143
+ };
144
+
145
+ // define plain getters
146
+ plainKeyList.forEach(key => {
147
+ Object.defineProperty(lexicon, key, {
148
+ get: createPlainFn(key)
149
+ });
150
+ });
151
+ return lexicon;
152
+ }, [app]);
153
+ return lexicon;
154
+ };
155
+ exports.useLexicon = useLexicon;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ "use client";
3
+
4
+ exports.__esModule = true;
5
+ exports.useRowMenu = void 0;
6
+ var _trigger = require("@tint-ui/trigger");
7
+ var _app = require("@tint-ui/app");
8
+ const useRowMenu = info => {
9
+ const app = (0, _app.useApp)();
10
+ const triggerService = (0, _trigger.useTrigger)();
11
+ const data = info.row.original;
12
+ return item => {
13
+ const {
14
+ onClick,
15
+ trigger,
16
+ triggerKey,
17
+ confirmation,
18
+ enabledKey
19
+ } = item;
20
+ const clickHandler = () => {
21
+ if (typeof onClick === "function") {
22
+ onClick(data);
23
+ }
24
+ if (triggerKey) {
25
+ const triggerProp = data[triggerKey];
26
+ if (triggerProp != null) {
27
+ triggerService.emitProp((0, _trigger.createTriggerProp)(triggerProp));
28
+ }
29
+ }
30
+ if (trigger) {
31
+ const {
32
+ name,
33
+ props
34
+ } = (0, _trigger.createTriggerProp)(trigger);
35
+ triggerService.emit(name, "data" in props ? props : Object.assign({}, props, {
36
+ data
37
+ }));
38
+ }
39
+ };
40
+ return {
41
+ disabled: enabledKey ? data[enabledKey] === true : false,
42
+ onClick() {
43
+ if (confirmation) {
44
+ const message = app.replace(confirmation, data);
45
+ if (triggerService.registered("dialog:confirm")) {
46
+ triggerService.emit("dialog:confirm", {
47
+ message,
48
+ confirmHandler: clickHandler
49
+ });
50
+ } else if (window.confirm(message)) {
51
+ clickHandler();
52
+ }
53
+ } else {
54
+ clickHandler();
55
+ }
56
+ }
57
+ };
58
+ };
59
+ };
60
+ exports.useRowMenu = useRowMenu;
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ "use client";
3
+
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ exports.__esModule = true;
6
+ exports.useVisibilityColumn = void 0;
7
+ var React = _interopRequireWildcard(require("react"));
8
+ var _utils = require("./utils");
9
+ var _browserSupport = require("@tint-ui/tools/browser-support");
10
+ const readState = function (name, storage, readStore, cells) {
11
+ let initialData = {};
12
+ if (readStore) {
13
+ const data = (0, _utils.onStore)(name, storage, "visibility", (local, name) => {
14
+ const text = local.getItem(name);
15
+ return text && text.startsWith("{") ? JSON.parse(text) : null;
16
+ });
17
+ if (data != null) {
18
+ initialData = data;
19
+ }
20
+ }
21
+ const data = {};
22
+ cells.forEach(item => {
23
+ if (item.invisible) {
24
+ return;
25
+ }
26
+ if (item.required) {
27
+ data[item.name] = true;
28
+ } else {
29
+ const value = initialData[item.name];
30
+ if (value != null) {
31
+ data[item.name] = value;
32
+ } else {
33
+ data[item.name] = !item.hidden;
34
+ }
35
+ }
36
+ });
37
+ return data;
38
+ };
39
+ const useVisibilityColumn = function (name, cells, options) {
40
+ const {
41
+ storage,
42
+ ssr
43
+ } = options;
44
+ const [columnVisibility, setColumnVisibility] = React.useState(() => readState(name, storage, !ssr, cells));
45
+ const ref = React.useRef({
46
+ name,
47
+ storage,
48
+ update(data, fn) {
49
+ const {
50
+ name,
51
+ storage
52
+ } = ref.current;
53
+ (0, _utils.onStore)(name, storage, "visibility", (local, name) => {
54
+ if (fn) {
55
+ fn(name);
56
+ }
57
+ local.setItem(name, JSON.stringify(data));
58
+ });
59
+ }
60
+ });
61
+ ref.current.name = name;
62
+ ref.current.storage = storage;
63
+ React.useEffect(() => {
64
+ let origin = columnVisibility;
65
+ const data = readState(name, storage, true, cells);
66
+ for (const key in data) {
67
+ if (columnVisibility[key] !== data[key]) {
68
+ origin = data;
69
+ setColumnVisibility(origin);
70
+ break;
71
+ }
72
+ }
73
+ if (!storage || !(0, _browserSupport.isLocalStorage)()) {
74
+ return;
75
+ }
76
+ let storeKey = "";
77
+ ref.current.update(origin, name => {
78
+ storeKey = name;
79
+ });
80
+ if (storeKey.length) {
81
+ const fn = event => {
82
+ if (event.key === storeKey && event.newValue != null) {
83
+ const data = JSON.parse(event.newValue);
84
+ setColumnVisibility(data);
85
+ ref.current.update(data);
86
+ }
87
+ };
88
+ window.addEventListener("storage", fn);
89
+ return () => {
90
+ window.removeEventListener("storage", fn);
91
+ };
92
+ }
93
+ }, [name, storage, ssr, cells]);
94
+ const columnVisibilityHandler = React.useCallback(data => {
95
+ setColumnVisibility(prevState => {
96
+ if (typeof data === "function") {
97
+ data = data(prevState);
98
+ }
99
+ ref.current.update(data);
100
+ return data;
101
+ });
102
+ }, [setColumnVisibility]);
103
+ return [columnVisibility, columnVisibilityHandler];
104
+ };
105
+ exports.useVisibilityColumn = useVisibilityColumn;
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ exports.__esModule = true;
5
+ exports.useVisibilityFilter = void 0;
6
+ var React = _interopRequireWildcard(require("react"));
7
+ var _utils = require("./utils");
8
+ var _browserSupport = require("@tint-ui/tools/browser-support");
9
+ const readState = function (name, storage, readStore, filters, filterText, requiredFilterText) {
10
+ const data = {
11
+ filterText,
12
+ filters: {}
13
+ };
14
+ filters.forEach(filter => {
15
+ data.filters[filter.name] = filter.required || !filter.hidden;
16
+ });
17
+ if (readStore) {
18
+ const localData = (0, _utils.onStore)(name, storage, "filtering", (local, name) => {
19
+ const text = local.getItem(name);
20
+ return text && text.startsWith("{") ? JSON.parse(text) : null;
21
+ });
22
+ if (localData != null) {
23
+ data.filterText = filterText && localData.filterText;
24
+ const latest = localData.filters || {};
25
+ filters.forEach(({
26
+ required,
27
+ name
28
+ }) => {
29
+ const value = latest[name];
30
+ if (!required && typeof value === "boolean") {
31
+ data.filters[name] = value;
32
+ }
33
+ });
34
+ }
35
+ }
36
+ if (filterText && requiredFilterText) {
37
+ data.filterText = true;
38
+ }
39
+ return data;
40
+ };
41
+ const useVisibilityFilter = function (name, filters, filterText, options) {
42
+ const {
43
+ storage,
44
+ ssr,
45
+ requiredFilterText = false
46
+ } = options;
47
+ const [filteringState, setFilteringState] = React.useState(() => readState(name, storage, !ssr, filters, filterText, requiredFilterText));
48
+ const ref = React.useRef(filteringState);
49
+ ref.current = filteringState;
50
+ const refUpdate = React.useRef((data, fn) => {
51
+ (0, _utils.onStore)(name, storage, "filtering", (local, name) => {
52
+ if (fn) {
53
+ fn(name);
54
+ }
55
+ local.setItem(name, JSON.stringify(data));
56
+ });
57
+ });
58
+ React.useEffect(() => {
59
+ const data = readState(name, storage, true, filters, filterText, requiredFilterText);
60
+ const compare = () => {
61
+ for (const name in data.filters) {
62
+ if (data.filters[name] !== filteringState.filters[name]) {
63
+ return false;
64
+ }
65
+ }
66
+ return true;
67
+ };
68
+ if (filteringState.filterText !== data.filterText || !compare()) {
69
+ setFilteringState(data);
70
+ }
71
+ if (!storage || !(0, _browserSupport.isLocalStorage)()) {
72
+ return;
73
+ }
74
+ let storeKey = "";
75
+ refUpdate.current(data, name => {
76
+ storeKey = name;
77
+ });
78
+ if (storeKey.length) {
79
+ const fn = event => {
80
+ if (event.key === storeKey && event.newValue != null) {
81
+ const data = JSON.parse(event.newValue);
82
+ setFilteringState(data);
83
+ refUpdate.current(data);
84
+ }
85
+ };
86
+ window.addEventListener("storage", fn);
87
+ return () => {
88
+ window.removeEventListener("storage", fn);
89
+ };
90
+ }
91
+ }, [name, storage, ssr]);
92
+ const {
93
+ getFilters,
94
+ getVisibleFilters,
95
+ hasFilterVisible,
96
+ onFilterVisibleChange,
97
+ onFilterTextVisibleChange
98
+ } = React.useMemo(() => {
99
+ return {
100
+ getFilters() {
101
+ return filters;
102
+ },
103
+ getVisibleFilters() {
104
+ return filters.filter(item => ref.current.filters[item.name] === true);
105
+ },
106
+ hasFilterVisible(name) {
107
+ return ref.current.filters[name] === true;
108
+ },
109
+ onFilterVisibleChange: (name, visible) => {
110
+ const filter = filters.find(item => item.name === name);
111
+ if (!filter || filter.required || ref.current.filters[name] === visible) {
112
+ return;
113
+ }
114
+ setFilteringState(prev => {
115
+ const state = {
116
+ filterText: prev.filterText,
117
+ filters: Object.assign({}, prev.filters, {
118
+ [name]: visible
119
+ })
120
+ };
121
+ refUpdate.current(state);
122
+ return state;
123
+ });
124
+ },
125
+ onFilterTextVisibleChange: visible => {
126
+ if (!filterText || requiredFilterText || ref.current.filterText === visible) {
127
+ return;
128
+ }
129
+ setFilteringState(prev => {
130
+ const state = {
131
+ filterText: !prev.filterText,
132
+ filters: prev.filters
133
+ };
134
+ refUpdate.current(state);
135
+ return state;
136
+ });
137
+ }
138
+ };
139
+ }, [filters, filterText, requiredFilterText]);
140
+ return {
141
+ filterText: filteringState.filterText,
142
+ getVisibleFilters,
143
+ getFilters,
144
+ hasFilterVisible,
145
+ onFilterVisibleChange,
146
+ onFilterTextVisibleChange
147
+ };
148
+ };
149
+ exports.useVisibilityFilter = useVisibilityFilter;
package/cjs/utils.js ADDED
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.onStore = exports.getToolbarConfig = exports.getPaginationNumber = exports.getNavbarConfig = exports.diffFilterId = void 0;
5
+ var _browserSupport = require("@tint-ui/tools/browser-support");
6
+ const onStore = (name, storage, type, fn) => {
7
+ if (!storage || !(0, _browserSupport.isLocalStorage)()) {
8
+ return null;
9
+ }
10
+ let key = `table:${name}:${type}`;
11
+ if (typeof storage === "string") {
12
+ key += `-${storage}`;
13
+ }
14
+ try {
15
+ return fn(window.localStorage, key);
16
+ } catch (err) {
17
+ console.error("Window storage failure", err);
18
+ }
19
+ return null;
20
+ };
21
+ exports.onStore = onStore;
22
+ const defaultSize = "md";
23
+ const getToolbarConfig = config => {
24
+ const {
25
+ size = defaultSize,
26
+ viewIconOnly = false,
27
+ resetIconOnly = false
28
+ } = config || {};
29
+ return {
30
+ size,
31
+ viewIconOnly,
32
+ resetIconOnly
33
+ };
34
+ };
35
+ exports.getToolbarConfig = getToolbarConfig;
36
+ const getNavbarConfig = (config, defaultPageSize) => {
37
+ const {
38
+ size = defaultSize,
39
+ numberSize = 2,
40
+ pageSize = defaultPageSize,
41
+ pageSizeOptions,
42
+ mode = "arrow"
43
+ } = config || {};
44
+ return {
45
+ size,
46
+ mode,
47
+ pageSize,
48
+ numberSize,
49
+ pageSizeOptions: Array.isArray(pageSizeOptions) && pageSizeOptions.length > 0 ? pageSizeOptions : [pageSize]
50
+ };
51
+ };
52
+ exports.getNavbarConfig = getNavbarConfig;
53
+ const getPaginationNumber = (pageNumber, pageCount, left) => {
54
+ if (pageCount < 2) {
55
+ return [];
56
+ }
57
+ const items = [];
58
+ const dots = left * 2 + 1 < pageCount;
59
+ const push = pg => {
60
+ if (pg === 0) {
61
+ items.push({
62
+ divider: true
63
+ });
64
+ } else {
65
+ items.push({
66
+ divider: false,
67
+ page: pg,
68
+ selected: pg === pageNumber
69
+ });
70
+ }
71
+ };
72
+ let start = pageNumber - left;
73
+ let end = pageNumber + left;
74
+ if (start < 1) {
75
+ start = 1;
76
+ end = left * 2 + 1;
77
+ }
78
+ if (end > pageCount) {
79
+ end = pageCount;
80
+ start = end - left * 2;
81
+ if (start < 1) {
82
+ start = 1;
83
+ }
84
+ }
85
+ if (start > 1) {
86
+ push(1);
87
+ dots && start > 2 && push(0);
88
+ }
89
+ for (let i = start; i <= end; i++) {
90
+ push(i);
91
+ }
92
+ if (end < pageCount) {
93
+ dots && end + 1 < pageCount && push(0);
94
+ push(pageCount);
95
+ }
96
+ return items;
97
+ };
98
+ exports.getPaginationNumber = getPaginationNumber;
99
+ const diffCompare = (a, b) => {
100
+ if (Array.isArray(a)) {
101
+ a = a.join(",");
102
+ }
103
+ if (Array.isArray(b)) {
104
+ b = b.join(",");
105
+ }
106
+ return a === b;
107
+ };
108
+ const diffFilterId = (left, right) => {
109
+ const rightData = {};
110
+ for (const {
111
+ id,
112
+ value
113
+ } of right) {
114
+ rightData[id] = value;
115
+ }
116
+ const leftData = {};
117
+ for (const {
118
+ id,
119
+ value
120
+ } of left) {
121
+ if (leftData[id] == null) {
122
+ return id;
123
+ }
124
+ leftData[id] = value;
125
+ }
126
+ for (const {
127
+ id,
128
+ value
129
+ } of right) {
130
+ if (leftData[id] == null || !diffCompare(leftData[id], value)) {
131
+ return id;
132
+ }
133
+ }
134
+ return "*";
135
+ };
136
+ exports.diffFilterId = diffFilterId;
package/classes.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ declare const classes: {
2
+ dataTable: string;
3
+ table: string;
4
+ cellNotFound: string;
5
+ loader: string;
6
+ error: string;
7
+ booleanCellType: string;
8
+ numberCellType: string;
9
+ iconTrue: string;
10
+ iconFalse: string;
11
+ iconNull: string;
12
+ isNaN: string;
13
+ menuGroup: string;
14
+ menuItemDestructive: string;
15
+ };
16
+ declare const useDataTableClasses: () => {
17
+ dataTable: string;
18
+ table: string;
19
+ cellNotFound: string;
20
+ loader: string;
21
+ error: string;
22
+ booleanCellType: string;
23
+ numberCellType: string;
24
+ iconTrue: string;
25
+ iconFalse: string;
26
+ iconNull: string;
27
+ isNaN: string;
28
+ menuGroup: string;
29
+ menuItemDestructive: string;
30
+ };
31
+ type DataTableClassesType = keyof typeof classes;
32
+ type DataTableClasses = Record<DataTableClassesType, string>;
33
+ export { classes, useDataTableClasses };
34
+ export type { DataTableClassesType, DataTableClasses };
package/classes.js ADDED
@@ -0,0 +1,23 @@
1
+ import { classGroup } from "@tint-ui/tools/class-group";
2
+ import { useClasses } from "@tint-ui/theme";
3
+ const {
4
+ base,
5
+ b
6
+ } = classGroup("data-table");
7
+ const classes = {
8
+ dataTable: base,
9
+ table: b("table"),
10
+ cellNotFound: b("cell", "not-found"),
11
+ loader: b("loader"),
12
+ error: b("error"),
13
+ booleanCellType: b("cell-type", "boolean"),
14
+ numberCellType: b("cell-type", "number"),
15
+ iconTrue: b("icon", "true"),
16
+ iconFalse: b("icon", "false"),
17
+ iconNull: b("icon", "null"),
18
+ isNaN: b("isNaN"),
19
+ menuGroup: b("menu-group"),
20
+ menuItemDestructive: b("menu-item-destructive")
21
+ };
22
+ const useDataTableClasses = () => useClasses("data-table", classes);
23
+ export { classes, useDataTableClasses };
package/context.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { DataTableContextType } from "./types";
2
+ import * as React from "react";
3
+ declare const DataTableContext: React.Context<DataTableContextType<any> | null>;
4
+ declare const useDataTableContext: <TData>() => DataTableContextType<TData>;
5
+ export { DataTableContext, useDataTableContext };
package/context.js ADDED
@@ -0,0 +1,9 @@
1
+ import * as React from "react";
2
+ import { invariant } from "@tint-ui/tools/proof";
3
+ const DataTableContext = /*#__PURE__*/React.createContext(null);
4
+ const useDataTableContext = function () {
5
+ const ctx = React.useContext(DataTableContext);
6
+ invariant(ctx, "DataTableContextType is not defined");
7
+ return ctx;
8
+ };
9
+ export { DataTableContext, useDataTableContext };
@@ -0,0 +1,9 @@
1
+ import * as React from "react";
2
+ declare const DataTableContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableElement> & {
3
+ wrapperProps?: React.HTMLAttributes<HTMLDivElement> | undefined;
4
+ themePropsType?: string | undefined;
5
+ compact?: boolean | undefined;
6
+ } & React.RefAttributes<HTMLTableElement>>;
7
+ type DataTableContentProps = React.ComponentProps<typeof DataTableContent>;
8
+ export { DataTableContent };
9
+ export type { DataTableContentProps };