@veltra/desktop 1.0.8 → 1.0.10

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 (220) hide show
  1. package/dist/components/action/action-group.vue.d.ts +2 -2
  2. package/dist/components/action/action.vue.d.ts +3 -3
  3. package/dist/components/auto-complete/auto-complete.vue.d.ts +1 -1
  4. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  5. package/dist/components/batch-edit/batch-edit.vue.d.ts +2 -2
  6. package/dist/components/batch-edit/use-edit.js.map +1 -1
  7. package/dist/components/button/button.js.map +1 -1
  8. package/dist/components/button/button.vue.d.ts +1 -1
  9. package/dist/components/cascade/cascade.js +15 -13
  10. package/dist/components/cascade/cascade.js.map +1 -1
  11. package/dist/components/cascade/cascade.vue.d.ts +7 -7
  12. package/dist/components/cascade/node.js.map +1 -1
  13. package/dist/components/cascade/use-check.js +3 -2
  14. package/dist/components/cascade/use-check.js.map +1 -1
  15. package/dist/components/cascade/use-select.js +3 -3
  16. package/dist/components/cascade/use-select.js.map +1 -1
  17. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  18. package/dist/components/checkbox-group/checkbox-group.vue.d.ts +2 -2
  19. package/dist/components/date-panel/date-panel.js.map +1 -1
  20. package/dist/components/date-panel/date-panel.vue.d.ts +1 -1
  21. package/dist/components/date-picker/date-picker.js +9 -9
  22. package/dist/components/date-picker/date-picker.js.map +1 -1
  23. package/dist/components/date-picker/date-picker.vue.d.ts +1 -1
  24. package/dist/components/date-range-picker/date-range-picker.js +9 -9
  25. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  26. package/dist/components/date-range-picker/date-range-picker.vue.d.ts +1 -1
  27. package/dist/components/drawer/drawer.js.map +1 -1
  28. package/dist/components/empty/empty.vue.d.ts +1 -1
  29. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  30. package/dist/components/expression-editor/internal/editor-runtime/create-runtime.js.map +1 -1
  31. package/dist/components/expression-editor/internal/features/commands/register-command-packs.js.map +1 -1
  32. package/dist/components/expression-editor/internal/features/insertion/insertion-service.js.map +1 -1
  33. package/dist/components/expression-editor/use-decorators.js.map +1 -1
  34. package/dist/components/expression-editor/use-expression-drag-drop.js.map +1 -1
  35. package/dist/components/file-picker/file-picker.js.map +1 -1
  36. package/dist/components/file-picker/file-picker.vue.d.ts +1 -1
  37. package/dist/components/file-picker/helper.js +19 -7
  38. package/dist/components/file-picker/helper.js.map +1 -1
  39. package/dist/components/file-viewer/file-viewer.js +294 -0
  40. package/dist/components/file-viewer/file-viewer.js.map +1 -0
  41. package/dist/components/file-viewer/file-viewer.vue.d.ts +42 -0
  42. package/dist/components/file-viewer/helper.js +185 -0
  43. package/dist/components/file-viewer/helper.js.map +1 -0
  44. package/dist/components/file-viewer/index.d.ts +1 -0
  45. package/dist/components/file-viewer/previewers/docx-previewer.js +76 -0
  46. package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -0
  47. package/dist/components/file-viewer/previewers/image-previewer.js +64 -0
  48. package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -0
  49. package/dist/components/file-viewer/previewers/pdf-previewer.js +90 -0
  50. package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -0
  51. package/dist/components/file-viewer/previewers/sheet-previewer.js +175 -0
  52. package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -0
  53. package/dist/components/file-viewer/previewers/text-previewer.js +74 -0
  54. package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -0
  55. package/dist/components/file-viewer/previewers/video-previewer.js +62 -0
  56. package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -0
  57. package/dist/components/file-viewer/style.d.ts +1 -0
  58. package/dist/components/file-viewer/style.js +4 -0
  59. package/dist/components/file-viewer/style2.css +445 -0
  60. package/dist/components/form/form-model.js +2 -1
  61. package/dist/components/form/form-model.js.map +1 -1
  62. package/dist/components/grid/grid.js.map +1 -1
  63. package/dist/components/grid/use-responsive.js.map +1 -1
  64. package/dist/components/grid-input/grid-input.vue.d.ts +1 -1
  65. package/dist/components/index.d.ts +12 -9
  66. package/dist/components/input/input.vue.d.ts +3 -3
  67. package/dist/components/list/list.js.map +1 -1
  68. package/dist/components/loading/directive.js.map +1 -1
  69. package/dist/components/menu/menu-item.js.map +1 -1
  70. package/dist/components/message/message2.js.map +1 -1
  71. package/dist/components/multi-select/multi-select-option.js +14 -10
  72. package/dist/components/multi-select/multi-select-option.js.map +1 -1
  73. package/dist/components/multi-select/multi-select.js +16 -19
  74. package/dist/components/multi-select/multi-select.js.map +1 -1
  75. package/dist/components/multi-select/multi-select.vue.d.ts +4 -4
  76. package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +7 -7
  77. package/dist/components/notification/index.js.map +1 -1
  78. package/dist/components/notification/notification.vue.d.ts +1 -1
  79. package/dist/components/number-input/number-input.js.map +1 -1
  80. package/dist/components/number-input/number-input.vue.d.ts +1 -1
  81. package/dist/components/number-range-input/number-range-input.vue.d.ts +1 -1
  82. package/dist/components/palette/color-transform.js.map +1 -1
  83. package/dist/components/palette/di.js.map +1 -1
  84. package/dist/components/palette/palette-alpha.js +7 -10
  85. package/dist/components/palette/palette-alpha.js.map +1 -1
  86. package/dist/components/palette/palette-hue.js +5 -7
  87. package/dist/components/palette/palette-hue.js.map +1 -1
  88. package/dist/components/palette/palette-sv.js +8 -10
  89. package/dist/components/palette/palette-sv.js.map +1 -1
  90. package/dist/components/palette/palette.js +22 -24
  91. package/dist/components/palette/palette.js.map +1 -1
  92. package/dist/components/password-input/password-input.vue.d.ts +1 -1
  93. package/dist/components/pop-confirm/pop-confirm.vue.d.ts +2 -2
  94. package/dist/components/progress/progress.js +1 -1
  95. package/dist/components/progress/progress.js.map +1 -1
  96. package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
  97. package/dist/components/radio-group/radio-group.vue.d.ts +2 -2
  98. package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
  99. package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +1 -1
  100. package/dist/components/rich-text-editor/toolbar.js.map +1 -1
  101. package/dist/components/scroll/scroll.js.map +1 -1
  102. package/dist/components/select/select.js +14 -12
  103. package/dist/components/select/select.js.map +1 -1
  104. package/dist/components/select/select.vue.d.ts +3 -3
  105. package/dist/components/slider/slider-thumb.js +10 -13
  106. package/dist/components/slider/slider-thumb.js.map +1 -1
  107. package/dist/components/slider/slider.js +12 -15
  108. package/dist/components/slider/slider.js.map +1 -1
  109. package/dist/components/table/di.js.map +1 -1
  110. package/dist/components/table/node/row.d.ts +10 -1
  111. package/dist/components/table/node/row.js +9 -0
  112. package/dist/components/table/node/row.js.map +1 -1
  113. package/dist/components/table/table-body.js +25 -26
  114. package/dist/components/table/table-body.js.map +1 -1
  115. package/dist/components/table/table-cell.js +16 -9
  116. package/dist/components/table/table-cell.js.map +1 -1
  117. package/dist/components/table/table-row.js +77 -19
  118. package/dist/components/table/table-row.js.map +1 -1
  119. package/dist/components/table/table.js +75 -34
  120. package/dist/components/table/table.js.map +1 -1
  121. package/dist/components/table/table.vue.d.ts +2 -2
  122. package/dist/components/table/use-columns.js +4 -0
  123. package/dist/components/table/use-columns.js.map +1 -1
  124. package/dist/components/table/use-fixed-columns.js +27 -8
  125. package/dist/components/table/use-fixed-columns.js.map +1 -1
  126. package/dist/components/table/use-rows.js +2 -2
  127. package/dist/components/table/use-rows.js.map +1 -1
  128. package/dist/components/table/use-table.js +50 -3
  129. package/dist/components/table/use-table.js.map +1 -1
  130. package/dist/components/tabs/index.d.ts +3 -1
  131. package/dist/components/tabs/style2.css +170 -107
  132. package/dist/components/tabs/tabs-horizontal.js +133 -0
  133. package/dist/components/tabs/tabs-horizontal.js.map +1 -0
  134. package/dist/components/tabs/tabs-horizontal.vue.d.ts +40 -0
  135. package/dist/components/tabs/tabs-vertical.js +89 -0
  136. package/dist/components/tabs/tabs-vertical.js.map +1 -0
  137. package/dist/components/tabs/tabs-vertical.vue.d.ts +38 -0
  138. package/dist/components/tabs/tabs.js +75 -105
  139. package/dist/components/tabs/tabs.js.map +1 -1
  140. package/dist/components/tabs/tabs.vue.d.ts +9 -23
  141. package/dist/components/tabs/use-tabs-bar.js +105 -0
  142. package/dist/components/tabs/use-tabs-bar.js.map +1 -0
  143. package/dist/components/text/text.js.map +1 -1
  144. package/dist/components/textarea/textarea.js.map +1 -1
  145. package/dist/components/textarea/textarea.vue.d.ts +4 -4
  146. package/dist/components/theme/theme.js.map +1 -1
  147. package/dist/components/tip/tip.vue.d.ts +1 -1
  148. package/dist/components/tree/style2.css +45 -23
  149. package/dist/components/tree/tree-node.js +50 -35
  150. package/dist/components/tree/tree-node.js.map +1 -1
  151. package/dist/components/tree/tree-node2.js.map +1 -1
  152. package/dist/components/tree/tree.js +27 -20
  153. package/dist/components/tree/tree.js.map +1 -1
  154. package/dist/components/tree/tree.vue.d.ts +5 -5
  155. package/dist/components/tree/use-check.js +52 -14
  156. package/dist/components/tree/use-check.js.map +1 -1
  157. package/dist/components/tree/use-tree-nodes.js +51 -24
  158. package/dist/components/tree/use-tree-nodes.js.map +1 -1
  159. package/dist/components/tree-select/tree-select.vue.d.ts +7 -7
  160. package/dist/index.d.ts +57 -53
  161. package/dist/index.js +51 -48
  162. package/dist/types/file-viewer.d.ts +71 -0
  163. package/dist/types/index.d.ts +3 -2
  164. package/dist/types/tabs.d.ts +106 -14
  165. package/dist/types/tree.d.ts +6 -1
  166. package/package.json +32 -31
  167. package/src/components/cascade/cascade.vue +18 -18
  168. package/src/components/cascade/node.ts +4 -1
  169. package/src/components/cascade/use-check.ts +5 -4
  170. package/src/components/cascade/use-select.ts +4 -5
  171. package/src/components/date-picker/date-picker.vue +10 -9
  172. package/src/components/date-range-picker/date-range-picker.vue +12 -12
  173. package/src/components/file-picker/helper.ts +21 -10
  174. package/src/components/file-viewer/file-viewer.vue +311 -0
  175. package/src/components/file-viewer/helper.ts +193 -0
  176. package/src/components/file-viewer/index.ts +1 -0
  177. package/src/components/file-viewer/previewers/docx-previewer.vue +78 -0
  178. package/src/components/file-viewer/previewers/image-previewer.vue +64 -0
  179. package/src/components/file-viewer/previewers/pdf-previewer.vue +90 -0
  180. package/src/components/file-viewer/previewers/sheet-previewer.vue +210 -0
  181. package/src/components/file-viewer/previewers/text-previewer.vue +76 -0
  182. package/src/components/file-viewer/previewers/video-previewer.vue +72 -0
  183. package/src/components/file-viewer/style.scss +504 -0
  184. package/src/components/file-viewer/style.ts +4 -0
  185. package/src/components/index.ts +2 -0
  186. package/src/components/multi-select/multi-select-option.vue +16 -3
  187. package/src/components/multi-select/multi-select.vue +17 -9
  188. package/src/components/palette/di.ts +5 -3
  189. package/src/components/palette/palette-alpha.vue +7 -10
  190. package/src/components/palette/palette-hue.vue +5 -7
  191. package/src/components/palette/palette-sv.vue +12 -14
  192. package/src/components/palette/palette.vue +19 -21
  193. package/src/components/progress/progress.vue +1 -1
  194. package/src/components/select/select.vue +21 -19
  195. package/src/components/slider/slider-thumb.vue +11 -14
  196. package/src/components/slider/slider.vue +15 -15
  197. package/src/components/table/di.ts +58 -43
  198. package/src/components/table/node/row.ts +10 -1
  199. package/src/components/table/table-body.vue +28 -33
  200. package/src/components/table/table-cell.vue +17 -9
  201. package/src/components/table/table-row.tsx +83 -17
  202. package/src/components/table/table.vue +72 -45
  203. package/src/components/table/use-fixed-columns.ts +46 -12
  204. package/src/components/table/use-rows.ts +14 -3
  205. package/src/components/table/use-table.ts +27 -3
  206. package/src/components/tabs/index.ts +2 -0
  207. package/src/components/tabs/style.scss +219 -133
  208. package/src/components/tabs/tabs-horizontal.vue +128 -0
  209. package/src/components/tabs/tabs-vertical.vue +77 -0
  210. package/src/components/tabs/tabs.vue +56 -127
  211. package/src/components/tabs/use-tabs-bar.ts +119 -0
  212. package/src/components/tree/style.scss +74 -29
  213. package/src/components/tree/tree-node.vue +10 -4
  214. package/src/components/tree/tree.vue +39 -12
  215. package/src/components/tree/use-check.ts +79 -23
  216. package/src/components/tree/use-tree-nodes.ts +85 -34
  217. package/src/types/file-viewer.ts +69 -0
  218. package/src/types/index.ts +1 -0
  219. package/src/types/tabs.ts +113 -19
  220. package/src/types/tree.ts +6 -1
@@ -1,4 +1,4 @@
1
- import { ComponentProps } from "@veltra/utils";
1
+ import { ComponentProps, ComponentSize } from "@veltra/utils";
2
2
 
3
3
  //#region src/types/tabs.d.ts
4
4
  type TabItem = {
@@ -12,16 +12,105 @@ type TabItem = {
12
12
  */
13
13
  key: string; /** 是否禁用 */
14
14
  disabled?: boolean;
15
+ /**
16
+ * 单个标签是否可关闭
17
+ * @description 未显式设置时,沿用组件级 `closable` 属性
18
+ */
19
+ closable?: boolean;
15
20
  };
21
+ /** 水平标签栏(top/bottom)属性 */
22
+ interface TabsHorizontalProps {
23
+ /** 组件尺寸 */
24
+ size?: ComponentSize;
25
+ /** 当前激活的标签 key */
26
+ modelValue?: string;
27
+ /** 标签项 */
28
+ items: TabItem[];
29
+ /**
30
+ * 是否可关闭
31
+ * @description 作为所有 TabItem 未显式 `closable` 时的默认值;禁用项不显示关闭按钮
32
+ * @default false
33
+ */
34
+ closable?: boolean;
35
+ /**
36
+ * 是否填充父容器宽度
37
+ * @description 开启时 header 容器占满父容器宽度,背景完整铺开;tab-item 自身宽度保持不变
38
+ * @default false
39
+ */
40
+ block?: boolean;
41
+ /**
42
+ * 是否开启圆角胶囊风格
43
+ * @default false
44
+ */
45
+ rounded?: boolean;
46
+ /**
47
+ * 位置
48
+ * @default 'top'
49
+ */
50
+ position?: 'top' | 'bottom';
51
+ }
52
+ /** 垂直标签栏(left/right)属性 */
53
+ interface TabsVerticalProps {
54
+ /** 组件尺寸 */
55
+ size?: ComponentSize;
56
+ /** 当前激活的标签 key */
57
+ modelValue?: string;
58
+ /** 标签项 */
59
+ items: TabItem[];
60
+ /**
61
+ * 是否可关闭
62
+ * @description 作为所有 TabItem 未显式 `closable` 时的默认值;禁用项不显示关闭按钮
63
+ * @default false
64
+ */
65
+ closable?: boolean;
66
+ /**
67
+ * 是否开启圆角胶囊风格
68
+ * @default false
69
+ */
70
+ rounded?: boolean;
71
+ /**
72
+ * 位置
73
+ * @default 'left'
74
+ */
75
+ position?: 'left' | 'right';
76
+ }
77
+ /** 水平标签栏事件 */
78
+ interface TabsHorizontalEmits {
79
+ (e: 'update:modelValue', value: string): void;
80
+ (e: 'click', item: TabItem, index: number): void;
81
+ (e: 'close', item: TabItem, index: number): void;
82
+ }
83
+ /** 垂直标签栏事件 */
84
+ interface TabsVerticalEmits {
85
+ (e: 'update:modelValue', value: string): void;
86
+ (e: 'click', item: TabItem, index: number): void;
87
+ (e: 'close', item: TabItem, index: number): void;
88
+ }
16
89
  /** 标签页组件组件属性 */
17
90
  interface TabsProps extends ComponentProps {
91
+ /** 当前激活的标签 key */
18
92
  modelValue?: string;
19
93
  /** 标签项 */
20
94
  items: TabItem[];
95
+ /**
96
+ * 是否可关闭
97
+ * @description 作为所有 TabItem 未显式 `closable` 时的默认值;禁用项不显示关闭按钮
98
+ * @default false
99
+ */
100
+ closable?: boolean;
101
+ /**
102
+ * 是否填充父容器宽度(仅在 position=top/bottom 时生效)
103
+ * @description 开启时 header 容器占满父容器宽度,背景完整铺开;tab-item 自身宽度保持不变
104
+ * @default false
105
+ */
106
+ block?: boolean;
107
+ /**
108
+ * 是否开启圆角胶囊风格
109
+ * @default false
110
+ */
111
+ rounded?: boolean;
21
112
  /** 显示位置 */
22
113
  position?: 'left' | 'right' | 'top' | 'bottom';
23
- /** 是否可以动态编辑 */
24
- editable?: boolean;
25
114
  /**
26
115
  * 是否保活
27
116
  * @default false
@@ -30,19 +119,22 @@ interface TabsProps extends ComponentProps {
30
119
  }
31
120
  /** 标签页组件组件定义的事件 */
32
121
  interface TabsEmits {
33
- (e: 'update:modelValue', value: string | number): void;
34
- (e: 'update:items', items: TabItem[]): void;
35
- (e: 'update:active', active: string | number): void;
36
- (e: 'delete', item: TabItem, index: number): void;
37
- (e: 'create'): void;
122
+ (e: 'update:modelValue', value: string): void;
38
123
  (e: 'click', item: TabItem, index: number): void;
124
+ (e: 'close', item: TabItem, index: number): void;
39
125
  }
40
- /** 标签页组件组件暴露的属性和方法(组件内部使用) */
126
+ /** 标签页组件暴露的属性和方法(组件内部使用) */
41
127
  interface _TabsExposed {}
42
- /** 标签页组件组件暴露的属性和方法(组件外部使用, 引用的值会被自动解构) */
43
- interface TabsExposed {
44
- delete(key: number | string): void;
45
- }
128
+ /** 标签页组件暴露的属性和方法(组件外部使用, 引用的值会被自动解构) */
129
+ interface TabsExposed {}
130
+ /** 水平标签栏暴露的属性和方法(组件内部使用) */
131
+ interface _TabsHorizontalExposed {}
132
+ /** 水平标签栏暴露的属性和方法(组件外部使用) */
133
+ interface TabsHorizontalExposed {}
134
+ /** 垂直标签栏暴露的属性和方法(组件内部使用) */
135
+ interface _TabsVerticalExposed {}
136
+ /** 垂直标签栏暴露的属性和方法(组件外部使用) */
137
+ interface TabsVerticalExposed {}
46
138
  //#endregion
47
- export { TabItem, TabsEmits, TabsExposed, TabsProps, _TabsExposed };
139
+ export { TabItem, TabsEmits, TabsExposed, TabsHorizontalEmits, TabsHorizontalExposed, TabsHorizontalProps, TabsProps, TabsVerticalEmits, TabsVerticalExposed, TabsVerticalProps, _TabsExposed, _TabsHorizontalExposed, _TabsVerticalExposed };
48
140
  //# sourceMappingURL=tabs.d.ts.map
@@ -70,7 +70,12 @@ interface TreeEmit {
70
70
  }
71
71
  interface TreeNodeProps {
72
72
  node: TreeNode$1;
73
- measureElement?: (el: any) => void;
73
+ /**
74
+ * 虚拟项索引:对应 `nodes` 数组中的绝对位置。
75
+ * 需要传入以便在节点卸载时正确通知 `Virtualizer` 解绑,避免 size=0 的脏测量。
76
+ */
77
+ index?: number;
78
+ measureElement?: (index: number, el: Element | null) => void;
74
79
  }
75
80
  /** 树组件暴露的属性和方法(组件内部使用) */
76
81
  interface _TreeExposed {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veltra/desktop",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "files": [
5
5
  "dist",
6
6
  "src"
@@ -25,43 +25,44 @@
25
25
  "check-types": "tsc -p tsconfig.json --noEmit"
26
26
  },
27
27
  "dependencies": {
28
- "@cat-kit/core": "^1.0.1",
28
+ "@cat-kit/core": "^1.1.1",
29
+ "@cat-kit/excel": "^1.0.1",
29
30
  "@codemirror/lang-java": "^6.0.2",
30
31
  "@codemirror/lang-javascript": "^6.2.5",
31
32
  "@codemirror/lang-json": "^6.0.2",
32
33
  "@codemirror/lang-sql": "^6.10.0",
33
34
  "@codemirror/state": "^6.6.0",
34
- "@codemirror/view": "^6.41.0",
35
- "@lexical/clipboard": "^0.42.0",
36
- "@lexical/history": "^0.42.0",
37
- "@lexical/html": "^0.42.0",
38
- "@lexical/link": "^0.42.0",
39
- "@lexical/list": "^0.42.0",
40
- "@lexical/rich-text": "^0.42.0",
41
- "@lexical/selection": "^0.42.0",
42
- "@lexical/utils": "^0.42.0",
43
- "@veltra/compositions": "1.0.8",
44
- "@veltra/directives": "1.0.8",
45
- "@veltra/icons": "1.0.8",
46
- "@veltra/styles": "1.0.8",
47
- "@veltra/utils": "1.0.8",
35
+ "@codemirror/view": "^6.41.1",
36
+ "@embedpdf/core": "^2.14.1",
37
+ "@embedpdf/engines": "^2.14.1",
38
+ "@embedpdf/plugin-document-manager": "^2.14.1",
39
+ "@embedpdf/plugin-render": "^2.14.1",
40
+ "@embedpdf/plugin-scroll": "^2.14.1",
41
+ "@embedpdf/plugin-viewport": "^2.14.1",
42
+ "@lexical/clipboard": "^0.43.0",
43
+ "@lexical/history": "^0.43.0",
44
+ "@lexical/html": "^0.43.0",
45
+ "@lexical/link": "^0.43.0",
46
+ "@lexical/list": "^0.43.0",
47
+ "@lexical/rich-text": "^0.43.0",
48
+ "@lexical/selection": "^0.43.0",
49
+ "@lexical/utils": "^0.43.0",
50
+ "@veltra/compositions": "1.0.10",
51
+ "@veltra/directives": "1.0.10",
52
+ "@veltra/icons": "1.0.10",
53
+ "@veltra/styles": "1.0.10",
54
+ "@veltra/utils": "1.0.10",
55
+ "@visactor/vtable": "^1.26.0",
48
56
  "codemirror": "^6.0.2",
49
- "lexical": "^0.42.0"
50
- },
51
- "devDependencies": {
52
- "@tsdown/css": "^0.21.7",
53
- "sass-embedded": "^1.99.0",
54
- "tsdown": "^0.21.7",
55
- "unplugin-vue": "^7.1.1",
56
- "unplugin-vue-jsx": "^0.8.1",
57
- "vue-tsc": "^3.2.6"
57
+ "docx-preview": "^0.3.7",
58
+ "lexical": "^0.43.0"
58
59
  },
59
60
  "peerDependencies": {
60
- "@veltra/compositions": "1.0.8",
61
- "@veltra/directives": "1.0.8",
62
- "@veltra/icons": "1.0.8",
63
- "@veltra/styles": "1.0.8",
64
- "@veltra/utils": "1.0.8",
65
- "vue": "^3.5.0"
61
+ "@veltra/compositions": "1.0.10",
62
+ "@veltra/directives": "1.0.10",
63
+ "@veltra/icons": "1.0.10",
64
+ "@veltra/styles": "1.0.10",
65
+ "@veltra/utils": "1.0.10",
66
+ "vue": "^3.5.33"
66
67
  }
67
68
  }
@@ -105,7 +105,7 @@
105
105
 
106
106
  <script lang="ts" setup>
107
107
  import { Forest, o } from '@cat-kit/core'
108
- import { useFormComponent, useFormFallbackProps, useUpdateLock } from '@veltra/compositions'
108
+ import { useFormComponent, useFormFallbackProps, useUserAction } from '@veltra/compositions'
109
109
  import { ArrowDown, Close, Search } from '@veltra/icons/normal'
110
110
  import { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'
111
111
  import { computed, provide, shallowRef, triggerRef, watch } from 'vue'
@@ -185,8 +185,7 @@ const forest = computed(() => {
185
185
 
186
186
  const { dataMap } = useDataMap({ props, forest })
187
187
 
188
- // 初始化更新辅助
189
- const updater = useUpdateLock()
188
+ const { userAction, isUserActive } = useUserAction()
190
189
 
191
190
  const {
192
191
  displayedValue,
@@ -201,7 +200,7 @@ const {
201
200
  emit,
202
201
  dataMap,
203
202
  forest,
204
- updater,
203
+ isUserActive,
205
204
  dropdownRef
206
205
  })
207
206
 
@@ -212,29 +211,30 @@ const { hovered, tags, restTag, updateMultipleValue, handleCloseTag, checkItem,
212
211
  getPanelItemList,
213
212
  emit,
214
213
  dataMap,
215
- updater,
214
+ isUserActive,
216
215
  disabled,
217
216
  readonly
218
217
  })
219
218
 
219
+ const commitSingleSelect = userAction((item: CascadeNode) => {
220
+ if (!props.strict) {
221
+ updateSingleValue()
222
+ } else if (!item.children?.length) {
223
+ updateSingleValue()
224
+ }
225
+ })
226
+
220
227
  function handleClick(panelIndex: number, item: CascadeNode) {
221
- // 选择
222
228
  selectItem(panelIndex, item)
223
229
 
224
- // 更新数据
225
- !props.multiple &&
226
- updater.updateAndLock(() => {
227
- if (!props.strict) {
228
- updateSingleValue()
229
- } else if (!item.children?.length) {
230
- updateSingleValue()
231
- }
232
- })
230
+ if (!props.multiple) {
231
+ commitSingleSelect(item)
232
+ }
233
233
  }
234
234
 
235
- function handleCheck(item: CascadeNode, checked: boolean) {
236
- updater.updateAndLock(() => checkItem(item, checked))
237
- }
235
+ const handleCheck = userAction((item: CascadeNode, checked: boolean) => {
236
+ checkItem(item, checked)
237
+ })
238
238
 
239
239
  function handleClear() {
240
240
  if (props.multiple) {
@@ -1,7 +1,10 @@
1
1
  import { TreeNode } from '@cat-kit/core'
2
2
  import { shallowReactive } from 'vue'
3
3
 
4
- export class CascadeNode<T extends Record<string, any>> extends TreeNode<T, CascadeNode<T>> {
4
+ export class CascadeNode<T extends Record<string, any> = Record<string, any>> extends TreeNode<
5
+ T,
6
+ CascadeNode<T>
7
+ > {
5
8
  visible = true
6
9
 
7
10
  value: string
@@ -1,5 +1,4 @@
1
1
  import { dfs, type Forest } from '@cat-kit/core'
2
- import type { Updater } from '@veltra/compositions'
3
2
  import {
4
3
  computed,
5
4
  shallowRef,
@@ -19,7 +18,7 @@ interface CheckOptions {
19
18
  disabled: Ref<boolean>
20
19
  readonly: Ref<boolean>
21
20
  forest: Ref<Forest<Record<string, unknown>, any>>
22
- updater: Updater
21
+ isUserActive: () => boolean
23
22
  getPanelItemList: (data?: CascadeNode[]) => void
24
23
  }
25
24
 
@@ -34,7 +33,8 @@ interface UseCheckReturned {
34
33
  }
35
34
 
36
35
  export function useCheck(options: CheckOptions): UseCheckReturned {
37
- const { props, emit, dataMap, disabled, readonly, forest, updater, getPanelItemList } = options
36
+ const { props, emit, dataMap, disabled, readonly, forest, isUserActive, getPanelItemList } =
37
+ options
38
38
 
39
39
  const hovered = shallowRef(false)
40
40
 
@@ -119,7 +119,8 @@ export function useCheck(options: CheckOptions): UseCheckReturned {
119
119
  watch(
120
120
  [() => props.multiple, () => props.modelValue, forest],
121
121
  ([multiple]) => {
122
- multiple && updater.update(() => initMultipleCheck())
122
+ if (!multiple || isUserActive()) return
123
+ initMultipleCheck()
123
124
  },
124
125
  { immediate: false }
125
126
  )
@@ -1,5 +1,4 @@
1
1
  import { Forest } from '@cat-kit/core'
2
- import type { Updater } from '@veltra/compositions'
3
2
  import { createIncrease } from '@veltra/utils'
4
3
  import {
5
4
  computed,
@@ -23,7 +22,7 @@ import type {
23
22
  interface SelectOptions {
24
23
  props: CascadeProps
25
24
  emit: CascadeEmits
26
- updater: Updater
25
+ isUserActive: () => boolean
27
26
  forest: Ref<Forest<Record<string, unknown>, any>>
28
27
  dataMap: Ref<Map<string, CascadeNode>>
29
28
  dropdownRef: Ref<DropdownExposed | undefined>
@@ -42,7 +41,7 @@ interface UseSelectReturned {
42
41
  }
43
42
 
44
43
  export function useSelect(options: SelectOptions): UseSelectReturned {
45
- const { props, emit, dataMap, updater, dropdownRef, forest } = options
44
+ const { props, emit, dataMap, isUserActive, dropdownRef, forest } = options
46
45
 
47
46
  /** 选中的节点key */
48
47
  const selectedNodeKeys = shallowRef<string[]>([])
@@ -152,8 +151,8 @@ export function useSelect(options: SelectOptions): UseSelectReturned {
152
151
  watch(
153
152
  [() => props.multiple, () => props.modelValue, forest],
154
153
  ([multiple]) => {
155
- if (multiple) return
156
- updater.update(() => initSingleSelect())
154
+ if (multiple || isUserActive()) return
155
+ initSingleSelect()
157
156
  },
158
157
  { immediate: true }
159
158
  )
@@ -36,7 +36,7 @@
36
36
 
37
37
  <script lang="ts" setup>
38
38
  import { date, type Dater } from '@cat-kit/core'
39
- import { useFormComponent, useFormFallbackProps, useUpdateLock } from '@veltra/compositions'
39
+ import { useFormComponent, useFormFallbackProps, useUserAction } from '@veltra/compositions'
40
40
  import { Calendar } from '@veltra/icons/normal'
41
41
  import { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'
42
42
  import { computed, shallowRef, watch } from 'vue'
@@ -89,14 +89,13 @@ const formatStr = computed(() => {
89
89
 
90
90
  const currentDate = shallowRef<Dater>()
91
91
 
92
- const { update, updateAndLock } = useUpdateLock()
92
+ const { userAction, isUserActive } = useUserAction()
93
93
 
94
94
  watch(
95
95
  () => props.modelValue,
96
96
  (modelValue) => {
97
- update(() => {
98
- currentDate.value = modelValue ? date(modelValue) : undefined
99
- })
97
+ if (isUserActive()) return
98
+ currentDate.value = modelValue ? date(modelValue) : undefined
100
99
  },
101
100
  { immediate: true }
102
101
  )
@@ -105,11 +104,13 @@ const displayedValue = computed(() => {
105
104
  return currentDate.value?.format(formatStr.value) ?? ''
106
105
  })
107
106
 
107
+ const commitSelectedDate = userAction((date: Dater) => {
108
+ currentDate.value = date
109
+ emit('update:modelValue', date.format(formatStr.value))
110
+ })
111
+
108
112
  async function handleSelectDate(date: Dater) {
109
- await updateAndLock(() => {
110
- currentDate.value = date
111
- emit('update:modelValue', date.format(formatStr.value))
112
- })
113
+ await commitSelectedDate(date)
113
114
  dropdownRef.value?.close()
114
115
  }
115
116
 
@@ -61,8 +61,7 @@
61
61
 
62
62
  <script lang="ts" setup>
63
63
  import { date, type Dater } from '@cat-kit/core'
64
- import { useFormComponent, useFormFallbackProps } from '@veltra/compositions'
65
- import { useUpdateLock } from '@veltra/compositions'
64
+ import { useFormComponent, useFormFallbackProps, useUserAction } from '@veltra/compositions'
66
65
  import { Calendar, Close } from '@veltra/icons/normal'
67
66
  import { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'
68
67
  import { computed, shallowRef, watch } from 'vue'
@@ -102,7 +101,7 @@ const { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, prop
102
101
 
103
102
  const dropdownRef = shallowRef<DropdownExposed>()
104
103
 
105
- const { update, updateAndLock } = useUpdateLock()
104
+ const { userAction, isUserActive } = useUserAction()
106
105
 
107
106
  const currentRangeDate = shallowRef<[Dater, Dater]>()
108
107
 
@@ -126,20 +125,21 @@ const formatStr = computed(() => {
126
125
  watch(
127
126
  () => props.modelValue,
128
127
  (val) => {
129
- update(() => {
130
- if (val?.length === 2) {
131
- currentRangeDate.value = [date(val[0]), date(val[1])]
132
- }
133
- })
128
+ if (isUserActive()) return
129
+ if (val?.length === 2) {
130
+ currentRangeDate.value = [date(val[0]), date(val[1])]
131
+ }
134
132
  },
135
133
  { immediate: true }
136
134
  )
137
135
 
136
+ const commitSelectedRange = userAction((rangeDate: [Dater, Dater] | undefined) => {
137
+ currentRangeDate.value = rangeDate
138
+ emit('update:modelValue', rangeDate?.map((d) => d.format(formatStr.value)) as [string, string])
139
+ })
140
+
138
141
  async function handleSelect(rangeDate: [Dater, Dater] | undefined) {
139
- await updateAndLock(() => {
140
- currentRangeDate.value = rangeDate
141
- emit('update:modelValue', rangeDate?.map((d) => d.format(formatStr.value)) as [string, string])
142
- })
142
+ await commitSelectedRange(rangeDate)
143
143
  dropdownRef.value?.close()
144
144
  }
145
145
 
@@ -1,22 +1,33 @@
1
1
  /**
2
- * 校验文件是否匹配 accept 字符串 (仅支持 MIME 类型)
3
- * @param file 文件对象
4
- * @param accept 接受的文件类型,例如:image/*,application/pdf
2
+ * 校验文件是否匹配 accept 字符串(支持 MIME 类型与通配符)。
3
+ *
4
+ * 支持的形式:
5
+ * - `*` / `*\/*`:接受所有文件
6
+ * - `image/*`:MIME 类型组匹配
7
+ * - `application/pdf`:精确 MIME 类型
8
+ * - `.pdf` / `.docx`:扩展名匹配(不区分大小写)
9
+ *
10
+ * 多个值以逗号分隔,命中任一即视为匹配。
5
11
  */
6
12
  export function matchAccept(file: File, accept?: string): boolean {
7
13
  if (!accept) return true
8
14
 
9
15
  const fileType = file.type.toLowerCase()
10
- const acceptList = accept.split(',').map((item) => item.trim().toLowerCase())
16
+ const fileName = file.name.toLowerCase()
17
+ const acceptList = accept
18
+ .split(',')
19
+ .map((item) => item.trim().toLowerCase())
20
+ .filter(Boolean)
21
+
22
+ if (!acceptList.length) return true
11
23
 
12
24
  return acceptList.some((item) => {
25
+ if (item === '*' || item === '*/*') return true
26
+ if (item.startsWith('.')) return fileName.endsWith(item)
13
27
  if (item.endsWith('/*')) {
14
- // MIME 类型组匹配 (例如:image/*)
15
- const group = item.replace('/*', '')
16
- return fileType.startsWith(group)
17
- } else {
18
- // MIME 类型精确匹配
19
- return fileType === item
28
+ const group = item.slice(0, -2)
29
+ return fileType.startsWith(`${group}/`)
20
30
  }
31
+ return fileType === item
21
32
  })
22
33
  }