@veltra/desktop 1.7.18 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/batch-edit/batch-edit-form.js +40 -26
- package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
- package/dist/components/batch-edit/batch-edit-list.js +17 -5
- package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
- package/dist/components/batch-edit/di.js.map +1 -1
- package/dist/components/batch-edit/use-handlers.js +3 -3
- package/dist/components/batch-edit/use-handlers.js.map +1 -1
- package/dist/components/batch-edit/use-shortcut-key.js +4 -2
- package/dist/components/batch-edit/use-shortcut-key.js.map +1 -1
- package/dist/components/card/style2.css +0 -2
- package/dist/components/dialog/style2.css +1 -1
- package/dist/components/dropdown/dropdown.js +5 -3
- package/dist/components/dropdown/dropdown.js.map +1 -1
- package/dist/components/expression-editor/components/path-preview.js +3 -6
- package/dist/components/expression-editor/components/path-preview.js.map +1 -1
- package/dist/components/expression-editor/components/variable-picker.js +49 -12
- package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
- package/dist/components/expression-editor/core/chip.js +1 -15
- package/dist/components/expression-editor/core/chip.js.map +1 -1
- package/dist/components/expression-editor/core/editor.js +20 -18
- package/dist/components/expression-editor/core/editor.js.map +1 -1
- package/dist/components/expression-editor/expression-editor.js +53 -22
- package/dist/components/expression-editor/expression-editor.js.map +1 -1
- package/dist/components/expression-editor/style2.css +135 -96
- package/dist/components/form/form.js.map +1 -1
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js +0 -1
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/style2.css +8 -3
- package/dist/components/index.d.ts +26 -26
- package/dist/components/index.js +52 -52
- package/dist/components/multi-select/multi-select.js +16 -12
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-select/style2.css +7 -0
- package/dist/components/multi-tree-select/multi-tree-select.js +82 -56
- package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
- package/dist/components/multi-tree-select/style2.css +7 -0
- package/dist/components/select/select.js +7 -3
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/select/style2.css +7 -0
- package/dist/components/select/use-options.js +14 -3
- package/dist/components/select/use-options.js.map +1 -1
- package/dist/components/tree-select/style2.css +7 -0
- package/dist/components/tree-select/tree-select.js +49 -17
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/types/dropdown.d.ts +10 -0
- package/dist/types/multi-tree-select.d.ts +7 -1
- package/dist/types/tree-select.d.ts +7 -1
- package/package.json +1 -1
- package/src/components/batch-edit/__test__/batch-edit.test.ts +119 -7
- package/src/components/batch-edit/batch-edit-form.vue +21 -2
- package/src/components/batch-edit/batch-edit-list.vue +18 -1
- package/src/components/batch-edit/di.ts +1 -1
- package/src/components/batch-edit/use-handlers.ts +6 -5
- package/src/components/batch-edit/use-shortcut-key.ts +5 -2
- package/src/components/card/style.scss +0 -2
- package/src/components/dialog/style.scss +2 -1
- package/src/components/dropdown/dropdown.vue +9 -4
- package/src/components/expression-editor/__test__/chip.test.ts +3 -14
- package/src/components/expression-editor/components/path-preview.vue +1 -2
- package/src/components/expression-editor/components/variable-picker.vue +54 -13
- package/src/components/expression-editor/core/chip.ts +3 -29
- package/src/components/expression-editor/core/editor.ts +28 -21
- package/src/components/expression-editor/expression-editor.vue +47 -21
- package/src/components/expression-editor/style.scss +167 -111
- package/src/components/form/form.vue +0 -1
- package/src/components/form/style.scss +11 -4
- package/src/components/multi-select/multi-select.vue +11 -2
- package/src/components/multi-select/style.scss +6 -0
- package/src/components/multi-tree-select/multi-tree-select.vue +58 -9
- package/src/components/multi-tree-select/style.scss +6 -0
- package/src/components/select/__test__/select.test.ts +78 -0
- package/src/components/select/select.vue +13 -3
- package/src/components/select/style.scss +6 -0
- package/src/components/select/use-options.ts +25 -4
- package/src/components/tree-select/__test__/tree-select.test.ts +116 -0
- package/src/components/tree-select/style.scss +6 -0
- package/src/components/tree-select/tree-select.vue +63 -13
- package/src/types/dropdown.ts +10 -0
- package/src/types/multi-tree-select.ts +12 -1
- package/src/types/tree-select.ts +12 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-editor.js","names":[],"sources":["../../../src/components/expression-editor/expression-editor.vue"],"sourcesContent":["<template>\n <div :class=\"className\">\n <div\n ref=\"container\"\n :class=\"cls.e('container')\"\n :contenteditable=\"!readonly && !disabled\"\n :data-empty=\"isEmpty || undefined\"\n :data-placeholder=\"props.placeholder\"\n @keydown=\"onKeydown\"\n @blur=\"onBlur\"\n ></div>\n\n <div v-if=\"showPlaceholder\" :class=\"cls.e('placeholder')\">\n {{ props.placeholder }}\n </div>\n\n <VariablePicker\n ref=\"pickerRef\"\n :visible=\"pickerVisible\"\n :trigger-dom=\"pickerTriggerDom\"\n :variables=\"props.variables\"\n :filter=\"pickerFilter\"\n :selectable-levels=\"props.selectableLevels ?? '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 } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n shallowRef,\n useTemplateRef,\n watch\n} from 'vue'\n\nimport type { ExpressionEditorProps, VariableItem } from '../../types'\nimport VariablePicker from './components/variable-picker.vue'\nimport { createEditor, type EditorAPI } from './core/editor'\nimport { createMention, type MentionAPI } from './core/mention'\nimport { parse, type Doc } from './core/model'\nimport { createVariableMap } from './di'\n\ndefineOptions({ name: 'UExpressionEditor' })\n\nconst props = withDefaults(defineProps<ExpressionEditorProps>(), {\n placeholder: '请输入表达式,输入 @ 可插入变量',\n selectableLevels: 'leaf'\n})\n\nconst emit = defineEmits<{ (e: 'update:modelValue', value: string): void }>()\n\nconst cls = bem('expression-editor')\nconst { formProps } = injectFormContext()\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst containerRef = useTemplateRef<HTMLDivElement>('container')\nconst pickerRef = useTemplateRef<{ handleKeydown: (e: KeyboardEvent) => boolean }>('pickerRef')\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 variableMap = computed(() => createVariableMap(props.variables))\n\nconst editorRef = shallowRef<EditorAPI | null>(null)\nconst mention: MentionAPI = createMention()\n\nconst currentDoc = shallowRef<Doc>([])\nconst isEmpty = computed(() => currentDoc.value.length === 0)\nconst showPlaceholder = computed(() => isEmpty.value && !disabled.value)\n\nconst pickerMode = shallowRef<'mention' | 'reselect' | null>(null)\nconst pickerTriggerDom = shallowRef<HTMLElement | undefined>(undefined)\nconst reselectingSegIdx = shallowRef<number | null>(null)\nconst pickerFilter = shallowRef('')\n\nconst pickerVisible = computed(() => pickerMode.value !== null)\n\nfunction syncMention() {\n const editor = editorRef.value\n if (!editor) return\n if (pickerMode.value === 'reselect') return\n const caret = editor.getCaretOffset()\n const state = mention.update(currentDoc.value, caret)\n if (state) {\n pickerMode.value = 'mention'\n pickerFilter.value = state.filter\n pickerTriggerDom.value = containerRef.value ?? undefined\n } else if (pickerMode.value === 'mention') {\n closePicker()\n }\n}\n\nfunction closePicker() {\n pickerMode.value = null\n reselectingSegIdx.value = null\n pickerFilter.value = ''\n}\n\nonMounted(() => {\n if (!containerRef.value) return\n const initialDoc = parse(props.modelValue ?? '', variableMap.value)\n currentDoc.value = initialDoc\n\n const editor = createEditor({\n container: containerRef.value,\n cls,\n initialDoc,\n getVariableMap: () => variableMap.value,\n onChange: (doc) => {\n currentDoc.value = doc\n const value = serializeFromDoc(doc)\n if (value !== (props.modelValue ?? '')) emit('update:modelValue', value)\n syncMention()\n },\n onSelectionChange: () => {\n syncMention()\n },\n onChipReselect: ({ chipEl, segIndex }) => {\n if (disabled.value || readonly.value) return\n mention.commit()\n pickerMode.value = 'reselect'\n pickerFilter.value = ''\n pickerTriggerDom.value = chipEl\n reselectingSegIdx.value = segIndex\n },\n onChipRemove: ({ segIndex }) => {\n if (disabled.value || readonly.value) return\n editor.removeVarAt(segIndex)\n }\n })\n editorRef.value = editor\n})\n\nonBeforeUnmount(() => {\n editorRef.value?.dispose()\n})\n\nfunction serializeFromDoc(doc: Doc): string {\n let s = ''\n for (const seg of doc) s += seg.kind === 'text' ? seg.value : `{${seg.value}}`\n return s\n}\n\nwatch(\n () => props.modelValue,\n (v) => {\n const editor = editorRef.value\n if (!editor) return\n if (v === editor.getValue()) return\n editor.setValue(v ?? '')\n }\n)\n\nwatch(variableMap, () => {\n // variables 变化:重渲染以刷新 chip label / type\n const editor = editorRef.value\n if (!editor) return\n editor.setValue(editor.getValue())\n})\n\nfunction onKeydown(e: KeyboardEvent) {\n if (disabled.value || readonly.value) return\n // mention / reselect 激活时,优先把箭头键 / Enter / Esc 转给 picker\n if (pickerMode.value !== null) {\n const handledByPicker = pickerRef.value?.handleKeydown(e)\n if (handledByPicker) {\n e.preventDefault()\n return\n }\n }\n\n if (pickerMode.value === 'mention') {\n // 这些键导致 mention 退出(保留 @filter 文本,光标继续移动)\n if (e.key === ' ' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n mention.dismiss()\n closePicker()\n }\n }\n}\n\nfunction onBlur() {\n if (pickerMode.value === 'mention') {\n mention.dismiss()\n // 下一帧再关闭,避免和 picker 内 click 冲突\n void nextTick(() => closePicker())\n }\n}\n\nfunction onPickerSelect(item: VariableItem) {\n const editor = editorRef.value\n if (!editor) return\n\n if (pickerMode.value === 'mention') {\n const state = mention.getState()\n if (!state) return\n const anchor = state.anchorOffset\n const caret = editor.getCaretOffset() ?? anchor + state.filter.length + 1\n editor.replaceRangeWithVar(anchor, caret, {\n value: item.value,\n label: item.label,\n ...(item.type ? { type: item.type } : {})\n })\n mention.commit()\n } else if (pickerMode.value === 'reselect') {\n const idx = reselectingSegIdx.value\n if (idx !== null) {\n editor.replaceVarAt(idx, {\n value: item.value,\n label: item.label,\n ...(item.type ? { type: item.type } : {})\n })\n }\n }\n closePicker()\n}\n\nfunction onPickerDismiss() {\n if (pickerMode.value === 'mention') mention.dismiss()\n closePicker()\n}\n\nfunction onPickerVisibleChange(v: boolean) {\n if (!v && pickerMode.value !== null) {\n if (pickerMode.value === 'mention') mention.dismiss()\n closePicker()\n }\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqDA,MAAM,QAAQ;EAKd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,mBAAmB;EACnC,MAAM,EAAE,cAAc,kBAAkB;EACxC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;EAElF,MAAM,eAAe,eAA+B,WAAW;EAC/D,MAAM,YAAY,eAAiE,WAAW;EAE9F,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,cAAc,eAAe,kBAAkB,MAAM,SAAS,CAAC;EAErE,MAAM,YAAY,WAA6B,IAAI;EACnD,MAAM,UAAsB,cAAc;EAE1C,MAAM,aAAa,WAAgB,CAAC,CAAC;EACrC,MAAM,UAAU,eAAe,WAAW,MAAM,WAAW,CAAC;EAC5D,MAAM,kBAAkB,eAAe,QAAQ,SAAS,CAAC,SAAS,KAAK;EAEvE,MAAM,aAAa,WAA0C,IAAI;EACjE,MAAM,mBAAmB,WAAoC,KAAA,CAAS;EACtE,MAAM,oBAAoB,WAA0B,IAAI;EACxD,MAAM,eAAe,WAAW,EAAE;EAElC,MAAM,gBAAgB,eAAe,WAAW,UAAU,IAAI;EAE9D,SAAS,cAAc;GACrB,MAAM,SAAS,UAAU;GACzB,IAAI,CAAC,QAAQ;GACb,IAAI,WAAW,UAAU,YAAY;GACrC,MAAM,QAAQ,OAAO,eAAe;GACpC,MAAM,QAAQ,QAAQ,OAAO,WAAW,OAAO,KAAK;GACpD,IAAI,OAAO;IACT,WAAW,QAAQ;IACnB,aAAa,QAAQ,MAAM;IAC3B,iBAAiB,QAAQ,aAAa,SAAS,KAAA;GACjD,OAAO,IAAI,WAAW,UAAU,WAC9B,YAAY;EAEhB;EAEA,SAAS,cAAc;GACrB,WAAW,QAAQ;GACnB,kBAAkB,QAAQ;GAC1B,aAAa,QAAQ;EACvB;EAEA,gBAAgB;GACd,IAAI,CAAC,aAAa,OAAO;GACzB,MAAM,aAAa,MAAM,MAAM,cAAc,IAAI,YAAY,KAAK;GAClE,WAAW,QAAQ;GAEnB,MAAM,SAAS,aAAa;IAC1B,WAAW,aAAa;IACxB;IACA;IACA,sBAAsB,YAAY;IAClC,WAAW,QAAQ;KACjB,WAAW,QAAQ;KACnB,MAAM,QAAQ,iBAAiB,GAAG;KAClC,IAAI,WAAW,MAAM,cAAc,KAAK,KAAK,qBAAqB,KAAK;KACvE,YAAY;IACd;IACA,yBAAyB;KACvB,YAAY;IACd;IACA,iBAAiB,EAAE,QAAQ,eAAe;KACxC,IAAI,SAAS,SAAS,SAAS,OAAO;KACtC,QAAQ,OAAO;KACf,WAAW,QAAQ;KACnB,aAAa,QAAQ;KACrB,iBAAiB,QAAQ;KACzB,kBAAkB,QAAQ;IAC5B;IACA,eAAe,EAAE,eAAe;KAC9B,IAAI,SAAS,SAAS,SAAS,OAAO;KACtC,OAAO,YAAY,QAAQ;IAC7B;GACF,CAAC;GACD,UAAU,QAAQ;EACpB,CAAC;EAED,sBAAsB;GACpB,UAAU,OAAO,QAAQ;EAC3B,CAAC;EAED,SAAS,iBAAiB,KAAkB;GAC1C,IAAI,IAAI;GACR,KAAK,MAAM,OAAO,KAAK,KAAK,IAAI,SAAS,SAAS,IAAI,QAAQ,IAAI,IAAI,MAAM;GAC5E,OAAO;EACT;EAEA,YACQ,MAAM,aACX,MAAM;GACL,MAAM,SAAS,UAAU;GACzB,IAAI,CAAC,QAAQ;GACb,IAAI,MAAM,OAAO,SAAS,GAAG;GAC7B,OAAO,SAAS,KAAK,EAAE;EACzB,CACF;EAEA,MAAM,mBAAmB;GAEvB,MAAM,SAAS,UAAU;GACzB,IAAI,CAAC,QAAQ;GACb,OAAO,SAAS,OAAO,SAAS,CAAC;EACnC,CAAC;EAED,SAAS,UAAU,GAAkB;GACnC,IAAI,SAAS,SAAS,SAAS,OAAO;GAEtC,IAAI,WAAW,UAAU,MACC;QAAA,UAAU,OAAO,cAAc,CAAC,GACnC;KACnB,EAAE,eAAe;KACjB;IACF;;GAGF,IAAI,WAAW,UAAU,WAEnB;QAAA,EAAE,QAAQ,OAAO,EAAE,QAAQ,eAAe,EAAE,QAAQ,cAAc;KACpE,QAAQ,QAAQ;KAChB,YAAY;IACd;;EAEJ;EAEA,SAAS,SAAS;GAChB,IAAI,WAAW,UAAU,WAAW;IAClC,QAAQ,QAAQ;IAEhB,eAAoB,YAAY,CAAC;GACnC;EACF;EAEA,SAAS,eAAe,MAAoB;GAC1C,MAAM,SAAS,UAAU;GACzB,IAAI,CAAC,QAAQ;GAEb,IAAI,WAAW,UAAU,WAAW;IAClC,MAAM,QAAQ,QAAQ,SAAS;IAC/B,IAAI,CAAC,OAAO;IACZ,MAAM,SAAS,MAAM;IACrB,MAAM,QAAQ,OAAO,eAAe,KAAK,SAAS,MAAM,OAAO,SAAS;IACxE,OAAO,oBAAoB,QAAQ,OAAO;KACxC,OAAO,KAAK;KACZ,OAAO,KAAK;KACZ,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;IACzC,CAAC;IACD,QAAQ,OAAO;GACjB,OAAO,IAAI,WAAW,UAAU,YAAY;IAC1C,MAAM,MAAM,kBAAkB;IAC9B,IAAI,QAAQ,MACV,OAAO,aAAa,KAAK;KACvB,OAAO,KAAK;KACZ,OAAO,KAAK;KACZ,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;IACzC,CAAC;GAEL;GACA,YAAY;EACd;EAEA,SAAS,kBAAkB;GACzB,IAAI,WAAW,UAAU,WAAW,QAAQ,QAAQ;GACpD,YAAY;EACd;EAEA,SAAS,sBAAsB,GAAY;GACzC,IAAI,CAAC,KAAK,WAAW,UAAU,MAAM;IACnC,IAAI,WAAW,UAAU,WAAW,QAAQ,QAAQ;IACpD,YAAY;GACd;EACF;;GA9OE,OAAA,UAAA,GAAA,mBA0BM,OAAA,EA1BA,OAAK,eAAE,UAAA,KAAS,EAAA,GAAA;IACpB,mBAQO,OAAA;KAPL,KAAI;KACH,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,WAAA,CAAA;KACZ,iBAAe,CAAG,MAAA,QAAA,KAAQ,CAAK,MAAA,QAAA;KAC/B,cAAY,QAAA,SAAW,KAAA;KACvB,oBAAkB,MAAM;KACf;KACH;;IAGE,gBAAA,SAAX,UAAA,GAAA,mBAEM,OAAA;;KAFuB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,aAAA,CAAA;IACpC,GAAA,gBAAA,MAAM,WAAW,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA;IAGtB,YAUE,aAAA;KATI,SAAA;KAAJ,KAAI;KACH,SAAS,cAAA;KACT,eAAa,iBAAA;KACb,WAAW,MAAM;KACjB,QAAQ,aAAA;KACR,qBAAmB,MAAM,oBAAgB;KACzC,UAAQ;KACR,WAAS;KACT,oBAAgB"}
|
|
1
|
+
{"version":3,"file":"expression-editor.js","names":[],"sources":["../../../src/components/expression-editor/expression-editor.vue"],"sourcesContent":["<template>\n <div ref=\"rootEl\" :class=\"cls.b\">\n <!-- 提示行独立在边框盒(shell)之外 -->\n <div v-if=\"showHint\" :class=\"cls.e('hint')\">输入 <kbd>@</kbd> 唤起变量面板</div>\n\n <div :class=\"shellClass\">\n <div :class=\"cls.e('body')\">\n <div\n ref=\"container\"\n :class=\"cls.e('container')\"\n :contenteditable=\"!readonly && !disabled\"\n :data-empty=\"isEmpty || undefined\"\n :data-placeholder=\"props.placeholder\"\n @keydown=\"onKeydown\"\n @blur=\"onBlur\"\n ></div>\n\n <div v-if=\"showPlaceholder\" :class=\"cls.e('placeholder')\">\n {{ props.placeholder }}\n </div>\n </div>\n\n <!-- mention 面板的定位锚点:跟随 `@` 字符位置(见 positionMentionAnchor) -->\n <span ref=\"mentionAnchor\" :class=\"cls.e('mention-anchor')\" aria-hidden=\"true\"></span>\n </div>\n\n <VariablePicker\n ref=\"pickerRef\"\n :visible=\"pickerVisible\"\n :trigger-dom=\"pickerTriggerDom\"\n :variables=\"props.variables\"\n :filter=\"pickerFilter\"\n :selectable-levels=\"props.selectableLevels ?? '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 } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n shallowRef,\n useTemplateRef,\n watch\n} from 'vue'\n\nimport type { ExpressionEditorProps, VariableItem } from '../../types'\nimport VariablePicker from './components/variable-picker.vue'\nimport { createEditor, type EditorAPI } from './core/editor'\nimport { createMention, type MentionAPI } from './core/mention'\nimport { parse, type Doc } from './core/model'\nimport { createVariableMap } from './di'\n\ndefineOptions({ name: 'UExpressionEditor' })\n\nconst props = withDefaults(defineProps<ExpressionEditorProps>(), {\n placeholder: '请输入表达式,输入 @ 可插入变量',\n selectableLevels: 'leaf'\n})\n\nconst emit = defineEmits<{ (e: 'update:modelValue', value: string): void }>()\n\nconst cls = bem('expression-editor')\nconst { formProps } = injectFormContext()\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst containerRef = useTemplateRef<HTMLDivElement>('container')\nconst rootElRef = useTemplateRef<HTMLDivElement>('rootEl')\nconst mentionAnchorRef = useTemplateRef<HTMLSpanElement>('mentionAnchor')\nconst pickerRef = useTemplateRef<{ handleKeydown: (e: KeyboardEvent) => boolean }>('pickerRef')\n\n/** 视觉盒(边框 / 背景 / 聚焦光晕 / 尺寸态)挂在 shell 上,根节点只做布局 */\nconst shellClass = computed(() => [\n cls.e('shell'),\n cls.em('shell', size.value),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value)\n])\n\nconst variableMap = computed(() => createVariableMap(props.variables))\n\nconst editorRef = shallowRef<EditorAPI | null>(null)\nconst mention: MentionAPI = createMention()\n\nconst currentDoc = shallowRef<Doc>([])\nconst isEmpty = computed(() => currentDoc.value.length === 0)\nconst showPlaceholder = computed(() => isEmpty.value && !disabled.value)\nconst showHint = computed(() => isEmpty.value && !disabled.value && !readonly.value)\n\nconst pickerMode = shallowRef<'mention' | 'reselect' | null>(null)\nconst pickerTriggerDom = shallowRef<HTMLElement | undefined>(undefined)\nconst reselectingSegIdx = shallowRef<number | null>(null)\nconst pickerFilter = shallowRef('')\n\nconst pickerVisible = computed(() => pickerMode.value !== null)\n\n/** 把 mention 锚点移到 `@` 字符下方,面板据此定位 */\nfunction positionMentionAnchor(anchorOffset: number) {\n const rootEl = rootElRef.value\n const anchor = mentionAnchorRef.value\n const rect = editorRef.value?.getRectAtOffset(anchorOffset)\n if (!rootEl || !anchor || !rect) return\n // absolute 定位以 padding box 为基准,需扣除根节点边框宽度\n const rootRect = rootEl.getBoundingClientRect()\n anchor.style.left = `${rect.left - rootRect.left - rootEl.clientLeft}px`\n anchor.style.top = `${rect.bottom - rootRect.top - rootEl.clientTop}px`\n}\n\nfunction syncMention() {\n const editor = editorRef.value\n if (!editor) return\n if (pickerMode.value === 'reselect') return\n const caret = editor.getCaretOffset()\n const state = mention.update(currentDoc.value, caret)\n if (state) {\n pickerMode.value = 'mention'\n pickerFilter.value = state.filter\n positionMentionAnchor(state.anchorOffset)\n pickerTriggerDom.value = mentionAnchorRef.value ?? containerRef.value ?? undefined\n } else if (pickerMode.value === 'mention') {\n closePicker()\n }\n}\n\nfunction closePicker() {\n pickerMode.value = null\n reselectingSegIdx.value = null\n pickerFilter.value = ''\n}\n\nonMounted(() => {\n if (!containerRef.value) return\n const initialDoc = parse(props.modelValue ?? '', variableMap.value)\n currentDoc.value = initialDoc\n\n const editor = createEditor({\n container: containerRef.value,\n cls,\n initialDoc,\n getVariableMap: () => variableMap.value,\n onChange: (doc) => {\n currentDoc.value = doc\n const value = serializeFromDoc(doc)\n if (value !== (props.modelValue ?? '')) emit('update:modelValue', value)\n syncMention()\n },\n onSelectionChange: () => {\n syncMention()\n },\n onChipReselect: ({ chipEl, segIndex }) => {\n if (disabled.value || readonly.value) return\n mention.commit()\n pickerMode.value = 'reselect'\n pickerFilter.value = ''\n pickerTriggerDom.value = chipEl\n reselectingSegIdx.value = segIndex\n // chip 的 mousedown 被 preventDefault,编辑器没有焦点时点击 chip 焦点不会转移,\n // 键盘导航依赖 container 的 keydown,这里主动把焦点拉回编辑器\n containerRef.value?.focus()\n }\n })\n editorRef.value = editor\n})\n\nonBeforeUnmount(() => {\n editorRef.value?.dispose()\n})\n\nfunction serializeFromDoc(doc: Doc): string {\n let s = ''\n for (const seg of doc) s += seg.kind === 'text' ? seg.value : `{${seg.value}}`\n return s\n}\n\nwatch(\n () => props.modelValue,\n (v) => {\n const editor = editorRef.value\n if (!editor) return\n if (v === editor.getValue()) return\n editor.setValue(v ?? '')\n }\n)\n\nwatch(variableMap, () => {\n // variables 变化:重渲染以刷新 chip label / type\n const editor = editorRef.value\n if (!editor) return\n editor.setValue(editor.getValue())\n})\n\nfunction onKeydown(e: KeyboardEvent) {\n if (disabled.value || readonly.value) return\n // mention / reselect 激活时,优先把箭头键 / Enter / Esc 转给 picker\n if (pickerMode.value !== null) {\n const handledByPicker = pickerRef.value?.handleKeydown(e)\n if (handledByPicker) {\n e.preventDefault()\n return\n }\n }\n\n if (pickerMode.value === 'mention') {\n // 这些键导致 mention 退出(保留 @filter 文本,光标继续移动)\n if (e.key === ' ' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n mention.dismiss()\n closePicker()\n }\n }\n}\n\nfunction onBlur() {\n if (pickerMode.value === 'mention') {\n mention.dismiss()\n // 下一帧再关闭,避免和 picker 内 click 冲突\n void nextTick(() => closePicker())\n }\n}\n\nfunction onPickerSelect(item: VariableItem) {\n const editor = editorRef.value\n if (!editor) return\n\n if (pickerMode.value === 'mention') {\n const state = mention.getState()\n if (!state) return\n const anchor = state.anchorOffset\n const caret = editor.getCaretOffset() ?? anchor + state.filter.length + 1\n editor.replaceRangeWithVar(anchor, caret, {\n value: item.value,\n label: item.label,\n ...(item.type ? { type: item.type } : {})\n })\n mention.commit()\n } else if (pickerMode.value === 'reselect') {\n const idx = reselectingSegIdx.value\n if (idx !== null) {\n editor.replaceVarAt(idx, {\n value: item.value,\n label: item.label,\n ...(item.type ? { type: item.type } : {})\n })\n }\n }\n closePicker()\n}\n\nfunction onPickerDismiss() {\n if (pickerMode.value === 'mention') mention.dismiss()\n closePicker()\n}\n\nfunction onPickerVisibleChange(v: boolean) {\n if (!v && pickerMode.value !== null) {\n if (pickerMode.value === 'mention') mention.dismiss()\n closePicker()\n }\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -17,45 +17,108 @@
|
|
|
17
17
|
/** 暗色:`UITheme.render()` 按主题系列写入 html[data-theme] */
|
|
18
18
|
.u-expression-editor {
|
|
19
19
|
position: relative;
|
|
20
|
+
width: 100%;
|
|
21
|
+
}
|
|
22
|
+
.u-expression-editor__shell {
|
|
20
23
|
background-color: var(--u-bg-color-top);
|
|
21
24
|
border-width: var(--u-border-width);
|
|
22
25
|
border-style: var(--u-border-style);
|
|
23
26
|
border-color: var(--u-border-muted-color);
|
|
24
27
|
border-radius: var(--u-radius-default);
|
|
25
|
-
|
|
28
|
+
transition: border-color var(--u-transition-fast) var(--u-transition-ease), box-shadow var(--u-transition-fast) var(--u-transition-ease);
|
|
26
29
|
}
|
|
27
|
-
.u-expression-
|
|
30
|
+
.u-expression-editor__shell:not(.is-disabled):not(.is-readonly):hover {
|
|
28
31
|
border-color: var(--u-color-primary);
|
|
29
32
|
}
|
|
30
|
-
.u-expression-
|
|
33
|
+
.u-expression-editor__shell:not(.is-disabled):not(.is-readonly):focus-within {
|
|
31
34
|
border-color: var(--u-color-primary);
|
|
35
|
+
box-shadow: var(--u-focus-ring);
|
|
32
36
|
outline: none;
|
|
33
37
|
}
|
|
34
|
-
.u-expression-
|
|
38
|
+
.u-expression-editor__shell.is-disabled {
|
|
35
39
|
background-color: var(--u-color-disabled);
|
|
36
40
|
cursor: not-allowed;
|
|
37
41
|
border-color: var(--u-border-muted-color);
|
|
38
42
|
}
|
|
39
|
-
.u-expression-
|
|
43
|
+
.u-expression-editor__shell.is-disabled:hover {
|
|
40
44
|
border-color: var(--u-border-muted-color);
|
|
41
45
|
}
|
|
42
|
-
.u-expression-
|
|
46
|
+
.u-expression-editor__shell.is-readonly {
|
|
43
47
|
background-color: var(--u-bg-color-middle);
|
|
44
48
|
cursor: default;
|
|
45
49
|
border-color: var(--u-border-muted-color);
|
|
46
50
|
user-select: text;
|
|
47
51
|
}
|
|
48
|
-
.u-expression-
|
|
52
|
+
.u-expression-editor__shell.is-readonly:hover {
|
|
49
53
|
border-color: var(--u-border-muted-color);
|
|
50
54
|
}
|
|
55
|
+
.u-expression-editor__shell--small {
|
|
56
|
+
min-height: var(--u-form-component-height-small);
|
|
57
|
+
padding: var(--u-gap-small);
|
|
58
|
+
}
|
|
59
|
+
.u-expression-editor__shell--small .u-expression-editor__placeholder {
|
|
60
|
+
font-size: var(--u-font-size-main-small);
|
|
61
|
+
}
|
|
62
|
+
.u-expression-editor__shell--small .u-expression-editor__container {
|
|
63
|
+
font-size: var(--u-font-size-main-small);
|
|
64
|
+
}
|
|
65
|
+
.u-expression-editor__shell--default {
|
|
66
|
+
min-height: var(--u-form-component-height-default);
|
|
67
|
+
padding: var(--u-gap-default);
|
|
68
|
+
}
|
|
69
|
+
.u-expression-editor__shell--default .u-expression-editor__placeholder {
|
|
70
|
+
font-size: var(--u-font-size-main-default);
|
|
71
|
+
}
|
|
72
|
+
.u-expression-editor__shell--default .u-expression-editor__container {
|
|
73
|
+
font-size: var(--u-font-size-main-default);
|
|
74
|
+
}
|
|
75
|
+
.u-expression-editor__shell--large {
|
|
76
|
+
min-height: var(--u-form-component-height-large);
|
|
77
|
+
padding: var(--u-gap-large);
|
|
78
|
+
}
|
|
79
|
+
.u-expression-editor__shell--large .u-expression-editor__placeholder {
|
|
80
|
+
font-size: var(--u-font-size-main-large);
|
|
81
|
+
}
|
|
82
|
+
.u-expression-editor__shell--large .u-expression-editor__container {
|
|
83
|
+
font-size: var(--u-font-size-main-large);
|
|
84
|
+
}
|
|
51
85
|
.u-expression-editor__placeholder {
|
|
52
86
|
position: absolute;
|
|
87
|
+
top: 0;
|
|
88
|
+
left: 0;
|
|
53
89
|
color: var(--u-text-color-placeholder);
|
|
54
90
|
pointer-events: none;
|
|
55
91
|
user-select: none;
|
|
56
92
|
transition: opacity 0.2s ease;
|
|
57
93
|
font-weight: 400;
|
|
58
94
|
}
|
|
95
|
+
.u-expression-editor__body {
|
|
96
|
+
position: relative;
|
|
97
|
+
}
|
|
98
|
+
.u-expression-editor__hint {
|
|
99
|
+
font-size: var(--u-font-size-main-small);
|
|
100
|
+
color: var(--u-text-color-placeholder);
|
|
101
|
+
user-select: none;
|
|
102
|
+
margin-bottom: 4px;
|
|
103
|
+
}
|
|
104
|
+
.u-expression-editor__mention-anchor {
|
|
105
|
+
position: absolute;
|
|
106
|
+
width: 0;
|
|
107
|
+
height: 0;
|
|
108
|
+
pointer-events: none;
|
|
109
|
+
}
|
|
110
|
+
.u-expression-editor__hint kbd, .u-expression-editor__picker-hint kbd {
|
|
111
|
+
display: inline-block;
|
|
112
|
+
min-width: 18px;
|
|
113
|
+
padding: 1px 4px;
|
|
114
|
+
border: var(--u-border);
|
|
115
|
+
border-radius: var(--u-radius-small);
|
|
116
|
+
font-size: 11px;
|
|
117
|
+
line-height: 1.4;
|
|
118
|
+
text-align: center;
|
|
119
|
+
color: var(--u-text-color-second);
|
|
120
|
+
background-color: var(--u-bg-color-top);
|
|
121
|
+
}
|
|
59
122
|
.u-expression-editor__container {
|
|
60
123
|
position: relative;
|
|
61
124
|
outline: none;
|
|
@@ -93,80 +156,65 @@
|
|
|
93
156
|
background-color: var(--u-expression-editor-chip-bg, var(--u-color-primary-light-7));
|
|
94
157
|
box-shadow: 0 1px 4px var(--u-shadow-color);
|
|
95
158
|
}
|
|
96
|
-
.u-expression-editor__chip:hover .u-expression-editor__chip-close {
|
|
97
|
-
opacity: 1;
|
|
98
|
-
max-width: 14px;
|
|
99
|
-
margin-left: 2px;
|
|
100
|
-
}
|
|
101
159
|
.u-expression-editor__chip.is-focused {
|
|
102
160
|
box-shadow: 0 0 0 2px var(--u-color-primary-light-7);
|
|
103
161
|
}
|
|
104
162
|
.u-expression-editor__chip-label {
|
|
105
163
|
pointer-events: none;
|
|
106
164
|
}
|
|
107
|
-
.u-expression-editor__chip-close {
|
|
108
|
-
display: inline-flex;
|
|
109
|
-
align-items: center;
|
|
110
|
-
justify-content: center;
|
|
111
|
-
width: 14px;
|
|
112
|
-
max-width: 0;
|
|
113
|
-
margin-left: 0;
|
|
114
|
-
overflow: hidden;
|
|
115
|
-
font-size: 14px;
|
|
116
|
-
line-height: 1;
|
|
117
|
-
color: var(--u-color-primary);
|
|
118
|
-
opacity: 0;
|
|
119
|
-
transition: opacity 0.12s ease, max-width 0.12s ease, margin-left 0.12s ease;
|
|
120
|
-
cursor: pointer;
|
|
121
|
-
}
|
|
122
|
-
.u-expression-editor__chip-close:hover {
|
|
123
|
-
transform: scale(1.1);
|
|
124
|
-
}
|
|
125
165
|
.u-expression-editor__picker {
|
|
126
|
-
|
|
166
|
+
margin: calc(var(--u-gap-default) * -1);
|
|
167
|
+
min-width: 240px;
|
|
168
|
+
display: flex;
|
|
169
|
+
flex-direction: column;
|
|
170
|
+
overflow: hidden;
|
|
127
171
|
background-color: var(--u-bg-color-top);
|
|
172
|
+
border: var(--u-border);
|
|
173
|
+
border-radius: var(--u-radius-default);
|
|
174
|
+
backdrop-filter: var(--u-bg-filter);
|
|
175
|
+
-webkit-backdrop-filter: var(--u-bg-filter);
|
|
128
176
|
}
|
|
129
177
|
.u-expression-editor__picker-body {
|
|
178
|
+
flex: 1 1 auto;
|
|
179
|
+
min-height: 0;
|
|
130
180
|
display: flex;
|
|
131
181
|
align-items: stretch;
|
|
132
|
-
min-height: 200px;
|
|
133
182
|
}
|
|
134
183
|
.u-expression-editor__panel {
|
|
135
184
|
flex: 1 1 auto;
|
|
136
185
|
min-width: 0;
|
|
137
186
|
max-height: 320px;
|
|
187
|
+
display: flex;
|
|
188
|
+
flex-direction: column;
|
|
138
189
|
}
|
|
139
190
|
.u-expression-editor__panel-list {
|
|
140
|
-
|
|
141
|
-
min-height:
|
|
191
|
+
flex: 1 1 auto;
|
|
192
|
+
min-height: 0;
|
|
142
193
|
}
|
|
143
194
|
.u-expression-editor__panel-content {
|
|
144
|
-
padding: 4px
|
|
195
|
+
padding: 4px;
|
|
145
196
|
}
|
|
146
197
|
.u-expression-editor__item {
|
|
147
|
-
padding: 6px 12px;
|
|
148
|
-
cursor: pointer;
|
|
149
|
-
user-select: none;
|
|
150
198
|
display: flex;
|
|
151
199
|
align-items: center;
|
|
152
200
|
justify-content: space-between;
|
|
153
|
-
gap:
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
font-size: 13px;
|
|
157
|
-
line-height: 1.4;
|
|
201
|
+
gap: var(--u-gap-default);
|
|
202
|
+
height: var(--u-form-component-height-default);
|
|
203
|
+
padding: 0 var(--u-gap-default);
|
|
158
204
|
border-radius: var(--u-radius-small);
|
|
159
|
-
|
|
205
|
+
font-size: var(--u-font-size-main-default);
|
|
206
|
+
color: var(--u-text-color-main);
|
|
207
|
+
cursor: pointer;
|
|
208
|
+
user-select: none;
|
|
209
|
+
transition: background-color 0.15s ease, color 0.15s ease;
|
|
160
210
|
}
|
|
161
211
|
.u-expression-editor__item.is-active {
|
|
162
|
-
background-color: var(--u-color-
|
|
163
|
-
color: var(--u-text-color-
|
|
164
|
-
}
|
|
165
|
-
.u-expression-editor__item.is-active .u-expression-editor__item-expand {
|
|
166
|
-
color: var(--u-text-color-white);
|
|
212
|
+
background-color: var(--u-bg-color-hover);
|
|
213
|
+
color: var(--u-text-color-title);
|
|
167
214
|
}
|
|
168
215
|
.u-expression-editor__item-label {
|
|
169
216
|
flex: 1;
|
|
217
|
+
min-width: 0;
|
|
170
218
|
overflow: hidden;
|
|
171
219
|
text-overflow: ellipsis;
|
|
172
220
|
white-space: nowrap;
|
|
@@ -175,31 +223,59 @@
|
|
|
175
223
|
flex-shrink: 0;
|
|
176
224
|
color: var(--u-text-color-placeholder);
|
|
177
225
|
font-size: 12px;
|
|
226
|
+
box-sizing: content-box;
|
|
227
|
+
padding: 6px;
|
|
228
|
+
margin: -6px;
|
|
229
|
+
border-radius: var(--u-radius-small);
|
|
230
|
+
cursor: pointer;
|
|
231
|
+
transition: color 0.15s ease, background-color 0.15s ease;
|
|
232
|
+
}
|
|
233
|
+
.u-expression-editor__item-expand:hover {
|
|
234
|
+
color: var(--u-color-primary);
|
|
235
|
+
background-color: var(--u-bg-color-hover);
|
|
178
236
|
}
|
|
179
237
|
.u-expression-editor__empty {
|
|
180
238
|
flex: 1;
|
|
181
239
|
padding: 32px 16px;
|
|
182
240
|
text-align: center;
|
|
183
241
|
}
|
|
184
|
-
.u-expression-
|
|
242
|
+
.u-expression-editor__picker-hint {
|
|
185
243
|
display: flex;
|
|
186
244
|
align-items: center;
|
|
187
245
|
flex-wrap: wrap;
|
|
246
|
+
gap: 4px 12px;
|
|
188
247
|
padding: 6px 10px;
|
|
248
|
+
border-top: var(--u-border);
|
|
249
|
+
font-size: var(--u-font-size-main-small);
|
|
250
|
+
color: var(--u-text-color-placeholder);
|
|
251
|
+
user-select: none;
|
|
252
|
+
}
|
|
253
|
+
.u-expression-editor__picker-hint span {
|
|
254
|
+
display: inline-flex;
|
|
255
|
+
align-items: center;
|
|
256
|
+
gap: 3px;
|
|
257
|
+
}
|
|
258
|
+
.u-expression-editor__breadcrumbs {
|
|
259
|
+
display: flex;
|
|
260
|
+
align-items: center;
|
|
261
|
+
flex-wrap: wrap;
|
|
262
|
+
gap: 2px;
|
|
263
|
+
padding: 6px 8px;
|
|
264
|
+
background-color: var(--u-bg-color-middle);
|
|
189
265
|
border-bottom: var(--u-border);
|
|
190
|
-
font-size:
|
|
266
|
+
font-size: var(--u-font-size-main-small);
|
|
191
267
|
color: var(--u-text-color-second);
|
|
192
268
|
}
|
|
193
269
|
.u-expression-editor__breadcrumb-item {
|
|
194
270
|
display: inline-flex;
|
|
195
271
|
align-items: center;
|
|
196
|
-
gap:
|
|
272
|
+
gap: 2px;
|
|
197
273
|
}
|
|
198
274
|
.u-expression-editor__breadcrumb-link {
|
|
199
|
-
|
|
200
|
-
transition: color 0.12s ease, background-color 0.12s ease;
|
|
201
|
-
padding: 2px 6px;
|
|
275
|
+
padding: 3px 6px;
|
|
202
276
|
border-radius: var(--u-radius-small);
|
|
277
|
+
cursor: pointer;
|
|
278
|
+
transition: color 0.15s ease, background-color 0.15s ease;
|
|
203
279
|
}
|
|
204
280
|
.u-expression-editor__breadcrumb-link:hover {
|
|
205
281
|
color: var(--u-color-primary);
|
|
@@ -210,7 +286,7 @@
|
|
|
210
286
|
font-weight: 600;
|
|
211
287
|
}
|
|
212
288
|
.u-expression-editor__breadcrumb-separator {
|
|
213
|
-
font-size:
|
|
289
|
+
font-size: 12px;
|
|
214
290
|
color: var(--u-text-color-placeholder);
|
|
215
291
|
}
|
|
216
292
|
.u-expression-editor__path-preview {
|
|
@@ -218,7 +294,7 @@
|
|
|
218
294
|
border-left: var(--u-border);
|
|
219
295
|
padding: 8px 12px;
|
|
220
296
|
background-color: var(--u-bg-color-middle);
|
|
221
|
-
font-size:
|
|
297
|
+
font-size: var(--u-font-size-main-small);
|
|
222
298
|
}
|
|
223
299
|
.u-expression-editor__path-preview-title {
|
|
224
300
|
color: var(--u-text-color-second);
|
|
@@ -236,52 +312,15 @@
|
|
|
236
312
|
gap: 4px;
|
|
237
313
|
line-height: 1.6;
|
|
238
314
|
color: var(--u-text-color-main);
|
|
315
|
+
padding-left: calc(var(--depth, 0) * 12px);
|
|
239
316
|
}
|
|
240
317
|
.u-expression-editor__path-tree-item.is-active {
|
|
241
318
|
color: var(--u-color-primary);
|
|
242
319
|
font-weight: 600;
|
|
243
320
|
}
|
|
244
|
-
.u-expression-editor__path-tree-branch {
|
|
245
|
-
color: var(--u-text-color-placeholder);
|
|
246
|
-
}
|
|
247
321
|
.u-expression-editor__path-tree-label {
|
|
322
|
+
min-width: 0;
|
|
248
323
|
overflow: hidden;
|
|
249
324
|
text-overflow: ellipsis;
|
|
250
325
|
white-space: nowrap;
|
|
251
326
|
}
|
|
252
|
-
.u-expression-editor--small {
|
|
253
|
-
min-height: var(--u-form-component-height-small);
|
|
254
|
-
padding: var(--u-gap-small);
|
|
255
|
-
}
|
|
256
|
-
.u-expression-editor--small .u-expression-editor__placeholder {
|
|
257
|
-
top: var(--u-gap-small);
|
|
258
|
-
left: var(--u-gap-small);
|
|
259
|
-
font-size: var(--u-font-size-main-small);
|
|
260
|
-
}
|
|
261
|
-
.u-expression-editor--small .u-expression-editor__container {
|
|
262
|
-
font-size: var(--u-font-size-main-small);
|
|
263
|
-
}
|
|
264
|
-
.u-expression-editor--default {
|
|
265
|
-
min-height: var(--u-form-component-height-default);
|
|
266
|
-
padding: var(--u-gap-default);
|
|
267
|
-
}
|
|
268
|
-
.u-expression-editor--default .u-expression-editor__placeholder {
|
|
269
|
-
top: var(--u-gap-default);
|
|
270
|
-
left: var(--u-gap-default);
|
|
271
|
-
font-size: var(--u-font-size-main-default);
|
|
272
|
-
}
|
|
273
|
-
.u-expression-editor--default .u-expression-editor__container {
|
|
274
|
-
font-size: var(--u-font-size-main-default);
|
|
275
|
-
}
|
|
276
|
-
.u-expression-editor--large {
|
|
277
|
-
min-height: var(--u-form-component-height-large);
|
|
278
|
-
padding: var(--u-gap-large);
|
|
279
|
-
}
|
|
280
|
-
.u-expression-editor--large .u-expression-editor__placeholder {
|
|
281
|
-
top: var(--u-gap-large);
|
|
282
|
-
left: var(--u-gap-large);
|
|
283
|
-
font-size: var(--u-font-size-main-large);
|
|
284
|
-
}
|
|
285
|
-
.u-expression-editor--large .u-expression-editor__container {
|
|
286
|
-
font-size: var(--u-font-size-main-large);
|
|
287
|
-
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","names":[],"sources":["../../../src/components/form/form.vue"],"sourcesContent":["<template>\n <u-grid\n tag=\"form\"\n ref=\"grid\"\n @submit.prevent\n
|
|
1
|
+
{"version":3,"file":"form.js","names":[],"sources":["../../../src/components/form/form.vue"],"sourcesContent":["<template>\n <u-grid\n tag=\"form\"\n ref=\"grid\"\n @submit.prevent\n :cols=\"cols || breakpointCols\"\n :class=\"[cls.b, bem.is('readonly', readonly)]\"\n >\n <template\n v-for=\"{ node, isFormItem, formItemProps, field, modelValue, renderKey } of getSlotsNodes()\"\n :key=\"renderKey\"\n >\n <u-form-item v-if=\"!isFormItem && field\" v-bind=\"formItemProps\">\n <component\n :is=\"node\"\n :model-value=\"modelValue ?? o(model ?? {}).get(field)\"\n @update:model-value=\"handleUpdateValue(field, $event)\"\n />\n <div v-if=\"shouldShowModified(field)\" :class=\"cls.e('data-before')\">\n <span :class=\"cls.e('changed-tag')\">{{ modifiedLabel }}</span>\n <component :is=\"createModifiedPreview(node, field)\" />\n </div>\n </u-form-item>\n\n <component v-else :is=\"node\" />\n </template>\n </u-grid>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { o } from '@cat-kit/core'\nimport { bem } from '@veltra/utils'\nimport { provideFormContext } from '@veltra/utils'\nimport { nextTick, toRef, useTemplateRef, type VNode } from 'vue'\n\nimport type { BreakCols, FormProps, _FormExposed, FormEmits } from '../../types'\nimport { UFormItem } from '../form-item'\nimport { UGrid } from '../grid'\nimport { isFieldModified } from './is-field-modified'\nimport { useFormFields } from './use-form-fields'\nimport { forkUnmountedVNode, useNodeInterceptor } from './use-node-interceptor'\n\ndefineOptions({ name: 'UForm' })\n\nconst props = withDefaults(defineProps<FormProps>(), { modifiedLabel: '变更前:' })\n\nconst emit = defineEmits<FormEmits>()\n\ndefineSlots<{ default(props?: { data: Record<string, any> | undefined }): any }>()\n\nconst cls = bem('form')\nconst formItemCls = bem('form-item')\nconst gridRef = useTemplateRef('grid')\n\nconst breakpointCols: BreakCols = { xs: 1, md: 2, lg: 3, xl: 4, default: 4 }\n\nconst {\n validate: runValidate,\n clearValidate,\n reset,\n registerField,\n unregisterField,\n shouldValidate,\n getBaselineModel\n} = useFormFields({ props })\n\nasync function validate(keys?: string[]) {\n const valid = await runValidate(keys)\n if (!valid) {\n await nextTick()\n\n gridRef.value?.el\n ?.querySelector(`.${formItemCls.e('error-text')}`)\n ?.scrollIntoView({ block: 'center' })\n }\n return valid\n}\n\nfunction handleFieldUpdate(field: string, value: any) {\n emit('field:update', field, value)\n}\n\nprovideFormContext({\n formProps: props,\n registerField,\n unregisterField,\n validateFields: validate,\n shouldValidate,\n handleFieldUpdate\n})\n\nconst { getSlotsNodes } = useNodeInterceptor()\n\nfunction handleUpdateValue(field: string, value: any) {\n if (!props.model) return\n o(props.model).set(field, value)\n}\n\nfunction getBaselineFieldValue(field: string) {\n return o(getBaselineModel() ?? {}).get(field)\n}\n\nfunction createModifiedPreview(node: VNode, field: string) {\n return forkUnmountedVNode(node, { readonly: true, modelValue: getBaselineFieldValue(field) })\n}\n\nfunction shouldShowModified(field: string) {\n if (!props.showModified) return false\n const baseline = getBaselineModel()\n if (!baseline || !props.model) return false\n const current = o(props.model).get(field)\n const initial = o(baseline).get(field)\n return isFieldModified(current, initial)\n}\n\ndefineExpose<_FormExposed>({ el: toRef(() => gridRef.value?.el), validate, clearValidate, reset })\n</script>\n"],"mappings":""}
|
|
@@ -90,7 +90,6 @@ var form_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
|
|
|
90
90
|
tag: "form",
|
|
91
91
|
ref: "grid",
|
|
92
92
|
onSubmit: _cache[0] || (_cache[0] = withModifiers(() => {}, ["prevent"])),
|
|
93
|
-
gap: "0 12px",
|
|
94
93
|
cols: __props.cols || breakpointCols,
|
|
95
94
|
class: normalizeClass([unref(cls).b, unref(bem).is("readonly", __props.readonly)])
|
|
96
95
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/form/form.vue"],"sourcesContent":["<template>\n <u-grid\n tag=\"form\"\n ref=\"grid\"\n @submit.prevent\n
|
|
1
|
+
{"version":3,"file":"form.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/form/form.vue"],"sourcesContent":["<template>\n <u-grid\n tag=\"form\"\n ref=\"grid\"\n @submit.prevent\n :cols=\"cols || breakpointCols\"\n :class=\"[cls.b, bem.is('readonly', readonly)]\"\n >\n <template\n v-for=\"{ node, isFormItem, formItemProps, field, modelValue, renderKey } of getSlotsNodes()\"\n :key=\"renderKey\"\n >\n <u-form-item v-if=\"!isFormItem && field\" v-bind=\"formItemProps\">\n <component\n :is=\"node\"\n :model-value=\"modelValue ?? o(model ?? {}).get(field)\"\n @update:model-value=\"handleUpdateValue(field, $event)\"\n />\n <div v-if=\"shouldShowModified(field)\" :class=\"cls.e('data-before')\">\n <span :class=\"cls.e('changed-tag')\">{{ modifiedLabel }}</span>\n <component :is=\"createModifiedPreview(node, field)\" />\n </div>\n </u-form-item>\n\n <component v-else :is=\"node\" />\n </template>\n </u-grid>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { o } from '@cat-kit/core'\nimport { bem } from '@veltra/utils'\nimport { provideFormContext } from '@veltra/utils'\nimport { nextTick, toRef, useTemplateRef, type VNode } from 'vue'\n\nimport type { BreakCols, FormProps, _FormExposed, FormEmits } from '../../types'\nimport { UFormItem } from '../form-item'\nimport { UGrid } from '../grid'\nimport { isFieldModified } from './is-field-modified'\nimport { useFormFields } from './use-form-fields'\nimport { forkUnmountedVNode, useNodeInterceptor } from './use-node-interceptor'\n\ndefineOptions({ name: 'UForm' })\n\nconst props = withDefaults(defineProps<FormProps>(), { modifiedLabel: '变更前:' })\n\nconst emit = defineEmits<FormEmits>()\n\ndefineSlots<{ default(props?: { data: Record<string, any> | undefined }): any }>()\n\nconst cls = bem('form')\nconst formItemCls = bem('form-item')\nconst gridRef = useTemplateRef('grid')\n\nconst breakpointCols: BreakCols = { xs: 1, md: 2, lg: 3, xl: 4, default: 4 }\n\nconst {\n validate: runValidate,\n clearValidate,\n reset,\n registerField,\n unregisterField,\n shouldValidate,\n getBaselineModel\n} = useFormFields({ props })\n\nasync function validate(keys?: string[]) {\n const valid = await runValidate(keys)\n if (!valid) {\n await nextTick()\n\n gridRef.value?.el\n ?.querySelector(`.${formItemCls.e('error-text')}`)\n ?.scrollIntoView({ block: 'center' })\n }\n return valid\n}\n\nfunction handleFieldUpdate(field: string, value: any) {\n emit('field:update', field, value)\n}\n\nprovideFormContext({\n formProps: props,\n registerField,\n unregisterField,\n validateFields: validate,\n shouldValidate,\n handleFieldUpdate\n})\n\nconst { getSlotsNodes } = useNodeInterceptor()\n\nfunction handleUpdateValue(field: string, value: any) {\n if (!props.model) return\n o(props.model).set(field, value)\n}\n\nfunction getBaselineFieldValue(field: string) {\n return o(getBaselineModel() ?? {}).get(field)\n}\n\nfunction createModifiedPreview(node: VNode, field: string) {\n return forkUnmountedVNode(node, { readonly: true, modelValue: getBaselineFieldValue(field) })\n}\n\nfunction shouldShowModified(field: string) {\n if (!props.showModified) return false\n const baseline = getBaselineModel()\n if (!baseline || !props.model) return false\n const current = o(props.model).get(field)\n const initial = o(baseline).get(field)\n return isFieldModified(current, initial)\n}\n\ndefineExpose<_FormExposed>({ el: toRef(() => gridRef.value?.el), validate, clearValidate, reset })\n</script>\n"],"mappings":"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"}
|
|
@@ -15,15 +15,20 @@
|
|
|
15
15
|
* --u-height-small: 24px;
|
|
16
16
|
*/
|
|
17
17
|
/** 暗色:`UITheme.render()` 按主题系列写入 html[data-theme] */
|
|
18
|
+
.u-form {
|
|
19
|
+
gap: 0 12px;
|
|
20
|
+
}
|
|
18
21
|
.u-form.is-readonly {
|
|
19
|
-
gap:
|
|
22
|
+
gap: 10px 12px;
|
|
20
23
|
}
|
|
21
24
|
.u-form.is-readonly .u-form-item__label {
|
|
22
|
-
|
|
25
|
+
color: var(--u-text-color-second);
|
|
23
26
|
}
|
|
24
27
|
.u-form.is-readonly .u-form-item__content {
|
|
28
|
+
padding: 4px 12px;
|
|
29
|
+
color: var(--u-text-color-main);
|
|
25
30
|
background-color: var(--u-bg-color-middle);
|
|
26
|
-
|
|
31
|
+
border-radius: var(--u-radius-default);
|
|
27
32
|
}
|
|
28
33
|
.u-form__data-before {
|
|
29
34
|
display: flex;
|
|
@@ -4,33 +4,33 @@ import _sfc_main$2 from "./scroll/scroll.js";
|
|
|
4
4
|
import _sfc_main$3 from "./tip/tip.js";
|
|
5
5
|
import _sfc_main$4 from "./dropdown/dropdown.js";
|
|
6
6
|
import input_default from "./input/input.js";
|
|
7
|
-
import _sfc_main$5 from "./
|
|
8
|
-
import _sfc_main$6 from "./
|
|
9
|
-
import _sfc_main$7 from "./
|
|
10
|
-
import _sfc_main$8 from "./tabs/tabs-
|
|
11
|
-
import _sfc_main$9 from "./tabs/tabs.js";
|
|
12
|
-
import _sfc_main$10 from "./
|
|
13
|
-
import _sfc_main$11 from "./
|
|
14
|
-
import _sfc_main$12 from "./tree
|
|
15
|
-
import _sfc_main$13 from "./
|
|
16
|
-
import _sfc_main$14 from "./
|
|
17
|
-
import _sfc_main$15 from "./
|
|
18
|
-
import _sfc_main$16 from "./grid/grid
|
|
7
|
+
import _sfc_main$5 from "./loading/loading.js";
|
|
8
|
+
import _sfc_main$6 from "./select/select.js";
|
|
9
|
+
import _sfc_main$7 from "./condition-editor/condition-editor.js";
|
|
10
|
+
import _sfc_main$8 from "./tabs/tabs-horizontal.js";
|
|
11
|
+
import _sfc_main$9 from "./tabs/tabs-vertical.js";
|
|
12
|
+
import _sfc_main$10 from "./tabs/tabs.js";
|
|
13
|
+
import _sfc_main$11 from "./checkbox/checkbox.js";
|
|
14
|
+
import _sfc_main$12 from "./tree/tree.js";
|
|
15
|
+
import _sfc_main$13 from "./tree-select/tree-select.js";
|
|
16
|
+
import _sfc_main$14 from "./code-editor/code-editor.js";
|
|
17
|
+
import _sfc_main$15 from "./drawer/drawer.js";
|
|
18
|
+
import _sfc_main$16 from "./grid/grid.js";
|
|
19
|
+
import _sfc_main$17 from "./grid/grid-item.js";
|
|
19
20
|
import form_item_default from "./form-item/form-item.js";
|
|
20
21
|
import form_default from "./form/form.js";
|
|
21
|
-
import _sfc_main$
|
|
22
|
-
import _sfc_main$
|
|
23
|
-
import _sfc_main$
|
|
24
|
-
import _sfc_main$
|
|
25
|
-
import _sfc_main$
|
|
26
|
-
import _sfc_main$
|
|
27
|
-
import _sfc_main$
|
|
28
|
-
import _sfc_main$
|
|
29
|
-
import _sfc_main$
|
|
30
|
-
import _sfc_main$
|
|
31
|
-
import _sfc_main$
|
|
32
|
-
import _sfc_main$
|
|
33
|
-
import _sfc_main$29 from "./loading/loading.js";
|
|
22
|
+
import _sfc_main$18 from "./button/button.js";
|
|
23
|
+
import _sfc_main$19 from "./button/button-group.js";
|
|
24
|
+
import _sfc_main$20 from "./message-confirm/message-confirm.js";
|
|
25
|
+
import _sfc_main$21 from "./calendar/calendar.js";
|
|
26
|
+
import _sfc_main$22 from "./radio/radio.js";
|
|
27
|
+
import _sfc_main$23 from "./card/card.js";
|
|
28
|
+
import _sfc_main$24 from "./card/card-header.js";
|
|
29
|
+
import _sfc_main$25 from "./card/card-cover.js";
|
|
30
|
+
import _sfc_main$26 from "./card/card-content.js";
|
|
31
|
+
import _sfc_main$27 from "./card/card-action.js";
|
|
32
|
+
import _sfc_main$28 from "./date-panel/date-panel.js";
|
|
33
|
+
import _sfc_main$29 from "./date-range-picker/date-range-picker.js";
|
|
34
34
|
import _sfc_main$30 from "./progress-nodes/progress-nodes.js";
|
|
35
35
|
import _sfc_main$31 from "./auto-complete/auto-complete.js";
|
|
36
36
|
import _sfc_main$32 from "./progress/progress.js";
|
|
@@ -108,4 +108,4 @@ import { defineBatchEditColumns } from "./batch-edit/helper.js";
|
|
|
108
108
|
import "./batch-edit/index.js";
|
|
109
109
|
import { defineTableColumns } from "./table/use-columns.js";
|
|
110
110
|
import "./table/index.js";
|
|
111
|
-
export { type EvaluateOptions as ConditionEvaluateOptions, ContextmenuPanelDIKey, ContextmenuRootDIKey, _sfc_main$57 as UAction, action_group_default as UActionGroup, _sfc_main$31 as UAutoComplete, _sfc_main$84 as UBadge, _sfc_main$58 as UBatchEdit, _sfc_main$81 as UBreadcrumb, _sfc_main$
|
|
111
|
+
export { type EvaluateOptions as ConditionEvaluateOptions, ContextmenuPanelDIKey, ContextmenuRootDIKey, _sfc_main$57 as UAction, action_group_default as UActionGroup, _sfc_main$31 as UAutoComplete, _sfc_main$84 as UBadge, _sfc_main$58 as UBatchEdit, _sfc_main$81 as UBreadcrumb, _sfc_main$18 as UButton, _sfc_main$19 as UButtonGroup, _sfc_main$21 as UCalendar, _sfc_main$23 as UCard, _sfc_main$27 as UCardAction, _sfc_main$26 as UCardContent, _sfc_main$25 as UCardCover, _sfc_main$24 as UCardHeader, _sfc_main$60 as UCascade, _sfc_main$48 as UCheckTag, _sfc_main$11 as UCheckbox, _sfc_main$36 as UCheckboxButton, _sfc_main$78 as UCheckboxGroup, _sfc_main$14 as UCodeEditor, _sfc_main$44 as UCollapse, _sfc_main$45 as UCollapseItem, _sfc_main$7 as UConditionEditor, _sfc_main$49 as UContextmenu, _sfc_main$28 as UDatePanel, _sfc_main$62 as UDatePicker, _sfc_main$29 as UDateRangePicker, _sfc_main$52 as UDialog, _sfc_main$15 as UDrawer, _sfc_main$4 as UDropdown, _sfc_main$73 as UDualNav, _sfc_main$1 as UEmpty, _sfc_main$53 as UExpressionEditor, _sfc_main$41 as UFilePicker, _sfc_main$79 as UFileViewer, _sfc_main$83 as UFloatButton, form_default as UForm, form_item_default as UFormItem, _sfc_main$39 as UGanttChart, _sfc_main$16 as UGrid, _sfc_main$75 as UGridInput, _sfc_main$17 as UGridItem, _sfc_main$66 as UGroupInput, _sfc_main$74 as UGroupNav, _sfc_main as UIcon, _sfc_main$86 as UImageCropper, input_default as UInput, _sfc_main$55 as UKbd, _sfc_main$34 as ULayout, _sfc_main$67 as UList, _sfc_main$68 as UListItem, _sfc_main$5 as ULoading, _sfc_main$40 as UMessage, _sfc_main$20 as UMessageConfirm, _sfc_main$37 as UMultiSelect, _sfc_main$65 as UMultiTreeSelect, _sfc_main$72 as UNav, _sfc_main$70 as UNavItem, _sfc_main$71 as UNavSub, NodeRender as UNodeRender, _sfc_main$33 as UNotification, _sfc_main$51 as UNumber, _sfc_main$42 as UNumberInput, _sfc_main$43 as UNumberRangeInput, _sfc_main$82 as UPaginator, _sfc_main$63 as UPalette, _sfc_main$50 as UPasswordInput, _sfc_main$56 as UPopConfirm, _sfc_main$32 as UProgress, _sfc_main$30 as UProgressNodes, _sfc_main$22 as URadio, _sfc_main$77 as URadioGroup, _sfc_main$69 as URichTextEditor, _sfc_main$2 as UScroll, _sfc_main$85 as USegment, _sfc_main$6 as USelect, _sfc_main$38 as USlider, _sfc_main$61 as USteps, _sfc_main$76 as USwitch, _sfc_main$46 as UTable, _sfc_main$47 as UTableEditor, _sfc_main$10 as UTabs, _sfc_main$8 as UTabsHorizontal, _sfc_main$9 as UTabsVertical, _sfc_main$35 as UTag, _sfc_main$80 as UText, _sfc_main$59 as UTextarea, _sfc_main$64 as UTheme, _sfc_main$3 as UTip, _sfc_main$12 as UTree, _sfc_main$13 as UTreeSelect, _sfc_main$54 as UWatermark, contextmenu, createEmptyGroup, createEmptyLeaf, defineBatchEditColumns, defineTableColumns, evaluate as evaluateConditionExpression, message, messageConfirm, notification, vLoading };
|