@snack-uikit/table 0.20.6 → 0.20.7
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/CHANGELOG.md +11 -0
- package/README.md +6 -2
- package/dist/components/Table/Table.js +21 -14
- package/dist/helperComponents/Cells/StatusCell/StatusCell.d.ts +5 -1
- package/dist/helperComponents/Cells/StatusCell/StatusCell.js +3 -2
- package/package.json +2 -2
- package/src/components/Table/Table.tsx +24 -15
- package/src/helperComponents/Cells/StatusCell/StatusCell.tsx +9 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## 0.20.7 (2024-08-02)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **PDS-227:** fix status column ([b906c30](https://github.com/cloud-ru-tech/snack-uikit/commit/b906c30d574a8cec4b70cfc6b309a2443a41a019))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## 0.20.6 (2024-07-31)
|
|
7
18
|
|
|
8
19
|
|
package/README.md
CHANGED
|
@@ -154,9 +154,11 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
154
154
|
|------|------|---------------|-------------|
|
|
155
155
|
| mapStatusToAppearance* | `MapStatusToAppearanceFnType` | - | Маппинг значений статуса на цвета |
|
|
156
156
|
| accessorKey* | `string` | - | Имя ключа соответствующее полю в data |
|
|
157
|
-
| enableSorting | `boolean` |
|
|
157
|
+
| enableSorting | `boolean` | true | Включение/выключение сортировки |
|
|
158
158
|
| renderDescription | `(cellValue: string) => string` | - | Функция для отрисовки текста, если не передана, то будет отрисован только индикатор статуса |
|
|
159
159
|
| size | `number` | - | Размер ячейки |
|
|
160
|
+
| minSize | `number` | - | |
|
|
161
|
+
| maxSize | `number` | - | |
|
|
160
162
|
| header | `ColumnDefTemplate<HeaderContext<TData, unknown>> & (string \| ((ctx: HeaderContext<TData, unknown>) => string))` | - | Заголовок колонки |
|
|
161
163
|
| enableResizing | `boolean` | - | Включение/выключение ресайза колонки |
|
|
162
164
|
## Table.getRowActionsColumnDef
|
|
@@ -224,9 +226,11 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
|
|
|
224
226
|
|------|------|---------------|-------------|
|
|
225
227
|
| mapStatusToAppearance* | `MapStatusToAppearanceFnType` | - | Маппинг значений статуса на цвета |
|
|
226
228
|
| accessorKey* | `string` | - | Имя ключа соответствующее полю в data |
|
|
227
|
-
| enableSorting | `boolean` |
|
|
229
|
+
| enableSorting | `boolean` | true | Включение/выключение сортировки |
|
|
228
230
|
| renderDescription | `(cellValue: string) => string` | - | Функция для отрисовки текста, если не передана, то будет отрисован только индикатор статуса |
|
|
229
231
|
| size | `number` | - | Размер ячейки |
|
|
232
|
+
| minSize | `number` | - | |
|
|
233
|
+
| maxSize | `number` | - | |
|
|
230
234
|
| header | `ColumnDefTemplate<HeaderContext<TData, unknown>> & (string \| ((ctx: HeaderContext<TData, unknown>) => string))` | - | Заголовок колонки |
|
|
231
235
|
| enableResizing | `boolean` | - | Включение/выключение ресайза колонки |
|
|
232
236
|
## exportToCSV
|
|
@@ -143,22 +143,29 @@ export function Table(_a) {
|
|
|
143
143
|
const header = headers[i];
|
|
144
144
|
const { sizeKey, flexKey } = getColumnStyleVars(header.id);
|
|
145
145
|
const originalColDef = originalColumnDefs.find(col => getColumnId(header) === col.id);
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
146
|
+
if (header.id === 'snack_predefined_statusColumn' && !(originalColDef === null || originalColDef === void 0 ? void 0 : originalColDef.header) && !(originalColDef === null || originalColDef === void 0 ? void 0 : originalColDef.enableSorting)) {
|
|
147
|
+
const indicatorSize = 'var(--size-table-cell-status-indicator-horizontal)';
|
|
148
|
+
colSizes[sizeKey] = indicatorSize;
|
|
149
|
+
colSizes[flexKey] = '100%';
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
const originalColumnDefSize = originalColDef === null || originalColDef === void 0 ? void 0 : originalColDef.size;
|
|
153
|
+
const initSize = originalColumnDefSize ? `${originalColumnDefSize}px` : '100%';
|
|
154
|
+
const prevSize = (_a = columnSizeVarsRef.current) === null || _a === void 0 ? void 0 : _a[sizeKey];
|
|
155
|
+
let size = initSize;
|
|
156
|
+
if (header.column.getCanResize()) {
|
|
157
|
+
const currentSize = header.getSize();
|
|
158
|
+
const colDefSize = header.column.columnDef.size;
|
|
159
|
+
size = currentSize === colDefSize ? initSize : `${currentSize}px`;
|
|
160
|
+
if (prevSize === '100%' && currentSize !== colDefSize) {
|
|
161
|
+
const realSize = getCurrentlyConfiguredHeaderWidth(header.id);
|
|
162
|
+
table.setColumnSizing(old => (Object.assign(Object.assign({}, old), { [header.id]: realSize })));
|
|
163
|
+
size = `${realSize}px`;
|
|
164
|
+
}
|
|
158
165
|
}
|
|
166
|
+
colSizes[sizeKey] = size;
|
|
167
|
+
colSizes[flexKey] = size === '100%' ? 'unset' : '0';
|
|
159
168
|
}
|
|
160
|
-
colSizes[sizeKey] = size;
|
|
161
|
-
colSizes[flexKey] = size === '100%' ? 'unset' : '0';
|
|
162
169
|
}
|
|
163
170
|
return colSizes;
|
|
164
171
|
/*
|
|
@@ -15,6 +15,8 @@ type BaseStatusColumnDef = {
|
|
|
15
15
|
type StatusColumnDef = BaseStatusColumnDef & {
|
|
16
16
|
renderDescription?: never;
|
|
17
17
|
size?: never;
|
|
18
|
+
minSize?: never;
|
|
19
|
+
maxSize?: never;
|
|
18
20
|
header?: never;
|
|
19
21
|
enableResizing?: never;
|
|
20
22
|
};
|
|
@@ -23,6 +25,8 @@ type StatusColumnDefWithDescription<TData> = BaseStatusColumnDef & {
|
|
|
23
25
|
renderDescription(cellValue: string): string;
|
|
24
26
|
/** Размер ячейки */
|
|
25
27
|
size: number;
|
|
28
|
+
minSize?: number;
|
|
29
|
+
maxSize?: number;
|
|
26
30
|
/** Заголовок колонки */
|
|
27
31
|
header?: ColumnDefinition<TData>['header'];
|
|
28
32
|
/** Включение/выключение ресайза колонки */
|
|
@@ -30,4 +34,4 @@ type StatusColumnDefWithDescription<TData> = BaseStatusColumnDef & {
|
|
|
30
34
|
};
|
|
31
35
|
export type StatusColumnDefinitionProps<TData> = StatusColumnDef | StatusColumnDefWithDescription<TData>;
|
|
32
36
|
/** Вспомогательная функция для создания ячейки со статусом */
|
|
33
|
-
export declare function getStatusColumnDef<TData>({ header, accessorKey, mapStatusToAppearance, renderDescription, size, enableSorting, enableResizing, }: StatusColumnDefinitionProps<TData>): ColumnDefinition<TData>;
|
|
37
|
+
export declare function getStatusColumnDef<TData>({ header, accessorKey, mapStatusToAppearance, renderDescription, size, maxSize, minSize, enableSorting, enableResizing, }: StatusColumnDefinitionProps<TData>): ColumnDefinition<TData>;
|
|
@@ -10,7 +10,7 @@ function StatusCell({ appearance, label }) {
|
|
|
10
10
|
return (_jsxs("div", { className: styles.statusCell, "data-no-label": !label || undefined, children: [_jsx("div", { "data-appearance": isLoading ? undefined : appearance, className: styles.statusCellIndicator, "data-loading": isLoading || undefined, "data-test-id": TEST_IDS.statusIndicator }), label && (_jsx("div", { className: styles.statusCellLabel, "data-test-id": TEST_IDS.statusLabel, children: _jsx(Typography.LightLabelS, { children: _jsx(TruncateString, { text: label }) }) }))] }));
|
|
11
11
|
}
|
|
12
12
|
/** Вспомогательная функция для создания ячейки со статусом */
|
|
13
|
-
export function getStatusColumnDef({ header, accessorKey, mapStatusToAppearance, renderDescription, size, enableSorting, enableResizing, }) {
|
|
13
|
+
export function getStatusColumnDef({ header, accessorKey, mapStatusToAppearance, renderDescription, size, maxSize, minSize, enableSorting = true, enableResizing, }) {
|
|
14
14
|
const hasDescription = Boolean(renderDescription);
|
|
15
15
|
return {
|
|
16
16
|
id: 'snack_predefined_statusColumn',
|
|
@@ -19,7 +19,8 @@ export function getStatusColumnDef({ header, accessorKey, mapStatusToAppearance,
|
|
|
19
19
|
noHeaderCellPadding: !hasDescription,
|
|
20
20
|
noHeaderCellBorderOffset: hasDescription,
|
|
21
21
|
size: hasDescription ? size : MIN_STATUS_CELL_SIZE,
|
|
22
|
-
minSize: MIN_STATUS_CELL_SIZE,
|
|
22
|
+
minSize: enableSorting || hasDescription ? Math.max(MIN_STATUS_CELL_SIZE, minSize || 0) : 1,
|
|
23
|
+
maxSize: maxSize,
|
|
23
24
|
meta: {
|
|
24
25
|
skipOnExport: true,
|
|
25
26
|
},
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Table",
|
|
7
|
-
"version": "0.20.
|
|
7
|
+
"version": "0.20.7",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"@snack-uikit/locale": "*"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "f60fb892054936167d2744544ceed8ae0c988d67"
|
|
61
61
|
}
|
|
@@ -225,29 +225,38 @@ export function Table<TData extends object>({
|
|
|
225
225
|
for (let i = 0; i < headers.length; i++) {
|
|
226
226
|
const header = headers[i];
|
|
227
227
|
const { sizeKey, flexKey } = getColumnStyleVars(header.id);
|
|
228
|
+
|
|
228
229
|
const originalColDef = originalColumnDefs.find(col => getColumnId(header) === col.id);
|
|
229
|
-
const originalColumnDefSize = originalColDef?.size;
|
|
230
|
-
const initSize = originalColumnDefSize ? `${originalColumnDefSize}px` : '100%';
|
|
231
|
-
const prevSize = columnSizeVarsRef.current?.[sizeKey];
|
|
232
230
|
|
|
233
|
-
|
|
231
|
+
if (header.id === 'snack_predefined_statusColumn' && !originalColDef?.header && !originalColDef?.enableSorting) {
|
|
232
|
+
const indicatorSize = 'var(--size-table-cell-status-indicator-horizontal)';
|
|
233
|
+
|
|
234
|
+
colSizes[sizeKey] = indicatorSize;
|
|
235
|
+
colSizes[flexKey] = '100%';
|
|
236
|
+
} else {
|
|
237
|
+
const originalColumnDefSize = originalColDef?.size;
|
|
238
|
+
const initSize = originalColumnDefSize ? `${originalColumnDefSize}px` : '100%';
|
|
239
|
+
const prevSize = columnSizeVarsRef.current?.[sizeKey];
|
|
240
|
+
|
|
241
|
+
let size = initSize;
|
|
234
242
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
243
|
+
if (header.column.getCanResize()) {
|
|
244
|
+
const currentSize = header.getSize();
|
|
245
|
+
const colDefSize = header.column.columnDef.size;
|
|
238
246
|
|
|
239
|
-
|
|
247
|
+
size = currentSize === colDefSize ? initSize : `${currentSize}px`;
|
|
240
248
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
249
|
+
if (prevSize === '100%' && currentSize !== colDefSize) {
|
|
250
|
+
const realSize = getCurrentlyConfiguredHeaderWidth(header.id);
|
|
251
|
+
table.setColumnSizing(old => ({ ...old, [header.id]: realSize }));
|
|
244
252
|
|
|
245
|
-
|
|
253
|
+
size = `${realSize}px`;
|
|
254
|
+
}
|
|
246
255
|
}
|
|
247
|
-
}
|
|
248
256
|
|
|
249
|
-
|
|
250
|
-
|
|
257
|
+
colSizes[sizeKey] = size;
|
|
258
|
+
colSizes[flexKey] = size === '100%' ? 'unset' : '0';
|
|
259
|
+
}
|
|
251
260
|
}
|
|
252
261
|
|
|
253
262
|
return colSizes;
|
|
@@ -30,6 +30,8 @@ type BaseStatusColumnDef = {
|
|
|
30
30
|
type StatusColumnDef = BaseStatusColumnDef & {
|
|
31
31
|
renderDescription?: never;
|
|
32
32
|
size?: never;
|
|
33
|
+
minSize?: never;
|
|
34
|
+
maxSize?: never;
|
|
33
35
|
header?: never;
|
|
34
36
|
enableResizing?: never;
|
|
35
37
|
};
|
|
@@ -39,6 +41,8 @@ type StatusColumnDefWithDescription<TData> = BaseStatusColumnDef & {
|
|
|
39
41
|
renderDescription(cellValue: string): string;
|
|
40
42
|
/** Размер ячейки */
|
|
41
43
|
size: number;
|
|
44
|
+
minSize?: number;
|
|
45
|
+
maxSize?: number;
|
|
42
46
|
/** Заголовок колонки */
|
|
43
47
|
header?: ColumnDefinition<TData>['header'];
|
|
44
48
|
/** Включение/выключение ресайза колонки */
|
|
@@ -77,7 +81,9 @@ export function getStatusColumnDef<TData>({
|
|
|
77
81
|
mapStatusToAppearance,
|
|
78
82
|
renderDescription,
|
|
79
83
|
size,
|
|
80
|
-
|
|
84
|
+
maxSize,
|
|
85
|
+
minSize,
|
|
86
|
+
enableSorting = true,
|
|
81
87
|
enableResizing,
|
|
82
88
|
}: StatusColumnDefinitionProps<TData>): ColumnDefinition<TData> {
|
|
83
89
|
const hasDescription = Boolean(renderDescription);
|
|
@@ -89,7 +95,8 @@ export function getStatusColumnDef<TData>({
|
|
|
89
95
|
noHeaderCellPadding: !hasDescription,
|
|
90
96
|
noHeaderCellBorderOffset: hasDescription,
|
|
91
97
|
size: hasDescription ? (size as number) : MIN_STATUS_CELL_SIZE,
|
|
92
|
-
minSize: MIN_STATUS_CELL_SIZE,
|
|
98
|
+
minSize: enableSorting || hasDescription ? Math.max(MIN_STATUS_CELL_SIZE, minSize || 0) : 1,
|
|
99
|
+
maxSize: maxSize,
|
|
93
100
|
meta: {
|
|
94
101
|
skipOnExport: true,
|
|
95
102
|
},
|