@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,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.numberFormat = numberFormat;
|
|
5
|
+
const nobrSpace = "\xa0";
|
|
6
|
+
const ditSign = ".";
|
|
7
|
+
function numberFormat(value, decimal = 2, decimalRequired = false) {
|
|
8
|
+
let number = String(value);
|
|
9
|
+
const ended = number.indexOf(".");
|
|
10
|
+
let end = "";
|
|
11
|
+
if (ended !== -1) {
|
|
12
|
+
end = number.substring(ended + 1);
|
|
13
|
+
if (end.length > decimal) {
|
|
14
|
+
if (decimal > 0) {
|
|
15
|
+
const endNum = parseInt(end.substring(0, decimal));
|
|
16
|
+
end = endNum === 0 ? "" : String(endNum);
|
|
17
|
+
} else {
|
|
18
|
+
end = "";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (end.length) {
|
|
22
|
+
end = ditSign + end;
|
|
23
|
+
}
|
|
24
|
+
number = number.substring(0, ended);
|
|
25
|
+
}
|
|
26
|
+
if (decimalRequired && decimal > 0) {
|
|
27
|
+
if (!end) {
|
|
28
|
+
end = ".";
|
|
29
|
+
}
|
|
30
|
+
const delta = end.length - 1;
|
|
31
|
+
if (delta > 0 && delta < decimal) {
|
|
32
|
+
end += "0".repeat(delta);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
let len = number.length;
|
|
36
|
+
if (len < 4) {
|
|
37
|
+
return number + end;
|
|
38
|
+
}
|
|
39
|
+
let ceil = "";
|
|
40
|
+
while (len > 3) {
|
|
41
|
+
len -= 3;
|
|
42
|
+
ceil = nobrSpace + number.substring(len) + ceil;
|
|
43
|
+
number = number.substring(0, len);
|
|
44
|
+
}
|
|
45
|
+
return number + ceil + end;
|
|
46
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
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.numberAdapterOptions = exports.numberAdapter = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
var React = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _numberFormat = require("./number-format");
|
|
11
|
+
var _classes = require("../classes");
|
|
12
|
+
const NumberType = props => {
|
|
13
|
+
const {
|
|
14
|
+
value,
|
|
15
|
+
format,
|
|
16
|
+
prefix,
|
|
17
|
+
suffix,
|
|
18
|
+
decimal = 2,
|
|
19
|
+
decimalRequired = false
|
|
20
|
+
} = props;
|
|
21
|
+
const numberValue = typeof value === "number" ? value : parseFloat(String(value));
|
|
22
|
+
const numberIsNaN = !Number.isFinite(numberValue);
|
|
23
|
+
let node;
|
|
24
|
+
if (numberIsNaN) {
|
|
25
|
+
node = Number.isNaN(numberValue) ? "NaN" : "Infinite";
|
|
26
|
+
} else {
|
|
27
|
+
if (format) {
|
|
28
|
+
node = (0, _numberFormat.numberFormat)(numberValue, decimal, decimalRequired);
|
|
29
|
+
} else {
|
|
30
|
+
node = String(numberValue);
|
|
31
|
+
}
|
|
32
|
+
if (prefix) {
|
|
33
|
+
node = prefix + node;
|
|
34
|
+
}
|
|
35
|
+
if (suffix) {
|
|
36
|
+
node += suffix;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const classes = (0, _classes.useDataTableClasses)();
|
|
40
|
+
return /*#__PURE__*/React.createElement("span", {
|
|
41
|
+
className: classes.numberCellType + (numberIsNaN ? ` ${classes.isNaN}` : "")
|
|
42
|
+
}, node);
|
|
43
|
+
};
|
|
44
|
+
NumberType.displayName = "NumberType";
|
|
45
|
+
const numberAdapter = (value, cell) => {
|
|
46
|
+
return /*#__PURE__*/React.createElement(NumberType, (0, _extends2.default)({
|
|
47
|
+
value: value
|
|
48
|
+
}, cell.config));
|
|
49
|
+
};
|
|
50
|
+
exports.numberAdapter = numberAdapter;
|
|
51
|
+
const numberAdapterOptions = exports.numberAdapterOptions = {
|
|
52
|
+
nullable() {
|
|
53
|
+
return "";
|
|
54
|
+
},
|
|
55
|
+
align: "end"
|
|
56
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.textAdapterOptions = exports.textAdapter = void 0;
|
|
5
|
+
const textAdapter = value => {
|
|
6
|
+
return String(value);
|
|
7
|
+
};
|
|
8
|
+
exports.textAdapter = textAdapter;
|
|
9
|
+
const textAdapterOptions = exports.textAdapterOptions = {
|
|
10
|
+
nullable() {
|
|
11
|
+
return "";
|
|
12
|
+
}
|
|
13
|
+
};
|
|
@@ -0,0 +1,312 @@
|
|
|
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.renderDataTableCell = exports.hasCellAdapter = exports.addCellAdapterAsync = exports.addCellAdapter = exports.DataTableHead = exports.DataTableCell = 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 _reactTable = require("@tanstack/react-table");
|
|
12
|
+
var _table = require("@tint-ui/table");
|
|
13
|
+
var _proof = require("@tint-ui/tools/proof");
|
|
14
|
+
var _errorMessage = require("@tint-ui/tools/error-message");
|
|
15
|
+
var _adapters = require("./adapters");
|
|
16
|
+
var _classes = require("./classes");
|
|
17
|
+
var _context = require("./context");
|
|
18
|
+
const _excluded = ["cell", "withWidth", "style"],
|
|
19
|
+
_excluded2 = ["header", "withWidth", "children", "style"];
|
|
20
|
+
const adapters = new Map();
|
|
21
|
+
const defaultAdapters = new Map();
|
|
22
|
+
Object.entries(_adapters.adapters).forEach(([name, {
|
|
23
|
+
adapter,
|
|
24
|
+
options
|
|
25
|
+
}]) => {
|
|
26
|
+
defaultAdapters.set(name, {
|
|
27
|
+
adapter,
|
|
28
|
+
options
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
const getAdapt = type => {
|
|
32
|
+
const adapter = adapters.get(type) || defaultAdapters.get(type);
|
|
33
|
+
if (!adapter) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return adapter;
|
|
37
|
+
};
|
|
38
|
+
const privateTypes = [];
|
|
39
|
+
const checkAdapt = type => {
|
|
40
|
+
if (!type) {
|
|
41
|
+
throw new Error(`Adapter type is empty`);
|
|
42
|
+
}
|
|
43
|
+
if (privateTypes.includes(type)) {
|
|
44
|
+
throw new Error(`The ${type} type is private`);
|
|
45
|
+
}
|
|
46
|
+
if (adapters.has(type)) {
|
|
47
|
+
throw new Error(`The ${type} form adapter already exists`);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const hasCellAdapter = type => adapters.has(type);
|
|
51
|
+
exports.hasCellAdapter = hasCellAdapter;
|
|
52
|
+
const addCellAdapter = function (name, adapter, options = {}) {
|
|
53
|
+
checkAdapt(name);
|
|
54
|
+
adapters.set(name, {
|
|
55
|
+
adapter,
|
|
56
|
+
options
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
exports.addCellAdapter = addCellAdapter;
|
|
60
|
+
const addCellAdapterAsync = function (name, handler, options = {}) {
|
|
61
|
+
checkAdapt(name);
|
|
62
|
+
adapters.set(name, {
|
|
63
|
+
adapter: createAsyncAdapterCallback(name, handler, options),
|
|
64
|
+
options
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
exports.addCellAdapterAsync = addCellAdapterAsync;
|
|
68
|
+
const getAsyncAdapter = function (type, result) {
|
|
69
|
+
const adapter = result?.default;
|
|
70
|
+
(0, _proof.invariant)(typeof adapter === "function", `Async ${type} adapter failure: default is not function`);
|
|
71
|
+
return adapter;
|
|
72
|
+
};
|
|
73
|
+
const createAsyncAdapterCallback = function (type, handler, options) {
|
|
74
|
+
const adapt = {
|
|
75
|
+
waiters: new Set(),
|
|
76
|
+
handler,
|
|
77
|
+
error: null,
|
|
78
|
+
options
|
|
79
|
+
};
|
|
80
|
+
const adapter = (value, cell, data) => {
|
|
81
|
+
return /*#__PURE__*/React.createElement(DataTableCellAdapterAsync, {
|
|
82
|
+
adapt: adapt,
|
|
83
|
+
type: type,
|
|
84
|
+
value: value,
|
|
85
|
+
cell: cell,
|
|
86
|
+
data: data
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
adapt.adapter = adapter;
|
|
90
|
+
return adapter;
|
|
91
|
+
};
|
|
92
|
+
const createAsyncPromise = async (type, adapt) => {
|
|
93
|
+
try {
|
|
94
|
+
const result = await adapt.handler();
|
|
95
|
+
const adapter = getAsyncAdapter(type, result);
|
|
96
|
+
adapt.error = null;
|
|
97
|
+
adapt.adapter = adapter;
|
|
98
|
+
adapters.set(type, {
|
|
99
|
+
adapter,
|
|
100
|
+
options: adapt.options
|
|
101
|
+
});
|
|
102
|
+
} catch (err) {
|
|
103
|
+
adapt.error = (0, _errorMessage.errorMessage)(err).message;
|
|
104
|
+
}
|
|
105
|
+
let event;
|
|
106
|
+
if (adapt.error != null) {
|
|
107
|
+
event = {
|
|
108
|
+
error: adapt.error
|
|
109
|
+
};
|
|
110
|
+
} else if (adapt.adapter) {
|
|
111
|
+
event = {
|
|
112
|
+
adapter: adapt.adapter
|
|
113
|
+
};
|
|
114
|
+
} else {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const handlers = Array.from(adapt.waiters.values());
|
|
118
|
+
adapt.waiters.clear();
|
|
119
|
+
handlers.forEach(handler => {
|
|
120
|
+
handler(event);
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
const DataTableCellAdapterAsync = props => {
|
|
124
|
+
const classes = (0, _classes.useDataTableClasses)();
|
|
125
|
+
const {
|
|
126
|
+
adapt,
|
|
127
|
+
cell,
|
|
128
|
+
value,
|
|
129
|
+
data,
|
|
130
|
+
type
|
|
131
|
+
} = props;
|
|
132
|
+
const [state, setState] = React.useState(() => {
|
|
133
|
+
return adapt.adapter ? {
|
|
134
|
+
adapter: adapt.adapter
|
|
135
|
+
} : adapt.error != null ? {
|
|
136
|
+
error: adapt.error
|
|
137
|
+
} : null;
|
|
138
|
+
});
|
|
139
|
+
React.useEffect(() => {
|
|
140
|
+
const {
|
|
141
|
+
adapter,
|
|
142
|
+
error,
|
|
143
|
+
promise
|
|
144
|
+
} = adapt;
|
|
145
|
+
if (error != null || adapter != null) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (promise == null) {
|
|
149
|
+
adapt.promise = createAsyncPromise(type, adapt);
|
|
150
|
+
}
|
|
151
|
+
adapt.waiters.add(setState);
|
|
152
|
+
return () => {
|
|
153
|
+
adapt.waiters.delete(setState);
|
|
154
|
+
};
|
|
155
|
+
}, [type, adapt]);
|
|
156
|
+
if (state == null) {
|
|
157
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
158
|
+
className: classes.loader
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if ("error" in state) {
|
|
162
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
163
|
+
className: classes.error
|
|
164
|
+
}, state.error);
|
|
165
|
+
}
|
|
166
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, state.adapter(value, cell, data));
|
|
167
|
+
};
|
|
168
|
+
DataTableCellAdapterAsync.displayName = "DataTableCellAdapterAsync";
|
|
169
|
+
const renderDataTableCell = function (value, cell, data) {
|
|
170
|
+
const {
|
|
171
|
+
type = "text"
|
|
172
|
+
} = cell;
|
|
173
|
+
const adapt = getAdapt(type);
|
|
174
|
+
if (!adapt) {
|
|
175
|
+
(0, _proof.warningOnce)(`table-cell:${type}`, false, `The ${type} cell type not found`);
|
|
176
|
+
switch (typeof value) {
|
|
177
|
+
case "string":
|
|
178
|
+
case "number":
|
|
179
|
+
case "boolean":
|
|
180
|
+
return String(value);
|
|
181
|
+
}
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
const {
|
|
185
|
+
adapter
|
|
186
|
+
} = adapt;
|
|
187
|
+
if (value != null) {
|
|
188
|
+
return adapter(value, cell, data);
|
|
189
|
+
}
|
|
190
|
+
const {
|
|
191
|
+
options: {
|
|
192
|
+
nullable
|
|
193
|
+
}
|
|
194
|
+
} = adapt;
|
|
195
|
+
if (nullable) {
|
|
196
|
+
return nullable(cell, data);
|
|
197
|
+
}
|
|
198
|
+
return null;
|
|
199
|
+
};
|
|
200
|
+
exports.renderDataTableCell = renderDataTableCell;
|
|
201
|
+
const DataTableCell = exports.DataTableCell = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
202
|
+
let {
|
|
203
|
+
cell: tableCell,
|
|
204
|
+
withWidth,
|
|
205
|
+
style
|
|
206
|
+
} = _ref,
|
|
207
|
+
props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
|
|
208
|
+
const colDef = tableCell.column.columnDef;
|
|
209
|
+
const cell = colDef.meta?._cell;
|
|
210
|
+
const minProps = Object.assign({}, props, {
|
|
211
|
+
style,
|
|
212
|
+
ref,
|
|
213
|
+
"data-cell-id": tableCell.id
|
|
214
|
+
});
|
|
215
|
+
if (!cell) {
|
|
216
|
+
if (withWidth && String(tableCell.column.id).startsWith("__#")) {
|
|
217
|
+
minProps.style = Object.assign({}, style, {
|
|
218
|
+
width: "1%"
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
return /*#__PURE__*/React.createElement(_table.TableCell, minProps);
|
|
222
|
+
}
|
|
223
|
+
const {
|
|
224
|
+
name,
|
|
225
|
+
type = "text"
|
|
226
|
+
} = cell;
|
|
227
|
+
const adapt = getAdapt(type);
|
|
228
|
+
if (!adapt) {
|
|
229
|
+
return /*#__PURE__*/React.createElement(_table.TableCell, (0, _extends2.default)({}, minProps, {
|
|
230
|
+
"data-cell-name": name
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
let align = "start";
|
|
234
|
+
const {
|
|
235
|
+
options
|
|
236
|
+
} = adapt;
|
|
237
|
+
if (options.align) {
|
|
238
|
+
align = options.align;
|
|
239
|
+
}
|
|
240
|
+
if (withWidth && options.width) {
|
|
241
|
+
style = Object.assign({}, style, {
|
|
242
|
+
width: options.width
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
return /*#__PURE__*/React.createElement(_table.TableCell, (0, _extends2.default)({}, minProps, {
|
|
246
|
+
style: style,
|
|
247
|
+
align: align,
|
|
248
|
+
"data-cell-name": name,
|
|
249
|
+
"data-cell-type": type
|
|
250
|
+
}));
|
|
251
|
+
});
|
|
252
|
+
DataTableCell.displayName = "DataTableCell";
|
|
253
|
+
const DataTableHead = exports.DataTableHead = /*#__PURE__*/React.forwardRef((_ref2, ref) => {
|
|
254
|
+
let {
|
|
255
|
+
header,
|
|
256
|
+
withWidth,
|
|
257
|
+
style
|
|
258
|
+
} = _ref2,
|
|
259
|
+
props = (0, _objectWithoutPropertiesLoose2.default)(_ref2, _excluded2);
|
|
260
|
+
const table = (0, _context.useDataTableContext)();
|
|
261
|
+
const colDef = header.column.columnDef;
|
|
262
|
+
const cell = colDef.meta?._cell;
|
|
263
|
+
const body = header.isPlaceholder ? null : (0, _reactTable.flexRender)(colDef.header, header.getContext());
|
|
264
|
+
const minProps = Object.assign({}, props, {
|
|
265
|
+
ref,
|
|
266
|
+
style,
|
|
267
|
+
"data-cell-id": header.id
|
|
268
|
+
});
|
|
269
|
+
if (!cell || body == null) {
|
|
270
|
+
if (withWidth && String(header.column.id).startsWith("__#")) {
|
|
271
|
+
minProps.style = Object.assign({}, style, {
|
|
272
|
+
width: "1%"
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
return /*#__PURE__*/React.createElement(_table.TableHead, minProps, body);
|
|
276
|
+
}
|
|
277
|
+
const {
|
|
278
|
+
name,
|
|
279
|
+
type = "text"
|
|
280
|
+
} = cell;
|
|
281
|
+
let node = body;
|
|
282
|
+
let align = "start";
|
|
283
|
+
const adapt = getAdapt(type);
|
|
284
|
+
if (adapt) {
|
|
285
|
+
const {
|
|
286
|
+
options
|
|
287
|
+
} = adapt;
|
|
288
|
+
if (options.align) {
|
|
289
|
+
align = options.align;
|
|
290
|
+
}
|
|
291
|
+
if (withWidth && options.width) {
|
|
292
|
+
style = Object.assign({}, style, {
|
|
293
|
+
width: options.width
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (header.column.getCanSort()) {
|
|
298
|
+
const sorted = header.column.getIsSorted();
|
|
299
|
+
node = /*#__PURE__*/React.createElement(_table.TableButtonSort, {
|
|
300
|
+
disabled: table.loading,
|
|
301
|
+
direction: sorted ? sorted : "none",
|
|
302
|
+
onClick: header.column.getToggleSortingHandler()
|
|
303
|
+
}, node);
|
|
304
|
+
}
|
|
305
|
+
return /*#__PURE__*/React.createElement(_table.TableHead, (0, _extends2.default)({}, minProps, {
|
|
306
|
+
style: style,
|
|
307
|
+
align: align,
|
|
308
|
+
"data-cell-name": name,
|
|
309
|
+
"data-cell-type": type
|
|
310
|
+
}), node);
|
|
311
|
+
});
|
|
312
|
+
DataTableHead.displayName = "DataTableHead";
|
package/cjs/classes.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.useDataTableClasses = exports.classes = void 0;
|
|
5
|
+
var _classGroup = require("@tint-ui/tools/class-group");
|
|
6
|
+
var _theme = require("@tint-ui/theme");
|
|
7
|
+
const {
|
|
8
|
+
base,
|
|
9
|
+
b
|
|
10
|
+
} = (0, _classGroup.classGroup)("data-table");
|
|
11
|
+
const classes = exports.classes = {
|
|
12
|
+
dataTable: base,
|
|
13
|
+
table: b("table"),
|
|
14
|
+
cellNotFound: b("cell", "not-found"),
|
|
15
|
+
loader: b("loader"),
|
|
16
|
+
error: b("error"),
|
|
17
|
+
booleanCellType: b("cell-type", "boolean"),
|
|
18
|
+
numberCellType: b("cell-type", "number"),
|
|
19
|
+
iconTrue: b("icon", "true"),
|
|
20
|
+
iconFalse: b("icon", "false"),
|
|
21
|
+
iconNull: b("icon", "null"),
|
|
22
|
+
isNaN: b("isNaN"),
|
|
23
|
+
menuGroup: b("menu-group"),
|
|
24
|
+
menuItemDestructive: b("menu-item-destructive")
|
|
25
|
+
};
|
|
26
|
+
const useDataTableClasses = () => (0, _theme.useClasses)("data-table", classes);
|
|
27
|
+
exports.useDataTableClasses = useDataTableClasses;
|
package/cjs/context.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.useDataTableContext = exports.DataTableContext = void 0;
|
|
6
|
+
var React = _interopRequireWildcard(require("react"));
|
|
7
|
+
var _proof = require("@tint-ui/tools/proof");
|
|
8
|
+
const DataTableContext = exports.DataTableContext = /*#__PURE__*/React.createContext(null);
|
|
9
|
+
const useDataTableContext = function () {
|
|
10
|
+
const ctx = React.useContext(DataTableContext);
|
|
11
|
+
(0, _proof.invariant)(ctx, "DataTableContextType is not defined");
|
|
12
|
+
return ctx;
|
|
13
|
+
};
|
|
14
|
+
exports.useDataTableContext = useDataTableContext;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.DataTableContent = void 0;
|
|
7
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
8
|
+
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
9
|
+
var React = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _clsx = _interopRequireDefault(require("clsx"));
|
|
11
|
+
var _reactTable = require("@tanstack/react-table");
|
|
12
|
+
var _table = require("@tint-ui/table");
|
|
13
|
+
var _isEmpty = require("@tint-ui/tools/is-empty");
|
|
14
|
+
var _context = require("./context");
|
|
15
|
+
var _cellAdapterType = require("./cell-adapter-type");
|
|
16
|
+
var _classes = require("./classes");
|
|
17
|
+
const _excluded = ["themePropsType", "className", "wrapperProps"];
|
|
18
|
+
const DataTableContent = exports.DataTableContent = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
19
|
+
let {
|
|
20
|
+
themePropsType,
|
|
21
|
+
className,
|
|
22
|
+
wrapperProps = {}
|
|
23
|
+
} = _ref,
|
|
24
|
+
props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
|
|
25
|
+
const context = (0, _context.useDataTableContext)();
|
|
26
|
+
const classes = (0, _classes.useDataTableClasses)();
|
|
27
|
+
const {
|
|
28
|
+
table,
|
|
29
|
+
header: {
|
|
30
|
+
top,
|
|
31
|
+
bottom
|
|
32
|
+
},
|
|
33
|
+
invisible
|
|
34
|
+
} = context;
|
|
35
|
+
const rows = table.getRowModel().rows;
|
|
36
|
+
const widthArea = {
|
|
37
|
+
top: top,
|
|
38
|
+
bottom: bottom && !top,
|
|
39
|
+
cell: !top && !bottom
|
|
40
|
+
};
|
|
41
|
+
let notFound = "";
|
|
42
|
+
if (rows.length === 0) {
|
|
43
|
+
const {
|
|
44
|
+
lexicon
|
|
45
|
+
} = context;
|
|
46
|
+
const state = table.getState();
|
|
47
|
+
if ((0, _isEmpty.isEmpty)(state.globalFilter) && state.columnFilters.length === 0 && state.pagination.pageIndex === 0) {
|
|
48
|
+
notFound = lexicon.notFound;
|
|
49
|
+
} else {
|
|
50
|
+
notFound = lexicon.notFoundFiltered;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return /*#__PURE__*/React.createElement(_table.Table, (0, _extends2.default)({}, props, {
|
|
54
|
+
wrapperProps: Object.assign({}, wrapperProps, {
|
|
55
|
+
className: (0, _clsx.default)(wrapperProps.className, classes.dataTable)
|
|
56
|
+
}),
|
|
57
|
+
className: (0, _clsx.default)(className, classes.table),
|
|
58
|
+
themePropsType: themePropsType,
|
|
59
|
+
ref: ref
|
|
60
|
+
}), top && /*#__PURE__*/React.createElement(_table.TableHeader, {
|
|
61
|
+
themePropsType: themePropsType
|
|
62
|
+
}, table.getHeaderGroups().map(group => /*#__PURE__*/React.createElement(_table.TableRow, {
|
|
63
|
+
key: group.id,
|
|
64
|
+
themePropsType: themePropsType
|
|
65
|
+
}, group.headers.map(header => invisible[header.column.id] ? null : /*#__PURE__*/React.createElement(_cellAdapterType.DataTableHead, {
|
|
66
|
+
key: header.id,
|
|
67
|
+
header: header,
|
|
68
|
+
themePropsType: themePropsType,
|
|
69
|
+
withWidth: widthArea.top
|
|
70
|
+
}))))), /*#__PURE__*/React.createElement(_table.TableBody, {
|
|
71
|
+
themePropsType: themePropsType
|
|
72
|
+
}, rows.length === 0 ? /*#__PURE__*/React.createElement(_table.TableRow, {
|
|
73
|
+
key: "empty",
|
|
74
|
+
themePropsType: themePropsType
|
|
75
|
+
}, /*#__PURE__*/React.createElement(_table.TableCell, {
|
|
76
|
+
colSpan: table.getVisibleLeafColumns().filter(cell => invisible[cell.id] !== true).length,
|
|
77
|
+
className: classes.cellNotFound
|
|
78
|
+
}, notFound)) : rows.map((row, index) => {
|
|
79
|
+
const clickHandler = context.getRowClickHandler(row.original);
|
|
80
|
+
return /*#__PURE__*/React.createElement(_table.TableRow, {
|
|
81
|
+
key: row.id,
|
|
82
|
+
themePropsType: themePropsType,
|
|
83
|
+
onClick: clickHandler,
|
|
84
|
+
"data-click": clickHandler != null
|
|
85
|
+
}, row.getVisibleCells().map(cell => {
|
|
86
|
+
return invisible[cell.column.id] ? null : /*#__PURE__*/React.createElement(_cellAdapterType.DataTableCell, {
|
|
87
|
+
key: cell.id,
|
|
88
|
+
cell: cell,
|
|
89
|
+
themePropsType: themePropsType,
|
|
90
|
+
withWidth: widthArea.cell && index === 0
|
|
91
|
+
}, (0, _reactTable.flexRender)(cell.column.columnDef.cell, cell.getContext()));
|
|
92
|
+
}));
|
|
93
|
+
})), bottom && /*#__PURE__*/React.createElement(_table.TableFooter, {
|
|
94
|
+
themePropsType: themePropsType
|
|
95
|
+
}, table.getHeaderGroups().map(group => /*#__PURE__*/React.createElement(_table.TableRow, {
|
|
96
|
+
key: group.id,
|
|
97
|
+
themePropsType: themePropsType
|
|
98
|
+
}, group.headers.map(header => invisible[header.column.id] ? null : /*#__PURE__*/React.createElement(_cellAdapterType.DataTableHead, {
|
|
99
|
+
key: header.id,
|
|
100
|
+
header: header,
|
|
101
|
+
themePropsType: themePropsType,
|
|
102
|
+
withWidth: widthArea.bottom
|
|
103
|
+
}))))));
|
|
104
|
+
});
|
|
105
|
+
DataTableContent.displayName = "DataTableContent";
|
|
@@ -0,0 +1,38 @@
|
|
|
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.DataTablePagination = 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 _paginationClasses = require("./pagination-classes");
|
|
13
|
+
var _context = require("./context");
|
|
14
|
+
var _paginationSizeOptions = require("./pagination-size-options");
|
|
15
|
+
var _paginationArrow = require("./pagination-arrow");
|
|
16
|
+
var _paginationNumber = require("./pagination-number");
|
|
17
|
+
const _excluded = ["className"];
|
|
18
|
+
const DataTablePagination = exports.DataTablePagination = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
19
|
+
let {
|
|
20
|
+
className
|
|
21
|
+
} = _ref,
|
|
22
|
+
props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
|
|
23
|
+
const classes = (0, _paginationClasses.useDataTablePaginationClasses)();
|
|
24
|
+
const {
|
|
25
|
+
navbar: {
|
|
26
|
+
mode,
|
|
27
|
+
size
|
|
28
|
+
}
|
|
29
|
+
} = (0, _context.useDataTableContext)();
|
|
30
|
+
return /*#__PURE__*/React.createElement("div", (0, _extends2.default)({}, props, {
|
|
31
|
+
"data-navbar-size": size,
|
|
32
|
+
className: (0, _clsx.default)(classes.pagination, className),
|
|
33
|
+
ref: ref
|
|
34
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
35
|
+
className: classes.divider
|
|
36
|
+
}), /*#__PURE__*/React.createElement(_paginationSizeOptions.PaginationSizeOptions, null), mode === "arrow" ? /*#__PURE__*/React.createElement(_paginationArrow.PaginationArrow, null) : /*#__PURE__*/React.createElement(_paginationNumber.PaginationNumber, null));
|
|
37
|
+
});
|
|
38
|
+
DataTablePagination.displayName = "DataTablePagination";
|
|
@@ -0,0 +1,83 @@
|
|
|
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.DataTableTextFilter = 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 _svgIcon = require("@tint-ui/svg-icon");
|
|
12
|
+
var _input = require("@tint-ui/input");
|
|
13
|
+
var _filterClasses = require("./filter-classes");
|
|
14
|
+
var _context = require("./context");
|
|
15
|
+
var _clsx = _interopRequireDefault(require("clsx"));
|
|
16
|
+
const _excluded = ["className", "isMobile"];
|
|
17
|
+
const getFilterText = table => {
|
|
18
|
+
const text = table.getState().globalFilter;
|
|
19
|
+
return typeof text === "string" ? text : "";
|
|
20
|
+
};
|
|
21
|
+
const DataTableTextFilter = exports.DataTableTextFilter = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
22
|
+
let {
|
|
23
|
+
className,
|
|
24
|
+
isMobile = false
|
|
25
|
+
} = _ref,
|
|
26
|
+
props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
|
|
27
|
+
const classes = (0, _filterClasses.useDataTableFilterClasses)();
|
|
28
|
+
const {
|
|
29
|
+
lexicon,
|
|
30
|
+
table,
|
|
31
|
+
toolbar: {
|
|
32
|
+
size
|
|
33
|
+
}
|
|
34
|
+
} = (0, _context.useDataTableContext)();
|
|
35
|
+
const [text, setText] = React.useState(() => getFilterText(table));
|
|
36
|
+
const focusRef = React.useRef(false);
|
|
37
|
+
const {
|
|
38
|
+
resetHandler,
|
|
39
|
+
inputProps
|
|
40
|
+
} = React.useMemo(() => {
|
|
41
|
+
const resetHandler = () => {
|
|
42
|
+
setText(getFilterText(table));
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
resetHandler,
|
|
46
|
+
inputProps: {
|
|
47
|
+
onFocus() {
|
|
48
|
+
focusRef.current = true;
|
|
49
|
+
},
|
|
50
|
+
onBlur() {
|
|
51
|
+
focusRef.current = false;
|
|
52
|
+
resetHandler();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}, [table]);
|
|
57
|
+
const filterText = getFilterText(table);
|
|
58
|
+
React.useEffect(() => {
|
|
59
|
+
if (filterText !== text && !focusRef.current) {
|
|
60
|
+
resetHandler();
|
|
61
|
+
}
|
|
62
|
+
}, [filterText]);
|
|
63
|
+
return /*#__PURE__*/React.createElement(_input.InputGroup, (0, _extends2.default)({}, props, {
|
|
64
|
+
size: size,
|
|
65
|
+
className: (0, _clsx.default)(classes.text, className, isMobile && classes.textMobile),
|
|
66
|
+
ref: ref
|
|
67
|
+
}), /*#__PURE__*/React.createElement(_input.InputAddon, {
|
|
68
|
+
size: size,
|
|
69
|
+
variant: "label"
|
|
70
|
+
}, /*#__PURE__*/React.createElement(_svgIcon.SvgThemeIcon, {
|
|
71
|
+
icon: "search"
|
|
72
|
+
})), /*#__PURE__*/React.createElement(_input.InputText, (0, _extends2.default)({}, inputProps, {
|
|
73
|
+
size: size,
|
|
74
|
+
placeholder: lexicon.search,
|
|
75
|
+
value: text,
|
|
76
|
+
onChange: event => {
|
|
77
|
+
const value = event.target.value;
|
|
78
|
+
setText(value);
|
|
79
|
+
table.setGlobalFilter(value);
|
|
80
|
+
}
|
|
81
|
+
})));
|
|
82
|
+
});
|
|
83
|
+
DataTableTextFilter.displayName = "DataTableTextFilter";
|