@uzum-tech/ui 1.13.1 → 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 (70) hide show
  1. package/dist/index.js +69981 -69817
  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/icon-bar/index.d.ts +4 -4
  26. package/es/icon-bar/index.js +3 -2
  27. package/es/icon-bar/src/IconBar.d.ts +19 -69
  28. package/es/icon-bar/src/IconBar.js +6 -11
  29. package/es/icon-bar/src/IconBarItem.d.ts +81 -65
  30. package/es/icon-bar/src/IconBarItem.js +6 -5
  31. package/es/icon-bar/src/interface.d.ts +112 -0
  32. package/es/icon-bar/src/interface.js +17 -0
  33. package/es/locales/date/enUS.js +1 -1
  34. package/es/version.d.ts +1 -1
  35. package/es/version.js +1 -1
  36. package/lib/_mixins/use-css-vars-class.js +5 -3
  37. package/lib/_mixins/use-rtl.js +4 -1
  38. package/lib/_mixins/use-style.js +4 -2
  39. package/lib/_mixins/use-theme.js +4 -2
  40. package/lib/config-provider/src/ConfigProvider.d.ts +3 -0
  41. package/lib/config-provider/src/ConfigProvider.js +4 -1
  42. package/lib/config-provider/src/internal-interface.d.ts +1 -0
  43. package/lib/data-table/src/DataTable.d.ts +2 -0
  44. package/lib/data-table/src/DataTable.js +70 -3
  45. package/lib/data-table/src/TableParts/Body.js +6 -2
  46. package/lib/data-table/src/TableParts/Header.js +16 -4
  47. package/lib/data-table/src/interface.d.ts +13 -0
  48. package/lib/data-table/src/interface.js +1 -1
  49. package/lib/data-table/src/use-resizable.d.ts +1 -0
  50. package/lib/data-table/src/use-resizable.js +2 -1
  51. package/lib/data-table/src/use-sorter.d.ts +1 -0
  52. package/lib/data-table/src/use-sorter.js +2 -1
  53. package/lib/data-table/src/use-table-data.d.ts +3 -2
  54. package/lib/data-table/src/use-table-data.js +5 -1
  55. package/lib/data-table/src/use-table-storage.d.ts +4 -0
  56. package/lib/data-table/src/use-table-storage.js +48 -0
  57. package/lib/data-table/src/utils.js +39 -5
  58. package/lib/icon-bar/index.d.ts +4 -4
  59. package/lib/icon-bar/index.js +4 -3
  60. package/lib/icon-bar/src/IconBar.d.ts +19 -69
  61. package/lib/icon-bar/src/IconBar.js +6 -12
  62. package/lib/icon-bar/src/IconBarItem.d.ts +81 -65
  63. package/lib/icon-bar/src/IconBarItem.js +6 -6
  64. package/lib/icon-bar/src/interface.d.ts +112 -0
  65. package/lib/icon-bar/src/interface.js +20 -0
  66. package/lib/locales/date/enUS.js +2 -2
  67. package/lib/version.d.ts +1 -1
  68. package/lib/version.js +1 -1
  69. package/package.json +1 -1
  70. package/web-types.json +23 -1
@@ -5,10 +5,11 @@ import { configProviderInjectionKey } from '../config-provider/src/context';
5
5
  import { throwError } from '../_utils';
6
6
  import { c } from '../_utils/cssr';
7
7
  export function useThemeClass(componentName, hashRef, cssVarsRef, props) {
8
- var _a;
9
8
  if (!cssVarsRef)
10
9
  throwError('useThemeClass', 'cssVarsRef is not passed');
11
- const mergedThemeHashRef = (_a = inject(configProviderInjectionKey, null)) === null || _a === void 0 ? void 0 : _a.mergedThemeHashRef;
10
+ const UConfigProvider = inject(configProviderInjectionKey, null);
11
+ const mergedThemeHashRef = UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.mergedThemeHashRef;
12
+ const styleMountTarget = UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget;
12
13
  const themeClassRef = ref('');
13
14
  const ssrAdapter = useSsrAdapter();
14
15
  let renderCallback;
@@ -37,7 +38,8 @@ export function useThemeClass(componentName, hashRef, cssVarsRef, props) {
37
38
  }
38
39
  c(`.${finalThemeHash}`, style).mount({
39
40
  id: finalThemeHash,
40
- ssr: ssrAdapter
41
+ ssr: ssrAdapter,
42
+ parent: styleMountTarget
41
43
  });
42
44
  renderCallback = undefined;
43
45
  };
@@ -1,6 +1,7 @@
1
- import { onBeforeMount, watchEffect, computed } from 'vue';
1
+ import { onBeforeMount, watchEffect, computed, inject } from 'vue';
2
2
  import { exists } from 'css-render';
3
3
  import { useSsrAdapter } from '@css-render/vue3-ssr';
4
+ import { configProviderInjectionKey } from '../config-provider/src/context';
4
5
  import { cssrAnchorMetaName } from './common';
5
6
  export function useRtl(mountId, rtlStateRef, clsPrefixRef) {
6
7
  if (!rtlStateRef)
@@ -17,6 +18,7 @@ export function useRtl(mountId, rtlStateRef, clsPrefixRef) {
17
18
  }
18
19
  return componentRtlState;
19
20
  });
21
+ const UConfigProvider = inject(configProviderInjectionKey, null);
20
22
  const mountStyle = () => {
21
23
  watchEffect(() => {
22
24
  const { value: clsPrefix } = clsPrefixRef;
@@ -36,7 +38,8 @@ export function useRtl(mountId, rtlStateRef, clsPrefixRef) {
36
38
  props: {
37
39
  bPrefix: clsPrefix ? `.${clsPrefix}-` : undefined
38
40
  },
39
- ssr: ssrAdapter
41
+ ssr: ssrAdapter,
42
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
40
43
  });
41
44
  });
42
45
  };
@@ -21,14 +21,16 @@ export default function useStyle(mountId, style, clsPrefixRef) {
21
21
  props: {
22
22
  bPrefix: clsPrefix ? `.${clsPrefix}-` : undefined
23
23
  },
24
- ssr: ssrAdapter
24
+ ssr: ssrAdapter,
25
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
25
26
  });
26
27
  if (!(UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.preflightStyleDisabled)) {
27
28
  globalStyle.mount({
28
29
  id: 'u-global',
29
30
  head: true,
30
31
  anchorMetaName: cssrAnchorMetaName,
31
- ssr: ssrAdapter
32
+ ssr: ssrAdapter,
33
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
32
34
  });
33
35
  }
34
36
  };
@@ -21,14 +21,16 @@ function useTheme(resolveId, mountId, style, defaultTheme, props, clsPrefixRef)
21
21
  bPrefix: clsPrefix ? `.${clsPrefix}-` : undefined
22
22
  },
23
23
  anchorMetaName: cssrAnchorMetaName,
24
- ssr: ssrAdapter
24
+ ssr: ssrAdapter,
25
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
25
26
  });
26
27
  if (!(UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.preflightStyleDisabled)) {
27
28
  globalStyle.mount({
28
29
  id: 'u-global',
29
30
  head: true,
30
31
  anchorMetaName: cssrAnchorMetaName,
31
- ssr: ssrAdapter
32
+ ssr: ssrAdapter,
33
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
32
34
  });
33
35
  }
34
36
  };
@@ -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;
@@ -34,6 +34,7 @@ export const configProviderProps = {
34
34
  default: 'desktop-first'
35
35
  },
36
36
  preflightStyleDisabled: Boolean,
37
+ styleMountTarget: Object,
37
38
  inlineThemeDisabled: {
38
39
  type: Boolean,
39
40
  default: undefined
@@ -243,6 +244,7 @@ export default defineComponent({
243
244
  });
244
245
  const inlineThemeDisabled = props.inlineThemeDisabled || (UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.inlineThemeDisabled);
245
246
  const preflightStyleDisabled = props.preflightStyleDisabled || (UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.preflightStyleDisabled);
247
+ const styleMountTarget = props.styleMountTarget || (UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget);
246
248
  const mergedThemeHashRef = computed(() => {
247
249
  const { value: theme } = mergedThemeRef;
248
250
  const { value: mergedThemeOverrides } = mergedThemeOverridesRef;
@@ -304,7 +306,8 @@ export default defineComponent({
304
306
  mergedThemeRef,
305
307
  mergedThemeOverridesRef,
306
308
  inlineThemeDisabled: inlineThemeDisabled || false,
307
- preflightStyleDisabled: preflightStyleDisabled || false
309
+ preflightStyleDisabled: preflightStyleDisabled || false,
310
+ styleMountTarget
308
311
  });
309
312
  return {
310
313
  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>;
@@ -1,4 +1,4 @@
1
- import { h, computed, defineComponent, ref, provide, toRef, Transition, watchEffect } from 'vue';
1
+ import { h, computed, defineComponent, ref, provide, toRef, onMounted, watch, Transition, watchEffect } from 'vue';
2
2
  import { createId } from 'seemly';
3
3
  import { useConfig, useLocale, useTheme, useThemeClass } from '../../_mixins';
4
4
  import { UBaseLoading } from '../../_internal';
@@ -13,6 +13,7 @@ import { useResizable } from './use-resizable';
13
13
  import { dataTableInjectionKey, dataTableProps } from './interface';
14
14
  import { useGroupHeader } from './use-group-header';
15
15
  import { useExpand } from './use-expand';
16
+ import { loadTableState, saveTableState, restoreSortStateFromStored } from './use-table-storage';
16
17
  import style from './styles/index.cssr';
17
18
  export default defineComponent({
18
19
  name: 'DataTable',
@@ -53,10 +54,10 @@ export default defineComponent({
53
54
  const themeRef = useTheme('DataTable', '-data-table', style, dataTableLight, props, mergedClsPrefixRef);
54
55
  const bodyWidthRef = ref(null);
55
56
  const mainTableInstRef = ref(null);
56
- const { getResizableWidth, clearResizableWidth, doUpdateResizableWidth } = useResizable();
57
+ const { getResizableWidth, clearResizableWidth, doUpdateResizableWidth, resizableWidthsRef } = useResizable();
57
58
  const { rowsRef, colsRef, dataRelatedColsRef, hasEllipsisRef } = useGroupHeader(props, getResizableWidth);
58
- const { treeMateRef, mergedCurrentPageRef, paginatedDataRef, rawPaginatedDataRef, selectionColumnRef, hoverKeyRef, mergedPaginationRef, mergedFilterStateRef, mergedSortStateRef, childTriggerColIndexRef, doUpdatePage, doUpdateFilters, onUnstableColumnResize, deriveNextSorter, filter, filters, clearFilter, clearFilters, clearSorter, page, sort } = useTableData(props, { dataRelatedColsRef });
59
- const { doCheckAll, doUncheckAll, doCheck, doUncheck, headerCheckboxDisabledRef, someRowsCheckedRef, allRowsCheckedRef, mergedCheckedRowKeySetRef, mergedInderminateRowKeySetRef } = useCheck(props, {
59
+ const { treeMateRef, mergedCurrentPageRef, paginatedDataRef, rawPaginatedDataRef, selectionColumnRef, hoverKeyRef, mergedPaginationRef, mergedFilterStateRef, mergedSortStateRef, childTriggerColIndexRef, doUpdatePage, doUpdatePageSize, doUpdateFilters, onUnstableColumnResize, deriveNextSorter, restoreSortState, filter, filters, clearFilter, clearFilters, clearSorter, page, sort } = useTableData(props, { dataRelatedColsRef });
60
+ const { doCheckAll, doUncheckAll, doCheck, doUncheck, doUpdateCheckedRowKeys, mergedCheckedRowKeysRef, headerCheckboxDisabledRef, someRowsCheckedRef, allRowsCheckedRef, mergedCheckedRowKeySetRef, mergedInderminateRowKeySetRef } = useCheck(props, {
60
61
  selectionColumnRef,
61
62
  treeMateRef,
62
63
  paginatedDataRef
@@ -67,6 +68,72 @@ export default defineComponent({
67
68
  mainTableInstRef,
68
69
  mergedCurrentPageRef
69
70
  });
71
+ onMounted(() => {
72
+ var _a, _b;
73
+ const key = props.localStorageKey;
74
+ if (!key)
75
+ return;
76
+ const stored = loadTableState(key);
77
+ if (!stored)
78
+ return;
79
+ if (stored.columnWidths && Object.keys(stored.columnWidths).length > 0) {
80
+ resizableWidthsRef.value = Object.assign(Object.assign({}, resizableWidthsRef.value), stored.columnWidths);
81
+ }
82
+ if (props.pagination && stored.page != null) {
83
+ doUpdatePage(stored.page);
84
+ }
85
+ if (props.pagination && stored.pageSize != null) {
86
+ doUpdatePageSize(stored.pageSize);
87
+ }
88
+ if (stored.filters) {
89
+ filter(stored.filters);
90
+ }
91
+ const sortToRestore = restoreSortStateFromStored(stored.sortState, dataRelatedColsRef.value);
92
+ if (sortToRestore === null || sortToRestore === void 0 ? void 0 : sortToRestore.length) {
93
+ restoreSortState(sortToRestore);
94
+ }
95
+ if ((_a = stored.checkedRowKeys) === null || _a === void 0 ? void 0 : _a.length) {
96
+ doUpdateCheckedRowKeys(stored.checkedRowKeys, undefined, 'check');
97
+ }
98
+ if ((_b = stored.expandedRowKeys) === null || _b === void 0 ? void 0 : _b.length) {
99
+ doUpdateExpandedRowKeys(stored.expandedRowKeys);
100
+ }
101
+ });
102
+ watch(() => {
103
+ var _a, _b;
104
+ return props.localStorageKey
105
+ ? {
106
+ key: props.localStorageKey,
107
+ columnWidths: resizableWidthsRef.value,
108
+ page: (_a = mergedPaginationRef.value) === null || _a === void 0 ? void 0 : _a.page,
109
+ pageSize: (_b = mergedPaginationRef.value) === null || _b === void 0 ? void 0 : _b.pageSize,
110
+ filters: mergedFilterStateRef.value,
111
+ sortState: mergedSortStateRef.value.map((s) => ({
112
+ columnKey: s.columnKey,
113
+ order: s.order
114
+ })),
115
+ checkedRowKeys: mergedCheckedRowKeysRef.value,
116
+ expandedRowKeys: mergedExpandedRowKeysRef.value
117
+ }
118
+ : null;
119
+ }, (state) => {
120
+ var _a, _b;
121
+ if (!(state === null || state === void 0 ? void 0 : state.key))
122
+ return;
123
+ saveTableState(state.key, {
124
+ columnWidths: state.columnWidths,
125
+ page: state.page,
126
+ pageSize: state.pageSize,
127
+ filters: state.filters,
128
+ sortState: state.sortState.length ? state.sortState : undefined,
129
+ checkedRowKeys: ((_a = state.checkedRowKeys) === null || _a === void 0 ? void 0 : _a.length)
130
+ ? state.checkedRowKeys
131
+ : undefined,
132
+ expandedRowKeys: ((_b = state.expandedRowKeys) === null || _b === void 0 ? void 0 : _b.length)
133
+ ? state.expandedRowKeys
134
+ : undefined
135
+ });
136
+ }, { deep: true });
70
137
  const { localeRef } = useLocale('DataTable');
71
138
  const mergedTableLayoutRef = computed(() => {
72
139
  // Layout
@@ -15,6 +15,7 @@ import { pxfy, repeat } from 'seemly';
15
15
  import { VirtualList, VResizeObserver } from 'vueuc';
16
16
  import { useMemo } from 'vooks';
17
17
  import { cssrAnchorMetaName } from '../../../_mixins/common';
18
+ import { configProviderInjectionKey } from '../../../config-provider/src/context';
18
19
  import { c } from '../../../_utils/cssr';
19
20
  import { UScrollbar } from '../../../_internal';
20
21
  import { formatLength, resolveSlot, warn } from '../../../_utils';
@@ -97,6 +98,7 @@ export default defineComponent({
97
98
  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
98
99
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
99
100
  } = inject(dataTableInjectionKey);
101
+ const UConfigProvider = inject(configProviderInjectionKey, null);
100
102
  const scrollbarInstRef = ref(null);
101
103
  const virtualListRef = ref(null);
102
104
  const emptyElRef = ref(null);
@@ -291,13 +293,15 @@ export default defineComponent({
291
293
  id: `u-${componentId}`,
292
294
  force: true,
293
295
  props: cProps,
294
- anchorMetaName: cssrAnchorMetaName
296
+ anchorMetaName: cssrAnchorMetaName,
297
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
295
298
  });
296
299
  fixedStyleMounted = true;
297
300
  });
298
301
  onUnmounted(() => {
299
302
  style.unmount({
300
- id: `u-${componentId}`
303
+ id: `u-${componentId}`,
304
+ parent: UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.styleMountTarget
301
305
  });
302
306
  });
303
307
  return Object.assign({ bodyWidth: bodyWidthRef, summaryPlacement: summaryPlacementRef, dataTableSlots,
@@ -6,7 +6,7 @@ import { UEllipsis } from '../../../ellipsis';
6
6
  import SortButton from '../HeaderButton/SortButton';
7
7
  import FilterButton from '../HeaderButton/FilterButton';
8
8
  import ResizeButton from '../HeaderButton/ResizeButton';
9
- import { isColumnSortable, isColumnFilterable, createNextSorter, getColKey, isColumnSorting, isColumnResizable, clampValueFollowCSSRules } from '../utils';
9
+ import { isColumnSortable, isColumnFilterable, createNextSorter, getColKey, getNumberColWidth, isColumnSorting, isColumnResizable, clampValueFollowCSSRules } from '../utils';
10
10
  import { dataTableInjectionKey } from '../interface';
11
11
  import SelectionMenu from './SelectionMenu';
12
12
  function renderTitle(column) {
@@ -23,7 +23,7 @@ export default defineComponent({
23
23
  }
24
24
  },
25
25
  setup() {
26
- const { mergedClsPrefixRef, scrollXRef, fixedColumnLeftMapRef, fixedColumnRightMapRef, mergedCurrentPageRef, allRowsCheckedRef, someRowsCheckedRef, rowsRef, colsRef, mergedThemeRef, checkOptionsRef, mergedSortStateRef, componentId, mergedTableLayoutRef, headerCheckboxDisabledRef, sizeRef, onUnstableColumnResize, doUpdateResizableWidth, handleTableHeaderScroll, deriveNextSorter, doUncheckAll, doCheckAll
26
+ const { mergedClsPrefixRef, scrollXRef, fixedColumnLeftMapRef, fixedColumnRightMapRef, mergedCurrentPageRef, allRowsCheckedRef, someRowsCheckedRef, rowsRef, colsRef, mergedThemeRef, checkOptionsRef, mergedSortStateRef, componentId, mergedTableLayoutRef, headerCheckboxDisabledRef, sizeRef, onUnstableColumnResize, getResizableWidth, doUpdateResizableWidth, handleTableHeaderScroll, deriveNextSorter, doUncheckAll, doCheckAll
27
27
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
28
28
  } = inject(dataTableInjectionKey);
29
29
  const cellElsRef = ref({});
@@ -51,13 +51,25 @@ export default defineComponent({
51
51
  deriveNextSorter(nextSorter);
52
52
  }
53
53
  const resizeStartWidthMap = new Map();
54
+ function getColumnStartWidth(column) {
55
+ const actual = getCellActualWidth(column.key);
56
+ if (actual !== undefined && actual > 0)
57
+ return actual;
58
+ const resized = getResizableWidth(column.key);
59
+ if (resized !== undefined && resized > 0)
60
+ return resized;
61
+ return getNumberColWidth(column);
62
+ }
54
63
  function handleColumnResizeStart(column) {
55
- resizeStartWidthMap.set(column.key, getCellActualWidth(column.key));
64
+ resizeStartWidthMap.set(column.key, getColumnStartWidth(column));
56
65
  }
57
66
  function handleColumnResize(column, displacementX) {
58
- const startWidth = resizeStartWidthMap.get(column.key);
67
+ let startWidth = resizeStartWidthMap.get(column.key);
59
68
  if (startWidth === undefined) {
60
- return;
69
+ startWidth = getColumnStartWidth(column);
70
+ if (startWidth === undefined)
71
+ return;
72
+ resizeStartWidthMap.set(column.key, startWidth);
61
73
  }
62
74
  const widthAfterResize = startWidth + displacementX;
63
75
  const limitWidth = 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;
@@ -50,7 +50,7 @@ export const dataTableProps = Object.assign(Object.assign({}, useTheme.props), {
50
50
  }, paginationBehaviorOnFilter: {
51
51
  type: String,
52
52
  default: 'current'
53
- }, 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,
53
+ }, 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,
54
54
  // deprecated
55
55
  onPageChange: [Function, Array], onPageSizeChange: [Function, Array], onSorterChange: [Function, Array], onFiltersChange: [Function, Array], onCheckedRowKeysChange: [Function, Array] });
56
56
  export const dataTableInjectionKey = 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
  };
@@ -17,6 +17,7 @@ export function useResizable() {
17
17
  return {
18
18
  getResizableWidth,
19
19
  doUpdateResizableWidth,
20
- clearResizableWidth
20
+ clearResizableWidth,
21
+ resizableWidthsRef
21
22
  };
22
23
  }
@@ -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
  };
@@ -186,6 +186,7 @@ export function useSorter(props, { dataRelatedColsRef, filteredDataRef }) {
186
186
  sort,
187
187
  sortedDataRef,
188
188
  mergedSortStateRef,
189
- deriveNextSorter
189
+ deriveNextSorter,
190
+ doUpdateSorter
190
191
  };
191
192
  }
@@ -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;
@@ -128,7 +128,7 @@ export function useTableData(props, { dataRelatedColsRef }) {
128
128
  })
129
129
  : [];
130
130
  });
131
- const { sortedDataRef, deriveNextSorter, mergedSortStateRef, sort, clearSorter } = useSorter(props, {
131
+ const { sortedDataRef, deriveNextSorter, mergedSortStateRef, sort, clearSorter, doUpdateSorter } = useSorter(props, {
132
132
  dataRelatedColsRef,
133
133
  filteredDataRef
134
134
  });
@@ -299,6 +299,9 @@ export function useTableData(props, { dataRelatedColsRef }) {
299
299
  warn('data-table', '`filters` is not an object');
300
300
  }
301
301
  }
302
+ function restoreSortState(sortState) {
303
+ doUpdateSorter(sortState);
304
+ }
302
305
  return {
303
306
  treeMateRef,
304
307
  mergedCurrentPageRef: boundedMergedCurrentPageRef,
@@ -315,6 +318,7 @@ export function useTableData(props, { dataRelatedColsRef }) {
315
318
  doUpdatePageSize,
316
319
  doUpdatePage,
317
320
  onUnstableColumnResize,
321
+ restoreSortState,
318
322
  // exported methods
319
323
  filter,
320
324
  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,43 @@
1
+ const STORAGE_KEY_PREFIX = 'u-data-table:';
2
+ function getStorageKey(key) {
3
+ return `${STORAGE_KEY_PREFIX}${key}`;
4
+ }
5
+ export function loadTableState(localStorageKey) {
6
+ try {
7
+ const raw = localStorage.getItem(getStorageKey(localStorageKey));
8
+ if (!raw)
9
+ return null;
10
+ return JSON.parse(raw);
11
+ }
12
+ catch (_a) {
13
+ return null;
14
+ }
15
+ }
16
+ export function saveTableState(localStorageKey, state) {
17
+ try {
18
+ localStorage.setItem(getStorageKey(localStorageKey), JSON.stringify(state));
19
+ }
20
+ catch (_a) {
21
+ console.warn(`Could not set localStorage value for ${localStorageKey}`);
22
+ }
23
+ }
24
+ export function restoreSortStateFromStored(stored, dataRelatedCols) {
25
+ if (!(stored === null || stored === void 0 ? void 0 : stored.length))
26
+ return null;
27
+ const result = [];
28
+ for (const item of stored) {
29
+ const column = dataRelatedCols.find((col) => col.type !== 'selection' &&
30
+ col.type !== 'expand' &&
31
+ 'key' in col &&
32
+ col.key === item.columnKey &&
33
+ col.sorter !== undefined);
34
+ if (column === null || column === void 0 ? void 0 : column.sorter) {
35
+ result.push({
36
+ columnKey: item.columnKey,
37
+ order: item.order,
38
+ sorter: column.sorter
39
+ });
40
+ }
41
+ }
42
+ return result.length ? result : null;
43
+ }
@@ -79,15 +79,49 @@ export function clampValueFollowCSSRules(value, min, max) {
79
79
  return value;
80
80
  }
81
81
  export function createCustomWidthStyle(column, resizedWidth) {
82
+ var _a;
82
83
  if (resizedWidth !== undefined) {
84
+ const numWidth = depx(resizedWidth);
85
+ const minMaxColumn = column && 'minWidth' in column && 'maxWidth' in column
86
+ ? column
87
+ : null;
88
+ const clampedNum = minMaxColumn
89
+ ? clampValueFollowCSSRules(numWidth, minMaxColumn.minWidth, minMaxColumn.maxWidth)
90
+ : numWidth;
91
+ const clamped = formatLength(clampedNum);
83
92
  return {
84
- width: resizedWidth,
85
- minWidth: resizedWidth,
86
- maxWidth: resizedWidth
93
+ width: clamped,
94
+ minWidth: clamped,
95
+ maxWidth: clamped
87
96
  };
88
97
  }
89
- const width = getStringColWidth(column);
90
- const { minWidth, maxWidth } = column;
98
+ const explicitNum = (_a = getNumberColWidth(column)) !== null && _a !== void 0 ? _a : undefined;
99
+ const minWidth = column && 'minWidth' in column
100
+ ? column.minWidth
101
+ : undefined;
102
+ const maxWidth = column && 'maxWidth' in column
103
+ ? column.maxWidth
104
+ : undefined;
105
+ let widthNum = explicitNum;
106
+ if (widthNum === undefined &&
107
+ (minWidth !== undefined || maxWidth !== undefined)) {
108
+ widthNum = clampValueFollowCSSRules(maxWidth !== undefined
109
+ ? typeof maxWidth === 'number'
110
+ ? maxWidth
111
+ : parseFloat(maxWidth)
112
+ : minWidth !== undefined
113
+ ? typeof minWidth === 'number'
114
+ ? minWidth
115
+ : parseFloat(minWidth)
116
+ : 0, minWidth, maxWidth);
117
+ }
118
+ else if (widthNum !== undefined &&
119
+ (minWidth !== undefined || maxWidth !== undefined)) {
120
+ widthNum = clampValueFollowCSSRules(widthNum, minWidth, maxWidth);
121
+ }
122
+ const width = widthNum !== undefined
123
+ ? formatLength(widthNum)
124
+ : getStringColWidth(column);
91
125
  return {
92
126
  width,
93
127
  minWidth: formatLength(minWidth) || width,
@@ -1,4 +1,4 @@
1
- export { default as UIconBar, iconBarProps } from './src/IconBar';
2
- export type { IconBarProps } from './src/IconBar';
3
- export { default as UIconBarItem, iconBarItemProps } from './src/IconBarItem';
4
- export type { IconBarItemProps } from './src/IconBarItem';
1
+ export { default as UIconBar } from './src/IconBar';
2
+ export { default as UIconBarItem } from './src/IconBarItem';
3
+ export { iconBarProps, iconBarItemProps } from './src/interface';
4
+ export type { IconBarProps, IconBarItemProps } from './src/interface';
@@ -1,2 +1,3 @@
1
- export { default as UIconBar, iconBarProps } from './src/IconBar';
2
- export { default as UIconBarItem, iconBarItemProps } from './src/IconBarItem';
1
+ export { default as UIconBar } from './src/IconBar';
2
+ export { default as UIconBarItem } from './src/IconBarItem';
3
+ export { iconBarProps, iconBarItemProps } from './src/interface';