@veltra/desktop 1.3.5 → 1.3.6

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 (58) hide show
  1. package/dist/components/action/action-group.vue.d.ts +1 -1
  2. package/dist/components/action/action.vue.d.ts +1 -1
  3. package/dist/components/cascade/cascade.js +8 -2
  4. package/dist/components/cascade/cascade.js.map +1 -1
  5. package/dist/components/cascade/style2.css +4 -0
  6. package/dist/components/date-range-picker/date-range-picker.js +5 -2
  7. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  8. package/dist/components/date-range-picker/style2.css +4 -0
  9. package/dist/components/empty/empty.vue.d.ts +1 -1
  10. package/dist/components/form-item/form-item.js.map +1 -1
  11. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js +2 -2
  12. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/components/form-item/style2.css +2 -1
  14. package/dist/components/grid-input/style2.css +3 -0
  15. package/dist/components/multi-select/multi-select.js +67 -40
  16. package/dist/components/multi-select/multi-select.js.map +1 -1
  17. package/dist/components/multi-select/multi-select.vue.d.ts +4 -4
  18. package/dist/components/multi-select/style2.css +23 -10
  19. package/dist/components/multi-tree-select/multi-tree-select.js +52 -35
  20. package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
  21. package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +1 -1
  22. package/dist/components/multi-tree-select/style2.css +26 -16
  23. package/dist/components/progress-nodes/progress-nodes.vue.d.ts +1 -1
  24. package/dist/components/select/select.js +159 -95
  25. package/dist/components/select/select.js.map +1 -1
  26. package/dist/components/select/style2.css +4 -17
  27. package/dist/components/select/use-options.js +67 -26
  28. package/dist/components/select/use-options.js.map +1 -1
  29. package/dist/components/steps/steps.vue.d.ts +2 -2
  30. package/dist/components/tabs/tabs-horizontal.vue.d.ts +2 -2
  31. package/dist/components/tabs/tabs-vertical.vue.d.ts +2 -2
  32. package/dist/components/tabs/tabs.vue.d.ts +2 -2
  33. package/dist/components/textarea/style2.css +1 -0
  34. package/dist/components/textarea/textarea.vue.d.ts +1 -1
  35. package/dist/components/tree/tree.vue.d.ts +1 -1
  36. package/dist/components/tree-select/style2.css +6 -15
  37. package/dist/components/tree-select/tree-select.js +95 -41
  38. package/dist/components/tree-select/tree-select.js.map +1 -1
  39. package/dist/components/tree-select/tree-select.vue.d.ts +1 -1
  40. package/package.json +6 -6
  41. package/src/components/cascade/cascade.vue +15 -2
  42. package/src/components/cascade/style.scss +5 -0
  43. package/src/components/date-range-picker/date-range-picker.vue +9 -1
  44. package/src/components/date-range-picker/style.scss +5 -0
  45. package/src/components/form-item/form-item.vue +2 -2
  46. package/src/components/form-item/style.scss +2 -1
  47. package/src/components/grid-input/style.scss +1 -0
  48. package/src/components/multi-select/multi-select.vue +50 -19
  49. package/src/components/multi-select/style.scss +27 -4
  50. package/src/components/multi-tree-select/multi-tree-select.vue +34 -14
  51. package/src/components/multi-tree-select/style.scss +28 -9
  52. package/src/components/select/__test__/select.test.ts +110 -0
  53. package/src/components/select/select.vue +130 -46
  54. package/src/components/select/style.scss +5 -14
  55. package/src/components/select/use-options.ts +83 -39
  56. package/src/components/textarea/style.scss +1 -0
  57. package/src/components/tree-select/style.scss +4 -8
  58. package/src/components/tree-select/tree-select.vue +90 -17
@@ -7,8 +7,8 @@ type __VLS_Slots = {
7
7
  };
8
8
  declare const __VLS_base: import("vue").DefineComponent<ActionGroupProps, _ActionGroupExposed, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<ActionGroupProps> & Readonly<{}>, {
9
9
  type: import("@veltra/utils").ColorType;
10
- size: "small" | "default" | "large";
11
10
  text: boolean;
11
+ size: "small" | "default" | "large";
12
12
  circle: boolean;
13
13
  max: number;
14
14
  loading: boolean;
@@ -15,8 +15,8 @@ declare const __VLS_base: import("vue").DefineComponent<ActionProps, {}, {}, {},
15
15
  onRun?: (() => any) | undefined;
16
16
  }>, {
17
17
  type: ButtonType;
18
- size: import("@veltra/utils").ComponentSize;
19
18
  text: boolean;
19
+ size: import("@veltra/utils").ComponentSize;
20
20
  circle: boolean;
21
21
  loading: boolean;
22
22
  inDropdown: boolean;
@@ -146,6 +146,11 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
146
146
  emit("clear");
147
147
  }
148
148
  const qs = shallowRef("");
149
+ const dropdownVisible = shallowRef(false);
150
+ const handleDropdownVisible = (visible) => {
151
+ dropdownVisible.value = visible;
152
+ if (!visible) qs.value = "";
153
+ };
149
154
  watch([qs, forest], ([qs, forest]) => {
150
155
  const { filterable } = props;
151
156
  if (!filterable || !qs) {
@@ -183,7 +188,8 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
183
188
  unref(cls).b,
184
189
  unref(bem).is("disabled", unref(disabled)),
185
190
  unref(bem).is("multiple", __props.multiple),
186
- unref(cls).m(unref(size))
191
+ unref(cls).m(unref(size)),
192
+ unref(bem).is("focus", __props.multiple && dropdownVisible.value)
187
193
  ],
188
194
  "content-class": [unref(cls).e("panel"), unref(cls).em("panel", unref(size))],
189
195
  trigger: "click",
@@ -193,7 +199,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
193
199
  width: "auto",
194
200
  onMouseenter: _cache[1] || (_cache[1] = ($event) => hovered.value = true),
195
201
  onMouseleave: _cache[2] || (_cache[2] = ($event) => hovered.value = false),
196
- "onUpdate:visible": _cache[3] || (_cache[3] = ($event) => !$event && (qs.value = ""))
202
+ "onUpdate:visible": handleDropdownVisible
197
203
  }), {
198
204
  trigger: withCtx(() => [
199
205
  createCommentVNode(" 单选展示 "),
@@ -1 +1 @@
1
- {"version":3,"file":"cascade.js","names":["$attrs"],"sources":["../../../src/components/cascade/cascade.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n v-bind=\"$attrs\"\n :class=\"[cls.b, bem.is('disabled', disabled), bem.is('multiple', multiple), cls.m(size)]\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n trigger=\"click\"\n ref=\"dropdownRef\"\n :disabled=\"disabled\"\n width=\"auto\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n @update:visible=\"!$event && (qs = '')\"\n >\n <template #trigger>\n <!-- 单选展示 -->\n <u-input\n v-if=\"!multiple\"\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n native-readonly\n :model-value=\"displayedValue\"\n @clear=\"handleClear\"\n >\n <template #suffix>\n <u-icon :class=\"cls.e('arrow')\"><ArrowDown /></u-icon>\n </template>\n </u-input>\n\n <!-- 多选展示 -->\n <template v-if=\"multiple\">\n <span :class=\"cls.e('placeholder')\" v-show=\"!modelValue?.length\">\n {{ placeholder }}\n </span>\n\n <div v-if=\"modelValue?.length\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"tag of tags\"\n :key=\"tag.value\"\n :closable=\"!disabled\"\n @close=\"handleCloseTag(tag)\"\n >\n {{ tag.label }}\n </u-tag>\n <u-tag v-if=\"restTag\"> {{ restTag }}+ </u-tag>\n </div>\n\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"clearable && modelValue?.length && hovered && !disabled\"\n :class=\"cls.e('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n\n <u-icon :class=\"cls.e('arrow')\" v-else><ArrowDown /></u-icon>\n </transition>\n </template>\n </template>\n\n <template #content>\n <!-- 过滤 -->\n <div v-if=\"filterable\" :class=\"cls.e('panel-filter')\">\n <u-input placeholder=\"输入关键字进行过滤\" v-model=\"qs\" :size=\"size\" clearable>\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n\n <div :class=\"cls.e('content')\" v-if=\"panelItemList.length\">\n <UCascadePanelItem\n v-for=\"({ nodes, key }, index) of panelItemList\"\n :data=\"nodes\"\n :key=\"key\"\n :panel-index=\"index\"\n :value=\"selectedNodeKeys[index]\"\n @click=\"handleClick\"\n @check=\"handleCheck\"\n />\n </div>\n\n <div :class=\"cls.e('empty')\" v-else>\n <UEmpty />\n </div>\n </template>\n </u-dropdown>\n\n <!-- 只读 -->\n <template v-else>\n <div :class=\"[cls.m(size)]\" v-if=\"multiple\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"tag of tags\" :key=\"tag.value\">\n {{ tag.label }}\n </u-tag>\n </div>\n </div>\n <template v-else>\n {{ displayedValue || FORM_EMPTY_CONTENT }}\n </template>\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Forest, o } from '@cat-kit/core'\nimport { useFormFallbackProps, useUserAction } from '@veltra/compositions'\nimport { ArrowDown, Close, Search } from '@veltra/icons/normal'\nimport { bem, fieldKey, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, provide, shallowRef, triggerRef, watch } from 'vue'\n\nimport type { CascadeProps, CascadeEmits, DropdownExposed } from '../../types'\nimport { UDropdown } from '../dropdown'\nimport { UEmpty } from '../empty'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UTag } from '../tag'\nimport UCascadePanelItem from './cascade-panel-item.vue'\nimport { CascadeDIKey } from './di'\nimport { CascadeNode } from './node'\nimport { useCheck } from './use-check'\nimport { useDataMap } from './use-data-map'\nimport { useSelect } from './use-select'\n\ndefineOptions({ name: 'UCascade', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CascadeProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n separator: '/',\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n childrenKey: 'children',\n filterable: false,\n data: () => [],\n visibilityLimit: 3,\n showFullPath: true\n})\n\nconst emit = defineEmits<CascadeEmits>()\n\nconst cls = bem('cascade')\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\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nconst forest = computed(() => {\n return new Forest<Record<string, unknown>, any>({\n data: (props.data ?? []) as Record<string, unknown>[],\n childrenKey: props.childrenKey,\n createNode: (data, index, depth, _forest, parent) => {\n if (!data) {\n return new CascadeNode({ data, index, depth, value: '', label: '', parent })\n }\n\n return new CascadeNode({\n data,\n index,\n depth,\n value: o(data).get(valueKey.value) ?? '',\n label: o(data).get(labelKey.value) ?? '',\n parent\n })\n }\n })\n})\n\nconst { dataMap } = useDataMap({ props, forest })\n\nconst { userAction, isUserActive } = useUserAction()\n\nconst {\n displayedValue,\n selectItem,\n updateSingleValue,\n panelItemList,\n getPanelItemList,\n createPanelItem,\n selectedNodeKeys\n} = useSelect({ props, emit, dataMap, forest, isUserActive, dropdownRef })\n\nconst { hovered, tags, restTag, updateMultipleValue, handleCloseTag, checkItem, checkedSet } =\n useCheck({ props, forest, getPanelItemList, emit, dataMap, isUserActive, disabled, readonly })\n\nconst commitSingleSelect = userAction((item: CascadeNode) => {\n if (!props.strict) {\n updateSingleValue()\n } else if (!item.children?.length) {\n updateSingleValue()\n }\n})\n\nfunction handleClick(panelIndex: number, item: CascadeNode) {\n selectItem(panelIndex, item)\n\n if (!props.multiple) {\n commitSingleSelect(item)\n }\n}\n\nconst handleCheck = userAction((item: CascadeNode, checked: boolean) => {\n checkItem(item, checked)\n})\n\nfunction handleClear() {\n if (props.multiple) {\n checkedSet.value.clear()\n triggerRef(checkedSet)\n updateMultipleValue()\n } else {\n selectedNodeKeys.value = []\n updateSingleValue()\n }\n\n emit('clear')\n}\n\n// 过滤\nconst qs = shallowRef<string>('')\n\nwatch([qs, forest], ([qs, forest]) => {\n const { filterable } = props\n if (!filterable || !qs) {\n forest.dfs((node) => {\n node.visible = true\n })\n getPanelItemList(forest.roots)\n return\n }\n\n const cache = new Set<CascadeNode>()\n\n forest.dfs((node) => {\n if (node.label?.toLowerCase().includes(qs.toLowerCase())) {\n node.visible = true\n let parent = node.parent\n while (parent && !cache.has(parent)) {\n parent.visible = true\n cache.add(parent)\n parent = parent.parent\n }\n } else {\n node.visible = false\n }\n })\n\n panelItemList.value = [createPanelItem(forest.roots)]\n})\n\nprovide(CascadeDIKey, { cls, size, disabled, readonly, cascadeProps: props, checkedSet })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiIA,MAAM,QAAQ;EAed,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,SAAS;EAEzB,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;EAED,MAAM,cAAc,WAA4B;EAEhD,MAAM,SAAS,eAAe;GAC5B,OAAO,IAAI,OAAqC;IAC9C,MAAO,MAAM,QAAQ,CAAC;IACtB,aAAa,MAAM;IACnB,aAAa,MAAM,OAAO,OAAO,SAAS,WAAW;KACnD,IAAI,CAAC,MACH,OAAO,IAAI,YAAY;MAAE;MAAM;MAAO;MAAO,OAAO;MAAI,OAAO;MAAI;KAAO,CAAC;KAG7E,OAAO,IAAI,YAAY;MACrB;MACA;MACA;MACA,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,SAAS,KAAK,KAAK;MACtC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,SAAS,KAAK,KAAK;MACtC;KACF,CAAC;IACH;GACF,CAAC;EACH,CAAC;EAED,MAAM,EAAE,YAAY,WAAW;GAAE;GAAO;EAAO,CAAC;EAEhD,MAAM,EAAE,YAAY,iBAAiB,cAAc;EAEnD,MAAM,EACJ,gBACA,YACA,mBACA,eACA,kBACA,iBACA,qBACE,UAAU;GAAE;GAAO;GAAM;GAAS;GAAQ;GAAc;EAAY,CAAC;EAEzE,MAAM,EAAE,SAAS,MAAM,SAAS,qBAAqB,gBAAgB,WAAW,eAC9E,SAAS;GAAE;GAAO;GAAQ;GAAkB;GAAM;GAAS;GAAc;GAAU;EAAS,CAAC;EAE/F,MAAM,qBAAqB,YAAY,SAAsB;GAC3D,IAAI,CAAC,MAAM,QACT,kBAAkB;QACb,IAAI,CAAC,KAAK,UAAU,QACzB,kBAAkB;EAEtB,CAAC;EAED,SAAS,YAAY,YAAoB,MAAmB;GAC1D,WAAW,YAAY,IAAI;GAE3B,IAAI,CAAC,MAAM,UACT,mBAAmB,IAAI;EAE3B;EAEA,MAAM,cAAc,YAAY,MAAmB,YAAqB;GACtE,UAAU,MAAM,OAAO;EACzB,CAAC;EAED,SAAS,cAAc;GACrB,IAAI,MAAM,UAAU;IAClB,WAAW,MAAM,MAAM;IACvB,WAAW,UAAU;IACrB,oBAAoB;GACtB,OAAO;IACL,iBAAiB,QAAQ,CAAC;IAC1B,kBAAkB;GACpB;GAEA,KAAK,OAAO;EACd;EAGA,MAAM,KAAK,WAAmB,EAAE;EAEhC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,YAAY;GACpC,MAAM,EAAE,eAAe;GACvB,IAAI,CAAC,cAAc,CAAC,IAAI;IACtB,OAAO,KAAK,SAAS;KACnB,KAAK,UAAU;IACjB,CAAC;IACD,iBAAiB,OAAO,KAAK;IAC7B;GACF;GAEA,MAAM,wBAAQ,IAAI,IAAiB;GAEnC,OAAO,KAAK,SAAS;IACnB,IAAI,KAAK,OAAO,YAAY,CAAC,CAAC,SAAS,GAAG,YAAY,CAAC,GAAG;KACxD,KAAK,UAAU;KACf,IAAI,SAAS,KAAK;KAClB,OAAO,UAAU,CAAC,MAAM,IAAI,MAAM,GAAG;MACnC,OAAO,UAAU;MACjB,MAAM,IAAI,MAAM;MAChB,SAAS,OAAO;KAClB;IACF,OACE,KAAK,UAAU;GAEnB,CAAC;GAED,cAAc,QAAQ,CAAC,gBAAgB,OAAO,KAAK,CAAC;EACtD,CAAC;EAED,QAAQ,cAAc;GAAE;GAAK;GAAM;GAAU;GAAU,cAAc;GAAO;EAAW,CAAC;;WAtQ7E,MAAA,QAAA,KAAA,UAAA,GADT,YAwFa,MAAA,WAAA,GAxFb,WAwFa,EAAA,KAAA,EAAA,GAtFHA,KAAAA,QAAM;IACb,OAAK;KAAG,MAAA,GAAA,CAAG,CAAC;KAAG,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,MAAA,QAAA,CAAQ;KAAG,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,QAAA,QAAQ;KAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI;IAAA;IACrF,iBAAa,CAAG,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,GAAW,MAAA,GAAA,CAAG,CAAC,GAAE,SAAU,MAAA,IAAA,CAAI,CAAA;IACrD,SAAQ;aACJ;IAAJ,KAAI;IACH,UAAU,MAAA,QAAA;IACX,OAAM;IACL,cAAU,OAAA,OAAA,OAAA,MAAA,WAAE,QAAA,QAAO;IACnB,cAAU,OAAA,OAAA,OAAA,MAAA,WAAE,QAAA,QAAO;IACnB,oBAAc,OAAA,OAAA,OAAA,MAAA,WAAA,CAAG,WAAW,GAAA,QAAE;;IAEpB,SAAO,cACH;KAAb,mBAAA,QAAA;MAES,QAAA,YAAA,UAAA,GADT,YAaU,MAAA,aAAA,GAAA;;MAXP,MAAM,MAAA,IAAA;MACN,UAAU,MAAA,QAAA;MACV,aAAa,QAAA;MACb,WAAW,QAAA;MACZ,mBAAA;MACC,eAAa,MAAA,cAAA;MACb,SAAO;;MAEG,QAAM,cACuC,CAAtD,YAAsD,MAAA,WAAA,GAAA,EAA7C,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA,EAAA,GAAA;8BAAwB,CAAb,YAAa,MAAA,SAAA,CAAA,CAAA,CAAA;;;;;;;;;;;KAIjD,mBAAA,QAAA;KACgB,QAAA,YAAA,UAAA,GAAhB,mBA4BW,UAAA,EAAA,KAAA,EAAA,GAAA;qBA3BT,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,aAAA,CAAA,EAAA,GAAA,gBACd,QAAA,WAAW,GAAA,CAAA,GAAA,CAAA,CAAA,OAAA,CAD6B,QAAA,YAAY,MAAM,CAAA,CAAA;MAIpD,QAAA,YAAY,UAAA,UAAA,GAAvB,mBAUM,OAAA;;OAV0B,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;4BAC1C,mBAOQ,UAAA,MAAA,WANQ,MAAA,IAAA,IAAP,QAAG;2BADZ,YAOQ,MAAA,WAAA,GAAA;QALL,KAAK,IAAI;QACT,UAAQ,CAAG,MAAA,QAAA;QACX,UAAK,WAAE,MAAA,cAAA,CAAc,CAAC,GAAG;;+BAEX,CAAA,gBAAA,gBAAZ,IAAI,KAAK,GAAA,CAAA,CAAA,CAAA;;;iBAED,MAAA,OAAA,KAAA,UAAA,GAAb,YAA8C,MAAA,WAAA,GAAA,EAAA,KAAA,EAAA,GAAA;8BAAV,CAAA,gBAAA,gBAAV,MAAA,OAAA,CAAO,IAAG,MAAE,CAAA,CAAA,CAAA;;;MAGxC,YAUa,YAAA;OAVD,MAAK;OAAU,MAAK;;8BAOrB,CALD,QAAA,aAAa,QAAA,YAAY,UAAU,MAAA,OAAA,KAAO,CAAK,MAAA,QAAA,KAAA,UAAA,GADvD,YAMS,MAAA,WAAA,GAAA;;QAJN,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;QACZ,SAAK,cAAO,aAAW,CAAA,MAAA,CAAA;;+BAEf,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA;;yCAGX,YAA6D,MAAA,WAAA,GAAA;;QAApD,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;;+BAA+B,CAAb,YAAa,MAAA,SAAA,CAAA,CAAA,CAAA;;;;;;;IAK/C,SAAO,cACL;KAAX,mBAAA,MAAA;KACW,QAAA,cAAA,UAAA,GAAX,mBAMM,OAAA;;MANkB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,cAAA,CAAA;SAClC,YAIU,MAAA,aAAA,GAAA;MAJD,aAAY;kBAAqB,GAAA;mEAAA,GAAE,QAAA;MAAG,MAAM,MAAA,IAAA;MAAM,WAAA;;MAC9C,QAAM,cACY,CAA3B,YAA2B,MAAA,WAAA,GAAA,MAAA;8BAAT,CAAV,YAAU,MAAA,MAAA,CAAA,CAAA,CAAA;;;;;KAKa,MAAA,aAAA,CAAa,CAAC,UAAA,UAAA,GAAnD,mBAUM,OAAA;;MAVA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA;2BAChB,mBAQE,UAAA,MAAA,WAPkC,MAAA,aAAA,IAAa,EAArC,OAAO,OAAO,UAAK;0BAD/B,YAQE,aAAA;OANC,MAAM;OACD;OACL,eAAa;OACb,OAAO,MAAA,gBAAA,CAAgB,CAAC;OACxB,SAAO;OACP,SAAO,MAAA,WAAA;;;;;;;qCAIZ,mBAEM,OAAA;;MAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;SAChB,YAAU,MAAA,WAAA,CAAA,CAAA,GAAA,CAAA;;;;;;;uBAMhB,mBAWW,UAAA,EAAA,KAAA,EAAA,GAAA,CAZX,mBAAA,MAAA,GAEoC,QAAA,YAAA,UAAA,GAAlC,mBAMM,OAAA;;IANA,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI,CAAA,CAAA;OACtB,mBAIM,OAAA,EAJA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GAAA,EAAA,UAAA,IAAA,GAChB,mBAEQ,UAAA,MAAA,WAFa,MAAA,IAAA,IAAP,QAAG;wBAAjB,YAEQ,MAAA,WAAA,GAAA,EAFoB,KAAK,IAAI,MAAA,GAAA;4BACpB,CAAA,gBAAA,gBAAZ,IAAI,KAAK,GAAA,CAAA,CAAA,CAAA;;;wCAIlB,mBAEW,UAAA,EAAA,KAAA,EAAA,GAAA,CAAA,gBAAA,gBADN,MAAA,cAAA,KAAkB,MAAA,kBAAA,CAAkB,GAAA,CAAA,CAAA,GAAA,EAAA,EAAA,GAAA,EAAA"}
1
+ {"version":3,"file":"cascade.js","names":["$attrs"],"sources":["../../../src/components/cascade/cascade.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n v-bind=\"$attrs\"\n :class=\"[\n cls.b,\n bem.is('disabled', disabled),\n bem.is('multiple', multiple),\n cls.m(size),\n bem.is('focus', multiple && dropdownVisible)\n ]\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n trigger=\"click\"\n ref=\"dropdownRef\"\n :disabled=\"disabled\"\n width=\"auto\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n @update:visible=\"handleDropdownVisible\"\n >\n <template #trigger>\n <!-- 单选展示 -->\n <u-input\n v-if=\"!multiple\"\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n native-readonly\n :model-value=\"displayedValue\"\n @clear=\"handleClear\"\n >\n <template #suffix>\n <u-icon :class=\"cls.e('arrow')\"><ArrowDown /></u-icon>\n </template>\n </u-input>\n\n <!-- 多选展示 -->\n <template v-if=\"multiple\">\n <span :class=\"cls.e('placeholder')\" v-show=\"!modelValue?.length\">\n {{ placeholder }}\n </span>\n\n <div v-if=\"modelValue?.length\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"tag of tags\"\n :key=\"tag.value\"\n :closable=\"!disabled\"\n @close=\"handleCloseTag(tag)\"\n >\n {{ tag.label }}\n </u-tag>\n <u-tag v-if=\"restTag\"> {{ restTag }}+ </u-tag>\n </div>\n\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"clearable && modelValue?.length && hovered && !disabled\"\n :class=\"cls.e('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n\n <u-icon :class=\"cls.e('arrow')\" v-else><ArrowDown /></u-icon>\n </transition>\n </template>\n </template>\n\n <template #content>\n <!-- 过滤 -->\n <div v-if=\"filterable\" :class=\"cls.e('panel-filter')\">\n <u-input placeholder=\"输入关键字进行过滤\" v-model=\"qs\" :size=\"size\" clearable>\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n\n <div :class=\"cls.e('content')\" v-if=\"panelItemList.length\">\n <UCascadePanelItem\n v-for=\"({ nodes, key }, index) of panelItemList\"\n :data=\"nodes\"\n :key=\"key\"\n :panel-index=\"index\"\n :value=\"selectedNodeKeys[index]\"\n @click=\"handleClick\"\n @check=\"handleCheck\"\n />\n </div>\n\n <div :class=\"cls.e('empty')\" v-else>\n <UEmpty />\n </div>\n </template>\n </u-dropdown>\n\n <!-- 只读 -->\n <template v-else>\n <div :class=\"[cls.m(size)]\" v-if=\"multiple\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"tag of tags\" :key=\"tag.value\">\n {{ tag.label }}\n </u-tag>\n </div>\n </div>\n <template v-else>\n {{ displayedValue || FORM_EMPTY_CONTENT }}\n </template>\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Forest, o } from '@cat-kit/core'\nimport { useFormFallbackProps, useUserAction } from '@veltra/compositions'\nimport { ArrowDown, Close, Search } from '@veltra/icons/normal'\nimport { bem, fieldKey, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, provide, shallowRef, triggerRef, watch } from 'vue'\n\nimport type { CascadeProps, CascadeEmits, DropdownExposed } from '../../types'\nimport { UDropdown } from '../dropdown'\nimport { UEmpty } from '../empty'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UTag } from '../tag'\nimport UCascadePanelItem from './cascade-panel-item.vue'\nimport { CascadeDIKey } from './di'\nimport { CascadeNode } from './node'\nimport { useCheck } from './use-check'\nimport { useDataMap } from './use-data-map'\nimport { useSelect } from './use-select'\n\ndefineOptions({ name: 'UCascade', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<CascadeProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n separator: '/',\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n childrenKey: 'children',\n filterable: false,\n data: () => [],\n visibilityLimit: 3,\n showFullPath: true\n})\n\nconst emit = defineEmits<CascadeEmits>()\n\nconst cls = bem('cascade')\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\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nconst forest = computed(() => {\n return new Forest<Record<string, unknown>, any>({\n data: (props.data ?? []) as Record<string, unknown>[],\n childrenKey: props.childrenKey,\n createNode: (data, index, depth, _forest, parent) => {\n if (!data) {\n return new CascadeNode({ data, index, depth, value: '', label: '', parent })\n }\n\n return new CascadeNode({\n data,\n index,\n depth,\n value: o(data).get(valueKey.value) ?? '',\n label: o(data).get(labelKey.value) ?? '',\n parent\n })\n }\n })\n})\n\nconst { dataMap } = useDataMap({ props, forest })\n\nconst { userAction, isUserActive } = useUserAction()\n\nconst {\n displayedValue,\n selectItem,\n updateSingleValue,\n panelItemList,\n getPanelItemList,\n createPanelItem,\n selectedNodeKeys\n} = useSelect({ props, emit, dataMap, forest, isUserActive, dropdownRef })\n\nconst { hovered, tags, restTag, updateMultipleValue, handleCloseTag, checkItem, checkedSet } =\n useCheck({ props, forest, getPanelItemList, emit, dataMap, isUserActive, disabled, readonly })\n\nconst commitSingleSelect = userAction((item: CascadeNode) => {\n if (!props.strict) {\n updateSingleValue()\n } else if (!item.children?.length) {\n updateSingleValue()\n }\n})\n\nfunction handleClick(panelIndex: number, item: CascadeNode) {\n selectItem(panelIndex, item)\n\n if (!props.multiple) {\n commitSingleSelect(item)\n }\n}\n\nconst handleCheck = userAction((item: CascadeNode, checked: boolean) => {\n checkItem(item, checked)\n})\n\nfunction handleClear() {\n if (props.multiple) {\n checkedSet.value.clear()\n triggerRef(checkedSet)\n updateMultipleValue()\n } else {\n selectedNodeKeys.value = []\n updateSingleValue()\n }\n\n emit('clear')\n}\n\n// 过滤\nconst qs = shallowRef<string>('')\n\nconst dropdownVisible = shallowRef(false)\n\nconst handleDropdownVisible = (visible: boolean) => {\n dropdownVisible.value = visible\n if (!visible) qs.value = ''\n}\n\nwatch([qs, forest], ([qs, forest]) => {\n const { filterable } = props\n if (!filterable || !qs) {\n forest.dfs((node) => {\n node.visible = true\n })\n getPanelItemList(forest.roots)\n return\n }\n\n const cache = new Set<CascadeNode>()\n\n forest.dfs((node) => {\n if (node.label?.toLowerCase().includes(qs.toLowerCase())) {\n node.visible = true\n let parent = node.parent\n while (parent && !cache.has(parent)) {\n parent.visible = true\n cache.add(parent)\n parent = parent.parent\n }\n } else {\n node.visible = false\n }\n })\n\n panelItemList.value = [createPanelItem(forest.roots)]\n})\n\nprovide(CascadeDIKey, { cls, size, disabled, readonly, cascadeProps: props, checkedSet })\n</script>\n"],"mappings":"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"}
@@ -32,6 +32,10 @@
32
32
  .u-cascade.is-multiple:hover {
33
33
  border-color: var(--u-color-primary);
34
34
  }
35
+ .u-cascade.is-multiple.is-focus {
36
+ border-color: var(--u-color-primary);
37
+ box-shadow: var(--u-focus-ring);
38
+ }
35
39
  .u-cascade--small.is-multiple {
36
40
  min-height: var(--u-form-component-height-small);
37
41
  border-radius: var(--u-radius-small);
@@ -44,11 +44,13 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
44
44
  const props = __props;
45
45
  const emit = __emit;
46
46
  const cls = bem("date-range-picker");
47
+ const dropdownVisible = shallowRef(false);
47
48
  const className = computed(() => {
48
49
  return [
49
50
  cls.b,
50
51
  cls.m(size.value),
51
- bem.is("disabled", disabled.value)
52
+ bem.is("disabled", disabled.value),
53
+ bem.is("focus", dropdownVisible.value)
52
54
  ];
53
55
  });
54
56
  const { formProps } = injectFormContext();
@@ -102,7 +104,8 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
102
104
  ref: dropdownRef,
103
105
  disabled: unref(disabled),
104
106
  onMouseenter: _cache[0] || (_cache[0] = ($event) => hovered.value = true),
105
- onMouseleave: _cache[1] || (_cache[1] = ($event) => hovered.value = false)
107
+ onMouseleave: _cache[1] || (_cache[1] = ($event) => hovered.value = false),
108
+ "onUpdate:visible": _cache[2] || (_cache[2] = ($event) => dropdownVisible.value = $event)
106
109
  }), {
107
110
  trigger: withCtx(() => [
108
111
  createElementVNode("input", {
@@ -1 +1 @@
1
- {"version":3,"file":"date-range-picker.js","names":["$attrs"],"sources":["../../../src/components/date-range-picker/date-range-picker.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n v-bind=\"$attrs\"\n :class=\"className\"\n trigger=\"click\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n width=\"auto\"\n ref=\"dropdownRef\"\n :disabled=\"disabled\"\n @mouseenter.native=\"hovered = true\"\n @mouseleave.native=\"hovered = false\"\n >\n <template #trigger>\n <input\n type=\"text\"\n :class=\"cls.e('input')\"\n :value=\"displayedOfStart\"\n :placeholder=\"placeholder[0]\"\n readonly\n />\n <span :class=\"cls.e('separator')\">至</span>\n <input\n type=\"text\"\n :class=\"cls.e('input')\"\n :value=\"displayedOfEnd\"\n :placeholder=\"placeholder[1]\"\n readonly\n />\n\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <UIcon\n v-if=\"clearable && modelValue && hovered && !disabled\"\n :class=\"[cls.e('icon'), cls.e('clear')]\"\n title=\"清除\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </UIcon>\n\n <u-icon :class=\"cls.e('icon')\" v-else><Calendar /></u-icon>\n </Transition>\n </template>\n\n <template #content>\n <UDatePanel\n range\n :type\n :disabled-date\n :size\n :range-date=\"currentRangeDate\"\n @select:range-date=\"handleSelect\"\n />\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ displayedOfStart || FORM_EMPTY_CONTENT }} 至\n {{ displayedOfEnd || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { date, type Dater } from '@cat-kit/core'\nimport { useFormFallbackProps, useUserAction } from '@veltra/compositions'\nimport { Calendar, Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport type { DateRangePickerEmits, DateRangePickerProps, DropdownExposed } from '../../types'\nimport { UDatePanel } from '../date-panel'\nimport { UDropdown } from '../dropdown'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UDateRangePicker', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<DateRangePickerProps>(), {\n placeholder: () => ['起始日期', '结束日期'],\n type: 'date',\n disabled: undefined,\n readonly: undefined,\n clearable: true\n})\n\nconst emit = defineEmits<DateRangePickerEmits>()\n\nconst cls = bem('date-range-picker')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), bem.is('disabled', disabled.value)]\n})\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nconst { userAction, isUserActive } = useUserAction()\n\nconst currentRangeDate = shallowRef<[Dater, Dater]>()\n\nconst displayedOfStart = computed(() => {\n return props.modelValue?.[0]\n})\n\nconst displayedOfEnd = computed(() => {\n return props.modelValue?.[1]\n})\n\nconst formatStr = computed(() => {\n const { format, type } = props\n if (format) return format\n if (type === 'date') return 'yyyy-MM-dd'\n if (type === 'month') return 'yyyy-MM'\n if (type === 'year') return 'yyyy'\n return 'yyyy-MM-dd'\n})\n\nwatch(\n () => props.modelValue,\n (val) => {\n if (isUserActive()) return\n if (val?.length === 2) {\n currentRangeDate.value = [date(val[0]), date(val[1])]\n } else {\n currentRangeDate.value = undefined\n }\n },\n { immediate: true }\n)\n\nconst commitSelectedRange = userAction((rangeDate: [Dater, Dater] | undefined) => {\n currentRangeDate.value = rangeDate\n emit('update:modelValue', rangeDate?.map((d) => d.format(formatStr.value)) as [string, string])\n})\n\nasync function handleSelect(rangeDate: [Dater, Dater] | undefined) {\n await commitSelectedRange(rangeDate)\n dropdownRef.value?.close()\n}\n\nconst hovered = shallowRef(false)\n\nfunction handleClear() {\n currentRangeDate.value = undefined\n emit('update:modelValue', undefined)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6EA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,mBAAmB;EAEnC,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,EAAE,KAAK,KAAK;IAAG,IAAI,GAAG,YAAY,SAAS,KAAK;GAAC;EACtE,CAAC;EAED,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,cAAc,WAA4B;EAEhD,MAAM,EAAE,YAAY,iBAAiB,cAAc;EAEnD,MAAM,mBAAmB,WAA2B;EAEpD,MAAM,mBAAmB,eAAe;GACtC,OAAO,MAAM,aAAa;EAC5B,CAAC;EAED,MAAM,iBAAiB,eAAe;GACpC,OAAO,MAAM,aAAa;EAC5B,CAAC;EAED,MAAM,YAAY,eAAe;GAC/B,MAAM,EAAE,QAAQ,SAAS;GACzB,IAAI,QAAQ,OAAO;GACnB,IAAI,SAAS,QAAQ,OAAO;GAC5B,IAAI,SAAS,SAAS,OAAO;GAC7B,IAAI,SAAS,QAAQ,OAAO;GAC5B,OAAO;EACT,CAAC;EAED,YACQ,MAAM,aACX,QAAQ;GACP,IAAI,aAAa,GAAG;GACpB,IAAI,KAAK,WAAW,GAClB,iBAAiB,QAAQ,CAAC,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;QAEpD,iBAAiB,QAAQ,KAAA;EAE7B,GACA,EAAE,WAAW,KAAK,CACpB;EAEA,MAAM,sBAAsB,YAAY,cAA0C;GAChF,iBAAiB,QAAQ;GACzB,KAAK,qBAAqB,WAAW,KAAK,MAAM,EAAE,OAAO,UAAU,KAAK,CAAC,CAAqB;EAChG,CAAC;EAED,eAAe,aAAa,WAAuC;GACjE,MAAM,oBAAoB,SAAS;GACnC,YAAY,OAAO,MAAM;EAC3B;EAEA,MAAM,UAAU,WAAW,KAAK;EAEhC,SAAS,cAAc;GACrB,iBAAiB,QAAQ,KAAA;GACzB,KAAK,qBAAqB,KAAA,CAAS;EACrC;;WAtJW,MAAA,QAAA,KAAA,UAAA,GADT,YAqDa,MAAA,WAAA,GArDb,WAqDa,EAAA,KAAA,EAAA,GAnDHA,KAAAA,QAAM;IACb,OAAO,UAAA;IACR,SAAQ;IACP,iBAAa,CAAG,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,GAAW,MAAA,GAAA,CAAG,CAAC,GAAE,SAAU,MAAA,IAAA,CAAI,CAAA;IACrD,OAAM;aACF;IAAJ,KAAI;IACH,UAAU,MAAA,QAAA;IACV,cAAU,OAAA,OAAA,OAAA,MAAA,WAAS,QAAA,QAAO;IAC1B,cAAU,OAAA,OAAA,OAAA,MAAA,WAAS,QAAA,QAAO;;IAEhB,SAAO,cAOd;KANF,mBAME,SAAA;MALA,MAAK;MACJ,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;MACZ,OAAO,iBAAA;MACP,aAAa,QAAA,YAAW;MACzB,UAAA;;KAEF,mBAA0C,QAAA,EAAnC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,WAAA,CAAA,EAAA,GAAe,KAAC,CAAA;KACnC,mBAME,SAAA;MALA,MAAK;MACJ,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;MACZ,OAAO,eAAA;MACP,aAAa,QAAA,YAAW;MACzB,UAAA;;KAGF,YAWa,YAAA;MAXD,MAAK;MAAU,MAAK;;6BAQtB,CANA,QAAA,aAAa,QAAA,cAAc,QAAA,SAAO,CAAK,MAAA,QAAA,KAAA,UAAA,GAD/C,YAOQ,MAAA,WAAA,GAAA;;OALL,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,GAAU,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA,CAAA;OAC7B,OAAM;OACL,SAAK,cAAO,aAAW,CAAA,MAAA,CAAA;;8BAEf,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA;;wCAGX,YAA2D,MAAA,WAAA,GAAA;;OAAlD,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;;8BAA6B,CAAZ,YAAY,MAAA,QAAA,CAAA,CAAA,CAAA;;;;;;IAI3C,SAAO,cAQd,CAPF,YAOE,MAAA,WAAA,GAAA;KANA,OAAA;KACC,MAAA,QAAA;KACA,iBAAA,QAAA;KACA,MAAA,MAAA,IAAA;KACA,cAAY,iBAAA;KACZ,sBAAmB;;;;;;;;;;;;uBAK1B,mBAGW,UAAA,EAAA,KAAA,EAAA,GAAA,CAAA,gBAAA,gBAFN,iBAAA,SAAoB,MAAA,kBAAA,CAAkB,IAAG,QAC5C,gBAAG,eAAA,SAAkB,MAAA,kBAAA,CAAkB,GAAA,CAAA,CAAA,GAAA,EAAA"}
1
+ {"version":3,"file":"date-range-picker.js","names":["$attrs"],"sources":["../../../src/components/date-range-picker/date-range-picker.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n v-bind=\"$attrs\"\n :class=\"className\"\n trigger=\"click\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n width=\"auto\"\n ref=\"dropdownRef\"\n :disabled=\"disabled\"\n @mouseenter.native=\"hovered = true\"\n @mouseleave.native=\"hovered = false\"\n @update:visible=\"dropdownVisible = $event\"\n >\n <template #trigger>\n <input\n type=\"text\"\n :class=\"cls.e('input')\"\n :value=\"displayedOfStart\"\n :placeholder=\"placeholder[0]\"\n readonly\n />\n <span :class=\"cls.e('separator')\">至</span>\n <input\n type=\"text\"\n :class=\"cls.e('input')\"\n :value=\"displayedOfEnd\"\n :placeholder=\"placeholder[1]\"\n readonly\n />\n\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <UIcon\n v-if=\"clearable && modelValue && hovered && !disabled\"\n :class=\"[cls.e('icon'), cls.e('clear')]\"\n title=\"清除\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </UIcon>\n\n <u-icon :class=\"cls.e('icon')\" v-else><Calendar /></u-icon>\n </Transition>\n </template>\n\n <template #content>\n <UDatePanel\n range\n :type\n :disabled-date\n :size\n :range-date=\"currentRangeDate\"\n @select:range-date=\"handleSelect\"\n />\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ displayedOfStart || FORM_EMPTY_CONTENT }} 至\n {{ displayedOfEnd || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { date, type Dater } from '@cat-kit/core'\nimport { useFormFallbackProps, useUserAction } from '@veltra/compositions'\nimport { Calendar, Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport type { DateRangePickerEmits, DateRangePickerProps, DropdownExposed } from '../../types'\nimport { UDatePanel } from '../date-panel'\nimport { UDropdown } from '../dropdown'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UDateRangePicker', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<DateRangePickerProps>(), {\n placeholder: () => ['起始日期', '结束日期'],\n type: 'date',\n disabled: undefined,\n readonly: undefined,\n clearable: true\n})\n\nconst emit = defineEmits<DateRangePickerEmits>()\n\nconst cls = bem('date-range-picker')\n\nconst dropdownVisible = shallowRef(false)\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('disabled', disabled.value),\n bem.is('focus', dropdownVisible.value)\n ]\n})\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nconst { userAction, isUserActive } = useUserAction()\n\nconst currentRangeDate = shallowRef<[Dater, Dater]>()\n\nconst displayedOfStart = computed(() => {\n return props.modelValue?.[0]\n})\n\nconst displayedOfEnd = computed(() => {\n return props.modelValue?.[1]\n})\n\nconst formatStr = computed(() => {\n const { format, type } = props\n if (format) return format\n if (type === 'date') return 'yyyy-MM-dd'\n if (type === 'month') return 'yyyy-MM'\n if (type === 'year') return 'yyyy'\n return 'yyyy-MM-dd'\n})\n\nwatch(\n () => props.modelValue,\n (val) => {\n if (isUserActive()) return\n if (val?.length === 2) {\n currentRangeDate.value = [date(val[0]), date(val[1])]\n } else {\n currentRangeDate.value = undefined\n }\n },\n { immediate: true }\n)\n\nconst commitSelectedRange = userAction((rangeDate: [Dater, Dater] | undefined) => {\n currentRangeDate.value = rangeDate\n emit('update:modelValue', rangeDate?.map((d) => d.format(formatStr.value)) as [string, string])\n})\n\nasync function handleSelect(rangeDate: [Dater, Dater] | undefined) {\n await commitSelectedRange(rangeDate)\n dropdownRef.value?.close()\n}\n\nconst hovered = shallowRef(false)\n\nfunction handleClear() {\n currentRangeDate.value = undefined\n emit('update:modelValue', undefined)\n}\n</script>\n"],"mappings":"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"}
@@ -55,6 +55,10 @@
55
55
  .u-date-range-picker:hover {
56
56
  border-color: var(--u-color-primary);
57
57
  }
58
+ .u-date-range-picker.is-focus {
59
+ border-color: var(--u-color-primary);
60
+ box-shadow: var(--u-focus-ring);
61
+ }
58
62
  .u-date-range-picker__input {
59
63
  outline: none;
60
64
  border: none;
@@ -2,8 +2,8 @@ import { EmptyProps } from "../../types/empty.js";
2
2
  import "../../types/index.js";
3
3
  //#region src/components/empty/empty.vue.d.ts
4
4
  declare const __VLS_export: import("vue").DefineComponent<EmptyProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<EmptyProps> & Readonly<{}>, {
5
- size: number;
6
5
  text: string;
6
+ size: number;
7
7
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
8
8
  declare const _default: typeof __VLS_export;
9
9
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"form-item.js","names":[],"sources":["../../../src/components/form-item/form-item.vue"],"sourcesContent":["<template>\n <u-grid-item :span=\"span\" :class=\"className\">\n <label\n v-if=\"props.label || $slots.label\"\n :class=\"[cls.e('label'), bem.is('required', !!rules?.required)]\"\n :style=\"labelStyles\"\n >\n <u-tip v-if=\"tips\" :content=\"tips\" :class=\"cls.e('tips')\" :show-delay=\"500\">\n <span :class=\"cls.e('tip-label')\">\n <slot name=\"label\">{{ label }}:</slot>\n </span>\n </u-tip>\n <template v-else>\n <slot name=\"label\">{{ label }}:</slot>\n </template>\n </label>\n\n <section :class=\"cls.e('wrapper')\">\n <div :class=\"cls.e('content')\">\n <slot></slot>\n </div>\n\n <!-- 只有表单控件处于非只读状态时,才显示错误提示 -->\n <section :class=\"cls.e('error')\" v-if=\"!readonly && !formProps?.noTips\">\n <transition name=\"form-item-tips\" mode=\"out-in\">\n <span :class=\"cls.e('error-text')\" v-if=\"!!errorTip\">\n {{ errorTip }}\n </span>\n </transition>\n </section>\n </section>\n </u-grid-item>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { o } from '@cat-kit/core'\nimport { useConfig, useFallbackProps } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { type CSSProperties, computed, onBeforeUnmount, shallowRef, watch } from 'vue'\n\nimport type { FormItemProps, ComponentSize } from '../../types'\nimport { UGridItem } from '../grid'\nimport { UTip } from '../tip'\nimport { formItemCls as cls, defineField } from './helper'\nimport { validateField } from './validate'\n\ndefineOptions({ name: 'UFormItem' })\n\nconst props = withDefaults(defineProps<FormItemProps>(), { readonly: undefined })\n\ndefineSlots<{\n /** 标签插槽 */\n label?: () => any\n default?: () => any\n}>()\n\n/** 表单组件上下文 */\nconst { formProps, registerField, unregisterField, shouldValidate, handleFieldChange } =\n injectFormContext()\n\nconst { config } = useConfig()\n\nconst { size, readonly } = useFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n readonly: false\n})\n\nconst errorTip = shallowRef<string>()\n/** 递增序号,丢弃过期的异步校验结果 */\nlet validateSeq = 0\n/** 最近一次 validate 的 Promise,供过期调用等待最新结果 */\nlet latestValidatePromise: Promise<boolean> = Promise.resolve(true)\n\nconst labelPosition = computed(() => props.labelPosition ?? formProps?.labelPosition ?? 'left')\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('error', !!errorTip.value),\n bem.is('label-top', labelPosition.value === 'top')\n ].join(' ')\n})\n\n/** label样式 */\nconst labelStyles = computed<CSSProperties>(() => {\n if (labelPosition.value === 'top') return {}\n return {\n width: withUnit(props.labelWidth ?? formProps?.labelWidth ?? config.form.labelWidth, 'px')\n }\n})\n\nconst fieldItem = defineField({\n clearValidate() {\n errorTip.value = ''\n },\n async validate() {\n if (!props.field || !formProps?.model || !props.rules || !shouldValidate?.()) return true\n\n const seq = ++validateSeq\n\n latestValidatePromise = validateField(formProps.model!, props.field!, props.rules!).then(\n (tip) => {\n if (seq !== validateSeq) return latestValidatePromise\n\n errorTip.value = tip\n return !errorTip.value\n }\n )\n return latestValidatePromise\n }\n})\n\nwatch(\n () => props.field,\n (field, oldField) => {\n if (oldField) {\n unregisterField?.(oldField)\n }\n if (field) {\n registerField?.(field, fieldItem)\n }\n },\n { immediate: true }\n)\n\nlet stopWatchFieldValue: (() => void) | undefined\n\nwatch(\n [() => formProps?.model, () => props.field],\n ([model, field]) => {\n stopWatchFieldValue?.()\n\n if (!field || !model) return\n\n stopWatchFieldValue = watch(\n () => o(model).get(field),\n (value) => {\n handleFieldChange?.(field, value)\n fieldItem.validate()\n }\n )\n },\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n props.field && unregisterField?.(props.field)\n})\n</script>\n"],"mappings":""}
1
+ {"version":3,"file":"form-item.js","names":[],"sources":["../../../src/components/form-item/form-item.vue"],"sourcesContent":["<template>\n <u-grid-item :span=\"span\" :class=\"className\">\n <label\n v-if=\"props.label || $slots.label\"\n :class=\"[cls.e('label'), bem.is('required', !!rules?.required)]\"\n :style=\"labelStyles\"\n >\n <u-tip v-if=\"tips\" :content=\"tips\" :class=\"cls.e('tips')\" :show-delay=\"500\">\n <span :class=\"cls.e('tip-label')\">\n <slot name=\"label\">{{ label }}{{ labelPosition === 'top' ? '' : ':' }}</slot>\n </span>\n </u-tip>\n <template v-else>\n <slot name=\"label\">{{ label }}{{ labelPosition === 'top' ? '' : ':' }}</slot>\n </template>\n </label>\n\n <section :class=\"cls.e('wrapper')\">\n <div :class=\"cls.e('content')\">\n <slot></slot>\n </div>\n\n <!-- 只有表单控件处于非只读状态时,才显示错误提示 -->\n <section :class=\"cls.e('error')\" v-if=\"!readonly && !formProps?.noTips\">\n <transition name=\"form-item-tips\" mode=\"out-in\">\n <span :class=\"cls.e('error-text')\" v-if=\"!!errorTip\">\n {{ errorTip }}\n </span>\n </transition>\n </section>\n </section>\n </u-grid-item>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { o } from '@cat-kit/core'\nimport { useConfig, useFallbackProps } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { type CSSProperties, computed, onBeforeUnmount, shallowRef, watch } from 'vue'\n\nimport type { FormItemProps, ComponentSize } from '../../types'\nimport { UGridItem } from '../grid'\nimport { UTip } from '../tip'\nimport { formItemCls as cls, defineField } from './helper'\nimport { validateField } from './validate'\n\ndefineOptions({ name: 'UFormItem' })\n\nconst props = withDefaults(defineProps<FormItemProps>(), { readonly: undefined })\n\ndefineSlots<{\n /** 标签插槽 */\n label?: () => any\n default?: () => any\n}>()\n\n/** 表单组件上下文 */\nconst { formProps, registerField, unregisterField, shouldValidate, handleFieldChange } =\n injectFormContext()\n\nconst { config } = useConfig()\n\nconst { size, readonly } = useFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n readonly: false\n})\n\nconst errorTip = shallowRef<string>()\n/** 递增序号,丢弃过期的异步校验结果 */\nlet validateSeq = 0\n/** 最近一次 validate 的 Promise,供过期调用等待最新结果 */\nlet latestValidatePromise: Promise<boolean> = Promise.resolve(true)\n\nconst labelPosition = computed(() => props.labelPosition ?? formProps?.labelPosition ?? 'left')\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('error', !!errorTip.value),\n bem.is('label-top', labelPosition.value === 'top')\n ].join(' ')\n})\n\n/** label样式 */\nconst labelStyles = computed<CSSProperties>(() => {\n if (labelPosition.value === 'top') return {}\n return {\n width: withUnit(props.labelWidth ?? formProps?.labelWidth ?? config.form.labelWidth, 'px')\n }\n})\n\nconst fieldItem = defineField({\n clearValidate() {\n errorTip.value = ''\n },\n async validate() {\n if (!props.field || !formProps?.model || !props.rules || !shouldValidate?.()) return true\n\n const seq = ++validateSeq\n\n latestValidatePromise = validateField(formProps.model!, props.field!, props.rules!).then(\n (tip) => {\n if (seq !== validateSeq) return latestValidatePromise\n\n errorTip.value = tip\n return !errorTip.value\n }\n )\n return latestValidatePromise\n }\n})\n\nwatch(\n () => props.field,\n (field, oldField) => {\n if (oldField) {\n unregisterField?.(oldField)\n }\n if (field) {\n registerField?.(field, fieldItem)\n }\n },\n { immediate: true }\n)\n\nlet stopWatchFieldValue: (() => void) | undefined\n\nwatch(\n [() => formProps?.model, () => props.field],\n ([model, field]) => {\n stopWatchFieldValue?.()\n\n if (!field || !model) return\n\n stopWatchFieldValue = watch(\n () => o(model).get(field),\n (value) => {\n handleFieldChange?.(field, value)\n fieldItem.validate()\n }\n )\n },\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n props.field && unregisterField?.(props.field)\n})\n</script>\n"],"mappings":""}
@@ -99,9 +99,9 @@ var form_item_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
99
99
  class: normalizeClass(unref(formItemCls).e("tips")),
100
100
  "show-delay": 500
101
101
  }, {
102
- default: withCtx(() => [createElementVNode("span", { class: normalizeClass(unref(formItemCls).e("tip-label")) }, [renderSlot(_ctx.$slots, "label", {}, () => [createTextVNode(toDisplayString(__props.label) + ":", 1)])], 2)]),
102
+ default: withCtx(() => [createElementVNode("span", { class: normalizeClass(unref(formItemCls).e("tip-label")) }, [renderSlot(_ctx.$slots, "label", {}, () => [createTextVNode(toDisplayString(__props.label) + toDisplayString(labelPosition.value === "top" ? "" : ":"), 1)])], 2)]),
103
103
  _: 3
104
- }, 8, ["content", "class"])) : renderSlot(_ctx.$slots, "label", {}, () => [createTextVNode(toDisplayString(__props.label) + ":", 1)], void 0, 1)], 6)) : createCommentVNode("v-if", true), createElementVNode("section", { class: normalizeClass(unref(formItemCls).e("wrapper")) }, [
104
+ }, 8, ["content", "class"])) : renderSlot(_ctx.$slots, "label", {}, () => [createTextVNode(toDisplayString(__props.label) + toDisplayString(labelPosition.value === "top" ? "" : ":"), 1)], void 0, 1)], 6)) : createCommentVNode("v-if", true), createElementVNode("section", { class: normalizeClass(unref(formItemCls).e("wrapper")) }, [
105
105
  createElementVNode("div", { class: normalizeClass(unref(formItemCls).e("content")) }, [renderSlot(_ctx.$slots, "default")], 2),
106
106
  createCommentVNode(" 只有表单控件处于非只读状态时,才显示错误提示 "),
107
107
  !unref(readonly) && !unref(formProps)?.noTips ? (openBlock(), createElementBlock("section", {
@@ -1 +1 @@
1
- {"version":3,"file":"form-item.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../../src/components/form-item/form-item.vue"],"sourcesContent":["<template>\n <u-grid-item :span=\"span\" :class=\"className\">\n <label\n v-if=\"props.label || $slots.label\"\n :class=\"[cls.e('label'), bem.is('required', !!rules?.required)]\"\n :style=\"labelStyles\"\n >\n <u-tip v-if=\"tips\" :content=\"tips\" :class=\"cls.e('tips')\" :show-delay=\"500\">\n <span :class=\"cls.e('tip-label')\">\n <slot name=\"label\">{{ label }}:</slot>\n </span>\n </u-tip>\n <template v-else>\n <slot name=\"label\">{{ label }}:</slot>\n </template>\n </label>\n\n <section :class=\"cls.e('wrapper')\">\n <div :class=\"cls.e('content')\">\n <slot></slot>\n </div>\n\n <!-- 只有表单控件处于非只读状态时,才显示错误提示 -->\n <section :class=\"cls.e('error')\" v-if=\"!readonly && !formProps?.noTips\">\n <transition name=\"form-item-tips\" mode=\"out-in\">\n <span :class=\"cls.e('error-text')\" v-if=\"!!errorTip\">\n {{ errorTip }}\n </span>\n </transition>\n </section>\n </section>\n </u-grid-item>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { o } from '@cat-kit/core'\nimport { useConfig, useFallbackProps } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { type CSSProperties, computed, onBeforeUnmount, shallowRef, watch } from 'vue'\n\nimport type { FormItemProps, ComponentSize } from '../../types'\nimport { UGridItem } from '../grid'\nimport { UTip } from '../tip'\nimport { formItemCls as cls, defineField } from './helper'\nimport { validateField } from './validate'\n\ndefineOptions({ name: 'UFormItem' })\n\nconst props = withDefaults(defineProps<FormItemProps>(), { readonly: undefined })\n\ndefineSlots<{\n /** 标签插槽 */\n label?: () => any\n default?: () => any\n}>()\n\n/** 表单组件上下文 */\nconst { formProps, registerField, unregisterField, shouldValidate, handleFieldChange } =\n injectFormContext()\n\nconst { config } = useConfig()\n\nconst { size, readonly } = useFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n readonly: false\n})\n\nconst errorTip = shallowRef<string>()\n/** 递增序号,丢弃过期的异步校验结果 */\nlet validateSeq = 0\n/** 最近一次 validate 的 Promise,供过期调用等待最新结果 */\nlet latestValidatePromise: Promise<boolean> = Promise.resolve(true)\n\nconst labelPosition = computed(() => props.labelPosition ?? formProps?.labelPosition ?? 'left')\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('error', !!errorTip.value),\n bem.is('label-top', labelPosition.value === 'top')\n ].join(' ')\n})\n\n/** label样式 */\nconst labelStyles = computed<CSSProperties>(() => {\n if (labelPosition.value === 'top') return {}\n return {\n width: withUnit(props.labelWidth ?? formProps?.labelWidth ?? config.form.labelWidth, 'px')\n }\n})\n\nconst fieldItem = defineField({\n clearValidate() {\n errorTip.value = ''\n },\n async validate() {\n if (!props.field || !formProps?.model || !props.rules || !shouldValidate?.()) return true\n\n const seq = ++validateSeq\n\n latestValidatePromise = validateField(formProps.model!, props.field!, props.rules!).then(\n (tip) => {\n if (seq !== validateSeq) return latestValidatePromise\n\n errorTip.value = tip\n return !errorTip.value\n }\n )\n return latestValidatePromise\n }\n})\n\nwatch(\n () => props.field,\n (field, oldField) => {\n if (oldField) {\n unregisterField?.(oldField)\n }\n if (field) {\n registerField?.(field, fieldItem)\n }\n },\n { immediate: true }\n)\n\nlet stopWatchFieldValue: (() => void) | undefined\n\nwatch(\n [() => formProps?.model, () => props.field],\n ([model, field]) => {\n stopWatchFieldValue?.()\n\n if (!field || !model) return\n\n stopWatchFieldValue = watch(\n () => o(model).get(field),\n (value) => {\n handleFieldChange?.(field, value)\n fieldItem.validate()\n }\n )\n },\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n props.field && unregisterField?.(props.field)\n})\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"form-item.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../../src/components/form-item/form-item.vue"],"sourcesContent":["<template>\n <u-grid-item :span=\"span\" :class=\"className\">\n <label\n v-if=\"props.label || $slots.label\"\n :class=\"[cls.e('label'), bem.is('required', !!rules?.required)]\"\n :style=\"labelStyles\"\n >\n <u-tip v-if=\"tips\" :content=\"tips\" :class=\"cls.e('tips')\" :show-delay=\"500\">\n <span :class=\"cls.e('tip-label')\">\n <slot name=\"label\">{{ label }}{{ labelPosition === 'top' ? '' : ':' }}</slot>\n </span>\n </u-tip>\n <template v-else>\n <slot name=\"label\">{{ label }}{{ labelPosition === 'top' ? '' : ':' }}</slot>\n </template>\n </label>\n\n <section :class=\"cls.e('wrapper')\">\n <div :class=\"cls.e('content')\">\n <slot></slot>\n </div>\n\n <!-- 只有表单控件处于非只读状态时,才显示错误提示 -->\n <section :class=\"cls.e('error')\" v-if=\"!readonly && !formProps?.noTips\">\n <transition name=\"form-item-tips\" mode=\"out-in\">\n <span :class=\"cls.e('error-text')\" v-if=\"!!errorTip\">\n {{ errorTip }}\n </span>\n </transition>\n </section>\n </section>\n </u-grid-item>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { o } from '@cat-kit/core'\nimport { useConfig, useFallbackProps } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { type CSSProperties, computed, onBeforeUnmount, shallowRef, watch } from 'vue'\n\nimport type { FormItemProps, ComponentSize } from '../../types'\nimport { UGridItem } from '../grid'\nimport { UTip } from '../tip'\nimport { formItemCls as cls, defineField } from './helper'\nimport { validateField } from './validate'\n\ndefineOptions({ name: 'UFormItem' })\n\nconst props = withDefaults(defineProps<FormItemProps>(), { readonly: undefined })\n\ndefineSlots<{\n /** 标签插槽 */\n label?: () => any\n default?: () => any\n}>()\n\n/** 表单组件上下文 */\nconst { formProps, registerField, unregisterField, shouldValidate, handleFieldChange } =\n injectFormContext()\n\nconst { config } = useConfig()\n\nconst { size, readonly } = useFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n readonly: false\n})\n\nconst errorTip = shallowRef<string>()\n/** 递增序号,丢弃过期的异步校验结果 */\nlet validateSeq = 0\n/** 最近一次 validate 的 Promise,供过期调用等待最新结果 */\nlet latestValidatePromise: Promise<boolean> = Promise.resolve(true)\n\nconst labelPosition = computed(() => props.labelPosition ?? formProps?.labelPosition ?? 'left')\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('error', !!errorTip.value),\n bem.is('label-top', labelPosition.value === 'top')\n ].join(' ')\n})\n\n/** label样式 */\nconst labelStyles = computed<CSSProperties>(() => {\n if (labelPosition.value === 'top') return {}\n return {\n width: withUnit(props.labelWidth ?? formProps?.labelWidth ?? config.form.labelWidth, 'px')\n }\n})\n\nconst fieldItem = defineField({\n clearValidate() {\n errorTip.value = ''\n },\n async validate() {\n if (!props.field || !formProps?.model || !props.rules || !shouldValidate?.()) return true\n\n const seq = ++validateSeq\n\n latestValidatePromise = validateField(formProps.model!, props.field!, props.rules!).then(\n (tip) => {\n if (seq !== validateSeq) return latestValidatePromise\n\n errorTip.value = tip\n return !errorTip.value\n }\n )\n return latestValidatePromise\n }\n})\n\nwatch(\n () => props.field,\n (field, oldField) => {\n if (oldField) {\n unregisterField?.(oldField)\n }\n if (field) {\n registerField?.(field, fieldItem)\n }\n },\n { immediate: true }\n)\n\nlet stopWatchFieldValue: (() => void) | undefined\n\nwatch(\n [() => formProps?.model, () => props.field],\n ([model, field]) => {\n stopWatchFieldValue?.()\n\n if (!field || !model) return\n\n stopWatchFieldValue = watch(\n () => o(model).get(field),\n (value) => {\n handleFieldChange?.(field, value)\n fieldItem.validate()\n }\n )\n },\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n props.field && unregisterField?.(props.field)\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDA,MAAM,QAAQ;;EASd,MAAM,EAAE,WAAW,eAAe,iBAAiB,gBAAgB,sBACjE,kBAAkB;EAEpB,MAAM,EAAE,WAAW,UAAU;EAE7B,MAAM,EAAE,MAAM,aAAa,iBAAiB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG;GACpE,MAAM;GACN,UAAU;EACZ,CAAC;EAED,MAAM,WAAW,WAAmB;;EAEpC,IAAI,cAAc;;EAElB,IAAI,wBAA0C,QAAQ,QAAQ,IAAI;EAElE,MAAM,gBAAgB,eAAe,MAAM,iBAAiB,WAAW,iBAAiB,MAAM;EAE9F,MAAM,YAAY,eAAe;GAC/B,OAAO;IACL,YAAI;IACJ,YAAI,EAAE,KAAK,KAAK;IAChB,IAAI,GAAG,SAAS,CAAC,CAAC,SAAS,KAAK;IAChC,IAAI,GAAG,aAAa,cAAc,UAAU,KAAK;GAAA,CAClD,CAAC,KAAK,GAAG;EACZ,CAAC;;EAGD,MAAM,cAAc,eAA8B;GAChD,IAAI,cAAc,UAAU,OAAO,OAAO,CAAC;GAC3C,OAAO,EACL,OAAO,SAAS,MAAM,cAAc,WAAW,cAAc,OAAO,KAAK,YAAY,IAAI,EAC3F;EACF,CAAC;EAED,MAAM,YAAY,YAAY;GAC5B,gBAAgB;IACd,SAAS,QAAQ;GACnB;GACA,MAAM,WAAW;IACf,IAAI,CAAC,MAAM,SAAS,CAAC,WAAW,SAAS,CAAC,MAAM,SAAS,CAAC,iBAAiB,GAAG,OAAO;IAErF,MAAM,MAAM,EAAE;IAEd,wBAAwB,cAAc,UAAU,OAAQ,MAAM,OAAQ,MAAM,KAAM,CAAC,CAAC,MACjF,QAAQ;KACP,IAAI,QAAQ,aAAa,OAAO;KAEhC,SAAS,QAAQ;KACjB,OAAO,CAAC,SAAS;IACnB,CACF;IACA,OAAO;GACT;EACF,CAAC;EAED,YACQ,MAAM,QACX,OAAO,aAAa;GACnB,IAAI,UACF,kBAAkB,QAAQ;GAE5B,IAAI,OACF,gBAAgB,OAAO,SAAS;EAEpC,GACA,EAAE,WAAW,KAAK,CACpB;EAEA,IAAI;EAEJ,MACE,OAAO,WAAW,aAAa,MAAM,KAAK,IACzC,CAAC,OAAO,WAAW;GAClB,sBAAsB;GAEtB,IAAI,CAAC,SAAS,CAAC,OAAO;GAEtB,sBAAsB,YACd,EAAE,KAAK,CAAC,CAAC,IAAI,KAAK,IACvB,UAAU;IACT,oBAAoB,OAAO,KAAK;IAChC,UAAU,SAAS;GACrB,CACF;EACF,GACA,EAAE,WAAW,KAAK,CACpB;EAEA,sBAAsB;GACpB,MAAM,SAAS,kBAAkB,MAAM,KAAK;EAC9C,CAAC;;uBApJC,YA8Bc,MAAA,WAAA,GAAA;IA9BA,MAAM,QAAA;IAAO,OAAK,eAAE,UAAA,KAAS;;2BAcjC,CAZA,MAAM,SAASA,KAAAA,OAAO,SAAA,UAAA,GAD9B,mBAaQ,SAAA;;KAXL,OAAK,eAAA,CAAG,MAAA,WAAA,CAAG,CAAC,EAAC,OAAA,GAAW,MAAA,GAAA,CAAG,CAAC,GAAE,YAAA,CAAA,CAAe,QAAA,OAAO,QAAQ,CAAA,CAAA;KAC5D,OAAK,eAAE,YAAA,KAAW;QAEN,QAAA,QAAA,UAAA,GAAb,YAIQ,MAAA,SAAA,GAAA;;KAJY,SAAS,QAAA;KAAO,OAAK,eAAE,MAAA,WAAA,CAAG,CAAC,EAAC,MAAA,CAAA;KAAW,cAAY;;4BAG9D,CAFP,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,WAAA,CAAG,CAAC,EAAC,WAAA,CAAA,EAAA,GAAA,CACjB,WAA6E,KAAA,QAAA,SAAA,CAAA,SAAA,CAAA,gBAAA,gBAAvD,QAAA,KAAK,IAAA,gBAAM,cAAA,UAAa,QAAA,KAAA,GAAA,GAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;mCAIhD,WAA6E,KAAA,QAAA,SAAA,CAAA,SAAA,CAAA,gBAAA,gBAAvD,QAAA,KAAK,IAAA,gBAAM,cAAA,UAAa,QAAA,KAAA,GAAA,GAAA,CAAA,CAAA,GAAA,KAAA,GAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,GAIlD,mBAaU,WAAA,EAbA,OAAK,eAAE,MAAA,WAAA,CAAG,CAAC,EAAC,SAAA,CAAA,EAAA,GAAA;KACpB,mBAEM,OAAA,EAFA,OAAK,eAAE,MAAA,WAAA,CAAG,CAAC,EAAC,SAAA,CAAA,EAAA,GAAA,CAChB,WAAa,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA;KAGf,mBAAA,0BAAA;MACwC,MAAA,QAAA,KAAQ,CAAK,MAAA,SAAA,CAAS,EAAE,UAAA,UAAA,GAAhE,mBAMU,WAAA;;MANA,OAAK,eAAE,MAAA,WAAA,CAAG,CAAC,EAAC,OAAA,CAAA;SACpB,YAIa,YAAA;MAJD,MAAK;MAAiB,MAAK;;6BAG9B,CAAA,CAAA,CAFoC,SAAA,SAAA,UAAA,GAA3C,mBAEO,QAAA;;OAFA,OAAK,eAAE,MAAA,WAAA,CAAG,CAAC,EAAC,YAAA,CAAA;yBACd,SAAA,KAAQ,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,CAAA,CAAA"}
@@ -54,7 +54,7 @@
54
54
  color: var(--u-text-color-main);
55
55
  text-align: right;
56
56
  line-height: 1.3;
57
- font-weight: 300;
57
+ font-weight: 400;
58
58
  display: flex;
59
59
  justify-content: flex-end;
60
60
  align-items: center;
@@ -118,6 +118,7 @@
118
118
  padding-right: 0;
119
119
  padding-bottom: 4px;
120
120
  text-align: left;
121
+ color: var(--u-text-color-second);
121
122
  justify-content: flex-start;
122
123
  }
123
124
 
@@ -32,6 +32,7 @@
32
32
  }
33
33
  .u-grid-input--small .u-grid-input__item.is-focus {
34
34
  border-color: var(--u-color-primary);
35
+ box-shadow: var(--u-focus-ring);
35
36
  }
36
37
  @keyframes fade {
37
38
  0% {
@@ -73,6 +74,7 @@
73
74
  }
74
75
  .u-grid-input--default .u-grid-input__item.is-focus {
75
76
  border-color: var(--u-color-primary);
77
+ box-shadow: var(--u-focus-ring);
76
78
  }
77
79
  @keyframes fade {
78
80
  0% {
@@ -114,6 +116,7 @@
114
116
  }
115
117
  .u-grid-input--large .u-grid-input__item.is-focus {
116
118
  border-color: var(--u-color-primary);
119
+ box-shadow: var(--u-focus-ring);
117
120
  }
118
121
  @keyframes fade {
119
122
  0% {
@@ -2,18 +2,22 @@ import _sfc_main$1 from "../icon/icon.js";
2
2
  import _sfc_main$2 from "../empty/empty.js";
3
3
  import _sfc_main$3 from "../scroll/scroll.js";
4
4
  import _sfc_main$4 from "../dropdown/dropdown.js";
5
- import input_default from "../input/input.js";
6
5
  import { useOptions } from "../select/use-options.js";
7
6
  import _sfc_main$5 from "../checkbox/checkbox.js";
8
7
  import _sfc_main$6 from "../tag/tag.js";
9
8
  import { MultiSelectDIKey } from "./di.js";
10
9
  import _sfc_main$7 from "./multi-select-option.js";
11
- import { Fragment, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, isRef, mergeModels, mergeProps, normalizeClass, normalizeStyle, openBlock, provide, renderList, renderSlot, shallowReactive, shallowRef, toDisplayString, unref, useModel, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
10
+ import { Fragment, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, isRef, mergeModels, mergeProps, nextTick, normalizeClass, normalizeStyle, openBlock, provide, renderList, renderSlot, shallowReactive, shallowRef, toDisplayString, unref, useModel, useTemplateRef, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
12
11
  import { useFormFallbackProps, useVirtualizer } from "@veltra/compositions";
13
12
  import { FORM_EMPTY_CONTENT, bem, fieldKey, injectFormContext } from "@veltra/utils";
14
- import { ArrowDown, Close, Search } from "@veltra/icons/normal";
13
+ import { ArrowDown, Close } from "@veltra/icons/normal";
15
14
  import { o } from "@cat-kit/core";
16
15
  //#region src/components/multi-select/multi-select.vue
16
+ const _hoisted_1 = [
17
+ "placeholder",
18
+ "disabled",
19
+ "onKeydown"
20
+ ];
17
21
  const _sfc_main = /*@__PURE__*/ defineComponent({
18
22
  name: "UMultiSelect",
19
23
  inheritAttrs: false,
@@ -150,9 +154,27 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
150
154
  const restTag = computed(() => {
151
155
  return (model.value?.length ?? 0) - tags.value.length;
152
156
  });
157
+ const dropdownVisible = shallowRef(false);
158
+ const inputRef = useTemplateRef("inputRef");
153
159
  const handleDropdownVisible = (visible) => {
160
+ dropdownVisible.value = visible;
154
161
  if (!visible) queryString.value = "";
155
162
  };
163
+ /**
164
+ * 拦截输入区域的点击(@click.stop):阻止 dropdown 的 trigger 开合切换,
165
+ * 保持面板展开以不中断输入。
166
+ */
167
+ const handleInputClick = () => {
168
+ if (!dropdownVisible.value) dropdownRef.value?.open();
169
+ };
170
+ const handleInputFocus = () => {
171
+ if (!dropdownVisible.value) dropdownRef.value?.open();
172
+ };
173
+ /** 勾选后把焦点还给输入框,便于连续输入过滤 */
174
+ const refocusInput = () => {
175
+ if (!filterable.value) return;
176
+ nextTick(() => inputRef.value?.focus());
177
+ };
156
178
  const handleCheck = (option, checked) => {
157
179
  if (checked) {
158
180
  if (option.__isTemp && props.creatable) {
@@ -179,6 +201,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
179
201
  }
180
202
  emitChange();
181
203
  dropdownRef.value?.updateDropdown();
204
+ refocusInput();
182
205
  };
183
206
  /** 全选 */
184
207
  const handleCheckAll = (checked) => {
@@ -275,7 +298,8 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
275
298
  class: [
276
299
  unref(cls).b,
277
300
  unref(cls).m(unref(size)),
278
- unref(bem).is("disabled", unref(disabled))
301
+ unref(bem).is("disabled", unref(disabled)),
302
+ unref(bem).is("focus", dropdownVisible.value)
279
303
  ],
280
304
  "content-class": [
281
305
  unref(cls).e("panel"),
@@ -291,27 +315,46 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
291
315
  "onUpdate:visible": handleDropdownVisible
292
316
  }), {
293
317
  trigger: withCtx(() => [
294
- withDirectives(createElementVNode("span", { class: normalizeClass(unref(cls).e("placeholder")) }, toDisplayString(__props.placeholder), 3), [[vShow, !model.value?.length]]),
295
- model.value?.length ? (openBlock(), createElementBlock("div", {
318
+ !filterable.value && !model.value?.length ? (openBlock(), createElementBlock("span", {
296
319
  key: 0,
320
+ class: normalizeClass(unref(cls).e("placeholder"))
321
+ }, toDisplayString(__props.placeholder), 3)) : createCommentVNode("v-if", true),
322
+ model.value?.length || filterable.value ? (openBlock(), createElementBlock("div", {
323
+ key: 1,
297
324
  class: normalizeClass(unref(cls).e("tags"))
298
- }, [(openBlock(true), createElementBlock(Fragment, null, renderList(tags.value, (option) => {
299
- return openBlock(), createBlock(unref(_sfc_main$6), {
300
- key: option[valueKey.value],
301
- closable: !unref(disabled),
302
- size: "small",
303
- onClose: ($event) => handleClose(option)
325
+ }, [
326
+ (openBlock(true), createElementBlock(Fragment, null, renderList(tags.value, (option) => {
327
+ return openBlock(), createBlock(unref(_sfc_main$6), {
328
+ key: option[valueKey.value],
329
+ closable: !unref(disabled),
330
+ size: "small",
331
+ onClose: ($event) => handleClose(option)
332
+ }, {
333
+ default: withCtx(() => [createTextVNode(toDisplayString(option[labelKey.value]), 1)]),
334
+ _: 2
335
+ }, 1032, ["closable", "onClose"]);
336
+ }), 128)),
337
+ restTag.value ? (openBlock(), createBlock(unref(_sfc_main$6), {
338
+ key: 0,
339
+ size: "small"
304
340
  }, {
305
- default: withCtx(() => [createTextVNode(toDisplayString(option[labelKey.value]), 1)]),
306
- _: 2
307
- }, 1032, ["closable", "onClose"]);
308
- }), 128)), restTag.value ? (openBlock(), createBlock(unref(_sfc_main$6), {
309
- key: 0,
310
- size: "small"
311
- }, {
312
- default: withCtx(() => [createTextVNode(toDisplayString(restTag.value) + "+ ", 1)]),
313
- _: 1
314
- })) : createCommentVNode("v-if", true)], 2)) : createCommentVNode("v-if", true),
341
+ default: withCtx(() => [createTextVNode(toDisplayString(restTag.value) + "+ ", 1)]),
342
+ _: 1
343
+ })) : createCommentVNode("v-if", true),
344
+ createCommentVNode(" 内嵌查询输入框:承载过滤与回车创建 "),
345
+ filterable.value ? withDirectives((openBlock(), createElementBlock("input", {
346
+ key: 1,
347
+ ref_key: "inputRef",
348
+ ref: inputRef,
349
+ class: normalizeClass(unref(cls).e("input")),
350
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(queryString) ? queryString.value = $event : null),
351
+ placeholder: model.value?.length ? "" : __props.placeholder,
352
+ disabled: unref(disabled),
353
+ onClick: withModifiers(handleInputClick, ["stop"]),
354
+ onFocus: handleInputFocus,
355
+ onKeydown: withKeys(withModifiers(handleCreateByEnter, ["prevent"]), ["enter"])
356
+ }, null, 42, _hoisted_1)), [[vModelText, unref(queryString)]]) : createCommentVNode("v-if", true)
357
+ ], 2)) : createCommentVNode("v-if", true),
315
358
  createVNode(Transition, {
316
359
  name: "zoom-in",
317
360
  mode: "out-in"
@@ -348,26 +391,10 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
348
391
  "indeterminate",
349
392
  "disabled"
350
393
  ]), createElementVNode("span", null, " 已选 " + toDisplayString(model.value?.length) + "/" + toDisplayString(__props.max ?? options.value?.length ?? 0), 1)], 2),
351
- createCommentVNode(" 过滤器 "),
352
- filterable.value ? (openBlock(), createElementBlock("div", {
353
- key: 0,
354
- class: normalizeClass(unref(cls).e("content-filter"))
355
- }, [createVNode(unref(input_default), {
356
- placeholder: "输入关键字进行过滤",
357
- modelValue: unref(queryString),
358
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(queryString) ? queryString.value = $event : null),
359
- onKeydown: withKeys(withModifiers(handleCreateByEnter, ["prevent"]), ["enter"])
360
- }, {
361
- suffix: withCtx(() => [createVNode(unref(_sfc_main$1), null, {
362
- default: withCtx(() => [createVNode(unref(Search))]),
363
- _: 1
364
- })]),
365
- _: 1
366
- }, 8, ["modelValue", "onKeydown"])], 2)) : createCommentVNode("v-if", true),
367
394
  createCommentVNode(" 多选列表 "),
368
395
  createCommentVNode("\n 虚拟化启用时内容容器 height 由 useVirtualizer 命令式写入;\n 模板不再绑定 totalSize,避免尺寸变化引起重渲染。\n "),
369
396
  options.value.length ? (openBlock(), createBlock(unref(_sfc_main$3), {
370
- key: 1,
397
+ key: 0,
371
398
  tag: "ul",
372
399
  class: normalizeClass([unref(cls).e("options")]),
373
400
  ref_key: "scrollRef",
@@ -420,7 +447,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
420
447
  }), 128))]),
421
448
  _: 3
422
449
  }, 8, ["class", "content-class"])) : (openBlock(), createElementBlock("div", {
423
- key: 2,
450
+ key: 1,
424
451
  class: normalizeClass(unref(cls).e("empty"))
425
452
  }, [createVNode(unref(_sfc_main$2))], 2))
426
453
  ]),