@uzum-tech/ui 1.13.2 → 1.14.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 (54) hide show
  1. package/dist/index.js +1559 -1409
  2. package/dist/index.prod.js +3 -3
  3. package/es/_mixins/use-css-vars-class.js +5 -3
  4. package/es/_mixins/use-rtl.js +5 -2
  5. package/es/_mixins/use-style.js +4 -2
  6. package/es/_mixins/use-theme.js +4 -2
  7. package/es/config-provider/src/ConfigProvider.d.ts +3 -0
  8. package/es/config-provider/src/ConfigProvider.js +4 -1
  9. package/es/config-provider/src/internal-interface.d.ts +1 -0
  10. package/es/data-table/src/DataTable.d.ts +2 -0
  11. package/es/data-table/src/DataTable.js +71 -4
  12. package/es/data-table/src/TableParts/Body.js +6 -2
  13. package/es/data-table/src/TableParts/Header.js +17 -5
  14. package/es/data-table/src/interface.d.ts +13 -0
  15. package/es/data-table/src/interface.js +1 -1
  16. package/es/data-table/src/use-resizable.d.ts +1 -0
  17. package/es/data-table/src/use-resizable.js +2 -1
  18. package/es/data-table/src/use-sorter.d.ts +1 -0
  19. package/es/data-table/src/use-sorter.js +2 -1
  20. package/es/data-table/src/use-table-data.d.ts +3 -2
  21. package/es/data-table/src/use-table-data.js +5 -1
  22. package/es/data-table/src/use-table-storage.d.ts +4 -0
  23. package/es/data-table/src/use-table-storage.js +43 -0
  24. package/es/data-table/src/utils.js +39 -5
  25. package/es/locales/date/enUS.js +1 -1
  26. package/es/version.d.ts +1 -1
  27. package/es/version.js +1 -1
  28. package/lib/_mixins/use-css-vars-class.js +5 -3
  29. package/lib/_mixins/use-rtl.js +4 -1
  30. package/lib/_mixins/use-style.js +4 -2
  31. package/lib/_mixins/use-theme.js +4 -2
  32. package/lib/config-provider/src/ConfigProvider.d.ts +3 -0
  33. package/lib/config-provider/src/ConfigProvider.js +4 -1
  34. package/lib/config-provider/src/internal-interface.d.ts +1 -0
  35. package/lib/data-table/src/DataTable.d.ts +2 -0
  36. package/lib/data-table/src/DataTable.js +70 -3
  37. package/lib/data-table/src/TableParts/Body.js +6 -2
  38. package/lib/data-table/src/TableParts/Header.js +16 -4
  39. package/lib/data-table/src/interface.d.ts +13 -0
  40. package/lib/data-table/src/interface.js +1 -1
  41. package/lib/data-table/src/use-resizable.d.ts +1 -0
  42. package/lib/data-table/src/use-resizable.js +2 -1
  43. package/lib/data-table/src/use-sorter.d.ts +1 -0
  44. package/lib/data-table/src/use-sorter.js +2 -1
  45. package/lib/data-table/src/use-table-data.d.ts +3 -2
  46. package/lib/data-table/src/use-table-data.js +5 -1
  47. package/lib/data-table/src/use-table-storage.d.ts +4 -0
  48. package/lib/data-table/src/use-table-storage.js +48 -0
  49. package/lib/data-table/src/utils.js +39 -5
  50. package/lib/locales/date/enUS.js +2 -2
  51. package/lib/version.d.ts +1 -1
  52. package/lib/version.js +1 -1
  53. package/package.json +1 -1
  54. package/web-types.json +18 -1
@@ -4,6 +4,7 @@ exports.useRtl = useRtl;
4
4
  const vue_1 = require("vue");
5
5
  const css_render_1 = require("css-render");
6
6
  const vue3_ssr_1 = require("@css-render/vue3-ssr");
7
+ const context_1 = require("../config-provider/src/context");
7
8
  const common_1 = require("./common");
8
9
  function useRtl(mountId, rtlStateRef, clsPrefixRef) {
9
10
  if (!rtlStateRef)
@@ -20,6 +21,7 @@ function useRtl(mountId, rtlStateRef, clsPrefixRef) {
20
21
  }
21
22
  return componentRtlState;
22
23
  });
24
+ const UConfigProvider = (0, vue_1.inject)(context_1.configProviderInjectionKey, null);
23
25
  const mountStyle = () => {
24
26
  (0, vue_1.watchEffect)(() => {
25
27
  const { value: clsPrefix } = clsPrefixRef;
@@ -39,7 +41,8 @@ function useRtl(mountId, rtlStateRef, clsPrefixRef) {
39
41
  props: {
40
42
  bPrefix: clsPrefix ? `.${clsPrefix}-` : undefined
41
43
  },
42
- ssr: ssrAdapter
44
+ ssr: ssrAdapter,
45
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
43
46
  });
44
47
  });
45
48
  };
@@ -27,14 +27,16 @@ function useStyle(mountId, style, clsPrefixRef) {
27
27
  props: {
28
28
  bPrefix: clsPrefix ? `.${clsPrefix}-` : undefined
29
29
  },
30
- ssr: ssrAdapter
30
+ ssr: ssrAdapter,
31
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
31
32
  });
32
33
  if (!(UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.preflightStyleDisabled)) {
33
34
  index_cssr_1.default.mount({
34
35
  id: 'u-global',
35
36
  head: true,
36
37
  anchorMetaName: common_1.cssrAnchorMetaName,
37
- ssr: ssrAdapter
38
+ ssr: ssrAdapter,
39
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
38
40
  });
39
41
  }
40
42
  };
@@ -27,14 +27,16 @@ function useTheme(resolveId, mountId, style, defaultTheme, props, clsPrefixRef)
27
27
  bPrefix: clsPrefix ? `.${clsPrefix}-` : undefined
28
28
  },
29
29
  anchorMetaName: common_1.cssrAnchorMetaName,
30
- ssr: ssrAdapter
30
+ ssr: ssrAdapter,
31
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
31
32
  });
32
33
  if (!(UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.preflightStyleDisabled)) {
33
34
  index_cssr_1.default.mount({
34
35
  id: 'u-global',
35
36
  head: true,
36
37
  anchorMetaName: common_1.cssrAnchorMetaName,
37
- ssr: ssrAdapter
38
+ ssr: ssrAdapter,
39
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
38
40
  });
39
41
  }
40
42
  };
@@ -36,6 +36,7 @@ export declare const configProviderProps: {
36
36
  readonly default: "desktop-first";
37
37
  };
38
38
  readonly preflightStyleDisabled: BooleanConstructor;
39
+ readonly styleMountTarget: PropType<ParentNode | null>;
39
40
  readonly inlineThemeDisabled: {
40
41
  readonly type: BooleanConstructor;
41
42
  readonly default: undefined;
@@ -79,6 +80,7 @@ declare const _default: import("vue").DefineComponent<{
79
80
  readonly default: "desktop-first";
80
81
  };
81
82
  readonly preflightStyleDisabled: BooleanConstructor;
83
+ readonly styleMountTarget: PropType<ParentNode | null>;
82
84
  readonly inlineThemeDisabled: {
83
85
  readonly type: BooleanConstructor;
84
86
  readonly default: undefined;
@@ -126,6 +128,7 @@ declare const _default: import("vue").DefineComponent<{
126
128
  readonly default: "desktop-first";
127
129
  };
128
130
  readonly preflightStyleDisabled: BooleanConstructor;
131
+ readonly styleMountTarget: PropType<ParentNode | null>;
129
132
  readonly inlineThemeDisabled: {
130
133
  readonly type: BooleanConstructor;
131
134
  readonly default: undefined;
@@ -37,6 +37,7 @@ exports.configProviderProps = {
37
37
  default: 'desktop-first'
38
38
  },
39
39
  preflightStyleDisabled: Boolean,
40
+ styleMountTarget: Object,
40
41
  inlineThemeDisabled: {
41
42
  type: Boolean,
42
43
  default: undefined
@@ -246,6 +247,7 @@ exports.default = (0, vue_1.defineComponent)({
246
247
  });
247
248
  const inlineThemeDisabled = props.inlineThemeDisabled || (UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.inlineThemeDisabled);
248
249
  const preflightStyleDisabled = props.preflightStyleDisabled || (UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.preflightStyleDisabled);
250
+ const styleMountTarget = props.styleMountTarget || (UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget);
249
251
  const mergedThemeHashRef = (0, vue_1.computed)(() => {
250
252
  const { value: theme } = mergedThemeRef;
251
253
  const { value: mergedThemeOverrides } = mergedThemeOverridesRef;
@@ -307,7 +309,8 @@ exports.default = (0, vue_1.defineComponent)({
307
309
  mergedThemeRef,
308
310
  mergedThemeOverridesRef,
309
311
  inlineThemeDisabled: inlineThemeDisabled || false,
310
- preflightStyleDisabled: preflightStyleDisabled || false
312
+ preflightStyleDisabled: preflightStyleDisabled || false,
313
+ styleMountTarget
311
314
  });
312
315
  return {
313
316
  mergedClsPrefix: mergedClsPrefixRef,
@@ -457,4 +457,5 @@ export interface ConfigProviderInjection {
457
457
  activeBreakpointThemeOverridesRef: Ref<GlobalThemeOverrides | undefined>;
458
458
  inlineThemeDisabled: boolean;
459
459
  preflightStyleDisabled: boolean;
460
+ styleMountTarget: ParentNode | undefined;
460
461
  }
@@ -85,6 +85,7 @@ declare const _default: import("vue").DefineComponent<{
85
85
  readonly default: "current";
86
86
  };
87
87
  readonly scrollbarProps: import("vue").PropType<import("../..").ScrollbarProps>;
88
+ readonly localStorageKey: StringConstructor;
88
89
  readonly renderCell: import("vue").PropType<(value: any, rowData: object, column: TableBaseColumn) => import("vue").VNodeChild>;
89
90
  readonly defaultEmptyValue: import("vue").PropType<string | (() => import("vue").VNodeChild) | undefined>;
90
91
  readonly renderExpandIcon: import("vue").PropType<import("./interface").RenderExpandIcon>;
@@ -4498,6 +4499,7 @@ declare const _default: import("vue").DefineComponent<{
4498
4499
  readonly default: "current";
4499
4500
  };
4500
4501
  readonly scrollbarProps: import("vue").PropType<import("../..").ScrollbarProps>;
4502
+ readonly localStorageKey: StringConstructor;
4501
4503
  readonly renderCell: import("vue").PropType<(value: any, rowData: object, column: TableBaseColumn) => import("vue").VNodeChild>;
4502
4504
  readonly defaultEmptyValue: import("vue").PropType<string | (() => import("vue").VNodeChild) | undefined>;
4503
4505
  readonly renderExpandIcon: import("vue").PropType<import("./interface").RenderExpandIcon>;
@@ -18,6 +18,7 @@ const use_resizable_1 = require("./use-resizable");
18
18
  const interface_1 = require("./interface");
19
19
  const use_group_header_1 = require("./use-group-header");
20
20
  const use_expand_1 = require("./use-expand");
21
+ const use_table_storage_1 = require("./use-table-storage");
21
22
  const index_cssr_1 = __importDefault(require("./styles/index.cssr"));
22
23
  exports.default = (0, vue_1.defineComponent)({
23
24
  name: 'DataTable',
@@ -58,10 +59,10 @@ exports.default = (0, vue_1.defineComponent)({
58
59
  const themeRef = (0, _mixins_1.useTheme)('DataTable', '-data-table', index_cssr_1.default, styles_1.dataTableLight, props, mergedClsPrefixRef);
59
60
  const bodyWidthRef = (0, vue_1.ref)(null);
60
61
  const mainTableInstRef = (0, vue_1.ref)(null);
61
- const { getResizableWidth, clearResizableWidth, doUpdateResizableWidth } = (0, use_resizable_1.useResizable)();
62
+ const { getResizableWidth, clearResizableWidth, doUpdateResizableWidth, resizableWidthsRef } = (0, use_resizable_1.useResizable)();
62
63
  const { rowsRef, colsRef, dataRelatedColsRef, hasEllipsisRef } = (0, use_group_header_1.useGroupHeader)(props, getResizableWidth);
63
- const { treeMateRef, mergedCurrentPageRef, paginatedDataRef, rawPaginatedDataRef, selectionColumnRef, hoverKeyRef, mergedPaginationRef, mergedFilterStateRef, mergedSortStateRef, childTriggerColIndexRef, doUpdatePage, doUpdateFilters, onUnstableColumnResize, deriveNextSorter, filter, filters, clearFilter, clearFilters, clearSorter, page, sort } = (0, use_table_data_1.useTableData)(props, { dataRelatedColsRef });
64
- const { doCheckAll, doUncheckAll, doCheck, doUncheck, headerCheckboxDisabledRef, someRowsCheckedRef, allRowsCheckedRef, mergedCheckedRowKeySetRef, mergedInderminateRowKeySetRef } = (0, use_check_1.useCheck)(props, {
64
+ const { treeMateRef, mergedCurrentPageRef, paginatedDataRef, rawPaginatedDataRef, selectionColumnRef, hoverKeyRef, mergedPaginationRef, mergedFilterStateRef, mergedSortStateRef, childTriggerColIndexRef, doUpdatePage, doUpdatePageSize, doUpdateFilters, onUnstableColumnResize, deriveNextSorter, restoreSortState, filter, filters, clearFilter, clearFilters, clearSorter, page, sort } = (0, use_table_data_1.useTableData)(props, { dataRelatedColsRef });
65
+ const { doCheckAll, doUncheckAll, doCheck, doUncheck, doUpdateCheckedRowKeys, mergedCheckedRowKeysRef, headerCheckboxDisabledRef, someRowsCheckedRef, allRowsCheckedRef, mergedCheckedRowKeySetRef, mergedInderminateRowKeySetRef } = (0, use_check_1.useCheck)(props, {
65
66
  selectionColumnRef,
66
67
  treeMateRef,
67
68
  paginatedDataRef
@@ -72,6 +73,72 @@ exports.default = (0, vue_1.defineComponent)({
72
73
  mainTableInstRef,
73
74
  mergedCurrentPageRef
74
75
  });
76
+ (0, vue_1.onMounted)(() => {
77
+ var _a, _b;
78
+ const key = props.localStorageKey;
79
+ if (!key)
80
+ return;
81
+ const stored = (0, use_table_storage_1.loadTableState)(key);
82
+ if (!stored)
83
+ return;
84
+ if (stored.columnWidths && Object.keys(stored.columnWidths).length > 0) {
85
+ resizableWidthsRef.value = Object.assign(Object.assign({}, resizableWidthsRef.value), stored.columnWidths);
86
+ }
87
+ if (props.pagination && stored.page != null) {
88
+ doUpdatePage(stored.page);
89
+ }
90
+ if (props.pagination && stored.pageSize != null) {
91
+ doUpdatePageSize(stored.pageSize);
92
+ }
93
+ if (stored.filters) {
94
+ filter(stored.filters);
95
+ }
96
+ const sortToRestore = (0, use_table_storage_1.restoreSortStateFromStored)(stored.sortState, dataRelatedColsRef.value);
97
+ if (sortToRestore === null || sortToRestore === void 0 ? void 0 : sortToRestore.length) {
98
+ restoreSortState(sortToRestore);
99
+ }
100
+ if ((_a = stored.checkedRowKeys) === null || _a === void 0 ? void 0 : _a.length) {
101
+ doUpdateCheckedRowKeys(stored.checkedRowKeys, undefined, 'check');
102
+ }
103
+ if ((_b = stored.expandedRowKeys) === null || _b === void 0 ? void 0 : _b.length) {
104
+ doUpdateExpandedRowKeys(stored.expandedRowKeys);
105
+ }
106
+ });
107
+ (0, vue_1.watch)(() => {
108
+ var _a, _b;
109
+ return props.localStorageKey
110
+ ? {
111
+ key: props.localStorageKey,
112
+ columnWidths: resizableWidthsRef.value,
113
+ page: (_a = mergedPaginationRef.value) === null || _a === void 0 ? void 0 : _a.page,
114
+ pageSize: (_b = mergedPaginationRef.value) === null || _b === void 0 ? void 0 : _b.pageSize,
115
+ filters: mergedFilterStateRef.value,
116
+ sortState: mergedSortStateRef.value.map((s) => ({
117
+ columnKey: s.columnKey,
118
+ order: s.order
119
+ })),
120
+ checkedRowKeys: mergedCheckedRowKeysRef.value,
121
+ expandedRowKeys: mergedExpandedRowKeysRef.value
122
+ }
123
+ : null;
124
+ }, (state) => {
125
+ var _a, _b;
126
+ if (!(state === null || state === void 0 ? void 0 : state.key))
127
+ return;
128
+ (0, use_table_storage_1.saveTableState)(state.key, {
129
+ columnWidths: state.columnWidths,
130
+ page: state.page,
131
+ pageSize: state.pageSize,
132
+ filters: state.filters,
133
+ sortState: state.sortState.length ? state.sortState : undefined,
134
+ checkedRowKeys: ((_a = state.checkedRowKeys) === null || _a === void 0 ? void 0 : _a.length)
135
+ ? state.checkedRowKeys
136
+ : undefined,
137
+ expandedRowKeys: ((_b = state.expandedRowKeys) === null || _b === void 0 ? void 0 : _b.length)
138
+ ? state.expandedRowKeys
139
+ : undefined
140
+ });
141
+ }, { deep: true });
75
142
  const { localeRef } = (0, _mixins_1.useLocale)('DataTable');
76
143
  const mergedTableLayoutRef = (0, vue_1.computed)(() => {
77
144
  // Layout
@@ -20,6 +20,7 @@ const seemly_1 = require("seemly");
20
20
  const vueuc_1 = require("vueuc");
21
21
  const vooks_1 = require("vooks");
22
22
  const common_1 = require("../../../_mixins/common");
23
+ const context_1 = require("../../../config-provider/src/context");
23
24
  const cssr_1 = require("../../../_utils/cssr");
24
25
  const _internal_1 = require("../../../_internal");
25
26
  const _utils_1 = require("../../../_utils");
@@ -102,6 +103,7 @@ exports.default = (0, vue_1.defineComponent)({
102
103
  const { slots: dataTableSlots, bodyWidthRef, mergedExpandedRowKeysRef, mergedClsPrefixRef, mergedThemeRef, scrollXRef, colsRef, paginatedDataRef, rawPaginatedDataRef, fixedColumnLeftMapRef, fixedColumnRightMapRef, mergedCurrentPageRef, rowClassNameRef, leftActiveFixedColKeyRef, leftActiveFixedChildrenColKeysRef, rightActiveFixedColKeyRef, rightActiveFixedChildrenColKeysRef, renderExpandRef, hoverKeyRef, summaryRef, mergedSortStateRef, virtualScrollRef, componentId, mergedTableLayoutRef, childTriggerColIndexRef, indentRef, rowPropsRef, maxHeightRef, stripedRef, loadingRef, loadingSkeletonRef, onLoadRef, loadingKeySetRef, expandableRef, stickyExpandedRowsRef, renderExpandIconRef, summaryPlacementRef, treeMateRef, scrollbarPropsRef, setHeaderScrollLeft, doUpdateExpandedRowKeys, handleTableBodyScroll, doCheck, doUncheck, renderCell, defaultEmptyValueRef, emptyPropsRef
103
104
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
104
105
  } = (0, vue_1.inject)(interface_1.dataTableInjectionKey);
106
+ const UConfigProvider = (0, vue_1.inject)(context_1.configProviderInjectionKey, null);
105
107
  const scrollbarInstRef = (0, vue_1.ref)(null);
106
108
  const virtualListRef = (0, vue_1.ref)(null);
107
109
  const emptyElRef = (0, vue_1.ref)(null);
@@ -296,13 +298,15 @@ exports.default = (0, vue_1.defineComponent)({
296
298
  id: `u-${componentId}`,
297
299
  force: true,
298
300
  props: cProps,
299
- anchorMetaName: common_1.cssrAnchorMetaName
301
+ anchorMetaName: common_1.cssrAnchorMetaName,
302
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
300
303
  });
301
304
  fixedStyleMounted = true;
302
305
  });
303
306
  (0, vue_1.onUnmounted)(() => {
304
307
  style.unmount({
305
- id: `u-${componentId}`
308
+ id: `u-${componentId}`,
309
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
306
310
  });
307
311
  });
308
312
  return Object.assign({ bodyWidth: bodyWidthRef, summaryPlacement: summaryPlacementRef, dataTableSlots,
@@ -28,7 +28,7 @@ exports.default = (0, vue_1.defineComponent)({
28
28
  }
29
29
  },
30
30
  setup() {
31
- const { mergedClsPrefixRef, scrollXRef, fixedColumnLeftMapRef, fixedColumnRightMapRef, mergedCurrentPageRef, allRowsCheckedRef, someRowsCheckedRef, rowsRef, colsRef, mergedThemeRef, checkOptionsRef, mergedSortStateRef, componentId, mergedTableLayoutRef, headerCheckboxDisabledRef, sizeRef, onUnstableColumnResize, doUpdateResizableWidth, handleTableHeaderScroll, deriveNextSorter, doUncheckAll, doCheckAll
31
+ const { mergedClsPrefixRef, scrollXRef, fixedColumnLeftMapRef, fixedColumnRightMapRef, mergedCurrentPageRef, allRowsCheckedRef, someRowsCheckedRef, rowsRef, colsRef, mergedThemeRef, checkOptionsRef, mergedSortStateRef, componentId, mergedTableLayoutRef, headerCheckboxDisabledRef, sizeRef, onUnstableColumnResize, getResizableWidth, doUpdateResizableWidth, handleTableHeaderScroll, deriveNextSorter, doUncheckAll, doCheckAll
32
32
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
33
33
  } = (0, vue_1.inject)(interface_1.dataTableInjectionKey);
34
34
  const cellElsRef = (0, vue_1.ref)({});
@@ -56,13 +56,25 @@ exports.default = (0, vue_1.defineComponent)({
56
56
  deriveNextSorter(nextSorter);
57
57
  }
58
58
  const resizeStartWidthMap = new Map();
59
+ function getColumnStartWidth(column) {
60
+ const actual = getCellActualWidth(column.key);
61
+ if (actual !== undefined && actual > 0)
62
+ return actual;
63
+ const resized = getResizableWidth(column.key);
64
+ if (resized !== undefined && resized > 0)
65
+ return resized;
66
+ return (0, utils_1.getNumberColWidth)(column);
67
+ }
59
68
  function handleColumnResizeStart(column) {
60
- resizeStartWidthMap.set(column.key, getCellActualWidth(column.key));
69
+ resizeStartWidthMap.set(column.key, getColumnStartWidth(column));
61
70
  }
62
71
  function handleColumnResize(column, displacementX) {
63
- const startWidth = resizeStartWidthMap.get(column.key);
72
+ let startWidth = resizeStartWidthMap.get(column.key);
64
73
  if (startWidth === undefined) {
65
- return;
74
+ startWidth = getColumnStartWidth(column);
75
+ if (startWidth === undefined)
76
+ return;
77
+ resizeStartWidthMap.set(column.key, startWidth);
66
78
  }
67
79
  const widthAfterResize = startWidth + displacementX;
68
80
  const limitWidth = (0, utils_1.clampValueFollowCSSRules)(widthAfterResize, column.minWidth, column.maxWidth);
@@ -96,6 +96,7 @@ export declare const dataTableProps: {
96
96
  readonly default: "current";
97
97
  };
98
98
  readonly scrollbarProps: PropType<ScrollbarProps>;
99
+ readonly localStorageKey: StringConstructor;
99
100
  readonly renderCell: PropType<(value: any, rowData: object, column: TableBaseColumn) => VNodeChild>;
100
101
  readonly defaultEmptyValue: PropType<string | (() => VNodeChild) | undefined>;
101
102
  readonly renderExpandIcon: PropType<RenderExpandIcon>;
@@ -3185,6 +3186,18 @@ export interface MainTableInjection {
3185
3186
  leftActiveFixedColKey: ColumnKey | null;
3186
3187
  rightActiveFixedColKey: ColumnKey | null;
3187
3188
  }
3189
+ export interface DataTableStorageState {
3190
+ columnWidths?: Record<string, number>;
3191
+ page?: number;
3192
+ pageSize?: number;
3193
+ filters?: FilterState;
3194
+ sortState?: Array<{
3195
+ columnKey: ColumnKey;
3196
+ order: SortState['order'];
3197
+ }>;
3198
+ checkedRowKeys?: RowKey[];
3199
+ expandedRowKeys?: RowKey[];
3200
+ }
3188
3201
  export type RenderFilter = (props: {
3189
3202
  active: boolean;
3190
3203
  show: boolean;
@@ -53,7 +53,7 @@ exports.dataTableProps = Object.assign(Object.assign({}, _mixins_1.useTheme.prop
53
53
  }, paginationBehaviorOnFilter: {
54
54
  type: String,
55
55
  default: 'current'
56
- }, scrollbarProps: Object, renderCell: Function, defaultEmptyValue: [String, Function], renderExpandIcon: Function, spinProps: { type: Object, default: {} }, emptyProps: Object, onLoad: Function, 'onUpdate:page': [Function, Array], onUpdatePage: [Function, Array], 'onUpdate:pageSize': [Function, Array], onUpdatePageSize: [Function, Array], 'onUpdate:sorter': [Function, Array], onUpdateSorter: [Function, Array], 'onUpdate:filters': [Function, Array], onUpdateFilters: [Function, Array], 'onUpdate:checkedRowKeys': [Function, Array], onUpdateCheckedRowKeys: [Function, Array], 'onUpdate:expandedRowKeys': [Function, Array], onUpdateExpandedRowKeys: [Function, Array], onScroll: Function,
56
+ }, scrollbarProps: Object, localStorageKey: String, renderCell: Function, defaultEmptyValue: [String, Function], renderExpandIcon: Function, spinProps: { type: Object, default: {} }, emptyProps: Object, onLoad: Function, 'onUpdate:page': [Function, Array], onUpdatePage: [Function, Array], 'onUpdate:pageSize': [Function, Array], onUpdatePageSize: [Function, Array], 'onUpdate:sorter': [Function, Array], onUpdateSorter: [Function, Array], 'onUpdate:filters': [Function, Array], onUpdateFilters: [Function, Array], 'onUpdate:checkedRowKeys': [Function, Array], onUpdateCheckedRowKeys: [Function, Array], 'onUpdate:expandedRowKeys': [Function, Array], onUpdateExpandedRowKeys: [Function, Array], onScroll: Function,
57
57
  // deprecated
58
58
  onPageChange: [Function, Array], onPageSizeChange: [Function, Array], onSorterChange: [Function, Array], onFiltersChange: [Function, Array], onCheckedRowKeysChange: [Function, Array] });
59
59
  exports.dataTableInjectionKey = (0, _utils_1.createInjectionKey)('u-data-table');
@@ -3,4 +3,5 @@ export declare function useResizable(): {
3
3
  getResizableWidth: (key: ColumnKey) => number | undefined;
4
4
  doUpdateResizableWidth: (column: TableColumn, width: number) => void;
5
5
  clearResizableWidth: () => void;
6
+ resizableWidthsRef: import("vue").Ref<Record<ColumnKey, number>>;
6
7
  };
@@ -20,6 +20,7 @@ function useResizable() {
20
20
  return {
21
21
  getResizableWidth,
22
22
  doUpdateResizableWidth,
23
- clearResizableWidth
23
+ clearResizableWidth,
24
+ resizableWidthsRef
24
25
  };
25
26
  }
@@ -16,4 +16,5 @@ export declare function useSorter(props: DataTableSetupProps, { dataRelatedColsR
16
16
  };
17
17
  }[]>;
18
18
  deriveNextSorter: (sortState: SortState | null) => void;
19
+ doUpdateSorter: (sortState: SortState | SortState[] | null) => void;
19
20
  };
@@ -189,6 +189,7 @@ function useSorter(props, { dataRelatedColsRef, filteredDataRef }) {
189
189
  sort,
190
190
  sortedDataRef,
191
191
  mergedSortStateRef,
192
- deriveNextSorter
192
+ deriveNextSorter,
193
+ doUpdateSorter
193
194
  };
194
195
  }
@@ -1,6 +1,6 @@
1
1
  import { type ComputedRef } from 'vue';
2
2
  import type { PaginationProps } from '../../pagination/src/Pagination';
3
- import type { ColumnKey, FilterState, TableBaseColumn, TableSelectionColumn, InternalRowData, TmNode, TableExpandColumn, RowKey, DataTableSetupProps } from './interface';
3
+ import type { ColumnKey, FilterState, SortState, TableBaseColumn, TableSelectionColumn, InternalRowData, TmNode, TableExpandColumn, RowKey, DataTableSetupProps } from './interface';
4
4
  export declare function useTableData(props: DataTableSetupProps, { dataRelatedColsRef }: {
5
5
  dataRelatedColsRef: ComputedRef<Array<TableSelectionColumn | TableBaseColumn | TableExpandColumn>>;
6
6
  }): {
@@ -22,10 +22,11 @@ export declare function useTableData(props: DataTableSetupProps, { dataRelatedCo
22
22
  selectionColumnRef: ComputedRef<TableSelectionColumn | null>;
23
23
  childTriggerColIndexRef: ComputedRef<number>;
24
24
  doUpdateFilters: (filters: FilterState, sourceColumn: TableBaseColumn) => void;
25
- deriveNextSorter: (sortState: import("./interface").SortState | null) => void;
25
+ deriveNextSorter: (sortState: SortState | null) => void;
26
26
  doUpdatePageSize: (pageSize: number) => void;
27
27
  doUpdatePage: (page: number) => void;
28
28
  onUnstableColumnResize: (resizedWidth: number, limitedWidth: number, column: TableBaseColumn, getColumnWidth: (key: ColumnKey) => number | undefined) => void;
29
+ restoreSortState: (sortState: SortState | SortState[] | null) => void;
29
30
  filter: (filters: FilterState | null) => void;
30
31
  filters: (filters: FilterState | null) => void;
31
32
  clearFilter: () => void;
@@ -131,7 +131,7 @@ function useTableData(props, { dataRelatedColsRef }) {
131
131
  })
132
132
  : [];
133
133
  });
134
- const { sortedDataRef, deriveNextSorter, mergedSortStateRef, sort, clearSorter } = (0, use_sorter_1.useSorter)(props, {
134
+ const { sortedDataRef, deriveNextSorter, mergedSortStateRef, sort, clearSorter, doUpdateSorter } = (0, use_sorter_1.useSorter)(props, {
135
135
  dataRelatedColsRef,
136
136
  filteredDataRef
137
137
  });
@@ -302,6 +302,9 @@ function useTableData(props, { dataRelatedColsRef }) {
302
302
  (0, _utils_1.warn)('data-table', '`filters` is not an object');
303
303
  }
304
304
  }
305
+ function restoreSortState(sortState) {
306
+ doUpdateSorter(sortState);
307
+ }
305
308
  return {
306
309
  treeMateRef,
307
310
  mergedCurrentPageRef: boundedMergedCurrentPageRef,
@@ -318,6 +321,7 @@ function useTableData(props, { dataRelatedColsRef }) {
318
321
  doUpdatePageSize,
319
322
  doUpdatePage,
320
323
  onUnstableColumnResize,
324
+ restoreSortState,
321
325
  // exported methods
322
326
  filter,
323
327
  filters,
@@ -0,0 +1,4 @@
1
+ import type { DataTableStorageState, SortState, TableBaseColumn, TableExpandColumn, TableSelectionColumn } from './interface';
2
+ export declare function loadTableState(localStorageKey: string): DataTableStorageState | null;
3
+ export declare function saveTableState(localStorageKey: string, state: DataTableStorageState): void;
4
+ export declare function restoreSortStateFromStored(stored: DataTableStorageState['sortState'], dataRelatedCols: Array<TableSelectionColumn | TableBaseColumn | TableExpandColumn>): SortState[] | null;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadTableState = loadTableState;
4
+ exports.saveTableState = saveTableState;
5
+ exports.restoreSortStateFromStored = restoreSortStateFromStored;
6
+ const STORAGE_KEY_PREFIX = 'u-data-table:';
7
+ function getStorageKey(key) {
8
+ return `${STORAGE_KEY_PREFIX}${key}`;
9
+ }
10
+ function loadTableState(localStorageKey) {
11
+ try {
12
+ const raw = localStorage.getItem(getStorageKey(localStorageKey));
13
+ if (!raw)
14
+ return null;
15
+ return JSON.parse(raw);
16
+ }
17
+ catch (_a) {
18
+ return null;
19
+ }
20
+ }
21
+ function saveTableState(localStorageKey, state) {
22
+ try {
23
+ localStorage.setItem(getStorageKey(localStorageKey), JSON.stringify(state));
24
+ }
25
+ catch (_a) {
26
+ console.warn(`Could not set localStorage value for ${localStorageKey}`);
27
+ }
28
+ }
29
+ function restoreSortStateFromStored(stored, dataRelatedCols) {
30
+ if (!(stored === null || stored === void 0 ? void 0 : stored.length))
31
+ return null;
32
+ const result = [];
33
+ for (const item of stored) {
34
+ const column = dataRelatedCols.find((col) => col.type !== 'selection' &&
35
+ col.type !== 'expand' &&
36
+ 'key' in col &&
37
+ col.key === item.columnKey &&
38
+ col.sorter !== undefined);
39
+ if (column === null || column === void 0 ? void 0 : column.sorter) {
40
+ result.push({
41
+ columnKey: item.columnKey,
42
+ order: item.order,
43
+ sorter: column.sorter
44
+ });
45
+ }
46
+ }
47
+ return result.length ? result : null;
48
+ }
@@ -96,15 +96,49 @@ function clampValueFollowCSSRules(value, min, max) {
96
96
  return value;
97
97
  }
98
98
  function createCustomWidthStyle(column, resizedWidth) {
99
+ var _a;
99
100
  if (resizedWidth !== undefined) {
101
+ const numWidth = (0, seemly_1.depx)(resizedWidth);
102
+ const minMaxColumn = column && 'minWidth' in column && 'maxWidth' in column
103
+ ? column
104
+ : null;
105
+ const clampedNum = minMaxColumn
106
+ ? clampValueFollowCSSRules(numWidth, minMaxColumn.minWidth, minMaxColumn.maxWidth)
107
+ : numWidth;
108
+ const clamped = (0, _utils_1.formatLength)(clampedNum);
100
109
  return {
101
- width: resizedWidth,
102
- minWidth: resizedWidth,
103
- maxWidth: resizedWidth
110
+ width: clamped,
111
+ minWidth: clamped,
112
+ maxWidth: clamped
104
113
  };
105
114
  }
106
- const width = getStringColWidth(column);
107
- const { minWidth, maxWidth } = column;
115
+ const explicitNum = (_a = getNumberColWidth(column)) !== null && _a !== void 0 ? _a : undefined;
116
+ const minWidth = column && 'minWidth' in column
117
+ ? column.minWidth
118
+ : undefined;
119
+ const maxWidth = column && 'maxWidth' in column
120
+ ? column.maxWidth
121
+ : undefined;
122
+ let widthNum = explicitNum;
123
+ if (widthNum === undefined &&
124
+ (minWidth !== undefined || maxWidth !== undefined)) {
125
+ widthNum = clampValueFollowCSSRules(maxWidth !== undefined
126
+ ? typeof maxWidth === 'number'
127
+ ? maxWidth
128
+ : parseFloat(maxWidth)
129
+ : minWidth !== undefined
130
+ ? typeof minWidth === 'number'
131
+ ? minWidth
132
+ : parseFloat(minWidth)
133
+ : 0, minWidth, maxWidth);
134
+ }
135
+ else if (widthNum !== undefined &&
136
+ (minWidth !== undefined || maxWidth !== undefined)) {
137
+ widthNum = clampValueFollowCSSRules(widthNum, minWidth, maxWidth);
138
+ }
139
+ const width = widthNum !== undefined
140
+ ? (0, _utils_1.formatLength)(widthNum)
141
+ : getStringColWidth(column);
108
142
  return {
109
143
  width,
110
144
  minWidth: (0, _utils_1.formatLength)(minWidth) || width,
@@ -3,9 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const en_US_1 = __importDefault(require("date-fns/locale/en-US")); //
6
+ const index_js_1 = __importDefault(require("date-fns/locale/en-US/index.js"));
7
7
  const dateEnUs = {
8
8
  name: 'en-US',
9
- locale: en_US_1.default
9
+ locale: index_js_1.default
10
10
  };
11
11
  exports.default = dateEnUs;
package/lib/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- declare const _default: "1.13.2";
1
+ declare const _default: "1.14.0";
2
2
  export default _default;
package/lib/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = '1.13.2';
3
+ exports.default = '1.14.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uzum-tech/ui",
3
- "version": "1.13.2",
3
+ "version": "1.14.0",
4
4
  "description": "A Vue 3 Component Library. Fairly Complete, Theme Customizable, Uses TypeScript, Fast",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
package/web-types.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "framework": "vue",
4
4
  "name": "@uzum-tech/ui",
5
- "version": "1.13.2",
5
+ "version": "1.14.0",
6
6
  "js-types-syntax": "typescript",
7
7
  "contributions": {
8
8
  "html": {
@@ -3725,6 +3725,11 @@
3725
3725
  "since": "2.29.0"
3726
3726
  }
3727
3727
  },
3728
+ {
3729
+ "name": "style-mount-target",
3730
+ "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/config-provider",
3731
+ "type": "object"
3732
+ },
3728
3733
  {
3729
3734
  "name": "inline-theme-disabled",
3730
3735
  "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/config-provider",
@@ -4229,6 +4234,11 @@
4229
4234
  "description": "See [Scrollbar props](scrollbar#Scrollbar-Props)",
4230
4235
  "default": "undefined"
4231
4236
  },
4237
+ {
4238
+ "name": "local-storage-key",
4239
+ "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/data-table",
4240
+ "type": "string"
4241
+ },
4232
4242
  {
4233
4243
  "name": "render-cell",
4234
4244
  "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/data-table",
@@ -4272,6 +4282,13 @@
4272
4282
  "type": "Partial<EmptyProps>",
4273
4283
  "description": "Props passed to the Empty component when data is empty.",
4274
4284
  "default": "undefined"
4285
+ },
4286
+ {
4287
+ "name": "localStorage-key",
4288
+ "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/data-table",
4289
+ "type": "string",
4290
+ "description": "Key for localStorage to persist table state (column widths, page, pageSize, filters, sort, checkedRowKeys, expandedRowKeys). When set, state is restored on mount and saved on change.",
4291
+ "default": "undefined"
4275
4292
  }
4276
4293
  ],
4277
4294
  "js": {