@techsio/ui-kit 0.37.0 → 0.38.0
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/dist/molecules/dialog.js +12 -1
- package/dist/organisms/data-table.fields.js +720 -0
- package/dist/organisms/data-table.helpers.js +168 -0
- package/dist/organisms/data-table.js +1736 -0
- package/dist/organisms/table.js +7 -3
- package/dist/src/molecules/dialog.d.ts.map +1 -1
- package/dist/src/molecules/switch.d.ts +3 -3
- package/dist/src/molecules/toast.d.ts +3 -3
- package/dist/src/organisms/data-table.d.ts +357 -0
- package/dist/src/organisms/data-table.d.ts.map +1 -0
- package/dist/src/organisms/data-table.fields.d.ts +119 -0
- package/dist/src/organisms/data-table.fields.d.ts.map +1 -0
- package/dist/src/organisms/data-table.helpers.d.ts +240 -0
- package/dist/src/organisms/data-table.helpers.d.ts.map +1 -0
- package/dist/src/organisms/table.d.ts +15 -7
- package/dist/src/organisms/table.d.ts.map +1 -1
- package/dist/stories/changelog/changelog.stories.d.ts.map +1 -1
- package/dist/stories/organisms/data-table.stories.d.ts +145 -0
- package/dist/stories/organisms/data-table.stories.d.ts.map +1 -0
- package/dist/stories/organisms/table.stories.d.ts +7 -0
- package/dist/stories/organisms/table.stories.d.ts.map +1 -1
- package/package.json +7 -1
- package/src/tokens/components/components.css +1 -0
- package/src/tokens/components/organisms/_data-table.css +51 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { columnFilteringFeature, columnOrderingFeature, columnPinningFeature, columnResizingFeature, columnSizingFeature, columnVisibilityFeature, createExpandedRowModel, createFilteredRowModel, createPaginatedRowModel, createSortedRowModel, filterFn_includesString, globalFilteringFeature, rowExpandingFeature, rowPaginationFeature, rowSelectionFeature, rowSortingFeature, sortFn_alphanumeric, sortFn_datetime, sortFn_text, tableFeatures } from "@tanstack/react-table";
|
|
2
|
+
import { isBlank, matchBetween, typedFilterMatch } from "./data-table.fields.js";
|
|
3
|
+
const FILTER_VARIANT_TYPE = {
|
|
4
|
+
text: "string",
|
|
5
|
+
number: "number",
|
|
6
|
+
range: "number",
|
|
7
|
+
select: "enum"
|
|
8
|
+
};
|
|
9
|
+
function resolveColumnType(meta) {
|
|
10
|
+
return meta?.type ?? (meta?.filterVariant && FILTER_VARIANT_TYPE[meta.filterVariant]) ?? "string";
|
|
11
|
+
}
|
|
12
|
+
function filterValueIsEmpty(value, column) {
|
|
13
|
+
if (null == value) return true;
|
|
14
|
+
if (Array.isArray(value)) return 0 === value.length;
|
|
15
|
+
if ("object" != typeof value) return isBlank(value);
|
|
16
|
+
const v = value;
|
|
17
|
+
if ("empty" === v.operator || "notEmpty" === v.operator) return false;
|
|
18
|
+
if (Array.isArray(v.values)) return 0 === v.values.length;
|
|
19
|
+
if ("boolean" == typeof v.value) return false;
|
|
20
|
+
if (!(isBlank(v.value) && isBlank(v.to) && isBlank(v.from))) return false;
|
|
21
|
+
if (void 0 === v.operator) return true;
|
|
22
|
+
const meta = column?.columnDef?.meta;
|
|
23
|
+
const type = resolveColumnType(meta);
|
|
24
|
+
const defaultOperator = "number" === type || "int" === type || "custom" === type ? "equals" : "contains";
|
|
25
|
+
return v.operator === defaultOperator;
|
|
26
|
+
}
|
|
27
|
+
const typedFilterFn = (row, columnId, filterValue)=>{
|
|
28
|
+
const type = resolveColumnType(row.table.getColumn(columnId)?.columnDef.meta);
|
|
29
|
+
return typedFilterMatch(type, row.getValue(columnId), filterValue);
|
|
30
|
+
};
|
|
31
|
+
typedFilterFn.autoRemove = filterValueIsEmpty;
|
|
32
|
+
function evaluateBetween(num, cellHasNoNumber, value, to) {
|
|
33
|
+
return matchBetween(num, cellHasNoNumber, {
|
|
34
|
+
value: value,
|
|
35
|
+
to: to
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function guardNumericOperator(operator, isNumericColumn, target, cellHasNoNumber) {
|
|
39
|
+
const numericOperator = "gt" === operator || "gte" === operator || "lt" === operator || "lte" === operator || isNumericColumn && ("equals" === operator || "notEquals" === operator);
|
|
40
|
+
if (!numericOperator) return;
|
|
41
|
+
if (Number.isNaN(target)) return true;
|
|
42
|
+
if (cellHasNoNumber) return "notEquals" === operator;
|
|
43
|
+
}
|
|
44
|
+
function evaluateCondition(cellValue, { operator, value, to }, isNumericColumn) {
|
|
45
|
+
if ("empty" === operator) return isBlank(cellValue);
|
|
46
|
+
if ("notEmpty" === operator) return !isBlank(cellValue);
|
|
47
|
+
if (isBlank(value) && "between" !== operator) return true;
|
|
48
|
+
const text = String(cellValue ?? "").toLowerCase();
|
|
49
|
+
const query = String(value ?? "").toLowerCase();
|
|
50
|
+
const num = Number(cellValue);
|
|
51
|
+
const target = Number(value);
|
|
52
|
+
const cellHasNoNumber = isBlank(cellValue) || Number.isNaN(num);
|
|
53
|
+
const numericGuard = guardNumericOperator(operator, isNumericColumn, target, cellHasNoNumber);
|
|
54
|
+
if (void 0 !== numericGuard) return numericGuard;
|
|
55
|
+
switch(operator){
|
|
56
|
+
case "contains":
|
|
57
|
+
return text.includes(query);
|
|
58
|
+
case "notContains":
|
|
59
|
+
return !text.includes(query);
|
|
60
|
+
case "equals":
|
|
61
|
+
return isNumericColumn ? num === target : text === query;
|
|
62
|
+
case "notEquals":
|
|
63
|
+
return isNumericColumn ? num !== target : text !== query;
|
|
64
|
+
case "startsWith":
|
|
65
|
+
return text.startsWith(query);
|
|
66
|
+
case "endsWith":
|
|
67
|
+
return text.endsWith(query);
|
|
68
|
+
case "gt":
|
|
69
|
+
return num > target;
|
|
70
|
+
case "gte":
|
|
71
|
+
return num >= target;
|
|
72
|
+
case "lt":
|
|
73
|
+
return num < target;
|
|
74
|
+
case "lte":
|
|
75
|
+
return num <= target;
|
|
76
|
+
case "between":
|
|
77
|
+
return evaluateBetween(num, cellHasNoNumber, value, to);
|
|
78
|
+
default:
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const conditionalFilterFn = (row, columnId, filterValue)=>{
|
|
83
|
+
if (null == filterValue) return true;
|
|
84
|
+
const type = resolveColumnType(row.table.getColumn(columnId)?.columnDef.meta);
|
|
85
|
+
if (!filterValue.operator) return typedFilterMatch(type, row.getValue(columnId), filterValue);
|
|
86
|
+
return evaluateCondition(row.getValue(columnId), filterValue, "number" === type || "int" === type);
|
|
87
|
+
};
|
|
88
|
+
conditionalFilterFn.autoRemove = filterValueIsEmpty;
|
|
89
|
+
const toCssLength = (value)=>"number" == typeof value ? `${value}px` : value;
|
|
90
|
+
function applyColumnDefaults(columns) {
|
|
91
|
+
return columns.map((column)=>{
|
|
92
|
+
const group = column;
|
|
93
|
+
const next = group.columns ? {
|
|
94
|
+
...column,
|
|
95
|
+
columns: applyColumnDefaults(group.columns)
|
|
96
|
+
} : {
|
|
97
|
+
...column
|
|
98
|
+
};
|
|
99
|
+
if (void 0 === next.filterFn) next.filterFn = "typed";
|
|
100
|
+
const meta = next.meta;
|
|
101
|
+
if ("number" == typeof meta?.width && void 0 === next.size) next.size = meta.width;
|
|
102
|
+
if ("number" == typeof meta?.minWidth && void 0 === next.minSize) next.minSize = meta.minWidth;
|
|
103
|
+
if ("number" == typeof meta?.maxWidth && void 0 === next.maxSize) next.maxSize = meta.maxWidth;
|
|
104
|
+
return next;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function getColumnSizeStyles(column, enableColumnResizing, columnSizing) {
|
|
108
|
+
const meta = column.columnDef.meta;
|
|
109
|
+
const declared = meta?.width;
|
|
110
|
+
const wasResized = true === enableColumnResizing && void 0 !== columnSizing && Object.hasOwn(columnSizing, column.id);
|
|
111
|
+
const fromTanstack = wasResized || "number" == typeof declared;
|
|
112
|
+
return {
|
|
113
|
+
width: toCssLength(fromTanstack ? column.getSize() : declared),
|
|
114
|
+
minWidth: toCssLength(meta?.minWidth),
|
|
115
|
+
maxWidth: toCssLength(meta?.maxWidth)
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
const DATA_TABLE_Z = {
|
|
119
|
+
pinnedCell: 1,
|
|
120
|
+
stickyActionsCell: 2,
|
|
121
|
+
stickyHeaderCell: 10,
|
|
122
|
+
pinnedHeaderCell: 20,
|
|
123
|
+
stickyActionsHeaderCell: 21
|
|
124
|
+
};
|
|
125
|
+
function getPinningStyles(column, kind = "body") {
|
|
126
|
+
const pinned = column.getIsPinned();
|
|
127
|
+
if (!pinned) return {};
|
|
128
|
+
return {
|
|
129
|
+
position: "sticky",
|
|
130
|
+
insetInlineStart: "start" === pinned ? `${column.getStart("start")}px` : void 0,
|
|
131
|
+
insetInlineEnd: "end" === pinned ? `${column.getAfter("end")}px` : void 0,
|
|
132
|
+
zIndex: "header" === kind ? DATA_TABLE_Z.pinnedHeaderCell : DATA_TABLE_Z.pinnedCell
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function isLastStartPinned(column) {
|
|
136
|
+
return "start" === column.getIsPinned() && true === column.getIsLastColumn("start");
|
|
137
|
+
}
|
|
138
|
+
function isFirstEndPinned(column) {
|
|
139
|
+
return "end" === column.getIsPinned() && true === column.getIsFirstColumn("end");
|
|
140
|
+
}
|
|
141
|
+
const dataTableFeatures = tableFeatures({
|
|
142
|
+
columnFilteringFeature: columnFilteringFeature,
|
|
143
|
+
columnOrderingFeature: columnOrderingFeature,
|
|
144
|
+
columnPinningFeature: columnPinningFeature,
|
|
145
|
+
columnResizingFeature: columnResizingFeature,
|
|
146
|
+
columnSizingFeature: columnSizingFeature,
|
|
147
|
+
columnVisibilityFeature: columnVisibilityFeature,
|
|
148
|
+
globalFilteringFeature: globalFilteringFeature,
|
|
149
|
+
rowExpandingFeature: rowExpandingFeature,
|
|
150
|
+
rowPaginationFeature: rowPaginationFeature,
|
|
151
|
+
rowSelectionFeature: rowSelectionFeature,
|
|
152
|
+
rowSortingFeature: rowSortingFeature,
|
|
153
|
+
expandedRowModel: createExpandedRowModel(),
|
|
154
|
+
filteredRowModel: createFilteredRowModel(),
|
|
155
|
+
paginatedRowModel: createPaginatedRowModel(),
|
|
156
|
+
sortedRowModel: createSortedRowModel(),
|
|
157
|
+
filterFns: {
|
|
158
|
+
conditional: conditionalFilterFn,
|
|
159
|
+
includesString: filterFn_includesString,
|
|
160
|
+
typed: typedFilterFn
|
|
161
|
+
},
|
|
162
|
+
sortFns: {
|
|
163
|
+
alphanumeric: sortFn_alphanumeric,
|
|
164
|
+
datetime: sortFn_datetime,
|
|
165
|
+
text: sortFn_text
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
export { DATA_TABLE_Z, applyColumnDefaults, conditionalFilterFn, dataTableFeatures, getColumnSizeStyles, getPinningStyles, isFirstEndPinned, isLastStartPinned, resolveColumnType, typedFilterFn };
|