UNPKG

@fecp/mobile

Version:

195 lines (194 loc) 7.8 kB
/* empty css */ /* empty css */ /* empty css */ /* empty css */ /* empty css */ /* empty css */ /* empty css */ /* empty css */ /* empty css */ /* empty css */ /* empty css */ import { ref, computed, watch, createBlock, openBlock, unref, mergeProps, isRef, createSlots, withCtx, createVNode, withModifiers } from "vue"; import { MobileField } from "../field/index.mjs"; import { useCascaderAreaData } from "../../../../../../node_modules/.pnpm/@vant_area-data@2.0.0/node_modules/@vant/area-data/dist/index.esm.mjs"; import { Popup } from "../../../../../../node_modules/.pnpm/vant@4.9.17_vue@3.5.13_typescript@5.7.3_/node_modules/vant/es/popup/index.mjs"; import { Cascader } from "../../../../../../node_modules/.pnpm/vant@4.9.17_vue@3.5.13_typescript@5.7.3_/node_modules/vant/es/cascader/index.mjs"; import { Icon } from "../../../../../../node_modules/.pnpm/vant@4.9.17_vue@3.5.13_typescript@5.7.3_/node_modules/vant/es/icon/index.mjs"; const _sfc_main = { __name: "FieldArea", props: { treeOptionsFieldNames: { type: Object, default: { text: "text", value: "value", children: "children" } }, modelValue: { type: String, default: "" }, disabled: { type: Boolean, default: false }, readonly: { type: Boolean, default: false }, "is-link": false, areaType: { //1-省市区,2-省市,3-省 type: String, default: "1" } }, emits: ["update:modelValue"], setup(__props, { emit: __emit }) { const props = __props; const finalOptions = ref([]); if (props.areaType == "1") { finalOptions.value = useCascaderAreaData(); } else if (props.areaType == "2") { finalOptions.value = parseOptionsByLevel(useCascaderAreaData(), 1); } else if (props.areaType == "3") { finalOptions.value = parseOptionsByLevel(useCascaderAreaData(), 0); } function parseOptionsByLevel(data, level) { if (level === 0) { return data.map((item) => ({ text: item.text, value: item.value })); } function processNode(node, currentLevel) { const newNode = { text: node.text, value: node.value }; if (currentLevel < level && node.children) { newNode.children = node.children.map( (child) => processNode(child, currentLevel + 1) ); } return newNode; } return data.map((node) => processNode(node, 0)); } const fieldTextValue = ref(""); const showPicker = ref(false); const emit = __emit; const pickerValue = computed(() => { const value = props.modelValue.split("/"); return value[value.length - 1]; }); function getDisplayValue(options, fieldNames, modelValue) { const { text, value, children } = fieldNames; const values = modelValue.split("/"); const displayValues = []; function findValueInOptions(currentOptions, targetValue) { for (const option of currentOptions) { if (option[value] === targetValue) { return option[text]; } if (option[children] && option[children].length > 0) { const result = findValueInOptions(option[children], targetValue); if (result) { return result; } } } return null; } for (const val of values) { const displayValue = findValueInOptions(options, val); if (displayValue) { displayValues.push(displayValue); } } return displayValues.join("/"); } watch( [() => props.modelValue, finalOptions], ([value, options]) => { if (!value) { fieldTextValue.value = ""; return; } fieldTextValue.value = getDisplayValue( options, props.treeOptionsFieldNames, value ); }, { immediate: true } ); const onFinish = ({ selectedOptions }) => { const value = selectedOptions.map((option) => option[props.treeOptionsFieldNames.value]).join("/"); emit("update:modelValue", value); showPicker.value = false; }; return (_ctx, _cache) => { const _component_van_icon = Icon; const _component_van_cascader = Cascader; const _component_van_popup = Popup; return openBlock(), createBlock(unref(MobileField), mergeProps(_ctx.$attrs, { modelValue: unref(fieldTextValue), "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => isRef(fieldTextValue) ? fieldTextValue.value = $event : null), isLink: __props.readonly ? false : true, readonly: "", disabled: __props.disabled, onOpenPicker: _cache[5] || (_cache[5] = () => { if (!__props.readonly) { showPicker.value = true; } }) }), createSlots({ default: withCtx(() => [ createVNode(_component_van_popup, { show: unref(showPicker), "onUpdate:show": _cache[3] || (_cache[3] = ($event) => isRef(showPicker) ? showPicker.value = $event : null), "destroy-on-close": "", position: "bottom", teleport: "body" }, { default: withCtx(() => [ createVNode(_component_van_cascader, mergeProps(_ctx.$attrs, { modelValue: unref(pickerValue), "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => isRef(pickerValue) ? pickerValue.value = $event : null), options: unref(finalOptions), placeholder: "请选择", onFinish, onClose: _cache[2] || (_cache[2] = ($event) => showPicker.value = false) }), null, 16, ["modelValue", "options"]) ]), _: 1 }, 8, ["show"]) ]), _: 2 }, [ !__props.readonly && !__props.disabled && unref(fieldTextValue) ? { name: "right-icon", fn: withCtx(() => [ createVNode(_component_van_icon, { name: "clear", class: "custom-close-icon", onClick: _cache[0] || (_cache[0] = withModifiers( () => { emit("update:modelValue", ""); }, ["stop"] )) }) ]), key: "0" } : void 0 ]), 1040, ["modelValue", "isLink", "disabled"]); }; } }; export { _sfc_main as default };