@veltra/desktop 1.8.3 → 1.8.4

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 (197) hide show
  1. package/dist/components/action/action-group.js.map +1 -1
  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/auto-complete/auto-complete.js.map +1 -1
  5. package/dist/components/badge/badge.js.map +1 -1
  6. package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
  7. package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
  8. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  9. package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
  10. package/dist/components/button/button-group.js.map +1 -1
  11. package/dist/components/button/button.js.map +1 -1
  12. package/dist/components/calendar/calendar.js.map +1 -1
  13. package/dist/components/card/card-action.js.map +1 -1
  14. package/dist/components/card/card-content.js.map +1 -1
  15. package/dist/components/card/card-cover.js.map +1 -1
  16. package/dist/components/card/card-header.js.map +1 -1
  17. package/dist/components/card/card.js.map +1 -1
  18. package/dist/components/cascade/cascade-panel-item.js.map +1 -1
  19. package/dist/components/cascade/cascade.js +1 -0
  20. package/dist/components/cascade/cascade.js.map +1 -1
  21. package/dist/components/cascade/use-select.js +6 -2
  22. package/dist/components/cascade/use-select.js.map +1 -1
  23. package/dist/components/check-tag/check-tag.js.map +1 -1
  24. package/dist/components/checkbox/checkbox-button.js.map +1 -1
  25. package/dist/components/checkbox/checkbox.js.map +1 -1
  26. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  27. package/dist/components/code-editor/code-editor.js.map +1 -1
  28. package/dist/components/collapse/collapse-item.js.map +1 -1
  29. package/dist/components/collapse/collapse.js.map +1 -1
  30. package/dist/components/condition-editor/components/condition-group.js.map +1 -1
  31. package/dist/components/condition-editor/components/condition-row.js.map +1 -1
  32. package/dist/components/condition-editor/condition-editor.js.map +1 -1
  33. package/dist/components/contextmenu/contextmenu-item.js.map +1 -1
  34. package/dist/components/contextmenu/contextmenu-panel.js.map +1 -1
  35. package/dist/components/contextmenu/contextmenu-sub.js.map +1 -1
  36. package/dist/components/contextmenu/contextmenu.js.map +1 -1
  37. package/dist/components/date-panel/date-panel.js.map +1 -1
  38. package/dist/components/date-panel/headers/day.js.map +1 -1
  39. package/dist/components/date-panel/headers/month.js.map +1 -1
  40. package/dist/components/date-panel/headers/year.js.map +1 -1
  41. package/dist/components/date-panel/panels/day.js.map +1 -1
  42. package/dist/components/date-panel/panels/month.js.map +1 -1
  43. package/dist/components/date-panel/panels/year.js.map +1 -1
  44. package/dist/components/date-picker/date-picker.js.map +1 -1
  45. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  46. package/dist/components/dialog/dialog.js.map +1 -1
  47. package/dist/components/drawer/drawer.js.map +1 -1
  48. package/dist/components/dropdown/dropdown.js.map +1 -1
  49. package/dist/components/dual-nav/dual-nav-app.js.map +1 -1
  50. package/dist/components/dual-nav/dual-nav.js.map +1 -1
  51. package/dist/components/empty/empty.js.map +1 -1
  52. package/dist/components/expression-editor/components/path-preview.js.map +1 -1
  53. package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
  54. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  55. package/dist/components/file-picker/file-picker.js.map +1 -1
  56. package/dist/components/file-viewer/file-viewer.js.map +1 -1
  57. package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -1
  58. package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -1
  59. package/dist/components/file-viewer/previewers/ofd-previewer.js.map +1 -1
  60. package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -1
  61. package/dist/components/file-viewer/previewers/pdf-viewport-scroll.js.map +1 -1
  62. package/dist/components/file-viewer/previewers/pdf-zoom-bridge.js.map +1 -1
  63. package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
  64. package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -1
  65. package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -1
  66. package/dist/components/float-button/float-button.js.map +1 -1
  67. package/dist/components/form/form.js.map +1 -1
  68. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
  69. package/dist/components/form-item/form-item.js.map +1 -1
  70. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  71. package/dist/components/gantt-chart/gantt-chart.js.map +1 -1
  72. package/dist/components/grid/grid-item.js.map +1 -1
  73. package/dist/components/grid/grid.js.map +1 -1
  74. package/dist/components/grid-input/grid-input.js.map +1 -1
  75. package/dist/components/group-input/group-input.js.map +1 -1
  76. package/dist/components/group-nav/group-nav-item.js.map +1 -1
  77. package/dist/components/group-nav/group-nav.js.map +1 -1
  78. package/dist/components/icon/icon.js.map +1 -1
  79. package/dist/components/image-cropper/image-cropper.js.map +1 -1
  80. package/dist/components/input/input.js.map +1 -1
  81. package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
  82. package/dist/components/kanban/kanban-column.js.map +1 -1
  83. package/dist/components/kanban/kanban.js.map +1 -1
  84. package/dist/components/kbd/kbd.js.map +1 -1
  85. package/dist/components/layout/layout-resizer.js.map +1 -1
  86. package/dist/components/layout/layout.js.map +1 -1
  87. package/dist/components/list/list-item.js.map +1 -1
  88. package/dist/components/list/list.js.map +1 -1
  89. package/dist/components/loading/loading.js.map +1 -1
  90. package/dist/components/message/message-box.js.map +1 -1
  91. package/dist/components/message/message.js.map +1 -1
  92. package/dist/components/message-confirm/message-confirm-box.js.map +1 -1
  93. package/dist/components/message-confirm/message-confirm.js.map +1 -1
  94. package/dist/components/multi-select/multi-select-option.js.map +1 -1
  95. package/dist/components/multi-select/multi-select.js.map +1 -1
  96. package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
  97. package/dist/components/nav/nav-icon.js.map +1 -1
  98. package/dist/components/nav/nav-item-collapsed.js.map +1 -1
  99. package/dist/components/nav/nav-item.js.map +1 -1
  100. package/dist/components/nav/nav-sub-collapsed.js.map +1 -1
  101. package/dist/components/nav/nav-sub.js.map +1 -1
  102. package/dist/components/nav/nav.js.map +1 -1
  103. package/dist/components/notification/notification-box.js.map +1 -1
  104. package/dist/components/notification/notification.js.map +1 -1
  105. package/dist/components/number/number.js.map +1 -1
  106. package/dist/components/number-input/number-input.js.map +1 -1
  107. package/dist/components/number-range-input/number-range-input.js.map +1 -1
  108. package/dist/components/paginator/paginator.js.map +1 -1
  109. package/dist/components/palette/palette-alpha.js.map +1 -1
  110. package/dist/components/palette/palette-color-switch.js.map +1 -1
  111. package/dist/components/palette/palette-hue.js.map +1 -1
  112. package/dist/components/palette/palette-sv.js.map +1 -1
  113. package/dist/components/palette/palette.js.map +1 -1
  114. package/dist/components/password-input/password-input.js.map +1 -1
  115. package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
  116. package/dist/components/progress/progress.js.map +1 -1
  117. package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
  118. package/dist/components/radio/radio.js.map +1 -1
  119. package/dist/components/radio-group/radio-group.js.map +1 -1
  120. package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
  121. package/dist/components/rich-text-editor/toolbar.js.map +1 -1
  122. package/dist/components/scroll/scroll-bar.js.map +1 -1
  123. package/dist/components/scroll/scroll.js.map +1 -1
  124. package/dist/components/segment/segment.js.map +1 -1
  125. package/dist/components/select/select.js +9 -5
  126. package/dist/components/select/select.js.map +1 -1
  127. package/dist/components/slider/slider-thumb.js.map +1 -1
  128. package/dist/components/slider/slider.js.map +1 -1
  129. package/dist/components/steps/steps.js.map +1 -1
  130. package/dist/components/switch/switch.js.map +1 -1
  131. package/dist/components/table/table-body.js.map +1 -1
  132. package/dist/components/table/table-cell.js.map +1 -1
  133. package/dist/components/table/table-foot.js.map +1 -1
  134. package/dist/components/table/table-head.js.map +1 -1
  135. package/dist/components/table/table-row.js.map +1 -1
  136. package/dist/components/table/table.js.map +1 -1
  137. package/dist/components/table-editor/table-editor.js.map +1 -1
  138. package/dist/components/tabs/tabs-horizontal.js.map +1 -1
  139. package/dist/components/tabs/tabs-vertical.js.map +1 -1
  140. package/dist/components/tabs/tabs.js.map +1 -1
  141. package/dist/components/tag/tag.js.map +1 -1
  142. package/dist/components/text/text.js.map +1 -1
  143. package/dist/components/textarea/textarea.js.map +1 -1
  144. package/dist/components/theme/theme.js.map +1 -1
  145. package/dist/components/tip/tip.js.map +1 -1
  146. package/dist/components/tree/tree-node.js.map +1 -1
  147. package/dist/components/tree/tree.js.map +1 -1
  148. package/dist/components/tree-select/tree-select.js +19 -10
  149. package/dist/components/tree-select/tree-select.js.map +1 -1
  150. package/dist/components/watermark/watermark.js.map +1 -1
  151. package/dist/types/cascade.d.ts +5 -0
  152. package/dist/types/select.d.ts +8 -2
  153. package/dist/types/tree-select.d.ts +8 -2
  154. package/package.json +18 -18
  155. package/src/components/batch-edit/__test__/batch-edit.test.ts +1 -1
  156. package/src/components/button/__test__/button.test.ts +1 -1
  157. package/src/components/cascade/__test__/cascade.test.ts +26 -1
  158. package/src/components/cascade/use-select.ts +5 -5
  159. package/src/components/collapse/__test__/collapse.test.ts +1 -1
  160. package/src/components/condition-editor/__test__/condition-editor.test.ts +1 -1
  161. package/src/components/contextmenu/__test__/contextmenu.test.ts +1 -1
  162. package/src/components/date-picker/__test__/date-picker.test.ts +1 -1
  163. package/src/components/date-range-picker/__test__/date-range-picker.test.ts +1 -1
  164. package/src/components/drawer/__test__/drawer.test.ts +1 -1
  165. package/src/components/expression-editor/__test__/chip.test.ts +1 -1
  166. package/src/components/expression-editor/__test__/editor.test.ts +1 -1
  167. package/src/components/expression-editor/__test__/expression-editor.test.ts +1 -1
  168. package/src/components/expression-editor/__test__/mention.test.ts +1 -1
  169. package/src/components/expression-editor/__test__/model.test.ts +1 -1
  170. package/src/components/file-viewer/__test__/helper.test.ts +1 -1
  171. package/src/components/form/__test__/form.test.ts +1 -1
  172. package/src/components/form/__test__/is-field-modified.test.ts +1 -1
  173. package/src/components/form-item/__test__/form-item.test.ts +1 -1
  174. package/src/components/image-cropper/__test__/draw-crop.test.ts +1 -1
  175. package/src/components/image-cropper/__test__/image-cropper.test.ts +1 -1
  176. package/src/components/image-cropper/__test__/use-transform.test.ts +1 -1
  177. package/src/components/kanban/__test__/kanban.test.ts +1 -1
  178. package/src/components/message-confirm/__test__/message-confirm.test.ts +1 -1
  179. package/src/components/multi-tree-select/__test__/multi-tree-select.test.ts +1 -1
  180. package/src/components/number-input/__test__/number-input.test.ts +1 -1
  181. package/src/components/number-range-input/__test__/number-range-input.test.ts +1 -1
  182. package/src/components/palette/__test__/color-transform.test.ts +1 -1
  183. package/src/components/palette/__test__/palette.test.ts +1 -1
  184. package/src/components/password-input/__test__/password-input.test.ts +1 -1
  185. package/src/components/radio-group/__test__/radio-group.test.ts +1 -1
  186. package/src/components/rich-text-editor/__test__/image-node.test.ts +1 -1
  187. package/src/components/segment/__test__/segment.test.ts +1 -1
  188. package/src/components/select/__test__/select.test.ts +68 -1
  189. package/src/components/select/select.vue +15 -5
  190. package/src/components/table/__test__/col-width.test.ts +1 -1
  191. package/src/components/table/__test__/column-style.test.ts +1 -1
  192. package/src/components/table-editor/__test__/table-editor.test.ts +1 -1
  193. package/src/components/tree-select/__test__/tree-select.test.ts +50 -1
  194. package/src/components/tree-select/tree-select.vue +28 -11
  195. package/src/types/cascade.ts +5 -0
  196. package/src/types/select.ts +8 -2
  197. package/src/types/tree-select.ts +9 -2
@@ -1 +1 @@
1
- {"version":3,"file":"use-select.js","names":[],"sources":["../../../src/components/cascade/use-select.ts"],"sourcesContent":["import { Forest } from '@cat-kit/core'\nimport { createIncrease } from '@veltra/utils'\nimport {\n computed,\n nextTick,\n shallowRef,\n triggerRef,\n watch,\n type ComputedRef,\n type Ref,\n type ShallowRef\n} from 'vue'\n\nimport type {\n CascadeProps,\n CascadeEmits,\n CascadeNode,\n DropdownExposed,\n PanelItem\n} from '../../types'\n\ninterface SelectOptions {\n props: CascadeProps\n emit: CascadeEmits\n isUserActive: () => boolean\n forest: Ref<Forest<Record<string, unknown>, any>>\n dataMap: Ref<Map<string, CascadeNode>>\n dropdownRef: Ref<DropdownExposed | undefined>\n}\n\nfunction buildPathKeys(leaf: CascadeNode): string[] {\n const keys: string[] = []\n let node: CascadeNode | undefined = leaf\n while (node) {\n keys.unshift(node.value)\n node = node.parent\n }\n return keys\n}\n\ninterface UseSelectReturned {\n displayedValue: ComputedRef<string | undefined>\n selectItem: (panelIndex: number, item: CascadeNode) => void\n selectedNodeKeys: ShallowRef<string[]>\n updateSingleValue: () => void\n initSingleSelect: () => void\n panelItemList: ShallowRef<PanelItem[]>\n getPanelItemList: (data?: CascadeNode[]) => void\n setPanelItem: (panelIndex: number, panelData?: CascadeNode[]) => void\n createPanelItem: (nodes: CascadeNode[]) => PanelItem\n}\n\nexport function useSelect(options: SelectOptions): UseSelectReturned {\n const { props, emit, dataMap, isUserActive, dropdownRef, forest } = options\n\n /** 选中的节点key */\n const selectedNodeKeys = shallowRef<string[]>([])\n\n /** 面板数据 */\n const panelItemList = shallowRef<PanelItem[]>([])\n const uid = createIncrease()\n function createPanelItem(nodes: CascadeNode[]): PanelItem {\n return { key: uid(), nodes: nodes.filter((node) => node.visible) }\n }\n\n const displayedValue = computed(() => {\n const { modelValue, separator, showFullPath } = props\n if (!modelValue || typeof modelValue !== 'string') return ''\n\n if (showFullPath) {\n return modelValue\n .split(separator!)\n .map((v) => dataMap.value.get(v)?.label ?? v)\n .join(separator)\n }\n return dataMap.value.get(modelValue)?.label ?? modelValue\n })\n\n function getPanelItemList(data?: CascadeNode[]) {\n const _panelItemList: Array<PanelItem> = []\n if (!data?.length) return panelItemList\n _panelItemList.push(createPanelItem(data))\n\n selectedNodeKeys.value.slice(0, -1).forEach((key) => {\n const node = dataMap.value.get(key)\n node?.children?.length && _panelItemList.push(createPanelItem(node.children))\n })\n\n panelItemList.value = _panelItemList\n }\n\n function setPanelItem(panelIndex: number, panelData?: CascadeNode[]) {\n if (panelData?.length) {\n panelItemList.value[panelIndex + 1] = createPanelItem(panelData)\n panelItemList.value.splice(panelIndex + 2)\n } else {\n panelItemList.value.splice(panelIndex + 1)\n }\n\n triggerRef(panelItemList)\n }\n\n function updateSingleValue() {\n const { separator, showFullPath } = props\n const keys = selectedNodeKeys.value\n const leafKey = keys.length ? keys[keys.length - 1] : undefined\n const leafLabel = leafKey ? dataMap.value.get(leafKey)?.label : undefined\n\n const targetValue = showFullPath ? (keys.length ? keys.join(separator!) : undefined) : leafKey\n const targetLabel = showFullPath\n ? keys\n .map((key) => dataMap.value.get(key)?.label)\n .filter(Boolean)\n .join(separator!)\n : leafLabel\n\n const leafNode = leafKey ? dataMap.value.get(leafKey) : undefined\n const changeItem = leafNode?.data ? { ...leafNode.data, fullLabel: targetLabel } : undefined\n\n emit('update:modelValue', targetValue)\n emit('update:label', targetLabel)\n emit('change', changeItem, targetLabel)\n }\n\n /**\n * 单选选择\n *\n * @param panelIndex 面板索引\n * @param item 选中的节点\n */\n function selectItem(panelIndex: number, item: CascadeNode) {\n // 设置选中的节点\n selectedNodeKeys.value[panelIndex] = item.value\n selectedNodeKeys.value.splice(panelIndex + 1)\n triggerRef(selectedNodeKeys)\n\n // 展开子级面板\n setPanelItem(panelIndex, item.children)\n\n nextTick(() => {\n dropdownRef.value?.updateDropdown()\n })\n\n if (!item.children?.length && !props.multiple) {\n dropdownRef.value?.close()\n }\n }\n\n function initSingleSelect() {\n const { modelValue, separator, showFullPath } = props\n\n if (modelValue && typeof modelValue === 'string') {\n let keys: string[]\n if (showFullPath) {\n keys = modelValue.split(separator!)\n } else {\n const leaf = dataMap.value.get(modelValue)\n keys = leaf ? buildPathKeys(leaf) : [modelValue]\n }\n selectedNodeKeys.value = keys\n getPanelItemList(forest.value.roots)\n } else {\n selectedNodeKeys.value = []\n getPanelItemList(forest.value.roots)\n }\n }\n\n watch(\n [() => props.multiple, () => props.modelValue, forest],\n ([multiple]) => {\n if (multiple || isUserActive()) return\n initSingleSelect()\n },\n { immediate: true }\n )\n\n return {\n displayedValue,\n selectItem,\n selectedNodeKeys,\n updateSingleValue,\n initSingleSelect,\n panelItemList,\n getPanelItemList,\n setPanelItem,\n createPanelItem\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-select.js","names":[],"sources":["../../../src/components/cascade/use-select.ts"],"sourcesContent":["import { Forest } from '@cat-kit/core'\nimport { createIncrease } from '@veltra/utils'\nimport {\n computed,\n nextTick,\n shallowRef,\n triggerRef,\n watch,\n type ComputedRef,\n type Ref,\n type ShallowRef\n} from 'vue'\n\nimport type {\n CascadeProps,\n CascadeEmits,\n CascadeNode,\n DropdownExposed,\n PanelItem\n} from '../../types'\n\ninterface SelectOptions {\n props: CascadeProps\n emit: CascadeEmits\n isUserActive: () => boolean\n forest: Ref<Forest<Record<string, unknown>, any>>\n dataMap: Ref<Map<string, CascadeNode>>\n dropdownRef: Ref<DropdownExposed | undefined>\n}\n\nfunction buildPathKeys(leaf: CascadeNode): string[] {\n const keys: string[] = []\n let node: CascadeNode | undefined = leaf\n while (node) {\n keys.unshift(node.value)\n node = node.parent\n }\n return keys\n}\n\ninterface UseSelectReturned {\n displayedValue: ComputedRef<string | undefined>\n selectItem: (panelIndex: number, item: CascadeNode) => void\n selectedNodeKeys: ShallowRef<string[]>\n updateSingleValue: () => void\n initSingleSelect: () => void\n panelItemList: ShallowRef<PanelItem[]>\n getPanelItemList: (data?: CascadeNode[]) => void\n setPanelItem: (panelIndex: number, panelData?: CascadeNode[]) => void\n createPanelItem: (nodes: CascadeNode[]) => PanelItem\n}\n\nexport function useSelect(options: SelectOptions): UseSelectReturned {\n const { props, emit, dataMap, isUserActive, dropdownRef, forest } = options\n\n /** 选中的节点key */\n const selectedNodeKeys = shallowRef<string[]>([])\n\n /** 面板数据 */\n const panelItemList = shallowRef<PanelItem[]>([])\n const uid = createIncrease()\n function createPanelItem(nodes: CascadeNode[]): PanelItem {\n return { key: uid(), nodes: nodes.filter((node) => node.visible) }\n }\n\n const displayedValue = computed(() => {\n const { modelValue, separator, showFullPath } = props\n if (!modelValue || typeof modelValue !== 'string') return ''\n\n if (showFullPath) {\n const keys = modelValue.split(separator!)\n // 末级未命中视为整条路径无效,回退 text 兜底,避免露出不可读的编码\n if (!dataMap.value.has(keys[keys.length - 1]!)) return props.text ?? modelValue\n return keys.map((v) => dataMap.value.get(v)?.label ?? v).join(separator)\n }\n return dataMap.value.get(modelValue)?.label ?? props.text ?? modelValue\n })\n\n function getPanelItemList(data?: CascadeNode[]) {\n const _panelItemList: Array<PanelItem> = []\n if (!data?.length) return panelItemList\n _panelItemList.push(createPanelItem(data))\n\n selectedNodeKeys.value.slice(0, -1).forEach((key) => {\n const node = dataMap.value.get(key)\n node?.children?.length && _panelItemList.push(createPanelItem(node.children))\n })\n\n panelItemList.value = _panelItemList\n }\n\n function setPanelItem(panelIndex: number, panelData?: CascadeNode[]) {\n if (panelData?.length) {\n panelItemList.value[panelIndex + 1] = createPanelItem(panelData)\n panelItemList.value.splice(panelIndex + 2)\n } else {\n panelItemList.value.splice(panelIndex + 1)\n }\n\n triggerRef(panelItemList)\n }\n\n function updateSingleValue() {\n const { separator, showFullPath } = props\n const keys = selectedNodeKeys.value\n const leafKey = keys.length ? keys[keys.length - 1] : undefined\n const leafLabel = leafKey ? dataMap.value.get(leafKey)?.label : undefined\n\n const targetValue = showFullPath ? (keys.length ? keys.join(separator!) : undefined) : leafKey\n const targetLabel = showFullPath\n ? keys\n .map((key) => dataMap.value.get(key)?.label)\n .filter(Boolean)\n .join(separator!)\n : leafLabel\n\n const leafNode = leafKey ? dataMap.value.get(leafKey) : undefined\n const changeItem = leafNode?.data ? { ...leafNode.data, fullLabel: targetLabel } : undefined\n\n emit('update:modelValue', targetValue)\n emit('update:label', targetLabel)\n emit('change', changeItem, targetLabel)\n }\n\n /**\n * 单选选择\n *\n * @param panelIndex 面板索引\n * @param item 选中的节点\n */\n function selectItem(panelIndex: number, item: CascadeNode) {\n // 设置选中的节点\n selectedNodeKeys.value[panelIndex] = item.value\n selectedNodeKeys.value.splice(panelIndex + 1)\n triggerRef(selectedNodeKeys)\n\n // 展开子级面板\n setPanelItem(panelIndex, item.children)\n\n nextTick(() => {\n dropdownRef.value?.updateDropdown()\n })\n\n if (!item.children?.length && !props.multiple) {\n dropdownRef.value?.close()\n }\n }\n\n function initSingleSelect() {\n const { modelValue, separator, showFullPath } = props\n\n if (modelValue && typeof modelValue === 'string') {\n let keys: string[]\n if (showFullPath) {\n keys = modelValue.split(separator!)\n } else {\n const leaf = dataMap.value.get(modelValue)\n keys = leaf ? buildPathKeys(leaf) : [modelValue]\n }\n selectedNodeKeys.value = keys\n getPanelItemList(forest.value.roots)\n } else {\n selectedNodeKeys.value = []\n getPanelItemList(forest.value.roots)\n }\n }\n\n watch(\n [() => props.multiple, () => props.modelValue, forest],\n ([multiple]) => {\n if (multiple || isUserActive()) return\n initSingleSelect()\n },\n { immediate: true }\n )\n\n return {\n displayedValue,\n selectItem,\n selectedNodeKeys,\n updateSingleValue,\n initSingleSelect,\n panelItemList,\n getPanelItemList,\n setPanelItem,\n createPanelItem\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"check-tag.js","names":[],"sources":["../../../src/components/check-tag/check-tag.vue"],"sourcesContent":["<template>\n <div :class=\"classList\" @click=\"handleChange\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CheckTagEmits, CheckTagProps } from '../../types'\n\ndefineOptions({ name: 'UCheckTag' })\n\nconst cls = bem('check-tag')\n\nconst props = withDefaults(defineProps<CheckTagProps>(), {})\n\nconst emits = defineEmits<CheckTagEmits>()\n\nconst classList = computed(() => {\n return [cls.b, bem.is('checked', props.modelValue ?? props.checked)]\n})\n\nconst handleChange = () => {\n emits('update:modelValue', !(props.modelValue ?? props.checked))\n}\n</script>\n"],"mappings":";;;;;;;;;;;;EAcA,MAAM,MAAM,IAAI,WAAW;EAE3B,MAAM,QAAQ;EAEd,MAAM,QAAQ;EAEd,MAAM,YAAY,eAAe;GAC/B,OAAO,CAAC,IAAI,GAAG,IAAI,GAAG,WAAW,MAAM,cAAc,MAAM,OAAO,CAAC;EACrE,CAAC;EAED,MAAM,qBAAqB;GACzB,MAAM,qBAAqB,EAAE,MAAM,cAAc,MAAM,QAAQ;EACjE;;GAzBE,OAAA,UAAA,GAAA,mBAEM,OAAA;IAFA,OAAK,eAAE,UAAA,KAAS;IAAG,SAAO;GAC9B,GAAA,CAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"check-tag.js","names":["_openBlock","_createElementBlock","_normalizeClass","_renderSlot"],"sources":["../../../src/components/check-tag/check-tag.vue"],"sourcesContent":["<template>\n <div :class=\"classList\" @click=\"handleChange\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CheckTagEmits, CheckTagProps } from '../../types'\n\ndefineOptions({ name: 'UCheckTag' })\n\nconst cls = bem('check-tag')\n\nconst props = withDefaults(defineProps<CheckTagProps>(), {})\n\nconst emits = defineEmits<CheckTagEmits>()\n\nconst classList = computed(() => {\n return [cls.b, bem.is('checked', props.modelValue ?? props.checked)]\n})\n\nconst handleChange = () => {\n emits('update:modelValue', !(props.modelValue ?? props.checked))\n}\n</script>\n"],"mappings":";;;;;;;;;;;;EAcA,MAAM,MAAM,IAAI,WAAW;EAE3B,MAAM,QAAQ;EAEd,MAAM,QAAQ;EAEd,MAAM,YAAY,eAAe;GAC/B,OAAO,CAAC,IAAI,GAAG,IAAI,GAAG,WAAW,MAAM,cAAc,MAAM,OAAO,CAAC;EACrE,CAAC;EAED,MAAM,qBAAqB;GACzB,MAAM,qBAAqB,EAAE,MAAM,cAAc,MAAM,QAAQ;EACjE;;GAzBE,OAAAA,UAAA,GAAAC,mBAEM,OAAA;IAFA,OAAKC,eAAE,UAAA,KAAS;IAAG,SAAO;GAC9B,GAAA,CAAAC,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox-button.js","names":["$attrs"],"sources":["../../../src/components/checkbox/checkbox-button.vue"],"sourcesContent":["<template>\n <div v-if=\"!readonly\" v-bind=\"$attrs\" :class=\"className\" @click=\"handleInput\">\n <slot />\n </div>\n\n <u-tag v-else-if=\"checked !== undefined\" :type=\"checked ? 'success' : 'danger'\">\n {{ checked ? '是' : '否' }}\n </u-tag>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CheckboxButtonProps, CheckboxButtonEmits } from '../../types'\nimport { UTag } from '../tag'\n\ndefineOptions({ name: 'UCheckboxButton', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CheckboxButtonProps>(), {\n disabled: undefined,\n readonly: undefined,\n type: 'primary',\n round: false\n})\n\nconst emit = defineEmits<CheckboxButtonEmits>()\n\nconst slot = defineSlots<{ default(): any }>()\n\nconst cls = bem('checkbox-button')\n\nconst checked = defineModel<boolean>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is(props.type),\n bem.is('round', props.round),\n bem.is('disabled', disabled.value),\n bem.is('checked', checked.value)\n ]\n})\n\nconst handleInput = () => {\n checked.value = !checked.value\n emit('change', !!checked.value)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAEA,SAAA;EAEb,MAAM,MAAM,IAAI,iBAAiB;EAEjC,MAAM,UAAU,SAAoB,SAAA,YAAC;EAErC,MAAM,EAAE,cAAc,kBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG;GAClF,MAAM;GACN,UAAU;GACV,UAAU;EACZ,CAAC;EAED,MAAM,YAAY,eAAe;GAC/B,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,IAAI,GAAG,MAAM,IAAI;IACjB,IAAI,GAAG,SAAS,MAAM,KAAK;IAC3B,IAAI,GAAG,YAAY,SAAS,KAAK;IACjC,IAAI,GAAG,WAAW,QAAQ,KAAK;GACjC;EACF,CAAC;EAED,MAAM,oBAAoB;GACxB,QAAQ,QAAQ,CAAC,QAAQ;GACzB,KAAK,UAAU,CAAC,CAAC,QAAQ,KAAK;EAChC;;GA7Dc,OAAA,CAAA,MAAA,QAAA,KAAZ,UAAA,GAAA,mBAEM,OAFN,WAEM,EAAA,KAAA,EAAA,GAFwBA,KAAAA,QAAM;IAAG,OAAO,UAAA;IAAY,SAAO;GAC/D,CAAA,GAAA,CAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,EAGQ,KAAA,QAAA,UAAY,KAAA,KAA9B,UAAA,GAAA,YAEQ,MAAA,WAAA,GAAA;;IAFkC,MAAM,QAAA,QAAO,YAAA;;IACrD,SAAA,cAAyB,CAAtB,gBAAA,gBAAA,QAAA,QAAO,MAAA,GAAA,GAAA,CAAA,CAAA,CAAA;;GAGZ,GAAA,GAAA,CAAA,MAAA,CAAA,MAAA,UAAA,GAAA,mBAEW,UAAA,EAAA,KAAA,EAAA,GAAA,CADN,gBAAA,gBAAA,MAAA,kBAAA,CAAkB,GAAA,CAAA,CAAA,GAAA,EAAA"}
1
+ {"version":3,"file":"checkbox-button.js","names":["$attrs","_useModel","_unref","_openBlock","_createElementBlock","_mergeProps","_renderSlot","_createBlock","UTag","_withCtx","_createTextVNode","_toDisplayString","_Fragment"],"sources":["../../../src/components/checkbox/checkbox-button.vue"],"sourcesContent":["<template>\n <div v-if=\"!readonly\" v-bind=\"$attrs\" :class=\"className\" @click=\"handleInput\">\n <slot />\n </div>\n\n <u-tag v-else-if=\"checked !== undefined\" :type=\"checked ? 'success' : 'danger'\">\n {{ checked ? '是' : '否' }}\n </u-tag>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CheckboxButtonProps, CheckboxButtonEmits } from '../../types'\nimport { UTag } from '../tag'\n\ndefineOptions({ name: 'UCheckboxButton', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CheckboxButtonProps>(), {\n disabled: undefined,\n readonly: undefined,\n type: 'primary',\n round: false\n})\n\nconst emit = defineEmits<CheckboxButtonEmits>()\n\nconst slot = defineSlots<{ default(): any }>()\n\nconst cls = bem('checkbox-button')\n\nconst checked = defineModel<boolean>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is(props.type),\n bem.is('round', props.round),\n bem.is('disabled', disabled.value),\n bem.is('checked', checked.value)\n ]\n})\n\nconst handleInput = () => {\n checked.value = !checked.value\n emit('change', !!checked.value)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAEA,SAAA;EAEb,MAAM,MAAM,IAAI,iBAAiB;EAEjC,MAAM,UAAUC,SAAoB,SAAA,YAAC;EAErC,MAAM,EAAE,cAAc,kBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG;GAClF,MAAM;GACN,UAAU;GACV,UAAU;EACZ,CAAC;EAED,MAAM,YAAY,eAAe;GAC/B,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,IAAI,GAAG,MAAM,IAAI;IACjB,IAAI,GAAG,SAAS,MAAM,KAAK;IAC3B,IAAI,GAAG,YAAY,SAAS,KAAK;IACjC,IAAI,GAAG,WAAW,QAAQ,KAAK;GACjC;EACF,CAAC;EAED,MAAM,oBAAoB;GACxB,QAAQ,QAAQ,CAAC,QAAQ;GACzB,KAAK,UAAU,CAAC,CAAC,QAAQ,KAAK;EAChC;;GA7Dc,OAAA,CAAAC,MAAA,QAAA,KAAZC,UAAA,GAAAC,mBAEM,OAFNC,WAEM,EAAA,KAAA,EAAA,GAFwBL,KAAAA,QAAM;IAAG,OAAO,UAAA;IAAY,SAAO;GAC/D,CAAA,GAAA,CAAAM,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,EAGQ,KAAA,QAAA,UAAY,KAAA,KAA9BH,UAAA,GAAAI,YAEQL,MAAAM,WAAA,GAAA;;IAFkC,MAAM,QAAA,QAAO,YAAA;;IACrD,SAAAC,cAAyB,CAAtBC,gBAAAC,gBAAA,QAAA,QAAO,MAAA,GAAA,GAAA,CAAA,CAAA,CAAA;;GAGZ,GAAA,GAAA,CAAA,MAAA,CAAA,MAAAR,UAAA,GAAAC,mBAEWQ,UAAA,EAAA,KAAA,EAAA,GAAA,CADNF,gBAAAC,gBAAAT,MAAA,kBAAA,CAAkB,GAAA,CAAA,CAAA,GAAA,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.js","names":["$slots"],"sources":["../../../src/components/checkbox/checkbox.vue"],"sourcesContent":["<template>\n <label :class=\"className\">\n <input\n type=\"checkbox\"\n :class=\"cls.e('native')\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n @click=\"handleInput\"\n />\n\n <span :class=\"cls.e('wrap')\">\n <transition name=\"zoom-in\" mode=\"out-in\">\n <svg viewBox=\"0 0 64 64\" v-if=\"checked\" fill=\"currentColor\">\n <path\n d=\"M50.42,16.76L22.34,39.45l-8.1-11.46c-1.12-1.58-3.3-1.96-4.88-0.84c-1.58,1.12-1.95,3.3-0.84,4.88l10.26,14.51 c0.56,0.79,1.42,1.31,2.38,1.45c0.16,0.02,0.32,0.03,0.48,0.03c0.8,0,1.57-0.27,2.2-0.78l30.99-25.03c1.5-1.21,1.74-3.42,0.52-4.92 C54.13,15.78,51.93,15.55,50.42,16.76z\"\n ></path>\n </svg>\n <span v-else-if=\"indeterminate\" :class=\"cls.m('indeterminate')\"></span>\n </transition>\n </span>\n\n <span :class=\"cls.e('label')\" v-if=\"$slots.default\"><slot /> </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CheckboxProps, CheckboxEmits } from '../../types'\n\ndefineOptions({ name: 'UCheckbox' })\nconst props = withDefaults(defineProps<CheckboxProps>(), {\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<CheckboxEmits>()\nconst cls = bem('checkbox')\n\nconst checked = defineModel<boolean>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('checked', checked.value || props.indeterminate)\n ]\n})\n\nconst handleInput = (e: MouseEvent) => {\n if (readonly.value) return\n const target = e.target as HTMLInputElement\n checked.value = target.checked\n emit('change', target.checked, e)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCA,MAAM,QAAQ;EAKd,MAAM,OAAO;EACb,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,UAAU,SAAoB,SAAA,YAAC;EAErC,MAAM,EAAE,cAAc,kBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG;GAClF,MAAM;GACN,UAAU;GACV,UAAU;EACZ,CAAC;EAED,MAAM,YAAY,eAAe;GAC/B,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,IAAI,GAAG,YAAY,SAAS,KAAK;IACjC,IAAI,GAAG,YAAY,SAAS,KAAK;IACjC,IAAI,GAAG,WAAW,QAAQ,SAAS,MAAM,aAAa;GACxD;EACF,CAAC;EAED,MAAM,eAAe,MAAkB;GACrC,IAAI,SAAS,OAAO;GACpB,MAAM,SAAS,EAAE;GACjB,QAAQ,QAAQ,OAAO;GACvB,KAAK,UAAU,OAAO,SAAS,CAAC;EAClC;;GAlEE,OAAA,UAAA,GAAA,mBAqBQ,SAAA,EArBA,OAAK,eAAE,UAAA,KAAS,EAAA,GAAA;IACtB,mBAME,SAAA;KALA,MAAK;KACJ,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA;KACZ,SAAS,QAAA;KACT,UAAU,MAAA,QAAA;KACV,SAAO;;IAGV,mBASO,QAAA,EATA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GACjB,CAAA,YAOa,YAAA;KAPD,MAAK;KAAU,MAAK;;KAC9B,SAAA,cAIM,CAJyB,QAAA,SAA/B,UAAA,GAAA,mBAIM,OAJN,YAIM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAHJ,mBAEQ,QAAA,EADN,GAAE,qRAAoR,GAAA,MAAA,EAAA,CAAA,EAAA,CAAA,KAGzQ,QAAA,iBAAjB,UAAA,GAAA,mBAAuE,QAAA;;MAAtC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,eAAA,CAAA;;;;IAIbA,KAAAA,OAAO,WAA3C,UAAA,GAAA,mBAAoE,QAAA;;KAA7D,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;IAAiC,GAAA,CAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA"}
1
+ {"version":3,"file":"checkbox.js","names":["$slots","_useModel","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_unref","_createVNode","_Transition","_withCtx","_createCommentVNode","_renderSlot"],"sources":["../../../src/components/checkbox/checkbox.vue"],"sourcesContent":["<template>\n <label :class=\"className\">\n <input\n type=\"checkbox\"\n :class=\"cls.e('native')\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n @click=\"handleInput\"\n />\n\n <span :class=\"cls.e('wrap')\">\n <transition name=\"zoom-in\" mode=\"out-in\">\n <svg viewBox=\"0 0 64 64\" v-if=\"checked\" fill=\"currentColor\">\n <path\n d=\"M50.42,16.76L22.34,39.45l-8.1-11.46c-1.12-1.58-3.3-1.96-4.88-0.84c-1.58,1.12-1.95,3.3-0.84,4.88l10.26,14.51 c0.56,0.79,1.42,1.31,2.38,1.45c0.16,0.02,0.32,0.03,0.48,0.03c0.8,0,1.57-0.27,2.2-0.78l30.99-25.03c1.5-1.21,1.74-3.42,0.52-4.92 C54.13,15.78,51.93,15.55,50.42,16.76z\"\n ></path>\n </svg>\n <span v-else-if=\"indeterminate\" :class=\"cls.m('indeterminate')\"></span>\n </transition>\n </span>\n\n <span :class=\"cls.e('label')\" v-if=\"$slots.default\"><slot /> </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CheckboxProps, CheckboxEmits } from '../../types'\n\ndefineOptions({ name: 'UCheckbox' })\nconst props = withDefaults(defineProps<CheckboxProps>(), {\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<CheckboxEmits>()\nconst cls = bem('checkbox')\n\nconst checked = defineModel<boolean>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('checked', checked.value || props.indeterminate)\n ]\n})\n\nconst handleInput = (e: MouseEvent) => {\n if (readonly.value) return\n const target = e.target as HTMLInputElement\n checked.value = target.checked\n emit('change', target.checked, e)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCA,MAAM,QAAQ;EAKd,MAAM,OAAO;EACb,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,UAAUC,SAAoB,SAAA,YAAC;EAErC,MAAM,EAAE,cAAc,kBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG;GAClF,MAAM;GACN,UAAU;GACV,UAAU;EACZ,CAAC;EAED,MAAM,YAAY,eAAe;GAC/B,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,IAAI,GAAG,YAAY,SAAS,KAAK;IACjC,IAAI,GAAG,YAAY,SAAS,KAAK;IACjC,IAAI,GAAG,WAAW,QAAQ,SAAS,MAAM,aAAa;GACxD;EACF,CAAC;EAED,MAAM,eAAe,MAAkB;GACrC,IAAI,SAAS,OAAO;GACpB,MAAM,SAAS,EAAE;GACjB,QAAQ,QAAQ,OAAO;GACvB,KAAK,UAAU,OAAO,SAAS,CAAC;EAClC;;GAlEE,OAAAC,UAAA,GAAAC,mBAqBQ,SAAA,EArBA,OAAKC,eAAE,UAAA,KAAS,EAAA,GAAA;IACtBC,mBAME,SAAA;KALA,MAAK;KACJ,OAAKD,eAAEE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA;KACZ,SAAS,QAAA;KACT,UAAUA,MAAA,QAAA;KACV,SAAO;;IAGVD,mBASO,QAAA,EATA,OAAKD,eAAEE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GACjB,CAAAC,YAOaC,YAAA;KAPD,MAAK;KAAU,MAAK;;KAC9B,SAAAC,cAIM,CAJyB,QAAA,SAA/BP,UAAA,GAAAC,mBAIM,OAJN,YAIM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAHJE,mBAEQ,QAAA,EADN,GAAE,qRAAoR,GAAA,MAAA,EAAA,CAAA,EAAA,CAAA,KAGzQ,QAAA,iBAAjBH,UAAA,GAAAC,mBAAuE,QAAA;;MAAtC,OAAKC,eAAEE,MAAA,GAAA,CAAG,CAAC,EAAC,eAAA,CAAA;;;;IAIbN,KAAAA,OAAO,WAA3CE,UAAA,GAAAC,mBAAoE,QAAA;;KAA7D,OAAKC,eAAEE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;IAAiC,GAAA,CAAAK,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox-group.js","names":["$attrs"],"sources":["../../../src/components/checkbox-group/checkbox-group.vue"],"sourcesContent":["<template>\n <div v-if=\"!readonly\" v-bind=\"$attrs\" :class=\"[cls.b, cls.m(size), bem.is('block', block)]\">\n <u-checkbox\n v-for=\"item of items\"\n :key=\"item[valueKey]\"\n :model-value=\"getCheckStatus(item)\"\n @update:model-value=\"handleUpdate($event, item)\"\n :disabled=\"disabled\"\n :size=\"size\"\n >\n {{ item[labelKey] }}\n </u-checkbox>\n </div>\n\n <div v-else-if=\"model?.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"tag of model\" :key=\"tag\">\n {{ getLabel(tag) }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem, fieldKey, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CheckboxGroupProps, CheckboxGroupEmits } from '../../types'\nimport { UCheckbox } from '../checkbox'\nimport { UTag } from '../tag'\n\ndefineOptions({ name: 'UCheckboxGroup', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CheckboxGroupProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n disabled: undefined,\n readonly: undefined\n})\n\ndefineEmits<CheckboxGroupEmits>()\n\nconst model = defineModel<any[]>()\n\nconst cls = bem('checkbox-group')\n\nconst labelKey = computed(() => fieldKey(props.labelKey, 'label'))\nconst valueKey = computed(() => fieldKey(props.valueKey, 'value'))\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\n/**\n * 获取checkbox的选中状态\n * @param item - 模型对象\n * @returns 模型值是否存在于model.value中\n */\nconst getCheckStatus = (item: Record<string, string | number>): boolean => {\n const value = item[valueKey.value]\n if (!value || !model.value) return false\n return model.value.includes(value)\n}\n\n/**\n * 处理更新操作\n * @param checked - 指示是否选中\n * @param item - 更新的项\n */\nconst handleUpdate = (checked: boolean, item: Record<string, string | number>) => {\n const value = item[valueKey.value]\n if (!value) return\n if (checked) {\n model.value = [...(model.value ?? []), value]\n } else {\n model.value = model.value?.filter((v) => v !== value)\n }\n}\n\nconst getLabel = (value: string | number) => {\n const { items } = props\n const item = items.find((item) => item[valueKey.value] === value)\n return item?.[labelKey.value]\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCA,MAAM,QAAQ;EASd,MAAM,QAAQ,SAAkB,SAAA,YAAC;EAEjC,MAAM,MAAM,IAAI,gBAAgB;EAEhC,MAAM,WAAW,eAAe,SAAS,MAAM,UAAU,OAAO,CAAC;EACjE,MAAM,WAAW,eAAe,SAAS,MAAM,UAAU,OAAO,CAAC;EAEjE,MAAM,EAAE,cAAc,kBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG;GAClF,MAAM;GACN,UAAU;GACV,UAAU;EACZ,CAAC;;;;;;EAOD,MAAM,kBAAkB,SAAmD;GACzE,MAAM,QAAQ,KAAK,SAAS;GAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO,OAAO;GACnC,OAAO,MAAM,MAAM,SAAS,KAAK;EACnC;;;;;;EAOA,MAAM,gBAAgB,SAAkB,SAA0C;GAChF,MAAM,QAAQ,KAAK,SAAS;GAC5B,IAAI,CAAC,OAAO;GACZ,IAAI,SACF,MAAM,QAAQ,CAAC,GAAI,MAAM,SAAS,CAAC,GAAI,KAAK;QAE5C,MAAM,QAAQ,MAAM,OAAO,QAAQ,MAAM,MAAM,KAAK;EAExD;EAEA,MAAM,YAAY,UAA2B;GAC3C,MAAM,EAAE,UAAU;GAElB,OADa,MAAM,MAAM,SAAS,KAAK,SAAS,WAAW,KACpD,CAAA,GAAO,SAAS;EACzB;;GA5Fc,OAAA,CAAA,MAAA,QAAA,KAAZ,UAAA,GAAA,mBAWM,OAXN,WAWM,EAAA,KAAA,EAAA,GAXwBA,KAAAA,QAAM,EAAG,OAAK;IAAG,MAAA,GAAA,CAAG,CAAC;IAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI;IAAG,MAAA,GAAA,CAAG,CAAC,GAAE,SAAU,QAAA,KAAK;GAAA,EAAA,CAAA,GACtF,EAAA,UAAA,IAAA,GAAA,mBASa,UAAA,MAAA,WARI,QAAA,QAAR,SAAI;IADb,OAAA,UAAA,GAAA,YASa,MAAA,WAAA,GAAA;KAPV,KAAK,KAAK,SAAA;KACV,eAAa,eAAe,IAAI;KAChC,wBAAkB,WAAE,aAAa,QAAQ,IAAI;KAC7C,UAAU,MAAA,QAAA;KACV,MAAM,MAAA,IAAA;;KAEP,SAAA,cAAoB,CAAjB,gBAAA,gBAAA,KAAK,SAAA,MAAQ,GAAA,CAAA,CAAA,CAAA;;;;;;;;GAIJ,CAAA,GAAA,GAAA,EAAA,GAAA,EAAA,KAAA,MAAA,OAAO,UAAvB,UAAA,GAAA,mBAMM,OAAA;;IAN0B,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI,GAAG,MAAA,GAAA,CAAG,CAAC,EAAC,eAAA,CAAA,CAAA;GACxD,GAAA,CAAA,mBAIM,OAAA,EAJA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GAChB,EAAA,UAAA,IAAA,GAAA,mBAEQ,UAAA,MAAA,WAFa,MAAA,QAAP,QAAG;IAAjB,OAAA,UAAA,GAAA,YAEQ,MAAA,WAAA,GAAA,EAFqB,KAAK,IAAG,GAAA;KACnC,SAAA,cAAmB,CAAhB,gBAAA,gBAAA,SAAS,GAAG,CAAA,GAAA,CAAA,CAAA,CAAA;;;GAKrB,CAAA,GAAA,GAAA,EAAA,GAAA,CAAA,CAAA,GAAA,CAAA,MAAA,UAAA,GAAA,mBAEW,UAAA,EAAA,KAAA,EAAA,GAAA,CADN,gBAAA,gBAAA,MAAA,kBAAA,CAAkB,GAAA,CAAA,CAAA,GAAA,EAAA"}
1
+ {"version":3,"file":"checkbox-group.js","names":["$attrs","_useModel","_unref","_openBlock","_createElementBlock","_mergeProps","_Fragment","_renderList","_createBlock","UCheckbox","_withCtx","_createTextVNode","_toDisplayString","_normalizeClass","_createElementVNode","UTag"],"sources":["../../../src/components/checkbox-group/checkbox-group.vue"],"sourcesContent":["<template>\n <div v-if=\"!readonly\" v-bind=\"$attrs\" :class=\"[cls.b, cls.m(size), bem.is('block', block)]\">\n <u-checkbox\n v-for=\"item of items\"\n :key=\"item[valueKey]\"\n :model-value=\"getCheckStatus(item)\"\n @update:model-value=\"handleUpdate($event, item)\"\n :disabled=\"disabled\"\n :size=\"size\"\n >\n {{ item[labelKey] }}\n </u-checkbox>\n </div>\n\n <div v-else-if=\"model?.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"tag of model\" :key=\"tag\">\n {{ getLabel(tag) }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem, fieldKey, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CheckboxGroupProps, CheckboxGroupEmits } from '../../types'\nimport { UCheckbox } from '../checkbox'\nimport { UTag } from '../tag'\n\ndefineOptions({ name: 'UCheckboxGroup', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CheckboxGroupProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n disabled: undefined,\n readonly: undefined\n})\n\ndefineEmits<CheckboxGroupEmits>()\n\nconst model = defineModel<any[]>()\n\nconst cls = bem('checkbox-group')\n\nconst labelKey = computed(() => fieldKey(props.labelKey, 'label'))\nconst valueKey = computed(() => fieldKey(props.valueKey, 'value'))\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\n/**\n * 获取checkbox的选中状态\n * @param item - 模型对象\n * @returns 模型值是否存在于model.value中\n */\nconst getCheckStatus = (item: Record<string, string | number>): boolean => {\n const value = item[valueKey.value]\n if (!value || !model.value) return false\n return model.value.includes(value)\n}\n\n/**\n * 处理更新操作\n * @param checked - 指示是否选中\n * @param item - 更新的项\n */\nconst handleUpdate = (checked: boolean, item: Record<string, string | number>) => {\n const value = item[valueKey.value]\n if (!value) return\n if (checked) {\n model.value = [...(model.value ?? []), value]\n } else {\n model.value = model.value?.filter((v) => v !== value)\n }\n}\n\nconst getLabel = (value: string | number) => {\n const { items } = props\n const item = items.find((item) => item[valueKey.value] === value)\n return item?.[labelKey.value]\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCA,MAAM,QAAQ;EASd,MAAM,QAAQC,SAAkB,SAAA,YAAC;EAEjC,MAAM,MAAM,IAAI,gBAAgB;EAEhC,MAAM,WAAW,eAAe,SAAS,MAAM,UAAU,OAAO,CAAC;EACjE,MAAM,WAAW,eAAe,SAAS,MAAM,UAAU,OAAO,CAAC;EAEjE,MAAM,EAAE,cAAc,kBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG;GAClF,MAAM;GACN,UAAU;GACV,UAAU;EACZ,CAAC;;;;;;EAOD,MAAM,kBAAkB,SAAmD;GACzE,MAAM,QAAQ,KAAK,SAAS;GAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO,OAAO;GACnC,OAAO,MAAM,MAAM,SAAS,KAAK;EACnC;;;;;;EAOA,MAAM,gBAAgB,SAAkB,SAA0C;GAChF,MAAM,QAAQ,KAAK,SAAS;GAC5B,IAAI,CAAC,OAAO;GACZ,IAAI,SACF,MAAM,QAAQ,CAAC,GAAI,MAAM,SAAS,CAAC,GAAI,KAAK;QAE5C,MAAM,QAAQ,MAAM,OAAO,QAAQ,MAAM,MAAM,KAAK;EAExD;EAEA,MAAM,YAAY,UAA2B;GAC3C,MAAM,EAAE,UAAU;GAElB,OADa,MAAM,MAAM,SAAS,KAAK,SAAS,WAAW,KACpD,CAAA,GAAO,SAAS;EACzB;;GA5Fc,OAAA,CAAAC,MAAA,QAAA,KAAZC,UAAA,GAAAC,mBAWM,OAXNC,WAWM,EAAA,KAAA,EAAA,GAXwBL,KAAAA,QAAM,EAAG,OAAK;IAAGE,MAAA,GAAA,CAAG,CAAC;IAAGA,MAAA,GAAA,CAAG,CAAC,EAAEA,MAAA,IAAA,CAAI;IAAGA,MAAA,GAAA,CAAG,CAAC,GAAE,SAAU,QAAA,KAAK;GAAA,EAAA,CAAA,GACtF,EAAAC,UAAA,IAAA,GAAAC,mBASaE,UAAA,MAAAC,WARI,QAAA,QAAR,SAAI;IADb,OAAAJ,UAAA,GAAAK,YASaN,MAAAO,WAAA,GAAA;KAPV,KAAK,KAAK,SAAA;KACV,eAAa,eAAe,IAAI;KAChC,wBAAkB,WAAE,aAAa,QAAQ,IAAI;KAC7C,UAAUP,MAAA,QAAA;KACV,MAAMA,MAAA,IAAA;;KAEP,SAAAQ,cAAoB,CAAjBC,gBAAAC,gBAAA,KAAK,SAAA,MAAQ,GAAA,CAAA,CAAA,CAAA;;;;;;;;GAIJ,CAAA,GAAA,GAAA,EAAA,GAAA,EAAA,KAAA,MAAA,OAAO,UAAvBT,UAAA,GAAAC,mBAMM,OAAA;;IAN0B,OAAKS,eAAA,CAAGX,MAAA,GAAA,CAAG,CAAC,EAAEA,MAAA,IAAA,CAAI,GAAGA,MAAA,GAAA,CAAG,CAAC,EAAC,eAAA,CAAA,CAAA;GACxD,GAAA,CAAAY,mBAIM,OAAA,EAJA,OAAKD,eAAEX,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GAChB,EAAAC,UAAA,IAAA,GAAAC,mBAEQE,UAAA,MAAAC,WAFa,MAAA,QAAP,QAAG;IAAjB,OAAAJ,UAAA,GAAAK,YAEQN,MAAAa,WAAA,GAAA,EAFqB,KAAK,IAAG,GAAA;KACnC,SAAAL,cAAmB,CAAhBC,gBAAAC,gBAAA,SAAS,GAAG,CAAA,GAAA,CAAA,CAAA,CAAA;;;GAKrB,CAAA,GAAA,GAAA,EAAA,GAAA,CAAA,CAAA,GAAA,CAAA,MAAAT,UAAA,GAAAC,mBAEWE,UAAA,EAAA,KAAA,EAAA,GAAA,CADNK,gBAAAC,gBAAAV,MAAA,kBAAA,CAAkB,GAAA,CAAA,CAAA,GAAA,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"code-editor.js","names":["$attrs"],"sources":["../../../src/components/code-editor/code-editor.vue"],"sourcesContent":["<template>\n <!-- 放大时原位置的等高占位,避免页面布局位移 -->\n <div v-if=\"zoomed\" :class=\"cls.e('placeholder')\" :style=\"{ height: placeholderHeight }\" />\n\n <Teleport to=\"body\" :disabled=\"!zoomed\">\n <div\n ref=\"zoomWrap\"\n :class=\"[cls.e('zoom-wrap'), bem.is('zoomed', zoomed)]\"\n :style=\"zoomed ? { zIndex: zoomZIndex } : undefined\"\n tabindex=\"-1\"\n @keyup.esc=\"exitZoom\"\n >\n <div ref=\"root\" v-bind=\"$attrs\" :class=\"className\" :style=\"rootStyle\" @keyup.enter.stop>\n <div v-if=\"hasToolbar\" :class=\"cls.e('toolbar')\">\n <u-select\n v-if=\"showLangSelect\"\n :class=\"cls.e('lang-select')\"\n v-model=\"lang\"\n size=\"small\"\n :options=\"langOptions\"\n :clearable=\"false\"\n :disabled=\"disabled\"\n />\n <span v-else-if=\"langLabel\" :class=\"cls.e('lang-label')\">{{ langLabel }}</span>\n\n <div :class=\"cls.e('toolbar-actions')\">\n <u-icon v-if=\"zoomed\" :class=\"cls.e('btn-close')\" title=\"关闭\" @click=\"exitZoom\">\n <Close />\n </u-icon>\n <u-icon\n v-else-if=\"zoomable\"\n :class=\"[cls.e('btn-zoom'), bem.is('disabled', disabled)]\"\n title=\"放大\"\n @click=\"enterZoom\"\n >\n <ZoomIn />\n </u-icon>\n </div>\n </div>\n\n <u-scroll :class=\"cls.e('scroll')\">\n <div ref=\"container\"></div>\n </u-scroll>\n </div>\n </div>\n </Teleport>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Compartment, EditorState, type Extension, type Text } from '@codemirror/state'\nimport { oneDark } from '@codemirror/theme-one-dark'\nimport { EditorView, tooltips } from '@codemirror/view'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { ZoomIn, Close } from '@veltra/icons/normal'\nimport { bem, injectFormContext, zIndex } from '@veltra/utils'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n shallowRef,\n useTemplateRef,\n watch,\n type CSSProperties\n} from 'vue'\n\nimport type { CodeEditorEmits, CodeEditorLang, CodeEditorProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { UScroll } from '../scroll'\nimport { USelect } from '../select'\nimport { basicSetup } from './basic-setup'\nimport { loadLanguage } from './lang-loaders'\nimport {\n buildFullDoc,\n extractBodyFromText,\n getShellRanges,\n mapSelectionToBody,\n shellExtension,\n textEqualsShellDoc,\n type ShellConfig\n} from './shell-extension'\n\ndefineOptions({ name: 'UCodeEditor', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CodeEditorProps>(), {\n disabled: undefined,\n readonly: undefined,\n dark: false,\n zoomable: true,\n defaultLines: 8\n})\n\nconst emit = defineEmits<CodeEditorEmits>()\n\nconst model = defineModel<string>()\nconst lang = defineModel<CodeEditorLang>('lang')\n\nconst cls = bem('code-editor')\n\nconst { formProps } = injectFormContext()\n\nconst { disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n disabled: false,\n readonly: false\n})\n\n/** 放大状态:复用同一组件根 DOM / 同一 EditorView 实例,Teleport 移入 body 全屏遮罩 */\nconst zoomed = shallowRef(false)\n\n/** 放大期间原位置占位的高度(取放大前组件根高度) */\nconst placeholderHeight = shallowRef('')\n\n/** 放大遮罩的 z 轴层级,进入放大时取一次,避免渲染期反复自增 */\nconst zoomZIndex = shallowRef<number>()\n\nconst rootRef = useTemplateRef<HTMLElement>('root')\nconst zoomWrapRef = useTemplateRef<HTMLElement>('zoomWrap')\n\nconst className = computed<string[]>(() => [\n cls.b,\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('dark', props.dark),\n bem.is('zoomed', zoomed.value)\n])\n\nconst rootStyle = computed<CSSProperties>(() => ({\n '--u-code-editor-default-lines': Math.max(1, props.defaultLines)\n}))\n\nconst langs = computed(() => props.langs ?? [])\n\nconst showLangSelect = computed(() => langs.value.length > 1)\n\nconst langOptions = computed(() =>\n langs.value.map((value) => ({ label: value.toUpperCase(), value }))\n)\n\n/** 实际生效的语言:优先 lang model,否则回落 langs[0] */\nconst activeLang = computed<CodeEditorLang | undefined>(() => lang.value ?? langs.value[0])\n\n/** 仅一种语言时,在选择器位置展示名称 */\nconst langLabel = computed(() =>\n langs.value.length === 1 && activeLang.value ? activeLang.value.toUpperCase() : undefined\n)\n\n/** 语言标识或放大/关闭按钮任一存在时才渲染工具栏 */\nconst hasToolbar = computed(\n () => showLangSelect.value || !!langLabel.value || props.zoomable || zoomed.value\n)\n\nfunction enterZoom() {\n if (disabled.value || zoomed.value) return\n const root = rootRef.value\n if (root) placeholderHeight.value = `${root.offsetHeight}px`\n zoomZIndex.value = zIndex()\n zoomed.value = true\n // 遮罩层级高于创建编辑器时写入的 tooltip 层级,同步抬升避免补全提示被遮罩盖住\n editor.value?.dispatch({\n effects: tooltipThemeCompartment.reconfigure(\n EditorView.theme({ '.cm-tooltip': { zIndex: zIndex() } })\n )\n })\n // 对齐 dialog 先例:放大按钮(u-icon)不可聚焦,点击后焦点在 body 上,\n // keyup 不会向下经过遮罩,需主动聚焦遮罩,Esc 才能冒泡到 keyup.esc\n nextTick(() => zoomWrapRef.value?.focus())\n}\n\nfunction exitZoom() {\n if (!zoomed.value) return\n zoomed.value = false\n}\n\n/** 放大期间锁定 body 滚动,退出后恢复原值 */\nlet prevBodyOverflow = ''\n\nwatch(zoomed, (v) => {\n if (v) {\n prevBodyOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n } else {\n document.body.style.overflow = prevBodyOverflow\n }\n})\n\nconst shellConfig = computed<ShellConfig>(() => ({\n prefix: props.prefix ?? '',\n suffix: props.suffix ?? ''\n}))\n\nconst containerRef = useTemplateRef('container')\nconst editor = shallowRef<EditorView | null>(null)\n\nconst themeCompartment = new Compartment()\nconst editableCompartment = new Compartment()\nconst readOnlyCompartment = new Compartment()\nconst langCompartment = new Compartment()\nconst shellCompartment = new Compartment()\nconst tooltipThemeCompartment = new Compartment()\n\n/** 聚焦时的正文快照,用于失焦时判断是否触发 change */\nlet focusSnapshot = ''\n\n/**\n * 编辑器最近一次写出的正文引用。\n * 用于短路 model → doc 同步,避免每次按键对整篇文档做 O(n) 相等比较。\n */\nlet lastEditorBody: string | undefined\n\n/** 上一帧是否处于 IME composition,用于在 composition 结束时补一次 model 同步 */\nlet wasComposing = false\n\n/** 将编辑器正文写回 v-model(跳过与上次相同的值,避免多余更新) */\nfunction writeModelFromDoc(doc: Text) {\n const nextBody = extractBodyFromText(doc, shellConfig.value)\n if (nextBody === lastEditorBody && nextBody === model.value) return\n lastEditorBody = nextBody\n model.value = nextBody\n}\n\nfunction buildExtensions(): Extension[] {\n return [\n basicSetup,\n tooltips({ parent: document.body }),\n tooltipThemeCompartment.of(EditorView.theme({ '.cm-tooltip': { zIndex: zIndex() } })),\n themeCompartment.of(props.dark ? oneDark : []),\n editableCompartment.of(EditorView.editable.of(!disabled.value)),\n readOnlyCompartment.of(EditorState.readOnly.of(readonly.value)),\n langCompartment.of([]),\n shellCompartment.of(shellExtension(shellConfig.value)),\n EditorView.updateListener.of((update) => {\n const composing = update.view.composing\n\n // IME 进行中不写回,避免中间态触发父级重渲染;结束后再统一同步\n if (update.docChanged && !composing) {\n writeModelFromDoc(update.state.doc)\n } else if (wasComposing && !composing) {\n writeModelFromDoc(update.state.doc)\n }\n wasComposing = composing\n\n if (!update.focusChanged) return\n if (update.view.hasFocus) {\n focusSnapshot = extractBodyFromText(update.state.doc, shellConfig.value)\n return\n }\n const current = extractBodyFromText(update.state.doc, shellConfig.value)\n if (current !== focusSnapshot) {\n emit('change', current)\n }\n })\n ]\n}\n\nlet editorToken = 0\nlet langToken = 0\n\nasync function applyLanguage() {\n const view = editor.value\n if (!view) return\n const myToken = ++langToken\n const language = activeLang.value\n\n if (!language) {\n if (myToken !== langToken || editor.value !== view) return\n view.dispatch({ effects: langCompartment.reconfigure([]) })\n return\n }\n\n const ext = await loadLanguage(language)\n if (myToken !== langToken || editor.value !== view) return\n view.dispatch({ effects: langCompartment.reconfigure(ext) })\n}\n\nfunction destroyEditor() {\n ++editorToken\n ++langToken\n editor.value?.destroy()\n editor.value = null\n lastEditorBody = undefined\n wasComposing = false\n}\n\nfunction createEditor() {\n destroyEditor()\n const myToken = ++editorToken\n const parent = containerRef.value\n if (!parent) return\n\n const config = shellConfig.value\n const body = model.value ?? ''\n const doc = buildFullDoc(body, config)\n const { bodyStart } = getShellRanges(doc.length, config)\n lastEditorBody = body\n\n const view = new EditorView({\n doc,\n selection: { anchor: bodyStart, head: bodyStart },\n extensions: buildExtensions(),\n parent\n })\n\n if (myToken !== editorToken) {\n view.destroy()\n return\n }\n\n editor.value = view\n applyLanguage()\n}\n\n/**\n * 将 model 正文同步为完整文档;可选同时 reconfigure shell,\n * 避免 prefix/suffix 变更时「先改扩展、后改文档」导致选区越界。\n */\nfunction syncDocFromModel(\n view: EditorView,\n body: string,\n config: ShellConfig,\n options?: { reconfigureShell?: boolean; prevShell?: ShellConfig }\n) {\n const current = view.state.doc\n const docChanged = !textEqualsShellDoc(current, body, config)\n const reconfigureShell = options?.reconfigureShell ?? false\n\n if (!docChanged && !reconfigureShell) return\n\n const nextDoc = buildFullDoc(body, config)\n const prevShell = options?.prevShell ?? config\n const prevRanges = getShellRanges(current.length, prevShell)\n const nextRanges = getShellRanges(nextDoc.length, config)\n const selection = mapSelectionToBody(view.state.selection, prevRanges, nextRanges, nextDoc.length)\n\n view.dispatch({\n ...(docChanged\n ? {\n changes: { from: 0, to: current.length, insert: nextDoc },\n selection,\n // 仅外壳变更时滚入视口;外部 model 回写不应打断用户滚动位置\n ...(reconfigureShell ? { scrollIntoView: true } : {})\n }\n : { selection }),\n ...(reconfigureShell ? { effects: shellCompartment.reconfigure(shellExtension(config)) } : {}),\n // 绕过 shell 的 change/transactionFilter,避免全量替换被拦截或选区被错误钳制\n filter: false\n })\n}\n\nwatch(\n containerRef,\n (el) => {\n if (el) createEditor()\n else destroyEditor()\n },\n { immediate: true, flush: 'post' }\n)\n\nwatch(activeLang, applyLanguage)\n\n/** langs 变化时,若当前 lang 未设或不在列表中则纠正为 langs[0] */\nwatch(\n langs,\n (list) => {\n if (!list.length) return\n if (!lang.value || !list.includes(lang.value)) {\n lang.value = list[0]\n }\n },\n { immediate: true }\n)\n\nwatch(\n () => props.dark,\n (dark) => {\n editor.value?.dispatch({ effects: themeCompartment.reconfigure(dark ? oneDark : []) })\n }\n)\n\nwatch(disabled, (v) => {\n editor.value?.dispatch({ effects: editableCompartment.reconfigure(EditorView.editable.of(!v)) })\n})\n\nwatch(readonly, (v) => {\n editor.value?.dispatch({ effects: readOnlyCompartment.reconfigure(EditorState.readOnly.of(v)) })\n})\n\nwatch(\n [model, editor, shellConfig],\n ([v, e], [, , prevShell]) => {\n if (!e) return\n // IME 组字中不接受外部回写,避免打断输入\n if (e.composing) return\n const config = shellConfig.value\n const shellChanged =\n !prevShell || prevShell.prefix !== config.prefix || prevShell.suffix !== config.suffix\n // 编辑器自身写出的 model 无需回写文档\n if (!shellChanged && v === lastEditorBody) return\n const body = v ?? ''\n syncDocFromModel(e, body, config, {\n reconfigureShell: shellChanged,\n prevShell: prevShell ?? config\n })\n lastEditorBody = body\n },\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n destroyEditor()\n if (zoomed.value) document.body.style.overflow = prevBodyOverflow\n})\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"code-editor.js","names":["$attrs","_useModel","_openBlock","_createElementBlock","_Fragment","_createCommentVNode","_normalizeClass","_unref","_normalizeStyle","_createBlock","_Teleport","_createElementVNode","_withKeys","_mergeProps","_withModifiers","USelect","_toDisplayString","UIcon","_withCtx","_createVNode","UScroll"],"sources":["../../../src/components/code-editor/code-editor.vue"],"sourcesContent":["<template>\n <!-- 放大时原位置的等高占位,避免页面布局位移 -->\n <div v-if=\"zoomed\" :class=\"cls.e('placeholder')\" :style=\"{ height: placeholderHeight }\" />\n\n <Teleport to=\"body\" :disabled=\"!zoomed\">\n <div\n ref=\"zoomWrap\"\n :class=\"[cls.e('zoom-wrap'), bem.is('zoomed', zoomed)]\"\n :style=\"zoomed ? { zIndex: zoomZIndex } : undefined\"\n tabindex=\"-1\"\n @keyup.esc=\"exitZoom\"\n >\n <div ref=\"root\" v-bind=\"$attrs\" :class=\"className\" :style=\"rootStyle\" @keyup.enter.stop>\n <div v-if=\"hasToolbar\" :class=\"cls.e('toolbar')\">\n <u-select\n v-if=\"showLangSelect\"\n :class=\"cls.e('lang-select')\"\n v-model=\"lang\"\n size=\"small\"\n :options=\"langOptions\"\n :clearable=\"false\"\n :disabled=\"disabled\"\n />\n <span v-else-if=\"langLabel\" :class=\"cls.e('lang-label')\">{{ langLabel }}</span>\n\n <div :class=\"cls.e('toolbar-actions')\">\n <u-icon v-if=\"zoomed\" :class=\"cls.e('btn-close')\" title=\"关闭\" @click=\"exitZoom\">\n <Close />\n </u-icon>\n <u-icon\n v-else-if=\"zoomable\"\n :class=\"[cls.e('btn-zoom'), bem.is('disabled', disabled)]\"\n title=\"放大\"\n @click=\"enterZoom\"\n >\n <ZoomIn />\n </u-icon>\n </div>\n </div>\n\n <u-scroll :class=\"cls.e('scroll')\">\n <div ref=\"container\"></div>\n </u-scroll>\n </div>\n </div>\n </Teleport>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Compartment, EditorState, type Extension, type Text } from '@codemirror/state'\nimport { oneDark } from '@codemirror/theme-one-dark'\nimport { EditorView, tooltips } from '@codemirror/view'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { ZoomIn, Close } from '@veltra/icons/normal'\nimport { bem, injectFormContext, zIndex } from '@veltra/utils'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n shallowRef,\n useTemplateRef,\n watch,\n type CSSProperties\n} from 'vue'\n\nimport type { CodeEditorEmits, CodeEditorLang, CodeEditorProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { UScroll } from '../scroll'\nimport { USelect } from '../select'\nimport { basicSetup } from './basic-setup'\nimport { loadLanguage } from './lang-loaders'\nimport {\n buildFullDoc,\n extractBodyFromText,\n getShellRanges,\n mapSelectionToBody,\n shellExtension,\n textEqualsShellDoc,\n type ShellConfig\n} from './shell-extension'\n\ndefineOptions({ name: 'UCodeEditor', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CodeEditorProps>(), {\n disabled: undefined,\n readonly: undefined,\n dark: false,\n zoomable: true,\n defaultLines: 8\n})\n\nconst emit = defineEmits<CodeEditorEmits>()\n\nconst model = defineModel<string>()\nconst lang = defineModel<CodeEditorLang>('lang')\n\nconst cls = bem('code-editor')\n\nconst { formProps } = injectFormContext()\n\nconst { disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n disabled: false,\n readonly: false\n})\n\n/** 放大状态:复用同一组件根 DOM / 同一 EditorView 实例,Teleport 移入 body 全屏遮罩 */\nconst zoomed = shallowRef(false)\n\n/** 放大期间原位置占位的高度(取放大前组件根高度) */\nconst placeholderHeight = shallowRef('')\n\n/** 放大遮罩的 z 轴层级,进入放大时取一次,避免渲染期反复自增 */\nconst zoomZIndex = shallowRef<number>()\n\nconst rootRef = useTemplateRef<HTMLElement>('root')\nconst zoomWrapRef = useTemplateRef<HTMLElement>('zoomWrap')\n\nconst className = computed<string[]>(() => [\n cls.b,\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('dark', props.dark),\n bem.is('zoomed', zoomed.value)\n])\n\nconst rootStyle = computed<CSSProperties>(() => ({\n '--u-code-editor-default-lines': Math.max(1, props.defaultLines)\n}))\n\nconst langs = computed(() => props.langs ?? [])\n\nconst showLangSelect = computed(() => langs.value.length > 1)\n\nconst langOptions = computed(() =>\n langs.value.map((value) => ({ label: value.toUpperCase(), value }))\n)\n\n/** 实际生效的语言:优先 lang model,否则回落 langs[0] */\nconst activeLang = computed<CodeEditorLang | undefined>(() => lang.value ?? langs.value[0])\n\n/** 仅一种语言时,在选择器位置展示名称 */\nconst langLabel = computed(() =>\n langs.value.length === 1 && activeLang.value ? activeLang.value.toUpperCase() : undefined\n)\n\n/** 语言标识或放大/关闭按钮任一存在时才渲染工具栏 */\nconst hasToolbar = computed(\n () => showLangSelect.value || !!langLabel.value || props.zoomable || zoomed.value\n)\n\nfunction enterZoom() {\n if (disabled.value || zoomed.value) return\n const root = rootRef.value\n if (root) placeholderHeight.value = `${root.offsetHeight}px`\n zoomZIndex.value = zIndex()\n zoomed.value = true\n // 遮罩层级高于创建编辑器时写入的 tooltip 层级,同步抬升避免补全提示被遮罩盖住\n editor.value?.dispatch({\n effects: tooltipThemeCompartment.reconfigure(\n EditorView.theme({ '.cm-tooltip': { zIndex: zIndex() } })\n )\n })\n // 对齐 dialog 先例:放大按钮(u-icon)不可聚焦,点击后焦点在 body 上,\n // keyup 不会向下经过遮罩,需主动聚焦遮罩,Esc 才能冒泡到 keyup.esc\n nextTick(() => zoomWrapRef.value?.focus())\n}\n\nfunction exitZoom() {\n if (!zoomed.value) return\n zoomed.value = false\n}\n\n/** 放大期间锁定 body 滚动,退出后恢复原值 */\nlet prevBodyOverflow = ''\n\nwatch(zoomed, (v) => {\n if (v) {\n prevBodyOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n } else {\n document.body.style.overflow = prevBodyOverflow\n }\n})\n\nconst shellConfig = computed<ShellConfig>(() => ({\n prefix: props.prefix ?? '',\n suffix: props.suffix ?? ''\n}))\n\nconst containerRef = useTemplateRef('container')\nconst editor = shallowRef<EditorView | null>(null)\n\nconst themeCompartment = new Compartment()\nconst editableCompartment = new Compartment()\nconst readOnlyCompartment = new Compartment()\nconst langCompartment = new Compartment()\nconst shellCompartment = new Compartment()\nconst tooltipThemeCompartment = new Compartment()\n\n/** 聚焦时的正文快照,用于失焦时判断是否触发 change */\nlet focusSnapshot = ''\n\n/**\n * 编辑器最近一次写出的正文引用。\n * 用于短路 model → doc 同步,避免每次按键对整篇文档做 O(n) 相等比较。\n */\nlet lastEditorBody: string | undefined\n\n/** 上一帧是否处于 IME composition,用于在 composition 结束时补一次 model 同步 */\nlet wasComposing = false\n\n/** 将编辑器正文写回 v-model(跳过与上次相同的值,避免多余更新) */\nfunction writeModelFromDoc(doc: Text) {\n const nextBody = extractBodyFromText(doc, shellConfig.value)\n if (nextBody === lastEditorBody && nextBody === model.value) return\n lastEditorBody = nextBody\n model.value = nextBody\n}\n\nfunction buildExtensions(): Extension[] {\n return [\n basicSetup,\n tooltips({ parent: document.body }),\n tooltipThemeCompartment.of(EditorView.theme({ '.cm-tooltip': { zIndex: zIndex() } })),\n themeCompartment.of(props.dark ? oneDark : []),\n editableCompartment.of(EditorView.editable.of(!disabled.value)),\n readOnlyCompartment.of(EditorState.readOnly.of(readonly.value)),\n langCompartment.of([]),\n shellCompartment.of(shellExtension(shellConfig.value)),\n EditorView.updateListener.of((update) => {\n const composing = update.view.composing\n\n // IME 进行中不写回,避免中间态触发父级重渲染;结束后再统一同步\n if (update.docChanged && !composing) {\n writeModelFromDoc(update.state.doc)\n } else if (wasComposing && !composing) {\n writeModelFromDoc(update.state.doc)\n }\n wasComposing = composing\n\n if (!update.focusChanged) return\n if (update.view.hasFocus) {\n focusSnapshot = extractBodyFromText(update.state.doc, shellConfig.value)\n return\n }\n const current = extractBodyFromText(update.state.doc, shellConfig.value)\n if (current !== focusSnapshot) {\n emit('change', current)\n }\n })\n ]\n}\n\nlet editorToken = 0\nlet langToken = 0\n\nasync function applyLanguage() {\n const view = editor.value\n if (!view) return\n const myToken = ++langToken\n const language = activeLang.value\n\n if (!language) {\n if (myToken !== langToken || editor.value !== view) return\n view.dispatch({ effects: langCompartment.reconfigure([]) })\n return\n }\n\n const ext = await loadLanguage(language)\n if (myToken !== langToken || editor.value !== view) return\n view.dispatch({ effects: langCompartment.reconfigure(ext) })\n}\n\nfunction destroyEditor() {\n ++editorToken\n ++langToken\n editor.value?.destroy()\n editor.value = null\n lastEditorBody = undefined\n wasComposing = false\n}\n\nfunction createEditor() {\n destroyEditor()\n const myToken = ++editorToken\n const parent = containerRef.value\n if (!parent) return\n\n const config = shellConfig.value\n const body = model.value ?? ''\n const doc = buildFullDoc(body, config)\n const { bodyStart } = getShellRanges(doc.length, config)\n lastEditorBody = body\n\n const view = new EditorView({\n doc,\n selection: { anchor: bodyStart, head: bodyStart },\n extensions: buildExtensions(),\n parent\n })\n\n if (myToken !== editorToken) {\n view.destroy()\n return\n }\n\n editor.value = view\n applyLanguage()\n}\n\n/**\n * 将 model 正文同步为完整文档;可选同时 reconfigure shell,\n * 避免 prefix/suffix 变更时「先改扩展、后改文档」导致选区越界。\n */\nfunction syncDocFromModel(\n view: EditorView,\n body: string,\n config: ShellConfig,\n options?: { reconfigureShell?: boolean; prevShell?: ShellConfig }\n) {\n const current = view.state.doc\n const docChanged = !textEqualsShellDoc(current, body, config)\n const reconfigureShell = options?.reconfigureShell ?? false\n\n if (!docChanged && !reconfigureShell) return\n\n const nextDoc = buildFullDoc(body, config)\n const prevShell = options?.prevShell ?? config\n const prevRanges = getShellRanges(current.length, prevShell)\n const nextRanges = getShellRanges(nextDoc.length, config)\n const selection = mapSelectionToBody(view.state.selection, prevRanges, nextRanges, nextDoc.length)\n\n view.dispatch({\n ...(docChanged\n ? {\n changes: { from: 0, to: current.length, insert: nextDoc },\n selection,\n // 仅外壳变更时滚入视口;外部 model 回写不应打断用户滚动位置\n ...(reconfigureShell ? { scrollIntoView: true } : {})\n }\n : { selection }),\n ...(reconfigureShell ? { effects: shellCompartment.reconfigure(shellExtension(config)) } : {}),\n // 绕过 shell 的 change/transactionFilter,避免全量替换被拦截或选区被错误钳制\n filter: false\n })\n}\n\nwatch(\n containerRef,\n (el) => {\n if (el) createEditor()\n else destroyEditor()\n },\n { immediate: true, flush: 'post' }\n)\n\nwatch(activeLang, applyLanguage)\n\n/** langs 变化时,若当前 lang 未设或不在列表中则纠正为 langs[0] */\nwatch(\n langs,\n (list) => {\n if (!list.length) return\n if (!lang.value || !list.includes(lang.value)) {\n lang.value = list[0]\n }\n },\n { immediate: true }\n)\n\nwatch(\n () => props.dark,\n (dark) => {\n editor.value?.dispatch({ effects: themeCompartment.reconfigure(dark ? oneDark : []) })\n }\n)\n\nwatch(disabled, (v) => {\n editor.value?.dispatch({ effects: editableCompartment.reconfigure(EditorView.editable.of(!v)) })\n})\n\nwatch(readonly, (v) => {\n editor.value?.dispatch({ effects: readOnlyCompartment.reconfigure(EditorState.readOnly.of(v)) })\n})\n\nwatch(\n [model, editor, shellConfig],\n ([v, e], [, , prevShell]) => {\n if (!e) return\n // IME 组字中不接受外部回写,避免打断输入\n if (e.composing) return\n const config = shellConfig.value\n const shellChanged =\n !prevShell || prevShell.prefix !== config.prefix || prevShell.suffix !== config.suffix\n // 编辑器自身写出的 model 无需回写文档\n if (!shellChanged && v === lastEditorBody) return\n const body = v ?? ''\n syncDocFromModel(e, body, config, {\n reconfigureShell: shellChanged,\n prevShell: prevShell ?? config\n })\n lastEditorBody = body\n },\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n destroyEditor()\n if (zoomed.value) document.body.style.overflow = prevBodyOverflow\n})\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"collapse-item.js","names":[],"sources":["../../../src/components/collapse/collapse-item.vue"],"sourcesContent":["<template>\n <div :class=\"classList\">\n <div\n :class=\"headerClassList\"\n role=\"button\"\n :aria-expanded=\"isActive\"\n :aria-disabled=\"disabled\"\n :tabindex=\"disabled ? -1 : 0\"\n @click=\"handleClick\"\n @keydown.enter.prevent=\"handleClick\"\n @keydown.space.prevent=\"handleClick\"\n >\n <span :class=\"cls.e('title')\">\n <slot name=\"header\" :is-active=\"isActive\">{{ title }}</slot>\n </span>\n\n <span :class=\"cls.e('icon')\">\n <UIcon><component :is=\"iconComponent\" /></UIcon>\n </span>\n </div>\n <div ref=\"wrapperEl\" :class=\"cls.e('content-wrapper')\" :aria-hidden=\"!isActive\">\n <div v-if=\"contentMounted\" :class=\"cls.e('content')\">\n <slot />\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useModel } from '@veltra/compositions'\nimport { ArrowDown } from '@veltra/icons/normal'\nimport { bem, ExpandTransition } from '@veltra/utils'\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport type { CollapseItemEmits, CollapseItemProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { CollapseDIKey } from './di'\n\ndefineOptions({ name: 'UCollapseItem' })\n\nconst props = withDefaults(defineProps<CollapseItemProps>(), { modelValue: false })\nconst emit = defineEmits<CollapseItemEmits>()\n\ndefineSlots<{\n /** 自定义标题区,作用域参数 `isActive` 指示展开状态;缺省渲染 title。展开图标始终由组件渲染,活动态旋转 180° */\n header?: (scope: { isActive: boolean }) => any\n /** 折叠面板内容 */\n default?: () => any\n}>()\n\nconst context = inject(CollapseDIKey, undefined)\n\nconst cls = context?.cls ?? bem('collapse')\n\nconst standaloneModel = useModel<CollapseItemProps, 'modelValue'>({\n props,\n emit,\n defaultValue: false\n})\n\nconst isActive = computed(() => {\n if (context) {\n return props.value !== undefined && context.activeValues.value.includes(props.value)\n }\n return !!standaloneModel.value\n})\n\nconst iconComponent = computed(() => context?.expandIcon.value ?? props.expandIcon ?? ArrowDown)\n\nconst classList = computed(() => [\n cls.e('item'),\n bem.is('active', isActive.value),\n bem.is('disabled', props.disabled)\n])\n\nconst headerClassList = computed(() => [\n cls.e('header'),\n bem.is('disabled', props.disabled),\n bem.is('active', isActive.value)\n])\n\nconst expandTransition =\n context?.expandTransition ??\n new ExpandTransition({ transition: 'height 0.24s cubic-bezier(0.4, 0, 0.2, 1)' })\n\nconst handleClick = () => {\n if (props.disabled) return\n\n if (context) {\n if (props.value === undefined) return\n context.toggle(props.value)\n return\n }\n\n const next = !standaloneModel.value\n standaloneModel.value = next\n emit('change', next)\n}\n\nconst wrapperEl = ref<HTMLElement>()\n\n/** 内容是否挂载:destroyOnCollapse 时折叠态卸载内容 DOM,展开前重新挂载 */\nconst contentMounted = ref(isActive.value || !props.destroyOnCollapse)\n\nonMounted(() => {\n if (context && props.value !== undefined) {\n context.register(props.value)\n }\n if (!wrapperEl.value) return\n expandTransition.setExpanded(wrapperEl.value, isActive.value)\n})\n\nwatch(isActive, async (active) => {\n if (active) {\n // 展开前先挂载内容,待 DOM 更新后再测量高度驱动展开动画\n if (!contentMounted.value) {\n contentMounted.value = true\n await nextTick()\n }\n if (!wrapperEl.value || !isActive.value) return\n expandTransition.expand(wrapperEl.value)\n return\n }\n if (!wrapperEl.value) return\n // 收起动画落定后再卸载内容 DOM;期间被重新展开则不卸载\n expandTransition.collapse(wrapperEl.value, () => {\n if (!isActive.value && props.destroyOnCollapse) contentMounted.value = false\n })\n})\n\nonBeforeUnmount(() => {\n if (context && props.value !== undefined) {\n context.unregister(props.value)\n }\n if (!wrapperEl.value) return\n expandTransition.cancel(wrapperEl.value)\n})\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"collapse-item.js","names":["useModel","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_withKeys","_withModifiers","_unref","_renderSlot","_createTextVNode","_toDisplayString","_createVNode","UIcon","_withCtx","_createBlock","_resolveDynamicComponent","_createCommentVNode"],"sources":["../../../src/components/collapse/collapse-item.vue"],"sourcesContent":["<template>\n <div :class=\"classList\">\n <div\n :class=\"headerClassList\"\n role=\"button\"\n :aria-expanded=\"isActive\"\n :aria-disabled=\"disabled\"\n :tabindex=\"disabled ? -1 : 0\"\n @click=\"handleClick\"\n @keydown.enter.prevent=\"handleClick\"\n @keydown.space.prevent=\"handleClick\"\n >\n <span :class=\"cls.e('title')\">\n <slot name=\"header\" :is-active=\"isActive\">{{ title }}</slot>\n </span>\n\n <span :class=\"cls.e('icon')\">\n <UIcon><component :is=\"iconComponent\" /></UIcon>\n </span>\n </div>\n <div ref=\"wrapperEl\" :class=\"cls.e('content-wrapper')\" :aria-hidden=\"!isActive\">\n <div v-if=\"contentMounted\" :class=\"cls.e('content')\">\n <slot />\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useModel } from '@veltra/compositions'\nimport { ArrowDown } from '@veltra/icons/normal'\nimport { bem, ExpandTransition } from '@veltra/utils'\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport type { CollapseItemEmits, CollapseItemProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { CollapseDIKey } from './di'\n\ndefineOptions({ name: 'UCollapseItem' })\n\nconst props = withDefaults(defineProps<CollapseItemProps>(), { modelValue: false })\nconst emit = defineEmits<CollapseItemEmits>()\n\ndefineSlots<{\n /** 自定义标题区,作用域参数 `isActive` 指示展开状态;缺省渲染 title。展开图标始终由组件渲染,活动态旋转 180° */\n header?: (scope: { isActive: boolean }) => any\n /** 折叠面板内容 */\n default?: () => any\n}>()\n\nconst context = inject(CollapseDIKey, undefined)\n\nconst cls = context?.cls ?? bem('collapse')\n\nconst standaloneModel = useModel<CollapseItemProps, 'modelValue'>({\n props,\n emit,\n defaultValue: false\n})\n\nconst isActive = computed(() => {\n if (context) {\n return props.value !== undefined && context.activeValues.value.includes(props.value)\n }\n return !!standaloneModel.value\n})\n\nconst iconComponent = computed(() => context?.expandIcon.value ?? props.expandIcon ?? ArrowDown)\n\nconst classList = computed(() => [\n cls.e('item'),\n bem.is('active', isActive.value),\n bem.is('disabled', props.disabled)\n])\n\nconst headerClassList = computed(() => [\n cls.e('header'),\n bem.is('disabled', props.disabled),\n bem.is('active', isActive.value)\n])\n\nconst expandTransition =\n context?.expandTransition ??\n new ExpandTransition({ transition: 'height 0.24s cubic-bezier(0.4, 0, 0.2, 1)' })\n\nconst handleClick = () => {\n if (props.disabled) return\n\n if (context) {\n if (props.value === undefined) return\n context.toggle(props.value)\n return\n }\n\n const next = !standaloneModel.value\n standaloneModel.value = next\n emit('change', next)\n}\n\nconst wrapperEl = ref<HTMLElement>()\n\n/** 内容是否挂载:destroyOnCollapse 时折叠态卸载内容 DOM,展开前重新挂载 */\nconst contentMounted = ref(isActive.value || !props.destroyOnCollapse)\n\nonMounted(() => {\n if (context && props.value !== undefined) {\n context.register(props.value)\n }\n if (!wrapperEl.value) return\n expandTransition.setExpanded(wrapperEl.value, isActive.value)\n})\n\nwatch(isActive, async (active) => {\n if (active) {\n // 展开前先挂载内容,待 DOM 更新后再测量高度驱动展开动画\n if (!contentMounted.value) {\n contentMounted.value = true\n await nextTick()\n }\n if (!wrapperEl.value || !isActive.value) return\n expandTransition.expand(wrapperEl.value)\n return\n }\n if (!wrapperEl.value) return\n // 收起动画落定后再卸载内容 DOM;期间被重新展开则不卸载\n expandTransition.collapse(wrapperEl.value, () => {\n if (!isActive.value && props.destroyOnCollapse) contentMounted.value = false\n })\n})\n\nonBeforeUnmount(() => {\n if (context && props.value !== undefined) {\n context.unregister(props.value)\n }\n if (!wrapperEl.value) return\n expandTransition.cancel(wrapperEl.value)\n})\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"collapse.js","names":[],"sources":["../../../src/components/collapse/collapse.vue"],"sourcesContent":["<template>\n <div :class=\"classList\" role=\"region\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps, useModel } from '@veltra/compositions'\nimport { bem, ExpandTransition } from '@veltra/utils'\nimport { computed, provide, ref } from 'vue'\n\nimport type { CollapseEmits, CollapseModelValue, CollapseProps, CollapseValue } from '../../types'\nimport { CollapseDIKey } from './di'\n\ndefineOptions({ name: 'UCollapse' })\n\nconst props = withDefaults(defineProps<CollapseProps>(), {\n accordion: false,\n defaultCollapseAll: false\n})\nconst emit = defineEmits<CollapseEmits>()\n\nconst cls = bem('collapse')\n\nconst expandTransition = new ExpandTransition({\n transition: 'height 0.24s cubic-bezier(0.4, 0, 0.2, 1)'\n})\n\nconst { size } = useFormFallbackProps([props], { size: 'default' })\n\nconst expandIcon = computed(() => props.expandIcon)\n\nconst classList = computed(() => [cls.b, cls.m(size.value)])\n\nconst modelValue = useModel<CollapseProps, 'modelValue'>({ props, emit, propName: 'modelValue' })\n\nconst activeValues = computed<CollapseValue[]>(() => {\n const v = modelValue.value\n if (v === undefined || v === null) return []\n return Array.isArray(v) ? v : [v]\n})\n\nconst update = (next: CollapseModelValue) => {\n modelValue.value = next\n emit('change', next)\n}\n\nconst toggle = (value: CollapseValue) => {\n if (props.accordion) {\n update(activeValues.value[0] === value ? [] : value)\n return\n }\n\n const values = activeValues.value.slice()\n const index = values.indexOf(value)\n if (index > -1) values.splice(index, 1)\n else values.push(value)\n update(values)\n}\n\n// 收集子组件已注册的 values\nconst registeredValues = ref<CollapseValue[]>([])\n\n// 初始捕获 modelValue 是否具有有效初值\nconst hasInitialValue =\n modelValue.value !== undefined &&\n modelValue.value !== null &&\n (!Array.isArray(modelValue.value) || modelValue.value.length > 0)\n\nconst register = (value: CollapseValue) => {\n if (!registeredValues.value.includes(value)) {\n registeredValues.value.push(value)\n\n // 若默认展开全部(defaultCollapseAll 为 false)且外部未指定初始值,则自动展开该子项\n if (!props.defaultCollapseAll && !hasInitialValue) {\n if (props.accordion) {\n if (registeredValues.value.length === 1) {\n update(value)\n }\n } else {\n const current = Array.isArray(modelValue.value)\n ? modelValue.value\n : modelValue.value !== undefined && modelValue.value !== null\n ? [modelValue.value]\n : []\n if (!current.includes(value)) {\n update([...current, value])\n }\n }\n }\n }\n}\n\nconst unregister = (value: CollapseValue) => {\n const idx = registeredValues.value.indexOf(value)\n if (idx > -1) {\n registeredValues.value.splice(idx, 1)\n }\n}\n\nprovide(CollapseDIKey, {\n cls,\n size,\n expandIcon,\n activeValues,\n toggle,\n expandTransition,\n register,\n unregister\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;EAgBA,MAAM,QAAQ;EAId,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,mBAAmB,IAAI,iBAAiB,EAC5C,YAAY,4CACd,CAAC;EAED,MAAM,EAAE,SAAS,qBAAqB,CAAC,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAElE,MAAM,aAAa,eAAe,MAAM,UAAU;EAElD,MAAM,YAAY,eAAe,CAAC,IAAI,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;EAE3D,MAAM,aAAa,WAAsC;GAAE;GAAO;GAAM,UAAU;EAAa,CAAC;EAEhG,MAAM,eAAe,eAAgC;GACnD,MAAM,IAAI,WAAW;GACrB,IAAI,MAAM,KAAA,KAAa,MAAM,MAAM,OAAO,CAAC;GAC3C,OAAO,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;EAClC,CAAC;EAED,MAAM,UAAU,SAA6B;GAC3C,WAAW,QAAQ;GACnB,KAAK,UAAU,IAAI;EACrB;EAEA,MAAM,UAAU,UAAyB;GACvC,IAAI,MAAM,WAAW;IACnB,OAAO,aAAa,MAAM,OAAO,QAAQ,CAAC,IAAI,KAAK;IACnD;GACF;GAEA,MAAM,SAAS,aAAa,MAAM,MAAM;GACxC,MAAM,QAAQ,OAAO,QAAQ,KAAK;GAClC,IAAI,QAAQ,IAAI,OAAO,OAAO,OAAO,CAAC;QACjC,OAAO,KAAK,KAAK;GACtB,OAAO,MAAM;EACf;EAGA,MAAM,mBAAmB,IAAqB,CAAC,CAAC;EAGhD,MAAM,kBACJ,WAAW,UAAU,KAAA,KACrB,WAAW,UAAU,SACpB,CAAC,MAAM,QAAQ,WAAW,KAAK,KAAK,WAAW,MAAM,SAAS;EAEjE,MAAM,YAAY,UAAyB;GACzC,IAAI,CAAC,iBAAiB,MAAM,SAAS,KAAK,GAAG;IAC3C,iBAAiB,MAAM,KAAK,KAAK;IAGjC,IAAI,CAAC,MAAM,sBAAsB,CAAC,iBAAiB;KACjD,IAAI,MAAM,WACJ;UAAA,iBAAiB,MAAM,WAAW,GACpC,OAAO,KAAK;KAAA,OAET;MACL,MAAM,UAAU,MAAM,QAAQ,WAAW,KAAK,IAC1C,WAAW,QACX,WAAW,UAAU,KAAA,KAAa,WAAW,UAAU,OACrD,CAAC,WAAW,KAAK,IACjB,CAAC;MACP,IAAI,CAAC,QAAQ,SAAS,KAAK,GACzB,OAAO,CAAC,GAAG,SAAS,KAAK,CAAC;KAE9B;IACF;GACF;EACF;EAEA,MAAM,cAAc,UAAyB;GAC3C,MAAM,MAAM,iBAAiB,MAAM,QAAQ,KAAK;GAChD,IAAI,MAAM,IACR,iBAAiB,MAAM,OAAO,KAAK,CAAC;EAExC;EAEA,QAAQ,eAAe;GACrB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;;GA5GC,OAAA,UAAA,GAAA,mBAEM,OAAA;IAFA,OAAK,eAAE,UAAA,KAAS;IAAE,MAAK;GAC3B,GAAA,CAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"collapse.js","names":["useModel","_openBlock","_createElementBlock","_normalizeClass","_renderSlot"],"sources":["../../../src/components/collapse/collapse.vue"],"sourcesContent":["<template>\n <div :class=\"classList\" role=\"region\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps, useModel } from '@veltra/compositions'\nimport { bem, ExpandTransition } from '@veltra/utils'\nimport { computed, provide, ref } from 'vue'\n\nimport type { CollapseEmits, CollapseModelValue, CollapseProps, CollapseValue } from '../../types'\nimport { CollapseDIKey } from './di'\n\ndefineOptions({ name: 'UCollapse' })\n\nconst props = withDefaults(defineProps<CollapseProps>(), {\n accordion: false,\n defaultCollapseAll: false\n})\nconst emit = defineEmits<CollapseEmits>()\n\nconst cls = bem('collapse')\n\nconst expandTransition = new ExpandTransition({\n transition: 'height 0.24s cubic-bezier(0.4, 0, 0.2, 1)'\n})\n\nconst { size } = useFormFallbackProps([props], { size: 'default' })\n\nconst expandIcon = computed(() => props.expandIcon)\n\nconst classList = computed(() => [cls.b, cls.m(size.value)])\n\nconst modelValue = useModel<CollapseProps, 'modelValue'>({ props, emit, propName: 'modelValue' })\n\nconst activeValues = computed<CollapseValue[]>(() => {\n const v = modelValue.value\n if (v === undefined || v === null) return []\n return Array.isArray(v) ? v : [v]\n})\n\nconst update = (next: CollapseModelValue) => {\n modelValue.value = next\n emit('change', next)\n}\n\nconst toggle = (value: CollapseValue) => {\n if (props.accordion) {\n update(activeValues.value[0] === value ? [] : value)\n return\n }\n\n const values = activeValues.value.slice()\n const index = values.indexOf(value)\n if (index > -1) values.splice(index, 1)\n else values.push(value)\n update(values)\n}\n\n// 收集子组件已注册的 values\nconst registeredValues = ref<CollapseValue[]>([])\n\n// 初始捕获 modelValue 是否具有有效初值\nconst hasInitialValue =\n modelValue.value !== undefined &&\n modelValue.value !== null &&\n (!Array.isArray(modelValue.value) || modelValue.value.length > 0)\n\nconst register = (value: CollapseValue) => {\n if (!registeredValues.value.includes(value)) {\n registeredValues.value.push(value)\n\n // 若默认展开全部(defaultCollapseAll 为 false)且外部未指定初始值,则自动展开该子项\n if (!props.defaultCollapseAll && !hasInitialValue) {\n if (props.accordion) {\n if (registeredValues.value.length === 1) {\n update(value)\n }\n } else {\n const current = Array.isArray(modelValue.value)\n ? modelValue.value\n : modelValue.value !== undefined && modelValue.value !== null\n ? [modelValue.value]\n : []\n if (!current.includes(value)) {\n update([...current, value])\n }\n }\n }\n }\n}\n\nconst unregister = (value: CollapseValue) => {\n const idx = registeredValues.value.indexOf(value)\n if (idx > -1) {\n registeredValues.value.splice(idx, 1)\n }\n}\n\nprovide(CollapseDIKey, {\n cls,\n size,\n expandIcon,\n activeValues,\n toggle,\n expandTransition,\n register,\n unregister\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;EAgBA,MAAM,QAAQ;EAId,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,mBAAmB,IAAI,iBAAiB,EAC5C,YAAY,4CACd,CAAC;EAED,MAAM,EAAE,SAAS,qBAAqB,CAAC,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAElE,MAAM,aAAa,eAAe,MAAM,UAAU;EAElD,MAAM,YAAY,eAAe,CAAC,IAAI,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;EAE3D,MAAM,aAAaA,WAAsC;GAAE;GAAO;GAAM,UAAU;EAAa,CAAC;EAEhG,MAAM,eAAe,eAAgC;GACnD,MAAM,IAAI,WAAW;GACrB,IAAI,MAAM,KAAA,KAAa,MAAM,MAAM,OAAO,CAAC;GAC3C,OAAO,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;EAClC,CAAC;EAED,MAAM,UAAU,SAA6B;GAC3C,WAAW,QAAQ;GACnB,KAAK,UAAU,IAAI;EACrB;EAEA,MAAM,UAAU,UAAyB;GACvC,IAAI,MAAM,WAAW;IACnB,OAAO,aAAa,MAAM,OAAO,QAAQ,CAAC,IAAI,KAAK;IACnD;GACF;GAEA,MAAM,SAAS,aAAa,MAAM,MAAM;GACxC,MAAM,QAAQ,OAAO,QAAQ,KAAK;GAClC,IAAI,QAAQ,IAAI,OAAO,OAAO,OAAO,CAAC;QACjC,OAAO,KAAK,KAAK;GACtB,OAAO,MAAM;EACf;EAGA,MAAM,mBAAmB,IAAqB,CAAC,CAAC;EAGhD,MAAM,kBACJ,WAAW,UAAU,KAAA,KACrB,WAAW,UAAU,SACpB,CAAC,MAAM,QAAQ,WAAW,KAAK,KAAK,WAAW,MAAM,SAAS;EAEjE,MAAM,YAAY,UAAyB;GACzC,IAAI,CAAC,iBAAiB,MAAM,SAAS,KAAK,GAAG;IAC3C,iBAAiB,MAAM,KAAK,KAAK;IAGjC,IAAI,CAAC,MAAM,sBAAsB,CAAC,iBAAiB;KACjD,IAAI,MAAM,WACJ;UAAA,iBAAiB,MAAM,WAAW,GACpC,OAAO,KAAK;KAAA,OAET;MACL,MAAM,UAAU,MAAM,QAAQ,WAAW,KAAK,IAC1C,WAAW,QACX,WAAW,UAAU,KAAA,KAAa,WAAW,UAAU,OACrD,CAAC,WAAW,KAAK,IACjB,CAAC;MACP,IAAI,CAAC,QAAQ,SAAS,KAAK,GACzB,OAAO,CAAC,GAAG,SAAS,KAAK,CAAC;KAE9B;IACF;GACF;EACF;EAEA,MAAM,cAAc,UAAyB;GAC3C,MAAM,MAAM,iBAAiB,MAAM,QAAQ,KAAK;GAChD,IAAI,MAAM,IACR,iBAAiB,MAAM,OAAO,KAAK,CAAC;EAExC;EAEA,QAAQ,eAAe;GACrB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;;GA5GC,OAAAC,UAAA,GAAAC,mBAEM,OAAA;IAFA,OAAKC,eAAE,UAAA,KAAS;IAAE,MAAK;GAC3B,GAAA,CAAAC,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"condition-group.js","names":[],"sources":["../../../../src/components/condition-editor/components/condition-group.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.e('group'), depth > 0 ? cls.em('group', 'nested') : '']\">\n <template v-if=\"group.children.length === 0\">\n <div :class=\"cls.e('group-empty')\">\n <span :class=\"cls.e('group-empty-tip')\">暂无条件</span>\n </div>\n </template>\n\n <ul :class=\"cls.e('group-list')\">\n <li v-for=\"(child, idx) in group.children\" :key=\"idx\" :class=\"cls.e('group-item')\">\n <span\n v-if=\"idx > 0\"\n :class=\"[cls.e('connector'), cls.em('connector', connectorAt(idx - 1))]\"\n :tabindex=\"readonly || disabled ? -1 : 0\"\n role=\"button\"\n :aria-label=\"`切换连接符(当前 ${connectorAt(idx - 1).toUpperCase()})`\"\n @click=\"toggleConnector(idx - 1)\"\n @keydown.enter.prevent=\"toggleConnector(idx - 1)\"\n @keydown.space.prevent=\"toggleConnector(idx - 1)\"\n >{{ connectorAt(idx - 1).toUpperCase() }}</span\n >\n <span v-else :class=\"cls.e('connector-placeholder')\">WHERE</span>\n\n <div :class=\"cls.e('group-item-body')\">\n <ConditionRow\n v-if=\"child.type === 'condition'\"\n :item=\"child\"\n :fields=\"fields\"\n :size=\"size\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n @update:item=\"(it) => updateChild(idx, it)\"\n @delete=\"removeChild(idx)\"\n @mention=\"(p) => emit('mention', p)\"\n />\n <ConditionGroup\n v-else\n :group=\"child\"\n :fields=\"fields\"\n :size=\"size\"\n :depth=\"depth + 1\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n @update:group=\"(g) => updateChild(idx, g)\"\n @remove=\"removeChild(idx)\"\n @mention=\"(p) => emit('mention', p)\"\n />\n </div>\n </li>\n </ul>\n\n <div v-if=\"!readonly\" :class=\"cls.e('group-actions')\">\n <button type=\"button\" :class=\"cls.e('action-btn')\" :disabled=\"disabled\" @click=\"addCondition\">\n <u-icon><Plus /></u-icon>\n <span>添加条件</span>\n </button>\n <button type=\"button\" :class=\"cls.e('action-btn')\" :disabled=\"disabled\" @click=\"addGroup\">\n <u-icon><Plus /></u-icon>\n <span>添加条件组</span>\n </button>\n <button\n v-if=\"depth > 0\"\n type=\"button\"\n :class=\"[cls.e('action-btn'), cls.em('action-btn', 'danger')]\"\n :disabled=\"disabled\"\n @click=\"emit('remove')\"\n >\n <u-icon><Delete /></u-icon>\n <span>删除组</span>\n </button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Delete, Plus } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type {\n ConditionConnector,\n ConditionField,\n ConditionGroup as ConditionGroupNode,\n ConditionNode\n} from '../../../types'\nimport { UIcon } from '../../icon'\nimport { createEmptyGroup, createEmptyLeaf } from '../core/evaluator'\nimport ConditionRow, { type MentionPayload } from './condition-row.vue'\n\ndefineOptions({ name: 'UConditionGroup' })\n\nconst props = withDefaults(\n defineProps<{\n group: ConditionGroupNode\n fields?: ConditionField[]\n size?: 'small' | 'default' | 'large'\n depth?: number\n disabled?: boolean\n readonly?: boolean\n }>(),\n { size: 'default', depth: 0 }\n)\n\nconst emit = defineEmits<{\n (e: 'update:group', group: ConditionGroupNode): void\n (e: 'remove'): void\n (e: 'mention', payload: MentionPayload): void\n}>()\n\nconst cls = bem('condition-editor')\n\nfunction connectorAt(index: number): ConditionConnector {\n return props.group.connectors[index] ?? 'and'\n}\n\nfunction emitUpdate(next: Partial<ConditionGroupNode>) {\n emit('update:group', { ...props.group, ...next })\n}\n\nfunction toggleConnector(index: number) {\n if (props.disabled || props.readonly) return\n const next = props.group.connectors.slice()\n next[index] = connectorAt(index) === 'and' ? 'or' : 'and'\n emitUpdate({ connectors: next })\n}\n\nfunction addCondition() {\n appendChild(createEmptyLeaf())\n}\n\nfunction addGroup() {\n appendChild({ ...createEmptyGroup(), children: [createEmptyLeaf()], connectors: [] })\n}\n\nfunction appendChild(node: ConditionNode) {\n const children = [...props.group.children, node]\n const connectors =\n props.group.children.length === 0\n ? props.group.connectors\n : [...props.group.connectors, 'and' as const]\n emitUpdate({ children, connectors })\n}\n\nfunction updateChild(index: number, node: ConditionNode) {\n const children = props.group.children.slice()\n children[index] = node\n emitUpdate({ children })\n}\n\nfunction removeChild(index: number) {\n const children = props.group.children.slice()\n children.splice(index, 1)\n const connectors = props.group.connectors.slice()\n // 移除第 index 项时,连接到该项的连接符也要移除\n // connectors[i] 位于 children[i] 与 children[i+1] 之间\n if (index === 0) {\n if (connectors.length > 0) connectors.shift()\n } else {\n connectors.splice(index - 1, 1)\n }\n emitUpdate({ children, connectors })\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"condition-group.js","names":["_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createCommentVNode","_Fragment","_renderList","_withKeys","_withModifiers","_toDisplayString","_createBlock","ConditionRow","_createVNode","UIcon","_withCtx"],"sources":["../../../../src/components/condition-editor/components/condition-group.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.e('group'), depth > 0 ? cls.em('group', 'nested') : '']\">\n <template v-if=\"group.children.length === 0\">\n <div :class=\"cls.e('group-empty')\">\n <span :class=\"cls.e('group-empty-tip')\">暂无条件</span>\n </div>\n </template>\n\n <ul :class=\"cls.e('group-list')\">\n <li v-for=\"(child, idx) in group.children\" :key=\"idx\" :class=\"cls.e('group-item')\">\n <span\n v-if=\"idx > 0\"\n :class=\"[cls.e('connector'), cls.em('connector', connectorAt(idx - 1))]\"\n :tabindex=\"readonly || disabled ? -1 : 0\"\n role=\"button\"\n :aria-label=\"`切换连接符(当前 ${connectorAt(idx - 1).toUpperCase()})`\"\n @click=\"toggleConnector(idx - 1)\"\n @keydown.enter.prevent=\"toggleConnector(idx - 1)\"\n @keydown.space.prevent=\"toggleConnector(idx - 1)\"\n >{{ connectorAt(idx - 1).toUpperCase() }}</span\n >\n <span v-else :class=\"cls.e('connector-placeholder')\">WHERE</span>\n\n <div :class=\"cls.e('group-item-body')\">\n <ConditionRow\n v-if=\"child.type === 'condition'\"\n :item=\"child\"\n :fields=\"fields\"\n :size=\"size\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n @update:item=\"(it) => updateChild(idx, it)\"\n @delete=\"removeChild(idx)\"\n @mention=\"(p) => emit('mention', p)\"\n />\n <ConditionGroup\n v-else\n :group=\"child\"\n :fields=\"fields\"\n :size=\"size\"\n :depth=\"depth + 1\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n @update:group=\"(g) => updateChild(idx, g)\"\n @remove=\"removeChild(idx)\"\n @mention=\"(p) => emit('mention', p)\"\n />\n </div>\n </li>\n </ul>\n\n <div v-if=\"!readonly\" :class=\"cls.e('group-actions')\">\n <button type=\"button\" :class=\"cls.e('action-btn')\" :disabled=\"disabled\" @click=\"addCondition\">\n <u-icon><Plus /></u-icon>\n <span>添加条件</span>\n </button>\n <button type=\"button\" :class=\"cls.e('action-btn')\" :disabled=\"disabled\" @click=\"addGroup\">\n <u-icon><Plus /></u-icon>\n <span>添加条件组</span>\n </button>\n <button\n v-if=\"depth > 0\"\n type=\"button\"\n :class=\"[cls.e('action-btn'), cls.em('action-btn', 'danger')]\"\n :disabled=\"disabled\"\n @click=\"emit('remove')\"\n >\n <u-icon><Delete /></u-icon>\n <span>删除组</span>\n </button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Delete, Plus } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type {\n ConditionConnector,\n ConditionField,\n ConditionGroup as ConditionGroupNode,\n ConditionNode\n} from '../../../types'\nimport { UIcon } from '../../icon'\nimport { createEmptyGroup, createEmptyLeaf } from '../core/evaluator'\nimport ConditionRow, { type MentionPayload } from './condition-row.vue'\n\ndefineOptions({ name: 'UConditionGroup' })\n\nconst props = withDefaults(\n defineProps<{\n group: ConditionGroupNode\n fields?: ConditionField[]\n size?: 'small' | 'default' | 'large'\n depth?: number\n disabled?: boolean\n readonly?: boolean\n }>(),\n { size: 'default', depth: 0 }\n)\n\nconst emit = defineEmits<{\n (e: 'update:group', group: ConditionGroupNode): void\n (e: 'remove'): void\n (e: 'mention', payload: MentionPayload): void\n}>()\n\nconst cls = bem('condition-editor')\n\nfunction connectorAt(index: number): ConditionConnector {\n return props.group.connectors[index] ?? 'and'\n}\n\nfunction emitUpdate(next: Partial<ConditionGroupNode>) {\n emit('update:group', { ...props.group, ...next })\n}\n\nfunction toggleConnector(index: number) {\n if (props.disabled || props.readonly) return\n const next = props.group.connectors.slice()\n next[index] = connectorAt(index) === 'and' ? 'or' : 'and'\n emitUpdate({ connectors: next })\n}\n\nfunction addCondition() {\n appendChild(createEmptyLeaf())\n}\n\nfunction addGroup() {\n appendChild({ ...createEmptyGroup(), children: [createEmptyLeaf()], connectors: [] })\n}\n\nfunction appendChild(node: ConditionNode) {\n const children = [...props.group.children, node]\n const connectors =\n props.group.children.length === 0\n ? props.group.connectors\n : [...props.group.connectors, 'and' as const]\n emitUpdate({ children, connectors })\n}\n\nfunction updateChild(index: number, node: ConditionNode) {\n const children = props.group.children.slice()\n children[index] = node\n emitUpdate({ children })\n}\n\nfunction removeChild(index: number) {\n const children = props.group.children.slice()\n children.splice(index, 1)\n const connectors = props.group.connectors.slice()\n // 移除第 index 项时,连接到该项的连接符也要移除\n // connectors[i] 位于 children[i] 与 children[i+1] 之间\n if (index === 0) {\n if (connectors.length > 0) connectors.shift()\n } else {\n connectors.splice(index - 1, 1)\n }\n emitUpdate({ children, connectors })\n}\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"condition-row.js","names":[],"sources":["../../../../src/components/condition-editor/components/condition-row.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('row')\">\n <u-select\n :class=\"cls.e('field')\"\n :model-value=\"item.field\"\n :options=\"fieldOptions\"\n value-key=\"value\"\n label-key=\"label\"\n placeholder=\"字段\"\n :size=\"size\"\n :disabled=\"disabled || readonly\"\n :clearable=\"false\"\n filterable\n @update:model-value=\"onFieldChange\"\n />\n\n <u-select\n :class=\"cls.e('operator')\"\n :model-value=\"item.operator\"\n :options=\"operatorOptions\"\n value-key=\"value\"\n label-key=\"label\"\n placeholder=\"运算符\"\n :size=\"size\"\n :disabled=\"disabled || readonly || !currentField\"\n :clearable=\"false\"\n @update:model-value=\"onOperatorChange\"\n />\n\n <div :class=\"cls.e('value')\">\n <template v-if=\"!needValue\">\n <span :class=\"cls.e('value-empty')\">—</span>\n </template>\n\n <template v-else-if=\"enumValueOptions\">\n <u-select\n :model-value=\"constantValue\"\n :options=\"enumValueOptions\"\n value-key=\"value\"\n label-key=\"label\"\n placeholder=\"选择值\"\n :size=\"size\"\n :disabled=\"disabled || readonly\"\n :clearable=\"false\"\n @update:model-value=\"onConstantChange\"\n />\n </template>\n\n <template v-else-if=\"booleanValueOptions\">\n <u-select\n :model-value=\"constantValue\"\n :options=\"booleanValueOptions\"\n value-key=\"value\"\n label-key=\"label\"\n placeholder=\"选择值\"\n :size=\"size\"\n :disabled=\"disabled || readonly\"\n :clearable=\"false\"\n @update:model-value=\"onConstantChange\"\n />\n </template>\n\n <template v-else-if=\"item.value.kind === 'variable'\">\n <span\n ref=\"chipRef\"\n :class=\"cls.e('value-chip')\"\n tabindex=\"0\"\n :title=\"`变量:${item.value.name}`\"\n @click=\"onChipClick\"\n @keydown.delete=\"onChipDelete\"\n >\n <span :class=\"cls.e('value-chip-label')\">{{ item.value.name }}</span>\n <span :class=\"cls.e('value-chip-close')\" @click.stop=\"onChipDelete\">\n <u-icon><Close /></u-icon>\n </span>\n </span>\n </template>\n\n <template v-else>\n <input\n ref=\"valueInputRef\"\n :class=\"cls.e('value-input')\"\n :type=\"inputType\"\n :value=\"constantValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n @input=\"onValueInput\"\n @keydown=\"onValueKeydown\"\n />\n </template>\n </div>\n\n <button\n v-if=\"!readonly\"\n type=\"button\"\n :class=\"cls.e('row-delete')\"\n :disabled=\"disabled\"\n title=\"删除条件\"\n @click=\"emit('delete')\"\n >\n <u-icon><Delete /></u-icon>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Close, Delete } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, useTemplateRef } from 'vue'\n\nimport type { ConditionField, ConditionLeaf, ConditionValue } from '../../../types'\nimport { UIcon } from '../../icon'\nimport { USelect } from '../../select'\nimport { getOperatorsByFieldType, type OperatorDef } from '../core/operators'\n\ndefineOptions({ name: 'UConditionRow' })\n\nexport interface MentionPayload {\n triggerDom: HTMLElement\n setValue: (val: ConditionValue) => void\n}\n\nconst props = withDefaults(\n defineProps<{\n item: ConditionLeaf\n fields?: ConditionField[]\n size?: 'small' | 'default' | 'large'\n disabled?: boolean\n readonly?: boolean\n }>(),\n { size: 'default' }\n)\n\nconst emit = defineEmits<{\n (e: 'update:item', item: ConditionLeaf): void\n (e: 'delete'): void\n (e: 'mention', payload: MentionPayload): void\n}>()\n\nconst cls = bem('condition-editor')\n\nconst valueInputRef = useTemplateRef<HTMLInputElement>('valueInputRef')\nconst chipRef = useTemplateRef<HTMLElement>('chipRef')\n\nconst fieldOptions = computed(() =>\n (props.fields ?? []).map((f) => ({ label: f.label, value: f.value }))\n)\n\nconst currentField = computed(() => props.fields?.find((f) => f.value === props.item.field))\n\nconst operatorOptions = computed<OperatorDef[]>(() => {\n if (!currentField.value) {\n return props.item.operator\n ? [{ label: props.item.operator, value: props.item.operator, needValue: true }]\n : []\n }\n return getOperatorsByFieldType(currentField.value.type)\n})\n\nconst currentOperator = computed(() =>\n operatorOptions.value.find((o) => o.value === props.item.operator)\n)\n\nconst needValue = computed(() => currentOperator.value?.needValue ?? true)\n\nconst constantValue = computed(() =>\n props.item.value.kind === 'constant' ? props.item.value.value : ''\n)\n\n/** 枚举字段的可选值(仅在非 `in` 等多值运算符下展开为下拉) */\nconst enumValueOptions = computed(() => {\n if (!currentField.value || currentField.value.type !== 'enum') return null\n if (props.item.operator === 'in') return null\n return currentField.value.enumOptions ?? []\n})\n\nconst booleanValueOptions = computed(() => {\n if (!currentField.value || currentField.value.type !== 'boolean') return null\n if (!needValue.value) return null\n return [\n { label: '是', value: 'true' },\n { label: '否', value: 'false' }\n ]\n})\n\nconst inputType = computed(() => {\n const type = currentField.value?.type\n if (type === 'number') return 'number'\n if (type === 'date') return 'date'\n return 'text'\n})\n\nconst placeholder = computed(() => {\n if (props.item.operator === 'in') return '多个值用逗号分隔'\n if (!props.fields?.length) return ''\n return '输入值或 @ 引用变量'\n})\n\nfunction emitUpdate(patch: Partial<ConditionLeaf>) {\n emit('update:item', { ...props.item, ...patch })\n}\n\nfunction onFieldChange(val: string) {\n const field = props.fields?.find((f) => f.value === val)\n const nextOps = field ? getOperatorsByFieldType(field.type) : []\n const nextOp = nextOps[0]?.value ?? 'eq'\n emit('update:item', {\n ...props.item,\n field: val,\n operator: nextOp,\n value: { kind: 'constant', value: '' }\n })\n}\n\nfunction onOperatorChange(val: string) {\n emitUpdate({ operator: val, value: { kind: 'constant', value: '' } })\n}\n\nfunction onValueInput(e: Event) {\n emitUpdate({ value: { kind: 'constant', value: (e.target as HTMLInputElement).value } })\n}\n\nfunction onConstantChange(val: string) {\n emitUpdate({ value: { kind: 'constant', value: val } })\n}\n\nfunction onValueKeydown(e: KeyboardEvent) {\n if (props.disabled || props.readonly) return\n if (e.key === '@' && valueInputRef.value) {\n e.preventDefault()\n emit('mention', {\n triggerDom: valueInputRef.value,\n setValue: (val) => emitUpdate({ value: val })\n })\n }\n}\n\nfunction onChipClick() {\n if (props.disabled || props.readonly) return\n const dom = chipRef.value\n if (!dom) return\n emit('mention', { triggerDom: dom, setValue: (val) => emitUpdate({ value: val }) })\n}\n\nfunction onChipDelete() {\n if (props.disabled || props.readonly) return\n emitUpdate({ value: { kind: 'constant', value: '' } })\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"condition-row.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createVNode","USelect","_createElementVNode","_createBlock","_withKeys","_toDisplayString","_withModifiers","UIcon","_withCtx","_createCommentVNode"],"sources":["../../../../src/components/condition-editor/components/condition-row.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('row')\">\n <u-select\n :class=\"cls.e('field')\"\n :model-value=\"item.field\"\n :options=\"fieldOptions\"\n value-key=\"value\"\n label-key=\"label\"\n placeholder=\"字段\"\n :size=\"size\"\n :disabled=\"disabled || readonly\"\n :clearable=\"false\"\n filterable\n @update:model-value=\"onFieldChange\"\n />\n\n <u-select\n :class=\"cls.e('operator')\"\n :model-value=\"item.operator\"\n :options=\"operatorOptions\"\n value-key=\"value\"\n label-key=\"label\"\n placeholder=\"运算符\"\n :size=\"size\"\n :disabled=\"disabled || readonly || !currentField\"\n :clearable=\"false\"\n @update:model-value=\"onOperatorChange\"\n />\n\n <div :class=\"cls.e('value')\">\n <template v-if=\"!needValue\">\n <span :class=\"cls.e('value-empty')\">—</span>\n </template>\n\n <template v-else-if=\"enumValueOptions\">\n <u-select\n :model-value=\"constantValue\"\n :options=\"enumValueOptions\"\n value-key=\"value\"\n label-key=\"label\"\n placeholder=\"选择值\"\n :size=\"size\"\n :disabled=\"disabled || readonly\"\n :clearable=\"false\"\n @update:model-value=\"onConstantChange\"\n />\n </template>\n\n <template v-else-if=\"booleanValueOptions\">\n <u-select\n :model-value=\"constantValue\"\n :options=\"booleanValueOptions\"\n value-key=\"value\"\n label-key=\"label\"\n placeholder=\"选择值\"\n :size=\"size\"\n :disabled=\"disabled || readonly\"\n :clearable=\"false\"\n @update:model-value=\"onConstantChange\"\n />\n </template>\n\n <template v-else-if=\"item.value.kind === 'variable'\">\n <span\n ref=\"chipRef\"\n :class=\"cls.e('value-chip')\"\n tabindex=\"0\"\n :title=\"`变量:${item.value.name}`\"\n @click=\"onChipClick\"\n @keydown.delete=\"onChipDelete\"\n >\n <span :class=\"cls.e('value-chip-label')\">{{ item.value.name }}</span>\n <span :class=\"cls.e('value-chip-close')\" @click.stop=\"onChipDelete\">\n <u-icon><Close /></u-icon>\n </span>\n </span>\n </template>\n\n <template v-else>\n <input\n ref=\"valueInputRef\"\n :class=\"cls.e('value-input')\"\n :type=\"inputType\"\n :value=\"constantValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n @input=\"onValueInput\"\n @keydown=\"onValueKeydown\"\n />\n </template>\n </div>\n\n <button\n v-if=\"!readonly\"\n type=\"button\"\n :class=\"cls.e('row-delete')\"\n :disabled=\"disabled\"\n title=\"删除条件\"\n @click=\"emit('delete')\"\n >\n <u-icon><Delete /></u-icon>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Close, Delete } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, useTemplateRef } from 'vue'\n\nimport type { ConditionField, ConditionLeaf, ConditionValue } from '../../../types'\nimport { UIcon } from '../../icon'\nimport { USelect } from '../../select'\nimport { getOperatorsByFieldType, type OperatorDef } from '../core/operators'\n\ndefineOptions({ name: 'UConditionRow' })\n\nexport interface MentionPayload {\n triggerDom: HTMLElement\n setValue: (val: ConditionValue) => void\n}\n\nconst props = withDefaults(\n defineProps<{\n item: ConditionLeaf\n fields?: ConditionField[]\n size?: 'small' | 'default' | 'large'\n disabled?: boolean\n readonly?: boolean\n }>(),\n { size: 'default' }\n)\n\nconst emit = defineEmits<{\n (e: 'update:item', item: ConditionLeaf): void\n (e: 'delete'): void\n (e: 'mention', payload: MentionPayload): void\n}>()\n\nconst cls = bem('condition-editor')\n\nconst valueInputRef = useTemplateRef<HTMLInputElement>('valueInputRef')\nconst chipRef = useTemplateRef<HTMLElement>('chipRef')\n\nconst fieldOptions = computed(() =>\n (props.fields ?? []).map((f) => ({ label: f.label, value: f.value }))\n)\n\nconst currentField = computed(() => props.fields?.find((f) => f.value === props.item.field))\n\nconst operatorOptions = computed<OperatorDef[]>(() => {\n if (!currentField.value) {\n return props.item.operator\n ? [{ label: props.item.operator, value: props.item.operator, needValue: true }]\n : []\n }\n return getOperatorsByFieldType(currentField.value.type)\n})\n\nconst currentOperator = computed(() =>\n operatorOptions.value.find((o) => o.value === props.item.operator)\n)\n\nconst needValue = computed(() => currentOperator.value?.needValue ?? true)\n\nconst constantValue = computed(() =>\n props.item.value.kind === 'constant' ? props.item.value.value : ''\n)\n\n/** 枚举字段的可选值(仅在非 `in` 等多值运算符下展开为下拉) */\nconst enumValueOptions = computed(() => {\n if (!currentField.value || currentField.value.type !== 'enum') return null\n if (props.item.operator === 'in') return null\n return currentField.value.enumOptions ?? []\n})\n\nconst booleanValueOptions = computed(() => {\n if (!currentField.value || currentField.value.type !== 'boolean') return null\n if (!needValue.value) return null\n return [\n { label: '是', value: 'true' },\n { label: '否', value: 'false' }\n ]\n})\n\nconst inputType = computed(() => {\n const type = currentField.value?.type\n if (type === 'number') return 'number'\n if (type === 'date') return 'date'\n return 'text'\n})\n\nconst placeholder = computed(() => {\n if (props.item.operator === 'in') return '多个值用逗号分隔'\n if (!props.fields?.length) return ''\n return '输入值或 @ 引用变量'\n})\n\nfunction emitUpdate(patch: Partial<ConditionLeaf>) {\n emit('update:item', { ...props.item, ...patch })\n}\n\nfunction onFieldChange(val: string) {\n const field = props.fields?.find((f) => f.value === val)\n const nextOps = field ? getOperatorsByFieldType(field.type) : []\n const nextOp = nextOps[0]?.value ?? 'eq'\n emit('update:item', {\n ...props.item,\n field: val,\n operator: nextOp,\n value: { kind: 'constant', value: '' }\n })\n}\n\nfunction onOperatorChange(val: string) {\n emitUpdate({ operator: val, value: { kind: 'constant', value: '' } })\n}\n\nfunction onValueInput(e: Event) {\n emitUpdate({ value: { kind: 'constant', value: (e.target as HTMLInputElement).value } })\n}\n\nfunction onConstantChange(val: string) {\n emitUpdate({ value: { kind: 'constant', value: val } })\n}\n\nfunction onValueKeydown(e: KeyboardEvent) {\n if (props.disabled || props.readonly) return\n if (e.key === '@' && valueInputRef.value) {\n e.preventDefault()\n emit('mention', {\n triggerDom: valueInputRef.value,\n setValue: (val) => emitUpdate({ value: val })\n })\n }\n}\n\nfunction onChipClick() {\n if (props.disabled || props.readonly) return\n const dom = chipRef.value\n if (!dom) return\n emit('mention', { triggerDom: dom, setValue: (val) => emitUpdate({ value: val }) })\n}\n\nfunction onChipDelete() {\n if (props.disabled || props.readonly) return\n emitUpdate({ value: { kind: 'constant', value: '' } })\n}\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"condition-editor.js","names":[],"sources":["../../../src/components/condition-editor/condition-editor.vue"],"sourcesContent":["<template>\n <div :class=\"className\" @keydown=\"onKeydown\">\n <ConditionGroup\n :group=\"rootGroup\"\n :fields=\"props.fields\"\n :size=\"size\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n @update:group=\"onGroupUpdate\"\n @mention=\"onMention\"\n />\n\n <VariablePicker\n ref=\"pickerRef\"\n :visible=\"pickerVisible\"\n :trigger-dom=\"pickerTriggerDom\"\n :variables=\"props.variables\"\n :filter=\"pickerFilter\"\n :selectable-levels=\"'leaf'\"\n @select=\"onPickerSelect\"\n @dismiss=\"onPickerDismiss\"\n @update:visible=\"onPickerVisibleChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem, injectFormContext } from '@veltra/utils'\nimport { computed, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport type { ConditionEditorProps, ConditionExpression } from '../../types'\nimport VariablePicker from '../expression-editor/components/variable-picker.vue'\nimport ConditionGroup from './components/condition-group.vue'\nimport type { MentionPayload } from './components/condition-row.vue'\nimport { createEmptyGroup } from './core/evaluator'\n\ndefineOptions({ name: 'UConditionEditor' })\n\nconst props = withDefaults(defineProps<ConditionEditorProps>(), {\n fields: () => [],\n // Boolean prop 缺省会被 Vue 归一成 false,挡住 UForm 下发的 disabled / readonly,须显式留 undefined\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<{ (e: 'update:modelValue', value: ConditionExpression): void }>()\n\nconst cls = bem('condition-editor')\nconst { formProps } = injectFormContext()\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst className = computed(() => [\n cls.b,\n cls.m(size.value),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value)\n])\n\nconst rootGroup = shallowRef<ConditionExpression>(\n props.modelValue ? clone(props.modelValue) : createEmptyGroup()\n)\n\nfunction clone<T>(v: T): T {\n return JSON.parse(JSON.stringify(v)) as T\n}\n\nfunction onGroupUpdate(group: ConditionExpression) {\n rootGroup.value = group\n emit('update:modelValue', clone(group))\n}\n\nwatch(\n () => props.modelValue,\n (v) => {\n if (!v) {\n rootGroup.value = createEmptyGroup()\n return\n }\n if (JSON.stringify(v) === JSON.stringify(rootGroup.value)) return\n rootGroup.value = clone(v)\n }\n)\n\n// ── VariablePicker ──\n\nconst pickerRef = useTemplateRef<{ handleKeydown: (e: KeyboardEvent) => boolean }>('pickerRef')\nconst pickerVisible = shallowRef(false)\nconst pickerTriggerDom = shallowRef<HTMLElement | undefined>(undefined)\nconst pickerFilter = shallowRef('')\nconst mentionTarget = shallowRef<MentionPayload | null>(null)\n\nfunction onMention(payload: MentionPayload) {\n if (disabled.value || readonly.value) return\n mentionTarget.value = payload\n pickerTriggerDom.value = payload.triggerDom\n pickerFilter.value = ''\n pickerVisible.value = true\n}\n\nfunction onPickerSelect(item: { label: string; value: string }) {\n mentionTarget.value?.setValue({ kind: 'variable', name: item.value })\n pickerVisible.value = false\n mentionTarget.value = null\n}\n\nfunction onPickerDismiss() {\n pickerVisible.value = false\n mentionTarget.value = null\n}\n\nfunction onPickerVisibleChange(v: boolean) {\n if (!v) {\n pickerVisible.value = false\n mentionTarget.value = null\n }\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (disabled.value || readonly.value) return\n if (pickerVisible.value) {\n const handled = pickerRef.value?.handleKeydown(e)\n if (handled) {\n e.preventDefault()\n }\n }\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;EAuCA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,kBAAkB;EAClC,MAAM,EAAE,cAAc,kBAAkB;EACxC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;EAElF,MAAM,YAAY,eAAe;GAC/B,IAAI;GACJ,IAAI,EAAE,KAAK,KAAK;GAChB,IAAI,GAAG,YAAY,SAAS,KAAK;GACjC,IAAI,GAAG,YAAY,SAAS,KAAK;EACnC,CAAC;EAED,MAAM,YAAY,WAChB,MAAM,aAAa,MAAM,MAAM,UAAU,IAAI,iBAAiB,CAChE;EAEA,SAAS,MAAS,GAAS;GACzB,OAAO,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC;EACrC;EAEA,SAAS,cAAc,OAA4B;GACjD,UAAU,QAAQ;GAClB,KAAK,qBAAqB,MAAM,KAAK,CAAC;EACxC;EAEA,YACQ,MAAM,aACX,MAAM;GACL,IAAI,CAAC,GAAG;IACN,UAAU,QAAQ,iBAAiB;IACnC;GACF;GACA,IAAI,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,UAAU,KAAK,GAAG;GAC3D,UAAU,QAAQ,MAAM,CAAC;EAC3B,CACF;EAIA,MAAM,YAAY,eAAiE,WAAW;EAC9F,MAAM,gBAAgB,WAAW,KAAK;EACtC,MAAM,mBAAmB,WAAoC,KAAA,CAAS;EACtE,MAAM,eAAe,WAAW,EAAE;EAClC,MAAM,gBAAgB,WAAkC,IAAI;EAE5D,SAAS,UAAU,SAAyB;GAC1C,IAAI,SAAS,SAAS,SAAS,OAAO;GACtC,cAAc,QAAQ;GACtB,iBAAiB,QAAQ,QAAQ;GACjC,aAAa,QAAQ;GACrB,cAAc,QAAQ;EACxB;EAEA,SAAS,eAAe,MAAwC;GAC9D,cAAc,OAAO,SAAS;IAAE,MAAM;IAAY,MAAM,KAAK;GAAM,CAAC;GACpE,cAAc,QAAQ;GACtB,cAAc,QAAQ;EACxB;EAEA,SAAS,kBAAkB;GACzB,cAAc,QAAQ;GACtB,cAAc,QAAQ;EACxB;EAEA,SAAS,sBAAsB,GAAY;GACzC,IAAI,CAAC,GAAG;IACN,cAAc,QAAQ;IACtB,cAAc,QAAQ;GACxB;EACF;EAEA,SAAS,UAAU,GAAkB;GACnC,IAAI,SAAS,SAAS,SAAS,OAAO;GACtC,IAAI,cAAc,OACA;QAAA,UAAU,OAAO,cAAc,CAAC,GAE9C,EAAE,eAAe;GAAA;EAGvB;;GA7HE,OAAA,UAAA,GAAA,mBAsBM,OAAA;IAtBA,OAAK,eAAE,UAAA,KAAS;IAAY;GAChC,GAAA,CAAA,YAQE,aAAA;IAPC,OAAO,UAAA;IACP,QAAQ,MAAM;IACd,MAAM,MAAA,IAAA;IACN,UAAU,MAAA,QAAA;IACV,UAAU,MAAA,QAAA;IACV,kBAAc;IACL;;;;;;;GAGZ,CAAA,GAAA,YAUE,aAAA;IATI,SAAA;IAAJ,KAAI;IACH,SAAS,cAAA;IACT,eAAa,iBAAA;IACb,WAAW,MAAM;IACjB,QAAQ,aAAA;IACR,qBAAmB;IACnB,UAAQ;IACR,WAAS;IACT,oBAAgB"}
1
+ {"version":3,"file":"condition-editor.js","names":["_openBlock","_createElementBlock","_normalizeClass","_createVNode","ConditionGroup","_unref","VariablePicker"],"sources":["../../../src/components/condition-editor/condition-editor.vue"],"sourcesContent":["<template>\n <div :class=\"className\" @keydown=\"onKeydown\">\n <ConditionGroup\n :group=\"rootGroup\"\n :fields=\"props.fields\"\n :size=\"size\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n @update:group=\"onGroupUpdate\"\n @mention=\"onMention\"\n />\n\n <VariablePicker\n ref=\"pickerRef\"\n :visible=\"pickerVisible\"\n :trigger-dom=\"pickerTriggerDom\"\n :variables=\"props.variables\"\n :filter=\"pickerFilter\"\n :selectable-levels=\"'leaf'\"\n @select=\"onPickerSelect\"\n @dismiss=\"onPickerDismiss\"\n @update:visible=\"onPickerVisibleChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem, injectFormContext } from '@veltra/utils'\nimport { computed, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport type { ConditionEditorProps, ConditionExpression } from '../../types'\nimport VariablePicker from '../expression-editor/components/variable-picker.vue'\nimport ConditionGroup from './components/condition-group.vue'\nimport type { MentionPayload } from './components/condition-row.vue'\nimport { createEmptyGroup } from './core/evaluator'\n\ndefineOptions({ name: 'UConditionEditor' })\n\nconst props = withDefaults(defineProps<ConditionEditorProps>(), {\n fields: () => [],\n // Boolean prop 缺省会被 Vue 归一成 false,挡住 UForm 下发的 disabled / readonly,须显式留 undefined\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<{ (e: 'update:modelValue', value: ConditionExpression): void }>()\n\nconst cls = bem('condition-editor')\nconst { formProps } = injectFormContext()\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst className = computed(() => [\n cls.b,\n cls.m(size.value),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value)\n])\n\nconst rootGroup = shallowRef<ConditionExpression>(\n props.modelValue ? clone(props.modelValue) : createEmptyGroup()\n)\n\nfunction clone<T>(v: T): T {\n return JSON.parse(JSON.stringify(v)) as T\n}\n\nfunction onGroupUpdate(group: ConditionExpression) {\n rootGroup.value = group\n emit('update:modelValue', clone(group))\n}\n\nwatch(\n () => props.modelValue,\n (v) => {\n if (!v) {\n rootGroup.value = createEmptyGroup()\n return\n }\n if (JSON.stringify(v) === JSON.stringify(rootGroup.value)) return\n rootGroup.value = clone(v)\n }\n)\n\n// ── VariablePicker ──\n\nconst pickerRef = useTemplateRef<{ handleKeydown: (e: KeyboardEvent) => boolean }>('pickerRef')\nconst pickerVisible = shallowRef(false)\nconst pickerTriggerDom = shallowRef<HTMLElement | undefined>(undefined)\nconst pickerFilter = shallowRef('')\nconst mentionTarget = shallowRef<MentionPayload | null>(null)\n\nfunction onMention(payload: MentionPayload) {\n if (disabled.value || readonly.value) return\n mentionTarget.value = payload\n pickerTriggerDom.value = payload.triggerDom\n pickerFilter.value = ''\n pickerVisible.value = true\n}\n\nfunction onPickerSelect(item: { label: string; value: string }) {\n mentionTarget.value?.setValue({ kind: 'variable', name: item.value })\n pickerVisible.value = false\n mentionTarget.value = null\n}\n\nfunction onPickerDismiss() {\n pickerVisible.value = false\n mentionTarget.value = null\n}\n\nfunction onPickerVisibleChange(v: boolean) {\n if (!v) {\n pickerVisible.value = false\n mentionTarget.value = null\n }\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (disabled.value || readonly.value) return\n if (pickerVisible.value) {\n const handled = pickerRef.value?.handleKeydown(e)\n if (handled) {\n e.preventDefault()\n }\n }\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;EAuCA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,kBAAkB;EAClC,MAAM,EAAE,cAAc,kBAAkB;EACxC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;EAElF,MAAM,YAAY,eAAe;GAC/B,IAAI;GACJ,IAAI,EAAE,KAAK,KAAK;GAChB,IAAI,GAAG,YAAY,SAAS,KAAK;GACjC,IAAI,GAAG,YAAY,SAAS,KAAK;EACnC,CAAC;EAED,MAAM,YAAY,WAChB,MAAM,aAAa,MAAM,MAAM,UAAU,IAAI,iBAAiB,CAChE;EAEA,SAAS,MAAS,GAAS;GACzB,OAAO,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC;EACrC;EAEA,SAAS,cAAc,OAA4B;GACjD,UAAU,QAAQ;GAClB,KAAK,qBAAqB,MAAM,KAAK,CAAC;EACxC;EAEA,YACQ,MAAM,aACX,MAAM;GACL,IAAI,CAAC,GAAG;IACN,UAAU,QAAQ,iBAAiB;IACnC;GACF;GACA,IAAI,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,UAAU,KAAK,GAAG;GAC3D,UAAU,QAAQ,MAAM,CAAC;EAC3B,CACF;EAIA,MAAM,YAAY,eAAiE,WAAW;EAC9F,MAAM,gBAAgB,WAAW,KAAK;EACtC,MAAM,mBAAmB,WAAoC,KAAA,CAAS;EACtE,MAAM,eAAe,WAAW,EAAE;EAClC,MAAM,gBAAgB,WAAkC,IAAI;EAE5D,SAAS,UAAU,SAAyB;GAC1C,IAAI,SAAS,SAAS,SAAS,OAAO;GACtC,cAAc,QAAQ;GACtB,iBAAiB,QAAQ,QAAQ;GACjC,aAAa,QAAQ;GACrB,cAAc,QAAQ;EACxB;EAEA,SAAS,eAAe,MAAwC;GAC9D,cAAc,OAAO,SAAS;IAAE,MAAM;IAAY,MAAM,KAAK;GAAM,CAAC;GACpE,cAAc,QAAQ;GACtB,cAAc,QAAQ;EACxB;EAEA,SAAS,kBAAkB;GACzB,cAAc,QAAQ;GACtB,cAAc,QAAQ;EACxB;EAEA,SAAS,sBAAsB,GAAY;GACzC,IAAI,CAAC,GAAG;IACN,cAAc,QAAQ;IACtB,cAAc,QAAQ;GACxB;EACF;EAEA,SAAS,UAAU,GAAkB;GACnC,IAAI,SAAS,SAAS,SAAS,OAAO;GACtC,IAAI,cAAc,OACA;QAAA,UAAU,OAAO,cAAc,CAAC,GAE9C,EAAE,eAAe;GAAA;EAGvB;;GA7HE,OAAAA,UAAA,GAAAC,mBAsBM,OAAA;IAtBA,OAAKC,eAAE,UAAA,KAAS;IAAY;GAChC,GAAA,CAAAC,YAQEC,aAAA;IAPC,OAAO,UAAA;IACP,QAAQ,MAAM;IACd,MAAMC,MAAA,IAAA;IACN,UAAUA,MAAA,QAAA;IACV,UAAUA,MAAA,QAAA;IACV,kBAAc;IACL;;;;;;;GAGZ,CAAA,GAAAF,YAUEG,aAAA;IATI,SAAA;IAAJ,KAAI;IACH,SAAS,cAAA;IACT,eAAa,iBAAA;IACb,WAAW,MAAM;IACjB,QAAQ,aAAA;IACR,qBAAmB;IACnB,UAAQ;IACR,WAAS;IACT,oBAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"contextmenu-item.js","names":[],"sources":["../../../src/components/contextmenu/contextmenu-item.vue"],"sourcesContent":["<template>\n <li\n :class=\"[cls.e('item'), bem.is('disabled', disabled), bem.is('loading', loading)]\"\n v-ripple=\"!disabled && !loading && !menu.keepOpen\"\n @click=\"handleClickMenu\"\n >\n <div :class=\"cls.e('item-content')\">\n <template v-if=\"showIconColumn && !menu.render\">\n <u-icon v-if=\"loading\" :class=\"bem.is('loading')\">\n <Loading />\n </u-icon>\n <u-icon v-else-if=\"menu.icon\">\n <component :is=\"menu.icon\" />\n </u-icon>\n <i v-else :class=\"cls.e('icon-place')\"></i>\n </template>\n\n <div v-if=\"menu.render\" :class=\"cls.e('custom')\" @click.stop>\n <component :is=\"menu.render\" />\n </div>\n <span v-else :class=\"cls.e('label')\">{{ menu.label }}</span>\n\n <i v-if=\"showArrowColumn\" :class=\"cls.e('arrow-place')\"></i>\n </div>\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { vRipple } from '@veltra/directives'\nimport { Loading } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, shallowRef } from 'vue'\n\nimport type { ContextmenuItem } from '../../types'\nimport { UIcon } from '../icon'\nimport { ContextmenuPanelDIKey, ContextmenuRootDIKey } from './di'\nimport { getMenuDisabled } from './helper'\n\ndefineOptions({ name: 'UContextmenuItem' })\n\nconst { menu } = defineProps<{ menu: ContextmenuItem }>()\n\nconst { cls, onItemClickStart, onItemClickEnd } = inject(ContextmenuRootDIKey)!\nconst { showIconColumn, showArrowColumn } = inject(ContextmenuPanelDIKey)!\n\nconst loading = shallowRef(false)\nconst disabled = computed(() => getMenuDisabled(menu))\n\nfunction handleClickMenu() {\n if (disabled.value || loading.value || menu.keepOpen) return\n onItemClickStart()\n loading.value = true\n\n const done = () => {\n onItemClickEnd()\n loading.value = false\n }\n\n const result = menu.callback?.()\n if (result instanceof Promise) {\n result.finally(done)\n } else {\n done()\n }\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;EA0CA,MAAM,EAAE,KAAK,kBAAkB,mBAAmB,OAAO,oBAAoB;EAC7E,MAAM,EAAE,gBAAgB,oBAAoB,OAAO,qBAAqB;EAExE,MAAM,UAAU,WAAW,KAAK;EAChC,MAAM,WAAW,eAAe,gBAAgB,QAAA,IAAI,CAAC;EAErD,SAAS,kBAAkB;GACzB,IAAI,SAAS,SAAS,QAAQ,SAAS,QAAA,KAAK,UAAU;GACtD,iBAAiB;GACjB,QAAQ,QAAQ;GAEhB,MAAM,aAAa;IACjB,eAAe;IACf,QAAQ,QAAQ;GAClB;GAEA,MAAM,SAAS,QAAA,KAAK,WAAW;GAC/B,IAAI,kBAAkB,SACpB,OAAO,QAAQ,IAAI;QAEnB,KAAK;EAET;;GA/DE,OAAA,gBAAA,UAAA,GAAA,mBAuBK,MAAA;IAtBF,OAAK,eAAA;KAAG,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;KAAU,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,SAAA,KAAQ;KAAG,MAAA,GAAA,CAAG,CAAC,GAAE,WAAY,QAAA,KAAO;IAAA,CAAA;IAE9E,SAAO;GAER,GAAA,CAAA,mBAiBM,OAAA,EAjBA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,cAAA,CAAA,EAAA,GAAA;IACA,MAAA,cAAA,KAAc,CAAK,QAAA,KAAK,UAAxC,UAAA,GAAA,mBAQW,UAAA,EAAA,KAAA,EAAA,GAAA,CAPK,QAAA,SAAd,UAAA,GAAA,YAES,MAAA,WAAA,GAAA;;KAFe,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,GAAE,SAAA,CAAA;;KACnC,SAAA,cAAW,CAAX,YAAW,MAAA,OAAA,CAAA,CAAA,CAAA;;IAEM,GAAA,GAAA,CAAA,OAAA,CAAA,KAAA,QAAA,KAAK,QAAxB,UAAA,GAAA,YAES,MAAA,WAAA,GAAA,EAAA,KAAA,EAAA,GAAA;KADP,SAAA,cAA6B,EAA7B,UAAA,GAAA,YAA6B,wBAAb,QAAA,KAAK,IAAI,CAAA,EAAA,CAAA;;IAE3B,CAAA,MAAA,UAAA,GAAA,mBAA2C,KAAA;;KAAhC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;;IAGd,QAAA,KAAK,UAAhB,UAAA,GAAA,mBAEM,OAAA;;KAFmB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA;KAAa,SAAK,OAAA,OAAA,OAAA,KAAA,oBAAN,CAAA,GAAW,CAAA,MAAA,CAAA;IAC1D,GAAA,EAAA,UAAA,GAAA,YAA+B,wBAAf,QAAA,KAAK,MAAM,CAAA,EAAA,GAAA,CAE7B,MAAA,UAAA,GAAA,mBAA4D,QAAA;;KAA9C,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;IAAc,GAAA,gBAAA,QAAA,KAAK,KAAK,GAAA,CAAA;IAEzC,MAAA,eAAA,KAAT,UAAA,GAAA,mBAA4D,KAAA;;KAAjC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,aAAA,CAAA;;GAnB9B,GAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,MAAA,OAAA,GAAA,CAAA,SAAA,SAAQ,CAAK,QAAA,SAAO,CAAK,QAAA,KAAK,QAAQ,CAAA,CAAA"}
1
+ {"version":3,"file":"contextmenu-item.js","names":["_withDirectives","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_Fragment","_createBlock","UIcon","_withCtx","_createVNode","_resolveDynamicComponent","_createCommentVNode","_withModifiers","_toDisplayString"],"sources":["../../../src/components/contextmenu/contextmenu-item.vue"],"sourcesContent":["<template>\n <li\n :class=\"[cls.e('item'), bem.is('disabled', disabled), bem.is('loading', loading)]\"\n v-ripple=\"!disabled && !loading && !menu.keepOpen\"\n @click=\"handleClickMenu\"\n >\n <div :class=\"cls.e('item-content')\">\n <template v-if=\"showIconColumn && !menu.render\">\n <u-icon v-if=\"loading\" :class=\"bem.is('loading')\">\n <Loading />\n </u-icon>\n <u-icon v-else-if=\"menu.icon\">\n <component :is=\"menu.icon\" />\n </u-icon>\n <i v-else :class=\"cls.e('icon-place')\"></i>\n </template>\n\n <div v-if=\"menu.render\" :class=\"cls.e('custom')\" @click.stop>\n <component :is=\"menu.render\" />\n </div>\n <span v-else :class=\"cls.e('label')\">{{ menu.label }}</span>\n\n <i v-if=\"showArrowColumn\" :class=\"cls.e('arrow-place')\"></i>\n </div>\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { vRipple } from '@veltra/directives'\nimport { Loading } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, shallowRef } from 'vue'\n\nimport type { ContextmenuItem } from '../../types'\nimport { UIcon } from '../icon'\nimport { ContextmenuPanelDIKey, ContextmenuRootDIKey } from './di'\nimport { getMenuDisabled } from './helper'\n\ndefineOptions({ name: 'UContextmenuItem' })\n\nconst { menu } = defineProps<{ menu: ContextmenuItem }>()\n\nconst { cls, onItemClickStart, onItemClickEnd } = inject(ContextmenuRootDIKey)!\nconst { showIconColumn, showArrowColumn } = inject(ContextmenuPanelDIKey)!\n\nconst loading = shallowRef(false)\nconst disabled = computed(() => getMenuDisabled(menu))\n\nfunction handleClickMenu() {\n if (disabled.value || loading.value || menu.keepOpen) return\n onItemClickStart()\n loading.value = true\n\n const done = () => {\n onItemClickEnd()\n loading.value = false\n }\n\n const result = menu.callback?.()\n if (result instanceof Promise) {\n result.finally(done)\n } else {\n done()\n }\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;EA0CA,MAAM,EAAE,KAAK,kBAAkB,mBAAmB,OAAO,oBAAoB;EAC7E,MAAM,EAAE,gBAAgB,oBAAoB,OAAO,qBAAqB;EAExE,MAAM,UAAU,WAAW,KAAK;EAChC,MAAM,WAAW,eAAe,gBAAgB,QAAA,IAAI,CAAC;EAErD,SAAS,kBAAkB;GACzB,IAAI,SAAS,SAAS,QAAQ,SAAS,QAAA,KAAK,UAAU;GACtD,iBAAiB;GACjB,QAAQ,QAAQ;GAEhB,MAAM,aAAa;IACjB,eAAe;IACf,QAAQ,QAAQ;GAClB;GAEA,MAAM,SAAS,QAAA,KAAK,WAAW;GAC/B,IAAI,kBAAkB,SACpB,OAAO,QAAQ,IAAI;QAEnB,KAAK;EAET;;GA/DE,OAAAA,gBAAAC,UAAA,GAAAC,mBAuBK,MAAA;IAtBF,OAAKC,eAAA;KAAGC,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;KAAUA,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,SAAA,KAAQ;KAAGA,MAAA,GAAA,CAAG,CAAC,GAAE,WAAY,QAAA,KAAO;IAAA,CAAA;IAE9E,SAAO;GAER,GAAA,CAAAC,mBAiBM,OAAA,EAjBA,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,cAAA,CAAA,EAAA,GAAA;IACAA,MAAA,cAAA,KAAc,CAAK,QAAA,KAAK,UAAxCH,UAAA,GAAAC,mBAQWI,UAAA,EAAA,KAAA,EAAA,GAAA,CAPK,QAAA,SAAdL,UAAA,GAAAM,YAESH,MAAAI,WAAA,GAAA;;KAFe,OAAKL,eAAEC,MAAA,GAAA,CAAG,CAAC,GAAE,SAAA,CAAA;;KACnC,SAAAK,cAAW,CAAXC,YAAWN,MAAA,OAAA,CAAA,CAAA,CAAA;;IAEM,GAAA,GAAA,CAAA,OAAA,CAAA,KAAA,QAAA,KAAK,QAAxBH,UAAA,GAAAM,YAESH,MAAAI,WAAA,GAAA,EAAA,KAAA,EAAA,GAAA;KADP,SAAAC,cAA6B,EAA7BR,UAAA,GAAAM,YAA6BI,wBAAb,QAAA,KAAK,IAAI,CAAA,EAAA,CAAA;;IAE3B,CAAA,MAAAV,UAAA,GAAAC,mBAA2C,KAAA;;KAAhC,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;;IAGd,QAAA,KAAK,UAAhBH,UAAA,GAAAC,mBAEM,OAAA;;KAFmB,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA;KAAa,SAAK,OAAA,OAAA,OAAA,KAAAS,oBAAN,CAAA,GAAW,CAAA,MAAA,CAAA;IAC1D,GAAA,EAAAZ,UAAA,GAAAM,YAA+BI,wBAAf,QAAA,KAAK,MAAM,CAAA,EAAA,GAAA,CAE7B,MAAAV,UAAA,GAAAC,mBAA4D,QAAA;;KAA9C,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;IAAc,GAAAU,gBAAA,QAAA,KAAK,KAAK,GAAA,CAAA;IAEzCV,MAAA,eAAA,KAATH,UAAA,GAAAC,mBAA4D,KAAA;;KAAjC,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,aAAA,CAAA;;GAnB9B,GAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAAA,MAAA,OAAA,GAAA,CAAA,SAAA,SAAQ,CAAK,QAAA,SAAO,CAAK,QAAA,KAAK,QAAQ,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"contextmenu-panel.js","names":["$attrs"],"sources":["../../../src/components/contextmenu/contextmenu-panel.vue"],"sourcesContent":["<template>\n <ul v-bind=\"$attrs\">\n <template v-for=\"(menu, index) of menus\" :key=\"index\">\n <li v-if=\"menu.divider\" :class=\"cls.e('divider')\" role=\"separator\" />\n <UContextmenuSub v-else-if=\"menu.children?.length\" :menu=\"menu\" />\n <UContextmenuItem v-else :menu=\"menu\" />\n </template>\n </ul>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, inject, provide } from 'vue'\n\nimport type { ContextmenuItem } from '../../types'\nimport UContextmenuItem from './contextmenu-item.vue'\nimport UContextmenuSub from './contextmenu-sub.vue'\nimport { ContextmenuPanelDIKey, ContextmenuRootDIKey } from './di'\n\ndefineOptions({ name: 'UContextmenuPanel', inheritAttrs: false })\n\nconst { menus } = defineProps<{ menus: ContextmenuItem[] }>()\n\nconst { cls } = inject(ContextmenuRootDIKey)!\n\nconst showIconColumn = computed(() => menus.some((menu) => !menu.divider && !!menu.icon))\nconst showArrowColumn = computed(() =>\n menus.some((menu) => !menu.divider && !!menu.children?.length)\n)\n\nprovide(ContextmenuPanelDIKey, { showIconColumn, showArrowColumn })\n</script>\n"],"mappings":";;;;;;;;;;;EAsBA,MAAM,EAAE,QAAQ,OAAO,oBAAoB;EAE3C,MAAM,iBAAiB,eAAe,QAAA,MAAM,MAAM,SAAS,CAAC,KAAK,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC;EACxF,MAAM,kBAAkB,eACtB,QAAA,MAAM,MAAM,SAAS,CAAC,KAAK,WAAW,CAAC,CAAC,KAAK,UAAU,MAAM,CAC/D;EAEA,QAAQ,uBAAuB;GAAE;GAAgB;EAAgB,CAAC;;GA5BhE,OAAA,UAAA,GAAA,mBAMK,MAAA,eAAA,mBANOA,KAAAA,MAAM,CAAA,GAAA,EAChB,UAAA,IAAA,GAAA,mBAIW,UAAA,MAAA,WAJuB,QAAA,QAAhB,MAAM,UAAK;IAAkB,OAAA,UAAA,GAAA,mBAAA,UAAA,EAAA,KAAA,MAAK,GAAA,CACxC,KAAK,WAAf,UAAA,GAAA,mBAAqE,MAAA;;KAA5C,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA;KAAa,MAAK;IAC3B,GAAA,MAAA,CAAA,KAAA,KAAK,UAAU,UAA3C,UAAA,GAAA,YAAkE,aAAA;;KAAR;IAC1D,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,MAAA,UAAA,GAAA,YAAwC,aAAA;;KAAR"}
1
+ {"version":3,"file":"contextmenu-panel.js","names":["$attrs","_openBlock","_createElementBlock","_normalizeProps","_guardReactiveProps","_Fragment","_renderList","_normalizeClass","_unref","_createBlock","UContextmenuSub","UContextmenuItem"],"sources":["../../../src/components/contextmenu/contextmenu-panel.vue"],"sourcesContent":["<template>\n <ul v-bind=\"$attrs\">\n <template v-for=\"(menu, index) of menus\" :key=\"index\">\n <li v-if=\"menu.divider\" :class=\"cls.e('divider')\" role=\"separator\" />\n <UContextmenuSub v-else-if=\"menu.children?.length\" :menu=\"menu\" />\n <UContextmenuItem v-else :menu=\"menu\" />\n </template>\n </ul>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, inject, provide } from 'vue'\n\nimport type { ContextmenuItem } from '../../types'\nimport UContextmenuItem from './contextmenu-item.vue'\nimport UContextmenuSub from './contextmenu-sub.vue'\nimport { ContextmenuPanelDIKey, ContextmenuRootDIKey } from './di'\n\ndefineOptions({ name: 'UContextmenuPanel', inheritAttrs: false })\n\nconst { menus } = defineProps<{ menus: ContextmenuItem[] }>()\n\nconst { cls } = inject(ContextmenuRootDIKey)!\n\nconst showIconColumn = computed(() => menus.some((menu) => !menu.divider && !!menu.icon))\nconst showArrowColumn = computed(() =>\n menus.some((menu) => !menu.divider && !!menu.children?.length)\n)\n\nprovide(ContextmenuPanelDIKey, { showIconColumn, showArrowColumn })\n</script>\n"],"mappings":";;;;;;;;;;;EAsBA,MAAM,EAAE,QAAQ,OAAO,oBAAoB;EAE3C,MAAM,iBAAiB,eAAe,QAAA,MAAM,MAAM,SAAS,CAAC,KAAK,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC;EACxF,MAAM,kBAAkB,eACtB,QAAA,MAAM,MAAM,SAAS,CAAC,KAAK,WAAW,CAAC,CAAC,KAAK,UAAU,MAAM,CAC/D;EAEA,QAAQ,uBAAuB;GAAE;GAAgB;EAAgB,CAAC;;GA5BhE,OAAAC,UAAA,GAAAC,mBAMK,MAAAC,eAAAC,mBANOJ,KAAAA,MAAM,CAAA,GAAA,EAChBC,UAAA,IAAA,GAAAC,mBAIWG,UAAA,MAAAC,WAJuB,QAAA,QAAhB,MAAM,UAAK;IAAkB,OAAAL,UAAA,GAAAC,mBAAAG,UAAA,EAAA,KAAA,MAAK,GAAA,CACxC,KAAK,WAAfJ,UAAA,GAAAC,mBAAqE,MAAA;;KAA5C,OAAKK,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA;KAAa,MAAK;IAC3B,GAAA,MAAA,CAAA,KAAA,KAAK,UAAU,UAA3CP,UAAA,GAAAQ,YAAkEC,aAAA;;KAAR;IAC1D,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,MAAAT,UAAA,GAAAQ,YAAwCE,aAAA;;KAAR"}
@@ -1 +1 @@
1
- {"version":3,"file":"contextmenu-sub.js","names":[],"sources":["../../../src/components/contextmenu/contextmenu-sub.vue"],"sourcesContent":["<template>\n <li\n :class=\"[\n cls.e('item'),\n bem.is('disabled', disabled),\n bem.is('open', subVisible),\n bem.is('flip-x', flipX)\n ]\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"scheduleClose\"\n >\n <div :class=\"cls.e('item-content')\">\n <template v-if=\"showIconColumn\">\n <u-icon v-if=\"menu.icon\">\n <component :is=\"menu.icon\" />\n </u-icon>\n <i v-else :class=\"cls.e('icon-place')\"></i>\n </template>\n\n <span :class=\"cls.e('label')\">{{ menu.label }}</span>\n\n <u-icon v-if=\"showArrowColumn\" :class=\"cls.e('arrow')\">\n <ArrowRight />\n </u-icon>\n <i v-else :class=\"cls.e('arrow-place')\"></i>\n </div>\n\n <UContextmenuPanel\n v-show=\"subVisible\"\n :menus=\"menu.children!\"\n :class=\"[cls.e('sub'), bem.is('flip-x', flipX)]\"\n @mouseenter=\"cancelClose\"\n @mouseleave=\"scheduleClose\"\n />\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, nextTick, onBeforeUnmount, shallowRef } from 'vue'\n\nimport type { ContextmenuItem } from '../../types'\nimport { UIcon } from '../icon'\nimport UContextmenuPanel from './contextmenu-panel.vue'\nimport { ContextmenuPanelDIKey, ContextmenuRootDIKey } from './di'\nimport { getMenuDisabled } from './helper'\n\ndefineOptions({ name: 'UContextmenuSub' })\n\nconst { menu } = defineProps<{ menu: ContextmenuItem }>()\n\nconst { cls } = inject(ContextmenuRootDIKey)!\nconst { showIconColumn, showArrowColumn } = inject(ContextmenuPanelDIKey)!\n\nconst subVisible = shallowRef(false)\nconst flipX = shallowRef(false)\n\nlet closeTimer: ReturnType<typeof setTimeout> | undefined\n\nconst disabled = computed(() => getMenuDisabled(menu))\n\nfunction cancelClose() {\n if (closeTimer !== undefined) {\n clearTimeout(closeTimer)\n closeTimer = undefined\n }\n}\n\nfunction scheduleClose() {\n cancelClose()\n closeTimer = setTimeout(() => {\n subVisible.value = false\n }, 250)\n}\n\nfunction handleMouseEnter(e: MouseEvent) {\n if (disabled.value) return\n cancelClose()\n subVisible.value = true\n nextTick(() => {\n const panel = (e.currentTarget as HTMLElement).querySelector<HTMLElement>(`.${cls.e('sub')}`)\n if (panel) flipX.value = panel.getBoundingClientRect().right > window.innerWidth\n })\n}\n\nonBeforeUnmount(cancelClose)\n</script>\n"],"mappings":";;;;;;;;;;;;;EAoDA,MAAM,EAAE,QAAQ,OAAO,oBAAoB;EAC3C,MAAM,EAAE,gBAAgB,oBAAoB,OAAO,qBAAqB;EAExE,MAAM,aAAa,WAAW,KAAK;EACnC,MAAM,QAAQ,WAAW,KAAK;EAE9B,IAAI;EAEJ,MAAM,WAAW,eAAe,gBAAgB,QAAA,IAAI,CAAC;EAErD,SAAS,cAAc;GACrB,IAAI,eAAe,KAAA,GAAW;IAC5B,aAAa,UAAU;IACvB,aAAa,KAAA;GACf;EACF;EAEA,SAAS,gBAAgB;GACvB,YAAY;GACZ,aAAa,iBAAiB;IAC5B,WAAW,QAAQ;GACrB,GAAG,GAAG;EACR;EAEA,SAAS,iBAAiB,GAAe;GACvC,IAAI,SAAS,OAAO;GACpB,YAAY;GACZ,WAAW,QAAQ;GACnB,eAAe;IACb,MAAM,QAAS,EAAE,cAA8B,cAA2B,IAAI,IAAI,EAAE,KAAK,GAAG;IAC5F,IAAI,OAAO,MAAM,QAAQ,MAAM,sBAAsB,CAAC,CAAC,QAAQ,OAAO;GACxE,CAAC;EACH;EAEA,gBAAgB,WAAW;;GArFzB,OAAA,UAAA,GAAA,mBAiCK,MAAA;IAhCF,OAAK,eAAA;KAAU,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;KAAgB,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,SAAA,KAAQ;KAAS,MAAA,GAAA,CAAG,CAAC,GAAE,QAAS,WAAA,KAAU;KAAS,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,MAAA,KAAK;;IAMhI,cAAY;IACZ,cAAY;GAEb,GAAA,CAAA,mBAcM,OAAA,EAdA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,cAAA,CAAA,EAAA,GAAA;IACA,MAAA,cAAA,KAAhB,UAAA,GAAA,mBAKW,UAAA,EAAA,KAAA,EAAA,GAAA,CAJK,QAAA,KAAK,QAAnB,UAAA,GAAA,YAES,MAAA,WAAA,GAAA,EAAA,KAAA,EAAA,GAAA;KADP,SAAA,cAA6B,EAA7B,UAAA,GAAA,YAA6B,wBAAb,QAAA,KAAK,IAAI,CAAA,EAAA,CAAA;;IAE3B,CAAA,MAAA,UAAA,GAAA,mBAA2C,KAAA;;KAAhC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;;IAGzB,mBAAqD,QAAA,EAA9C,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA,EAAc,GAAA,gBAAA,QAAA,KAAK,KAAK,GAAA,CAAA;IAE7B,MAAA,eAAA,KAAd,UAAA,GAAA,YAES,MAAA,WAAA,GAAA;;KAFuB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;;KAC1C,SAAA,cAAc,CAAd,YAAc,MAAA,UAAA,CAAA,CAAA,CAAA;;IAEhB,GAAA,GAAA,CAAA,OAAA,CAAA,MAAA,UAAA,GAAA,mBAA4C,KAAA;;KAAjC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,aAAA,CAAA;;GAGzB,GAAA,CAAA,GAAA,eAAA,YAME,aAAA;IAJC,OAAO,QAAA,KAAK;IACZ,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,EAAC,KAAA,GAAS,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,MAAA,KAAK,CAAA,CAAA;IAC5C,cAAY;IACZ,cAAY;GAJL,GAAA,MAAA,GAAA,CAAA,SAAA,OAAA,CAAA,GAAA,CAAA,CAAA,OAAA,WAAA,KAAU,CAAA,CAAA,CAAA,GAAA,EAAA"}
1
+ {"version":3,"file":"contextmenu-sub.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_Fragment","_createBlock","UIcon","_withCtx","_resolveDynamicComponent","_createCommentVNode","_toDisplayString","_createVNode","_withDirectives","UContextmenuPanel","_vShow"],"sources":["../../../src/components/contextmenu/contextmenu-sub.vue"],"sourcesContent":["<template>\n <li\n :class=\"[\n cls.e('item'),\n bem.is('disabled', disabled),\n bem.is('open', subVisible),\n bem.is('flip-x', flipX)\n ]\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"scheduleClose\"\n >\n <div :class=\"cls.e('item-content')\">\n <template v-if=\"showIconColumn\">\n <u-icon v-if=\"menu.icon\">\n <component :is=\"menu.icon\" />\n </u-icon>\n <i v-else :class=\"cls.e('icon-place')\"></i>\n </template>\n\n <span :class=\"cls.e('label')\">{{ menu.label }}</span>\n\n <u-icon v-if=\"showArrowColumn\" :class=\"cls.e('arrow')\">\n <ArrowRight />\n </u-icon>\n <i v-else :class=\"cls.e('arrow-place')\"></i>\n </div>\n\n <UContextmenuPanel\n v-show=\"subVisible\"\n :menus=\"menu.children!\"\n :class=\"[cls.e('sub'), bem.is('flip-x', flipX)]\"\n @mouseenter=\"cancelClose\"\n @mouseleave=\"scheduleClose\"\n />\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, nextTick, onBeforeUnmount, shallowRef } from 'vue'\n\nimport type { ContextmenuItem } from '../../types'\nimport { UIcon } from '../icon'\nimport UContextmenuPanel from './contextmenu-panel.vue'\nimport { ContextmenuPanelDIKey, ContextmenuRootDIKey } from './di'\nimport { getMenuDisabled } from './helper'\n\ndefineOptions({ name: 'UContextmenuSub' })\n\nconst { menu } = defineProps<{ menu: ContextmenuItem }>()\n\nconst { cls } = inject(ContextmenuRootDIKey)!\nconst { showIconColumn, showArrowColumn } = inject(ContextmenuPanelDIKey)!\n\nconst subVisible = shallowRef(false)\nconst flipX = shallowRef(false)\n\nlet closeTimer: ReturnType<typeof setTimeout> | undefined\n\nconst disabled = computed(() => getMenuDisabled(menu))\n\nfunction cancelClose() {\n if (closeTimer !== undefined) {\n clearTimeout(closeTimer)\n closeTimer = undefined\n }\n}\n\nfunction scheduleClose() {\n cancelClose()\n closeTimer = setTimeout(() => {\n subVisible.value = false\n }, 250)\n}\n\nfunction handleMouseEnter(e: MouseEvent) {\n if (disabled.value) return\n cancelClose()\n subVisible.value = true\n nextTick(() => {\n const panel = (e.currentTarget as HTMLElement).querySelector<HTMLElement>(`.${cls.e('sub')}`)\n if (panel) flipX.value = panel.getBoundingClientRect().right > window.innerWidth\n })\n}\n\nonBeforeUnmount(cancelClose)\n</script>\n"],"mappings":";;;;;;;;;;;;;EAoDA,MAAM,EAAE,QAAQ,OAAO,oBAAoB;EAC3C,MAAM,EAAE,gBAAgB,oBAAoB,OAAO,qBAAqB;EAExE,MAAM,aAAa,WAAW,KAAK;EACnC,MAAM,QAAQ,WAAW,KAAK;EAE9B,IAAI;EAEJ,MAAM,WAAW,eAAe,gBAAgB,QAAA,IAAI,CAAC;EAErD,SAAS,cAAc;GACrB,IAAI,eAAe,KAAA,GAAW;IAC5B,aAAa,UAAU;IACvB,aAAa,KAAA;GACf;EACF;EAEA,SAAS,gBAAgB;GACvB,YAAY;GACZ,aAAa,iBAAiB;IAC5B,WAAW,QAAQ;GACrB,GAAG,GAAG;EACR;EAEA,SAAS,iBAAiB,GAAe;GACvC,IAAI,SAAS,OAAO;GACpB,YAAY;GACZ,WAAW,QAAQ;GACnB,eAAe;IACb,MAAM,QAAS,EAAE,cAA8B,cAA2B,IAAI,IAAI,EAAE,KAAK,GAAG;IAC5F,IAAI,OAAO,MAAM,QAAQ,MAAM,sBAAsB,CAAC,CAAC,QAAQ,OAAO;GACxE,CAAC;EACH;EAEA,gBAAgB,WAAW;;GArFzB,OAAAA,UAAA,GAAAC,mBAiCK,MAAA;IAhCF,OAAKC,eAAA;KAAUC,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;KAAgBA,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,SAAA,KAAQ;KAASA,MAAA,GAAA,CAAG,CAAC,GAAE,QAAS,WAAA,KAAU;KAASA,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,MAAA,KAAK;;IAMhI,cAAY;IACZ,cAAY;GAEb,GAAA,CAAAC,mBAcM,OAAA,EAdA,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,cAAA,CAAA,EAAA,GAAA;IACAA,MAAA,cAAA,KAAhBH,UAAA,GAAAC,mBAKWI,UAAA,EAAA,KAAA,EAAA,GAAA,CAJK,QAAA,KAAK,QAAnBL,UAAA,GAAAM,YAESH,MAAAI,WAAA,GAAA,EAAA,KAAA,EAAA,GAAA;KADP,SAAAC,cAA6B,EAA7BR,UAAA,GAAAM,YAA6BG,wBAAb,QAAA,KAAK,IAAI,CAAA,EAAA,CAAA;;IAE3B,CAAA,MAAAT,UAAA,GAAAC,mBAA2C,KAAA;;KAAhC,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;;IAGzBC,mBAAqD,QAAA,EAA9C,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA,EAAc,GAAAQ,gBAAA,QAAA,KAAK,KAAK,GAAA,CAAA;IAE7BR,MAAA,eAAA,KAAdH,UAAA,GAAAM,YAESH,MAAAI,WAAA,GAAA;;KAFuB,OAAKL,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;;KAC1C,SAAAK,cAAc,CAAdI,YAAcT,MAAA,UAAA,CAAA,CAAA,CAAA;;IAEhB,GAAA,GAAA,CAAA,OAAA,CAAA,MAAAH,UAAA,GAAAC,mBAA4C,KAAA;;KAAjC,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,aAAA,CAAA;;GAGzB,GAAA,CAAA,GAAAU,eAAAD,YAMEE,aAAA;IAJC,OAAO,QAAA,KAAK;IACZ,OAAKZ,eAAA,CAAGC,MAAA,GAAA,CAAG,CAAC,EAAC,KAAA,GAASA,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,MAAA,KAAK,CAAA,CAAA;IAC5C,cAAY;IACZ,cAAY;GAJL,GAAA,MAAA,GAAA,CAAA,SAAA,OAAA,CAAA,GAAA,CAAA,CAAAY,OAAA,WAAA,KAAU,CAAA,CAAA,CAAA,GAAA,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"contextmenu.js","names":[],"sources":["../../../src/components/contextmenu/contextmenu.vue"],"sourcesContent":["<template>\n <Teleport to=\"body\">\n <transition name=\"zoom-in\" appear @after-leave=\"emit('destroy')\">\n <UContextmenuPanel\n v-if=\"visible\"\n :menus=\"menus\"\n :class=\"[cls.b, cls.m(size)]\"\n :style=\"style\"\n v-click-outside=\"handleClickOutside\"\n />\n </transition>\n </Teleport>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { vClickOutside } from '@veltra/directives'\nimport { bem, withUnit, zIndex } from '@veltra/utils'\nimport { computed, provide, shallowRef, type CSSProperties } from 'vue'\n\nimport type { ContextmenuEmits, ContextmenuProps, ComponentSize } from '../../types'\nimport UContextmenuPanel from './contextmenu-panel.vue'\nimport { ContextmenuRootDIKey } from './di'\n\ndefineOptions({ name: 'UContextmenu' })\n\nconst props = withDefaults(defineProps<ContextmenuProps>(), { width: 150 })\n\nconst emit = defineEmits<ContextmenuEmits>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('contextmenu')\n\nconst visible = shallowRef(true)\n\nconst style = computed<CSSProperties>(() => {\n const { x, y } = props.mousePosition\n const flipX = x > window.innerWidth / 2\n const flipY = y > window.innerHeight / 2\n return {\n width: withUnit(props.width, 'px'),\n zIndex: zIndex(),\n ...(flipX\n ? { right: withUnit(window.innerWidth - x - 1, 'px') }\n : { left: withUnit(x + 1, 'px') }),\n ...(flipY\n ? { bottom: withUnit(window.innerHeight - y - 1, 'px') }\n : { top: withUnit(y + 1, 'px') }),\n transformOrigin: `${flipY ? 'bottom' : 'top'} ${flipX ? 'right' : 'left'}`\n }\n})\n\nconst menus = computed(() => (typeof props.menus === 'function' ? props.menus() : props.menus))\n\nfunction close() {\n visible.value = false\n}\n\nlet loading = false\n\nprovide(ContextmenuRootDIKey, {\n cls,\n onItemClickStart: () => {\n loading = true\n },\n onItemClickEnd: () => {\n loading = false\n close()\n }\n})\n\nfunction handleClickOutside() {\n if (loading) return\n close()\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EA0BA,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,aAAa;EAE7B,MAAM,UAAU,WAAW,IAAI;EAE/B,MAAM,QAAQ,eAA8B;GAC1C,MAAM,EAAE,GAAG,MAAM,MAAM;GACvB,MAAM,QAAQ,IAAI,OAAO,aAAa;GACtC,MAAM,QAAQ,IAAI,OAAO,cAAc;GACvC,OAAO;IACL,OAAO,SAAS,MAAM,OAAO,IAAI;IACjC,QAAQ,OAAO;IACf,GAAI,QACA,EAAE,OAAO,SAAS,OAAO,aAAa,IAAI,GAAG,IAAI,EAAE,IACnD,EAAE,MAAM,SAAS,IAAI,GAAG,IAAI,EAAE;IAClC,GAAI,QACA,EAAE,QAAQ,SAAS,OAAO,cAAc,IAAI,GAAG,IAAI,EAAE,IACrD,EAAE,KAAK,SAAS,IAAI,GAAG,IAAI,EAAE;IACjC,iBAAiB,GAAG,QAAQ,WAAW,MAAM,GAAG,QAAQ,UAAU;GACpE;EACF,CAAC;EAED,MAAM,QAAQ,eAAgB,OAAO,MAAM,UAAU,aAAa,MAAM,MAAM,IAAI,MAAM,KAAM;EAE9F,SAAS,QAAQ;GACf,QAAQ,QAAQ;EAClB;EAEA,IAAI,UAAU;EAEd,QAAQ,sBAAsB;GAC5B;GACA,wBAAwB;IACtB,UAAU;GACZ;GACA,sBAAsB;IACpB,UAAU;IACV,MAAM;GACR;EACF,CAAC;EAED,SAAS,qBAAqB;GAC5B,IAAI,SAAS;GACb,MAAM;EACR;;GA1EE,OAAA,UAAA,GAAA,YAUW,UAAA,EAVD,IAAG,OAAM,GAAA,CACjB,YAQa,YAAA;IARD,MAAK;IAAU,QAAA;IAAQ,cAAW,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;;IAClD,SAAA,cAME,CALM,QAAA,QADR,gBAAA,UAAA,GAAA,YAME,aAAA;;KAJC,OAAO,MAAA;KACP,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,GAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI,CAAA,CAAA;KACzB,OAAK,eAAE,MAAA,KAAK;;;;;IACI,CAAA,IAAA,CAAA,CAAA,MAAA,aAAA,GAAA,kBAAkB,CAAA,CAAA,IAAA,mBAAA,QAAA,IAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"contextmenu.js","names":["_openBlock","_createBlock","_Teleport","_createVNode","_Transition","_withCtx","_withDirectives","UContextmenuPanel","_normalizeClass","_unref","_normalizeStyle","_createCommentVNode"],"sources":["../../../src/components/contextmenu/contextmenu.vue"],"sourcesContent":["<template>\n <Teleport to=\"body\">\n <transition name=\"zoom-in\" appear @after-leave=\"emit('destroy')\">\n <UContextmenuPanel\n v-if=\"visible\"\n :menus=\"menus\"\n :class=\"[cls.b, cls.m(size)]\"\n :style=\"style\"\n v-click-outside=\"handleClickOutside\"\n />\n </transition>\n </Teleport>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { vClickOutside } from '@veltra/directives'\nimport { bem, withUnit, zIndex } from '@veltra/utils'\nimport { computed, provide, shallowRef, type CSSProperties } from 'vue'\n\nimport type { ContextmenuEmits, ContextmenuProps, ComponentSize } from '../../types'\nimport UContextmenuPanel from './contextmenu-panel.vue'\nimport { ContextmenuRootDIKey } from './di'\n\ndefineOptions({ name: 'UContextmenu' })\n\nconst props = withDefaults(defineProps<ContextmenuProps>(), { width: 150 })\n\nconst emit = defineEmits<ContextmenuEmits>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('contextmenu')\n\nconst visible = shallowRef(true)\n\nconst style = computed<CSSProperties>(() => {\n const { x, y } = props.mousePosition\n const flipX = x > window.innerWidth / 2\n const flipY = y > window.innerHeight / 2\n return {\n width: withUnit(props.width, 'px'),\n zIndex: zIndex(),\n ...(flipX\n ? { right: withUnit(window.innerWidth - x - 1, 'px') }\n : { left: withUnit(x + 1, 'px') }),\n ...(flipY\n ? { bottom: withUnit(window.innerHeight - y - 1, 'px') }\n : { top: withUnit(y + 1, 'px') }),\n transformOrigin: `${flipY ? 'bottom' : 'top'} ${flipX ? 'right' : 'left'}`\n }\n})\n\nconst menus = computed(() => (typeof props.menus === 'function' ? props.menus() : props.menus))\n\nfunction close() {\n visible.value = false\n}\n\nlet loading = false\n\nprovide(ContextmenuRootDIKey, {\n cls,\n onItemClickStart: () => {\n loading = true\n },\n onItemClickEnd: () => {\n loading = false\n close()\n }\n})\n\nfunction handleClickOutside() {\n if (loading) return\n close()\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EA0BA,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,aAAa;EAE7B,MAAM,UAAU,WAAW,IAAI;EAE/B,MAAM,QAAQ,eAA8B;GAC1C,MAAM,EAAE,GAAG,MAAM,MAAM;GACvB,MAAM,QAAQ,IAAI,OAAO,aAAa;GACtC,MAAM,QAAQ,IAAI,OAAO,cAAc;GACvC,OAAO;IACL,OAAO,SAAS,MAAM,OAAO,IAAI;IACjC,QAAQ,OAAO;IACf,GAAI,QACA,EAAE,OAAO,SAAS,OAAO,aAAa,IAAI,GAAG,IAAI,EAAE,IACnD,EAAE,MAAM,SAAS,IAAI,GAAG,IAAI,EAAE;IAClC,GAAI,QACA,EAAE,QAAQ,SAAS,OAAO,cAAc,IAAI,GAAG,IAAI,EAAE,IACrD,EAAE,KAAK,SAAS,IAAI,GAAG,IAAI,EAAE;IACjC,iBAAiB,GAAG,QAAQ,WAAW,MAAM,GAAG,QAAQ,UAAU;GACpE;EACF,CAAC;EAED,MAAM,QAAQ,eAAgB,OAAO,MAAM,UAAU,aAAa,MAAM,MAAM,IAAI,MAAM,KAAM;EAE9F,SAAS,QAAQ;GACf,QAAQ,QAAQ;EAClB;EAEA,IAAI,UAAU;EAEd,QAAQ,sBAAsB;GAC5B;GACA,wBAAwB;IACtB,UAAU;GACZ;GACA,sBAAsB;IACpB,UAAU;IACV,MAAM;GACR;EACF,CAAC;EAED,SAAS,qBAAqB;GAC5B,IAAI,SAAS;GACb,MAAM;EACR;;GA1EE,OAAAA,UAAA,GAAAC,YAUWC,UAAA,EAVD,IAAG,OAAM,GAAA,CACjBC,YAQaC,YAAA;IARD,MAAK;IAAU,QAAA;IAAQ,cAAW,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;;IAClD,SAAAC,cAME,CALM,QAAA,QADRC,gBAAAN,UAAA,GAAAC,YAMEM,aAAA;;KAJC,OAAO,MAAA;KACP,OAAKC,eAAA,CAAGC,MAAA,GAAA,CAAG,CAAC,GAAGA,MAAA,GAAA,CAAG,CAAC,EAAEA,MAAA,IAAA,CAAI,CAAA,CAAA;KACzB,OAAKC,eAAE,MAAA,KAAK;;;;;IACI,CAAA,IAAA,CAAA,CAAAD,MAAA,aAAA,GAAA,kBAAkB,CAAA,CAAA,IAAAE,mBAAA,QAAA,IAAA,CAAA,CAAA"}