@veltra/desktop 1.1.15 → 1.1.19

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 (282) hide show
  1. package/dist/components/action/action-group.vue.d.ts +2 -2
  2. package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
  3. package/dist/components/action/action.js.map +1 -1
  4. package/dist/components/action/action.vue.d.ts +1 -1
  5. package/dist/components/action/style2.css +0 -4
  6. package/dist/components/auto-complete/auto-complete.js.map +1 -1
  7. package/dist/components/auto-complete/style.js +1 -1
  8. package/dist/components/auto-complete/use-keyboard.js.map +1 -1
  9. package/dist/components/auto-complete/use-suggestions.js.map +1 -1
  10. package/dist/components/badge/badge.js +1 -1
  11. package/dist/components/badge/badge.js.map +1 -1
  12. package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
  13. package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
  14. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  15. package/dist/components/batch-edit/helper.js.map +1 -1
  16. package/dist/components/batch-edit/style.js +1 -1
  17. package/dist/components/batch-edit/use-edit.js.map +1 -1
  18. package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
  19. package/dist/components/button/button-group.js.map +1 -1
  20. package/dist/components/button/button.js.map +1 -1
  21. package/dist/components/calendar/calendar.js.map +1 -1
  22. package/dist/components/calendar/utils.js.map +1 -1
  23. package/dist/components/card/card-action.js.map +1 -1
  24. package/dist/components/card/card-content.js.map +1 -1
  25. package/dist/components/card/card-cover.js.map +1 -1
  26. package/dist/components/card/card-header.js.map +1 -1
  27. package/dist/components/card/card.js.map +1 -1
  28. package/dist/components/cascade/cascade-panel-item.js.map +1 -1
  29. package/dist/components/cascade/cascade.js.map +1 -1
  30. package/dist/components/cascade/cascade.vue.d.ts +3 -3
  31. package/dist/components/cascade/node.js.map +1 -1
  32. package/dist/components/cascade/use-check.js.map +1 -1
  33. package/dist/components/cascade/use-data-map.js.map +1 -1
  34. package/dist/components/cascade/use-select.js +1 -1
  35. package/dist/components/cascade/use-select.js.map +1 -1
  36. package/dist/components/check-tag/check-tag.js.map +1 -1
  37. package/dist/components/checkbox/checkbox-button.js.map +1 -1
  38. package/dist/components/checkbox/checkbox-button.vue.d.ts +1 -1
  39. package/dist/components/checkbox/checkbox.js.map +1 -1
  40. package/dist/components/checkbox/style.js +1 -1
  41. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  42. package/dist/components/code-editor/code-editor.js.map +1 -1
  43. package/dist/components/collapse/collapse-item.js.map +1 -1
  44. package/dist/components/collapse/collapse.js.map +1 -1
  45. package/dist/components/condition-editor/components/condition-group.js +138 -103
  46. package/dist/components/condition-editor/components/condition-group.js.map +1 -1
  47. package/dist/components/condition-editor/components/condition-row.js +146 -95
  48. package/dist/components/condition-editor/components/condition-row.js.map +1 -1
  49. package/dist/components/condition-editor/condition-editor.js +18 -40
  50. package/dist/components/condition-editor/condition-editor.js.map +1 -1
  51. package/dist/components/condition-editor/condition-editor.vue.d.ts +0 -2
  52. package/dist/components/condition-editor/core/evaluator.d.ts +22 -0
  53. package/dist/components/condition-editor/core/evaluator.js +111 -50
  54. package/dist/components/condition-editor/core/evaluator.js.map +1 -1
  55. package/dist/components/condition-editor/core/operators.js.map +1 -1
  56. package/dist/components/condition-editor/index.d.ts +2 -1
  57. package/dist/components/condition-editor/style2.css +159 -82
  58. package/dist/components/context-menu/api.js.map +1 -1
  59. package/dist/components/context-menu/context-menu-item.js.map +1 -1
  60. package/dist/components/context-menu/context-menu.js.map +1 -1
  61. package/dist/components/context-menu/style.js +1 -1
  62. package/dist/components/date-panel/date-panel.js.map +1 -1
  63. package/dist/components/date-panel/date-panel.vue.d.ts +1 -1
  64. package/dist/components/date-panel/headers/day.js.map +1 -1
  65. package/dist/components/date-panel/headers/month.js.map +1 -1
  66. package/dist/components/date-panel/headers/year.js.map +1 -1
  67. package/dist/components/date-panel/panels/day.js.map +1 -1
  68. package/dist/components/date-panel/panels/month.js.map +1 -1
  69. package/dist/components/date-panel/panels/year.js.map +1 -1
  70. package/dist/components/date-panel/use-date-select.js.map +1 -1
  71. package/dist/components/date-panel/use-panel-date.js.map +1 -1
  72. package/dist/components/date-panel/use-panel.js.map +1 -1
  73. package/dist/components/date-picker/date-picker.js.map +1 -1
  74. package/dist/components/date-picker/date-picker.vue.d.ts +1 -1
  75. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  76. package/dist/components/date-range-picker/date-range-picker.vue.d.ts +1 -1
  77. package/dist/components/dialog/dialog.js.map +1 -1
  78. package/dist/components/dialog/style.js +2 -2
  79. package/dist/components/dialog/use-maximum.js.map +1 -1
  80. package/dist/components/drawer/drawer.js.map +1 -1
  81. package/dist/components/drawer/style.js +1 -1
  82. package/dist/components/dropdown/dropdown.js +1 -0
  83. package/dist/components/dropdown/dropdown.js.map +1 -1
  84. package/dist/components/dropdown/style.js +1 -1
  85. package/dist/components/empty/empty.js.map +1 -1
  86. package/dist/components/expression-editor/components/path-preview.js.map +1 -1
  87. package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
  88. package/dist/components/expression-editor/core/chip.js.map +1 -1
  89. package/dist/components/expression-editor/core/editor.js.map +1 -1
  90. package/dist/components/expression-editor/core/mention.js.map +1 -1
  91. package/dist/components/expression-editor/core/model.js.map +1 -1
  92. package/dist/components/expression-editor/di.js.map +1 -1
  93. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  94. package/dist/components/file-picker/file-picker.js.map +1 -1
  95. package/dist/components/file-picker/helper.js.map +1 -1
  96. package/dist/components/file-viewer/file-viewer.js.map +1 -1
  97. package/dist/components/file-viewer/helper.js.map +1 -1
  98. package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -1
  99. package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -1
  100. package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -1
  101. package/dist/components/file-viewer/previewers/pdf-viewport-scroll.js.map +1 -1
  102. package/dist/components/file-viewer/previewers/pdf-zoom-bridge.js.map +1 -1
  103. package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
  104. package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -1
  105. package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -1
  106. package/dist/components/float-button/float-button.js.map +1 -1
  107. package/dist/components/form/dynamic-form-model.js.map +1 -1
  108. package/dist/components/form/form-model.js.map +1 -1
  109. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
  110. package/dist/components/form/helper.js.map +1 -1
  111. package/dist/components/form/use-node-interceptor.js.map +1 -1
  112. package/dist/components/form-item/form-item.js.map +1 -1
  113. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js +2 -1
  114. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  115. package/dist/components/gantt-chart/gantt-chart.js.map +1 -1
  116. package/dist/components/grid/breakpoint.js.map +1 -1
  117. package/dist/components/grid/grid-item.js.map +1 -1
  118. package/dist/components/grid/grid.js.map +1 -1
  119. package/dist/components/grid/use-responsive.js.map +1 -1
  120. package/dist/components/grid-input/grid-input.js.map +1 -1
  121. package/dist/components/group-input/group-input.js.map +1 -1
  122. package/dist/components/group-input/use-group-items.js.map +1 -1
  123. package/dist/components/icon/icon.js.map +1 -1
  124. package/dist/components/index.d.ts +1 -0
  125. package/dist/components/index.js +4 -0
  126. package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
  127. package/dist/components/input/style.js +1 -1
  128. package/dist/components/kbd/kbd.js.map +1 -1
  129. package/dist/components/layout/layout-resizer.js.map +1 -1
  130. package/dist/components/layout/layout.js.map +1 -1
  131. package/dist/components/list/list-item.js.map +1 -1
  132. package/dist/components/list/list.js.map +1 -1
  133. package/dist/components/loading/directive.js.map +1 -1
  134. package/dist/components/loading/loading.js.map +1 -1
  135. package/dist/components/loading/style.js +1 -1
  136. package/dist/components/menu/helper.js.map +1 -1
  137. package/dist/components/menu/menu-item-collapsed.js.map +1 -1
  138. package/dist/components/menu/menu-item.js.map +1 -1
  139. package/dist/components/menu/menu-sub-collapsed.js.map +1 -1
  140. package/dist/components/menu/menu-sub.js.map +1 -1
  141. package/dist/components/menu/menu.js.map +1 -1
  142. package/dist/components/menu/use-menu-item.js.map +1 -1
  143. package/dist/components/menu/walk-menu-path.js.map +1 -1
  144. package/dist/components/message/helper.js.map +1 -1
  145. package/dist/components/message/message-box.js.map +1 -1
  146. package/dist/components/message/message.js.map +1 -1
  147. package/dist/components/message/message2.js.map +1 -1
  148. package/dist/components/message-confirm/message-confirm.js.map +1 -1
  149. package/dist/components/message-confirm/message-confirm2.js.map +1 -1
  150. package/dist/components/multi-select/multi-select-option.js.map +1 -1
  151. package/dist/components/multi-select/multi-select.js.map +1 -1
  152. package/dist/components/multi-select/multi-select.vue.d.ts +2 -2
  153. package/dist/components/multi-select/style.js +1 -1
  154. package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
  155. package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +2 -2
  156. package/dist/components/multi-tree-select/style.js +1 -1
  157. package/dist/components/node-render/node-render.js.map +1 -1
  158. package/dist/components/notification/index.js.map +1 -1
  159. package/dist/components/notification/notification.js.map +1 -1
  160. package/dist/components/number/number.js.map +1 -1
  161. package/dist/components/number-input/number-input.js.map +1 -1
  162. package/dist/components/number-range-input/number-range-input.js.map +1 -1
  163. package/dist/components/paginator/paginator.js.map +1 -1
  164. package/dist/components/palette/color-transform.js.map +1 -1
  165. package/dist/components/palette/palette-alpha.js.map +1 -1
  166. package/dist/components/palette/palette-color-switch.js.map +1 -1
  167. package/dist/components/palette/palette-hue.js.map +1 -1
  168. package/dist/components/palette/palette-sv.js.map +1 -1
  169. package/dist/components/palette/palette.js.map +1 -1
  170. package/dist/components/palette/use-hsv.js.map +1 -1
  171. package/dist/components/password-input/password-input.js.map +1 -1
  172. package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
  173. package/dist/components/pop-confirm/pop-confirm.vue.d.ts +1 -1
  174. package/dist/components/progress/progress.js.map +1 -1
  175. package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
  176. package/dist/components/radio/radio.js.map +1 -1
  177. package/dist/components/radio/style.js +1 -1
  178. package/dist/components/radio-group/radio-group.js.map +1 -1
  179. package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
  180. package/dist/components/rich-text-editor/toolbar.js.map +1 -1
  181. package/dist/components/scroll/scroll-bar.js +2 -0
  182. package/dist/components/scroll/scroll-bar.js.map +1 -1
  183. package/dist/components/scroll/scroll.js.map +1 -1
  184. package/dist/components/select/select.js.map +1 -1
  185. package/dist/components/select/select.vue.d.ts +2 -2
  186. package/dist/components/select/use-keyboard.js.map +1 -1
  187. package/dist/components/select/use-options.js.map +1 -1
  188. package/dist/components/slider/slider-thumb.js.map +1 -1
  189. package/dist/components/slider/slider.js +1 -1
  190. package/dist/components/slider/slider.js.map +1 -1
  191. package/dist/components/slider/use-slider.js.map +1 -1
  192. package/dist/components/steps/steps.js.map +1 -1
  193. package/dist/components/steps/steps.vue.d.ts +3 -3
  194. package/dist/components/switch/switch.js.map +1 -1
  195. package/dist/components/table/di.js.map +1 -1
  196. package/dist/components/table/node/col.js.map +1 -1
  197. package/dist/components/table/node/row.js.map +1 -1
  198. package/dist/components/table/table-body.js.map +1 -1
  199. package/dist/components/table/table-cell.js.map +1 -1
  200. package/dist/components/table/table-foot.js.map +1 -1
  201. package/dist/components/table/table-head.js.map +1 -1
  202. package/dist/components/table/table-row.js.map +1 -1
  203. package/dist/components/table/table.js.map +1 -1
  204. package/dist/components/table/use-check.js.map +1 -1
  205. package/dist/components/table/use-col-resize.js.map +1 -1
  206. package/dist/components/table/use-columns.js.map +1 -1
  207. package/dist/components/table/use-fixed-columns.js.map +1 -1
  208. package/dist/components/table/use-rows.js.map +1 -1
  209. package/dist/components/table/use-table.js.map +1 -1
  210. package/dist/components/table-editor/table-editor.js.map +1 -1
  211. package/dist/components/tabs/style.js +1 -1
  212. package/dist/components/tabs/tabs-horizontal.js.map +1 -1
  213. package/dist/components/tabs/tabs-horizontal.vue.d.ts +2 -2
  214. package/dist/components/tabs/tabs-vertical.js.map +1 -1
  215. package/dist/components/tabs/tabs-vertical.vue.d.ts +2 -2
  216. package/dist/components/tabs/tabs.js.map +1 -1
  217. package/dist/components/tabs/tabs.vue.d.ts +2 -2
  218. package/dist/components/tabs/use-tabs-bar.js.map +1 -1
  219. package/dist/components/tag/tag.js.map +1 -1
  220. package/dist/components/text/text.js.map +1 -1
  221. package/dist/components/textarea/style.js +1 -1
  222. package/dist/components/textarea/textarea.js.map +1 -1
  223. package/dist/components/textarea/textarea.vue.d.ts +1 -1
  224. package/dist/components/textarea/utils.js.map +1 -1
  225. package/dist/components/theme/schema.js.map +1 -1
  226. package/dist/components/theme/theme.js.map +1 -1
  227. package/dist/components/tip/tip.js.map +1 -1
  228. package/dist/components/tip/tip.vue.d.ts +1 -1
  229. package/dist/components/tip/use-nest.js.map +1 -1
  230. package/dist/components/tree/tree-node.js.map +1 -1
  231. package/dist/components/tree/tree-node2.js.map +1 -1
  232. package/dist/components/tree/tree.js.map +1 -1
  233. package/dist/components/tree/tree.vue.d.ts +1 -1
  234. package/dist/components/tree/use-check.js.map +1 -1
  235. package/dist/components/tree/use-filter.js.map +1 -1
  236. package/dist/components/tree/use-select.js.map +1 -1
  237. package/dist/components/tree/use-tree-nodes.js.map +1 -1
  238. package/dist/components/tree-select/tree-select.js.map +1 -1
  239. package/dist/components/tree-select/tree-select.vue.d.ts +2 -2
  240. package/dist/components/watermark/watermark.js.map +1 -1
  241. package/dist/index.d.ts +4 -3
  242. package/dist/index.js +2 -1
  243. package/dist/install.js.map +1 -1
  244. package/dist/types/batch-edit.d.ts +2 -2
  245. package/dist/types/condition-editor.d.ts +21 -9
  246. package/dist/types/index.d.ts +2 -2
  247. package/package.json +13 -16
  248. package/src/components/action/style.scss +0 -6
  249. package/src/components/auto-complete/style.scss +0 -1
  250. package/src/components/auto-complete/style.ts +1 -1
  251. package/src/components/badge/badge.vue +1 -1
  252. package/src/components/batch-edit/style.ts +1 -1
  253. package/src/components/button/style.scss +1 -1
  254. package/src/components/cascade/use-select.ts +8 -6
  255. package/src/components/checkbox/style.ts +1 -1
  256. package/src/components/collapse/__test__/collapse.test.ts +3 -3
  257. package/src/components/condition-editor/components/condition-group.vue +118 -87
  258. package/src/components/condition-editor/components/condition-row.vue +137 -89
  259. package/src/components/condition-editor/condition-editor.vue +19 -48
  260. package/src/components/condition-editor/core/evaluator.ts +143 -57
  261. package/src/components/condition-editor/index.ts +6 -0
  262. package/src/components/condition-editor/style.scss +189 -102
  263. package/src/components/context-menu/style.ts +1 -1
  264. package/src/components/dialog/style.ts +2 -2
  265. package/src/components/drawer/style.ts +1 -1
  266. package/src/components/dropdown/style.ts +1 -1
  267. package/src/components/expression-editor/style.scss +1 -1
  268. package/src/components/form-item/form-item.vue +4 -9
  269. package/src/components/input/style.ts +1 -1
  270. package/src/components/loading/style.ts +1 -1
  271. package/src/components/menu/style.scss +1 -1
  272. package/src/components/message/style.scss +1 -1
  273. package/src/components/multi-select/style.ts +1 -1
  274. package/src/components/multi-tree-select/style.ts +1 -1
  275. package/src/components/number-input/__test__/number-input.test.ts +1 -1
  276. package/src/components/radio/style.ts +1 -1
  277. package/src/components/slider/slider.vue +1 -1
  278. package/src/components/table/di.ts +1 -1
  279. package/src/components/tabs/style.ts +1 -1
  280. package/src/components/textarea/style.ts +1 -1
  281. package/src/types/batch-edit.ts +2 -2
  282. package/src/types/condition-editor.ts +22 -8
@@ -8,11 +8,11 @@ type __VLS_Slots = {
8
8
  default?: () => VNode[];
9
9
  };
10
10
  declare const __VLS_base: _$vue.DefineComponent<ActionGroupProps, _ActionGroupExposed, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<ActionGroupProps> & Readonly<{}>, {
11
- type: _$_veltra_utils0.ColorType;
12
- max: number;
13
11
  size: "small" | "default" | "large";
12
+ type: _$_veltra_utils0.ColorType;
14
13
  text: boolean;
15
14
  circle: boolean;
15
+ max: number;
16
16
  loading: boolean;
17
17
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
18
18
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1 +1 @@
1
- {"version":3,"file":"action-group.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/action/action-group.vue"],"sourcesContent":["<template>\n <component v-for=\"node of getSlotsNodes()\" :key=\"node.key\" :is=\"node\" />\n</template>\n\n<script lang=\"tsx\" setup>\nimport { MoreFilled } from '@veltra/icons/normal'\nimport { bem, extractNormalVNodes } from '@veltra/utils'\nimport { cloneVNode, provide, shallowRef, type VNode } from 'vue'\n\nimport type { _ActionGroupExposed, ActionGroupProps } from '../../types'\nimport { UButton } from '../button'\nimport { UTip } from '../tip'\nimport { ActionDIKey } from './di'\n\ndefineOptions({\n name: 'ActionGroup',\n inheritAttrs: false\n})\n\nconst props = withDefaults(defineProps<ActionGroupProps>(), {\n max: 3,\n loading: false,\n circle: false,\n size: 'small',\n text: true,\n type: 'primary'\n})\n\nconst cls = bem('action-group')\n\nconst slots = defineSlots<{\n default?: () => VNode[]\n}>()\n\nfunction isInDropdownNode(node: VNode): boolean {\n const p = node.props as Record<string, unknown> | null\n if (!p) return false\n const v = p.inDropdown ?? p['in-dropdown']\n return v === true || v === '' || v === 'true'\n}\n\nconst tipVisible = shallowRef(false)\n\nfunction closeTip() {\n tipVisible.value = false\n}\n\nfunction withSeparators(nodes: VNode[]) {\n return nodes.flatMap((node, index) => {\n if (index === 0) return [node]\n\n return [\n <i\n key={`separator-${index}`}\n class={cls.e('separator')}\n aria-hidden=\"true\"\n />,\n node\n ]\n })\n}\n\nfunction getSlotsNodes() {\n const nodes = slots.default?.()\n if (!nodes) return []\n\n const extracted = extractNormalVNodes(nodes).filter(\n (node) => (node.type as { name?: string } | null | undefined)?.name === 'Action'\n )\n\n const visible: VNode[] = []\n const fixedHidden: VNode[] = []\n\n extracted.forEach((node) => {\n if (isInDropdownNode(node)) {\n fixedHidden.push(node)\n } else {\n visible.push(node)\n }\n })\n\n const willOverflow = visible.length > props.max\n const overflow = willOverflow ? visible.splice(props.max - 1) : []\n\n const hiddenNodes = [...overflow, ...fixedHidden]\n\n const dropdownNodes = hiddenNodes.map((node) =>\n cloneVNode(node, { inDropdown: true, circle: false })\n )\n\n const dropdown = hiddenNodes.length ? (\n <UTip\n direction=\"bottom\"\n alignment=\"end\"\n trigger=\"click\"\n class={cls.e('dropdown')}\n visible={tipVisible.value}\n onUpdate:visible={(val: boolean) => {\n tipVisible.value = val\n }}\n >\n {{\n content: () => dropdownNodes,\n default: () => (\n <UButton\n class={cls.e('more')}\n type={props.type}\n size={props.size}\n text={props.text}\n circle\n icon={MoreFilled}\n />\n )\n }}\n </UTip>\n ) : null\n\n return withSeparators(dropdown ? [...visible, dropdown] : visible)\n}\n\nprovide(ActionDIKey, {\n groupProps: props,\n closeTip\n})\n\ndefineExpose<_ActionGroupExposed>({\n closeTip\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBA,MAAM,QAAQ;EASd,MAAM,MAAM,IAAI,eAAc;EAE9B,MAAM,QAAQ,UAAA;EAId,SAAS,iBAAiB,MAAsB;GAC9C,MAAM,IAAI,KAAK;AACf,OAAI,CAAC,EAAG,QAAO;GACf,MAAM,IAAI,EAAE,cAAc,EAAE;AAC5B,UAAO,MAAM,QAAQ,MAAM,MAAM,MAAM;;EAGzC,MAAM,aAAa,WAAW,MAAK;EAEnC,SAAS,WAAW;AAClB,cAAW,QAAQ;;EAGrB,SAAS,eAAe,OAAgB;AACtC,UAAO,MAAM,SAAS,MAAM,UAAU;AACpC,QAAI,UAAU,EAAG,QAAO,CAAC,KAAI;AAE7B,WAAO,CAAA,YAAA,KAAA;KAAA,OAEE,aAAa;KAAO,SAClB,IAAI,EAAE,YAAY;KAAA,eAAA;KAAA,EAAA,KAAA,EAG3B,KACF;KACD;;EAGH,SAAS,gBAAgB;GACvB,MAAM,QAAQ,MAAM,WAAU;AAC9B,OAAI,CAAC,MAAO,QAAO,EAAC;GAEpB,MAAM,YAAY,oBAAoB,MAAM,CAAC,QAC1C,SAAU,KAAK,MAA+C,SAAS,SAC1E;GAEA,MAAM,UAAmB,EAAC;GAC1B,MAAM,cAAuB,EAAC;AAE9B,aAAU,SAAS,SAAS;AAC1B,QAAI,iBAAiB,KAAK,CACxB,aAAY,KAAK,KAAI;QAErB,SAAQ,KAAK,KAAI;KAEpB;GAKD,MAAM,cAAc,CAAC,GAHA,QAAQ,SAAS,MAAM,MACZ,QAAQ,OAAO,MAAM,MAAM,EAAE,GAAG,EAAC,EAE/B,GAAG,YAAW;GAEhD,MAAM,gBAAgB,YAAY,KAAK,SACrC,WAAW,MAAM;IAAE,YAAY;IAAM,QAAQ;IAAO,CACtD,CAAA;GAEA,MAAM,WAAW,YAAY,SAAM,YAAA,WAAA;IAAA,aAAA;IAAA,aAAA;IAAA,WAAA;IAAA,SAKxB,IAAI,EAAE,WAAW;IAAA,WACf,WAAW;IAAK,qBACN,QAAiB;AAClC,gBAAW,QAAQ;;IACpB,EAAA;IAGC,eAAe;IACf,eAAS,YAAA,aAAA;KAAA,SAEE,IAAI,EAAE,OAAO;KAAA,QACd,MAAM;KAAI,QACV,MAAM;KAAI,QACV,MAAM;KAAI,UAAA;KAAA,QAEV;KAAU,EAAA,KAAA;IAEpB,CAAA,GAGF;AAEJ,UAAO,eAAe,WAAW,CAAC,GAAG,SAAS,SAAS,GAAG,QAAO;;AAGnE,UAAQ,aAAa;GACnB,YAAY;GACZ;GACD,CAAA;AAED,WAAkC,EAChC,UACD,CAAA;;2BA9HC,mBAAwE,UAAA,MAAA,WAA9C,eAAa,GAArB,SAAI;wBAAtB,YAAwE,wBAAR,KAAI,EAAA,EAAxB,KAAK,KAAK,KAAA,CAAA"}
1
+ {"version":3,"file":"action-group.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/action/action-group.vue"],"sourcesContent":["<template>\n <component v-for=\"node of getSlotsNodes()\" :key=\"node.key\" :is=\"node\" />\n</template>\n\n<script lang=\"tsx\" setup>\nimport { MoreFilled } from '@veltra/icons/normal'\nimport { bem, extractNormalVNodes } from '@veltra/utils'\nimport { cloneVNode, provide, shallowRef, type VNode } from 'vue'\n\nimport type { _ActionGroupExposed, ActionGroupProps } from '../../types'\nimport { UButton } from '../button'\nimport { UTip } from '../tip'\nimport { ActionDIKey } from './di'\n\ndefineOptions({\n name: 'ActionGroup',\n inheritAttrs: false\n})\n\nconst props = withDefaults(defineProps<ActionGroupProps>(), {\n max: 3,\n loading: false,\n circle: false,\n size: 'small',\n text: true,\n type: 'primary'\n})\n\nconst cls = bem('action-group')\n\nconst slots = defineSlots<{\n default?: () => VNode[]\n}>()\n\nfunction isInDropdownNode(node: VNode): boolean {\n const p = node.props as Record<string, unknown> | null\n if (!p) return false\n const v = p.inDropdown ?? p['in-dropdown']\n return v === true || v === '' || v === 'true'\n}\n\nconst tipVisible = shallowRef(false)\n\nfunction closeTip() {\n tipVisible.value = false\n}\n\nfunction withSeparators(nodes: VNode[]) {\n return nodes.flatMap((node, index) => {\n if (index === 0) return [node]\n\n return [\n <i\n key={`separator-${index}`}\n class={cls.e('separator')}\n aria-hidden=\"true\"\n />,\n node\n ]\n })\n}\n\nfunction getSlotsNodes() {\n const nodes = slots.default?.()\n if (!nodes) return []\n\n const extracted = extractNormalVNodes(nodes).filter(\n (node) => (node.type as { name?: string } | null | undefined)?.name === 'Action'\n )\n\n const visible: VNode[] = []\n const fixedHidden: VNode[] = []\n\n extracted.forEach((node) => {\n if (isInDropdownNode(node)) {\n fixedHidden.push(node)\n } else {\n visible.push(node)\n }\n })\n\n const willOverflow = visible.length > props.max\n const overflow = willOverflow ? visible.splice(props.max - 1) : []\n\n const hiddenNodes = [...overflow, ...fixedHidden]\n\n const dropdownNodes = hiddenNodes.map((node) =>\n cloneVNode(node, { inDropdown: true, circle: false })\n )\n\n const dropdown = hiddenNodes.length ? (\n <UTip\n direction=\"bottom\"\n alignment=\"end\"\n trigger=\"click\"\n class={cls.e('dropdown')}\n visible={tipVisible.value}\n onUpdate:visible={(val: boolean) => {\n tipVisible.value = val\n }}\n >\n {{\n content: () => dropdownNodes,\n default: () => (\n <UButton\n class={cls.e('more')}\n type={props.type}\n size={props.size}\n text={props.text}\n circle\n icon={MoreFilled}\n />\n )\n }}\n </UTip>\n ) : null\n\n return withSeparators(dropdown ? [...visible, dropdown] : visible)\n}\n\nprovide(ActionDIKey, {\n groupProps: props,\n closeTip\n})\n\ndefineExpose<_ActionGroupExposed>({\n closeTip\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBA,MAAM,QAAQ;EASd,MAAM,MAAM,IAAI,eAAc;EAE9B,MAAM,QAAQ,UAAA;EAId,SAAS,iBAAiB,MAAsB;GAC9C,MAAM,IAAI,KAAK;GACf,IAAI,CAAC,GAAG,OAAO;GACf,MAAM,IAAI,EAAE,cAAc,EAAE;GAC5B,OAAO,MAAM,QAAQ,MAAM,MAAM,MAAM;;EAGzC,MAAM,aAAa,WAAW,MAAK;EAEnC,SAAS,WAAW;GAClB,WAAW,QAAQ;;EAGrB,SAAS,eAAe,OAAgB;GACtC,OAAO,MAAM,SAAS,MAAM,UAAU;IACpC,IAAI,UAAU,GAAG,OAAO,CAAC,KAAI;IAE7B,OAAO,CAAA,YAAA,KAAA;KAAA,OAEE,aAAa;KAAO,SAClB,IAAI,EAAE,YAAY;KAAA,eAAA;KAAA,EAAA,KAAA,EAG3B,KACF;KACD;;EAGH,SAAS,gBAAgB;GACvB,MAAM,QAAQ,MAAM,WAAU;GAC9B,IAAI,CAAC,OAAO,OAAO,EAAC;GAEpB,MAAM,YAAY,oBAAoB,MAAM,CAAC,QAC1C,SAAU,KAAK,MAA+C,SAAS,SAC1E;GAEA,MAAM,UAAmB,EAAC;GAC1B,MAAM,cAAuB,EAAC;GAE9B,UAAU,SAAS,SAAS;IAC1B,IAAI,iBAAiB,KAAK,EACxB,YAAY,KAAK,KAAI;SAErB,QAAQ,KAAK,KAAI;KAEpB;GAKD,MAAM,cAAc,CAAC,GAHA,QAAQ,SAAS,MAAM,MACZ,QAAQ,OAAO,MAAM,MAAM,EAAE,GAAG,EAAC,EAE/B,GAAG,YAAW;GAEhD,MAAM,gBAAgB,YAAY,KAAK,SACrC,WAAW,MAAM;IAAE,YAAY;IAAM,QAAQ;IAAO,CACtD,CAAA;GAEA,MAAM,WAAW,YAAY,SAAM,YAAA,WAAA;IAAA,aAAA;IAAA,aAAA;IAAA,WAAA;IAAA,SAKxB,IAAI,EAAE,WAAW;IAAA,WACf,WAAW;IAAK,qBACN,QAAiB;KAClC,WAAW,QAAQ;;IACpB,EAAA;IAGC,eAAe;IACf,eAAS,YAAA,aAAA;KAAA,SAEE,IAAI,EAAE,OAAO;KAAA,QACd,MAAM;KAAI,QACV,MAAM;KAAI,QACV,MAAM;KAAI,UAAA;KAAA,QAEV;KAAU,EAAA,KAAA;IAEpB,CAAA,GAGF;GAEJ,OAAO,eAAe,WAAW,CAAC,GAAG,SAAS,SAAS,GAAG,QAAO;;EAGnE,QAAQ,aAAa;GACnB,YAAY;GACZ;GACD,CAAA;EAED,SAAkC,EAChC,UACD,CAAA;;2BA9HC,mBAAwE,UAAA,MAAA,WAA9C,eAAa,GAArB,SAAI;wBAAtB,YAAwE,wBAAR,KAAI,EAAA,EAAxB,KAAK,KAAK,KAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"action.js","names":["$attrs"],"sources":["../../../src/components/action/action.vue"],"sourcesContent":["<template>\n <u-pop-confirm\n v-if=\"needConfirm\"\n title=\"确认执行此操作吗?\"\n style=\"display: inline-block\"\n direction=\"left\"\n @confirm=\"handleConfirm\"\n >\n <template #reference>\n <u-button\n :class=\"cls.b\"\n :loading\n :circle\n :propagate=\"false\"\n v-bind=\"{ ...buttonProps, ...$attrs }\"\n >\n <slot />\n </u-button>\n </template>\n </u-pop-confirm>\n\n <u-button\n v-else\n :class=\"cls.b\"\n :loading\n :circle\n :propagate=\"false\"\n v-bind=\"{ ...buttonProps, ...$attrs }\"\n @click=\"handleRun\"\n >\n <slot />\n </u-button>\n</template>\n\n<script lang=\"ts\" setup>\nimport { o } from '@cat-kit/core'\nimport { bem } from '@veltra/utils'\nimport { computed, inject } from 'vue'\n\nimport type { ActionEmits, ActionProps } from '../../types'\nimport { UButton } from '../button'\nimport { UPopConfirm } from '../pop-confirm'\nimport { ActionDIKey } from './di'\n\ndefineOptions({\n name: 'Action',\n inheritAttrs: false\n})\n\n// 这里所有可继承自 `<u-action-group>` 的默认值都强制为 `undefined`,\n// 否则 Vue 对 Boolean 类型 prop 的默认值(false)会让 `??` 兜底始终失效\nconst props = withDefaults(defineProps<ActionProps>(), {\n inDropdown: false,\n loading: undefined,\n circle: undefined,\n text: undefined,\n size: undefined,\n type: undefined\n})\n\nconst ctx = inject(ActionDIKey, undefined)\n\nconst size = computed(() => props.size ?? ctx?.groupProps.size ?? 'small')\nconst text = computed(() => props.text ?? ctx?.groupProps.text ?? true)\nconst type = computed(() => props.type ?? ctx?.groupProps.type ?? 'primary')\n\nconst loading = computed(() => {\n return props.loading ?? ctx?.groupProps.loading\n})\n\n// 下拉菜单中的操作项强制非圆形以呈现完整文本,否则跟随用户/分组配置\nconst circle = computed(() => {\n if (props.inDropdown) return false\n return props.circle ?? ctx?.groupProps.circle\n})\n\nconst buttonProps = computed(() => {\n return {\n ...o(props as Record<string, any>).omit([\n 'needConfirm',\n 'loading',\n 'circle',\n 'propagate',\n 'size',\n 'text',\n 'type',\n 'inDropdown'\n ]),\n size: size.value,\n text: text.value,\n type: type.value\n }\n})\n\nconst emit = defineEmits<ActionEmits>()\n\nconst cls = bem('action')\n\nfunction handleConfirm() {\n handleRun()\n}\n\nfunction handleRun() {\n emit('run')\n\n if (props.inDropdown) {\n ctx?.closeTip()\n }\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmDA,MAAM,QAAQ;EASd,MAAM,MAAM,OAAO,aAAa,KAAA,EAAS;EAEzC,MAAM,OAAO,eAAe,MAAM,QAAQ,KAAK,WAAW,QAAQ,QAAO;EACzE,MAAM,OAAO,eAAe,MAAM,QAAQ,KAAK,WAAW,QAAQ,KAAI;EACtE,MAAM,OAAO,eAAe,MAAM,QAAQ,KAAK,WAAW,QAAQ,UAAS;EAE3E,MAAM,UAAU,eAAe;AAC7B,UAAO,MAAM,WAAW,KAAK,WAAW;IACzC;EAGD,MAAM,SAAS,eAAe;AAC5B,OAAI,MAAM,WAAY,QAAO;AAC7B,UAAO,MAAM,UAAU,KAAK,WAAW;IACxC;EAED,MAAM,cAAc,eAAe;AACjC,UAAO;IACL,GAAG,EAAE,MAA6B,CAAC,KAAK;KACtC;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACD,CAAC;IACF,MAAM,KAAK;IACX,MAAM,KAAK;IACX,MAAM,KAAK;IACb;IACD;EAED,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,SAAQ;EAExB,SAAS,gBAAgB;AACvB,cAAU;;EAGZ,SAAS,YAAY;AACnB,QAAK,MAAK;AAEV,OAAI,MAAM,WACR,MAAK,UAAS;;;UAxGR,QAAA,eAAA,WAAA,EADR,YAkBgB,MAAA,YAAA,EAAA;;IAhBd,OAAM;IACN,OAAA,EAAA,WAAA,gBAA6B;IAC7B,WAAU;IACT,WAAS;;IAEC,WAAS,cASP,CARX,YAQW,MAAA,YAAA,EARX,WAQW;KAPR,OAAO,MAAA,IAAG,CAAC;KACX,SAAA,QAAA;KACA,QAAA,OAAA;KACA,WAAW;;QACC,YAAA;KAAW,GAAKA,KAAAA;KAAM,CAAA,EAAA;4BAE3B,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA;;;;;;;;uBAKd,YAUW,MAAA,YAAA,EAVX,WAUW;;IARR,OAAO,MAAA,IAAG,CAAC;IACX,SAAA,QAAA;IACA,QAAA,OAAA;IACA,WAAW;;OACC,YAAA;IAAW,GAAKA,KAAAA;IAAM,EAAA,EAClC,SAAO,WAAS,CAAA,EAAA;2BAET,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"action.js","names":["$attrs"],"sources":["../../../src/components/action/action.vue"],"sourcesContent":["<template>\n <u-pop-confirm\n v-if=\"needConfirm\"\n title=\"确认执行此操作吗?\"\n style=\"display: inline-block\"\n direction=\"left\"\n @confirm=\"handleConfirm\"\n >\n <template #reference>\n <u-button\n :class=\"cls.b\"\n :loading\n :circle\n :propagate=\"false\"\n v-bind=\"{ ...buttonProps, ...$attrs }\"\n >\n <slot />\n </u-button>\n </template>\n </u-pop-confirm>\n\n <u-button\n v-else\n :class=\"cls.b\"\n :loading\n :circle\n :propagate=\"false\"\n v-bind=\"{ ...buttonProps, ...$attrs }\"\n @click=\"handleRun\"\n >\n <slot />\n </u-button>\n</template>\n\n<script lang=\"ts\" setup>\nimport { o } from '@cat-kit/core'\nimport { bem } from '@veltra/utils'\nimport { computed, inject } from 'vue'\n\nimport type { ActionEmits, ActionProps } from '../../types'\nimport { UButton } from '../button'\nimport { UPopConfirm } from '../pop-confirm'\nimport { ActionDIKey } from './di'\n\ndefineOptions({\n name: 'Action',\n inheritAttrs: false\n})\n\n// 这里所有可继承自 `<u-action-group>` 的默认值都强制为 `undefined`,\n// 否则 Vue 对 Boolean 类型 prop 的默认值(false)会让 `??` 兜底始终失效\nconst props = withDefaults(defineProps<ActionProps>(), {\n inDropdown: false,\n loading: undefined,\n circle: undefined,\n text: undefined,\n size: undefined,\n type: undefined\n})\n\nconst ctx = inject(ActionDIKey, undefined)\n\nconst size = computed(() => props.size ?? ctx?.groupProps.size ?? 'small')\nconst text = computed(() => props.text ?? ctx?.groupProps.text ?? true)\nconst type = computed(() => props.type ?? ctx?.groupProps.type ?? 'primary')\n\nconst loading = computed(() => {\n return props.loading ?? ctx?.groupProps.loading\n})\n\n// 下拉菜单中的操作项强制非圆形以呈现完整文本,否则跟随用户/分组配置\nconst circle = computed(() => {\n if (props.inDropdown) return false\n return props.circle ?? ctx?.groupProps.circle\n})\n\nconst buttonProps = computed(() => {\n return {\n ...o(props as Record<string, any>).omit([\n 'needConfirm',\n 'loading',\n 'circle',\n 'propagate',\n 'size',\n 'text',\n 'type',\n 'inDropdown'\n ]),\n size: size.value,\n text: text.value,\n type: type.value\n }\n})\n\nconst emit = defineEmits<ActionEmits>()\n\nconst cls = bem('action')\n\nfunction handleConfirm() {\n handleRun()\n}\n\nfunction handleRun() {\n emit('run')\n\n if (props.inDropdown) {\n ctx?.closeTip()\n }\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmDA,MAAM,QAAQ;EASd,MAAM,MAAM,OAAO,aAAa,KAAA,EAAS;EAEzC,MAAM,OAAO,eAAe,MAAM,QAAQ,KAAK,WAAW,QAAQ,QAAO;EACzE,MAAM,OAAO,eAAe,MAAM,QAAQ,KAAK,WAAW,QAAQ,KAAI;EACtE,MAAM,OAAO,eAAe,MAAM,QAAQ,KAAK,WAAW,QAAQ,UAAS;EAE3E,MAAM,UAAU,eAAe;GAC7B,OAAO,MAAM,WAAW,KAAK,WAAW;IACzC;EAGD,MAAM,SAAS,eAAe;GAC5B,IAAI,MAAM,YAAY,OAAO;GAC7B,OAAO,MAAM,UAAU,KAAK,WAAW;IACxC;EAED,MAAM,cAAc,eAAe;GACjC,OAAO;IACL,GAAG,EAAE,MAA4B,CAAE,KAAK;KACtC;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACD,CAAA;IACD,MAAM,KAAK;IACX,MAAM,KAAK;IACX,MAAM,KAAK;IACb;IACD;EAED,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,SAAQ;EAExB,SAAS,gBAAgB;GACvB,WAAU;;EAGZ,SAAS,YAAY;GACnB,KAAK,MAAK;GAEV,IAAI,MAAM,YACR,KAAK,UAAS;;;UAxGR,QAAA,eAAA,WAAA,EADR,YAkBgB,MAAA,YAAA,EAAA;;IAhBd,OAAM;IACN,OAAA,EAAA,WAAA,gBAAA;IACA,WAAU;IACT,WAAS;;IAEC,WAAS,cASP,CARX,YAQW,MAAA,YAAA,EARX,WAQW;KAPR,OAAO,MAAA,IAAA,CAAI;KACX,SAAA,QAAA;KACA,QAAA,OAAA;KACA,WAAW;;QACC,YAAA;KAAW,GAAKA,KAAAA;KAAM,CAAA,EAAA;4BAE3B,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA;;;;;;;;uBAKd,YAUW,MAAA,YAAA,EAVX,WAUW;;IARR,OAAO,MAAA,IAAA,CAAI;IACX,SAAA,QAAA;IACA,QAAA,OAAA;IACA,WAAW;;OACC,YAAA;IAAW,GAAKA,KAAAA;IAAM,EAAA,EAClC,SAAO,WAAS,CAAA,EAAA;2BAET,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA"}
@@ -15,8 +15,8 @@ declare const __VLS_base: _$vue.DefineComponent<ActionProps, {}, {}, {}, {}, _$v
15
15
  }, string, _$vue.PublicProps, Readonly<ActionProps> & Readonly<{
16
16
  onRun?: (() => any) | undefined;
17
17
  }>, {
18
- type: ButtonType;
19
18
  size: _$_veltra_utils0.ComponentSize;
19
+ type: ButtonType;
20
20
  text: boolean;
21
21
  circle: boolean;
22
22
  loading: boolean;
@@ -53,10 +53,6 @@
53
53
  margin-left: 0;
54
54
  }
55
55
 
56
- .u-action-group__dropdownu-tip__content {
57
- padding: 4px;
58
- }
59
-
60
56
  .u-action {
61
57
  flex-shrink: 0;
62
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auto-complete.js","names":[],"sources":["../../../src/components/auto-complete/auto-complete.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n trigger=\"click\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled)]\"\n ref=\"dropdownRef\"\n v-model:visible=\"dropdownVisible\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n :disabled=\"disabled\"\n >\n <!-- 触发 -->\n <template #trigger>\n <!-- 单选 -->\n <u-input\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n v-model=\"model\"\n @keydown=\"handleInputKeydown\"\n >\n <template #suffix v-if=\"slots.suffix\">\n <slot name=\"suffix\" />\n </template>\n\n <template #prefix v-if=\"slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n </u-input>\n </template>\n\n <!-- 下拉内容 -->\n <template #content>\n <u-scroll tag=\"ul\" :class=\"cls.e('options')\" ref=\"scrollRef\">\n <li\n v-if=\"cachedSuggestion\"\n :class=\"[optionClass, bem.is('active', isCachedActive)]\"\n @click=\"handleSelectCachedOption(cachedSuggestion)\"\n v-ripple=\"cls.e('ripple')\"\n :data-key=\"cachedSuggestion\"\n :key=\"cachedSuggestion\"\n >\n <slot v-bind=\"{ option: cachedSuggestion, index: -1 }\">\n {{ cachedSuggestion }}\n </slot>\n </li>\n\n <li\n v-for=\"(option, index) of suggestions\"\n :class=\"[\n optionClass,\n bem.is('selected', option === model),\n bem.is('active', isActiveOption(index))\n ]\"\n @click=\"handleSelect(option)\"\n v-ripple=\"cls.e('ripple')\"\n :data-key=\"option\"\n :key=\"option\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ option }}\n </slot>\n </li>\n </u-scroll>\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ model || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { vRipple } from '@veltra/directives'\nimport { bem, FORM_EMPTY_CONTENT, scrollIntoContainerView } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport type { AutoCompleteEmits, AutoCompleteProps, _AutoCompleteExposed } from '../../types'\nimport type { DropdownExposed, ScrollExposed } from '../../types'\nimport { UDropdown } from '../dropdown'\nimport { UInput } from '../input'\nimport { UScroll } from '../scroll'\nimport { useKeyboard } from './use-keyboard'\nimport { useSuggestions } from './use-suggestions'\n\ndefineOptions({ name: 'AutoComplete', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<AutoCompleteProps>(), {\n placeholder: '请输入',\n clearable: true,\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<AutoCompleteEmits>()\n\nconst slots = defineSlots<{\n default?: (props: { option: string; index: number }) => any\n suffix?: () => any\n prefix?: () => any\n}>()\n\n// 当前输入框的值\nconst model = defineModel<string>()\n\nconst cls = bem('auto-complete')\n\nconst optionClass = cls.e('option')\n\nconst { formProps } = injectFormContext()\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\nconst dropdownVisible = shallowRef(false)\nconst scrollRef = shallowRef<ScrollExposed>()\n\nwatch(scrollRef, (scroll) => {\n if (scroll && model.value !== undefined) {\n const li = scroll.contentRef!.querySelector(`li[data-key=\"${model.value}\"]`) as HTMLElement\n li && scrollIntoContainerView(li, scroll.containerRef ?? null)\n }\n})\n\nconst { suggestions, appendedSuggestions, cachedSuggestion } = useSuggestions({ props, model })\n\nconst keyboardOptions = computed(() => {\n const currentSuggestions = suggestions.value\n return cachedSuggestion.value\n ? [cachedSuggestion.value, ...currentSuggestions]\n : currentSuggestions\n})\n\nconst { point, handleKeydown } = useKeyboard({\n options: keyboardOptions,\n dropdownVisible,\n getDefaultIndex: (options) => {\n if (!options.length) return -1\n if (model.value) {\n const matchIndex = options.indexOf(model.value)\n if (matchIndex > -1) return matchIndex\n }\n return 0\n },\n onSelect: (option, index) => {\n if (cachedSuggestion.value && index === 0) {\n handleSelectCachedOption(option)\n return\n }\n handleSelect(option)\n }\n})\n\nconst isCachedActive = computed(() => !!cachedSuggestion.value && point.value === 0)\n\nconst isActiveOption = (index: number) => {\n const offset = cachedSuggestion.value ? 1 : 0\n return point.value === index + offset\n}\n\nconst handleInputKeydown = (event: KeyboardEvent) => {\n if (!dropdownVisible.value && event.key === 'Enter' && cachedSuggestion.value) {\n event.preventDefault()\n event.stopPropagation()\n handleSelectCachedOption(cachedSuggestion.value)\n return\n }\n handleKeydown(event)\n}\n\nwatch([point, keyboardOptions], ([currentPoint, options]) => {\n if (!scrollRef.value || currentPoint < 0) return\n const currentOption = options[currentPoint]\n if (!currentOption) return\n const target = scrollRef.value.contentRef?.querySelector(\n `li[data-key=\"${currentOption}\"]`\n ) as HTMLElement | null\n if (target) {\n scrollIntoContainerView(target, scrollRef.value.containerRef ?? null)\n }\n})\n\n/** 选中选项 */\nconst handleSelect = (option: string) => {\n model.value = option\n dropdownRef.value?.close()\n saveCache()\n emit('select', option)\n}\n\nfunction saveCache() {\n if (!model.value) return\n appendedSuggestions.value = [...appendedSuggestions.value, model.value]\n}\n\nconst handleSelectCachedOption = (cachedOption: string) => {\n appendedSuggestions.value = [...appendedSuggestions.value, cachedOption]\n dropdownRef.value?.close()\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"auto-complete.js","names":[],"sources":["../../../src/components/auto-complete/auto-complete.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n trigger=\"click\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled)]\"\n ref=\"dropdownRef\"\n v-model:visible=\"dropdownVisible\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n :disabled=\"disabled\"\n >\n <!-- 触发 -->\n <template #trigger>\n <!-- 单选 -->\n <u-input\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n v-model=\"model\"\n @keydown=\"handleInputKeydown\"\n >\n <template #suffix v-if=\"slots.suffix\">\n <slot name=\"suffix\" />\n </template>\n\n <template #prefix v-if=\"slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n </u-input>\n </template>\n\n <!-- 下拉内容 -->\n <template #content>\n <u-scroll tag=\"ul\" :class=\"cls.e('options')\" ref=\"scrollRef\">\n <li\n v-if=\"cachedSuggestion\"\n :class=\"[optionClass, bem.is('active', isCachedActive)]\"\n @click=\"handleSelectCachedOption(cachedSuggestion)\"\n v-ripple=\"cls.e('ripple')\"\n :data-key=\"cachedSuggestion\"\n :key=\"cachedSuggestion\"\n >\n <slot v-bind=\"{ option: cachedSuggestion, index: -1 }\">\n {{ cachedSuggestion }}\n </slot>\n </li>\n\n <li\n v-for=\"(option, index) of suggestions\"\n :class=\"[\n optionClass,\n bem.is('selected', option === model),\n bem.is('active', isActiveOption(index))\n ]\"\n @click=\"handleSelect(option)\"\n v-ripple=\"cls.e('ripple')\"\n :data-key=\"option\"\n :key=\"option\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ option }}\n </slot>\n </li>\n </u-scroll>\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ model || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { vRipple } from '@veltra/directives'\nimport { bem, FORM_EMPTY_CONTENT, scrollIntoContainerView } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport type { AutoCompleteEmits, AutoCompleteProps, _AutoCompleteExposed } from '../../types'\nimport type { DropdownExposed, ScrollExposed } from '../../types'\nimport { UDropdown } from '../dropdown'\nimport { UInput } from '../input'\nimport { UScroll } from '../scroll'\nimport { useKeyboard } from './use-keyboard'\nimport { useSuggestions } from './use-suggestions'\n\ndefineOptions({ name: 'AutoComplete', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<AutoCompleteProps>(), {\n placeholder: '请输入',\n clearable: true,\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<AutoCompleteEmits>()\n\nconst slots = defineSlots<{\n default?: (props: { option: string; index: number }) => any\n suffix?: () => any\n prefix?: () => any\n}>()\n\n// 当前输入框的值\nconst model = defineModel<string>()\n\nconst cls = bem('auto-complete')\n\nconst optionClass = cls.e('option')\n\nconst { formProps } = injectFormContext()\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\nconst dropdownVisible = shallowRef(false)\nconst scrollRef = shallowRef<ScrollExposed>()\n\nwatch(scrollRef, (scroll) => {\n if (scroll && model.value !== undefined) {\n const li = scroll.contentRef!.querySelector(`li[data-key=\"${model.value}\"]`) as HTMLElement\n li && scrollIntoContainerView(li, scroll.containerRef ?? null)\n }\n})\n\nconst { suggestions, appendedSuggestions, cachedSuggestion } = useSuggestions({ props, model })\n\nconst keyboardOptions = computed(() => {\n const currentSuggestions = suggestions.value\n return cachedSuggestion.value\n ? [cachedSuggestion.value, ...currentSuggestions]\n : currentSuggestions\n})\n\nconst { point, handleKeydown } = useKeyboard({\n options: keyboardOptions,\n dropdownVisible,\n getDefaultIndex: (options) => {\n if (!options.length) return -1\n if (model.value) {\n const matchIndex = options.indexOf(model.value)\n if (matchIndex > -1) return matchIndex\n }\n return 0\n },\n onSelect: (option, index) => {\n if (cachedSuggestion.value && index === 0) {\n handleSelectCachedOption(option)\n return\n }\n handleSelect(option)\n }\n})\n\nconst isCachedActive = computed(() => !!cachedSuggestion.value && point.value === 0)\n\nconst isActiveOption = (index: number) => {\n const offset = cachedSuggestion.value ? 1 : 0\n return point.value === index + offset\n}\n\nconst handleInputKeydown = (event: KeyboardEvent) => {\n if (!dropdownVisible.value && event.key === 'Enter' && cachedSuggestion.value) {\n event.preventDefault()\n event.stopPropagation()\n handleSelectCachedOption(cachedSuggestion.value)\n return\n }\n handleKeydown(event)\n}\n\nwatch([point, keyboardOptions], ([currentPoint, options]) => {\n if (!scrollRef.value || currentPoint < 0) return\n const currentOption = options[currentPoint]\n if (!currentOption) return\n const target = scrollRef.value.contentRef?.querySelector(\n `li[data-key=\"${currentOption}\"]`\n ) as HTMLElement | null\n if (target) {\n scrollIntoContainerView(target, scrollRef.value.containerRef ?? null)\n }\n})\n\n/** 选中选项 */\nconst handleSelect = (option: string) => {\n model.value = option\n dropdownRef.value?.close()\n saveCache()\n emit('select', option)\n}\n\nfunction saveCache() {\n if (!model.value) return\n appendedSuggestions.value = [...appendedSuggestions.value, model.value]\n}\n\nconst handleSelectCachedOption = (cachedOption: string) => {\n appendedSuggestions.value = [...appendedSuggestions.value, cachedOption]\n dropdownRef.value?.close()\n}\n</script>\n"],"mappings":"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"}
@@ -5,4 +5,4 @@ import "../input/style.js";
5
5
  import "../tag/style.js";
6
6
  import "./style2.css";
7
7
  import "@veltra/directives/ripple/style.js";
8
- import "@veltra/styles/anime/zoom-in.scss";
8
+ import "@veltra/styles/transitions/zoom-in.scss";
@@ -1 +1 @@
1
- {"version":3,"file":"use-keyboard.js","names":[],"sources":["../../../src/components/auto-complete/use-keyboard.ts"],"sourcesContent":["import { type ComputedRef, type Ref, ref, watch } from 'vue'\n\ninterface Options {\n options: ComputedRef<string[]>\n dropdownVisible: Ref<boolean>\n onSelect: (option: string, index: number) => void\n getDefaultIndex?: (options: string[]) => number\n}\n\ninterface UseKeyboardReturned {\n point: Ref<number>\n handleKeydown: (event: KeyboardEvent) => void\n}\n\nexport function useKeyboard(options: Options): UseKeyboardReturned {\n const { options: selectableOptions, dropdownVisible, onSelect, getDefaultIndex } = options\n const keys = new Set(['ArrowUp', 'ArrowDown', 'Enter', 'Escape'])\n\n const point = ref(-1)\n\n const resolveDefaultPoint = () => {\n if (!selectableOptions.value.length) return -1\n if (getDefaultIndex) {\n const index = getDefaultIndex(selectableOptions.value)\n if (index >= 0 && index < selectableOptions.value.length) {\n return index\n }\n }\n return 0\n }\n\n watch(\n [selectableOptions, dropdownVisible],\n ([value, visible]) => {\n if (!value.length || !visible) {\n point.value = -1\n return\n }\n if (point.value === -1 || point.value >= value.length) {\n point.value = resolveDefaultPoint()\n }\n },\n { immediate: true }\n )\n\n function moveToNext() {\n if (!selectableOptions.value.length) return\n if (!dropdownVisible.value) {\n dropdownVisible.value = true\n point.value = resolveDefaultPoint()\n return\n }\n const nextPoint = point.value + 1\n point.value = nextPoint < selectableOptions.value.length ? nextPoint : 0\n }\n\n function moveToPrev() {\n if (!selectableOptions.value.length) return\n if (!dropdownVisible.value) {\n dropdownVisible.value = true\n point.value = selectableOptions.value.length - 1\n return\n }\n const prevPoint = point.value - 1\n point.value = prevPoint > -1 ? prevPoint : selectableOptions.value.length - 1\n }\n\n function selectOption() {\n if (!dropdownVisible.value) {\n if (selectableOptions.value.length) {\n dropdownVisible.value = true\n if (point.value === -1) {\n point.value = resolveDefaultPoint()\n }\n }\n return\n }\n const suggestion = selectableOptions.value[point.value]\n if (suggestion && point.value > -1) {\n onSelect(suggestion, point.value)\n }\n dropdownVisible.value = false\n }\n\n function closeDropdown() {\n dropdownVisible.value = false\n }\n\n const keyHandlerMap = {\n ArrowUp: moveToPrev,\n ArrowDown: moveToNext,\n Enter: selectOption,\n Escape: closeDropdown\n }\n\n function handleKeydown(event: KeyboardEvent) {\n const { key } = event\n if (!keys.has(key)) return\n event.preventDefault()\n event.stopPropagation()\n keyHandlerMap[key]()\n }\n\n return {\n point,\n\n handleKeydown\n }\n}\n"],"mappings":";;AAcA,SAAgB,YAAY,SAAuC;CACjE,MAAM,EAAE,SAAS,mBAAmB,iBAAiB,UAAU,oBAAoB;CACnF,MAAM,OAAO,IAAI,IAAI;EAAC;EAAW;EAAa;EAAS;EAAS,CAAC;CAEjE,MAAM,QAAQ,IAAI,GAAG;CAErB,MAAM,4BAA4B;AAChC,MAAI,CAAC,kBAAkB,MAAM,OAAQ,QAAO;AAC5C,MAAI,iBAAiB;GACnB,MAAM,QAAQ,gBAAgB,kBAAkB,MAAM;AACtD,OAAI,SAAS,KAAK,QAAQ,kBAAkB,MAAM,OAChD,QAAO;;AAGX,SAAO;;AAGT,OACE,CAAC,mBAAmB,gBAAgB,GACnC,CAAC,OAAO,aAAa;AACpB,MAAI,CAAC,MAAM,UAAU,CAAC,SAAS;AAC7B,SAAM,QAAQ;AACd;;AAEF,MAAI,MAAM,UAAU,MAAM,MAAM,SAAS,MAAM,OAC7C,OAAM,QAAQ,qBAAqB;IAGvC,EAAE,WAAW,MAAM,CACpB;CAED,SAAS,aAAa;AACpB,MAAI,CAAC,kBAAkB,MAAM,OAAQ;AACrC,MAAI,CAAC,gBAAgB,OAAO;AAC1B,mBAAgB,QAAQ;AACxB,SAAM,QAAQ,qBAAqB;AACnC;;EAEF,MAAM,YAAY,MAAM,QAAQ;AAChC,QAAM,QAAQ,YAAY,kBAAkB,MAAM,SAAS,YAAY;;CAGzE,SAAS,aAAa;AACpB,MAAI,CAAC,kBAAkB,MAAM,OAAQ;AACrC,MAAI,CAAC,gBAAgB,OAAO;AAC1B,mBAAgB,QAAQ;AACxB,SAAM,QAAQ,kBAAkB,MAAM,SAAS;AAC/C;;EAEF,MAAM,YAAY,MAAM,QAAQ;AAChC,QAAM,QAAQ,YAAY,KAAK,YAAY,kBAAkB,MAAM,SAAS;;CAG9E,SAAS,eAAe;AACtB,MAAI,CAAC,gBAAgB,OAAO;AAC1B,OAAI,kBAAkB,MAAM,QAAQ;AAClC,oBAAgB,QAAQ;AACxB,QAAI,MAAM,UAAU,GAClB,OAAM,QAAQ,qBAAqB;;AAGvC;;EAEF,MAAM,aAAa,kBAAkB,MAAM,MAAM;AACjD,MAAI,cAAc,MAAM,QAAQ,GAC9B,UAAS,YAAY,MAAM,MAAM;AAEnC,kBAAgB,QAAQ;;CAG1B,SAAS,gBAAgB;AACvB,kBAAgB,QAAQ;;CAG1B,MAAM,gBAAgB;EACpB,SAAS;EACT,WAAW;EACX,OAAO;EACP,QAAQ;EACT;CAED,SAAS,cAAc,OAAsB;EAC3C,MAAM,EAAE,QAAQ;AAChB,MAAI,CAAC,KAAK,IAAI,IAAI,CAAE;AACpB,QAAM,gBAAgB;AACtB,QAAM,iBAAiB;AACvB,gBAAc,MAAM;;AAGtB,QAAO;EACL;EAEA;EACD"}
1
+ {"version":3,"file":"use-keyboard.js","names":[],"sources":["../../../src/components/auto-complete/use-keyboard.ts"],"sourcesContent":["import { type ComputedRef, type Ref, ref, watch } from 'vue'\n\ninterface Options {\n options: ComputedRef<string[]>\n dropdownVisible: Ref<boolean>\n onSelect: (option: string, index: number) => void\n getDefaultIndex?: (options: string[]) => number\n}\n\ninterface UseKeyboardReturned {\n point: Ref<number>\n handleKeydown: (event: KeyboardEvent) => void\n}\n\nexport function useKeyboard(options: Options): UseKeyboardReturned {\n const { options: selectableOptions, dropdownVisible, onSelect, getDefaultIndex } = options\n const keys = new Set(['ArrowUp', 'ArrowDown', 'Enter', 'Escape'])\n\n const point = ref(-1)\n\n const resolveDefaultPoint = () => {\n if (!selectableOptions.value.length) return -1\n if (getDefaultIndex) {\n const index = getDefaultIndex(selectableOptions.value)\n if (index >= 0 && index < selectableOptions.value.length) {\n return index\n }\n }\n return 0\n }\n\n watch(\n [selectableOptions, dropdownVisible],\n ([value, visible]) => {\n if (!value.length || !visible) {\n point.value = -1\n return\n }\n if (point.value === -1 || point.value >= value.length) {\n point.value = resolveDefaultPoint()\n }\n },\n { immediate: true }\n )\n\n function moveToNext() {\n if (!selectableOptions.value.length) return\n if (!dropdownVisible.value) {\n dropdownVisible.value = true\n point.value = resolveDefaultPoint()\n return\n }\n const nextPoint = point.value + 1\n point.value = nextPoint < selectableOptions.value.length ? nextPoint : 0\n }\n\n function moveToPrev() {\n if (!selectableOptions.value.length) return\n if (!dropdownVisible.value) {\n dropdownVisible.value = true\n point.value = selectableOptions.value.length - 1\n return\n }\n const prevPoint = point.value - 1\n point.value = prevPoint > -1 ? prevPoint : selectableOptions.value.length - 1\n }\n\n function selectOption() {\n if (!dropdownVisible.value) {\n if (selectableOptions.value.length) {\n dropdownVisible.value = true\n if (point.value === -1) {\n point.value = resolveDefaultPoint()\n }\n }\n return\n }\n const suggestion = selectableOptions.value[point.value]\n if (suggestion && point.value > -1) {\n onSelect(suggestion, point.value)\n }\n dropdownVisible.value = false\n }\n\n function closeDropdown() {\n dropdownVisible.value = false\n }\n\n const keyHandlerMap = {\n ArrowUp: moveToPrev,\n ArrowDown: moveToNext,\n Enter: selectOption,\n Escape: closeDropdown\n }\n\n function handleKeydown(event: KeyboardEvent) {\n const { key } = event\n if (!keys.has(key)) return\n event.preventDefault()\n event.stopPropagation()\n keyHandlerMap[key]()\n }\n\n return {\n point,\n\n handleKeydown\n }\n}\n"],"mappings":";;AAcA,SAAgB,YAAY,SAAuC;CACjE,MAAM,EAAE,SAAS,mBAAmB,iBAAiB,UAAU,oBAAoB;CACnF,MAAM,OAAO,IAAI,IAAI;EAAC;EAAW;EAAa;EAAS;EAAS,CAAC;CAEjE,MAAM,QAAQ,IAAI,GAAG;CAErB,MAAM,4BAA4B;EAChC,IAAI,CAAC,kBAAkB,MAAM,QAAQ,OAAO;EAC5C,IAAI,iBAAiB;GACnB,MAAM,QAAQ,gBAAgB,kBAAkB,MAAM;GACtD,IAAI,SAAS,KAAK,QAAQ,kBAAkB,MAAM,QAChD,OAAO;;EAGX,OAAO;;CAGT,MACE,CAAC,mBAAmB,gBAAgB,GACnC,CAAC,OAAO,aAAa;EACpB,IAAI,CAAC,MAAM,UAAU,CAAC,SAAS;GAC7B,MAAM,QAAQ;GACd;;EAEF,IAAI,MAAM,UAAU,MAAM,MAAM,SAAS,MAAM,QAC7C,MAAM,QAAQ,qBAAqB;IAGvC,EAAE,WAAW,MAAM,CACpB;CAED,SAAS,aAAa;EACpB,IAAI,CAAC,kBAAkB,MAAM,QAAQ;EACrC,IAAI,CAAC,gBAAgB,OAAO;GAC1B,gBAAgB,QAAQ;GACxB,MAAM,QAAQ,qBAAqB;GACnC;;EAEF,MAAM,YAAY,MAAM,QAAQ;EAChC,MAAM,QAAQ,YAAY,kBAAkB,MAAM,SAAS,YAAY;;CAGzE,SAAS,aAAa;EACpB,IAAI,CAAC,kBAAkB,MAAM,QAAQ;EACrC,IAAI,CAAC,gBAAgB,OAAO;GAC1B,gBAAgB,QAAQ;GACxB,MAAM,QAAQ,kBAAkB,MAAM,SAAS;GAC/C;;EAEF,MAAM,YAAY,MAAM,QAAQ;EAChC,MAAM,QAAQ,YAAY,KAAK,YAAY,kBAAkB,MAAM,SAAS;;CAG9E,SAAS,eAAe;EACtB,IAAI,CAAC,gBAAgB,OAAO;GAC1B,IAAI,kBAAkB,MAAM,QAAQ;IAClC,gBAAgB,QAAQ;IACxB,IAAI,MAAM,UAAU,IAClB,MAAM,QAAQ,qBAAqB;;GAGvC;;EAEF,MAAM,aAAa,kBAAkB,MAAM,MAAM;EACjD,IAAI,cAAc,MAAM,QAAQ,IAC9B,SAAS,YAAY,MAAM,MAAM;EAEnC,gBAAgB,QAAQ;;CAG1B,SAAS,gBAAgB;EACvB,gBAAgB,QAAQ;;CAG1B,MAAM,gBAAgB;EACpB,SAAS;EACT,WAAW;EACX,OAAO;EACP,QAAQ;EACT;CAED,SAAS,cAAc,OAAsB;EAC3C,MAAM,EAAE,QAAQ;EAChB,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE;EACpB,MAAM,gBAAgB;EACtB,MAAM,iBAAiB;EACvB,cAAc,MAAM;;CAGtB,OAAO;EACL;EAEA;EACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-suggestions.js","names":[],"sources":["../../../src/components/auto-complete/use-suggestions.ts"],"sourcesContent":["import { debounce } from '@cat-kit/core'\nimport { computed, type ComputedRef, type ShallowRef, shallowRef, watch, type ModelRef } from 'vue'\n\ninterface Options {\n model: ModelRef<string | undefined>\n props: { suggestions?: string[] | ((qs?: string) => Promise<string[]> | string[]) }\n}\n\ninterface UseSuggestionsReturned {\n suggestions: ComputedRef<string[]>\n cachedSuggestion: ComputedRef<string | undefined>\n appendedSuggestions: ShallowRef<string[]>\n}\n\nexport function useSuggestions(options: Options): UseSuggestionsReturned {\n const { model, props } = options\n\n /**\n * 动态的建议\n */\n const dynamicSuggestions = shallowRef<string[]>([])\n /** 过滤后的建议 */\n const filteredSuggestions = shallowRef<string[]>([])\n\n const appendedSuggestions = shallowRef<string[]>([])\n\n const suggestions = computed(() => {\n if (!props.suggestions) return appendedSuggestions.value\n\n if (typeof props.suggestions === 'function') {\n return dynamicSuggestions.value.concat(appendedSuggestions.value)\n }\n\n return filteredSuggestions.value\n })\n\n // 缓存的建议\n const cachedSuggestion = computed(() => {\n if (!model.value) return undefined\n return suggestions.value.includes(model.value) ? undefined : model.value\n })\n\n watch(\n [model, () => props.suggestions],\n debounce(async ([v, propsSuggestions]) => {\n if (typeof propsSuggestions === 'function') {\n dynamicSuggestions.value = (await propsSuggestions(v)) ?? []\n } else {\n if (!v) {\n filteredSuggestions.value = [...(propsSuggestions ?? []), ...appendedSuggestions.value]\n return\n }\n\n filteredSuggestions.value = [\n ...(propsSuggestions?.filter((item) => item.includes(v)) ?? []),\n ...appendedSuggestions.value.filter((item) => item.includes(v))\n ]\n }\n }, 200),\n { immediate: true }\n )\n\n return { suggestions, cachedSuggestion, appendedSuggestions }\n}\n"],"mappings":";;;AAcA,SAAgB,eAAe,SAA0C;CACvE,MAAM,EAAE,OAAO,UAAU;;;;CAKzB,MAAM,qBAAqB,WAAqB,EAAE,CAAC;;CAEnD,MAAM,sBAAsB,WAAqB,EAAE,CAAC;CAEpD,MAAM,sBAAsB,WAAqB,EAAE,CAAC;CAEpD,MAAM,cAAc,eAAe;AACjC,MAAI,CAAC,MAAM,YAAa,QAAO,oBAAoB;AAEnD,MAAI,OAAO,MAAM,gBAAgB,WAC/B,QAAO,mBAAmB,MAAM,OAAO,oBAAoB,MAAM;AAGnE,SAAO,oBAAoB;GAC3B;CAGF,MAAM,mBAAmB,eAAe;AACtC,MAAI,CAAC,MAAM,MAAO,QAAO,KAAA;AACzB,SAAO,YAAY,MAAM,SAAS,MAAM,MAAM,GAAG,KAAA,IAAY,MAAM;GACnE;AAEF,OACE,CAAC,aAAa,MAAM,YAAY,EAChC,SAAS,OAAO,CAAC,GAAG,sBAAsB;AACxC,MAAI,OAAO,qBAAqB,WAC9B,oBAAmB,QAAS,MAAM,iBAAiB,EAAE,IAAK,EAAE;OACvD;AACL,OAAI,CAAC,GAAG;AACN,wBAAoB,QAAQ,CAAC,GAAI,oBAAoB,EAAE,EAAG,GAAG,oBAAoB,MAAM;AACvF;;AAGF,uBAAoB,QAAQ,CAC1B,GAAI,kBAAkB,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,IAAI,EAAE,EAC9D,GAAG,oBAAoB,MAAM,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,CAChE;;IAEF,IAAI,EACP,EAAE,WAAW,MAAM,CACpB;AAED,QAAO;EAAE;EAAa;EAAkB;EAAqB"}
1
+ {"version":3,"file":"use-suggestions.js","names":[],"sources":["../../../src/components/auto-complete/use-suggestions.ts"],"sourcesContent":["import { debounce } from '@cat-kit/core'\nimport { computed, type ComputedRef, type ShallowRef, shallowRef, watch, type ModelRef } from 'vue'\n\ninterface Options {\n model: ModelRef<string | undefined>\n props: { suggestions?: string[] | ((qs?: string) => Promise<string[]> | string[]) }\n}\n\ninterface UseSuggestionsReturned {\n suggestions: ComputedRef<string[]>\n cachedSuggestion: ComputedRef<string | undefined>\n appendedSuggestions: ShallowRef<string[]>\n}\n\nexport function useSuggestions(options: Options): UseSuggestionsReturned {\n const { model, props } = options\n\n /**\n * 动态的建议\n */\n const dynamicSuggestions = shallowRef<string[]>([])\n /** 过滤后的建议 */\n const filteredSuggestions = shallowRef<string[]>([])\n\n const appendedSuggestions = shallowRef<string[]>([])\n\n const suggestions = computed(() => {\n if (!props.suggestions) return appendedSuggestions.value\n\n if (typeof props.suggestions === 'function') {\n return dynamicSuggestions.value.concat(appendedSuggestions.value)\n }\n\n return filteredSuggestions.value\n })\n\n // 缓存的建议\n const cachedSuggestion = computed(() => {\n if (!model.value) return undefined\n return suggestions.value.includes(model.value) ? undefined : model.value\n })\n\n watch(\n [model, () => props.suggestions],\n debounce(async ([v, propsSuggestions]) => {\n if (typeof propsSuggestions === 'function') {\n dynamicSuggestions.value = (await propsSuggestions(v)) ?? []\n } else {\n if (!v) {\n filteredSuggestions.value = [...(propsSuggestions ?? []), ...appendedSuggestions.value]\n return\n }\n\n filteredSuggestions.value = [\n ...(propsSuggestions?.filter((item) => item.includes(v)) ?? []),\n ...appendedSuggestions.value.filter((item) => item.includes(v))\n ]\n }\n }, 200),\n { immediate: true }\n )\n\n return { suggestions, cachedSuggestion, appendedSuggestions }\n}\n"],"mappings":";;;AAcA,SAAgB,eAAe,SAA0C;CACvE,MAAM,EAAE,OAAO,UAAU;;;;CAKzB,MAAM,qBAAqB,WAAqB,EAAE,CAAC;;CAEnD,MAAM,sBAAsB,WAAqB,EAAE,CAAC;CAEpD,MAAM,sBAAsB,WAAqB,EAAE,CAAC;CAEpD,MAAM,cAAc,eAAe;EACjC,IAAI,CAAC,MAAM,aAAa,OAAO,oBAAoB;EAEnD,IAAI,OAAO,MAAM,gBAAgB,YAC/B,OAAO,mBAAmB,MAAM,OAAO,oBAAoB,MAAM;EAGnE,OAAO,oBAAoB;GAC3B;CAGF,MAAM,mBAAmB,eAAe;EACtC,IAAI,CAAC,MAAM,OAAO,OAAO,KAAA;EACzB,OAAO,YAAY,MAAM,SAAS,MAAM,MAAM,GAAG,KAAA,IAAY,MAAM;GACnE;CAEF,MACE,CAAC,aAAa,MAAM,YAAY,EAChC,SAAS,OAAO,CAAC,GAAG,sBAAsB;EACxC,IAAI,OAAO,qBAAqB,YAC9B,mBAAmB,QAAS,MAAM,iBAAiB,EAAE,IAAK,EAAE;OACvD;GACL,IAAI,CAAC,GAAG;IACN,oBAAoB,QAAQ,CAAC,GAAI,oBAAoB,EAAE,EAAG,GAAG,oBAAoB,MAAM;IACvF;;GAGF,oBAAoB,QAAQ,CAC1B,GAAI,kBAAkB,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,IAAI,EAAE,EAC9D,GAAG,oBAAoB,MAAM,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,CAChE;;IAEF,IAAI,EACP,EAAE,WAAW,MAAM,CACpB;CAED,OAAO;EAAE;EAAa;EAAkB;EAAqB"}
@@ -37,7 +37,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
37
37
  const { width, height } = supRef.value.getBoundingClientRect();
38
38
  setStyles(supRef.value, {
39
39
  transform: `translate(-${width / 2}px, -${height / 2}px)`,
40
- backgroundColor: props.color && props.color,
40
+ backgroundColor: props.color,
41
41
  zIndex: zIndex()
42
42
  });
43
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"badge.js","names":[],"sources":["../../../src/components/badge/badge.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <slot />\n <sup :class=\"classList\" ref=\"supRef\" v-if=\"!hidden\">{{ badgeValue }}</sup>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, setStyles, zIndex } from '@veltra/utils'\nimport { computed, nextTick, onMounted, shallowRef, watch } from 'vue'\n\nimport type { BadgeProps, ComponentSize } from '../../types'\n\ndefineOptions({\n name: 'Badge'\n})\n\nconst cls = bem('badge')\n\nconst props = withDefaults(defineProps<BadgeProps>(), {\n max: 99\n})\n\nconst { size } = useFallbackProps([props], {\n size: 'default' as ComponentSize\n})\n\nconst badgeValue = computed(() => {\n if (props.dot) return ''\n if (typeof props.value === 'number' && typeof props.max === 'number') {\n return props.value > props.max ? `${props.max}+` : props.value\n }\n return props.value\n})\n\nconst classList = computed(() => {\n return [\n cls.e('sup'),\n props.type && cls.m('color-' + props.type),\n cls.m(size.value),\n bem.is('dot', props.dot)\n ]\n})\n\nconst supRef = shallowRef<HTMLElement>()\n\nconst setPosition = () => {\n if (supRef.value) {\n const { width, height } = supRef.value.getBoundingClientRect()\n setStyles(supRef.value, {\n transform: `translate(-${width / 2}px, -${height / 2}px)`,\n backgroundColor: props.color && props.color,\n zIndex: zIndex()\n })\n }\n}\n\nwatch(\n () => size.value,\n () => {\n nextTick(() => {\n setPosition()\n })\n }\n)\n\nonMounted(() => {\n setPosition()\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAkBA,MAAM,MAAM,IAAI,QAAO;EAEvB,MAAM,QAAQ;EAId,MAAM,EAAE,SAAS,iBAAiB,CAAC,MAAM,EAAE,EACzC,MAAM,WACP,CAAA;EAED,MAAM,aAAa,eAAe;AAChC,OAAI,MAAM,IAAK,QAAO;AACtB,OAAI,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,QAAQ,SAC1D,QAAO,MAAM,QAAQ,MAAM,MAAM,GAAG,MAAM,IAAI,KAAK,MAAM;AAE3D,UAAO,MAAM;IACd;EAED,MAAM,YAAY,eAAe;AAC/B,UAAO;IACL,IAAI,EAAE,MAAM;IACZ,MAAM,QAAQ,IAAI,EAAE,WAAW,MAAM,KAAK;IAC1C,IAAI,EAAE,KAAK,MAAM;IACjB,IAAI,GAAG,OAAO,MAAM,IAAG;IACzB;IACD;EAED,MAAM,SAAS,YAAwB;EAEvC,MAAM,oBAAoB;AACxB,OAAI,OAAO,OAAO;IAChB,MAAM,EAAE,OAAO,WAAW,OAAO,MAAM,uBAAsB;AAC7D,cAAU,OAAO,OAAO;KACtB,WAAW,cAAc,QAAQ,EAAE,OAAO,SAAS,EAAE;KACrD,iBAAiB,MAAM,SAAS,MAAM;KACtC,QAAQ,QAAO;KAChB,CAAA;;;AAIL,cACQ,KAAK,aACL;AACJ,kBAAe;AACb,iBAAY;KACb;IAEL;AAEA,kBAAgB;AACd,gBAAY;IACb;;uBApEC,mBAGM,OAAA,EAHA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,EAAA,EAAA,CAChB,WAAQ,KAAA,QAAA,UAAA,EAAA,CACoC,QAAA,UAAA,WAAA,EAA5C,mBAA0E,OAAA;;IAApE,OAAK,eAAE,UAAA,MAAS;aAAM;IAAJ,KAAI;sBAA2B,WAAA,MAAU,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,EAAA,EAAA"}
1
+ {"version":3,"file":"badge.js","names":[],"sources":["../../../src/components/badge/badge.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <slot />\n <sup :class=\"classList\" ref=\"supRef\" v-if=\"!hidden\">{{ badgeValue }}</sup>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, setStyles, zIndex } from '@veltra/utils'\nimport { computed, nextTick, onMounted, shallowRef, watch } from 'vue'\n\nimport type { BadgeProps, ComponentSize } from '../../types'\n\ndefineOptions({\n name: 'Badge'\n})\n\nconst cls = bem('badge')\n\nconst props = withDefaults(defineProps<BadgeProps>(), {\n max: 99\n})\n\nconst { size } = useFallbackProps([props], {\n size: 'default' as ComponentSize\n})\n\nconst badgeValue = computed(() => {\n if (props.dot) return ''\n if (typeof props.value === 'number' && typeof props.max === 'number') {\n return props.value > props.max ? `${props.max}+` : props.value\n }\n return props.value\n})\n\nconst classList = computed(() => {\n return [\n cls.e('sup'),\n props.type && cls.m('color-' + props.type),\n cls.m(size.value),\n bem.is('dot', props.dot)\n ]\n})\n\nconst supRef = shallowRef<HTMLElement>()\n\nconst setPosition = () => {\n if (supRef.value) {\n const { width, height } = supRef.value.getBoundingClientRect()\n setStyles(supRef.value, {\n transform: `translate(-${width / 2}px, -${height / 2}px)`,\n backgroundColor: props.color,\n zIndex: zIndex()\n })\n }\n}\n\nwatch(\n () => size.value,\n () => {\n nextTick(() => {\n setPosition()\n })\n }\n)\n\nonMounted(() => {\n setPosition()\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAkBA,MAAM,MAAM,IAAI,QAAO;EAEvB,MAAM,QAAQ;EAId,MAAM,EAAE,SAAS,iBAAiB,CAAC,MAAK,EAAG,EACzC,MAAM,WACP,CAAA;EAED,MAAM,aAAa,eAAe;GAChC,IAAI,MAAM,KAAK,OAAO;GACtB,IAAI,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,QAAQ,UAC1D,OAAO,MAAM,QAAQ,MAAM,MAAM,GAAG,MAAM,IAAI,KAAK,MAAM;GAE3D,OAAO,MAAM;IACd;EAED,MAAM,YAAY,eAAe;GAC/B,OAAO;IACL,IAAI,EAAE,MAAK;IACX,MAAM,QAAQ,IAAI,EAAE,WAAW,MAAM,KAAI;IACzC,IAAI,EAAE,KAAK,MAAK;IAChB,IAAI,GAAG,OAAO,MAAM,IAAG;IACzB;IACD;EAED,MAAM,SAAS,YAAwB;EAEvC,MAAM,oBAAoB;GACxB,IAAI,OAAO,OAAO;IAChB,MAAM,EAAE,OAAO,WAAW,OAAO,MAAM,uBAAsB;IAC7D,UAAU,OAAO,OAAO;KACtB,WAAW,cAAc,QAAQ,EAAE,OAAO,SAAS,EAAE;KACrD,iBAAiB,MAAM;KACvB,QAAQ,QAAO;KAChB,CAAA;;;EAIL,YACQ,KAAK,aACL;GACJ,eAAe;IACb,aAAY;KACb;IAEL;EAEA,gBAAgB;GACd,aAAY;IACb;;uBApEC,mBAGM,OAAA,EAHA,OAAK,eAAE,MAAA,IAAA,CAAI,EAAC,EAAA,EAAA,CAChB,WAAQ,KAAA,QAAA,UAAA,EAAA,CACoC,QAAA,UAAA,WAAA,EAA5C,mBAA0E,OAAA;;IAApE,OAAK,eAAE,UAAA,MAAS;aAAM;IAAJ,KAAI;sBAA2B,WAAA,MAAU,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,EAAA,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"batch-edit-form.js","names":[],"sources":["../../../src/components/batch-edit/batch-edit-form.vue"],"sourcesContent":["<template>\n <aside :class=\"cls.e('form')\" v-if=\"state.visible && !!props.model\">\n <header :class=\"cls.e('form-header')\">\n <span :class=\"[cls.e('form-icon'), bem.is(headerInfo.tone)]\">\n <u-icon>\n <component :is=\"headerInfo.icon\" />\n </u-icon>\n </span>\n <div :class=\"cls.e('form-title')\">\n <h3 :class=\"cls.e('form-title-text')\">{{ headerInfo.title }}</h3>\n <span v-if=\"headerInfo.chip\" :class=\"cls.e('form-chip')\">\n {{ headerInfo.chip }}\n </span>\n </div>\n <u-button\n :class=\"cls.e('form-close')\"\n :icon=\"Close\"\n text\n circle\n size=\"small\"\n title=\"关闭\"\n @click=\"handleClose\"\n />\n </header>\n\n <u-scroll always :class=\"cls.e('form-body')\" :key=\"bodyKey\">\n <transition name=\"fade\" appear mode=\"out-in\">\n <u-form\n :model=\"props.model\"\n :readonly=\"props.readonly\"\n @keydown=\"handleFormKeydown\"\n :label-width=\"props.labelWidth\"\n >\n <template #default=\"{ data, model }\">\n <slot\n v-bind=\"{\n data,\n model,\n row: state.row,\n depth: state.depth,\n indexes: insertIndexes,\n index: state.row?.index\n }\"\n />\n </template>\n </u-form>\n </transition>\n </u-scroll>\n\n <footer :class=\"cls.e('form-footer')\">\n <span :class=\"cls.e('form-hint')\" v-if=\"!props.readonly && state.dataUpdated\">\n 有未保存改动\n </span>\n <span :class=\"cls.e('form-hint')\" v-else-if=\"!props.readonly\">\n <u-kbd>Ctrl + Enter</u-kbd> 保存 · <u-kbd>Esc</u-kbd> 关闭\n </span>\n <span :class=\"cls.e('form-hint')\" v-else>只读模式</span>\n\n <div :class=\"cls.e('form-actions')\">\n <u-button text :loading=\"state.loading\" @click=\"handleClose\"> 取消 </u-button>\n <u-button\n v-if=\"!props.readonly && (creatable || updatable)\"\n :type=\"state.type === 'create' ? 'success' : 'primary'\"\n :loading=\"state.loading\"\n :disabled=\"!state.dataUpdated\"\n @click=\"handleSave\"\n >\n 保存\n </u-button>\n </div>\n </footer>\n </aside>\n</template>\n\n<script lang=\"ts\" setup>\nimport { AddChild, Close, EditPen, Plus, View } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, type Component } from 'vue'\n\nimport { UButton } from '../button'\nimport { UForm } from '../form'\nimport { UIcon } from '../icon'\nimport { UKbd } from '../kbd'\nimport { UScroll } from '../scroll'\nimport { BatchEditDIKey } from './di'\n\ndefineOptions({ name: 'BatchEditForm' })\n\nconst {\n cls,\n props,\n state,\n insertIndexes,\n handleSave,\n handleClose,\n staticFeatures,\n dynamicFeatures\n} = inject(BatchEditDIKey)!\n\nconst creatable = computed(() => {\n return (\n state.type === 'create' &&\n (staticFeatures.value.has('create') || dynamicFeatures.value.create?.(state.row))\n )\n})\n\nconst updatable = computed(() => {\n return (\n state.type === 'update' &&\n (staticFeatures.value.has('update') || dynamicFeatures.value.update?.(state.row))\n )\n})\n\ninterface HeaderInfo {\n icon: Component\n title: string\n chip?: string\n tone: 'create' | 'update' | 'view' | 'child'\n}\n\nconst headerInfo = computed<HeaderInfo>(() => {\n if (props.readonly) {\n return {\n icon: View,\n title: '查看详情',\n chip: state.row ? `第 ${state.row.index + 1} 行` : undefined,\n tone: 'view'\n }\n }\n if (state.parentRow) {\n return {\n icon: AddChild,\n title: '新增子级',\n chip: `归属于第 ${state.parentRow.index + 1} 行`,\n tone: 'child'\n }\n }\n if (state.type === 'create') {\n return {\n icon: Plus,\n title: '新增',\n tone: 'create'\n }\n }\n return {\n icon: EditPen,\n title: '编辑',\n chip: state.row ? `第 ${state.row.index + 1} 行` : undefined,\n tone: 'update'\n }\n})\n\n/** 通过 row 切换 / 类型切换驱动表单内容淡出淡入 */\nconst bodyKey = computed(() => {\n return `${state.type}-${state.row?.uid ?? 'create'}-${state.parentRow?.uid ?? 'root'}`\n})\n\nfunction handleFormKeydown(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault()\n handleSave()\n }\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"batch-edit-form.js","names":[],"sources":["../../../src/components/batch-edit/batch-edit-form.vue"],"sourcesContent":["<template>\n <aside :class=\"cls.e('form')\" v-if=\"state.visible && !!props.model\">\n <header :class=\"cls.e('form-header')\">\n <span :class=\"[cls.e('form-icon'), bem.is(headerInfo.tone)]\">\n <u-icon>\n <component :is=\"headerInfo.icon\" />\n </u-icon>\n </span>\n <div :class=\"cls.e('form-title')\">\n <h3 :class=\"cls.e('form-title-text')\">{{ headerInfo.title }}</h3>\n <span v-if=\"headerInfo.chip\" :class=\"cls.e('form-chip')\">\n {{ headerInfo.chip }}\n </span>\n </div>\n <u-button\n :class=\"cls.e('form-close')\"\n :icon=\"Close\"\n text\n circle\n size=\"small\"\n title=\"关闭\"\n @click=\"handleClose\"\n />\n </header>\n\n <u-scroll always :class=\"cls.e('form-body')\" :key=\"bodyKey\">\n <transition name=\"fade\" appear mode=\"out-in\">\n <u-form\n :model=\"props.model\"\n :readonly=\"props.readonly\"\n @keydown=\"handleFormKeydown\"\n :label-width=\"props.labelWidth\"\n >\n <template #default=\"{ data, model }\">\n <slot\n v-bind=\"{\n data,\n model,\n row: state.row,\n depth: state.depth,\n indexes: insertIndexes,\n index: state.row?.index\n }\"\n />\n </template>\n </u-form>\n </transition>\n </u-scroll>\n\n <footer :class=\"cls.e('form-footer')\">\n <span :class=\"cls.e('form-hint')\" v-if=\"!props.readonly && state.dataUpdated\">\n 有未保存改动\n </span>\n <span :class=\"cls.e('form-hint')\" v-else-if=\"!props.readonly\">\n <u-kbd>Ctrl + Enter</u-kbd> 保存 · <u-kbd>Esc</u-kbd> 关闭\n </span>\n <span :class=\"cls.e('form-hint')\" v-else>只读模式</span>\n\n <div :class=\"cls.e('form-actions')\">\n <u-button text :loading=\"state.loading\" @click=\"handleClose\"> 取消 </u-button>\n <u-button\n v-if=\"!props.readonly && (creatable || updatable)\"\n :type=\"state.type === 'create' ? 'success' : 'primary'\"\n :loading=\"state.loading\"\n :disabled=\"!state.dataUpdated\"\n @click=\"handleSave\"\n >\n 保存\n </u-button>\n </div>\n </footer>\n </aside>\n</template>\n\n<script lang=\"ts\" setup>\nimport { AddChild, Close, EditPen, Plus, View } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, type Component } from 'vue'\n\nimport { UButton } from '../button'\nimport { UForm } from '../form'\nimport { UIcon } from '../icon'\nimport { UKbd } from '../kbd'\nimport { UScroll } from '../scroll'\nimport { BatchEditDIKey } from './di'\n\ndefineOptions({ name: 'BatchEditForm' })\n\nconst {\n cls,\n props,\n state,\n insertIndexes,\n handleSave,\n handleClose,\n staticFeatures,\n dynamicFeatures\n} = inject(BatchEditDIKey)!\n\nconst creatable = computed(() => {\n return (\n state.type === 'create' &&\n (staticFeatures.value.has('create') || dynamicFeatures.value.create?.(state.row))\n )\n})\n\nconst updatable = computed(() => {\n return (\n state.type === 'update' &&\n (staticFeatures.value.has('update') || dynamicFeatures.value.update?.(state.row))\n )\n})\n\ninterface HeaderInfo {\n icon: Component\n title: string\n chip?: string\n tone: 'create' | 'update' | 'view' | 'child'\n}\n\nconst headerInfo = computed<HeaderInfo>(() => {\n if (props.readonly) {\n return {\n icon: View,\n title: '查看详情',\n chip: state.row ? `第 ${state.row.index + 1} 行` : undefined,\n tone: 'view'\n }\n }\n if (state.parentRow) {\n return {\n icon: AddChild,\n title: '新增子级',\n chip: `归属于第 ${state.parentRow.index + 1} 行`,\n tone: 'child'\n }\n }\n if (state.type === 'create') {\n return {\n icon: Plus,\n title: '新增',\n tone: 'create'\n }\n }\n return {\n icon: EditPen,\n title: '编辑',\n chip: state.row ? `第 ${state.row.index + 1} 行` : undefined,\n tone: 'update'\n }\n})\n\n/** 通过 row 切换 / 类型切换驱动表单内容淡出淡入 */\nconst bodyKey = computed(() => {\n return `${state.type}-${state.row?.uid ?? 'create'}-${state.parentRow?.uid ?? 'root'}`\n})\n\nfunction handleFormKeydown(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault()\n handleSave()\n }\n}\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"batch-edit-list.js","names":[],"sources":["../../../src/components/batch-edit/batch-edit-list.vue"],"sourcesContent":["<template>\n <u-table\n v-bind=\"tableProps\"\n :slots=\"slots\"\n :class=\"[cls.e('table'), bem.is('editing', state.visible)]\"\n :columns=\"columns\"\n highlight-current\n :current=\"state.row\"\n @update:current=\"handleUpdateCurrentRow\"\n @update:checked=\"emit('update:checked', $event)\"\n @update:selected=\"emit('update:selected', $event)\"\n ref=\"tableRef\"\n >\n <template #column:__action__=\"{ row }\">\n <u-action-group :class=\"cls.e('row-actions')\" :max=\"5\" @click.stop circle>\n <u-action\n v-if=\"allowed('create', row)\"\n :icon=\"InsertToPrev\"\n title=\"在上方插入\"\n @run=\"handleInsertToPrev(row)\"\n />\n <u-action\n v-if=\"allowed('create', row)\"\n :icon=\"InsertToNext\"\n title=\"在下方插入\"\n @run=\"handleInsertToNext(row)\"\n />\n <u-action\n v-if=\"!!props.tree && allowed('createChild', row)\"\n :icon=\"AddChild\"\n title=\"添加子级\"\n @run=\"handleInsertChild(row)\"\n />\n <u-action\n v-if=\"allowed('copy', row)\"\n :icon=\"Copy\"\n title=\"复制此行\"\n @run=\"handleCopy(row)\"\n />\n\n <u-action\n v-if=\"canDelete(row)\"\n :icon=\"Delete\"\n type=\"danger\"\n title=\"删除\"\n @run=\"handleDelete(row)\"\n v-bind=\"props.actionsProps?.delete\"\n />\n </u-action-group>\n </template>\n\n <template #empty v-if=\"!props.readonly\"> {{ null }} </template>\n\n <template\n #append\n v-if=\"\n !props.readonly &&\n (staticFeatures.has('create') || dynamicFeatures.create?.()) &&\n ((state.type === 'create' && !state.visible) || state.type === 'update')\n \"\n >\n <div :class=\"cls.e('add')\">\n <u-button\n :class=\"cls.e('add-btn')\"\n :icon=\"Plus\"\n :loading=\"state.loading\"\n type=\"primary\"\n plain\n @click.stop=\"handleCreate\"\n >\n 新增一行\n </u-button>\n </div>\n </template>\n </u-table>\n</template>\n\n<script setup lang=\"ts\">\nimport { o } from '@cat-kit/core'\nimport { AddChild, Copy, Delete, InsertToNext, InsertToPrev, Plus } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, type Slots } from 'vue'\n\nimport type { BatchEditFeature, TableRow } from '../../types'\nimport { UAction, UActionGroup } from '../action'\nimport { UButton } from '../button'\nimport { UTable } from '../table'\nimport { BatchEditDIKey } from './di'\n\ndefineOptions({\n name: 'BatchEditList'\n})\n\ndefineProps<{\n slots: Slots\n}>()\n\nconst {\n cls,\n state,\n tableRef,\n props,\n emit,\n staticFeatures,\n dynamicFeatures,\n handleCreate,\n handleCopy,\n handleDelete,\n handleInsertToNext,\n handleInsertToPrev,\n handleInsertChild\n} = inject(BatchEditDIKey)!\n\nconst tableProps = computed(() => {\n return o(props as Record<string, any>).omit([\n 'model',\n 'columns',\n 'cols',\n 'readonly',\n 'deleteMethod',\n 'saveMethod',\n 'features'\n ])\n})\n\nconst hasNot = (value: BatchEditFeature[]) => value.every((v) => !staticFeatures.value.has(v))\n\nconst allowed = (feature: BatchEditFeature, row?: TableRow) => {\n return staticFeatures.value.has(feature) || !!dynamicFeatures.value[feature]?.(row)\n}\n\nconst columns = computed(() => {\n if (props.readonly || hasNot(['create', 'delete', 'createChild', 'update', 'copy']))\n return props.columns\n\n return (props.columns ?? []).concat({\n name: '操作',\n key: '__action__',\n align: 'center',\n width: 180,\n fixed: 'right',\n resizable: false\n })\n})\n\nfunction handleUpdateCurrentRow(row?: TableRow) {\n if (allowed('update', row)) {\n state.row = row\n state.depth = row?.depth\n }\n}\n\nfunction canDelete(row: TableRow) {\n return !props.readonly && allowed('delete', row)\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"batch-edit-list.js","names":[],"sources":["../../../src/components/batch-edit/batch-edit-list.vue"],"sourcesContent":["<template>\n <u-table\n v-bind=\"tableProps\"\n :slots=\"slots\"\n :class=\"[cls.e('table'), bem.is('editing', state.visible)]\"\n :columns=\"columns\"\n highlight-current\n :current=\"state.row\"\n @update:current=\"handleUpdateCurrentRow\"\n @update:checked=\"emit('update:checked', $event)\"\n @update:selected=\"emit('update:selected', $event)\"\n ref=\"tableRef\"\n >\n <template #column:__action__=\"{ row }\">\n <u-action-group :class=\"cls.e('row-actions')\" :max=\"5\" @click.stop circle>\n <u-action\n v-if=\"allowed('create', row)\"\n :icon=\"InsertToPrev\"\n title=\"在上方插入\"\n @run=\"handleInsertToPrev(row)\"\n />\n <u-action\n v-if=\"allowed('create', row)\"\n :icon=\"InsertToNext\"\n title=\"在下方插入\"\n @run=\"handleInsertToNext(row)\"\n />\n <u-action\n v-if=\"!!props.tree && allowed('createChild', row)\"\n :icon=\"AddChild\"\n title=\"添加子级\"\n @run=\"handleInsertChild(row)\"\n />\n <u-action\n v-if=\"allowed('copy', row)\"\n :icon=\"Copy\"\n title=\"复制此行\"\n @run=\"handleCopy(row)\"\n />\n\n <u-action\n v-if=\"canDelete(row)\"\n :icon=\"Delete\"\n type=\"danger\"\n title=\"删除\"\n @run=\"handleDelete(row)\"\n v-bind=\"props.actionsProps?.delete\"\n />\n </u-action-group>\n </template>\n\n <template #empty v-if=\"!props.readonly\"> {{ null }} </template>\n\n <template\n #append\n v-if=\"\n !props.readonly &&\n (staticFeatures.has('create') || dynamicFeatures.create?.()) &&\n ((state.type === 'create' && !state.visible) || state.type === 'update')\n \"\n >\n <div :class=\"cls.e('add')\">\n <u-button\n :class=\"cls.e('add-btn')\"\n :icon=\"Plus\"\n :loading=\"state.loading\"\n type=\"primary\"\n plain\n @click.stop=\"handleCreate\"\n >\n 新增一行\n </u-button>\n </div>\n </template>\n </u-table>\n</template>\n\n<script setup lang=\"ts\">\nimport { o } from '@cat-kit/core'\nimport { AddChild, Copy, Delete, InsertToNext, InsertToPrev, Plus } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, type Slots } from 'vue'\n\nimport type { BatchEditFeature, TableRow } from '../../types'\nimport { UAction, UActionGroup } from '../action'\nimport { UButton } from '../button'\nimport { UTable } from '../table'\nimport { BatchEditDIKey } from './di'\n\ndefineOptions({\n name: 'BatchEditList'\n})\n\ndefineProps<{\n slots: Slots\n}>()\n\nconst {\n cls,\n state,\n tableRef,\n props,\n emit,\n staticFeatures,\n dynamicFeatures,\n handleCreate,\n handleCopy,\n handleDelete,\n handleInsertToNext,\n handleInsertToPrev,\n handleInsertChild\n} = inject(BatchEditDIKey)!\n\nconst tableProps = computed(() => {\n return o(props as Record<string, any>).omit([\n 'model',\n 'columns',\n 'cols',\n 'readonly',\n 'deleteMethod',\n 'saveMethod',\n 'features'\n ])\n})\n\nconst hasNot = (value: BatchEditFeature[]) => value.every((v) => !staticFeatures.value.has(v))\n\nconst allowed = (feature: BatchEditFeature, row?: TableRow) => {\n return staticFeatures.value.has(feature) || !!dynamicFeatures.value[feature]?.(row)\n}\n\nconst columns = computed(() => {\n if (props.readonly || hasNot(['create', 'delete', 'createChild', 'update', 'copy']))\n return props.columns\n\n return (props.columns ?? []).concat({\n name: '操作',\n key: '__action__',\n align: 'center',\n width: 180,\n fixed: 'right',\n resizable: false\n })\n})\n\nfunction handleUpdateCurrentRow(row?: TableRow) {\n if (allowed('update', row)) {\n state.row = row\n state.depth = row?.depth\n }\n}\n\nfunction canDelete(row: TableRow) {\n return !props.readonly && allowed('delete', row)\n}\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"batch-edit.js","names":[],"sources":["../../../src/components/batch-edit/batch-edit.vue"],"sourcesContent":["<template>\n <u-layout\n :class=\"cls.b\"\n :cols=\"cols\"\n rows=\"minmax(0, 1fr)\"\n gap=\"8px\"\n resizable\n @keydown=\"handleKeydown\"\n tabindex=\"-1\"\n >\n <!-- 编辑列表 -->\n <BatchEditList :slots=\"slots\" />\n\n <!-- 编辑表单 -->\n <BatchEditForm v-slot=\"scoped\">\n <!-- @vue-ignore -->\n <slot name=\"form\" v-bind=\"scoped\" />\n </BatchEditForm>\n </u-layout>\n</template>\n\n<script lang=\"ts\" setup generic=\"Model extends FormModel\">\nimport { bem } from '@veltra/utils'\nimport { computed, inject, provide, shallowRef, watch } from 'vue'\n\nimport type {\n BatchEditEmits,\n BatchEditFeature,\n BatchEditProps,\n TableColumnSlotsScope,\n TableExposed,\n TableRow\n} from '../../types'\nimport { DialogDIKey } from '../dialog/di'\nimport type { FormModel } from '../form'\nimport { ULayout } from '../layout'\nimport BatchEditForm from './batch-edit-form.vue'\nimport BatchEditList from './batch-edit-list.vue'\nimport { BatchEditDIKey } from './di'\nimport { useEdit } from './use-edit'\n\ndefineOptions({ name: 'BatchEdit' })\n\nconst props = withDefaults(defineProps<BatchEditProps<Model>>(), {\n cols: () => ['1fr', '420px'],\n mode: 'normal'\n})\n\nconst emit = defineEmits<BatchEditEmits>()\n\nconst staticFeatures = computed(() => {\n const { features } = props\n\n if (Array.isArray(features)) {\n return new Set(features)\n }\n\n const defaultFeatures = new Set<BatchEditFeature>(['create', 'delete', 'update', 'createChild'])\n\n if (!features) {\n return defaultFeatures\n }\n\n // 函数与 false 的特性视为关闭;显式 true 视为开启(即便不在默认集合内)\n Object.entries(features).forEach(([key, value]) => {\n const k = key as BatchEditFeature\n if (typeof value === 'function' || value === false) {\n defaultFeatures.delete(k)\n } else if (value === true) {\n defaultFeatures.add(k)\n }\n })\n return defaultFeatures\n})\n\nconst dynamicFeatures = computed<\n Record<BatchEditFeature, ((row?: TableRow) => boolean) | undefined>\n>(() => {\n const { features } = props\n if (!Array.isArray(features) && typeof features === 'object') {\n const ret = Object.entries(features)\n .filter(([_, value]) => {\n return typeof value === 'function'\n })\n .reduce(\n (acc, [key, value]) => {\n acc[key] = value\n return acc\n },\n {} as Record<BatchEditFeature, (row?: TableRow) => boolean>\n )\n return ret\n }\n\n return {} as Record<BatchEditFeature, ((row?: TableRow) => boolean) | undefined>\n})\n\nconst slots = defineSlots<\n {\n form?: (props: {\n /** 表单数据 */\n data: Model['data']\n /** 表单模型 */\n model: Model\n /** 当前编辑的层级 */\n depth?: number\n /** 当前编辑的行 */\n row?: TableRow\n /** 当前编辑的行索引 */\n index?: number\n /** 操作的目标行索引路径 */\n indexes?: number[]\n }) => any\n\n header?: () => any\n } & Partial<{\n [key: `column:${string}`]: (props: TableColumnSlotsScope) => any\n }>\n>()\n\nconst cls = bem('batch-edit')\n\nconst tableRef = shallowRef<TableExposed>()\n\nconst editCtx = useEdit({ props, emit, tableRef })\n\nconst { state, handleClose, handleSave, handleDelete, handleCreate } = editCtx\n\nprovide(BatchEditDIKey, {\n cls,\n props,\n emit,\n tableRef,\n staticFeatures,\n dynamicFeatures,\n ...editCtx\n})\n\nconst dialogCtx = inject(DialogDIKey, undefined)\n\ndialogCtx &&\n watch(dialogCtx.visible, (visible) => {\n !visible && editCtx.handleClose()\n })\n\nconst cols = computed(() => {\n return !!state.row || state.visible ? props.cols : undefined\n})\n\n/**\n * 键盘快捷键:\n * - Esc 关闭表单\n * - ⌘/Ctrl + S 保存\n * - ⌘/Ctrl + Backspace 删除当前编辑行\n * - ⌘/Ctrl + N 新增(仅在不在表单中时)\n */\nfunction handleKeydown(e: KeyboardEvent) {\n if (props.readonly && e.key !== 'Escape') return\n\n if (e.key === 'Escape') {\n if (state.visible) {\n e.preventDefault()\n handleClose()\n }\n return\n }\n\n const meta = e.metaKey || e.ctrlKey\n if (!meta) return\n\n const key = e.key.toLowerCase()\n\n if (key === 's' && state.visible) {\n e.preventDefault()\n handleSave()\n return\n }\n\n if (e.key === 'Backspace' && state.row && state.type === 'update') {\n e.preventDefault()\n handleDelete(state.row)\n return\n }\n\n if (key === 'n' && !state.visible) {\n e.preventDefault()\n handleCreate()\n }\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CA,MAAM,QAAQ;EAKd,MAAM,OAAO;EAEb,MAAM,iBAAiB,eAAe;GACpC,MAAM,EAAE,aAAa;AAErB,OAAI,MAAM,QAAQ,SAAS,CACzB,QAAO,IAAI,IAAI,SAAQ;GAGzB,MAAM,kBAAkB,IAAI,IAAsB;IAAC;IAAU;IAAU;IAAU;IAAc,CAAA;AAE/F,OAAI,CAAC,SACH,QAAO;AAIT,UAAO,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,WAAW;IACjD,MAAM,IAAI;AACV,QAAI,OAAO,UAAU,cAAc,UAAU,MAC3C,iBAAgB,OAAO,EAAC;aACf,UAAU,KACnB,iBAAgB,IAAI,EAAC;KAExB;AACD,UAAO;IACR;EAED,MAAM,kBAAkB,eAEhB;GACN,MAAM,EAAE,aAAa;AACrB,OAAI,CAAC,MAAM,QAAQ,SAAS,IAAI,OAAO,aAAa,SAYlD,QAXY,OAAO,QAAQ,SAAQ,CAChC,QAAQ,CAAC,GAAG,WAAW;AACtB,WAAO,OAAO,UAAU;KACzB,CACA,QACE,KAAK,CAAC,KAAK,WAAW;AACrB,QAAI,OAAO;AACX,WAAO;MAET,EAAE,CAEC;AAGT,UAAO,EAAE;IACV;EAED,MAAM,QAAQ,UAAA;EAuBd,MAAM,MAAM,IAAI,aAAY;EAE5B,MAAM,WAAW,YAAyB;EAE1C,MAAM,UAAU,QAAQ;GAAE;GAAO;GAAM;GAAU,CAAA;EAEjD,MAAM,EAAE,OAAO,aAAa,YAAY,cAAc,iBAAiB;AAEvE,UAAQ,gBAAgB;GACtB;GACA;GACA;GACA;GACA;GACA;GACA,GAAG;GACJ,CAAA;EAED,MAAM,YAAY,OAAO,aAAa,KAAA,EAAS;AAE/C,eACE,MAAM,UAAU,UAAU,YAAY;AACpC,IAAC,WAAW,QAAQ,aAAY;IACjC;EAEH,MAAM,OAAO,eAAe;AAC1B,UAAO,CAAC,CAAC,MAAM,OAAO,MAAM,UAAU,MAAM,OAAO,KAAA;IACpD;;;;;;;;EASD,SAAS,cAAc,GAAkB;AACvC,OAAI,MAAM,YAAY,EAAE,QAAQ,SAAU;AAE1C,OAAI,EAAE,QAAQ,UAAU;AACtB,QAAI,MAAM,SAAS;AACjB,OAAE,gBAAe;AACjB,kBAAY;;AAEd;;AAIF,OAAI,EADS,EAAE,WAAW,EAAE,SACjB;GAEX,MAAM,MAAM,EAAE,IAAI,aAAY;AAE9B,OAAI,QAAQ,OAAO,MAAM,SAAS;AAChC,MAAE,gBAAe;AACjB,gBAAW;AACX;;AAGF,OAAI,EAAE,QAAQ,eAAe,MAAM,OAAO,MAAM,SAAS,UAAU;AACjE,MAAE,gBAAe;AACjB,iBAAa,MAAM,IAAG;AACtB;;AAGF,OAAI,QAAQ,OAAO,CAAC,MAAM,SAAS;AACjC,MAAE,gBAAe;AACjB,kBAAa;;;;uBAzLf,YAiBW,MAAA,YAAA,EAAA;IAhBR,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC;IACZ,MAAM,KAAA;IACP,MAAK;IACL,KAAI;IACJ,WAAA;IACC,WAAS;IACV,UAAS;;2BAEI;KAAb,mBAAA,SAAa;KACb,YAAgC,aAAA,EAAT,OAAK,CAAA;KAE5B,mBAAA,SAAa;KACb,YAGgB,aAAA,MAAA;wBAHO,WAAM,CAC3B,mBAAA,gBAAoB,EACpB,WAAoC,KAAA,QAAA,QAAA,eAAA,mBAAV,OAAM,CAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"batch-edit.js","names":[],"sources":["../../../src/components/batch-edit/batch-edit.vue"],"sourcesContent":["<template>\n <u-layout\n :class=\"cls.b\"\n :cols=\"cols\"\n rows=\"minmax(0, 1fr)\"\n gap=\"8px\"\n resizable\n @keydown=\"handleKeydown\"\n tabindex=\"-1\"\n >\n <!-- 编辑列表 -->\n <BatchEditList :slots=\"slots\" />\n\n <!-- 编辑表单 -->\n <BatchEditForm v-slot=\"scoped\">\n <!-- @vue-ignore -->\n <slot name=\"form\" v-bind=\"scoped\" />\n </BatchEditForm>\n </u-layout>\n</template>\n\n<script lang=\"ts\" setup generic=\"Model extends FormModel\">\nimport { bem } from '@veltra/utils'\nimport { computed, inject, provide, shallowRef, watch } from 'vue'\n\nimport type {\n BatchEditEmits,\n BatchEditFeature,\n BatchEditProps,\n TableColumnSlotsScope,\n TableExposed,\n TableRow\n} from '../../types'\nimport { DialogDIKey } from '../dialog/di'\nimport type { FormModel } from '../form'\nimport { ULayout } from '../layout'\nimport BatchEditForm from './batch-edit-form.vue'\nimport BatchEditList from './batch-edit-list.vue'\nimport { BatchEditDIKey } from './di'\nimport { useEdit } from './use-edit'\n\ndefineOptions({ name: 'BatchEdit' })\n\nconst props = withDefaults(defineProps<BatchEditProps<Model>>(), {\n cols: () => ['1fr', '420px'],\n mode: 'normal'\n})\n\nconst emit = defineEmits<BatchEditEmits>()\n\nconst staticFeatures = computed(() => {\n const { features } = props\n\n if (Array.isArray(features)) {\n return new Set(features)\n }\n\n const defaultFeatures = new Set<BatchEditFeature>(['create', 'delete', 'update', 'createChild'])\n\n if (!features) {\n return defaultFeatures\n }\n\n // 函数与 false 的特性视为关闭;显式 true 视为开启(即便不在默认集合内)\n Object.entries(features).forEach(([key, value]) => {\n const k = key as BatchEditFeature\n if (typeof value === 'function' || value === false) {\n defaultFeatures.delete(k)\n } else if (value === true) {\n defaultFeatures.add(k)\n }\n })\n return defaultFeatures\n})\n\nconst dynamicFeatures = computed<\n Record<BatchEditFeature, ((row?: TableRow) => boolean) | undefined>\n>(() => {\n const { features } = props\n if (!Array.isArray(features) && typeof features === 'object') {\n const ret = Object.entries(features)\n .filter(([_, value]) => {\n return typeof value === 'function'\n })\n .reduce(\n (acc, [key, value]) => {\n acc[key] = value\n return acc\n },\n {} as Record<BatchEditFeature, (row?: TableRow) => boolean>\n )\n return ret\n }\n\n return {} as Record<BatchEditFeature, ((row?: TableRow) => boolean) | undefined>\n})\n\nconst slots = defineSlots<\n {\n form?: (props: {\n /** 表单数据 */\n data: Model['data']\n /** 表单模型 */\n model: Model\n /** 当前编辑的层级 */\n depth?: number\n /** 当前编辑的行 */\n row?: TableRow\n /** 当前编辑的行索引 */\n index?: number\n /** 操作的目标行索引路径 */\n indexes?: number[]\n }) => any\n\n header?: () => any\n } & Partial<{\n [key: `column:${string}`]: (props: TableColumnSlotsScope) => any\n }>\n>()\n\nconst cls = bem('batch-edit')\n\nconst tableRef = shallowRef<TableExposed>()\n\nconst editCtx = useEdit({ props, emit, tableRef })\n\nconst { state, handleClose, handleSave, handleDelete, handleCreate } = editCtx\n\nprovide(BatchEditDIKey, {\n cls,\n props,\n emit,\n tableRef,\n staticFeatures,\n dynamicFeatures,\n ...editCtx\n})\n\nconst dialogCtx = inject(DialogDIKey, undefined)\n\ndialogCtx &&\n watch(dialogCtx.visible, (visible) => {\n !visible && editCtx.handleClose()\n })\n\nconst cols = computed(() => {\n return !!state.row || state.visible ? props.cols : undefined\n})\n\n/**\n * 键盘快捷键:\n * - Esc 关闭表单\n * - ⌘/Ctrl + S 保存\n * - ⌘/Ctrl + Backspace 删除当前编辑行\n * - ⌘/Ctrl + N 新增(仅在不在表单中时)\n */\nfunction handleKeydown(e: KeyboardEvent) {\n if (props.readonly && e.key !== 'Escape') return\n\n if (e.key === 'Escape') {\n if (state.visible) {\n e.preventDefault()\n handleClose()\n }\n return\n }\n\n const meta = e.metaKey || e.ctrlKey\n if (!meta) return\n\n const key = e.key.toLowerCase()\n\n if (key === 's' && state.visible) {\n e.preventDefault()\n handleSave()\n return\n }\n\n if (e.key === 'Backspace' && state.row && state.type === 'update') {\n e.preventDefault()\n handleDelete(state.row)\n return\n }\n\n if (key === 'n' && !state.visible) {\n e.preventDefault()\n handleCreate()\n }\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CA,MAAM,QAAQ;EAKd,MAAM,OAAO;EAEb,MAAM,iBAAiB,eAAe;GACpC,MAAM,EAAE,aAAa;GAErB,IAAI,MAAM,QAAQ,SAAQ,EACxB,OAAO,IAAI,IAAI,SAAQ;GAGzB,MAAM,kBAAkB,IAAI,IAAsB;IAAC;IAAU;IAAU;IAAU;IAAc,CAAA;GAE/F,IAAI,CAAC,UACH,OAAO;GAIT,OAAO,QAAQ,SAAQ,CAAE,SAAS,CAAC,KAAK,WAAW;IACjD,MAAM,IAAI;IACV,IAAI,OAAO,UAAU,cAAc,UAAU,OAC3C,gBAAgB,OAAO,EAAC;SACnB,IAAI,UAAU,MACnB,gBAAgB,IAAI,EAAC;KAExB;GACD,OAAO;IACR;EAED,MAAM,kBAAkB,eAEhB;GACN,MAAM,EAAE,aAAa;GACrB,IAAI,CAAC,MAAM,QAAQ,SAAQ,IAAK,OAAO,aAAa,UAYlD,OAXY,OAAO,QAAQ,SAAQ,CAChC,QAAQ,CAAC,GAAG,WAAW;IACtB,OAAO,OAAO,UAAU;KACzB,CACA,QACE,KAAK,CAAC,KAAK,WAAW;IACrB,IAAI,OAAO;IACX,OAAO;MAET,EACF,CACK;GAGT,OAAO,EAAC;IACT;EAED,MAAM,QAAQ,UAAA;EAuBd,MAAM,MAAM,IAAI,aAAY;EAE5B,MAAM,WAAW,YAAyB;EAE1C,MAAM,UAAU,QAAQ;GAAE;GAAO;GAAM;GAAU,CAAA;EAEjD,MAAM,EAAE,OAAO,aAAa,YAAY,cAAc,iBAAiB;EAEvE,QAAQ,gBAAgB;GACtB;GACA;GACA;GACA;GACA;GACA;GACA,GAAG;GACJ,CAAA;EAED,MAAM,YAAY,OAAO,aAAa,KAAA,EAAS;EAE/C,aACE,MAAM,UAAU,UAAU,YAAY;GACpC,CAAC,WAAW,QAAQ,aAAY;IACjC;EAEH,MAAM,OAAO,eAAe;GAC1B,OAAO,CAAC,CAAC,MAAM,OAAO,MAAM,UAAU,MAAM,OAAO,KAAA;IACpD;;;;;;;;EASD,SAAS,cAAc,GAAkB;GACvC,IAAI,MAAM,YAAY,EAAE,QAAQ,UAAU;GAE1C,IAAI,EAAE,QAAQ,UAAU;IACtB,IAAI,MAAM,SAAS;KACjB,EAAE,gBAAe;KACjB,aAAY;;IAEd;;GAIF,IAAI,EADS,EAAE,WAAW,EAAE,UACjB;GAEX,MAAM,MAAM,EAAE,IAAI,aAAY;GAE9B,IAAI,QAAQ,OAAO,MAAM,SAAS;IAChC,EAAE,gBAAe;IACjB,YAAW;IACX;;GAGF,IAAI,EAAE,QAAQ,eAAe,MAAM,OAAO,MAAM,SAAS,UAAU;IACjE,EAAE,gBAAe;IACjB,aAAa,MAAM,IAAG;IACtB;;GAGF,IAAI,QAAQ,OAAO,CAAC,MAAM,SAAS;IACjC,EAAE,gBAAe;IACjB,cAAa;;;;uBAzLf,YAiBW,MAAA,YAAA,EAAA;IAhBR,OAAK,eAAE,MAAA,IAAA,CAAI,EAAC;IACZ,MAAM,KAAA;IACP,MAAK;IACL,KAAI;IACJ,WAAA;IACC,WAAS;IACV,UAAS;;2BAEI;KAAb,mBAAA,SAAA;KACA,YAAgC,aAAA,EAAT,OAAK,CAAA;KAE5B,mBAAA,SAAA;KACA,YAGgB,aAAA,MAAA;wBAHO,WAAM,CAC3B,mBAAA,gBAAA,EACA,WAAoC,KAAA,QAAA,QAAA,eAAA,mBAAV,OAAM,CAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"helper.js","names":[],"sources":["../../../src/components/batch-edit/helper.ts"],"sourcesContent":["import type { BatchEditColumn } from '../../types'\n\n/**\n * 定义批量编辑组件的列\n * @param columns 列\n * @returns\n */\nexport function defineBatchEditColumns(columns: BatchEditColumn[]): BatchEditColumn[] {\n return columns\n}\n"],"mappings":";;;;;;AAOA,SAAgB,uBAAuB,SAA+C;AACpF,QAAO"}
1
+ {"version":3,"file":"helper.js","names":[],"sources":["../../../src/components/batch-edit/helper.ts"],"sourcesContent":["import type { BatchEditColumn } from '../../types'\n\n/**\n * 定义批量编辑组件的列\n * @param columns 列\n * @returns\n */\nexport function defineBatchEditColumns(columns: BatchEditColumn[]): BatchEditColumn[] {\n return columns\n}\n"],"mappings":";;;;;;AAOA,SAAgB,uBAAuB,SAA+C;CACpF,OAAO"}
@@ -8,4 +8,4 @@ import "../table/style.js";
8
8
  import "../kbd/style.js";
9
9
  import "./style2.css";
10
10
  import "@veltra/directives/ripple/style.js";
11
- import "@veltra/styles/anime/fade.scss";
11
+ import "@veltra/styles/transitions/fade.scss";
@@ -1 +1 @@
1
- {"version":3,"file":"use-edit.js","names":[],"sources":["../../../src/components/batch-edit/use-edit.ts"],"sourcesContent":["import { last, o, safeRun } from '@cat-kit/core'\nimport { computed, nextTick, shallowReactive, shallowRef, watch, type ShallowRef } from 'vue'\n\nimport type { TableRow, BatchEditEmits, BatchEditProps, TableExposed } from '../../types'\n\n/** 按索引路径在原始数据树中定位节点(等价于历史 Forest.visit 路径访问) */\nfunction visitDataByIndexPath<T extends Record<string, unknown>>(\n roots: T[],\n indexPath: number[],\n childrenKey: string\n): T | undefined {\n if (!indexPath.length) return undefined\n let currentList: T[] | undefined = roots\n let node: T | undefined\n for (let i = 0; i < indexPath.length; i++) {\n const idx = indexPath[i]!\n if (!currentList) return undefined\n node = currentList[idx]\n if (node === undefined) return undefined\n if (i < indexPath.length - 1) {\n const next = node[childrenKey]\n currentList = Array.isArray(next) ? (next as T[]) : undefined\n }\n }\n return node\n}\n\ninterface Options {\n props: BatchEditProps\n emit: BatchEditEmits\n tableRef: ShallowRef<TableExposed | undefined>\n}\n\nexport interface BatchEditStates {\n /** 层级 */\n depth?: number\n visible: boolean\n type: 'create' | 'update'\n loading: boolean\n row?: TableRow\n /** 父级,只在添加子级时会有值 */\n parentRow?: TableRow\n /** 数据是否已更新 */\n dataUpdated: boolean\n}\n\nexport interface EditReturned {\n state: BatchEditStates\n insertIndexes: ShallowRef<number[]>\n handleSave: () => Promise<void>\n handleClose: () => void\n handleCreate: () => void\n handleEdit: (row: TableRow) => void\n handleCopy: (row: TableRow) => void\n handleDelete: (row: TableRow) => Promise<void>\n handleInsertToNext: (row: TableRow) => void\n handleInsertToPrev: (row: TableRow) => void\n handleInsertChild: (row: TableRow) => void\n}\n\nexport function useEdit(options: Options): EditReturned {\n const { props, emit, tableRef } = options\n\n /** 组件状态 */\n const state = shallowReactive<BatchEditStates>({\n depth: undefined,\n visible: false,\n type: 'create',\n loading: false,\n dataUpdated: false\n })\n\n const insertIndexes = shallowRef<number[]>([])\n\n watch(\n () => state.visible,\n (v) => {\n if (!v) {\n state.dataUpdated = false\n }\n }\n )\n\n /**\n * 「打开行 / 切换 type」时记录的基线快照\n * @description\n * 用于 changeCb 内部比对 — 若新值与基线相等(深比较)视为无改动,避免某些组件在 mount\n * 阶段把规范化后的值再写回模型时被误判为「用户已修改」\n */\n let baselineSnapshot: Record<string, any> | undefined\n\n function snapshotModelData() {\n return safeRun(() => JSON.parse(JSON.stringify(props.model?.data ?? {})), {})\n }\n\n watch(\n () => state.row,\n (row) => {\n props.model?.resetData()\n if (row) {\n state.type = 'update'\n state.visible = true\n props.model?.setData(row.data)\n } else {\n state.visible = false\n }\n baselineSnapshot = snapshotModelData()\n state.dataUpdated = false\n },\n // sync 保证 setData 完成后立刻取快照,避免 mount 期间组件回写值时丢基线\n { flush: 'sync' }\n )\n\n const changeCb = (field: string, val: any) => {\n // 与基线比较 — 同值(如组件 mount 时把当前值再写一次)不算\"用户修改\"\n if (baselineSnapshot) {\n const baseVal = o(baselineSnapshot).get(field)\n if (isSameValue(baseVal, val)) {\n return\n }\n }\n state.dataUpdated = true\n }\n\n function isSameValue(a: any, b: any) {\n if (a === b) return true\n if (a == null && b == null) return true\n if (typeof a !== typeof b) return false\n if (typeof a === 'object') {\n try {\n return JSON.stringify(a) === JSON.stringify(b)\n } catch {\n return false\n }\n }\n return false\n }\n\n watch(\n () => props.model,\n (model, oldModel) => {\n if (oldModel) {\n oldModel.offChange(changeCb)\n }\n if (model) {\n model.onChange(changeCb)\n }\n },\n { immediate: true }\n )\n\n const childrenKey = computed(() => {\n return typeof props.tree === 'string' ? props.tree : 'children'\n })\n\n /**\n * 插入数据\n * @param item 数据\n */\n function insert(item: Record<string, any>) {\n const data = [...(props.data ?? [])]\n\n const parent = visitDataByIndexPath(\n data ?? [],\n insertIndexes.value.slice(0, -1),\n childrenKey.value\n )\n\n if (parent) {\n const children = parent[childrenKey.value]\n if (!children) {\n parent[childrenKey.value] = [item]\n } else {\n children.splice(last(insertIndexes.value), 0, item)\n }\n } else {\n data.splice(last(insertIndexes.value), 0, item)\n }\n\n emit('update:data', data)\n\n return item\n }\n\n function getInsertData(): Record<string, any> {\n return safeRun(() => JSON.parse(JSON.stringify(props.model?.data ?? {})), {})\n }\n\n async function runCreate(cb: () => void) {\n state.parentRow = undefined\n if (state.row) {\n state.row.isCurrent = false\n }\n state.row = undefined\n state.type = 'create'\n props.model?.resetData()\n cb()\n\n let item: Record<string, any> | undefined = undefined\n\n await nextTick()\n\n state.visible = true\n\n if (item) {\n const row = tableRef.value?.getRowByData(item)\n if (row) {\n state.row = row\n }\n }\n }\n\n /**\n * 点击新增按钮\n */\n function handleCreate() {\n const { data } = props\n runCreate(() => {\n state.depth = 1\n insertIndexes.value = [data?.length ?? 0]\n })\n }\n\n function handleInsertToPrev(row: TableRow) {\n runCreate(() => {\n state.depth = row.depth\n insertIndexes.value = [...row.indexes]\n })\n }\n\n function handleInsertToNext(row: TableRow) {\n runCreate(() => {\n state.depth = row.depth\n insertIndexes.value = [...row.indexes.slice(0, -1), row.index + 1]\n })\n }\n\n function handleInsertChild(row: TableRow) {\n runCreate(() => {\n state.parentRow = row\n state.depth = row.depth + 1\n row.expanded = true\n\n insertIndexes.value = [...row.indexes, row.children?.length ?? 0]\n })\n }\n\n /** 编辑指定行(等同于点击行) */\n function handleEdit(row: TableRow) {\n state.row = row\n state.depth = row.depth\n }\n\n /** 复制指定行:在其下方以 create 模式打开表单,并预填副本数据 */\n function handleCopy(row: TableRow) {\n runCreate(() => {\n state.depth = row.depth\n insertIndexes.value = [...row.indexes.slice(0, -1), row.index + 1]\n const cloned = safeRun(() => JSON.parse(JSON.stringify(row.data ?? {})), {})\n props.model?.setData(cloned)\n })\n }\n\n function runWithLoading<Arg extends any[]>(fn: (...args: Arg) => Promise<void> | void) {\n return async (...args: Arg) => {\n state.loading = true\n if (state.row) {\n state.row.operating = true\n }\n try {\n await fn.apply(null, args)\n } catch (error) {\n console.error(error)\n }\n state.loading = false\n if (state.row) {\n state.row.operating = false\n }\n }\n }\n\n /** 保存 */\n const handleSave = runWithLoading(async () => {\n const { model, saveMethod } = props\n\n if (!model) return\n\n model.clearValidate()\n const valid = await model.validate()\n\n if (!valid) return\n\n let item = getInsertData()\n if (saveMethod) {\n const result = await saveMethod(item, state.type, state.parentRow)\n if (result) {\n item = result\n }\n }\n\n state.dataUpdated = false\n\n // 新增\n if (state.type === 'create') {\n insert(item)\n\n return model?.resetData()\n }\n // 更新\n if (state.type === 'update') {\n const { row } = state\n row &&\n model.allKeys.forEach((key) => {\n o(row.data).set(key, o(item).get(key))\n })\n }\n })\n\n const handleDelete = runWithLoading(async (row: TableRow) => {\n const { deleteMethod } = props\n\n if (deleteMethod) {\n await deleteMethod([row.data])\n }\n\n const data = [...(props.data ?? [])]\n\n const parent = visitDataByIndexPath(data, row.indexes.slice(0, -1), childrenKey.value)\n\n if (parent) {\n const children = parent[childrenKey.value]\n if (children) {\n children.splice(row.index, 1)\n } else {\n console.error('行路径不正确')\n }\n } else {\n data.splice(row.index, 1)\n }\n\n if (state.row === row) {\n state.row = undefined\n state.depth = undefined\n }\n\n emit('update:data', data)\n })\n\n function handleClose() {\n state.visible = false\n if (state.row) {\n state.row.isCurrent = false\n }\n state.row = undefined\n state.parentRow = undefined\n state.depth = undefined\n props.model?.resetData()\n insertIndexes.value = []\n }\n\n return {\n state,\n insertIndexes,\n handleDelete,\n handleInsertChild,\n handleInsertToNext,\n handleInsertToPrev,\n handleCreate,\n handleEdit,\n handleCopy,\n handleClose,\n handleSave\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-edit.js","names":[],"sources":["../../../src/components/batch-edit/use-edit.ts"],"sourcesContent":["import { last, o, safeRun } from '@cat-kit/core'\nimport { computed, nextTick, shallowReactive, shallowRef, watch, type ShallowRef } from 'vue'\n\nimport type { TableRow, BatchEditEmits, BatchEditProps, TableExposed } from '../../types'\n\n/** 按索引路径在原始数据树中定位节点(等价于历史 Forest.visit 路径访问) */\nfunction visitDataByIndexPath<T extends Record<string, unknown>>(\n roots: T[],\n indexPath: number[],\n childrenKey: string\n): T | undefined {\n if (!indexPath.length) return undefined\n let currentList: T[] | undefined = roots\n let node: T | undefined\n for (let i = 0; i < indexPath.length; i++) {\n const idx = indexPath[i]!\n if (!currentList) return undefined\n node = currentList[idx]\n if (node === undefined) return undefined\n if (i < indexPath.length - 1) {\n const next = node[childrenKey]\n currentList = Array.isArray(next) ? (next as T[]) : undefined\n }\n }\n return node\n}\n\ninterface Options {\n props: BatchEditProps\n emit: BatchEditEmits\n tableRef: ShallowRef<TableExposed | undefined>\n}\n\nexport interface BatchEditStates {\n /** 层级 */\n depth?: number\n visible: boolean\n type: 'create' | 'update'\n loading: boolean\n row?: TableRow\n /** 父级,只在添加子级时会有值 */\n parentRow?: TableRow\n /** 数据是否已更新 */\n dataUpdated: boolean\n}\n\nexport interface EditReturned {\n state: BatchEditStates\n insertIndexes: ShallowRef<number[]>\n handleSave: () => Promise<void>\n handleClose: () => void\n handleCreate: () => void\n handleEdit: (row: TableRow) => void\n handleCopy: (row: TableRow) => void\n handleDelete: (row: TableRow) => Promise<void>\n handleInsertToNext: (row: TableRow) => void\n handleInsertToPrev: (row: TableRow) => void\n handleInsertChild: (row: TableRow) => void\n}\n\nexport function useEdit(options: Options): EditReturned {\n const { props, emit, tableRef } = options\n\n /** 组件状态 */\n const state = shallowReactive<BatchEditStates>({\n depth: undefined,\n visible: false,\n type: 'create',\n loading: false,\n dataUpdated: false\n })\n\n const insertIndexes = shallowRef<number[]>([])\n\n watch(\n () => state.visible,\n (v) => {\n if (!v) {\n state.dataUpdated = false\n }\n }\n )\n\n /**\n * 「打开行 / 切换 type」时记录的基线快照\n * @description\n * 用于 changeCb 内部比对 — 若新值与基线相等(深比较)视为无改动,避免某些组件在 mount\n * 阶段把规范化后的值再写回模型时被误判为「用户已修改」\n */\n let baselineSnapshot: Record<string, any> | undefined\n\n function snapshotModelData() {\n return safeRun(() => JSON.parse(JSON.stringify(props.model?.data ?? {})), {})\n }\n\n watch(\n () => state.row,\n (row) => {\n props.model?.resetData()\n if (row) {\n state.type = 'update'\n state.visible = true\n props.model?.setData(row.data)\n } else {\n state.visible = false\n }\n baselineSnapshot = snapshotModelData()\n state.dataUpdated = false\n },\n // sync 保证 setData 完成后立刻取快照,避免 mount 期间组件回写值时丢基线\n { flush: 'sync' }\n )\n\n const changeCb = (field: string, val: any) => {\n // 与基线比较 — 同值(如组件 mount 时把当前值再写一次)不算\"用户修改\"\n if (baselineSnapshot) {\n const baseVal = o(baselineSnapshot).get(field)\n if (isSameValue(baseVal, val)) {\n return\n }\n }\n state.dataUpdated = true\n }\n\n function isSameValue(a: any, b: any) {\n if (a === b) return true\n if (a == null && b == null) return true\n if (typeof a !== typeof b) return false\n if (typeof a === 'object') {\n try {\n return JSON.stringify(a) === JSON.stringify(b)\n } catch {\n return false\n }\n }\n return false\n }\n\n watch(\n () => props.model,\n (model, oldModel) => {\n if (oldModel) {\n oldModel.offChange(changeCb)\n }\n if (model) {\n model.onChange(changeCb)\n }\n },\n { immediate: true }\n )\n\n const childrenKey = computed(() => {\n return typeof props.tree === 'string' ? props.tree : 'children'\n })\n\n /**\n * 插入数据\n * @param item 数据\n */\n function insert(item: Record<string, any>) {\n const data = [...(props.data ?? [])]\n\n const parent = visitDataByIndexPath(\n data ?? [],\n insertIndexes.value.slice(0, -1),\n childrenKey.value\n )\n\n if (parent) {\n const children = parent[childrenKey.value]\n if (!children) {\n parent[childrenKey.value] = [item]\n } else {\n children.splice(last(insertIndexes.value), 0, item)\n }\n } else {\n data.splice(last(insertIndexes.value), 0, item)\n }\n\n emit('update:data', data)\n\n return item\n }\n\n function getInsertData(): Record<string, any> {\n return safeRun(() => JSON.parse(JSON.stringify(props.model?.data ?? {})), {})\n }\n\n async function runCreate(cb: () => void) {\n state.parentRow = undefined\n if (state.row) {\n state.row.isCurrent = false\n }\n state.row = undefined\n state.type = 'create'\n props.model?.resetData()\n cb()\n\n let item: Record<string, any> | undefined = undefined\n\n await nextTick()\n\n state.visible = true\n\n if (item) {\n const row = tableRef.value?.getRowByData(item)\n if (row) {\n state.row = row\n }\n }\n }\n\n /**\n * 点击新增按钮\n */\n function handleCreate() {\n const { data } = props\n runCreate(() => {\n state.depth = 1\n insertIndexes.value = [data?.length ?? 0]\n })\n }\n\n function handleInsertToPrev(row: TableRow) {\n runCreate(() => {\n state.depth = row.depth\n insertIndexes.value = [...row.indexes]\n })\n }\n\n function handleInsertToNext(row: TableRow) {\n runCreate(() => {\n state.depth = row.depth\n insertIndexes.value = [...row.indexes.slice(0, -1), row.index + 1]\n })\n }\n\n function handleInsertChild(row: TableRow) {\n runCreate(() => {\n state.parentRow = row\n state.depth = row.depth + 1\n row.expanded = true\n\n insertIndexes.value = [...row.indexes, row.children?.length ?? 0]\n })\n }\n\n /** 编辑指定行(等同于点击行) */\n function handleEdit(row: TableRow) {\n state.row = row\n state.depth = row.depth\n }\n\n /** 复制指定行:在其下方以 create 模式打开表单,并预填副本数据 */\n function handleCopy(row: TableRow) {\n runCreate(() => {\n state.depth = row.depth\n insertIndexes.value = [...row.indexes.slice(0, -1), row.index + 1]\n const cloned = safeRun(() => JSON.parse(JSON.stringify(row.data ?? {})), {})\n props.model?.setData(cloned)\n })\n }\n\n function runWithLoading<Arg extends any[]>(fn: (...args: Arg) => Promise<void> | void) {\n return async (...args: Arg) => {\n state.loading = true\n if (state.row) {\n state.row.operating = true\n }\n try {\n await fn.apply(null, args)\n } catch (error) {\n console.error(error)\n }\n state.loading = false\n if (state.row) {\n state.row.operating = false\n }\n }\n }\n\n /** 保存 */\n const handleSave = runWithLoading(async () => {\n const { model, saveMethod } = props\n\n if (!model) return\n\n model.clearValidate()\n const valid = await model.validate()\n\n if (!valid) return\n\n let item = getInsertData()\n if (saveMethod) {\n const result = await saveMethod(item, state.type, state.parentRow)\n if (result) {\n item = result\n }\n }\n\n state.dataUpdated = false\n\n // 新增\n if (state.type === 'create') {\n insert(item)\n\n return model?.resetData()\n }\n // 更新\n if (state.type === 'update') {\n const { row } = state\n row &&\n model.allKeys.forEach((key) => {\n o(row.data).set(key, o(item).get(key))\n })\n }\n })\n\n const handleDelete = runWithLoading(async (row: TableRow) => {\n const { deleteMethod } = props\n\n if (deleteMethod) {\n await deleteMethod([row.data])\n }\n\n const data = [...(props.data ?? [])]\n\n const parent = visitDataByIndexPath(data, row.indexes.slice(0, -1), childrenKey.value)\n\n if (parent) {\n const children = parent[childrenKey.value]\n if (children) {\n children.splice(row.index, 1)\n } else {\n console.error('行路径不正确')\n }\n } else {\n data.splice(row.index, 1)\n }\n\n if (state.row === row) {\n state.row = undefined\n state.depth = undefined\n }\n\n emit('update:data', data)\n })\n\n function handleClose() {\n state.visible = false\n if (state.row) {\n state.row.isCurrent = false\n }\n state.row = undefined\n state.parentRow = undefined\n state.depth = undefined\n props.model?.resetData()\n insertIndexes.value = []\n }\n\n return {\n state,\n insertIndexes,\n handleDelete,\n handleInsertChild,\n handleInsertToNext,\n handleInsertToPrev,\n handleCreate,\n handleEdit,\n handleCopy,\n handleClose,\n handleSave\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"breadcrumb.js","names":[],"sources":["../../../src/components/breadcrumb/breadcrumb.vue"],"sourcesContent":["<template>\n <nav :class=\"[cls.b, cls.m(size)]\" aria-label=\"Breadcrumb\">\n <ol :class=\"cls.e('list')\">\n <template v-for=\"(item, index) in props.items\" :key=\"index\">\n <li :class=\"cls.e('item')\">\n <slot name=\"item\" v-bind=\"{ item, index, isLast: index === props.items.length - 1 }\">\n <a\n v-if=\"isAnchor(item, index)\"\n :class=\"linkClass(item, index)\"\n :href=\"item.href\"\n :aria-disabled=\"item.disabled ? 'true' : undefined\"\n :tabindex=\"item.disabled ? -1 : undefined\"\n @click=\"handleAnchorClick($event, item, index)\"\n >\n {{ item.title }}\n </a>\n <span\n v-else-if=\"isActionSpan(item, index)\"\n :class=\"linkClass(item, index)\"\n role=\"link\"\n :tabindex=\"item.disabled ? -1 : 0\"\n @click=\"handleSpanClick($event, item, index)\"\n @keydown=\"handleSpanKeydown($event, item, index)\"\n >\n {{ item.title }}\n </span>\n <span v-else :class=\"innerClass(true)\" aria-current=\"page\">{{ item.title }}</span>\n </slot>\n </li>\n <li v-if=\"index < props.items.length - 1\" :class=\"cls.e('separator')\" aria-hidden=\"true\">\n <slot name=\"separator\">/</slot>\n </li>\n </template>\n </ol>\n </nav>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\n\nimport type {\n BreadcrumbEmits,\n BreadcrumbItem,\n BreadcrumbProps,\n BreadcrumbSlotScope,\n ComponentSize\n} from '../../types'\n\ndefineOptions({\n name: 'Breadcrumb'\n})\n\nconst props = withDefaults(defineProps<BreadcrumbProps>(), {\n lastLinked: false\n})\n\nconst emit = defineEmits<BreadcrumbEmits>()\n\ndefineSlots<{\n item?: (scope: BreadcrumbSlotScope) => unknown\n separator?: () => unknown\n}>()\n\nconst cls = bem('breadcrumb')\n\nconst { size } = useFallbackProps([props], {\n size: 'default' as ComponentSize\n})\n\nconst isLast = (index: number) => index === props.items.length - 1\n\nconst isLinked = (item: BreadcrumbItem, index: number) => {\n if (item.disabled) return false\n if (isLast(index)) return props.lastLinked\n return true\n}\n\nconst isAnchor = (item: BreadcrumbItem, index: number) => isLinked(item, index) && !!item.href\n\nconst isActionSpan = (item: BreadcrumbItem, index: number) => isLinked(item, index) && !item.href\n\nconst innerClass = (current: boolean) => [cls.e('inner'), current && bem.is('current', current)]\n\nconst linkClass = (item: BreadcrumbItem, index: number) => [\n cls.e('inner'),\n cls.e('link'),\n bem.is('disabled', !!item.disabled),\n bem.is('current', isLast(index) && !props.lastLinked)\n]\n\nconst handleAnchorClick = (ev: MouseEvent, item: BreadcrumbItem, index: number) => {\n if (item.disabled) {\n ev.preventDefault()\n ev.stopPropagation()\n }\n}\n\nconst handleSpanClick = (ev: MouseEvent, item: BreadcrumbItem, index: number) => {\n if (item.disabled) {\n ev.preventDefault()\n return\n }\n emit('click', item, index, ev)\n}\n\nconst handleSpanKeydown = (ev: KeyboardEvent, item: BreadcrumbItem, index: number) => {\n if (item.disabled) return\n if (ev.key !== 'Enter' && ev.key !== ' ') return\n ev.preventDefault()\n emit('click', item, index, ev)\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"breadcrumb.js","names":[],"sources":["../../../src/components/breadcrumb/breadcrumb.vue"],"sourcesContent":["<template>\n <nav :class=\"[cls.b, cls.m(size)]\" aria-label=\"Breadcrumb\">\n <ol :class=\"cls.e('list')\">\n <template v-for=\"(item, index) in props.items\" :key=\"index\">\n <li :class=\"cls.e('item')\">\n <slot name=\"item\" v-bind=\"{ item, index, isLast: index === props.items.length - 1 }\">\n <a\n v-if=\"isAnchor(item, index)\"\n :class=\"linkClass(item, index)\"\n :href=\"item.href\"\n :aria-disabled=\"item.disabled ? 'true' : undefined\"\n :tabindex=\"item.disabled ? -1 : undefined\"\n @click=\"handleAnchorClick($event, item, index)\"\n >\n {{ item.title }}\n </a>\n <span\n v-else-if=\"isActionSpan(item, index)\"\n :class=\"linkClass(item, index)\"\n role=\"link\"\n :tabindex=\"item.disabled ? -1 : 0\"\n @click=\"handleSpanClick($event, item, index)\"\n @keydown=\"handleSpanKeydown($event, item, index)\"\n >\n {{ item.title }}\n </span>\n <span v-else :class=\"innerClass(true)\" aria-current=\"page\">{{ item.title }}</span>\n </slot>\n </li>\n <li v-if=\"index < props.items.length - 1\" :class=\"cls.e('separator')\" aria-hidden=\"true\">\n <slot name=\"separator\">/</slot>\n </li>\n </template>\n </ol>\n </nav>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\n\nimport type {\n BreadcrumbEmits,\n BreadcrumbItem,\n BreadcrumbProps,\n BreadcrumbSlotScope,\n ComponentSize\n} from '../../types'\n\ndefineOptions({\n name: 'Breadcrumb'\n})\n\nconst props = withDefaults(defineProps<BreadcrumbProps>(), {\n lastLinked: false\n})\n\nconst emit = defineEmits<BreadcrumbEmits>()\n\ndefineSlots<{\n item?: (scope: BreadcrumbSlotScope) => unknown\n separator?: () => unknown\n}>()\n\nconst cls = bem('breadcrumb')\n\nconst { size } = useFallbackProps([props], {\n size: 'default' as ComponentSize\n})\n\nconst isLast = (index: number) => index === props.items.length - 1\n\nconst isLinked = (item: BreadcrumbItem, index: number) => {\n if (item.disabled) return false\n if (isLast(index)) return props.lastLinked\n return true\n}\n\nconst isAnchor = (item: BreadcrumbItem, index: number) => isLinked(item, index) && !!item.href\n\nconst isActionSpan = (item: BreadcrumbItem, index: number) => isLinked(item, index) && !item.href\n\nconst innerClass = (current: boolean) => [cls.e('inner'), current && bem.is('current', current)]\n\nconst linkClass = (item: BreadcrumbItem, index: number) => [\n cls.e('inner'),\n cls.e('link'),\n bem.is('disabled', !!item.disabled),\n bem.is('current', isLast(index) && !props.lastLinked)\n]\n\nconst handleAnchorClick = (ev: MouseEvent, item: BreadcrumbItem, index: number) => {\n if (item.disabled) {\n ev.preventDefault()\n ev.stopPropagation()\n }\n}\n\nconst handleSpanClick = (ev: MouseEvent, item: BreadcrumbItem, index: number) => {\n if (item.disabled) {\n ev.preventDefault()\n return\n }\n emit('click', item, index, ev)\n}\n\nconst handleSpanKeydown = (ev: KeyboardEvent, item: BreadcrumbItem, index: number) => {\n if (item.disabled) return\n if (ev.key !== 'Enter' && ev.key !== ' ') return\n ev.preventDefault()\n emit('click', item, index, ev)\n}\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"button-group.js","names":[],"sources":["../../../src/components/button/button-group.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <slot v-bind=\"{ props }\" />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\n\nimport type { ButtonProps } from '../../types'\n\ndefineOptions({\n name: 'ButtonGroup'\n})\n\nconst props = defineProps<ButtonProps>()\n\nconst cls = bem('button-group')\n\ndefineSlots<{\n default: (props: { props: ButtonProps }) => any\n}>()\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,eAAc;;uBAhB5B,mBAEM,OAAA,EAFA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,EAAA,EAAA,CAChB,WAA2B,KAAA,QAAA,WAAA,eAAA,mBAAA,EAAX,OAAK,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA"}
1
+ {"version":3,"file":"button-group.js","names":[],"sources":["../../../src/components/button/button-group.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <slot v-bind=\"{ props }\" />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\n\nimport type { ButtonProps } from '../../types'\n\ndefineOptions({\n name: 'ButtonGroup'\n})\n\nconst props = defineProps<ButtonProps>()\n\nconst cls = bem('button-group')\n\ndefineSlots<{\n default: (props: { props: ButtonProps }) => any\n}>()\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,eAAc;;uBAhB5B,mBAEM,OAAA,EAFA,OAAK,eAAE,MAAA,IAAA,CAAI,EAAC,EAAA,EAAA,CAChB,WAA2B,KAAA,QAAA,WAAA,eAAA,mBAAA,EAAX,OAAK,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","names":[],"sources":["../../../src/components/button/button.vue"],"sourcesContent":["<template>\n <button\n :class=\"classList\"\n type=\"button\"\n aria-label=\"button\"\n ref=\"buttonRef\"\n v-ripple=\"ripple\"\n @click=\"handleClick\"\n >\n <!-- 加载图标 -->\n <u-icon v-if=\"loading\" :class=\"[bem.is('loading')]\" :size=\"iconSize\">\n <component :is=\"loadingIcon\" />\n </u-icon>\n\n <!-- 左侧图标 -->\n <u-icon v-if=\"!!icon && iconPosition === 'left' && !loading\" :size=\"iconSize\">\n <component :is=\"icon\" />\n </u-icon>\n\n <slot />\n\n <!-- 右侧图标 -->\n <u-icon v-if=\"!!icon && iconPosition === 'right'\" :size=\"iconSize\">\n <component :is=\"icon\" />\n </u-icon>\n </button>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { vRipple } from '@veltra/directives'\nimport { Loading } from '@veltra/icons'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef } from 'vue'\n\nimport type { ButtonEmits, ButtonProps, _ButtonExposed, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({\n name: 'Button'\n})\n\nconst props = withDefaults(defineProps<ButtonProps>(), {\n iconPosition: 'left',\n loadingIcon: () => Loading,\n disabled: false,\n propagate: true\n})\n\nconst { size } = useFallbackProps([props], {\n size: 'default' as ComponentSize\n})\n\nconst emit = defineEmits<ButtonEmits>()\n\nconst cls = bem('button')\n\nconst classList = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n props.type && cls.m('color-' + props.type),\n bem.is('circle', props.circle),\n bem.is('disabled', props.disabled),\n bem.is('loading', props.loading),\n bem.is('plain', props.plain),\n bem.is('text', props.text)\n ]\n})\n\nconst ripple = computed(() => {\n if (props.disabled || props.loading) return false\n if ((props.plain || props.text) && props.type) {\n return bem.is(`ripple-${props.type}`)\n }\n return true\n})\n\nconst handleClick = (e: MouseEvent) => {\n if (props.disabled || props.loading) {\n e.stopPropagation()\n return\n }\n\n !props.propagate && e.stopPropagation()\n\n emit('click', e)\n}\n\nconst buttonRef = shallowRef<HTMLButtonElement>()\n\nconst exposed: _ButtonExposed = {\n el: buttonRef\n}\n\ndefineExpose(exposed)\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CA,MAAM,QAAQ;EAOd,MAAM,EAAE,SAAS,iBAAiB,CAAC,MAAM,EAAE,EACzC,MAAM,WACP,CAAA;EAED,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,SAAQ;EAExB,MAAM,YAAY,eAAe;AAC/B,UAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,MAAM;IACjB,MAAM,QAAQ,IAAI,EAAE,WAAW,MAAM,KAAK;IAC1C,IAAI,GAAG,UAAU,MAAM,OAAO;IAC9B,IAAI,GAAG,YAAY,MAAM,SAAS;IAClC,IAAI,GAAG,WAAW,MAAM,QAAQ;IAChC,IAAI,GAAG,SAAS,MAAM,MAAM;IAC5B,IAAI,GAAG,QAAQ,MAAM,KAAI;IAC3B;IACD;EAED,MAAM,SAAS,eAAe;AAC5B,OAAI,MAAM,YAAY,MAAM,QAAS,QAAO;AAC5C,QAAK,MAAM,SAAS,MAAM,SAAS,MAAM,KACvC,QAAO,IAAI,GAAG,UAAU,MAAM,OAAM;AAEtC,UAAO;IACR;EAED,MAAM,eAAe,MAAkB;AACrC,OAAI,MAAM,YAAY,MAAM,SAAS;AACnC,MAAE,iBAAgB;AAClB;;AAGF,IAAC,MAAM,aAAa,EAAE,iBAAgB;AAEtC,QAAK,SAAS,EAAC;;EAGjB,MAAM,YAAY,YAA8B;AAMhD,WAAa,EAHX,IAAI,WAGO,CAAO;;uCA9FlB,mBAwBS,UAAA;IAvBN,OAAK,eAAE,UAAA,MAAS;IACjB,MAAK;IACL,cAAW;aACP;IAAJ,KAAI;IAEH,SAAO;;IAER,mBAAA,SAAa;IACC,QAAA,WAAA,WAAA,EAAd,YAES,MAAA,YAAA,EAAA;;KAFe,OAAK,eAAA,CAAG,MAAA,IAAG,CAAC,GAAE,UAAA,CAAA,CAAA;KAAe,MAAM,QAAA;;4BAC1B,EAAA,WAAA,EAA/B,YAA+B,wBAAf,QAAA,YAAW,CAAA,EAAA,CAAA;;;IAG7B,mBAAA,SAAa;MACG,QAAA,QAAQ,QAAA,iBAAY,UAAA,CAAgB,QAAA,WAAA,WAAA,EAApD,YAES,MAAA,YAAA,EAAA;;KAFqD,MAAM,QAAA;;4BAC1C,EAAA,WAAA,EAAxB,YAAwB,wBAAR,QAAA,KAAI,CAAA,EAAA,CAAA;;;IAGtB,WAAQ,KAAA,QAAA,UAAA;IAER,mBAAA,SAAa;MACG,QAAA,QAAQ,QAAA,iBAAY,WAAA,WAAA,EAApC,YAES,MAAA,YAAA,EAAA;;KAF0C,MAAM,QAAA;;4BAC/B,EAAA,WAAA,EAAxB,YAAwB,wBAAR,QAAA,KAAI,CAAA,EAAA,CAAA;;;6BAjBZ,OAAA,MAAM,CAAA,CAAA"}
1
+ {"version":3,"file":"button.js","names":[],"sources":["../../../src/components/button/button.vue"],"sourcesContent":["<template>\n <button\n :class=\"classList\"\n type=\"button\"\n aria-label=\"button\"\n ref=\"buttonRef\"\n v-ripple=\"ripple\"\n @click=\"handleClick\"\n >\n <!-- 加载图标 -->\n <u-icon v-if=\"loading\" :class=\"[bem.is('loading')]\" :size=\"iconSize\">\n <component :is=\"loadingIcon\" />\n </u-icon>\n\n <!-- 左侧图标 -->\n <u-icon v-if=\"!!icon && iconPosition === 'left' && !loading\" :size=\"iconSize\">\n <component :is=\"icon\" />\n </u-icon>\n\n <slot />\n\n <!-- 右侧图标 -->\n <u-icon v-if=\"!!icon && iconPosition === 'right'\" :size=\"iconSize\">\n <component :is=\"icon\" />\n </u-icon>\n </button>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { vRipple } from '@veltra/directives'\nimport { Loading } from '@veltra/icons'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef } from 'vue'\n\nimport type { ButtonEmits, ButtonProps, _ButtonExposed, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({\n name: 'Button'\n})\n\nconst props = withDefaults(defineProps<ButtonProps>(), {\n iconPosition: 'left',\n loadingIcon: () => Loading,\n disabled: false,\n propagate: true\n})\n\nconst { size } = useFallbackProps([props], {\n size: 'default' as ComponentSize\n})\n\nconst emit = defineEmits<ButtonEmits>()\n\nconst cls = bem('button')\n\nconst classList = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n props.type && cls.m('color-' + props.type),\n bem.is('circle', props.circle),\n bem.is('disabled', props.disabled),\n bem.is('loading', props.loading),\n bem.is('plain', props.plain),\n bem.is('text', props.text)\n ]\n})\n\nconst ripple = computed(() => {\n if (props.disabled || props.loading) return false\n if ((props.plain || props.text) && props.type) {\n return bem.is(`ripple-${props.type}`)\n }\n return true\n})\n\nconst handleClick = (e: MouseEvent) => {\n if (props.disabled || props.loading) {\n e.stopPropagation()\n return\n }\n\n !props.propagate && e.stopPropagation()\n\n emit('click', e)\n}\n\nconst buttonRef = shallowRef<HTMLButtonElement>()\n\nconst exposed: _ButtonExposed = {\n el: buttonRef\n}\n\ndefineExpose(exposed)\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CA,MAAM,QAAQ;EAOd,MAAM,EAAE,SAAS,iBAAiB,CAAC,MAAK,EAAG,EACzC,MAAM,WACP,CAAA;EAED,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,SAAQ;EAExB,MAAM,YAAY,eAAe;GAC/B,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,MAAK;IAChB,MAAM,QAAQ,IAAI,EAAE,WAAW,MAAM,KAAI;IACzC,IAAI,GAAG,UAAU,MAAM,OAAM;IAC7B,IAAI,GAAG,YAAY,MAAM,SAAQ;IACjC,IAAI,GAAG,WAAW,MAAM,QAAO;IAC/B,IAAI,GAAG,SAAS,MAAM,MAAK;IAC3B,IAAI,GAAG,QAAQ,MAAM,KAAI;IAC3B;IACD;EAED,MAAM,SAAS,eAAe;GAC5B,IAAI,MAAM,YAAY,MAAM,SAAS,OAAO;GAC5C,KAAK,MAAM,SAAS,MAAM,SAAS,MAAM,MACvC,OAAO,IAAI,GAAG,UAAU,MAAM,OAAM;GAEtC,OAAO;IACR;EAED,MAAM,eAAe,MAAkB;GACrC,IAAI,MAAM,YAAY,MAAM,SAAS;IACnC,EAAE,iBAAgB;IAClB;;GAGF,CAAC,MAAM,aAAa,EAAE,iBAAgB;GAEtC,KAAK,SAAS,EAAC;;EAGjB,MAAM,YAAY,YAA8B;EAMhD,SAAa,EAHX,IAAI,WAGc,CAAA;;uCA9FlB,mBAwBS,UAAA;IAvBN,OAAK,eAAE,UAAA,MAAS;IACjB,MAAK;IACL,cAAW;aACP;IAAJ,KAAI;IAEH,SAAO;;IAER,mBAAA,SAAA;IACc,QAAA,WAAA,WAAA,EAAd,YAES,MAAA,YAAA,EAAA;;KAFe,OAAK,eAAA,CAAG,MAAA,IAAA,CAAI,GAAE,UAAA,CAAA,CAAA;KAAe,MAAM,QAAA;;4BAC1B,EAAA,WAAA,EAA/B,YAA+B,wBAAf,QAAA,YAAW,CAAA,EAAA,CAAA;;;IAG7B,mBAAA,SAAA;MACgB,QAAA,QAAQ,QAAA,iBAAY,UAAA,CAAgB,QAAA,WAAA,WAAA,EAApD,YAES,MAAA,YAAA,EAAA;;KAFqD,MAAM,QAAA;;4BAC1C,EAAA,WAAA,EAAxB,YAAwB,wBAAR,QAAA,KAAI,CAAA,EAAA,CAAA;;;IAGtB,WAAQ,KAAA,QAAA,UAAA;IAER,mBAAA,SAAA;MACgB,QAAA,QAAQ,QAAA,iBAAY,WAAA,WAAA,EAApC,YAES,MAAA,YAAA,EAAA;;KAF0C,MAAM,QAAA;;4BAC/B,EAAA,WAAA,EAAxB,YAAwB,wBAAR,QAAA,KAAI,CAAA,EAAA,CAAA;;;6BAjBZ,OAAA,MAAM,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.js","names":[],"sources":["../../../src/components/calendar/calendar.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <ul :class=\"cls.e('days')\">\n <li\n :class=\"[cls.e('day'), cls.em('day', day.type)]\"\n v-for=\"day of days\"\n :key=\"day.date.timestamp\"\n >\n {{ day.date.day }}\n </li>\n </ul>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CalendarProps } from '../../types'\nimport { getMonthDays } from './utils'\n\ndefineOptions({\n name: 'Calendar'\n})\n\ndefineProps<CalendarProps>()\n\nconst model = defineModel<string>()\n\nconst cls = bem('calendar')\n\nconst days = computed(() => {\n return getMonthDays(model.value ?? new Date())\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;EA2BA,MAAM,QAAQ,SAAmB,SAAA,aAAC;EAElC,MAAM,MAAM,IAAI,WAAU;EAE1B,MAAM,OAAO,eAAe;AAC1B,UAAO,aAAa,MAAM,yBAAS,IAAI,MAAM,CAAA;IAC9C;;uBAhCC,mBAUM,OAAA,EAVA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,EAAA,EAAA,CAChB,mBAQK,MAAA,EARA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,OAAA,CAAA,EAAA,EAAA,EAAA,UAAA,KAAA,EACf,mBAMK,UAAA,MAAA,WAJW,KAAA,QAAP,QAAG;wBAFZ,mBAMK,MAAA;KALF,OAAK,eAAA,CAAG,MAAA,IAAG,CAAC,EAAC,MAAA,EAAS,MAAA,IAAG,CAAC,GAAE,OAAQ,IAAI,KAAI,CAAA,CAAA;KAE5C,KAAK,IAAI,KAAK;uBAEZ,IAAI,KAAK,IAAG,EAAA,EAAA"}
1
+ {"version":3,"file":"calendar.js","names":[],"sources":["../../../src/components/calendar/calendar.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <ul :class=\"cls.e('days')\">\n <li\n :class=\"[cls.e('day'), cls.em('day', day.type)]\"\n v-for=\"day of days\"\n :key=\"day.date.timestamp\"\n >\n {{ day.date.day }}\n </li>\n </ul>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CalendarProps } from '../../types'\nimport { getMonthDays } from './utils'\n\ndefineOptions({\n name: 'Calendar'\n})\n\ndefineProps<CalendarProps>()\n\nconst model = defineModel<string>()\n\nconst cls = bem('calendar')\n\nconst days = computed(() => {\n return getMonthDays(model.value ?? new Date())\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;EA2BA,MAAM,QAAQ,SAAmB,SAAA,aAAC;EAElC,MAAM,MAAM,IAAI,WAAU;EAE1B,MAAM,OAAO,eAAe;GAC1B,OAAO,aAAa,MAAM,yBAAS,IAAI,MAAM,CAAA;IAC9C;;uBAhCC,mBAUM,OAAA,EAVA,OAAK,eAAE,MAAA,IAAA,CAAI,EAAC,EAAA,EAAA,CAChB,mBAQK,MAAA,EARA,OAAK,eAAE,MAAA,IAAA,CAAI,EAAC,OAAA,CAAA,EAAA,EAAA,EAAA,UAAA,KAAA,EACf,mBAMK,UAAA,MAAA,WAJW,KAAA,QAAP,QAAG;wBAFZ,mBAMK,MAAA;KALF,OAAK,eAAA,CAAG,MAAA,IAAA,CAAI,EAAC,MAAA,EAAS,MAAA,IAAA,CAAI,GAAE,OAAQ,IAAI,KAAI,CAAA,CAAA;KAE5C,KAAK,IAAI,KAAK;uBAEZ,IAAI,KAAK,IAAG,EAAA,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../src/components/calendar/utils.ts"],"sourcesContent":["import { type Dater, date } from '@cat-kit/core'\n\nimport type { CalendarDay, CalendarMonth, CalendarYear } from '../../types'\n\nexport const weekDays: string[] = ['日', '一', '二', '三', '四', '五', '六']\n\n/**\n * 获取一个月的天数\n * @param d 日期\n * @param disabledDate 禁用日期\n * @returns\n */\nexport function getMonthDays(\n d: Date | string | number | Dater,\n disabledDate?: (d: Dater) => boolean\n): CalendarDay[] {\n const todayStr = date().format()\n if (d instanceof Date || typeof d === 'string' || typeof d === 'number') {\n d = date(d)\n }\n\n // 本月天数\n d.setDay(1)\n const currentMonthDays: CalendarDay[] = Array.from({ length: d.getDays() }).map((_, i) => {\n const day: CalendarDay = { date: d.calc(i, 'days'), type: 'current' }\n day.isToday = day.date.format() === todayStr\n day.disabled = disabledDate?.(day.date)\n return day\n })\n\n const preMonthDays: CalendarDay[] = []\n\n const nextMonthDays: CalendarDay[] = []\n\n // 上月天数\n const firstDayWeek = d.weekDay\n\n if (firstDayWeek !== 0) {\n // 上个月最后一天\n d.setDay(0)\n let i = 0\n while (i < firstDayWeek) {\n const day: CalendarDay = { date: d.calc(-i, 'days'), type: 'pre' }\n day.disabled = disabledDate?.(day.date)\n preMonthDays.unshift(day)\n i++\n }\n }\n\n // 下个月的天数\n const nextMonthDaysAmount = 42 - currentMonthDays.length - preMonthDays.length\n\n let j = 0\n d.setMonth(d.month + 2).setDay(1)\n\n while (j < nextMonthDaysAmount) {\n const day: CalendarDay = { date: d.calc(j++, 'days'), type: 'next' }\n day.disabled = disabledDate?.(day.date)\n nextMonthDays.push(day)\n }\n\n return [...preMonthDays, ...currentMonthDays, ...nextMonthDays]\n}\n\n/**\n * 获取一年的月份\n * @param d 日期\n * @param disabledDate 禁用的日期\n * @returns\n */\nexport function getYearMonths(\n d: Date | string | number | Dater,\n disabledDate?: (d: Dater) => boolean\n): CalendarMonth[] {\n if (d instanceof Date || typeof d === 'string' || typeof d === 'number') {\n d = date(d)\n }\n\n const year = d.year\n\n return Array.from({ length: 12 }).map((_, i) => {\n const month = i + 1\n\n const ym = `${year}-${month}`\n\n const monthDate = date(ym).toEndOfMonth().setHours(23)\n\n monthDate.setMinutes(59)\n monthDate.setSeconds(59)\n\n return { key: ym, month, date: monthDate, disabled: disabledDate?.(monthDate) }\n })\n}\n\n/**\n * 获取当前年份所处的10年\n * @param d 日期\n * @param disabledDate 禁用的日期\n * @returns\n */\nexport function getTenYears(\n d: Date | string | number | Dater,\n disabledDate?: (d: Dater) => boolean\n): CalendarYear[] {\n if (d instanceof Date || typeof d === 'string' || typeof d === 'number') {\n d = date(d)\n }\n\n const startYear = d.year - (d.year % 10) + 1\n\n return Array.from({ length: 10 }).map((_, i) => {\n const year = startYear + i\n\n const yearDate = date(`${year}-12-31 23:59:59`)\n\n return { year, date: yearDate, disabled: disabledDate?.(yearDate) }\n })\n}\n"],"mappings":";;AAIA,MAAa,WAAqB;CAAC;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAI;;;;;;;AAQrE,SAAgB,aACd,GACA,cACe;CACf,MAAM,WAAW,MAAM,CAAC,QAAQ;AAChC,KAAI,aAAa,QAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,SAC7D,KAAI,KAAK,EAAE;AAIb,GAAE,OAAO,EAAE;CACX,MAAM,mBAAkC,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,GAAG,MAAM;EACxF,MAAM,MAAmB;GAAE,MAAM,EAAE,KAAK,GAAG,OAAO;GAAE,MAAM;GAAW;AACrE,MAAI,UAAU,IAAI,KAAK,QAAQ,KAAK;AACpC,MAAI,WAAW,eAAe,IAAI,KAAK;AACvC,SAAO;GACP;CAEF,MAAM,eAA8B,EAAE;CAEtC,MAAM,gBAA+B,EAAE;CAGvC,MAAM,eAAe,EAAE;AAEvB,KAAI,iBAAiB,GAAG;AAEtB,IAAE,OAAO,EAAE;EACX,IAAI,IAAI;AACR,SAAO,IAAI,cAAc;GACvB,MAAM,MAAmB;IAAE,MAAM,EAAE,KAAK,CAAC,GAAG,OAAO;IAAE,MAAM;IAAO;AAClE,OAAI,WAAW,eAAe,IAAI,KAAK;AACvC,gBAAa,QAAQ,IAAI;AACzB;;;CAKJ,MAAM,sBAAsB,KAAK,iBAAiB,SAAS,aAAa;CAExE,IAAI,IAAI;AACR,GAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE;AAEjC,QAAO,IAAI,qBAAqB;EAC9B,MAAM,MAAmB;GAAE,MAAM,EAAE,KAAK,KAAK,OAAO;GAAE,MAAM;GAAQ;AACpE,MAAI,WAAW,eAAe,IAAI,KAAK;AACvC,gBAAc,KAAK,IAAI;;AAGzB,QAAO;EAAC,GAAG;EAAc,GAAG;EAAkB,GAAG;EAAc;;;;;;;;AASjE,SAAgB,cACd,GACA,cACiB;AACjB,KAAI,aAAa,QAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,SAC7D,KAAI,KAAK,EAAE;CAGb,MAAM,OAAO,EAAE;AAEf,QAAO,MAAM,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;EAC9C,MAAM,QAAQ,IAAI;EAElB,MAAM,KAAK,GAAG,KAAK,GAAG;EAEtB,MAAM,YAAY,KAAK,GAAG,CAAC,cAAc,CAAC,SAAS,GAAG;AAEtD,YAAU,WAAW,GAAG;AACxB,YAAU,WAAW,GAAG;AAExB,SAAO;GAAE,KAAK;GAAI;GAAO,MAAM;GAAW,UAAU,eAAe,UAAU;GAAE;GAC/E;;;;;;;;AASJ,SAAgB,YACd,GACA,cACgB;AAChB,KAAI,aAAa,QAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,SAC7D,KAAI,KAAK,EAAE;CAGb,MAAM,YAAY,EAAE,OAAQ,EAAE,OAAO,KAAM;AAE3C,QAAO,MAAM,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;EAC9C,MAAM,OAAO,YAAY;EAEzB,MAAM,WAAW,KAAK,GAAG,KAAK,iBAAiB;AAE/C,SAAO;GAAE;GAAM,MAAM;GAAU,UAAU,eAAe,SAAS;GAAE;GACnE"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../src/components/calendar/utils.ts"],"sourcesContent":["import { type Dater, date } from '@cat-kit/core'\n\nimport type { CalendarDay, CalendarMonth, CalendarYear } from '../../types'\n\nexport const weekDays: string[] = ['日', '一', '二', '三', '四', '五', '六']\n\n/**\n * 获取一个月的天数\n * @param d 日期\n * @param disabledDate 禁用日期\n * @returns\n */\nexport function getMonthDays(\n d: Date | string | number | Dater,\n disabledDate?: (d: Dater) => boolean\n): CalendarDay[] {\n const todayStr = date().format()\n if (d instanceof Date || typeof d === 'string' || typeof d === 'number') {\n d = date(d)\n }\n\n // 本月天数\n d.setDay(1)\n const currentMonthDays: CalendarDay[] = Array.from({ length: d.getDays() }).map((_, i) => {\n const day: CalendarDay = { date: d.calc(i, 'days'), type: 'current' }\n day.isToday = day.date.format() === todayStr\n day.disabled = disabledDate?.(day.date)\n return day\n })\n\n const preMonthDays: CalendarDay[] = []\n\n const nextMonthDays: CalendarDay[] = []\n\n // 上月天数\n const firstDayWeek = d.weekDay\n\n if (firstDayWeek !== 0) {\n // 上个月最后一天\n d.setDay(0)\n let i = 0\n while (i < firstDayWeek) {\n const day: CalendarDay = { date: d.calc(-i, 'days'), type: 'pre' }\n day.disabled = disabledDate?.(day.date)\n preMonthDays.unshift(day)\n i++\n }\n }\n\n // 下个月的天数\n const nextMonthDaysAmount = 42 - currentMonthDays.length - preMonthDays.length\n\n let j = 0\n d.setMonth(d.month + 2).setDay(1)\n\n while (j < nextMonthDaysAmount) {\n const day: CalendarDay = { date: d.calc(j++, 'days'), type: 'next' }\n day.disabled = disabledDate?.(day.date)\n nextMonthDays.push(day)\n }\n\n return [...preMonthDays, ...currentMonthDays, ...nextMonthDays]\n}\n\n/**\n * 获取一年的月份\n * @param d 日期\n * @param disabledDate 禁用的日期\n * @returns\n */\nexport function getYearMonths(\n d: Date | string | number | Dater,\n disabledDate?: (d: Dater) => boolean\n): CalendarMonth[] {\n if (d instanceof Date || typeof d === 'string' || typeof d === 'number') {\n d = date(d)\n }\n\n const year = d.year\n\n return Array.from({ length: 12 }).map((_, i) => {\n const month = i + 1\n\n const ym = `${year}-${month}`\n\n const monthDate = date(ym).toEndOfMonth().setHours(23)\n\n monthDate.setMinutes(59)\n monthDate.setSeconds(59)\n\n return { key: ym, month, date: monthDate, disabled: disabledDate?.(monthDate) }\n })\n}\n\n/**\n * 获取当前年份所处的10年\n * @param d 日期\n * @param disabledDate 禁用的日期\n * @returns\n */\nexport function getTenYears(\n d: Date | string | number | Dater,\n disabledDate?: (d: Dater) => boolean\n): CalendarYear[] {\n if (d instanceof Date || typeof d === 'string' || typeof d === 'number') {\n d = date(d)\n }\n\n const startYear = d.year - (d.year % 10) + 1\n\n return Array.from({ length: 10 }).map((_, i) => {\n const year = startYear + i\n\n const yearDate = date(`${year}-12-31 23:59:59`)\n\n return { year, date: yearDate, disabled: disabledDate?.(yearDate) }\n })\n}\n"],"mappings":";;AAIA,MAAa,WAAqB;CAAC;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAI;;;;;;;AAQrE,SAAgB,aACd,GACA,cACe;CACf,MAAM,WAAW,MAAM,CAAC,QAAQ;CAChC,IAAI,aAAa,QAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,UAC7D,IAAI,KAAK,EAAE;CAIb,EAAE,OAAO,EAAE;CACX,MAAM,mBAAkC,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,GAAG,MAAM;EACxF,MAAM,MAAmB;GAAE,MAAM,EAAE,KAAK,GAAG,OAAO;GAAE,MAAM;GAAW;EACrE,IAAI,UAAU,IAAI,KAAK,QAAQ,KAAK;EACpC,IAAI,WAAW,eAAe,IAAI,KAAK;EACvC,OAAO;GACP;CAEF,MAAM,eAA8B,EAAE;CAEtC,MAAM,gBAA+B,EAAE;CAGvC,MAAM,eAAe,EAAE;CAEvB,IAAI,iBAAiB,GAAG;EAEtB,EAAE,OAAO,EAAE;EACX,IAAI,IAAI;EACR,OAAO,IAAI,cAAc;GACvB,MAAM,MAAmB;IAAE,MAAM,EAAE,KAAK,CAAC,GAAG,OAAO;IAAE,MAAM;IAAO;GAClE,IAAI,WAAW,eAAe,IAAI,KAAK;GACvC,aAAa,QAAQ,IAAI;GACzB;;;CAKJ,MAAM,sBAAsB,KAAK,iBAAiB,SAAS,aAAa;CAExE,IAAI,IAAI;CACR,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE;CAEjC,OAAO,IAAI,qBAAqB;EAC9B,MAAM,MAAmB;GAAE,MAAM,EAAE,KAAK,KAAK,OAAO;GAAE,MAAM;GAAQ;EACpE,IAAI,WAAW,eAAe,IAAI,KAAK;EACvC,cAAc,KAAK,IAAI;;CAGzB,OAAO;EAAC,GAAG;EAAc,GAAG;EAAkB,GAAG;EAAc;;;;;;;;AASjE,SAAgB,cACd,GACA,cACiB;CACjB,IAAI,aAAa,QAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,UAC7D,IAAI,KAAK,EAAE;CAGb,MAAM,OAAO,EAAE;CAEf,OAAO,MAAM,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;EAC9C,MAAM,QAAQ,IAAI;EAElB,MAAM,KAAK,GAAG,KAAK,GAAG;EAEtB,MAAM,YAAY,KAAK,GAAG,CAAC,cAAc,CAAC,SAAS,GAAG;EAEtD,UAAU,WAAW,GAAG;EACxB,UAAU,WAAW,GAAG;EAExB,OAAO;GAAE,KAAK;GAAI;GAAO,MAAM;GAAW,UAAU,eAAe,UAAU;GAAE;GAC/E;;;;;;;;AASJ,SAAgB,YACd,GACA,cACgB;CAChB,IAAI,aAAa,QAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,UAC7D,IAAI,KAAK,EAAE;CAGb,MAAM,YAAY,EAAE,OAAQ,EAAE,OAAO,KAAM;CAE3C,OAAO,MAAM,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;EAC9C,MAAM,OAAO,YAAY;EAEzB,MAAM,WAAW,KAAK,GAAG,KAAK,iBAAiB;EAE/C,OAAO;GAAE;GAAM,MAAM;GAAU,UAAU,eAAe,SAAS;GAAE;GACnE"}