@shtabapp/ui-kit 1.88.1 → 1.89.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.
Files changed (41) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/components/STable/STable.types.d.ts +2 -3
  3. package/dist/components/STable/STable.types.d.ts.map +1 -1
  4. package/dist/components/STable/STable.vue.d.ts.map +1 -1
  5. package/dist/components/STable/STable.vue_vue_type_script_setup_true_lang.cjs +29 -14
  6. package/dist/components/STable/STable.vue_vue_type_script_setup_true_lang.js +30 -15
  7. package/dist/components/STable/parts/STableContentRow.vue.d.ts.map +1 -1
  8. package/dist/components/STable/parts/STableContentRow.vue_vue_type_script_setup_true_lang.cjs +2 -0
  9. package/dist/components/STable/parts/STableContentRow.vue_vue_type_script_setup_true_lang.js +2 -0
  10. package/dist/components/STable/parts/STableGroupRow.vue.d.ts +2 -0
  11. package/dist/components/STable/parts/STableGroupRow.vue.d.ts.map +1 -1
  12. package/dist/components/STable/parts/STableGroupRow.vue_vue_type_script_setup_true_lang.cjs +16 -6
  13. package/dist/components/STable/parts/STableGroupRow.vue_vue_type_script_setup_true_lang.js +16 -6
  14. package/dist/components/STable/parts/STablePlaceholderRow.vue.d.ts.map +1 -1
  15. package/dist/components/STable/parts/STablePlaceholderRow.vue_vue_type_script_setup_true_lang.cjs +6 -1
  16. package/dist/components/STable/parts/STablePlaceholderRow.vue_vue_type_script_setup_true_lang.js +6 -1
  17. package/dist/components/STable/parts/STableRow.vue.d.ts +2 -0
  18. package/dist/components/STable/parts/STableRow.vue.d.ts.map +1 -1
  19. package/dist/components/STable/parts/STableRow.vue_vue_type_script_setup_true_lang.cjs +19 -9
  20. package/dist/components/STable/parts/STableRow.vue_vue_type_script_setup_true_lang.js +19 -9
  21. package/dist/components/STable/parts/STableSkeletonRow.vue.d.ts +2 -0
  22. package/dist/components/STable/parts/STableSkeletonRow.vue.d.ts.map +1 -1
  23. package/dist/components/STable/parts/STableSkeletonRow.vue_vue_type_script_setup_true_lang.cjs +21 -11
  24. package/dist/components/STable/parts/STableSkeletonRow.vue_vue_type_script_setup_true_lang.js +21 -11
  25. package/dist/components/STable/utils/useTableCellPlans.cjs +38 -7
  26. package/dist/components/STable/utils/useTableCellPlans.d.ts +1 -0
  27. package/dist/components/STable/utils/useTableCellPlans.d.ts.map +1 -1
  28. package/dist/components/STable/utils/useTableCellPlans.js +39 -8
  29. package/dist/components/STable/utils/useTableColumnResize.cjs +2 -2
  30. package/dist/components/STable/utils/useTableColumnResize.d.ts.map +1 -1
  31. package/dist/components/STable/utils/useTableColumnResize.js +2 -2
  32. package/dist/components/STable/utils/useTableColumns.cjs +14 -7
  33. package/dist/components/STable/utils/useTableColumns.d.ts +8 -1
  34. package/dist/components/STable/utils/useTableColumns.d.ts.map +1 -1
  35. package/dist/components/STable/utils/useTableColumns.js +14 -7
  36. package/dist/components/STable/utils/useTableContentWidths.cjs +63 -0
  37. package/dist/components/STable/utils/useTableContentWidths.d.ts +24 -0
  38. package/dist/components/STable/utils/useTableContentWidths.d.ts.map +1 -0
  39. package/dist/components/STable/utils/useTableContentWidths.js +63 -0
  40. package/dist/uikit-components.css +1 -1
  41. package/package.json +1 -1
@@ -52,6 +52,8 @@ export type TSTableCellRenderPlan<TItem extends Record<string, unknown> = Record
52
52
  right?: string;
53
53
  '--s-ui-table-cell-inline-offset'?: string;
54
54
  };
55
+ /** Ячейка тела занимает и место колонки управления колонками (а без правых колонок — филлера). */
56
+ colspan?: number;
55
57
  /** В этой колонке рисуются шеврон дерева и отступ уровня. */
56
58
  chevron: boolean;
57
59
  };
@@ -76,8 +78,13 @@ export interface IUseTableColumnsOptions<TItem extends Record<string, unknown>>
76
78
  columnsDraggable: MaybeRefOrGetter<boolean>;
77
79
  /** Ширина вьюпорта скроллера (content-box, без скроллбара) — излишек уходит гибким колонкам. */
78
80
  viewportWidth: MaybeRefOrGetter<number>;
81
+ /**
82
+ * Замеренная ширина несжимаемого контента ячеек (кнопки, теги) по ключу колонки: колонка не
83
+ * бывает уже, иначе контент вылезает из ячейки под sticky-right и за край таблицы.
84
+ */
85
+ contentWidths?: Ref<Record<string, number>>;
79
86
  }
80
- export declare const useTableColumns: <TItem extends Record<string, unknown>>({ columns, columnOrder, columnWidths, hiddenColumns, hasIndicator, hasCheckbox, hasRightEdge, hasColumnsManager, columnsManagerWidth, columnsResizable, columnsDraggable, viewportWidth, }: IUseTableColumnsOptions<TItem>) => {
87
+ export declare const useTableColumns: <TItem extends Record<string, unknown>>({ columns, columnOrder, columnWidths, hiddenColumns, hasIndicator, hasCheckbox, hasRightEdge, hasColumnsManager, columnsManagerWidth, columnsResizable, columnsDraggable, viewportWidth, contentWidths, }: IUseTableColumnsOptions<TItem>) => {
81
88
  primaryColumnKey: import("vue").ComputedRef<string | undefined>;
82
89
  orderedDataColumns: import("vue").ComputedRef<ISTableColumn<TItem>[]>;
83
90
  columnDescriptors: import("vue").ComputedRef<TSTableColumnDescriptor<TItem>[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"useTableColumns.d.ts","sourceRoot":"","sources":["../../../../src/components/STable/utils/useTableColumns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTableColumns.d.ts","sourceRoot":"","sources":["../../../../src/components/STable/utils/useTableColumns.ts"],"names":[],"mappings":"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"}
@@ -110,7 +110,7 @@ var distributeTableColumnWidths = (descriptors, viewportWidth) => {
110
110
  } : descriptor;
111
111
  });
112
112
  };
113
- var useTableColumns = ({ columns, columnOrder, columnWidths, hiddenColumns, hasIndicator, hasCheckbox, hasRightEdge, hasColumnsManager, columnsManagerWidth = 32, columnsResizable, columnsDraggable, viewportWidth }) => {
113
+ var useTableColumns = ({ columns, columnOrder, columnWidths, hiddenColumns, hasIndicator, hasCheckbox, hasRightEdge, hasColumnsManager, columnsManagerWidth = 32, columnsResizable, columnsDraggable, viewportWidth, contentWidths }) => {
114
114
  const primaryColumnKey = computed(() => {
115
115
  const sourceColumns = toValue(columns);
116
116
  return sourceColumns.find((tableColumn) => tableColumn.primary)?.key ?? sourceColumns[0]?.key;
@@ -163,21 +163,27 @@ var useTableColumns = ({ columns, columnOrder, columnWidths, hiddenColumns, hasI
163
163
  * Базовая ширина: модель (ресайз/автофит) → `width` конфига → дефолт. Колонка без явной
164
164
  * ширины гибкая — заполняет свободную ширину вьюпорта; sticky-right всегда фиксированные.
165
165
  */
166
- const resolveColumnBaseWidth = (tableColumn, isPrimaryColumn) => {
166
+ const resolveColumnBaseWidth = (tableColumn, isPrimaryColumn, minWidth) => {
167
167
  const modelWidth = columnWidths.value?.[tableColumn.key];
168
168
  if (modelWidth) return {
169
- baseWidth: modelWidth,
169
+ baseWidth: Math.max(minWidth, modelWidth),
170
170
  flexible: false
171
171
  };
172
172
  if (tableColumn.width) return {
173
- baseWidth: tableColumn.width,
173
+ baseWidth: Math.max(minWidth, tableColumn.width),
174
174
  flexible: false
175
175
  };
176
176
  return {
177
- baseWidth: resolveDefaultColumnWidth(isPrimaryColumn),
177
+ baseWidth: Math.max(minWidth, resolveDefaultColumnWidth(isPrimaryColumn)),
178
178
  flexible: tableColumn.sticky !== ESTableColumnSticky.RIGHT
179
179
  };
180
180
  };
181
+ /** Нижняя граница ширины: `minWidth` конфига и замеренный несжимаемый контент ячеек. */
182
+ const resolveColumnMinWidth = (tableColumn) => {
183
+ const configMinWidth = tableColumn.minWidth ?? 60;
184
+ const contentWidth = contentWidths?.value[tableColumn.key] ?? 0;
185
+ return Math.max(configMinWidth, contentWidth);
186
+ };
181
187
  /** Правые служебные колонки: right-edge, затем крайняя колонка управления колонками. */
182
188
  const pushTrailingServiceColumns = (pushServiceColumn) => {
183
189
  if (toValue(hasRightEdge)) pushServiceColumn("rightEdge", 40);
@@ -220,14 +226,15 @@ var useTableColumns = ({ columns, columnOrder, columnWidths, hiddenColumns, hasI
220
226
  const isPrimaryColumn = tableColumn.key === primaryColumnKey.value;
221
227
  const isLeadingColumn = Boolean(tableColumn.leading) && !isPrimaryColumn;
222
228
  const sticky = isPrimaryColumn || isLeadingColumn ? ESTableColumnSticky.LEFT : tableColumn.sticky;
223
- const { baseWidth, flexible } = resolveColumnBaseWidth(tableColumn, isPrimaryColumn);
229
+ const minWidth = resolveColumnMinWidth(tableColumn);
230
+ const { baseWidth, flexible } = resolveColumnBaseWidth(tableColumn, isPrimaryColumn, minWidth);
224
231
  descriptors.push({
225
232
  key: tableColumn.key,
226
233
  column: tableColumn,
227
234
  width: baseWidth,
228
235
  baseWidth,
229
236
  flexible,
230
- minWidth: tableColumn.minWidth ?? 60,
237
+ minWidth,
231
238
  maxWidth: tableColumn.maxWidth,
232
239
  sticky,
233
240
  align: tableColumn.align ?? ESTableColumnAlign.LEFT,
@@ -0,0 +1,63 @@
1
+ let vue = require("vue");
2
+ let _vueuse_core = require("@vueuse/core");
3
+ //#region src/components/STable/utils/useTableContentWidths.ts
4
+ /** Ячейки обычных строк тела: служебные колонки, групповые и футерные строки не меряются. */
5
+ var MEASURED_CELL_BODY_SELECTOR = "tbody tr.s-ui-table__row > td[data-column-key]:not([data-column-key^=\"__s-ui-table-\"]) > .s-ui-table__cell-body";
6
+ /**
7
+ * Ширина несжимаемого контента ячеек по колонкам. При `table-layout: fixed` ячейка не растит
8
+ * колонку: кнопки шире колонки вылезали из ячейки, уходили под sticky-right колонку управления и
9
+ * растягивали скролл за край таблицы — прокрутка так и не показывала их целиком. Замер находит
10
+ * ячейки, чей контент шире тела (`scrollWidth > clientWidth`), и поднимает нижнюю границу колонки.
11
+ *
12
+ * Текст с многоточием не переполняет тело (у него `min-width: 0` и свой `overflow`), поэтому
13
+ * колонки с текстом не растут. Граница только растёт: иначе колонка дёргалась бы при прокрутке
14
+ * виртуальных строк. Ячейка под ховером или фокусом пропускается — её раскрытые кнопки ячейки
15
+ * (`cell-actions`) временные. Потолок — как у автофита по даблклику.
16
+ *
17
+ * Контент растёт и без смены данных: иконка кнопки догружается асинхронно, шрифт подменяется
18
+ * после первого рендера. Поэтому замер идёт по любому изменению DOM таблицы и по `loadingdone`
19
+ * шрифтов — не чаще раза за кадр.
20
+ */
21
+ var useTableContentWidths = ({ scrollElement }) => {
22
+ const contentWidths = (0, vue.ref)({});
23
+ let frameId;
24
+ const measureContentWidths = () => {
25
+ frameId = void 0;
26
+ const container = (0, vue.toValue)(scrollElement);
27
+ if (!container) return;
28
+ const nextWidths = {};
29
+ container.querySelectorAll(MEASURED_CELL_BODY_SELECTOR).forEach((cellBody) => {
30
+ const cell = cellBody.parentElement;
31
+ const columnKey = cell?.dataset.columnKey;
32
+ if (!(cellBody instanceof HTMLElement) || !cell || !columnKey) return;
33
+ const overflow = cellBody.scrollWidth - cellBody.clientWidth;
34
+ if (overflow <= 0 || cell.matches(":hover, :focus-within")) return;
35
+ const headerCell = container.querySelector(`thead th[data-column-key="${CSS.escape(columnKey)}"]`);
36
+ const columnWidth = headerCell instanceof HTMLElement ? headerCell.offsetWidth : cell.offsetWidth;
37
+ const neededWidth = Math.min(640, Math.ceil(columnWidth + overflow));
38
+ if (neededWidth > (nextWidths[columnKey] ?? contentWidths.value[columnKey] ?? 0)) nextWidths[columnKey] = neededWidth;
39
+ });
40
+ if (Object.keys(nextWidths).length > 0) contentWidths.value = {
41
+ ...contentWidths.value,
42
+ ...nextWidths
43
+ };
44
+ };
45
+ const scheduleContentMeasure = () => {
46
+ if (frameId === void 0 && typeof requestAnimationFrame !== "undefined") frameId = requestAnimationFrame(measureContentWidths);
47
+ };
48
+ (0, _vueuse_core.useMutationObserver)(scrollElement, scheduleContentMeasure, {
49
+ childList: true,
50
+ subtree: true,
51
+ characterData: true
52
+ });
53
+ (0, _vueuse_core.useEventListener)(() => typeof document === "undefined" ? void 0 : document.fonts, "loadingdone", scheduleContentMeasure);
54
+ (0, _vueuse_core.tryOnScopeDispose)(() => {
55
+ if (frameId !== void 0) cancelAnimationFrame(frameId);
56
+ });
57
+ return {
58
+ contentWidths,
59
+ scheduleContentMeasure
60
+ };
61
+ };
62
+ //#endregion
63
+ exports.useTableContentWidths = useTableContentWidths;
@@ -0,0 +1,24 @@
1
+ import { type MaybeRefOrGetter } from 'vue';
2
+ export interface IUseTableContentWidthsOptions {
3
+ scrollElement: MaybeRefOrGetter<HTMLElement | null | undefined>;
4
+ }
5
+ /**
6
+ * Ширина несжимаемого контента ячеек по колонкам. При `table-layout: fixed` ячейка не растит
7
+ * колонку: кнопки шире колонки вылезали из ячейки, уходили под sticky-right колонку управления и
8
+ * растягивали скролл за край таблицы — прокрутка так и не показывала их целиком. Замер находит
9
+ * ячейки, чей контент шире тела (`scrollWidth > clientWidth`), и поднимает нижнюю границу колонки.
10
+ *
11
+ * Текст с многоточием не переполняет тело (у него `min-width: 0` и свой `overflow`), поэтому
12
+ * колонки с текстом не растут. Граница только растёт: иначе колонка дёргалась бы при прокрутке
13
+ * виртуальных строк. Ячейка под ховером или фокусом пропускается — её раскрытые кнопки ячейки
14
+ * (`cell-actions`) временные. Потолок — как у автофита по даблклику.
15
+ *
16
+ * Контент растёт и без смены данных: иконка кнопки догружается асинхронно, шрифт подменяется
17
+ * после первого рендера. Поэтому замер идёт по любому изменению DOM таблицы и по `loadingdone`
18
+ * шрифтов — не чаще раза за кадр.
19
+ */
20
+ export declare const useTableContentWidths: ({ scrollElement }: IUseTableContentWidthsOptions) => {
21
+ contentWidths: import("vue").Ref<Record<string, number>, Record<string, number>>;
22
+ scheduleContentMeasure: () => void;
23
+ };
24
+ //# sourceMappingURL=useTableContentWidths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableContentWidths.d.ts","sourceRoot":"","sources":["../../../../src/components/STable/utils/useTableContentWidths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,KAAK,CAAA;AAKzD,MAAM,WAAW,6BAA6B;IAC5C,aAAa,EAAE,gBAAgB,CAAC,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC,CAAA;CAChE;AAMD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qBAAqB,GAAI,mBAAmB,6BAA6B;;;CAsErF,CAAA"}
@@ -0,0 +1,63 @@
1
+ import { ref, toValue } from "vue";
2
+ import { tryOnScopeDispose, useEventListener, useMutationObserver } from "@vueuse/core";
3
+ //#region src/components/STable/utils/useTableContentWidths.ts
4
+ /** Ячейки обычных строк тела: служебные колонки, групповые и футерные строки не меряются. */
5
+ var MEASURED_CELL_BODY_SELECTOR = "tbody tr.s-ui-table__row > td[data-column-key]:not([data-column-key^=\"__s-ui-table-\"]) > .s-ui-table__cell-body";
6
+ /**
7
+ * Ширина несжимаемого контента ячеек по колонкам. При `table-layout: fixed` ячейка не растит
8
+ * колонку: кнопки шире колонки вылезали из ячейки, уходили под sticky-right колонку управления и
9
+ * растягивали скролл за край таблицы — прокрутка так и не показывала их целиком. Замер находит
10
+ * ячейки, чей контент шире тела (`scrollWidth > clientWidth`), и поднимает нижнюю границу колонки.
11
+ *
12
+ * Текст с многоточием не переполняет тело (у него `min-width: 0` и свой `overflow`), поэтому
13
+ * колонки с текстом не растут. Граница только растёт: иначе колонка дёргалась бы при прокрутке
14
+ * виртуальных строк. Ячейка под ховером или фокусом пропускается — её раскрытые кнопки ячейки
15
+ * (`cell-actions`) временные. Потолок — как у автофита по даблклику.
16
+ *
17
+ * Контент растёт и без смены данных: иконка кнопки догружается асинхронно, шрифт подменяется
18
+ * после первого рендера. Поэтому замер идёт по любому изменению DOM таблицы и по `loadingdone`
19
+ * шрифтов — не чаще раза за кадр.
20
+ */
21
+ var useTableContentWidths = ({ scrollElement }) => {
22
+ const contentWidths = ref({});
23
+ let frameId;
24
+ const measureContentWidths = () => {
25
+ frameId = void 0;
26
+ const container = toValue(scrollElement);
27
+ if (!container) return;
28
+ const nextWidths = {};
29
+ container.querySelectorAll(MEASURED_CELL_BODY_SELECTOR).forEach((cellBody) => {
30
+ const cell = cellBody.parentElement;
31
+ const columnKey = cell?.dataset.columnKey;
32
+ if (!(cellBody instanceof HTMLElement) || !cell || !columnKey) return;
33
+ const overflow = cellBody.scrollWidth - cellBody.clientWidth;
34
+ if (overflow <= 0 || cell.matches(":hover, :focus-within")) return;
35
+ const headerCell = container.querySelector(`thead th[data-column-key="${CSS.escape(columnKey)}"]`);
36
+ const columnWidth = headerCell instanceof HTMLElement ? headerCell.offsetWidth : cell.offsetWidth;
37
+ const neededWidth = Math.min(640, Math.ceil(columnWidth + overflow));
38
+ if (neededWidth > (nextWidths[columnKey] ?? contentWidths.value[columnKey] ?? 0)) nextWidths[columnKey] = neededWidth;
39
+ });
40
+ if (Object.keys(nextWidths).length > 0) contentWidths.value = {
41
+ ...contentWidths.value,
42
+ ...nextWidths
43
+ };
44
+ };
45
+ const scheduleContentMeasure = () => {
46
+ if (frameId === void 0 && typeof requestAnimationFrame !== "undefined") frameId = requestAnimationFrame(measureContentWidths);
47
+ };
48
+ useMutationObserver(scrollElement, scheduleContentMeasure, {
49
+ childList: true,
50
+ subtree: true,
51
+ characterData: true
52
+ });
53
+ useEventListener(() => typeof document === "undefined" ? void 0 : document.fonts, "loadingdone", scheduleContentMeasure);
54
+ tryOnScopeDispose(() => {
55
+ if (frameId !== void 0) cancelAnimationFrame(frameId);
56
+ });
57
+ return {
58
+ contentWidths,
59
+ scheduleContentMeasure
60
+ };
61
+ };
62
+ //#endregion
63
+ export { useTableContentWidths };