@longhongguo/form-create-ant-design-vue 3.2.47 → 3.2.49

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.
@@ -1 +1 @@
1
- {"version":3,"file":"form-create.esm.js","sources":["../src/components/icon/QuestionCircleOutlined.vue","../src/components/icon/QuestionCircleOutlined.vue?vue&type=template&id=72badc20&lang.js","../src/components/CusSelect/index.vue","../src/components/CusSelect/index.vue?vue&type=template&id=51651038&lang.js","../src/components/CusStoreSelect/index.vue","../src/components/CusStoreSelect/index.vue?vue&type=template&id=53476c3b&lang.js","../src/components/index.js","../src/parsers/checkbox.js","../src/parsers/radio.js","../src/parsers/select.js","../src/parsers/cascader.js","../src/parsers/datePicker.js","../src/parsers/hidden.js","../src/parsers/input.js","../src/parsers/timePicker.js","../src/parsers/tree.js","../src/parsers/row.js","../src/parsers/timeRangePicker.js","../src/parsers/index.js","../src/parsers/rangePicker.js","../src/parsers/cusStoreSelect.js","../src/core/alias.js","../src/core/manager.js","../src/core/config.js","../src/core/maker.js","../src/core/api.js","../src/core/modelFields.js","../src/core/provider.js","../src/core/index.js","../src/index.js"],"sourcesContent":["<template>\n <span class=\"anticon\">\n <svg height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\n <path\n d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448s448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372s372 166.6 372 372s-166.6 372-372 372z\"\n fill=\"currentColor\"></path>\n <path\n d=\"M623.6 316.7C593.6 290.4 554 276 512 276s-81.6 14.5-111.6 40.7C369.2 344 352 380.7 352 420v7.6c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V420c0-44.1 43.1-80 96-80s96 35.9 96 80c0 31.1-22 59.6-56.1 72.7c-21.2 8.1-39.2 22.3-52.1 40.9c-13.1 19-19.9 41.8-19.9 64.9V620c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-22.7a48.3 48.3 0 0 1 30.9-44.8c59-22.7 97.1-74.7 97.1-132.5c.1-39.3-17.1-76-48.3-103.3zM472 732a40 40 0 1 0 80 0a40 40 0 1 0-80 0z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: 'QuestionCircleOutlined'\n}\n</script>\n","<template>\n <span class=\"anticon\">\n <svg height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\n <path\n d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448s448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372s372 166.6 372 372s-166.6 372-372 372z\"\n fill=\"currentColor\"></path>\n <path\n d=\"M623.6 316.7C593.6 290.4 554 276 512 276s-81.6 14.5-111.6 40.7C369.2 344 352 380.7 352 420v7.6c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V420c0-44.1 43.1-80 96-80s96 35.9 96 80c0 31.1-22 59.6-56.1 72.7c-21.2 8.1-39.2 22.3-52.1 40.9c-13.1 19-19.9 41.8-19.9 64.9V620c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-22.7a48.3 48.3 0 0 1 30.9-44.8c59-22.7 97.1-74.7 97.1-132.5c.1-39.3-17.1-76-48.3-103.3zM472 732a40 40 0 1 0 80 0a40 40 0 1 0-80 0z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: 'QuestionCircleOutlined'\n}\n</script>\n","<template>\r\n <!-- 单个展示模式 -->\r\n <div\r\n v-if=\"!multiple\"\r\n class=\"fc-cus-select fc-cus-select-single\"\r\n :class=\"{\r\n 'fc-cus-select-disabled': disabled\r\n }\"\r\n :style=\"style\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n >\r\n <div\r\n class=\"fc-cus-select-selector\"\r\n :class=\"{\r\n 'fc-cus-select-selector-borderless': !bordered\r\n }\"\r\n >\r\n <span\r\n v-if=\"displayValue\"\r\n class=\"fc-cus-select-selection-item\"\r\n :title=\"displayLabel\"\r\n >\r\n {{ displayLabel }}\r\n </span>\r\n <span v-else class=\"fc-cus-select-selection-placeholder\">\r\n {{ placeholder || '请选择' }}\r\n </span>\r\n <span v-if=\"showClear\" class=\"fc-cus-select-clear\" @click=\"clearValue\">\r\n <span\r\n role=\"img\"\r\n aria-label=\"close-circle\"\r\n class=\"anticon anticon-close-circle\"\r\n >\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close-circle\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n <span v-else class=\"fc-cus-select-arrow\">\r\n <span role=\"img\" aria-label=\"down\" class=\"anticon anticon-down\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"down\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- 多个展示模式 -->\r\n <div\r\n v-else\r\n class=\"fc-cus-select fc-cus-select-multiple\"\r\n :class=\"{\r\n 'fc-cus-select-disabled': disabled\r\n }\"\r\n :style=\"style\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n >\r\n <div\r\n class=\"fc-cus-select-selector\"\r\n :class=\"{\r\n 'fc-cus-select-selector-borderless': !bordered\r\n }\"\r\n >\r\n <div class=\"fc-cus-select-selection-overflow\">\r\n <!-- 显示的 tags -->\r\n <div\r\n v-for=\"(item, index) in displayItems\"\r\n :key=\"index\"\r\n class=\"fc-cus-select-selection-overflow-item\"\r\n style=\"opacity: 1\"\r\n >\r\n <span class=\"fc-cus-select-selection-item\" :title=\"item.label\">\r\n <span class=\"fc-cus-select-selection-item-content\">{{\r\n item.label\r\n }}</span>\r\n <span\r\n class=\"fc-cus-select-selection-item-remove\"\r\n @click=\"removeItem(item.value, $event)\"\r\n >\r\n <span role=\"img\" aria-label=\"close\" class=\"anticon anticon-close\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </span>\r\n </div>\r\n\r\n <!-- 折叠提示 -->\r\n <div\r\n v-if=\"remainingCount > 0\"\r\n class=\"fc-cus-select-selection-overflow-item\"\r\n style=\"opacity: 1\"\r\n >\r\n <span class=\"fc-cus-select-selection-item\">\r\n <span class=\"fc-cus-select-selection-item-content\">\r\n +{{ remainingCount }}\r\n </span>\r\n </span>\r\n </div>\r\n\r\n <!-- 空值占位符 -->\r\n <span v-if=\"!hasValue\" class=\"fc-cus-select-selection-placeholder\">\r\n {{ placeholder || '请选择' }}\r\n </span>\r\n </div>\r\n <span v-if=\"showClear\" class=\"fc-cus-select-clear\" @click=\"clearValue\">\r\n <span\r\n role=\"img\"\r\n aria-label=\"close-circle\"\r\n class=\"anticon anticon-close-circle\"\r\n >\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close-circle\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n <span v-else class=\"fc-cus-select-arrow\">\r\n <span role=\"img\" aria-label=\"down\" class=\"anticon anticon-down\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"down\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n name: 'CusSelect',\r\n props: {\r\n // 当前值:统一使用对象数组格式(支持 v-model)\r\n // 单选时:[{value: '1001', label: '门店1'}] 或 []\r\n // 多选时:[{value: '1001', label: '门店1'}, {value: '1002', label: '门店2'}] 或 []\r\n modelValue: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 选项列表\r\n options: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 是否多选\r\n multiple: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 最多显示的 tag 数量(多选模式下有效)\r\n maxTagCount: {\r\n type: Number,\r\n default: undefined // 不限制时显示所有\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否禁用样式\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 自定义样式\r\n style: {\r\n type: [String, Object],\r\n default: () => ({ width: '100%' })\r\n },\r\n // 选项的 value 字段名\r\n valueKey: {\r\n type: String,\r\n default: 'value'\r\n },\r\n // 选项的 label 字段名\r\n labelKey: {\r\n type: String,\r\n default: 'label'\r\n },\r\n // 是否允许清除\r\n allowClear: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否有边框\r\n bordered: {\r\n type: Boolean,\r\n default: true\r\n }\r\n },\r\n emits: ['update:modelValue', 'change'],\r\n computed: {\r\n // 统一处理值(支持 v-model),确保始终是对象数组格式\r\n currentValue: {\r\n get() {\r\n // 确保返回对象数组格式\r\n if (!Array.isArray(this.modelValue)) {\r\n // 如果是 null、undefined 或空字符串,返回空数组\r\n if (\r\n this.modelValue === null ||\r\n this.modelValue === undefined ||\r\n this.modelValue === ''\r\n ) {\r\n return []\r\n }\r\n // 如果是单个对象,转换为数组\r\n if (typeof this.modelValue === 'object') {\r\n return [this.modelValue]\r\n }\r\n // 如果是单个值,转换为对象数组格式\r\n return [\r\n { value: this.modelValue, label: this.getLabel(this.modelValue) }\r\n ]\r\n }\r\n // 确保数组中的每个元素都是对象格式\r\n return this.modelValue.map((item) => {\r\n if (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n (item.value !== undefined || item[this.valueKey] !== undefined)\r\n ) {\r\n // 已经是对象格式\r\n return item\r\n }\r\n // 如果是单个值,转换为对象格式\r\n return {\r\n [this.valueKey]: item,\r\n [this.labelKey]: this.getLabel(item)\r\n }\r\n })\r\n },\r\n set(val) {\r\n // 确保设置的值是对象数组格式\r\n let arrayValue = []\r\n if (val !== null && val !== undefined) {\r\n if (Array.isArray(val)) {\r\n // 确保数组中的每个元素都是对象格式\r\n arrayValue = val.map((item) => {\r\n if (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n (item.value !== undefined || item[this.valueKey] !== undefined)\r\n ) {\r\n return item\r\n }\r\n // 单个值转换为对象格式\r\n return {\r\n [this.valueKey]: item,\r\n [this.labelKey]: this.getLabel(item)\r\n }\r\n })\r\n } else if (typeof val === 'object' && val !== null) {\r\n // 单个对象转换为数组\r\n arrayValue = [val]\r\n } else {\r\n // 单个值转换为对象数组格式\r\n arrayValue = [\r\n { [this.valueKey]: val, [this.labelKey]: this.getLabel(val) }\r\n ]\r\n }\r\n }\r\n // 触发 update:modelValue 事件以支持 v-model\r\n this.$emit('update:modelValue', arrayValue)\r\n this.$emit('change', arrayValue)\r\n }\r\n },\r\n // 是否有值(统一判断数组长度)\r\n hasValue() {\r\n const val = this.currentValue\r\n return Array.isArray(val) && val.length > 0\r\n },\r\n // 单个模式:显示的值对象(从数组中取第一个)\r\n displayValue() {\r\n if (!this.hasValue) return null\r\n return this.currentValue[0]\r\n },\r\n // 单个模式:显示的标签\r\n displayLabel() {\r\n if (!this.displayValue) return ''\r\n const item = this.displayValue\r\n // 如果是对象格式,直接取 label\r\n if (typeof item === 'object' && item !== null) {\r\n return (\r\n item[this.labelKey] ||\r\n item.label ||\r\n String(item[this.valueKey] || item.value || '')\r\n )\r\n }\r\n // 如果不是对象,使用 getLabel 方法查找\r\n return this.getLabel(item)\r\n },\r\n // 多个模式:所有选中的项(直接使用对象数组)\r\n allSelectedItems() {\r\n const val = this.currentValue\r\n if (!Array.isArray(val) || val.length === 0) {\r\n return []\r\n }\r\n // 直接返回对象数组,确保格式统一\r\n return val.map((item) => {\r\n if (typeof item === 'object' && item !== null) {\r\n return {\r\n value: item[this.valueKey] || item.value,\r\n label:\r\n item[this.labelKey] ||\r\n item.label ||\r\n String(item[this.valueKey] || item.value || '')\r\n }\r\n }\r\n // 如果不是对象,转换为对象格式\r\n return {\r\n value: item,\r\n label: this.getLabel(item)\r\n }\r\n })\r\n },\r\n // 多个模式:显示的项(根据 maxTagCount 限制)\r\n displayItems() {\r\n const items = this.allSelectedItems\r\n if (this.maxTagCount === undefined || this.maxTagCount === null) {\r\n return items\r\n }\r\n return items.slice(0, this.maxTagCount)\r\n },\r\n // 多个模式:剩余未显示的项数量\r\n remainingCount() {\r\n if (this.maxTagCount === undefined || this.maxTagCount === null) {\r\n return 0\r\n }\r\n const total = this.allSelectedItems.length\r\n return Math.max(0, total - this.maxTagCount)\r\n },\r\n // 是否显示清除图标\r\n showClear() {\r\n return this.allowClear && this.hasValue && !this.disabled\r\n }\r\n },\r\n methods: {\r\n // 根据 value 查找对应的 option\r\n findOptionByValue(val) {\r\n if (!this.options || this.options.length === 0) {\r\n return null\r\n }\r\n return this.options.find((opt) => {\r\n const optValue = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n return optValue === val || String(optValue) === String(val)\r\n })\r\n },\r\n // 获取显示的 label\r\n getLabel(val) {\r\n const option = this.findOptionByValue(val)\r\n if (option) {\r\n return typeof option === 'object' ? option[this.labelKey] : option\r\n }\r\n // 如果找不到对应的 option,直接显示 value\r\n return String(val)\r\n },\r\n // 删除单个项\r\n removeItem(itemValue, event) {\r\n if (this.disabled) return\r\n event.stopPropagation()\r\n const val = this.currentValue\r\n if (Array.isArray(val)) {\r\n // 根据 value 来过滤,支持对象数组格式\r\n const newValue = val.filter((item) => {\r\n if (typeof item === 'object' && item !== null) {\r\n const currentItemValue = item[this.valueKey] || item.value\r\n return currentItemValue !== itemValue\r\n }\r\n return item !== itemValue\r\n })\r\n this.currentValue = newValue\r\n }\r\n },\r\n // 清除所有值\r\n clearValue(event) {\r\n if (this.disabled) return\r\n event.stopPropagation()\r\n // 统一设置为空数组\r\n this.currentValue = []\r\n }\r\n }\r\n})\r\n</script>\r\n","<template>\r\n <!-- 单个展示模式 -->\r\n <div\r\n v-if=\"!multiple\"\r\n class=\"fc-cus-select fc-cus-select-single\"\r\n :class=\"{\r\n 'fc-cus-select-disabled': disabled\r\n }\"\r\n :style=\"style\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n >\r\n <div\r\n class=\"fc-cus-select-selector\"\r\n :class=\"{\r\n 'fc-cus-select-selector-borderless': !bordered\r\n }\"\r\n >\r\n <span\r\n v-if=\"displayValue\"\r\n class=\"fc-cus-select-selection-item\"\r\n :title=\"displayLabel\"\r\n >\r\n {{ displayLabel }}\r\n </span>\r\n <span v-else class=\"fc-cus-select-selection-placeholder\">\r\n {{ placeholder || '请选择' }}\r\n </span>\r\n <span v-if=\"showClear\" class=\"fc-cus-select-clear\" @click=\"clearValue\">\r\n <span\r\n role=\"img\"\r\n aria-label=\"close-circle\"\r\n class=\"anticon anticon-close-circle\"\r\n >\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close-circle\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n <span v-else class=\"fc-cus-select-arrow\">\r\n <span role=\"img\" aria-label=\"down\" class=\"anticon anticon-down\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"down\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- 多个展示模式 -->\r\n <div\r\n v-else\r\n class=\"fc-cus-select fc-cus-select-multiple\"\r\n :class=\"{\r\n 'fc-cus-select-disabled': disabled\r\n }\"\r\n :style=\"style\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n >\r\n <div\r\n class=\"fc-cus-select-selector\"\r\n :class=\"{\r\n 'fc-cus-select-selector-borderless': !bordered\r\n }\"\r\n >\r\n <div class=\"fc-cus-select-selection-overflow\">\r\n <!-- 显示的 tags -->\r\n <div\r\n v-for=\"(item, index) in displayItems\"\r\n :key=\"index\"\r\n class=\"fc-cus-select-selection-overflow-item\"\r\n style=\"opacity: 1\"\r\n >\r\n <span class=\"fc-cus-select-selection-item\" :title=\"item.label\">\r\n <span class=\"fc-cus-select-selection-item-content\">{{\r\n item.label\r\n }}</span>\r\n <span\r\n class=\"fc-cus-select-selection-item-remove\"\r\n @click=\"removeItem(item.value, $event)\"\r\n >\r\n <span role=\"img\" aria-label=\"close\" class=\"anticon anticon-close\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </span>\r\n </div>\r\n\r\n <!-- 折叠提示 -->\r\n <div\r\n v-if=\"remainingCount > 0\"\r\n class=\"fc-cus-select-selection-overflow-item\"\r\n style=\"opacity: 1\"\r\n >\r\n <span class=\"fc-cus-select-selection-item\">\r\n <span class=\"fc-cus-select-selection-item-content\">\r\n +{{ remainingCount }}\r\n </span>\r\n </span>\r\n </div>\r\n\r\n <!-- 空值占位符 -->\r\n <span v-if=\"!hasValue\" class=\"fc-cus-select-selection-placeholder\">\r\n {{ placeholder || '请选择' }}\r\n </span>\r\n </div>\r\n <span v-if=\"showClear\" class=\"fc-cus-select-clear\" @click=\"clearValue\">\r\n <span\r\n role=\"img\"\r\n aria-label=\"close-circle\"\r\n class=\"anticon anticon-close-circle\"\r\n >\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close-circle\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n <span v-else class=\"fc-cus-select-arrow\">\r\n <span role=\"img\" aria-label=\"down\" class=\"anticon anticon-down\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"down\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n name: 'CusSelect',\r\n props: {\r\n // 当前值:统一使用对象数组格式(支持 v-model)\r\n // 单选时:[{value: '1001', label: '门店1'}] 或 []\r\n // 多选时:[{value: '1001', label: '门店1'}, {value: '1002', label: '门店2'}] 或 []\r\n modelValue: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 选项列表\r\n options: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 是否多选\r\n multiple: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 最多显示的 tag 数量(多选模式下有效)\r\n maxTagCount: {\r\n type: Number,\r\n default: undefined // 不限制时显示所有\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否禁用样式\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 自定义样式\r\n style: {\r\n type: [String, Object],\r\n default: () => ({ width: '100%' })\r\n },\r\n // 选项的 value 字段名\r\n valueKey: {\r\n type: String,\r\n default: 'value'\r\n },\r\n // 选项的 label 字段名\r\n labelKey: {\r\n type: String,\r\n default: 'label'\r\n },\r\n // 是否允许清除\r\n allowClear: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否有边框\r\n bordered: {\r\n type: Boolean,\r\n default: true\r\n }\r\n },\r\n emits: ['update:modelValue', 'change'],\r\n computed: {\r\n // 统一处理值(支持 v-model),确保始终是对象数组格式\r\n currentValue: {\r\n get() {\r\n // 确保返回对象数组格式\r\n if (!Array.isArray(this.modelValue)) {\r\n // 如果是 null、undefined 或空字符串,返回空数组\r\n if (\r\n this.modelValue === null ||\r\n this.modelValue === undefined ||\r\n this.modelValue === ''\r\n ) {\r\n return []\r\n }\r\n // 如果是单个对象,转换为数组\r\n if (typeof this.modelValue === 'object') {\r\n return [this.modelValue]\r\n }\r\n // 如果是单个值,转换为对象数组格式\r\n return [\r\n { value: this.modelValue, label: this.getLabel(this.modelValue) }\r\n ]\r\n }\r\n // 确保数组中的每个元素都是对象格式\r\n return this.modelValue.map((item) => {\r\n if (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n (item.value !== undefined || item[this.valueKey] !== undefined)\r\n ) {\r\n // 已经是对象格式\r\n return item\r\n }\r\n // 如果是单个值,转换为对象格式\r\n return {\r\n [this.valueKey]: item,\r\n [this.labelKey]: this.getLabel(item)\r\n }\r\n })\r\n },\r\n set(val) {\r\n // 确保设置的值是对象数组格式\r\n let arrayValue = []\r\n if (val !== null && val !== undefined) {\r\n if (Array.isArray(val)) {\r\n // 确保数组中的每个元素都是对象格式\r\n arrayValue = val.map((item) => {\r\n if (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n (item.value !== undefined || item[this.valueKey] !== undefined)\r\n ) {\r\n return item\r\n }\r\n // 单个值转换为对象格式\r\n return {\r\n [this.valueKey]: item,\r\n [this.labelKey]: this.getLabel(item)\r\n }\r\n })\r\n } else if (typeof val === 'object' && val !== null) {\r\n // 单个对象转换为数组\r\n arrayValue = [val]\r\n } else {\r\n // 单个值转换为对象数组格式\r\n arrayValue = [\r\n { [this.valueKey]: val, [this.labelKey]: this.getLabel(val) }\r\n ]\r\n }\r\n }\r\n // 触发 update:modelValue 事件以支持 v-model\r\n this.$emit('update:modelValue', arrayValue)\r\n this.$emit('change', arrayValue)\r\n }\r\n },\r\n // 是否有值(统一判断数组长度)\r\n hasValue() {\r\n const val = this.currentValue\r\n return Array.isArray(val) && val.length > 0\r\n },\r\n // 单个模式:显示的值对象(从数组中取第一个)\r\n displayValue() {\r\n if (!this.hasValue) return null\r\n return this.currentValue[0]\r\n },\r\n // 单个模式:显示的标签\r\n displayLabel() {\r\n if (!this.displayValue) return ''\r\n const item = this.displayValue\r\n // 如果是对象格式,直接取 label\r\n if (typeof item === 'object' && item !== null) {\r\n return (\r\n item[this.labelKey] ||\r\n item.label ||\r\n String(item[this.valueKey] || item.value || '')\r\n )\r\n }\r\n // 如果不是对象,使用 getLabel 方法查找\r\n return this.getLabel(item)\r\n },\r\n // 多个模式:所有选中的项(直接使用对象数组)\r\n allSelectedItems() {\r\n const val = this.currentValue\r\n if (!Array.isArray(val) || val.length === 0) {\r\n return []\r\n }\r\n // 直接返回对象数组,确保格式统一\r\n return val.map((item) => {\r\n if (typeof item === 'object' && item !== null) {\r\n return {\r\n value: item[this.valueKey] || item.value,\r\n label:\r\n item[this.labelKey] ||\r\n item.label ||\r\n String(item[this.valueKey] || item.value || '')\r\n }\r\n }\r\n // 如果不是对象,转换为对象格式\r\n return {\r\n value: item,\r\n label: this.getLabel(item)\r\n }\r\n })\r\n },\r\n // 多个模式:显示的项(根据 maxTagCount 限制)\r\n displayItems() {\r\n const items = this.allSelectedItems\r\n if (this.maxTagCount === undefined || this.maxTagCount === null) {\r\n return items\r\n }\r\n return items.slice(0, this.maxTagCount)\r\n },\r\n // 多个模式:剩余未显示的项数量\r\n remainingCount() {\r\n if (this.maxTagCount === undefined || this.maxTagCount === null) {\r\n return 0\r\n }\r\n const total = this.allSelectedItems.length\r\n return Math.max(0, total - this.maxTagCount)\r\n },\r\n // 是否显示清除图标\r\n showClear() {\r\n return this.allowClear && this.hasValue && !this.disabled\r\n }\r\n },\r\n methods: {\r\n // 根据 value 查找对应的 option\r\n findOptionByValue(val) {\r\n if (!this.options || this.options.length === 0) {\r\n return null\r\n }\r\n return this.options.find((opt) => {\r\n const optValue = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n return optValue === val || String(optValue) === String(val)\r\n })\r\n },\r\n // 获取显示的 label\r\n getLabel(val) {\r\n const option = this.findOptionByValue(val)\r\n if (option) {\r\n return typeof option === 'object' ? option[this.labelKey] : option\r\n }\r\n // 如果找不到对应的 option,直接显示 value\r\n return String(val)\r\n },\r\n // 删除单个项\r\n removeItem(itemValue, event) {\r\n if (this.disabled) return\r\n event.stopPropagation()\r\n const val = this.currentValue\r\n if (Array.isArray(val)) {\r\n // 根据 value 来过滤,支持对象数组格式\r\n const newValue = val.filter((item) => {\r\n if (typeof item === 'object' && item !== null) {\r\n const currentItemValue = item[this.valueKey] || item.value\r\n return currentItemValue !== itemValue\r\n }\r\n return item !== itemValue\r\n })\r\n this.currentValue = newValue\r\n }\r\n },\r\n // 清除所有值\r\n clearValue(event) {\r\n if (this.disabled) return\r\n event.stopPropagation()\r\n // 统一设置为空数组\r\n this.currentValue = []\r\n }\r\n }\r\n})\r\n</script>\r\n","<template>\n <div @click=\"handleClick\">\n <CusSelect\n :model-value=\"modelValue\"\n :options=\"mergedOptions\"\n :multiple=\"multiple\"\n :max-tag-count=\"maxTagCount\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :style=\"style\"\n :valueKey=\"valueKey\"\n :labelKey=\"labelKey\"\n :allowClear=\"allowClear\"\n :bordered=\"bordered\"\n @update:model-value=\"handleUpdate\"\n @change=\"handleChange\"\n />\n </div>\n</template>\n\n<script>\nimport { defineComponent } from 'vue'\nimport CusSelect from '../CusSelect/index.vue'\n\nexport default defineComponent({\n name: 'CusStoreSelect',\n components: {\n CusSelect\n },\n props: {\n // form-create 注入的对象,包含 API 等\n formCreateInject: {\n type: Object,\n default: null\n },\n // 当前值:统一使用数组格式(支持 v-model)\n // 单选时:[value] 或 []\n // 多选时:[value1, value2, ...] 或 []\n modelValue: {\n type: Array,\n default: () => []\n },\n // 选项列表\n options: {\n type: Array,\n default: () => []\n },\n // 是否多选\n multiple: {\n type: Boolean,\n default: false\n },\n // 最多显示的 tag 数量(多选模式下有效)\n maxTagCount: {\n type: Number,\n default: undefined // 不限制时显示所有\n },\n // 占位符\n placeholder: {\n type: String,\n default: '请选择'\n },\n // 是否禁用样式\n disabled: {\n type: Boolean,\n default: false\n },\n // 自定义样式\n style: {\n type: [String, Object],\n default: () => ({ width: '100%' })\n },\n // 选项的 value 字段名\n valueKey: {\n type: String,\n default: 'value'\n },\n // 选项的 label 字段名\n labelKey: {\n type: String,\n default: 'label'\n },\n // 是否允许清除\n allowClear: {\n type: Boolean,\n default: false\n },\n // 字段名,用于跨窗口通信时标识字段\n field: {\n type: String,\n default: ''\n },\n // 是否有边框\n bordered: {\n type: Boolean,\n default: true\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n // 消息ID计数器,用于标识每次请求\n messageId: 0,\n // 存储待处理的回调函数\n pendingCallbacks: {},\n // 内部维护的选项列表(合并父窗口返回的源对象)\n internalOptions: []\n }\n },\n computed: {\n // 合并内部选项和外部传入的选项\n mergedOptions() {\n // 如果内部有选项,优先使用内部选项\n if (this.internalOptions.length > 0) {\n // 合并去重:根据 valueKey 去重,保留内部选项(后添加的优先)\n const optionMap = new Map()\n // 先添加外部选项\n this.options.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n // 再添加内部选项(会覆盖相同 value 的选项)\n this.internalOptions.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n return Array.from(optionMap.values())\n }\n return this.options\n }\n },\n watch: {\n // 监听外部 options 变化,初始化内部选项列表\n options: {\n immediate: true,\n handler(newOptions) {\n // 如果内部选项为空,且外部有选项,初始化内部选项\n if (\n this.internalOptions.length === 0 &&\n Array.isArray(newOptions) &&\n newOptions.length > 0\n ) {\n this.internalOptions = [...newOptions]\n }\n }\n }\n },\n mounted() {\n // 监听父窗口返回的消息\n window.addEventListener('message', this.handleMessage)\n },\n beforeUnmount() {\n // 组件销毁时移除事件监听\n window.removeEventListener('message', this.handleMessage)\n },\n methods: {\n // 序列化数据,确保可以被 postMessage 发送\n // postMessage 使用结构化克隆算法,无法克隆 Vue 响应式代理对象\n serializeForPostMessage(data) {\n // 处理 null 和 undefined\n if (data === null || data === undefined) {\n return data\n }\n\n try {\n // 使用 JSON 序列化和反序列化来创建可克隆的副本\n // 这会移除 Vue 响应式代理、函数、Symbol 等不可序列化的内容\n return JSON.parse(JSON.stringify(data))\n } catch (error) {\n console.warn('CusStoreSelect: 数据序列化失败,尝试递归处理', error)\n\n // 如果 JSON 序列化失败(可能是循环引用),尝试递归处理\n if (Array.isArray(data)) {\n // 空数组直接返回\n if (data.length === 0) {\n return []\n }\n // 递归处理数组中的每个元素\n return data.map((item) => this.serializeForPostMessage(item))\n }\n\n if (typeof data === 'object') {\n const result = {}\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n try {\n result[key] = this.serializeForPostMessage(data[key])\n } catch (e) {\n // 忽略无法序列化的属性,避免整个序列化失败\n console.warn(`CusStoreSelect: 跳过无法序列化的属性: ${key}`, e)\n }\n }\n }\n return result\n }\n\n // 基本类型(string, number, boolean)直接返回\n return data\n }\n },\n handleClick() {\n // 如果禁用,不处理\n if (this.disabled) {\n return\n }\n\n // 生成唯一消息ID\n const msgId = `store-select-${\n this.field || 'default'\n }-${Date.now()}-${++this.messageId}`\n\n // 序列化所有需要传递的数据,确保可以被 postMessage 发送\n // postMessage 无法发送 Vue 响应式代理对象,必须序列化\n // 获取当前值,确保是对象数组格式\n const currentArrayValue = Array.isArray(this.modelValue)\n ? this.modelValue\n : []\n // 从对象数组中提取 value 值,用于发送给父窗口\n // 单选时发送第一个对象的 value,多选时发送所有对象的 value 数组\n let valueToSend = null\n if (currentArrayValue.length > 0) {\n valueToSend = currentArrayValue\n }\n const serializedCurrentValue =\n valueToSend === null || valueToSend === undefined\n ? null\n : this.serializeForPostMessage(valueToSend)\n\n // 发送消息给父窗口,请求打开门店选择弹窗\n const message = {\n type: 'OPEN_STORE_SELECT',\n field: this.field || '',\n multiple: this.multiple,\n currentValue: serializedCurrentValue,\n valueKey: this.valueKey,\n labelKey: this.labelKey,\n messageId: msgId\n }\n\n // 发送到父窗口(支持 iframe 场景)\n if (window.parent && window.parent !== window) {\n try {\n window.parent.postMessage(message, '*')\n } catch (error) {\n console.error('CusStoreSelect: 发送消息失败', error)\n }\n } else {\n // 如果不在 iframe 中,也可以发送到当前窗口(用于测试)\n console.warn(\n 'CusStoreSelect: 当前不在 iframe 环境中,无法向父窗口发送消息'\n )\n }\n\n // 存储回调,等待父窗口返回结果\n this.pendingCallbacks[msgId] = (value, sourceItems) => {\n // 优先使用 sourceItems(源对象数组),如果没有则根据 value 和 options 构建\n if (\n sourceItems &&\n Array.isArray(sourceItems) &&\n sourceItems.length > 0\n ) {\n // 合并到内部选项列表\n this.mergeOptions(sourceItems)\n }\n\n this.handleUpdate(value)\n this.handleChange(value)\n }\n },\n handleMessage(event) {\n // 验证消息来源(可选,根据实际需求调整)\n // if (event.origin !== 'expected-origin') return\n\n const data = event.data\n\n // 检查是否是门店选择返回的消息\n if (data && data.type === 'STORE_SELECT_RESULT') {\n const { field, value, sourceItems, messageId } = data\n\n // 验证字段名是否匹配\n if (field !== this.field) {\n return\n }\n\n // 查找对应的回调函数\n const callback = this.pendingCallbacks[messageId]\n if (callback) {\n // 执行回调,更新值并传递源对象\n // sourceItems: 源对象数组,包含完整的选项信息\n // 单选时:[{ value: '1001', label: '门店1', ... }]\n // 多选时:[{ value: '1001', label: '门店1', ... }, { value: '1002', label: '门店2', ... }]\n callback(value, sourceItems)\n // 清理已处理的回调\n delete this.pendingCallbacks[messageId]\n }\n }\n },\n // 合并选项到内部选项列表\n mergeOptions(newItems) {\n if (!Array.isArray(newItems) || newItems.length === 0) {\n return\n }\n\n // 创建选项映射,用于去重\n const optionMap = new Map()\n\n // 先将现有内部选项添加到映射\n this.internalOptions.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n\n // 再添加新选项(会覆盖相同 value 的选项)\n newItems.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n\n // 更新内部选项列表\n this.internalOptions = Array.from(optionMap.values())\n },\n handleUpdate(value) {\n this.$emit('update:modelValue', value)\n // 值更新后触发校验\n this.triggerValidate()\n },\n handleChange(value) {\n this.$emit(\n 'change',\n value,\n this.internalOptions && this.internalOptions.length > 0\n ? this.multiple\n ? this.internalOptions\n : this.internalOptions[0]\n : this.multiple\n ? []\n : null\n )\n },\n // 触发字段校验\n triggerValidate() {\n // 使用 nextTick 确保值已经更新完成\n this.$nextTick(() => {\n this.$nextTick(() => {\n try {\n // 方式1:通过 formCreateInject 中的 API 触发校验\n if (\n this.formCreateInject &&\n this.formCreateInject.api &&\n this.field\n ) {\n this.formCreateInject.api.validateField(this.field).catch(() => {\n // 校验失败时静默处理,错误会通过 form-item 显示\n })\n return\n }\n\n // 方式2:通过组件实例查找父组件中的 form-create API\n let parent = this.$parent\n while (parent) {\n if (\n parent.$options &&\n parent.$options.name === 'FormCreate' &&\n parent.fapi\n ) {\n if (this.field && parent.fapi.validateField) {\n parent.fapi.validateField(this.field).catch(() => {\n // 校验失败时静默处理\n })\n }\n break\n }\n parent = parent.$parent\n }\n } catch (error) {\n console.warn('CusStoreSelect: 触发校验失败', error)\n }\n })\n })\n }\n }\n})\n</script>\n","<template>\n <div @click=\"handleClick\">\n <CusSelect\n :model-value=\"modelValue\"\n :options=\"mergedOptions\"\n :multiple=\"multiple\"\n :max-tag-count=\"maxTagCount\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :style=\"style\"\n :valueKey=\"valueKey\"\n :labelKey=\"labelKey\"\n :allowClear=\"allowClear\"\n :bordered=\"bordered\"\n @update:model-value=\"handleUpdate\"\n @change=\"handleChange\"\n />\n </div>\n</template>\n\n<script>\nimport { defineComponent } from 'vue'\nimport CusSelect from '../CusSelect/index.vue'\n\nexport default defineComponent({\n name: 'CusStoreSelect',\n components: {\n CusSelect\n },\n props: {\n // form-create 注入的对象,包含 API 等\n formCreateInject: {\n type: Object,\n default: null\n },\n // 当前值:统一使用数组格式(支持 v-model)\n // 单选时:[value] 或 []\n // 多选时:[value1, value2, ...] 或 []\n modelValue: {\n type: Array,\n default: () => []\n },\n // 选项列表\n options: {\n type: Array,\n default: () => []\n },\n // 是否多选\n multiple: {\n type: Boolean,\n default: false\n },\n // 最多显示的 tag 数量(多选模式下有效)\n maxTagCount: {\n type: Number,\n default: undefined // 不限制时显示所有\n },\n // 占位符\n placeholder: {\n type: String,\n default: '请选择'\n },\n // 是否禁用样式\n disabled: {\n type: Boolean,\n default: false\n },\n // 自定义样式\n style: {\n type: [String, Object],\n default: () => ({ width: '100%' })\n },\n // 选项的 value 字段名\n valueKey: {\n type: String,\n default: 'value'\n },\n // 选项的 label 字段名\n labelKey: {\n type: String,\n default: 'label'\n },\n // 是否允许清除\n allowClear: {\n type: Boolean,\n default: false\n },\n // 字段名,用于跨窗口通信时标识字段\n field: {\n type: String,\n default: ''\n },\n // 是否有边框\n bordered: {\n type: Boolean,\n default: true\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n // 消息ID计数器,用于标识每次请求\n messageId: 0,\n // 存储待处理的回调函数\n pendingCallbacks: {},\n // 内部维护的选项列表(合并父窗口返回的源对象)\n internalOptions: []\n }\n },\n computed: {\n // 合并内部选项和外部传入的选项\n mergedOptions() {\n // 如果内部有选项,优先使用内部选项\n if (this.internalOptions.length > 0) {\n // 合并去重:根据 valueKey 去重,保留内部选项(后添加的优先)\n const optionMap = new Map()\n // 先添加外部选项\n this.options.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n // 再添加内部选项(会覆盖相同 value 的选项)\n this.internalOptions.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n return Array.from(optionMap.values())\n }\n return this.options\n }\n },\n watch: {\n // 监听外部 options 变化,初始化内部选项列表\n options: {\n immediate: true,\n handler(newOptions) {\n // 如果内部选项为空,且外部有选项,初始化内部选项\n if (\n this.internalOptions.length === 0 &&\n Array.isArray(newOptions) &&\n newOptions.length > 0\n ) {\n this.internalOptions = [...newOptions]\n }\n }\n }\n },\n mounted() {\n // 监听父窗口返回的消息\n window.addEventListener('message', this.handleMessage)\n },\n beforeUnmount() {\n // 组件销毁时移除事件监听\n window.removeEventListener('message', this.handleMessage)\n },\n methods: {\n // 序列化数据,确保可以被 postMessage 发送\n // postMessage 使用结构化克隆算法,无法克隆 Vue 响应式代理对象\n serializeForPostMessage(data) {\n // 处理 null 和 undefined\n if (data === null || data === undefined) {\n return data\n }\n\n try {\n // 使用 JSON 序列化和反序列化来创建可克隆的副本\n // 这会移除 Vue 响应式代理、函数、Symbol 等不可序列化的内容\n return JSON.parse(JSON.stringify(data))\n } catch (error) {\n console.warn('CusStoreSelect: 数据序列化失败,尝试递归处理', error)\n\n // 如果 JSON 序列化失败(可能是循环引用),尝试递归处理\n if (Array.isArray(data)) {\n // 空数组直接返回\n if (data.length === 0) {\n return []\n }\n // 递归处理数组中的每个元素\n return data.map((item) => this.serializeForPostMessage(item))\n }\n\n if (typeof data === 'object') {\n const result = {}\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n try {\n result[key] = this.serializeForPostMessage(data[key])\n } catch (e) {\n // 忽略无法序列化的属性,避免整个序列化失败\n console.warn(`CusStoreSelect: 跳过无法序列化的属性: ${key}`, e)\n }\n }\n }\n return result\n }\n\n // 基本类型(string, number, boolean)直接返回\n return data\n }\n },\n handleClick() {\n // 如果禁用,不处理\n if (this.disabled) {\n return\n }\n\n // 生成唯一消息ID\n const msgId = `store-select-${\n this.field || 'default'\n }-${Date.now()}-${++this.messageId}`\n\n // 序列化所有需要传递的数据,确保可以被 postMessage 发送\n // postMessage 无法发送 Vue 响应式代理对象,必须序列化\n // 获取当前值,确保是对象数组格式\n const currentArrayValue = Array.isArray(this.modelValue)\n ? this.modelValue\n : []\n // 从对象数组中提取 value 值,用于发送给父窗口\n // 单选时发送第一个对象的 value,多选时发送所有对象的 value 数组\n let valueToSend = null\n if (currentArrayValue.length > 0) {\n valueToSend = currentArrayValue\n }\n const serializedCurrentValue =\n valueToSend === null || valueToSend === undefined\n ? null\n : this.serializeForPostMessage(valueToSend)\n\n // 发送消息给父窗口,请求打开门店选择弹窗\n const message = {\n type: 'OPEN_STORE_SELECT',\n field: this.field || '',\n multiple: this.multiple,\n currentValue: serializedCurrentValue,\n valueKey: this.valueKey,\n labelKey: this.labelKey,\n messageId: msgId\n }\n\n // 发送到父窗口(支持 iframe 场景)\n if (window.parent && window.parent !== window) {\n try {\n window.parent.postMessage(message, '*')\n } catch (error) {\n console.error('CusStoreSelect: 发送消息失败', error)\n }\n } else {\n // 如果不在 iframe 中,也可以发送到当前窗口(用于测试)\n console.warn(\n 'CusStoreSelect: 当前不在 iframe 环境中,无法向父窗口发送消息'\n )\n }\n\n // 存储回调,等待父窗口返回结果\n this.pendingCallbacks[msgId] = (value, sourceItems) => {\n // 优先使用 sourceItems(源对象数组),如果没有则根据 value 和 options 构建\n if (\n sourceItems &&\n Array.isArray(sourceItems) &&\n sourceItems.length > 0\n ) {\n // 合并到内部选项列表\n this.mergeOptions(sourceItems)\n }\n\n this.handleUpdate(value)\n this.handleChange(value)\n }\n },\n handleMessage(event) {\n // 验证消息来源(可选,根据实际需求调整)\n // if (event.origin !== 'expected-origin') return\n\n const data = event.data\n\n // 检查是否是门店选择返回的消息\n if (data && data.type === 'STORE_SELECT_RESULT') {\n const { field, value, sourceItems, messageId } = data\n\n // 验证字段名是否匹配\n if (field !== this.field) {\n return\n }\n\n // 查找对应的回调函数\n const callback = this.pendingCallbacks[messageId]\n if (callback) {\n // 执行回调,更新值并传递源对象\n // sourceItems: 源对象数组,包含完整的选项信息\n // 单选时:[{ value: '1001', label: '门店1', ... }]\n // 多选时:[{ value: '1001', label: '门店1', ... }, { value: '1002', label: '门店2', ... }]\n callback(value, sourceItems)\n // 清理已处理的回调\n delete this.pendingCallbacks[messageId]\n }\n }\n },\n // 合并选项到内部选项列表\n mergeOptions(newItems) {\n if (!Array.isArray(newItems) || newItems.length === 0) {\n return\n }\n\n // 创建选项映射,用于去重\n const optionMap = new Map()\n\n // 先将现有内部选项添加到映射\n this.internalOptions.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n\n // 再添加新选项(会覆盖相同 value 的选项)\n newItems.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n\n // 更新内部选项列表\n this.internalOptions = Array.from(optionMap.values())\n },\n handleUpdate(value) {\n this.$emit('update:modelValue', value)\n // 值更新后触发校验\n this.triggerValidate()\n },\n handleChange(value) {\n this.$emit(\n 'change',\n value,\n this.internalOptions && this.internalOptions.length > 0\n ? this.multiple\n ? this.internalOptions\n : this.internalOptions[0]\n : this.multiple\n ? []\n : null\n )\n },\n // 触发字段校验\n triggerValidate() {\n // 使用 nextTick 确保值已经更新完成\n this.$nextTick(() => {\n this.$nextTick(() => {\n try {\n // 方式1:通过 formCreateInject 中的 API 触发校验\n if (\n this.formCreateInject &&\n this.formCreateInject.api &&\n this.field\n ) {\n this.formCreateInject.api.validateField(this.field).catch(() => {\n // 校验失败时静默处理,错误会通过 form-item 显示\n })\n return\n }\n\n // 方式2:通过组件实例查找父组件中的 form-create API\n let parent = this.$parent\n while (parent) {\n if (\n parent.$options &&\n parent.$options.name === 'FormCreate' &&\n parent.fapi\n ) {\n if (this.field && parent.fapi.validateField) {\n parent.fapi.validateField(this.field).catch(() => {\n // 校验失败时静默处理\n })\n }\n break\n }\n parent = parent.$parent\n }\n } catch (error) {\n console.warn('CusStoreSelect: 触发校验失败', error)\n }\n })\n })\n }\n }\n})\n</script>\n","import upload from '@form-create/component-antdv-upload/src/index'\nimport frame from '@form-create/component-antdv-frame/src/index'\nimport group from '@form-create/component-antdv-group/src/index'\nimport subForm from '@form-create/component-subform/src/index'\nimport QuestionCircleOutlined from './icon/QuestionCircleOutlined.vue'\nimport CusSelect from './CusSelect/index.vue'\nimport CusStoreSelect from './CusStoreSelect/index.vue'\n\nexport default [\n upload,\n frame,\n group,\n subForm,\n QuestionCircleOutlined,\n CusSelect,\n CusStoreSelect\n]\n","import {hasProperty} from '@form-create/utils/lib/type';\r\n\r\nexport default {\r\n name: 'checkbox',\r\n modelField: 'value',\r\n mergeProp(ctx) {\r\n const props = ctx.prop.props;\r\n if (!hasProperty(props, 'options'))\r\n props.options = ctx.prop.options || [];\r\n }\r\n\r\n}\r\n","import checkbox from './checkbox';\n\nexport default {\n ...checkbox, name: 'radio'\n};\n","import checkbox from './checkbox'\nimport { hasProperty } from '@form-create/utils/lib/type'\n\nexport default {\n ...checkbox,\n name: 'select',\n mergeProp(ctx) {\n const props = ctx.prop.props\n if (!hasProperty(props, 'options')) props.options = ctx.prop.options || []\n\n // 检测 loading 状态:从 effectData('fetch') 中获取 loading 状态\n const fetchData = ctx.effectData('fetch')\n const isLoading = fetchData && fetchData.loading === true\n\n // 如果正在加载,设置 disabled 和 loading\n if (isLoading) {\n props.disabled = true\n props.loading = true\n }\n },\n render(children, ctx) {\n // 检测 loading 状态(与 mergeProp 中的逻辑保持一致)\n const fetchData = ctx.effectData('fetch')\n const isLoading = fetchData && fetchData.loading === true\n\n // 如果有 loading 插槽且正在加载,将 loading 插槽传递给组件的 notFoundContent 插槽\n if (isLoading && children.loading) {\n // 将 loading 插槽合并到 children 中,作为 notFoundContent\n const newChildren = { ...children }\n newChildren.notFoundContent = children.loading\n return ctx.$render.defaultRender(ctx, newChildren)\n }\n\n // 调用默认渲染\n return ctx.$render.defaultRender(ctx, children)\n }\n}\n","import { hasProperty } from '@form-create/utils/lib/type'\r\n\r\nexport default {\r\n name: 'cascader',\r\n mergeProp(ctx) {\r\n const props = ctx.prop.props\r\n if (!hasProperty(props, 'options')) props.options = ctx.prop.options || []\r\n\r\n // 检测 loading 状态:从 effectData('fetch') 中获取 loading 状态\r\n const fetchData = ctx.effectData('fetch')\r\n const isLoading = fetchData && fetchData.loading === true\r\n\r\n // 如果正在加载,设置 disabled 和 loading\r\n if (isLoading) {\r\n props.disabled = true\r\n props.loading = true\r\n }\r\n },\r\n render(children, ctx) {\r\n // 检测 loading 状态(与 mergeProp 中的逻辑保持一致)\r\n const fetchData = ctx.effectData('fetch')\r\n const isLoading = fetchData && fetchData.loading === true\r\n\r\n // 如果有 loading 插槽且正在加载,将 loading 插槽传递给组件的 notFoundContent 插槽\r\n if (isLoading && children.loading) {\r\n // 将 loading 插槽合并到 children 中,作为 notFoundContent\r\n const newChildren = { ...children }\r\n newChildren.notFoundContent = children.loading\r\n return ctx.$render.defaultRender(ctx, newChildren)\r\n }\r\n\r\n // 调用默认渲染\r\n return ctx.$render.defaultRender(ctx, children)\r\n }\r\n}\r\n","import { creatorFactory } from '@longhongguo/form-create-core/src/index'\n\nconst FORMAT_TYPE = {\n date: 'YYYY-MM-DD',\n month: 'YYYY-MM',\n week: 'YYYY-wo',\n quarter: 'YYYY-qQ',\n year: 'YYYY'\n}\n\nconst name = 'datePicker'\n\nexport default {\n name,\n maker: (function () {\n return ['date', 'month', 'week'].reduce(\n (initial, type) => {\n initial[type] = creatorFactory(name, { type })\n return initial\n },\n {\n dateRange: creatorFactory(name, { type: 'range' }),\n datetimeRange: creatorFactory(name, (m) =>\n m.props({ type: 'range', showTime: true })\n )\n }\n )\n })(),\n modelField: 'value',\n mergeProp(ctx) {\n const props = ctx.prop.props\n const type = props.type || props.picker\n if (!props.valueFormat) {\n props.valueFormat =\n (FORMAT_TYPE[type] || FORMAT_TYPE['date']) +\n (props.showTime && (!type || type === 'date') ? ' HH:mm:ss' : '')\n }\n },\n render(children, ctx) {\n return ctx.$render.vNode[\n (ctx.prop.props.range === true ? 'range' : 'date') + 'Picker'\n ](ctx.prop, children)\n }\n}\n","import { creatorFactory } from '@longhongguo/form-create-core/src/index'\n\nconst name = 'hidden'\n\nexport default {\n name,\n maker: {\n [name]: (field, value) => creatorFactory(name)('', field, value)\n },\n render() {\n return []\n }\n}\n","import { creatorFactory } from '@longhongguo/form-create-core/src/index'\n\nconst name = 'input'\nexport default {\n name,\n maker: (function () {\n return ['password', 'url', 'email', 'text', 'textarea', 'search'].reduce(\n (maker, type) => {\n maker[type] = creatorFactory(name, { type })\n return maker\n },\n {\n idate: creatorFactory(name, { type: 'date' })\n }\n )\n })(),\n modelField: 'value',\n render(children, ctx) {\n let type = ctx.prop.props.type\n if (['textarea', 'search', 'password'].indexOf(type) === -1) type = 'input'\n\n type =\n {\n textarea: 'aTextarea',\n search: 'aInputSearch',\n password: 'aInputPassword'\n }[type] || 'aInput'\n return ctx.$render.vNode.make(type, ctx.prop, children)\n }\n}\n","export default {\n name: 'timePicker',\n modelField: 'value',\n mergeProp(ctx) {\n const props = ctx.prop.props;\n if (!props.valueFormat) {\n props.valueFormat = 'HH:mm:ss';\n }\n },\n render(children, ctx) {\n return ctx.$render.vNode['time' +( ctx.prop.props.range === true ? 'Range' : '') + 'Picker'](ctx.prop, children);\n }\n\n}\n\n","export default {\n name: 'tree',\n modelField: 'checkedKeys',\n mergeProp(ctx) {\n const props = ctx.prop.props;\n if (!props.fieldNames)\n props.fieldNames = {\n key: 'id'\n };\n else if (!props.fieldNames.key) props.fieldNames.key = 'id';\n props.checkedKeys = ctx.rule.value;\n props.checkable = true;\n },\n\n}\n\n","export default {\n name: 'FcRow',\n render(_, ctx) {\n return ctx.vNode.col({props: {span: 24}}, {\n default: () => [\n ctx.vNode.row(ctx.prop, _)\n ]\n })\n }\n}\n","import timePicker from './timePicker';\n\nconst name = 'timeRangePicker';\n\nexport default {\n ...timePicker,\n name,\n render(children, ctx) {\n return ctx.$render.vNode['timeRangePicker'](ctx.prop, children);\n }\n}\n","import checkbox from './checkbox'\nimport radio from './radio'\nimport select from './select'\nimport cascader from './cascader'\nimport datePicker from './datePicker'\nimport hidden from './hidden'\nimport input from './input'\nimport timePicker from './timePicker'\nimport tree from './tree'\nimport row from './row'\nimport rangePicker from './rangePicker'\nimport timeRangePicker from './timeRangePicker'\nimport cusStoreSelect from './cusStoreSelect'\n\nexport default [\n checkbox,\n datePicker,\n rangePicker,\n hidden,\n input,\n timePicker,\n timeRangePicker,\n tree,\n radio,\n select,\n cascader,\n row,\n cusStoreSelect\n]\n","import datePicker from './datePicker';\n\nconst name = 'rangePicker';\n\nexport default {\n ...datePicker,\n name,\n maker: {},\n render(children, ctx) {\n return ctx.$render.vNode['rangePicker'](ctx.prop, children);\n }\n}\n","import { hasProperty } from '@form-create/utils/lib/type'\r\nimport { nextTick } from 'vue'\r\n\r\nexport default {\r\n name: 'cusStoreSelect',\r\n modelField: 'modelValue',\r\n // 将 form-create 内部的值转换为对象数组格式\r\n toFormValue(value, ctx) {\r\n // 组件内部统一使用对象数组格式 [{value, label, ...}]\r\n if (value === null || value === undefined || value === '') {\r\n return []\r\n }\r\n if (Array.isArray(value)) {\r\n // 确保数组中的每个元素都是对象格式\r\n return value.map((item) => {\r\n if (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n (item.value !== undefined || item.label !== undefined)\r\n ) {\r\n // 已经是对象格式\r\n return item\r\n }\r\n // 如果是单个值,需要转换为对象格式(但此时没有 label,会在组件内部处理)\r\n return item\r\n })\r\n }\r\n // 单个值转换为数组(组件内部会处理对象转换)\r\n return [value]\r\n },\r\n // 将组件返回的数组格式转换为 form-create 内部格式(可选,保持原值)\r\n toValue(formValue, ctx) {\r\n // 保持数组格式,不转换\r\n return formValue\r\n },\r\n mergeProp(ctx) {\r\n const props = ctx.prop.props\r\n // 确保 options 存在\r\n if (!hasProperty(props, 'options')) {\r\n props.options = ctx.prop.options || []\r\n }\r\n // 传递字段名到组件,用于跨窗口通信时标识字段\r\n if (!hasProperty(props, 'field')) {\r\n props.field = ctx.rule.field || ''\r\n }\r\n // 确保初始值转换为数组格式\r\n if (ctx.rule.value !== undefined) {\r\n const currentValue = ctx.rule.value\r\n if (\r\n currentValue === null ||\r\n currentValue === undefined ||\r\n currentValue === ''\r\n ) {\r\n ctx.rule.value = []\r\n } else if (!Array.isArray(currentValue)) {\r\n ctx.rule.value = [currentValue]\r\n }\r\n }\r\n },\r\n render(children, ctx) {\r\n // 使用默认渲染\r\n const vnode = ctx.$render.defaultRender(ctx, children)\r\n\r\n // 添加校验触发逻辑:在值变化时触发校验\r\n if (vnode && vnode.props && vnode.props.on) {\r\n // 保存原始的 update:modelValue 事件处理器(form-create 自动添加的)\r\n const originalUpdateModelValue = vnode.props.on['update:modelValue']\r\n\r\n // 创建校验触发函数\r\n const triggerValidate = () => {\r\n // 延迟触发校验,确保值已经更新完成\r\n // 使用多个 nextTick 确保 form-create 内部的值更新流程完成\r\n nextTick(() => {\r\n nextTick(() => {\r\n try {\r\n // 方式1:通过 field 名称触发校验(推荐)\r\n const fieldName = ctx.rule.field\r\n if (fieldName) {\r\n ctx.$handle.api.validateField(fieldName).catch(() => {\r\n // 校验失败时静默处理,错误会通过 form-item 显示\r\n })\r\n return\r\n }\r\n\r\n // 方式2:通过字段上下文ID触发校验(备用)\r\n const fieldCtx = ctx.$handle.getFieldCtx(ctx.rule.field)\r\n if (fieldCtx && fieldCtx.id) {\r\n ctx.$handle.$manager.validateField(fieldCtx.id).catch(() => {\r\n // 校验失败时静默处理,错误会通过 form-item 显示\r\n })\r\n }\r\n } catch (error) {\r\n // 静默处理错误,避免影响正常流程\r\n console.warn('CusStoreSelect: 触发校验失败', error)\r\n }\r\n })\r\n })\r\n }\r\n\r\n // 包装 update:modelValue 事件,在值更新后触发校验\r\n vnode.props.on['update:modelValue'] = (...args) => {\r\n // 先调用原始的事件处理器(form-create 的 onInput,会更新值和触发其他逻辑)\r\n if (originalUpdateModelValue) {\r\n originalUpdateModelValue(...args)\r\n }\r\n // 触发校验\r\n triggerValidate()\r\n }\r\n\r\n // 同时监听 change 事件,确保所有情况下都能触发校验\r\n const originalChange = vnode.props.on['change']\r\n if (originalChange) {\r\n vnode.props.on['change'] = (...args) => {\r\n // 先调用原始的 change 处理器\r\n originalChange(...args)\r\n // 触发校验\r\n triggerValidate()\r\n }\r\n } else {\r\n // 如果没有原始的 change 处理器,直接添加\r\n vnode.props.on['change'] = triggerValidate\r\n }\r\n }\r\n\r\n return vnode\r\n }\r\n}\r\n","const PRE = 'a'\nexport default {\n tooltip: PRE + 'Tooltip',\n popover: PRE + 'Popover',\n button: PRE + 'Button',\n icon: PRE + 'Icon',\n slider: PRE + 'Slider',\n rate: PRE + 'Rate',\n upload: 'fcUpload',\n cascader: PRE + 'Cascader',\n timePicker: PRE + 'TimePicker',\n timeRangePicker: PRE + 'TimeRangePicker',\n datePicker: PRE + 'DatePicker',\n rangePicker: PRE + 'RangePicker',\n switch: PRE + 'Switch',\n select: PRE + 'Select',\n checkbox: PRE + 'CheckboxGroup',\n radio: PRE + 'RadioGroup',\n input: PRE + 'Input',\n inputNumber: PRE + 'InputNumber',\n treeSelect: PRE + 'TreeSelect',\n search: PRE + 'InputSearch',\n inputPassword: PRE + 'InputPassword',\n textarea: PRE + 'Textarea',\n formItem: PRE + 'FormItem',\n form: PRE + 'Form',\n frame: 'fcFrame',\n col: PRE + 'Col',\n row: PRE + 'Row',\n tree: PRE + 'Tree',\n autoComplete: PRE + 'AutoComplete',\n transfer: PRE + 'Transfer',\n group: 'fcGroup',\n array: 'fcGroup',\n subForm: 'fcSubForm',\n object: 'fcSubForm'\n}\n","import getConfig from './config'\r\nimport mergeProps from '@form-create/utils/lib/mergeprops'\r\nimport is, { hasProperty } from '@form-create/utils/lib/type'\r\nimport extend from '@form-create/utils/lib/extend'\r\n\r\nfunction isTooltip(info) {\r\n return info.type === 'tooltip'\r\n}\r\n\r\nfunction tidy(props, name) {\r\n if (!hasProperty(props, name)) return\r\n if (is.String(props[name])) {\r\n props[name] = { [name]: props[name], show: true }\r\n }\r\n}\r\n\r\nfunction isFalse(val) {\r\n return val === false\r\n}\r\n\r\nfunction tidyBool(opt, name) {\r\n if (hasProperty(opt, name) && !is.Object(opt[name])) {\r\n opt[name] = { show: !!opt[name] }\r\n }\r\n}\r\n\r\nfunction tidyRule(rule) {\r\n const _rule = { ...rule }\r\n delete _rule.children\r\n return _rule\r\n}\r\n\r\nexport default {\r\n validate() {\r\n const form = this.form()\r\n if (form) {\r\n return form.validate()\r\n } else {\r\n return new Promise((v) => v())\r\n }\r\n },\r\n validateField(field) {\r\n const form = this.form()\r\n if (form) {\r\n return form.validateFields(field)\r\n } else {\r\n return new Promise((v) => v())\r\n }\r\n },\r\n clearValidateState(ctx) {\r\n const fItem = this.vm.refs[ctx.wrapRef]\r\n if (fItem) {\r\n fItem.clearValidate()\r\n }\r\n },\r\n tidyOptions(options) {\r\n ;['submitBtn', 'resetBtn', 'row', 'info', 'wrap', 'col', 'title'].forEach(\r\n (name) => {\r\n tidyBool(options, name)\r\n }\r\n )\r\n return options\r\n },\r\n tidyRule({ prop }) {\r\n tidy(prop, 'title')\r\n tidy(prop, 'info')\r\n return prop\r\n },\r\n mergeProp(ctx) {\r\n const def = {\r\n info: {\r\n type: 'popover',\r\n placement: 'topLeft',\r\n icon: 'QuestionCircleOutlined'\r\n },\r\n title: {},\r\n col: { span: 24 },\r\n wrap: {}\r\n }\r\n ;['info', 'wrap', 'col', 'title'].forEach((name) => {\r\n ctx.prop[name] = mergeProps(\r\n [this.options[name] || {}, ctx.prop[name] || {}],\r\n def[name]\r\n )\r\n })\r\n\r\n // 为 upload 组件自动添加 onPreview,确保始终向父窗口发送预览通知\r\n if (ctx.rule.type === 'upload' && !ctx.prop.props.onPreview) {\r\n const sendPreviewMessage = function (file) {\r\n if (window.parent && window.parent !== window) {\r\n window.parent.postMessage(\r\n {\r\n type: 'upload-preview',\r\n file: {\r\n url: file.url,\r\n name: file.name,\r\n uid: file.uid,\r\n size: file.size,\r\n type: file.type\r\n },\r\n timestamp: Date.now()\r\n },\r\n '*'\r\n )\r\n }\r\n }\r\n ctx.prop.props.onPreview = function (file) {\r\n sendPreviewMessage(file)\r\n // 不执行默认预览,只发送消息\r\n }\r\n } else if (ctx.rule.type === 'upload' && ctx.prop.props.onPreview) {\r\n // 如果用户已经设置了 onPreview,包装它以确保先发送消息\r\n const originalOnPreview = ctx.prop.props.onPreview\r\n const sendPreviewMessage = function (file) {\r\n if (window.parent && window.parent !== window) {\r\n window.parent.postMessage(\r\n {\r\n type: 'upload-preview',\r\n file: {\r\n url: file.url,\r\n name: file.name,\r\n uid: file.uid,\r\n size: file.size,\r\n type: file.type\r\n },\r\n timestamp: Date.now()\r\n },\r\n '*'\r\n )\r\n }\r\n }\r\n ctx.prop.props.onPreview = function (file) {\r\n sendPreviewMessage(file)\r\n if (originalOnPreview && typeof originalOnPreview === 'function') {\r\n originalOnPreview.apply(this, arguments)\r\n }\r\n }\r\n }\r\n },\r\n getDefaultOptions() {\r\n return getConfig()\r\n },\r\n adapterValidate(validate, validator) {\r\n validate.validator = (rule, value) => {\r\n return new Promise((resolve, reject) => {\r\n const callback = (err) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n }\r\n return validator(value, callback)\r\n })\r\n }\r\n return validate\r\n },\r\n update() {\r\n const form = this.options.form\r\n this.rule = {\r\n props: { ...form },\r\n on: {\r\n submit: (e) => {\r\n e.preventDefault()\r\n }\r\n },\r\n style: form.style,\r\n type: 'form'\r\n }\r\n },\r\n beforeRender() {\r\n const { key, ref, $handle } = this\r\n const form = this.options.form\r\n extend(this.rule, {\r\n key,\r\n ref,\r\n class: [\r\n form.className,\r\n form.class,\r\n 'form-create',\r\n this.$handle.preview ? 'is-preview' : ''\r\n ]\r\n })\r\n extend(this.rule.props, {\r\n model: $handle.formData\r\n })\r\n },\r\n render(children) {\r\n if (children.slotLen() && !this.$handle.preview) {\r\n children.setSlot(undefined, () => this.makeFormBtn())\r\n }\r\n return this.$r(\r\n this.rule,\r\n isFalse(this.options.row.show)\r\n ? children.getSlots()\r\n : [this.makeRow(children)]\r\n )\r\n },\r\n makeWrap(ctx, children) {\r\n const rule = ctx.prop\r\n const uni = `${this.key}${ctx.key}`\r\n const col = rule.col\r\n const isTitle = this.isTitle(rule) && rule.wrap.title !== false\r\n const { layout, col: _col } = this.rule.props\r\n const cls = rule.wrap.class\r\n delete rule.wrap.class\r\n delete rule.wrap.title\r\n const item = isFalse(rule.wrap.show)\r\n ? children\r\n : this.$r(\r\n mergeProps([\r\n rule.wrap,\r\n {\r\n props: {\r\n ...tidyRule(rule.wrap || {}),\r\n hasFeedback: rule.hasFeedback || false,\r\n name: ctx.id,\r\n rules: ctx.injectValidate(),\r\n ...(layout !== 'horizontal'\r\n ? { labelCol: {}, wrapperCol: {} }\r\n : {})\r\n },\r\n class: this.$render.mergeClass(\r\n cls || rule.className,\r\n 'fc-form-item'\r\n ),\r\n key: `${uni}fi`,\r\n ref: ctx.wrapRef,\r\n type: 'formItem'\r\n }\r\n ]),\r\n {\r\n default: () => children,\r\n ...(isTitle ? { label: () => this.makeInfo(rule, uni, ctx) } : {})\r\n }\r\n )\r\n return layout === 'inline' || isFalse(_col) || isFalse(col.show)\r\n ? item\r\n : this.makeCol(rule, uni, [item])\r\n },\r\n isTitle(rule) {\r\n if (this.options.form.title === false) return false\r\n const title = rule.title\r\n return !((!title.title && !title.native) || isFalse(title.show))\r\n },\r\n makeInfo(rule, uni, ctx) {\r\n const titleProp = { ...rule.title }\r\n const infoProp = { ...rule.info }\r\n if (this.options.form.title === false) return false\r\n if ((!titleProp.title && !titleProp.native) || isFalse(titleProp.show))\r\n return\r\n const isTip = isTooltip(infoProp)\r\n const titleSlot = this.getSlot('title')\r\n const children = [\r\n titleSlot\r\n ? titleSlot({\r\n title: ctx.refRule?.__$title?.value,\r\n rule: ctx.rule,\r\n options: this.options\r\n })\r\n : ctx.refRule?.__$title?.value\r\n ]\r\n\r\n if (\r\n !isFalse(infoProp.show) &&\r\n (infoProp.info || infoProp.native) &&\r\n !isFalse(infoProp.icon)\r\n ) {\r\n const prop = {\r\n type: infoProp.type || 'popover',\r\n props: tidyRule(infoProp),\r\n key: `${uni}pop`\r\n }\r\n\r\n delete prop.props.icon\r\n delete prop.props.show\r\n delete prop.props.info\r\n delete prop.props.align\r\n delete prop.props.native\r\n\r\n const field = isTip ? 'title' : 'content'\r\n if (infoProp.info && !hasProperty(prop.props, field)) {\r\n prop.props[field] = ctx.refRule?.__$info?.value\r\n }\r\n children[infoProp.align !== 'left' ? 'unshift' : 'push'](\r\n this.$r(mergeProps([infoProp, prop]), {\r\n [titleProp.slot || 'default']: () =>\r\n this.$r({\r\n type:\r\n infoProp.icon === true\r\n ? 'QuestionCircleOutlined'\r\n : infoProp.icon || '',\r\n props: {\r\n type:\r\n infoProp.icon === true\r\n ? 'QuestionCircleOutlined'\r\n : infoProp.icon\r\n },\r\n key: `${uni}i`\r\n })\r\n })\r\n )\r\n }\r\n\r\n const _prop = mergeProps([\r\n titleProp,\r\n {\r\n props: tidyRule(titleProp),\r\n key: `${uni}tit`,\r\n class: 'fc-form-title',\r\n type: titleProp.type || 'span'\r\n }\r\n ])\r\n\r\n delete _prop.props.show\r\n delete _prop.props.title\r\n delete _prop.props.native\r\n\r\n return this.$r(_prop, children)\r\n },\r\n makeCol(rule, uni, children) {\r\n const col = rule.col\r\n return this.$r(\r\n {\r\n class: this.$render.mergeClass(col.class, 'fc-form-col'),\r\n type: 'col',\r\n props: col || { span: 24 },\r\n key: `${uni}col`\r\n },\r\n children\r\n )\r\n },\r\n makeRow(children) {\r\n const row = this.options.row || {}\r\n return this.$r(\r\n {\r\n type: 'row',\r\n props: row,\r\n class: this.$render.mergeClass(row.class, 'fc-form-row'),\r\n key: `${this.key}row`\r\n },\r\n children\r\n )\r\n },\r\n makeFormBtn() {\r\n let vn = []\r\n if (!isFalse(this.options.submitBtn.show)) {\r\n vn.push(this.makeSubmitBtn())\r\n }\r\n if (!isFalse(this.options.resetBtn.show)) {\r\n vn.push(this.makeResetBtn())\r\n }\r\n if (!vn.length) {\r\n return\r\n }\r\n let { labelCol, wrapperCol, layout } = this.rule.props\r\n if (layout !== 'horizontal') {\r\n labelCol = wrapperCol = {}\r\n }\r\n const item = this.$r(\r\n {\r\n type: 'formItem',\r\n class: 'fc-form-item fc-form-footer',\r\n key: `${this.key}fb`,\r\n props: {\r\n labelCol,\r\n wrapperCol,\r\n label: ' ',\r\n colon: false\r\n }\r\n },\r\n vn\r\n )\r\n\r\n return layout === 'inline'\r\n ? item\r\n : this.$r(\r\n {\r\n type: 'col',\r\n class: 'fc-form-col',\r\n props: { span: 24 },\r\n key: `${this.key}fc`\r\n },\r\n [item]\r\n )\r\n },\r\n\r\n makeResetBtn() {\r\n const resetBtn = { ...this.options.resetBtn }\r\n const innerText =\r\n resetBtn.innerText || this.$handle.api.t('reset') || '重置'\r\n delete resetBtn.innerText\r\n delete resetBtn.click\r\n delete resetBtn.col\r\n delete resetBtn.show\r\n return this.$r(\r\n {\r\n type: 'button',\r\n props: resetBtn,\r\n class: 'fc-reset-btn',\r\n style: { width: resetBtn.width, marginLeft: '10px' },\r\n on: {\r\n click: () => {\r\n const fApi = this.$handle.api\r\n this.options.resetBtn.click\r\n ? this.options.resetBtn.click(fApi)\r\n : fApi.resetFields()\r\n }\r\n },\r\n key: `${this.key}b2`\r\n },\r\n [innerText]\r\n )\r\n },\r\n makeSubmitBtn() {\r\n const submitBtn = { ...this.options.submitBtn }\r\n const innerText =\r\n submitBtn.innerText || this.$handle.api.t('submit') || '提交'\r\n delete submitBtn.innerText\r\n delete submitBtn.click\r\n delete submitBtn.col\r\n delete submitBtn.show\r\n return this.$r(\r\n {\r\n type: 'button',\r\n props: submitBtn,\r\n class: 'fc-submit-btn',\r\n style: { width: submitBtn.width },\r\n on: {\r\n click: () => {\r\n const fApi = this.$handle.api\r\n this.options.submitBtn.click\r\n ? this.options.submitBtn.click(fApi)\r\n : fApi.submit().catch(() => {})\r\n }\r\n },\r\n key: `${this.key}b1`\r\n },\r\n [innerText]\r\n )\r\n }\r\n}\r\n","const UNDEF = undefined\n\nexport default function getConfig() {\n return {\n form: {\n hideRequiredMark: false,\n layout: 'horizontal',\n labelAlign: 'right',\n labelCol: {\n span: 3\n },\n wrapperCol: {\n span: 21\n },\n validateOnRuleChange: true\n },\n row: {\n gutter: 0\n },\n submitBtn: {\n disabled: false,\n loading: false,\n type: 'primary',\n innerText: '',\n show: false,\n col: UNDEF,\n click: UNDEF\n },\n resetBtn: {\n disabled: false,\n loading: false,\n type: 'default',\n innerText: '',\n show: false,\n col: UNDEF,\n click: UNDEF\n }\n }\n}\n","import { creatorFactory } from '@longhongguo/form-create-core/src/index'\n\nconst maker = {}\n\nfunction useAlias(maker) {\n ;[\n 'treeSelect',\n 'upload',\n 'frame',\n 'autoComplete',\n 'cascader',\n 'datePicker',\n 'frame',\n 'inputNumber',\n 'inputPassword',\n 'radio',\n 'rate',\n 'switch',\n 'rate',\n 'slider',\n 'timePicker'\n ].reduce((maker, name) => {\n maker[name] = creatorFactory(name)\n return maker\n }, maker)\n maker.auto = maker.autoComplete\n maker.number = maker.inputNumber\n maker.time = maker.timePicker\n maker.password = maker.inputPassword\n}\n\nfunction useFrame(maker) {\n const types = {\n frameInputs: ['input', 0],\n frameFiles: ['file', 0],\n frameImages: ['image', 0],\n frameInputOne: ['input', 1],\n frameFileOne: ['file', 1],\n frameImageOne: ['image', 1]\n }\n\n Object.keys(types).reduce((maker, key) => {\n maker[key] = creatorFactory('frame', (m) =>\n m.props({ type: types[key][0], maxLength: types[key][1] })\n )\n return maker\n }, maker)\n\n maker.frameInput = maker.frameInputs\n maker.frameFile = maker.frameFiles\n maker.frameImage = maker.frameImages\n}\n\nfunction useSlider(maker) {\n maker['sliderRange'] = creatorFactory('slider', { range: true })\n}\n\nfunction useSelect(m) {\n const name = 'select'\n m.selectMultiple = creatorFactory(name, { mode: 'multiple' })\n m.selectTags = creatorFactory(name, { mode: 'tags' })\n m.selectCombobox = creatorFactory(name, { mode: 'combobox' })\n}\n\nfunction useUpload(maker) {\n const types = {\n image: ['image', 0],\n file: ['file', 0],\n uploadFileOne: ['file', 1],\n uploadImageOne: ['image', 1]\n }\n\n Object.keys(types).reduce((maker, key) => {\n maker[key] = creatorFactory('upload', (m) =>\n m.props({\n uploadType: types[key][0],\n maxLength: types[key][1]\n })\n )\n return maker\n }, maker)\n\n maker.uploadImage = maker.image\n maker.uploadFile = maker.file\n}\n\nfunction useCusStoreSelect(maker) {\n maker.cusStoreSelect = creatorFactory('cusStoreSelect')\n maker.storeSelect = maker.cusStoreSelect\n}\n\nuseAlias(maker)\nuseSlider(maker)\nuseFrame(maker)\nuseUpload(maker)\nuseSelect(maker)\nuseCusStoreSelect(maker)\n\nexport default maker\n","import extend from '@form-create/utils/lib/extend'\nimport is from '@form-create/utils/lib/type'\nimport { invoke } from '@longhongguo/form-create-core/src/frame/util'\nimport toArray from '@form-create/utils/lib/toarray'\n\nfunction tidyBtnProp(btn, def) {\n if (is.Boolean(btn)) btn = { show: btn }\n else if (!is.Undef(btn) && !is.Object(btn)) btn = { show: def }\n return btn\n}\n\nexport default function extendApi(api, h) {\n return {\n formEl() {\n return h.$manager.form()\n },\n wrapEl(id) {\n const ctx = h.getFieldCtx(id)\n if (!ctx) return\n return h.vm.refs[ctx.wrapRef]\n },\n validate(callback) {\n return new Promise((resolve, reject) => {\n const forms = api.children\n const all = [h.$manager.validate()]\n forms\n .filter((v) => !v.isScope)\n .forEach((v) => {\n all.push(v.validate())\n })\n Promise.all(all)\n .then(() => {\n resolve(true)\n callback && callback(true)\n })\n .catch((e) => {\n reject(e)\n callback && callback(e)\n h.vm.emit('validate-fail', e, { api })\n h.emitEvent('validate-fail', e, { api })\n })\n })\n },\n validateField(field, callback) {\n return new Promise((resolve, reject) => {\n const ctx = h.getFieldCtx(field)\n if (!ctx) return\n const sub = h.subForm[ctx.id]\n const all = [h.$manager.validateField(ctx.id)]\n toArray(sub)\n .filter((v) => !v.isScope)\n .forEach((v) => {\n all.push(v.validate())\n })\n Promise.all(all)\n .then(() => {\n resolve(null)\n callback && callback(null)\n })\n .catch((e) => {\n reject(e)\n callback && callback(e)\n h.vm.emit('validate-field-fail', e, { field, api })\n })\n })\n },\n clearValidateState(fields, clearSub = true) {\n api.helper.tidyFields(fields).forEach((field) => {\n if (clearSub) this.clearSubValidateState(field)\n h.getCtxs(field).forEach((ctx) => {\n h.$manager.clearValidateState(ctx)\n })\n })\n },\n clearSubValidateState(fields) {\n api.helper.tidyFields(fields).forEach((field) => {\n h.getCtxs(field).forEach((ctx) => {\n const subForm = h.subForm[ctx.id]\n if (!subForm) return\n if (Array.isArray(subForm)) {\n subForm.forEach((form) => {\n form.clearValidateState()\n })\n } else if (subForm) {\n subForm.clearValidateState()\n }\n })\n })\n },\n btn: {\n loading: (loading = true) => {\n api.submitBtnProps({ loading: !!loading })\n },\n disabled: (disabled = true) => {\n api.submitBtnProps({ disabled: !!disabled })\n },\n show: (isShow = true) => {\n api.submitBtnProps({ show: !!isShow })\n }\n },\n resetBtn: {\n loading: (loading = true) => {\n api.resetBtnProps({ loading: !!loading })\n },\n disabled: (disabled = true) => {\n api.resetBtnProps({ disabled: !!disabled })\n },\n show: (isShow = true) => {\n api.resetBtnProps({ show: !!isShow })\n }\n },\n submitBtnProps: (props = {}) => {\n let btn = tidyBtnProp(h.options.submitBtn, true)\n extend(btn, props)\n h.options.submitBtn = btn\n api.refreshOptions()\n },\n resetBtnProps: (props = {}) => {\n let btn = tidyBtnProp(h.options.resetBtn, false)\n extend(btn, props)\n h.options.resetBtn = btn\n api.refreshOptions()\n },\n submit(successFn, failFn) {\n return new Promise((resolve, reject) => {\n const promise =\n h.options.validateOnSubmit === false\n ? Promise.resolve()\n : api.validate()\n promise\n .then(() => {\n let formData = api.formData()\n h.beforeSubmit(formData)\n .then(() => {\n is.Function(successFn) && invoke(() => successFn(formData, api))\n is.Function(h.options.onSubmit) &&\n invoke(() => h.options.onSubmit(formData, api))\n h.vm.emit('submit', formData, api)\n resolve(formData)\n })\n .catch((e) => {})\n })\n .catch((...args) => {\n is.Function(failFn) && invoke(() => failFn(api, ...args))\n reject(...args)\n })\n })\n },\n /**\n * 封装请求工具,用于自定义校验规则等场景\n * 基于 frame/fetch.js 封装的 fetch 方法\n *\n * @param {string|object} config - 请求配置,可以是 URL 字符串或配置对象\n * @param {string} config.action - 请求地址(必需)\n * @param {string} config.method - 请求方法,默认 'get'\n * @param {object} config.data - 请求数据(POST/PUT等),用于表单或JSON格式\n * @param {object} config.query - 查询参数(GET请求)\n * @param {string} config.dataType - 数据类型:'json' 表示 JSON 格式(默认),其他值表示表单格式(FormData)\n * @param {object} config.headers - 请求头\n * @param {function|string} config.parse - 数据解析函数或路径字符串\n * @returns {Promise} 返回 Promise,resolve 时返回解析后的数据\n *\n * @example\n * // JSON 格式 POST 请求(默认)\n * await this.api.request({\n * action: '/api/check-username',\n * method: 'post',\n * data: { username: 'test' },\n * dataType: 'json' // 或不设置,默认 JSON\n * });\n *\n * @example\n * // 表单格式 POST 请求\n * await this.api.request({\n * action: '/api/check-username',\n * method: 'post',\n * data: { username: 'test' },\n * dataType: 'form' // 或任意非 'json' 的值,会使用 FormData\n * });\n *\n * @example\n * // 在自定义校验规则中使用\n * validator: async function(value, callback) {\n * try {\n * const result = await this.api.request({\n * action: '/api/check-username',\n * method: 'post',\n * data: { username: value }, // 使用 data,不是 params\n * dataType: 'form' // 表单形式\n * });\n * if (result.exists) {\n * callback('用户名已存在');\n * } else {\n * callback();\n * }\n * } catch (error) {\n * callback('校验失败,请稍后重试');\n * }\n * }\n */\n request(config) {\n // 如果传入的是字符串,转换为配置对象\n if (typeof config === 'string') {\n config = { action: config }\n }\n // 使用 api.fetch 方法,它内部使用 frame/fetch.js 封装的 asyncFetch\n return api.fetch(config)\n },\n // 节流,在指定时间间隔内,如果多次触发,只执行一次\n throttle(fn, delay) {\n let lastTime = 0\n return function (...args) {\n const context = this\n const now = Date.now()\n if (now - lastTime >= (delay || 0)) {\n lastTime = now\n fn.call(context, ...args)\n }\n }\n },\n // 防抖,在指定时间间隔内,如果多次触发,只执行最后一次\n debounce(fn, delay) {\n let timer = null\n return function (...args) {\n const context = this\n if (timer !== null) {\n clearTimeout(timer)\n }\n timer = setTimeout(() => {\n fn.call(context, ...args)\n }, delay || 0)\n }\n }\n }\n}\n","export default {\n autoComplete: 'value',\n cascader: 'value',\n inputNumber: 'value',\n inputPassword: 'value',\n textarea: 'value',\n rate: 'value',\n slider: 'value',\n treeSelect: 'value',\n switch: 'checked',\n cusStoreSelect: 'modelValue'\n}\n","import is from '@form-create/utils/lib/type';\n\nconst required = {\n name: 'required',\n load(inject, rule, api) {\n const val = parseVal(inject.getValue());\n if (val.required === false) {\n inject.clearProp();\n api.clearValidateState([rule.field]);\n } else {\n const validate = {\n required: true,\n validator(_, v) {\n return new Promise((resolve, reject) => {\n is.empty(v) ? reject(validate.message) : resolve();\n })\n },\n ...val,\n };\n const title = rule.__fc__.refRule?.__$title?.value;\n if (!validate.message) {\n validate.message = api.t('required', {title}) || (title + (api.getLocale() === 'en' ? ' is required' : '不能为空'));\n } else {\n const match = validate.message.match(/^\\{\\{\\s*\\$t\\.(.+)\\s*\\}\\}$/);\n if (match) {\n validate.message = api.t(match[1], {title});\n }\n }\n inject.getProp().validate = [validate];\n }\n api.sync(rule);\n },\n watch(...args) {\n required.load(...args);\n }\n}\n\nfunction parseVal(val) {\n if (is.Boolean(val)) {\n return {required: val}\n } else if (is.String(val)) {\n return {message: val};\n } else if (is.Undef(val)) {\n return {required: false};\n } else if (is.Function(val)) {\n return {validator: val};\n } else if (!is.Object(val)) {\n return {};\n } else {\n return val;\n }\n}\n\n\nexport default required\n","import components from '../components'\nimport parsers from '../parsers'\nimport alias from './alias'\nimport manager from './manager'\nimport FormCreateFactory from '@longhongguo/form-create-core/src/index'\nimport makers from './maker'\nimport '../style/index.css'\nimport extendApi from './api'\nimport modelFields from './modelFields'\nimport required from './provider'\n\nfunction install(FormCreate) {\n FormCreate.componentAlias(alias)\n\n Object.keys(modelFields).forEach((k) => {\n FormCreate.setModelField(k, modelFields[k])\n })\n\n components.forEach((component) => {\n FormCreate.component(component.name, component)\n })\n\n FormCreate.register(required)\n\n parsers.forEach((parser) => {\n FormCreate.parser(parser)\n })\n\n Object.keys(makers).forEach((name) => {\n FormCreate.maker[name] = makers[name]\n })\n\n if (typeof window !== 'undefined' && window.antd) {\n FormCreate.useApp((_, app) => {\n app.use(window.antd)\n })\n }\n}\n\nexport default function antdvFormCreate() {\n return FormCreateFactory({\n ui: 'process.env.UI',\n version: 'process.env.VERSION',\n manager,\n install,\n extendApi,\n attrs: {\n normal: ['col', 'wrap'],\n array: ['className'],\n key: ['title', 'info']\n }\n })\n}\n","import antdvFormCreate from './core/index';\n\nconst FormCreate = antdvFormCreate();\n\nif (typeof window !== 'undefined') {\n window.formCreate = FormCreate;\n}\n\nconst maker = FormCreate.maker;\n\nexport {maker}\n\nexport default FormCreate;\n"],"names":["script$2","name","_hoisted_1","class","_openBlock","_createElementBlock","_cache","_createElementVNode","height","width","xmlns","viewBox","d","fill","script$1","defineComponent","props","modelValue","type","Array","default","options","multiple","Boolean","maxTagCount","Number","undefined","placeholder","String","disabled","style","Object","valueKey","labelKey","allowClear","bordered","emits","computed","currentValue","get","isArray","this","map","item","value","[object Object]","getLabel","label","set","val","arrayValue","$emit","hasValue","length","displayValue","displayLabel","allSelectedItems","displayItems","items","slice","remainingCount","total","Math","max","showClear","methods","findOptionByValue","find","opt","optValue","option","removeItem","itemValue","event","stopPropagation","newValue","filter","clearValue","_hoisted_6","_hoisted_8","opacity","_hoisted_11","_hoisted_12","_createCommentVNode","_ctx","_Fragment","key","tabindex","_renderList","index","title","_toDisplayString","onClick","$event","role","aria-label","focusable","data-icon","aria-hidden","fill-rule","_hoisted_10","_hoisted_13","args","_hoisted_14","_hoisted_3","_hoisted_4","script","components","CusSelect","formCreateInject","field","data","messageId","pendingCallbacks","internalOptions","mergedOptions","optionMap","Map","forEach","from","values","watch","immediate","handler","newOptions","mounted","window","addEventListener","handleMessage","beforeUnmount","removeEventListener","serializeForPostMessage","JSON","parse","stringify","error","console","warn","result","prototype","hasOwnProperty","call","e","handleClick","msgId","Date","now","currentArrayValue","valueToSend","serializedCurrentValue","message","parent","postMessage","sourceItems","mergeOptions","handleUpdate","handleChange","callback","newItems","triggerValidate","$nextTick","api","validateField","catch","$parent","$options","fapi","_createVNode","_component_CusSelect","model-value","max-tag-count","onUpdate:modelValue","onChange","upload","frame","group","subForm","QuestionCircleOutlined","CusStoreSelect","checkbox","modelField","mergeProp","ctx","prop","hasProperty","radio","select","fetchData","effectData","loading","render","children","newChildren","notFoundContent","$render","defaultRender","cascader","FORMAT_TYPE","date","month","week","quarter","year","datePicker","maker","reduce","initial","creatorFactory","dateRange","datetimeRange","m","showTime","picker","valueFormat","vNode","range","hidden","input","idate","indexOf","textarea","search","password","make","timePicker","tree","fieldNames","checkedKeys","rule","checkable","row","_","col","span","parsers","toFormValue","toValue","formValue","vnode","on","originalUpdateModelValue","nextTick","fieldName","$handle","fieldCtx","getFieldCtx","id","$manager","originalChange","alias","tooltip","PRE","popover","button","icon","slider","rate","timeRangePicker","rangePicker","switch","inputNumber","treeSelect","inputPassword","formItem","form","autoComplete","transfer","array","object","tidy","is","show","isFalse","tidyRule","_rule","manager","validate","Promise","v","validateFields","clearValidateState","fItem","vm","refs","wrapRef","clearValidate","tidyOptions","tidyBool","def","info","placement","wrap","mergeProps","onPreview","originalOnPreview","sendPreviewMessage","file","url","uid","size","timestamp","apply","arguments","getDefaultOptions","hideRequiredMark","layout","labelAlign","labelCol","wrapperCol","validateOnRuleChange","gutter","submitBtn","innerText","click","resetBtn","adapterValidate","validator","resolve","reject","err","update","submit","preventDefault","beforeRender","ref","extend","className","preview","model","formData","slotLen","setSlot","makeFormBtn","$r","getSlots","makeRow","makeWrap","uni","isTitle","_col","cls","hasFeedback","rules","injectValidate","mergeClass","makeInfo","makeCol","native","_ctx$refRule","_ctx$refRule2","titleProp","infoProp","isTip","titleSlot","getSlot","refRule","__$title","align","_ctx$refRule3","__$info","slot","_prop","vn","push","makeSubmitBtn","makeResetBtn","colon","t","marginLeft","fApi","resetFields","tidyBtnProp","btn","Undef","extendApi","h","formEl","wrapEl","forms","all","isScope","then","emit","emitEvent","sub","toArray","fields","clearSub","helper","tidyFields","clearSubValidateState","getCtxs","submitBtnProps","isShow","resetBtnProps","refreshOptions","successFn","failFn","validateOnSubmit","beforeSubmit","Function","invoke","onSubmit","request","config","action","fetch","throttle","fn","delay","lastTime","context","debounce","timer","clearTimeout","setTimeout","auto","number","time","useAlias","useSlider","types","frameInputs","frameFiles","frameImages","frameInputOne","frameFileOne","frameImageOne","keys","maxLength","frameInput","frameFile","frameImage","useFrame","image","uploadFileOne","uploadImageOne","uploadType","uploadImage","uploadFile","useUpload","selectMultiple","mode","selectTags","selectCombobox","cusStoreSelect","storeSelect","useCusStoreSelect","modelFields","required","load","inject","parseVal","getValue","clearProp","_rule$__fc__$refRule","empty","__fc__","match","getLocale","getProp","sync","install","FormCreate","componentAlias","k","setModelField","component","register","parser","makers","antd","useApp","app","use","FormCreateFactory","ui","version","attrs","normal","formCreate"],"mappings":";;;;;;q1BAcA,IAAeA,EAAA,CACXC,KAAM,0BCdF,MAAAC,EAAA,CAAAC,MAAM,0CAAZ,OAAAC,IAAAC,EASM,OATNH,EASM,IAAAI,EAAA,KAAAA,EAAA,GAAA,CARJC,EAOK,MAAA,CAPAC,OAAO,MAAMC,MAAM,MAAMC,MAAM,6BAA6BC,QAAQ,kBACvEJ,EAE8B,OAAA,CAD1BK,EAAE,iLACFC,KAAK,iBACTN,EAE8B,OAAA,CAD1BK,EAAE,0aACFC,KAAK,2BCiLf,IAAAC,EAAeC,EAAgB,CAC7Bd,KAAM,YACNe,MAAO,CAILC,WAAY,CACVC,KAAMC,MACNC,QAASA,IAAM,IAGjBC,QAAS,CACPH,KAAMC,MACNC,QAASA,IAAM,IAGjBE,SAAU,CACRJ,KAAMK,QACNH,SAAS,GAGXI,YAAa,CACXN,KAAMO,OACNL,aAASM,GAGXC,YAAa,CACXT,KAAMU,OACNR,QAAS,IAGXS,SAAU,CACRX,KAAMK,QACNH,SAAS,GAGXU,MAAO,CACLZ,KAAM,CAACU,OAAQG,QACfX,QAASA,KAAO,CAAEX,MAAO,UAG3BuB,SAAU,CACRd,KAAMU,OACNR,QAAS,SAGXa,SAAU,CACRf,KAAMU,OACNR,QAAS,SAGXc,WAAY,CACVhB,KAAMK,QACNH,SAAS,GAGXe,SAAU,CACRjB,KAAMK,QACNH,SAAS,IAGbgB,MAAO,CAAC,oBAAqB,UAC7BC,SAAU,CAERC,aAAc,CACZC,MAEE,OAAKpB,MAAMqB,QAAQC,KAAKxB,YAmBjBwB,KAAKxB,WAAWyB,IAAKC,GAER,iBAATA,GACE,OAATA,QACgBjB,IAAfiB,EAAKC,YAA+ClB,IAAxBiB,EAAKF,KAAKT,UAMlC,CACLa,CAACJ,KAAKT,UAAWW,EACjBE,CAACJ,KAAKR,UAAWQ,KAAKK,SAASH,IALxBA,GAvBa,OAApBF,KAAKxB,iBACeS,IAApBe,KAAKxB,YACe,KAApBwB,KAAKxB,WAEE,GAGsB,iBAApBwB,KAAKxB,WACP,CAACwB,KAAKxB,YAGR,CACL,CAAE2B,MAAOH,KAAKxB,WAAY8B,MAAON,KAAKK,SAASL,KAAKxB,eAoB1D+B,IAAIC,GAEF,IAAIC,EAAa,GACbD,MAAAA,IAGAC,EAFE/B,MAAMqB,QAAQS,GAEHA,EAAIP,IAAKC,GAEF,iBAATA,GACE,OAATA,QACgBjB,IAAfiB,EAAKC,YAA+ClB,IAAxBiB,EAAKF,KAAKT,UAKlC,CACLa,CAACJ,KAAKT,UAAWW,EACjBE,CAACJ,KAAKR,UAAWQ,KAAKK,SAASH,IALxBA,GAQa,iBAARM,GAA4B,OAARA,EAEvB,CAACA,GAGD,CACX,CAAEJ,CAACJ,KAAKT,UAAWiB,EAAKJ,CAACJ,KAAKR,UAAWQ,KAAKK,SAASG,MAK7DR,KAAKU,MAAM,oBAAqBD,GAChCT,KAAKU,MAAM,SAAUD,KAIzBE,WACE,MAAMH,EAAMR,KAAKH,aACjB,OAAOnB,MAAMqB,QAAQS,IAAQA,EAAII,OAAS,GAG5CC,eACE,OAAKb,KAAKW,SACHX,KAAKH,aAAa,GADE,MAI7BiB,eACE,IAAKd,KAAKa,aAAc,MAAO,GAC/B,MAAMX,EAAOF,KAAKa,aAElB,MAAoB,iBAATX,GAA8B,OAATA,EAE5BA,EAAKF,KAAKR,WACVU,EAAKI,OACLnB,OAAOe,EAAKF,KAAKT,WAAaW,EAAKC,OAAS,IAIzCH,KAAKK,SAASH,IAGvBa,mBACE,MAAMP,EAAMR,KAAKH,aACjB,OAAKnB,MAAMqB,QAAQS,IAAuB,IAAfA,EAAII,OAIxBJ,EAAIP,IAAKC,GACM,iBAATA,GAA8B,OAATA,EACvB,CACLC,MAAOD,EAAKF,KAAKT,WAAaW,EAAKC,MACnCG,MACEJ,EAAKF,KAAKR,WACVU,EAAKI,OACLnB,OAAOe,EAAKF,KAAKT,WAAaW,EAAKC,OAAS,KAI3C,CACLA,MAAOD,EACPI,MAAON,KAAKK,SAASH,KAhBhB,IAqBXc,eACE,MAAMC,EAAQjB,KAAKe,iBACnB,YAAyB9B,IAArBe,KAAKjB,aAAkD,OAArBiB,KAAKjB,YAClCkC,EAEFA,EAAMC,MAAM,EAAGlB,KAAKjB,cAG7BoC,iBACE,QAAyBlC,IAArBe,KAAKjB,aAAkD,OAArBiB,KAAKjB,YACzC,OAAO,EAET,MAAMqC,EAAQpB,KAAKe,iBAAiBH,OACpC,OAAOS,KAAKC,IAAI,EAAGF,EAAQpB,KAAKjB,cAGlCwC,YACE,OAAOvB,KAAKP,YAAcO,KAAKW,WAAaX,KAAKZ,WAGrDoC,QAAS,CAEPC,kBAAkBjB,GAChB,OAAKR,KAAKpB,SAAmC,IAAxBoB,KAAKpB,QAAQgC,OAG3BZ,KAAKpB,QAAQ8C,KAAMC,IACxB,MAAMC,EAA0B,iBAARD,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAChE,OAAOC,IAAapB,GAAOrB,OAAOyC,KAAczC,OAAOqB,KAJhD,MAQXH,SAASG,GACP,MAAMqB,EAAS7B,KAAKyB,kBAAkBjB,GACtC,OAAIqB,EACuB,iBAAXA,EAAsBA,EAAO7B,KAAKR,UAAYqC,EAGvD1C,OAAOqB,IAGhBsB,WAAWC,EAAWC,GACpB,GAAIhC,KAAKZ,SAAU,OACnB4C,EAAMC,kBACN,MAAMzB,EAAMR,KAAKH,aACjB,GAAInB,MAAMqB,QAAQS,GAAM,CAEtB,MAAM0B,EAAW1B,EAAI2B,OAAQjC,IAC3B,GAAoB,iBAATA,GAA8B,OAATA,EAAe,CAE7C,OADyBA,EAAKF,KAAKT,WAAaW,EAAKC,SACzB4B,EAE9B,OAAO7B,IAAS6B,IAElB/B,KAAKH,aAAeqC,IAIxBE,WAAWJ,GACLhC,KAAKZ,WACT4C,EAAMC,kBAENjC,KAAKH,aAAe,kDC1ZPnC,MAAM,gDAyBNA,MAAM,sCAoCd2E,EAAA,CAAA3E,MAAM,gDASC4E,EAAA,CAAA5E,MAAM,+DA8BdA,MAAM,wCACN2B,MAAA,CAAiBkD,QAAA,MAEXC,EAAA,CAAA9E,MAAM,gCACJ+E,EAAA,CAAA/E,MAAM,iDAOOA,MAAM,gDA0BlBA,MAAM,2EAhKvBgF,EAAc,YAELC,EAAQ9D,cAmEjBjB,EA6GKgF,EAAA,CAAAC,IAAA,GAAA,CA9GLH,EAAc,YACd5E,EA6GK,MAAA,CA3GHJ,SAAM,uCAAqC,0BACnCiF,EAAAvD,YAGPC,QAAOsD,EAAKtD,OACZyD,SAAUH,kBAEX7E,EAmGK,MAAA,CAlGHJ,SAAM,yBAAuB,sCACrBiF,EAAAjD,cAIR5B,EAqDK,MArDLuE,EAqDK,CApDHK,EAAgB,eAChB/E,GAAA,GAAAC,EAgCKgF,EA/BqB,KAAAG,EAAAJ,EAAA3B,aAAhB,CAAAd,EAAM8C,SADhBpF,EAgCK,MAAA,CA9BFiF,IAAKG,EACNtF,MAAM,wCACN2B,MAAA,CAAiBkD,QAAA,OAEjBzE,EAyBM,OAAA,CAzBAJ,MAAM,+BAAgCuF,MAAO/C,EAAKI,QACtDxC,EAEQ,OAFRwE,EACEY,EAAAhD,EAAKI,OAAI,GAEXxC,EAoBM,OAAA,CAnBJJ,MAAM,sCACLyF,WAAOR,EAAUb,WAAC5B,EAAKC,MAAOiD,qBAE/BtF,EAeM,OAAA,CAfAuF,KAAK,MAAMC,aAAW,QAAQ5F,MAAM,0BACxCI,EAaK,MAAA,CAZHyF,UAAU,QACVC,YAAU,QACVxF,MAAM,MACND,OAAO,MACPK,KAAK,eACLqF,cAAY,OACZC,YAAU,UACVxF,QAAQ,kBAERJ,EAEO,OAAA,CADLK,EAAE,6pBAQduE,EAAY,UAEJC,EAAaxB,eAAA,GADrBxD,IAAAC,EAUK,MAVL+F,EAUK,CALH7F,EAIM,OAJN0E,EAIM,CAHJ1E,EAEM,OAFN2E,EAAkD,OAC5CE,uCAKVD,EAAa,WACAC,EAAQhC,2BAArB/C,EAEM,OAFNgG,EAEMV,EADDP,EAAUzD,aAAA,OAAA,MAGLyD,EAASpB,eAArB3D,EAqBM,OAAA,OArBiBF,MAAM,sBAAuByF,4BAAOR,EAAUP,YAAAO,EAAAP,cAAAyB,sBACnE/F,EAmBM,OAAA,CAlBJuF,KAAK,MACLC,aAAW,eACX5F,MAAM,iCAENI,EAaK,MAAA,CAZHyF,UAAU,QACVC,YAAU,eACVxF,MAAM,MACND,OAAO,MACPK,KAAK,eACLqF,cAAY,OACZC,YAAU,UACVxF,QAAQ,kBAERJ,EAEO,OAAA,CADLK,EAAE,gtBAKVR,IAAAC,EAgBM,OAhBNkG,EAgBM,IAAAjG,EAAA,KAAAA,EAAA,GAAA,CAfJC,EAcM,OAAA,CAdAuF,KAAK,MAAMC,aAAW,OAAO5F,MAAM,yBACvCI,EAYK,MAAA,CAXHyF,UAAU,QACVC,YAAU,OACVxF,MAAM,MACND,OAAO,MACPK,KAAK,eACLqF,cAAY,OACZvF,QAAQ,kBAERJ,EAEO,OAAA,CADLK,EAAE,kOA3KdP,EAiEK,MAAA,OA/DHF,SAAM,qCAAmC,0BACjCiF,EAAAvD,YAGPC,QAAOsD,EAAKtD,OACZyD,SAAUH,kBAEX7E,EAuDK,MAAA,CAtDHJ,SAAM,yBAAuB,sCACrBiF,EAAAjD,cAKAiD,EAAY9B,kBADpBjD,EAMM,OAAA,OAJJF,MAAM,+BACLuF,MAAON,EAAY7B,gBAEjB6B,2BAEL/E,EAEM,OAFNmG,EAEMb,EADDP,EAAUzD,aAAA,OAAA,IAEHyD,EAASpB,eAArB3D,EAqBM,OAAA,OArBiBF,MAAM,sBAAuByF,4BAAOR,EAAUP,YAAAO,EAAAP,cAAAyB,sBACnE/F,EAmBM,OAAA,CAlBJuF,KAAK,MACLC,aAAW,eACX5F,MAAM,iCAENI,EAaK,MAAA,CAZHyF,UAAU,QACVC,YAAU,eACVxF,MAAM,MACND,OAAO,MACPK,KAAK,eACLqF,cAAY,OACZC,YAAU,UACVxF,QAAQ,kBAERJ,EAEO,OAAA,CADLK,EAAE,gtBAKVR,IAAAC,EAgBM,OAhBNoG,EAgBM,IAAAnG,EAAA,KAAAA,EAAA,GAAA,CAfJC,EAcM,OAAA,CAdAuF,KAAK,MAAMC,aAAW,OAAO5F,MAAM,yBACvCI,EAYK,MAAA,CAXHyF,UAAU,QACVC,YAAU,OACVxF,MAAM,MACND,OAAO,MACPK,KAAK,eACLqF,cAAY,OACZvF,QAAQ,kBAERJ,EAEO,OAAA,CADLK,EAAE,8NCrChB,IAAA8F,EAAe3F,EAAgB,CAC7Bd,KAAM,iBACN0G,WAAY,CACVC,UAAAA,GAEF5F,MAAO,CAEL6F,iBAAkB,CAChB3F,KAAMa,OACNX,QAAS,MAKXH,WAAY,CACVC,KAAMC,MACNC,QAASA,IAAM,IAGjBC,QAAS,CACPH,KAAMC,MACNC,QAASA,IAAM,IAGjBE,SAAU,CACRJ,KAAMK,QACNH,SAAS,GAGXI,YAAa,CACXN,KAAMO,OACNL,aAASM,GAGXC,YAAa,CACXT,KAAMU,OACNR,QAAS,OAGXS,SAAU,CACRX,KAAMK,QACNH,SAAS,GAGXU,MAAO,CACLZ,KAAM,CAACU,OAAQG,QACfX,QAASA,KAAO,CAAEX,MAAO,UAG3BuB,SAAU,CACRd,KAAMU,OACNR,QAAS,SAGXa,SAAU,CACRf,KAAMU,OACNR,QAAS,SAGXc,WAAY,CACVhB,KAAMK,QACNH,SAAS,GAGX0F,MAAO,CACL5F,KAAMU,OACNR,QAAS,IAGXe,SAAU,CACRjB,KAAMK,QACNH,SAAS,IAGbgB,MAAO,CAAC,oBAAqB,UAC7B2E,KAAIA,KACK,CAELC,UAAW,EAEXC,iBAAkB,GAElBC,gBAAiB,KAGrB7E,SAAU,CAER8E,gBAEE,GAAI1E,KAAKyE,gBAAgB7D,OAAS,EAAG,CAEnC,MAAM+D,EAAY,IAAIC,IAWtB,OATA5E,KAAKpB,QAAQiG,QAASlD,IACpB,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DgD,EAAUpE,IAAIJ,EAAOwB,KAGvB3B,KAAKyE,gBAAgBI,QAASlD,IAC5B,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DgD,EAAUpE,IAAIJ,EAAOwB,KAEhBjD,MAAMoG,KAAKH,EAAUI,UAE9B,OAAO/E,KAAKpB,UAGhBoG,MAAO,CAELpG,QAAS,CACPqG,WAAW,EACXC,QAAQC,GAG4B,IAAhCnF,KAAKyE,gBAAgB7D,QACrBlC,MAAMqB,QAAQoF,IACdA,EAAWvE,OAAS,IAEpBZ,KAAKyE,gBAAkB,IAAIU,OAKnCC,UAEEC,OAAOC,iBAAiB,UAAWtF,KAAKuF,gBAE1CC,gBAEEH,OAAOI,oBAAoB,UAAWzF,KAAKuF,gBAE7C/D,QAAS,CAGPkE,wBAAwBpB,GAEtB,GAAIA,MAAAA,EACF,OAAOA,EAGT,IAGE,OAAOqB,KAAKC,MAAMD,KAAKE,UAAUvB,IACjC,MAAOwB,GAIP,GAHAC,QAAQC,KAAK,iCAAkCF,GAG3CpH,MAAMqB,QAAQuE,GAEhB,OAAoB,IAAhBA,EAAK1D,OACA,GAGF0D,EAAKrE,IAAKC,GAASF,KAAK0F,wBAAwBxF,IAGzD,GAAoB,iBAAToE,EAAmB,CAC5B,MAAM2B,EAAS,GACf,IAAK,MAAMpD,KAAOyB,EAChB,GAAIhF,OAAO4G,UAAUC,eAAeC,KAAK9B,EAAMzB,GAC7C,IACEoD,EAAOpD,GAAO7C,KAAK0F,wBAAwBpB,EAAKzB,IAChD,MAAOwD,GAEPN,QAAQC,KAAK,+BAA+BnD,EAAOwD,GAIzD,OAAOJ,EAIT,OAAO3B,IAGXgC,cAEE,GAAItG,KAAKZ,SACP,OAIF,MAAMmH,EAAQ,gBACZvG,KAAKqE,OAAS,aACZmC,KAAKC,WAAWzG,KAAKuE,YAKnBmC,EAAoBhI,MAAMqB,QAAQC,KAAKxB,YACzCwB,KAAKxB,WACL,GAGJ,IAAImI,EAAc,KACdD,EAAkB9F,OAAS,IAC7B+F,EAAcD,GAEhB,MAAME,EACJD,MAAAA,EACI,KACA3G,KAAK0F,wBAAwBiB,GAG7BE,EAAU,CACdpI,KAAM,oBACN4F,MAAOrE,KAAKqE,OAAS,GACrBxF,SAAUmB,KAAKnB,SACfgB,aAAc+G,EACdrH,SAAUS,KAAKT,SACfC,SAAUQ,KAAKR,SACf+E,UAAWgC,GAIb,GAAIlB,OAAOyB,QAAUzB,OAAOyB,SAAWzB,OACrC,IACEA,OAAOyB,OAAOC,YAAYF,EAAS,KACnC,MAAOf,GACPC,QAAQD,MAAM,yBAA0BA,QAI1CC,QAAQC,KACN,8CAKJhG,KAAKwE,iBAAiB+B,GAAS,CAACpG,EAAO6G,KAGnCA,GACAtI,MAAMqB,QAAQiH,IACdA,EAAYpG,OAAS,GAGrBZ,KAAKiH,aAAaD,GAGpBhH,KAAKkH,aAAa/G,GAClBH,KAAKmH,aAAahH,KAGtBoF,cAAcvD,GAIZ,MAAMsC,EAAOtC,EAAMsC,KAGnB,GAAIA,GAAsB,wBAAdA,EAAK7F,KAAgC,CAC/C,MAAM4F,MAAEA,EAAKlE,MAAEA,EAAK6G,YAAEA,EAAWzC,UAAEA,GAAcD,EAGjD,GAAID,IAAUrE,KAAKqE,MACjB,OAIF,MAAM+C,EAAWpH,KAAKwE,iBAAiBD,GACnC6C,IAKFA,EAASjH,EAAO6G,UAEThH,KAAKwE,iBAAiBD,MAKnC0C,aAAaI,GACX,IAAK3I,MAAMqB,QAAQsH,IAAiC,IAApBA,EAASzG,OACvC,OAIF,MAAM+D,EAAY,IAAIC,IAGtB5E,KAAKyE,gBAAgBI,QAASlD,IAC5B,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DgD,EAAUpE,IAAIJ,EAAOwB,KAIvB0F,EAASxC,QAASlD,IAChB,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DgD,EAAUpE,IAAIJ,EAAOwB,KAIvB3B,KAAKyE,gBAAkB/F,MAAMoG,KAAKH,EAAUI,WAE9CmC,aAAa/G,GACXH,KAAKU,MAAM,oBAAqBP,GAEhCH,KAAKsH,mBAEPH,aAAahH,GACXH,KAAKU,MACH,SACAP,EACAH,KAAKyE,iBAAmBzE,KAAKyE,gBAAgB7D,OAAS,EAClDZ,KAAKnB,SACHmB,KAAKyE,gBACLzE,KAAKyE,gBAAgB,GACvBzE,KAAKnB,SACL,GACA,OAIRyI,kBAEEtH,KAAKuH,UAAU,KACbvH,KAAKuH,UAAU,KACb,IAEE,GACEvH,KAAKoE,kBACLpE,KAAKoE,iBAAiBoD,KACtBxH,KAAKqE,MAKL,YAHArE,KAAKoE,iBAAiBoD,IAAIC,cAAczH,KAAKqE,OAAOqD,MAAM,QAO5D,IAAIZ,EAAS9G,KAAK2H,QAClB,KAAOb,GAAQ,CACb,GACEA,EAAOc,UACkB,eAAzBd,EAAOc,SAASpK,MAChBsJ,EAAOe,KACP,CACI7H,KAAKqE,OAASyC,EAAOe,KAAKJ,eAC5BX,EAAOe,KAAKJ,cAAczH,KAAKqE,OAAOqD,MAAM,QAI9C,MAEFZ,EAASA,EAAOa,SAElB,MAAO7B,GACPC,QAAQC,KAAK,yBAA0BF,6ECtXjDlI,EAgBK,MAAA,CAhBCuF,4BAAOR,EAAW2D,aAAA3D,EAAA2D,eAAAzC,MACtBiE,EAcCC,EAAA,CAbEC,cAAarF,EAAUnE,WACvBI,QAAS+D,EAAa+B,cACtB7F,SAAU8D,EAAQ9D,SAClBoJ,gBAAetF,EAAW5D,YAC1BG,YAAayD,EAAWzD,YACxBE,SAAUuD,EAAQvD,SAClBC,QAAOsD,EAAKtD,OACZE,SAAUoD,EAAQpD,SAClBC,SAAUmD,EAAQnD,SAClBC,WAAYkD,EAAUlD,WACtBC,SAAUiD,EAAQjD,SAClBwI,sBAAoBvF,EAAYuE,aAChCiB,SAAQxF,EAAYwE,8LCP3B,IAAAjD,EAAe,CACbkE,EACAC,EACAC,EACAC,EACAC,EACArE,EACAsE,GCbaC,EAAA,CACXlL,KAAM,WACNmL,WAAY,QACZC,UAAUC,GACN,MAAMtK,EAAQsK,EAAIC,KAAKvK,MAClBwK,EAAYxK,EAAO,aACpBA,EAAMK,QAAUiK,EAAIC,KAAKlK,SAAW,MCNjCoK,EAAA,IACRN,EAAUlL,KAAM,SCARyL,EAAA,IACVP,EACHlL,KAAM,SACNoL,UAAUC,GACR,MAAMtK,EAAQsK,EAAIC,KAAKvK,MAClBwK,EAAYxK,EAAO,aAAYA,EAAMK,QAAUiK,EAAIC,KAAKlK,SAAW,IAGxE,MAAMsK,EAAYL,EAAIM,WAAW,SACfD,IAAmC,IAAtBA,EAAUE,UAIvC7K,EAAMa,UAAW,EACjBb,EAAM6K,SAAU,IAGpBC,OAAOC,EAAUT,GAEf,MAAMK,EAAYL,EAAIM,WAAW,SAIjC,GAHkBD,IAAmC,IAAtBA,EAAUE,SAGxBE,EAASF,QAAS,CAEjC,MAAMG,EAAc,IAAKD,GAEzB,OADAC,EAAYC,gBAAkBF,EAASF,QAChCP,EAAIY,QAAQC,cAAcb,EAAKU,GAIxC,OAAOV,EAAIY,QAAQC,cAAcb,EAAKS,KChC3BK,EAAA,CACbnM,KAAM,WACNoL,UAAUC,GACR,MAAMtK,EAAQsK,EAAIC,KAAKvK,MAClBwK,EAAYxK,EAAO,aAAYA,EAAMK,QAAUiK,EAAIC,KAAKlK,SAAW,IAGxE,MAAMsK,EAAYL,EAAIM,WAAW,SACfD,IAAmC,IAAtBA,EAAUE,UAIvC7K,EAAMa,UAAW,EACjBb,EAAM6K,SAAU,IAGpBC,OAAOC,EAAUT,GAEf,MAAMK,EAAYL,EAAIM,WAAW,SAIjC,GAHkBD,IAAmC,IAAtBA,EAAUE,SAGxBE,EAASF,QAAS,CAEjC,MAAMG,EAAc,IAAKD,GAEzB,OADAC,EAAYC,gBAAkBF,EAASF,QAChCP,EAAIY,QAAQC,cAAcb,EAAKU,GAIxC,OAAOV,EAAIY,QAAQC,cAAcb,EAAKS,KC9B1C,MAAMM,EAAc,CAClBC,KAAM,aACNC,MAAO,UACPC,KAAM,UACNC,QAAS,UACTC,KAAM,QAGFzM,EAAO,aAEb,IAAe0M,EAAA,MACb1M,EACA2M,MACS,CAAC,OAAQ,QAAS,QAAQC,OAC/B,CAACC,EAAS5L,KACR4L,EAAQ5L,GAAQ6L,EAAe9M,EAAM,CAAEiB,KAAAA,IAChC4L,GAET,CACEE,UAAWD,EAAe9M,EAAM,CAAEiB,KAAM,UACxC+L,cAAeF,EAAe9M,EAAOiN,GACnCA,EAAElM,MAAM,CAAEE,KAAM,QAASiM,UAAU,OAK3C/B,WAAY,QACZC,UAAUC,GACR,MAAMtK,EAAQsK,EAAIC,KAAKvK,MACjBE,EAAOF,EAAME,MAAQF,EAAMoM,OAC5BpM,EAAMqM,cACTrM,EAAMqM,aACHhB,EAAYnL,IAASmL,EAAkB,QACvCrL,EAAMmM,UAAcjM,GAAiB,SAATA,EAAiC,GAAd,eAGtD4K,OAAMA,CAACC,EAAUT,IACRA,EAAIY,QAAQoB,QACS,IAAzBhC,EAAIC,KAAKvK,MAAMuM,MAAiB,QAAU,QAAU,UACrDjC,EAAIC,KAAMQ,ICrChB,IAAeyB,EAAA,MAFF,SAIXZ,MAAO,CACLY,OAAQ,CAAC1G,EAAOlE,IAAUmK,EALjB,SAKiBA,CAAqB,GAAIjG,EAAOlE,IAE5DkJ,OAAMA,IACG,ICPX,IAAe2B,EAAA,MADF,QAGXb,MACS,CAAC,WAAY,MAAO,QAAS,OAAQ,WAAY,UAAUC,OAChE,CAACD,EAAO1L,KACN0L,EAAM1L,GAAQ6L,EANT,QAM8B,CAAE7L,KAAAA,IAC9B0L,GAET,CACEc,MAAOX,EAVF,QAUuB,CAAE7L,KAAM,WAI1CkK,WAAY,QACZU,OAAOC,EAAUT,GACf,IAAIpK,EAAOoK,EAAIC,KAAKvK,MAAME,KAS1B,OAR0D,IAAtD,CAAC,WAAY,SAAU,YAAYyM,QAAQzM,KAAcA,EAAO,SAEpEA,EACE,CACE0M,SAAU,YACVC,OAAQ,eACRC,SAAU,kBACV5M,IAAS,SACNoK,EAAIY,QAAQoB,MAAMS,KAAK7M,EAAMoK,EAAIC,KAAMQ,KC3BnCiC,EAAA,CACX/N,KAAM,aACNmL,WAAY,QACZC,UAAUC,GACN,MAAMtK,EAAQsK,EAAIC,KAAKvK,MAClBA,EAAMqM,cACPrM,EAAMqM,YAAc,aAG5BvB,OAAMA,CAACC,EAAUT,IACNA,EAAIY,QAAQoB,MAAM,SAAmC,IAAzBhC,EAAIC,KAAKvK,MAAMuM,MAAiB,QAAU,IAAM,UAAUjC,EAAIC,KAAMQ,ICVhGkC,GAAA,CACXhO,KAAM,OACNmL,WAAY,cACZC,UAAUC,GACN,MAAMtK,EAAQsK,EAAIC,KAAKvK,MAClBA,EAAMkN,WAIDlN,EAAMkN,WAAW5I,MAAKtE,EAAMkN,WAAW5I,IAAM,MAHnDtE,EAAMkN,WAAa,CACf5I,IAAK,MAGbtE,EAAMmN,YAAc7C,EAAI8C,KAAKxL,MAC7B5B,EAAMqN,WAAY,ICXXC,GAAA,CACXrO,KAAM,QACN6L,OAAMA,CAACyC,EAAGjD,IACCA,EAAIgC,MAAMkB,IAAI,CAACxN,MAAO,CAACyN,KAAM,KAAM,CACtCrN,QAASA,IAAM,CACXkK,EAAIgC,MAAMgB,IAAIhD,EAAIC,KAAMgD,OCDxC,ICUeG,GAAA,CACbvD,EACAwB,ECZa,IACRA,OAHM,cAKTC,MAAO,GACPd,OAAMA,CAACC,EAAUT,IACNA,EAAIY,QAAQoB,MAAmB,YAAEhC,EAAIC,KAAMQ,IDSxDyB,EACAC,EACAO,EDhBa,IACRA,EACH/N,KAJS,kBAKT6L,OAAMA,CAACC,EAAUT,IACNA,EAAIY,QAAQoB,MAAuB,gBAAEhC,EAAIC,KAAMQ,ICc5DkC,GACAxC,EACAC,EACAU,EACAkC,GEvBa,CACbrO,KAAM,iBACNmL,WAAY,aAEZuD,YAAWA,CAAC/L,EAAO0I,IAEb1I,MAAAA,GAAmD,KAAVA,EACpC,GAELzB,MAAMqB,QAAQI,GAETA,EAAMF,IAAKC,IAEE,iBAATA,GACE,OAATA,QACgBjB,IAAfiB,EAAKC,OAAuBD,EAAKI,MAM7BJ,IAIJ,CAACC,GAGVgM,QAAOA,CAACC,EAAWvD,IAEVuD,EAETxD,UAAUC,GACR,MAAMtK,EAAQsK,EAAIC,KAAKvK,MAUvB,GARKwK,EAAYxK,EAAO,aACtBA,EAAMK,QAAUiK,EAAIC,KAAKlK,SAAW,IAGjCmK,EAAYxK,EAAO,WACtBA,EAAM8F,MAAQwE,EAAI8C,KAAKtH,OAAS,SAGXpF,IAAnB4J,EAAI8C,KAAKxL,MAAqB,CAChC,MAAMN,EAAegJ,EAAI8C,KAAKxL,MAE5BN,MAAAA,GAEiB,KAAjBA,EAEAgJ,EAAI8C,KAAKxL,MAAQ,GACPzB,MAAMqB,QAAQF,KACxBgJ,EAAI8C,KAAKxL,MAAQ,CAACN,MAIxBwJ,OAAOC,EAAUT,GAEf,MAAMwD,EAAQxD,EAAIY,QAAQC,cAAcb,EAAKS,GAG7C,GAAI+C,GAASA,EAAM9N,OAAS8N,EAAM9N,MAAM+N,GAAI,CAE1C,MAAMC,EAA2BF,EAAM9N,MAAM+N,GAAG,qBAG1ChF,EAAkBA,KAGtBkF,EAAS,KACPA,EAAS,KACP,IAEE,MAAMC,EAAY5D,EAAI8C,KAAKtH,MAC3B,GAAIoI,EAIF,YAHA5D,EAAI6D,QAAQlF,IAAIC,cAAcgF,GAAW/E,MAAM,QAOjD,MAAMiF,EAAW9D,EAAI6D,QAAQE,YAAY/D,EAAI8C,KAAKtH,OAC9CsI,GAAYA,EAASE,IACvBhE,EAAI6D,QAAQI,SAASrF,cAAckF,EAASE,IAAInF,MAAM,QAIxD,MAAO5B,GAEPC,QAAQC,KAAK,yBAA0BF,SAO/CuG,EAAM9N,MAAM+N,GAAG,qBAAuB,IAAIzI,KAEpC0I,GACFA,KAA4B1I,GAG9ByD,KAIF,MAAMyF,EAAiBV,EAAM9N,MAAM+N,GAAW,OAE5CD,EAAM9N,MAAM+N,GAAW,OADrBS,EACyB,IAAIlJ,KAE7BkJ,KAAkBlJ,GAElByD,KAIyBA,EAI/B,OAAO+E,KC3HX,IAAeW,GAAA,CACbC,QAASC,WACTC,QAASD,WACTE,OAAQF,UACRG,KAAMH,QACNI,OAAQJ,UACRK,KAAML,QACN9E,OAAQ,WACRuB,SAAUuD,YACV3B,WAAY2B,cACZM,gBAAiBN,mBACjBhD,WAAYgD,cACZO,YAAaP,eACbQ,OAAQR,UACRjE,OAAQiE,UACRxE,SAAUwE,iBACVlE,MAAOkE,cACPlC,MAAOkC,SACPS,YAAaT,eACbU,WAAYV,cACZ9B,OAAQ8B,eACRW,cAAeX,iBACf/B,SAAU+B,YACVY,SAAUZ,YACVa,KAAMb,QACN7E,MAAO,UACP0D,IAAKmB,OACLrB,IAAKqB,OACL1B,KAAM0B,QACNc,aAAcd,gBACde,SAAUf,YACV5E,MAAO,UACP4F,MAAO,UACP3F,QAAS,YACT4F,OAAQ,aC1BV,SAASC,GAAK7P,EAAOf,GACduL,EAAYxK,EAAOf,IACpB6Q,EAAGlP,OAAOZ,EAAMf,MAClBe,EAAMf,GAAQ,CAAE4C,CAAC5C,GAAOe,EAAMf,GAAO8Q,MAAM,IAI/C,SAASC,GAAQ/N,GACf,OAAe,IAARA,EAST,SAASgO,GAAS7C,GAChB,MAAM8C,EAAQ,IAAK9C,GAEnB,cADO8C,EAAMnF,SACNmF,EAGT,IAAeC,GAAA,CACbC,WACE,MAAMZ,EAAO/N,KAAK+N,OAClB,OAAIA,EACKA,EAAKY,WAEL,IAAIC,QAASC,GAAMA,MAG9BpH,cAAcpD,GACZ,MAAM0J,EAAO/N,KAAK+N,OAClB,OAAIA,EACKA,EAAKe,eAAezK,GAEpB,IAAIuK,QAASC,GAAMA,MAG9BE,mBAAmBlG,GACjB,MAAMmG,EAAQhP,KAAKiP,GAAGC,KAAKrG,EAAIsG,SAC3BH,GACFA,EAAMI,iBAGVC,YAAYzQ,IACT,CAAC,YAAa,WAAY,MAAO,OAAQ,OAAQ,MAAO,SAASiG,QAC/DrH,KArCP,SAAkBmE,EAAKnE,GACjBuL,EAAYpH,EAAKnE,KAAU6Q,EAAG/O,OAAOqC,EAAInE,MAC3CmE,EAAInE,GAAQ,CAAE8Q,OAAQ3M,EAAInE,KAoCtB8R,CAAS1Q,EAASpB,KAGfoB,GAET4P,SAAQA,EAAC1F,KAAEA,MACTsF,GAAKtF,EAAM,SACXsF,GAAKtF,EAAM,QACJA,GAETF,UAAUC,GACR,MAAM0G,EAAM,CACVC,KAAM,CACJ/Q,KAAM,UACNgR,UAAW,UACXpC,KAAM,0BAERpK,MAAO,GACP8I,IAAK,CAAEC,KAAM,IACb0D,KAAM,IAUR,GARC,CAAC,OAAQ,OAAQ,MAAO,SAAS7K,QAASrH,IACzCqL,EAAIC,KAAKtL,GAAQmS,EACf,CAAC3P,KAAKpB,QAAQpB,IAAS,GAAIqL,EAAIC,KAAKtL,IAAS,IAC7C+R,EAAI/R,MAKc,WAAlBqL,EAAI8C,KAAKlN,MAAsBoK,EAAIC,KAAKvK,MAAMqR,WAuB3C,GAAsB,WAAlB/G,EAAI8C,KAAKlN,MAAqBoK,EAAIC,KAAKvK,MAAMqR,UAAW,CAEjE,MAAMC,EAAoBhH,EAAIC,KAAKvK,MAAMqR,UACnCE,EAAqB,SAAUC,GAC/B1K,OAAOyB,QAAUzB,OAAOyB,SAAWzB,QACrCA,OAAOyB,OAAOC,YACZ,CACEtI,KAAM,iBACNsR,KAAM,CACJC,IAAKD,EAAKC,IACVxS,KAAMuS,EAAKvS,KACXyS,IAAKF,EAAKE,IACVC,KAAMH,EAAKG,KACXzR,KAAMsR,EAAKtR,MAEb0R,UAAW3J,KAAKC,OAElB,MAINoC,EAAIC,KAAKvK,MAAMqR,UAAY,SAAUG,GACnCD,EAAmBC,GACfF,GAAkD,mBAAtBA,GAC9BA,EAAkBO,MAAMpQ,KAAMqQ,iBA/CyB,CAC3D,MAAMP,EAAqB,SAAUC,GAC/B1K,OAAOyB,QAAUzB,OAAOyB,SAAWzB,QACrCA,OAAOyB,OAAOC,YACZ,CACEtI,KAAM,iBACNsR,KAAM,CACJC,IAAKD,EAAKC,IACVxS,KAAMuS,EAAKvS,KACXyS,IAAKF,EAAKE,IACVC,KAAMH,EAAKG,KACXzR,KAAMsR,EAAKtR,MAEb0R,UAAW3J,KAAKC,OAElB,MAINoC,EAAIC,KAAKvK,MAAMqR,UAAY,SAAUG,GACnCD,EAAmBC,MAgCzBO,kBAAiBA,KCxIV,CACLvC,KAAM,CACJwC,kBAAkB,EAClBC,OAAQ,aACRC,WAAY,QACZC,SAAU,CACR1E,KAAM,GAER2E,WAAY,CACV3E,KAAM,IAER4E,sBAAsB,GAExB/E,IAAK,CACHgF,OAAQ,GAEVC,UAAW,CACT1R,UAAU,EACVgK,SAAS,EACT3K,KAAM,UACNsS,UAAW,GACXzC,MAAM,EACNvC,SAzBQ9M,EA0BR+R,WA1BQ/R,GA4BVgS,SAAU,CACR7R,UAAU,EACVgK,SAAS,EACT3K,KAAM,UACNsS,UAAW,GACXzC,MAAM,EACNvC,SAlCQ9M,EAmCR+R,WAnCQ/R,KD8IZiS,gBAAeA,CAACvC,EAAUwC,KACxBxC,EAASwC,UAAY,CAACxF,EAAMxL,IACnB,IAAIyO,QAAQ,CAACwC,EAASC,IAQpBF,EAAUhR,EAPCmR,IACZA,EACFD,EAAOC,GAEPF,OAMDzC,GAET4C,SACE,MAAMxD,EAAO/N,KAAKpB,QAAQmP,KAC1B/N,KAAK2L,KAAO,CACVpN,MAAO,IAAKwP,GACZzB,GAAI,CACFkF,OAASnL,IACPA,EAAEoL,mBAGNpS,MAAO0O,EAAK1O,MACZZ,KAAM,SAGViT,eACE,MAAM7O,IAAEA,EAAG8O,IAAEA,EAAGjF,QAAEA,GAAY1M,KACxB+N,EAAO/N,KAAKpB,QAAQmP,KAC1B6D,EAAO5R,KAAK2L,KAAM,CAChB9I,IAAAA,EACA8O,IAAAA,EACAjU,MAAO,CACLqQ,EAAK8D,UACL9D,EAAKrQ,MACL,cACAsC,KAAK0M,QAAQoF,QAAU,aAAe,MAG1CF,EAAO5R,KAAK2L,KAAKpN,MAAO,CACtBwT,MAAOrF,EAAQsF,YAGnB3I,OAAOC,GAIL,OAHIA,EAAS2I,YAAcjS,KAAK0M,QAAQoF,SACtCxI,EAAS4I,aAAQjT,EAAW,IAAMe,KAAKmS,eAElCnS,KAAKoS,GACVpS,KAAK2L,KACL4C,GAAQvO,KAAKpB,QAAQiN,IAAIyC,MACrBhF,EAAS+I,WACT,CAACrS,KAAKsS,QAAQhJ,MAGtBiJ,SAAS1J,EAAKS,GACZ,MAAMqC,EAAO9C,EAAIC,KACX0J,EAAM,GAAGxS,KAAK6C,MAAMgG,EAAIhG,MACxBkJ,EAAMJ,EAAKI,IACX0G,EAAUzS,KAAKyS,QAAQ9G,KAA6B,IAApBA,EAAK+D,KAAKzM,OAC1CuN,OAAEA,EAAQzE,IAAK2G,GAAS1S,KAAK2L,KAAKpN,MAClCoU,EAAMhH,EAAK+D,KAAKhS,aACfiO,EAAK+D,KAAKhS,aACViO,EAAK+D,KAAKzM,MACjB,MAAM/C,EAAOqO,GAAQ5C,EAAK+D,KAAKpB,MAC3BhF,EACAtJ,KAAKoS,GACHzC,EAAW,CACThE,EAAK+D,KACL,CACEnR,MAAO,IACFiQ,GAAS7C,EAAK+D,MAAQ,IACzBkD,YAAajH,EAAKiH,cAAe,EACjCpV,KAAMqL,EAAIgE,GACVgG,MAAOhK,EAAIiK,oBACI,eAAXtC,EACA,CAAEE,SAAU,GAAIC,WAAY,IAC5B,IAENjT,MAAOsC,KAAKyJ,QAAQsJ,WAClBJ,GAAOhH,EAAKkG,UACZ,gBAEFhP,IAAQ2P,EAAH,KACLb,IAAK9I,EAAIsG,QACT1Q,KAAM,cAGV,CACEE,QAASA,IAAM2K,KACXmJ,EAAU,CAAEnS,MAAOA,IAAMN,KAAKgT,SAASrH,EAAM6G,EAAK3J,IAAS,KAGvE,MAAkB,WAAX2H,GAAuBjC,GAAQmE,IAASnE,GAAQxC,EAAIuC,MACvDpO,EACAF,KAAKiT,QAAQtH,EAAM6G,EAAK,CAACtS,KAE/BuS,QAAQ9G,GACN,IAAgC,IAA5B3L,KAAKpB,QAAQmP,KAAK9K,MAAiB,OAAO,EAC9C,MAAMA,EAAQ0I,EAAK1I,MACnB,SAAWA,EAAMA,QAAUA,EAAMiQ,QAAW3E,GAAQtL,EAAMqL,QAE5D0E,SAASrH,EAAM6G,EAAK3J,GAAK,IAAAsK,EAAAC,EACvB,MAAMC,EAAY,IAAK1H,EAAK1I,OACtBqQ,EAAW,IAAK3H,EAAK6D,MAC3B,IAAgC,IAA5BxP,KAAKpB,QAAQmP,KAAK9K,MAAiB,OAAO,EAC9C,IAAMoQ,EAAUpQ,QAAUoQ,EAAUH,QAAW3E,GAAQ8E,EAAU/E,MAC/D,OACF,MAAMiF,EArPa,YAqPKD,EArPd7U,KAsPV,MAAM+U,EAAYxT,KAAKyT,QAAQ,SACzBnK,EAAW,CACfkK,EACIA,EAAU,CACRvQ,cAAKkQ,EAAEtK,EAAI6K,eAAO,IAAAP,GAAU,QAAVA,EAAXA,EAAaQ,gBAAbR,IAAqBA,OAArBA,EAAAA,EAAuBhT,MAC9BwL,KAAM9C,EAAI8C,KACV/M,QAASoB,KAAKpB,kBACdwU,EACFvK,EAAI6K,eAAO,IAAAN,GAAU,QAAVA,EAAXA,EAAaO,gBAAbP,IAAqBA,OAArBA,EAAAA,EAAuBjT,OAG7B,IACGoO,GAAQ+E,EAAShF,QACjBgF,EAAS9D,MAAQ8D,EAASJ,UAC1B3E,GAAQ+E,EAASjG,MAClB,CACA,MAAMvE,EAAO,CACXrK,KAAM6U,EAAS7U,MAAQ,UACvBF,MAAOiQ,GAAS8E,GAChBzQ,IAAQ2P,EAAH,cAGA1J,EAAKvK,MAAM8O,YACXvE,EAAKvK,MAAM+P,YACXxF,EAAKvK,MAAMiR,YACX1G,EAAKvK,MAAMqV,aACX9K,EAAKvK,MAAM2U,OAElB,MAAM7O,EAAQkP,EAAQ,QAAU,UACsB,IAAAM,EAAtD,GAAIP,EAAS9D,OAASzG,EAAYD,EAAKvK,MAAO8F,GAC5CyE,EAAKvK,MAAM8F,GAAoB,QAAdwP,EAAGhL,EAAI6K,eAAOG,IAAAA,WAAAA,EAAXA,EAAaC,eAAO,IAAAD,OAAA,EAApBA,EAAsB1T,MAE5CmJ,EAA4B,SAAnBgK,EAASM,MAAmB,UAAY,QAC/C5T,KAAKoS,GAAGzC,EAAW,CAAC2D,EAAUxK,IAAQ,CACpC1I,CAACiT,EAAUU,MAAQ,WAAY,IAC7B/T,KAAKoS,GAAG,CACN3T,MACoB,IAAlB6U,EAASjG,KACL,yBACAiG,EAASjG,MAAQ,GACvB9O,MAAO,CACLE,MACoB,IAAlB6U,EAASjG,KACL,yBACAiG,EAASjG,MAEjBxK,IAAQ2P,EAAH,SAMf,MAAMwB,EAAQrE,EAAW,CACvB0D,EACA,CACE9U,MAAOiQ,GAAS6E,GAChBxQ,IAAQ2P,EAAH,MACL9U,MAAO,gBACPe,KAAM4U,EAAU5U,MAAQ,UAQ5B,cAJOuV,EAAMzV,MAAM+P,YACZ0F,EAAMzV,MAAM0E,aACZ+Q,EAAMzV,MAAM2U,OAEZlT,KAAKoS,GAAG4B,EAAO1K,IAExB2J,QAAQtH,EAAM6G,EAAKlJ,GACjB,MAAMyC,EAAMJ,EAAKI,IACjB,OAAO/L,KAAKoS,GACV,CACE1U,MAAOsC,KAAKyJ,QAAQsJ,WAAWhH,EAAIrO,MAAO,eAC1Ce,KAAM,MACNF,MAAOwN,GAAO,CAAEC,KAAM,IACtBnJ,IAAQ2P,EAAH,OAEPlJ,IAGJgJ,QAAQhJ,GACN,MAAMuC,EAAM7L,KAAKpB,QAAQiN,KAAO,GAChC,OAAO7L,KAAKoS,GACV,CACE3T,KAAM,MACNF,MAAOsN,EACPnO,MAAOsC,KAAKyJ,QAAQsJ,WAAWlH,EAAInO,MAAO,eAC1CmF,IAAQ7C,KAAK6C,IAAR,OAEPyG,IAGJ6I,cACE,IAAI8B,EAAK,GAOT,GANK1F,GAAQvO,KAAKpB,QAAQkS,UAAUxC,OAClC2F,EAAGC,KAAKlU,KAAKmU,iBAEV5F,GAAQvO,KAAKpB,QAAQqS,SAAS3C,OACjC2F,EAAGC,KAAKlU,KAAKoU,iBAEVH,EAAGrT,OACN,OAEF,IAAI8P,SAAEA,EAAQC,WAAEA,EAAUH,OAAEA,GAAWxQ,KAAK2L,KAAKpN,MAClC,eAAXiS,IACFE,EAAWC,EAAa,IAE1B,MAAMzQ,EAAOF,KAAKoS,GAChB,CACE3T,KAAM,WACNf,MAAO,8BACPmF,IAAQ7C,KAAK6C,IAAR,KACLtE,MAAO,CACLmS,SAAAA,EACAC,WAAAA,EACArQ,MAAO,IACP+T,OAAO,IAGXJ,GAGF,MAAkB,WAAXzD,EACHtQ,EACAF,KAAKoS,GACH,CACE3T,KAAM,MACNf,MAAO,cACPa,MAAO,CAAEyN,KAAM,IACfnJ,IAAQ7C,KAAK6C,IAAR,MAEP,CAAC3C,KAITkU,eACE,MAAMnD,EAAW,IAAKjR,KAAKpB,QAAQqS,UAC7BF,EACJE,EAASF,WAAa/Q,KAAK0M,QAAQlF,IAAI8M,EAAE,UAAY,KAKvD,cAJOrD,EAASF,iBACTE,EAASD,aACTC,EAASlF,WACTkF,EAAS3C,KACTtO,KAAKoS,GACV,CACE3T,KAAM,SACNF,MAAO0S,EACPvT,MAAO,eACP2B,MAAO,CAAErB,MAAOiT,EAASjT,MAAOuW,WAAY,QAC5CjI,GAAI,CACF0E,MAAOA,KACL,MAAMwD,EAAOxU,KAAK0M,QAAQlF,IAC1BxH,KAAKpB,QAAQqS,SAASD,MAClBhR,KAAKpB,QAAQqS,SAASD,MAAMwD,GAC5BA,EAAKC,gBAGb5R,IAAQ7C,KAAK6C,IAAR,MAEP,CAACkO,KAGLoD,gBACE,MAAMrD,EAAY,IAAK9Q,KAAKpB,QAAQkS,WAC9BC,EACJD,EAAUC,WAAa/Q,KAAK0M,QAAQlF,IAAI8M,EAAE,WAAa,KAKzD,cAJOxD,EAAUC,iBACVD,EAAUE,aACVF,EAAU/E,WACV+E,EAAUxC,KACVtO,KAAKoS,GACV,CACE3T,KAAM,SACNF,MAAOuS,EACPpT,MAAO,gBACP2B,MAAO,CAAErB,MAAO8S,EAAU9S,OAC1BsO,GAAI,CACF0E,MAAOA,KACL,MAAMwD,EAAOxU,KAAK0M,QAAQlF,IAC1BxH,KAAKpB,QAAQkS,UAAUE,MACnBhR,KAAKpB,QAAQkS,UAAUE,MAAMwD,GAC7BA,EAAKhD,SAAS9J,MAAM,UAG5B7E,IAAQ7C,KAAK6C,IAAR,MAEP,CAACkO,MEpbP,MAAM5G,GAAQ,GAuDd,IAAmBM,GCpDnB,SAASiK,GAAYC,EAAKpF,GAGxB,OAFIlB,EAAGvP,QAAQ6V,GAAMA,EAAM,CAAErG,KAAMqG,GACzBtG,EAAGuG,MAAMD,IAAStG,EAAG/O,OAAOqV,KAAMA,EAAM,CAAErG,KAAMiB,IACnDoF,EAGM,SAASE,GAAUrN,EAAKsN,GACrC,MAAO,CACLC,OAAMA,IACGD,EAAEhI,SAASiB,OAEpBiH,OAAOnI,GACL,MAAMhE,EAAMiM,EAAElI,YAAYC,GAC1B,GAAKhE,EACL,OAAOiM,EAAE7F,GAAGC,KAAKrG,EAAIsG,UAEvBR,SAASvH,GACA,IAAIwH,QAAQ,CAACwC,EAASC,KAC3B,MAAM4D,EAAQzN,EAAI8B,SACZ4L,EAAM,CAACJ,EAAEhI,SAAS6B,YACxBsG,EACG9S,OAAQ0M,IAAOA,EAAEsG,SACjBtQ,QAASgK,IACRqG,EAAIhB,KAAKrF,EAAEF,cAEfC,QAAQsG,IAAIA,GACTE,KAAK,KACJhE,GAAQ,GACRhK,GAAYA,GAAS,KAEtBM,MAAOrB,IACNgL,EAAOhL,GACPe,GAAYA,EAASf,GACrByO,EAAE7F,GAAGoG,KAAK,gBAAiBhP,EAAG,CAAEmB,IAAAA,IAChCsN,EAAEQ,UAAU,gBAAiBjP,EAAG,CAAEmB,IAAAA,QAI1CC,cAAaA,CAACpD,EAAO+C,IACZ,IAAIwH,QAAQ,CAACwC,EAASC,KAC3B,MAAMxI,EAAMiM,EAAElI,YAAYvI,GAC1B,IAAKwE,EAAK,OACV,MAAM0M,EAAMT,EAAEvM,QAAQM,EAAIgE,IACpBqI,EAAM,CAACJ,EAAEhI,SAASrF,cAAcoB,EAAIgE,KAC1C2I,EAAQD,GACLpT,OAAQ0M,IAAOA,EAAEsG,SACjBtQ,QAASgK,IACRqG,EAAIhB,KAAKrF,EAAEF,cAEfC,QAAQsG,IAAIA,GACTE,KAAK,KACJhE,EAAQ,MACRhK,GAAYA,EAAS,QAEtBM,MAAOrB,IACNgL,EAAOhL,GACPe,GAAYA,EAASf,GACrByO,EAAE7F,GAAGoG,KAAK,sBAAuBhP,EAAG,CAAEhC,MAAAA,EAAOmD,IAAAA,QAIrDuH,mBAAmB0G,EAAQC,GAAW,GACpClO,EAAImO,OAAOC,WAAWH,GAAQ5Q,QAASR,IACjCqR,GAAU1V,KAAK6V,sBAAsBxR,GACzCyQ,EAAEgB,QAAQzR,GAAOQ,QAASgE,IACxBiM,EAAEhI,SAASiC,mBAAmBlG,QAIpCgN,sBAAsBJ,GACpBjO,EAAImO,OAAOC,WAAWH,GAAQ5Q,QAASR,IACrCyQ,EAAEgB,QAAQzR,GAAOQ,QAASgE,IACxB,MAAMN,EAAUuM,EAAEvM,QAAQM,EAAIgE,IACzBtE,IACD7J,MAAMqB,QAAQwI,GAChBA,EAAQ1D,QAASkJ,IACfA,EAAKgB,uBAEExG,GACTA,EAAQwG,2BAKhB4F,IAAK,CACHvL,QAASA,CAACA,GAAU,KAClB5B,EAAIuO,eAAe,CAAE3M,UAAWA,KAElChK,SAAUA,CAACA,GAAW,KACpBoI,EAAIuO,eAAe,CAAE3W,WAAYA,KAEnCkP,KAAMA,CAAC0H,GAAS,KACdxO,EAAIuO,eAAe,CAAEzH,OAAQ0H,MAGjC/E,SAAU,CACR7H,QAASA,CAACA,GAAU,KAClB5B,EAAIyO,cAAc,CAAE7M,UAAWA,KAEjChK,SAAUA,CAACA,GAAW,KACpBoI,EAAIyO,cAAc,CAAE7W,WAAYA,KAElCkP,KAAMA,CAAC0H,GAAS,KACdxO,EAAIyO,cAAc,CAAE3H,OAAQ0H,MAGhCD,eAAgBA,CAACxX,EAAQ,MACvB,IAAIoW,EAAMD,GAAYI,EAAElW,QAAQkS,WAAW,GAC3Cc,EAAO+C,EAAKpW,GACZuW,EAAElW,QAAQkS,UAAY6D,EACtBnN,EAAI0O,kBAEND,cAAeA,CAAC1X,EAAQ,MACtB,IAAIoW,EAAMD,GAAYI,EAAElW,QAAQqS,UAAU,GAC1CW,EAAO+C,EAAKpW,GACZuW,EAAElW,QAAQqS,SAAW0D,EACrBnN,EAAI0O,kBAEN1E,OAAMA,CAAC2E,EAAWC,IACT,IAAIxH,QAAQ,CAACwC,EAASC,OAEM,IAA/ByD,EAAElW,QAAQyX,iBACNzH,QAAQwC,UACR5J,EAAImH,YAEPyG,KAAK,KACJ,IAAIpD,EAAWxK,EAAIwK,WACnB8C,EAAEwB,aAAatE,GACZoD,KAAK,KACJ/G,EAAGkI,SAASJ,IAAcK,EAAO,IAAML,EAAUnE,EAAUxK,IAC3D6G,EAAGkI,SAASzB,EAAElW,QAAQ6X,WACpBD,EAAO,IAAM1B,EAAElW,QAAQ6X,SAASzE,EAAUxK,IAC5CsN,EAAE7F,GAAGoG,KAAK,SAAUrD,EAAUxK,GAC9B4J,EAAQY,KAETtK,MAAOrB,SAEXqB,MAAM,IAAI7D,KACTwK,EAAGkI,SAASH,IAAWI,EAAO,IAAMJ,EAAO5O,KAAQ3D,IACnDwN,KAAUxN,OAwDlB6S,QAAQC,IAEgB,iBAAXA,IACTA,EAAS,CAAEC,OAAQD,IAGdnP,EAAIqP,MAAMF,IAGnBG,SAASC,EAAIC,GACX,IAAIC,EAAW,EACf,OAAO,YAAapT,GAClB,MAAMqT,EAAUlX,KACVyG,EAAMD,KAAKC,MACbA,EAAMwQ,IAAaD,GAAS,KAC9BC,EAAWxQ,EACXsQ,EAAG3Q,KAAK8Q,KAAYrT,MAK1BsT,SAASJ,EAAIC,GACX,IAAII,EAAQ,KACZ,OAAO,YAAavT,GAClB,MAAMqT,EAAUlX,KACF,OAAVoX,GACFC,aAAaD,GAEfA,EAAQE,WAAW,KACjBP,EAAG3Q,KAAK8Q,KAAYrT,IACnBmT,GAAS,ODlOpB,SAAkB7M,GACf,CACC,aACA,SACA,QACA,eACA,WACA,aACA,QACA,cACA,gBACA,QACA,OACA,SACA,OACA,SACA,cACAC,OAAO,CAACD,EAAO3M,KACf2M,EAAM3M,GAAQ8M,EAAe9M,GACtB2M,GACNA,GACHA,EAAMoN,KAAOpN,EAAM6D,aACnB7D,EAAMqN,OAASrN,EAAMwD,YACrBxD,EAAMsN,KAAOtN,EAAMoB,WACnBpB,EAAMkB,SAAWlB,EAAM0D,cA+DzB6J,CAASvN,IAtCT,SAAmBA,GACjBA,EAAmB,YAAIG,EAAe,SAAU,CAAEQ,OAAO,IAsC3D6M,CAAUxN,IA7DV,SAAkBA,GAChB,MAAMyN,EAAQ,CACZC,YAAa,CAAC,QAAS,GACvBC,WAAY,CAAC,OAAQ,GACrBC,YAAa,CAAC,QAAS,GACvBC,cAAe,CAAC,QAAS,GACzBC,aAAc,CAAC,OAAQ,GACvBC,cAAe,CAAC,QAAS,IAG3B5Y,OAAO6Y,KAAKP,GAAOxN,OAAO,CAACD,EAAOtH,KAChCsH,EAAMtH,GAAOyH,EAAe,QAAUG,GACpCA,EAAElM,MAAM,CAAEE,KAAMmZ,EAAM/U,GAAK,GAAIuV,UAAWR,EAAM/U,GAAK,MAEhDsH,GACNA,GAEHA,EAAMkO,WAAalO,EAAM0N,YACzB1N,EAAMmO,UAAYnO,EAAM2N,WACxB3N,EAAMoO,WAAapO,EAAM4N,YA2C3BS,CAASrO,IA7BT,SAAmBA,GACjB,MAAMyN,EAAQ,CACZa,MAAO,CAAC,QAAS,GACjB1I,KAAM,CAAC,OAAQ,GACf2I,cAAe,CAAC,OAAQ,GACxBC,eAAgB,CAAC,QAAS,IAG5BrZ,OAAO6Y,KAAKP,GAAOxN,OAAO,CAACD,EAAOtH,KAChCsH,EAAMtH,GAAOyH,EAAe,SAAWG,GACrCA,EAAElM,MAAM,CACNqa,WAAYhB,EAAM/U,GAAK,GACvBuV,UAAWR,EAAM/U,GAAK,MAGnBsH,GACNA,GAEHA,EAAM0O,YAAc1O,EAAMsO,MAC1BtO,EAAM2O,WAAa3O,EAAM4F,KAW3BgJ,CAAU5O,KArCSM,GAsCTN,IApCN6O,eAAiB1O,EADN,SAC2B,CAAE2O,KAAM,aAChDxO,GAAEyO,WAAa5O,EAFF,SAEuB,CAAE2O,KAAM,SAC5CxO,GAAE0O,eAAiB7O,EAHN,SAG2B,CAAE2O,KAAM,aAyBlD,SAA2B9O,GACzBA,EAAMiP,eAAiB9O,EAAe,kBACtCH,EAAMkP,YAAclP,EAAMiP,eAQ5BE,CAAkBnP,IEhGlB,IAAeoP,GAAA,CACbvL,aAAc,QACdrE,SAAU,QACVgE,YAAa,QACbE,cAAe,QACf1C,SAAU,QACVoC,KAAM,QACND,OAAQ,QACRM,WAAY,QACZF,OAAQ,UACR0L,eAAgB,cCRlB,MAAMI,GAAW,CACbhc,KAAM,WACNic,KAAKC,EAAQ/N,EAAMnE,GACf,MAAMhH,EAgCd,SAAkBA,GACd,OAAI6N,EAAGvP,QAAQ0B,GACJ,CAACgZ,SAAUhZ,GACX6N,EAAGlP,OAAOqB,GACV,CAACqG,QAASrG,GACV6N,EAAGuG,MAAMpU,GACT,CAACgZ,UAAU,GACXnL,EAAGkI,SAAS/V,GACZ,CAAC2Q,UAAW3Q,GACX6N,EAAG/O,OAAOkB,GAGXA,EAFA,GA1CKmZ,CAASD,EAAOE,YAC5B,IAAqB,IAAjBpZ,EAAIgZ,SACJE,EAAOG,YACPrS,EAAIuH,mBAAmB,CAACpD,EAAKtH,YAC1B,CAAA,IAAAyV,EACH,MAAMnL,EAAW,CACb6K,UAAU,EACVrI,UAASA,CAACrF,EAAG+C,IACF,IAAID,QAAQ,CAACwC,EAASC,KACzBhD,EAAG0L,MAAMlL,GAAKwC,EAAO1C,EAAS9H,SAAWuK,SAG9C5Q,GAEDyC,EAA2B6W,QAAtBA,EAAGnO,EAAKqO,OAAOtG,mBAAOoG,WAAAA,EAAnBA,EAAqBnG,gBAAQ,IAAAmG,OAAA,EAA7BA,EAA+B3Z,MAC7C,GAAKwO,EAAS9H,QAEP,CACH,MAAMoT,EAAQtL,EAAS9H,QAAQoT,MAAM,6BACjCA,IACAtL,EAAS9H,QAAUW,EAAI8M,EAAE2F,EAAM,GAAI,CAAChX,MAAAA,UAJxC0L,EAAS9H,QAAUW,EAAI8M,EAAE,WAAY,CAACrR,MAAAA,KAAYA,GAA6B,OAApBuE,EAAI0S,YAAuB,eAAiB,QAO3GR,EAAOS,UAAUxL,SAAW,CAACA,GAEjCnH,EAAI4S,KAAKzO,IAEb3G,SAASnB,GACL2V,GAASC,QAAQ5V,KCtBzB,SAASwW,GAAQC,GACfA,EAAWC,eAAevN,IAE1B1N,OAAO6Y,KAAKoB,IAAa1U,QAAS2V,IAChCF,EAAWG,cAAcD,EAAGjB,GAAYiB,MAG1CtW,EAAWW,QAAS6V,IAClBJ,EAAWI,UAAUA,EAAUld,KAAMkd,KAGvCJ,EAAWK,SAASnB,IAEpBvN,GAAQpH,QAAS+V,IACfN,EAAWM,OAAOA,KAGpBtb,OAAO6Y,KAAK0C,IAAQhW,QAASrH,IAC3B8c,EAAWnQ,MAAM3M,GAAQqd,GAAOrd,KAGZ,oBAAX6H,QAA0BA,OAAOyV,MAC1CR,EAAWS,OAAO,CAACjP,EAAGkP,KACpBA,EAAIC,IAAI5V,OAAOyV,QChCrB,MAAMR,GDsCGY,EAAkB,CACvBC,GAAI,mBACJC,QAAS,WACT1M,QAAAA,GACA2L,QAAAA,GACAxF,UAAAA,GACAwG,MAAO,CACLC,OAAQ,CAAC,MAAO,QAChBpN,MAAO,CAAC,aACRrL,IAAK,CAAC,QAAS,WC7CC,oBAAXwC,SACPA,OAAOkW,WAAajB,IAGxB,MAAMnQ,GAAQmQ,GAAWnQ"}
1
+ {"version":3,"file":"form-create.esm.js","sources":["../src/components/icon/QuestionCircleOutlined.vue","../src/components/icon/QuestionCircleOutlined.vue?vue&type=template&id=72badc20&lang.js","../src/components/CusSelect/index.vue","../src/components/CusSelect/index.vue?vue&type=template&id=51651038&lang.js","../src/components/CusStoreSelect/index.vue","../src/components/CusStoreSelect/index.vue?vue&type=template&id=53476c3b&lang.js","../src/components/CusUserSelect/index.vue","../src/components/CusUserSelect/index.vue?vue&type=template&id=bea3399a&lang.js","../src/components/index.js","../src/parsers/checkbox.js","../src/parsers/radio.js","../src/parsers/select.js","../src/parsers/cascader.js","../src/parsers/datePicker.js","../src/parsers/hidden.js","../src/parsers/input.js","../src/parsers/timePicker.js","../src/parsers/tree.js","../src/parsers/row.js","../src/parsers/timeRangePicker.js","../src/parsers/index.js","../src/parsers/rangePicker.js","../src/parsers/cusStoreSelect.js","../src/parsers/cusUserSelect.js","../src/core/alias.js","../src/core/manager.js","../src/core/config.js","../src/core/maker.js","../src/core/api.js","../src/core/modelFields.js","../src/core/provider.js","../src/core/index.js","../src/index.js"],"sourcesContent":["<template>\n <span class=\"anticon\">\n <svg height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\n <path\n d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448s448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372s372 166.6 372 372s-166.6 372-372 372z\"\n fill=\"currentColor\"></path>\n <path\n d=\"M623.6 316.7C593.6 290.4 554 276 512 276s-81.6 14.5-111.6 40.7C369.2 344 352 380.7 352 420v7.6c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V420c0-44.1 43.1-80 96-80s96 35.9 96 80c0 31.1-22 59.6-56.1 72.7c-21.2 8.1-39.2 22.3-52.1 40.9c-13.1 19-19.9 41.8-19.9 64.9V620c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-22.7a48.3 48.3 0 0 1 30.9-44.8c59-22.7 97.1-74.7 97.1-132.5c.1-39.3-17.1-76-48.3-103.3zM472 732a40 40 0 1 0 80 0a40 40 0 1 0-80 0z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: 'QuestionCircleOutlined'\n}\n</script>\n","<template>\n <span class=\"anticon\">\n <svg height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\n <path\n d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448s448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372s372 166.6 372 372s-166.6 372-372 372z\"\n fill=\"currentColor\"></path>\n <path\n d=\"M623.6 316.7C593.6 290.4 554 276 512 276s-81.6 14.5-111.6 40.7C369.2 344 352 380.7 352 420v7.6c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V420c0-44.1 43.1-80 96-80s96 35.9 96 80c0 31.1-22 59.6-56.1 72.7c-21.2 8.1-39.2 22.3-52.1 40.9c-13.1 19-19.9 41.8-19.9 64.9V620c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-22.7a48.3 48.3 0 0 1 30.9-44.8c59-22.7 97.1-74.7 97.1-132.5c.1-39.3-17.1-76-48.3-103.3zM472 732a40 40 0 1 0 80 0a40 40 0 1 0-80 0z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: 'QuestionCircleOutlined'\n}\n</script>\n","<template>\r\n <!-- 单个展示模式 -->\r\n <div\r\n v-if=\"!multiple\"\r\n class=\"fc-cus-select fc-cus-select-single\"\r\n :class=\"{\r\n 'fc-cus-select-disabled': disabled\r\n }\"\r\n :style=\"style\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n >\r\n <div\r\n class=\"fc-cus-select-selector\"\r\n :class=\"{\r\n 'fc-cus-select-selector-borderless': !bordered\r\n }\"\r\n >\r\n <span\r\n v-if=\"displayValue\"\r\n class=\"fc-cus-select-selection-item\"\r\n :title=\"displayLabel\"\r\n >\r\n {{ displayLabel }}\r\n </span>\r\n <span v-else class=\"fc-cus-select-selection-placeholder\">\r\n {{ placeholder || '请选择' }}\r\n </span>\r\n <span v-if=\"showClear\" class=\"fc-cus-select-clear\" @click=\"clearValue\">\r\n <span\r\n role=\"img\"\r\n aria-label=\"close-circle\"\r\n class=\"anticon anticon-close-circle\"\r\n >\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close-circle\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n <span v-else class=\"fc-cus-select-arrow\">\r\n <span role=\"img\" aria-label=\"down\" class=\"anticon anticon-down\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"down\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- 多个展示模式 -->\r\n <div\r\n v-else\r\n class=\"fc-cus-select fc-cus-select-multiple\"\r\n :class=\"{\r\n 'fc-cus-select-disabled': disabled\r\n }\"\r\n :style=\"style\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n >\r\n <div\r\n class=\"fc-cus-select-selector\"\r\n :class=\"{\r\n 'fc-cus-select-selector-borderless': !bordered\r\n }\"\r\n >\r\n <div class=\"fc-cus-select-selection-overflow\">\r\n <!-- 显示的 tags -->\r\n <div\r\n v-for=\"(item, index) in displayItems\"\r\n :key=\"index\"\r\n class=\"fc-cus-select-selection-overflow-item\"\r\n style=\"opacity: 1\"\r\n >\r\n <span class=\"fc-cus-select-selection-item\" :title=\"item.label\">\r\n <span class=\"fc-cus-select-selection-item-content\">{{\r\n item.label\r\n }}</span>\r\n <span\r\n class=\"fc-cus-select-selection-item-remove\"\r\n @click=\"removeItem(item.value, $event)\"\r\n >\r\n <span role=\"img\" aria-label=\"close\" class=\"anticon anticon-close\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </span>\r\n </div>\r\n\r\n <!-- 折叠提示 -->\r\n <div\r\n v-if=\"remainingCount > 0\"\r\n class=\"fc-cus-select-selection-overflow-item\"\r\n style=\"opacity: 1\"\r\n >\r\n <span class=\"fc-cus-select-selection-item\">\r\n <span class=\"fc-cus-select-selection-item-content\">\r\n +{{ remainingCount }}\r\n </span>\r\n </span>\r\n </div>\r\n\r\n <!-- 空值占位符 -->\r\n <span v-if=\"!hasValue\" class=\"fc-cus-select-selection-placeholder\">\r\n {{ placeholder || '请选择' }}\r\n </span>\r\n </div>\r\n <span v-if=\"showClear\" class=\"fc-cus-select-clear\" @click=\"clearValue\">\r\n <span\r\n role=\"img\"\r\n aria-label=\"close-circle\"\r\n class=\"anticon anticon-close-circle\"\r\n >\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close-circle\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n <span v-else class=\"fc-cus-select-arrow\">\r\n <span role=\"img\" aria-label=\"down\" class=\"anticon anticon-down\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"down\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n name: 'CusSelect',\r\n props: {\r\n // 当前值:统一使用对象数组格式(支持 v-model)\r\n // 单选时:[{value: '1001', label: '门店1'}] 或 []\r\n // 多选时:[{value: '1001', label: '门店1'}, {value: '1002', label: '门店2'}] 或 []\r\n modelValue: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 选项列表\r\n options: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 是否多选\r\n multiple: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 最多显示的 tag 数量(多选模式下有效)\r\n maxTagCount: {\r\n type: Number,\r\n default: undefined // 不限制时显示所有\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否禁用样式\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 自定义样式\r\n style: {\r\n type: [String, Object],\r\n default: () => ({ width: '100%' })\r\n },\r\n // 选项的 value 字段名\r\n valueKey: {\r\n type: String,\r\n default: 'value'\r\n },\r\n // 选项的 label 字段名\r\n labelKey: {\r\n type: String,\r\n default: 'label'\r\n },\r\n // 是否允许清除\r\n allowClear: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否有边框\r\n bordered: {\r\n type: Boolean,\r\n default: true\r\n }\r\n },\r\n emits: ['update:modelValue', 'change'],\r\n computed: {\r\n // 统一处理值(支持 v-model),确保始终是对象数组格式\r\n currentValue: {\r\n get() {\r\n // 确保返回对象数组格式\r\n if (!Array.isArray(this.modelValue)) {\r\n // 如果是 null、undefined 或空字符串,返回空数组\r\n if (\r\n this.modelValue === null ||\r\n this.modelValue === undefined ||\r\n this.modelValue === ''\r\n ) {\r\n return []\r\n }\r\n // 如果是单个对象,转换为数组\r\n if (typeof this.modelValue === 'object') {\r\n return [this.modelValue]\r\n }\r\n // 如果是单个值,转换为对象数组格式\r\n return [\r\n { value: this.modelValue, label: this.getLabel(this.modelValue) }\r\n ]\r\n }\r\n // 确保数组中的每个元素都是对象格式\r\n return this.modelValue.map((item) => {\r\n if (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n (item.value !== undefined || item[this.valueKey] !== undefined)\r\n ) {\r\n // 已经是对象格式\r\n return item\r\n }\r\n // 如果是单个值,转换为对象格式\r\n return {\r\n [this.valueKey]: item,\r\n [this.labelKey]: this.getLabel(item)\r\n }\r\n })\r\n },\r\n set(val) {\r\n // 确保设置的值是对象数组格式\r\n let arrayValue = []\r\n if (val !== null && val !== undefined) {\r\n if (Array.isArray(val)) {\r\n // 确保数组中的每个元素都是对象格式\r\n arrayValue = val.map((item) => {\r\n if (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n (item.value !== undefined || item[this.valueKey] !== undefined)\r\n ) {\r\n return item\r\n }\r\n // 单个值转换为对象格式\r\n return {\r\n [this.valueKey]: item,\r\n [this.labelKey]: this.getLabel(item)\r\n }\r\n })\r\n } else if (typeof val === 'object' && val !== null) {\r\n // 单个对象转换为数组\r\n arrayValue = [val]\r\n } else {\r\n // 单个值转换为对象数组格式\r\n arrayValue = [\r\n { [this.valueKey]: val, [this.labelKey]: this.getLabel(val) }\r\n ]\r\n }\r\n }\r\n // 触发 update:modelValue 事件以支持 v-model\r\n this.$emit('update:modelValue', arrayValue)\r\n this.$emit('change', arrayValue)\r\n }\r\n },\r\n // 是否有值(统一判断数组长度)\r\n hasValue() {\r\n const val = this.currentValue\r\n return Array.isArray(val) && val.length > 0\r\n },\r\n // 单个模式:显示的值对象(从数组中取第一个)\r\n displayValue() {\r\n if (!this.hasValue) return null\r\n return this.currentValue[0]\r\n },\r\n // 单个模式:显示的标签\r\n displayLabel() {\r\n if (!this.displayValue) return ''\r\n const item = this.displayValue\r\n // 如果是对象格式,直接取 label\r\n if (typeof item === 'object' && item !== null) {\r\n return (\r\n item[this.labelKey] ||\r\n item.label ||\r\n String(item[this.valueKey] || item.value || '')\r\n )\r\n }\r\n // 如果不是对象,使用 getLabel 方法查找\r\n return this.getLabel(item)\r\n },\r\n // 多个模式:所有选中的项(直接使用对象数组)\r\n allSelectedItems() {\r\n const val = this.currentValue\r\n if (!Array.isArray(val) || val.length === 0) {\r\n return []\r\n }\r\n // 直接返回对象数组,确保格式统一\r\n return val.map((item) => {\r\n if (typeof item === 'object' && item !== null) {\r\n return {\r\n value: item[this.valueKey] || item.value,\r\n label:\r\n item[this.labelKey] ||\r\n item.label ||\r\n String(item[this.valueKey] || item.value || '')\r\n }\r\n }\r\n // 如果不是对象,转换为对象格式\r\n return {\r\n value: item,\r\n label: this.getLabel(item)\r\n }\r\n })\r\n },\r\n // 多个模式:显示的项(根据 maxTagCount 限制)\r\n displayItems() {\r\n const items = this.allSelectedItems\r\n if (this.maxTagCount === undefined || this.maxTagCount === null) {\r\n return items\r\n }\r\n return items.slice(0, this.maxTagCount)\r\n },\r\n // 多个模式:剩余未显示的项数量\r\n remainingCount() {\r\n if (this.maxTagCount === undefined || this.maxTagCount === null) {\r\n return 0\r\n }\r\n const total = this.allSelectedItems.length\r\n return Math.max(0, total - this.maxTagCount)\r\n },\r\n // 是否显示清除图标\r\n showClear() {\r\n return this.allowClear && this.hasValue && !this.disabled\r\n }\r\n },\r\n methods: {\r\n // 根据 value 查找对应的 option\r\n findOptionByValue(val) {\r\n if (!this.options || this.options.length === 0) {\r\n return null\r\n }\r\n return this.options.find((opt) => {\r\n const optValue = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n return optValue === val || String(optValue) === String(val)\r\n })\r\n },\r\n // 获取显示的 label\r\n getLabel(val) {\r\n const option = this.findOptionByValue(val)\r\n if (option) {\r\n return typeof option === 'object' ? option[this.labelKey] : option\r\n }\r\n // 如果找不到对应的 option,直接显示 value\r\n return String(val)\r\n },\r\n // 删除单个项\r\n removeItem(itemValue, event) {\r\n if (this.disabled) return\r\n event.stopPropagation()\r\n const val = this.currentValue\r\n if (Array.isArray(val)) {\r\n // 根据 value 来过滤,支持对象数组格式\r\n const newValue = val.filter((item) => {\r\n if (typeof item === 'object' && item !== null) {\r\n const currentItemValue = item[this.valueKey] || item.value\r\n return currentItemValue !== itemValue\r\n }\r\n return item !== itemValue\r\n })\r\n this.currentValue = newValue\r\n }\r\n },\r\n // 清除所有值\r\n clearValue(event) {\r\n if (this.disabled) return\r\n event.stopPropagation()\r\n // 统一设置为空数组\r\n this.currentValue = []\r\n }\r\n }\r\n})\r\n</script>\r\n","<template>\r\n <!-- 单个展示模式 -->\r\n <div\r\n v-if=\"!multiple\"\r\n class=\"fc-cus-select fc-cus-select-single\"\r\n :class=\"{\r\n 'fc-cus-select-disabled': disabled\r\n }\"\r\n :style=\"style\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n >\r\n <div\r\n class=\"fc-cus-select-selector\"\r\n :class=\"{\r\n 'fc-cus-select-selector-borderless': !bordered\r\n }\"\r\n >\r\n <span\r\n v-if=\"displayValue\"\r\n class=\"fc-cus-select-selection-item\"\r\n :title=\"displayLabel\"\r\n >\r\n {{ displayLabel }}\r\n </span>\r\n <span v-else class=\"fc-cus-select-selection-placeholder\">\r\n {{ placeholder || '请选择' }}\r\n </span>\r\n <span v-if=\"showClear\" class=\"fc-cus-select-clear\" @click=\"clearValue\">\r\n <span\r\n role=\"img\"\r\n aria-label=\"close-circle\"\r\n class=\"anticon anticon-close-circle\"\r\n >\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close-circle\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n <span v-else class=\"fc-cus-select-arrow\">\r\n <span role=\"img\" aria-label=\"down\" class=\"anticon anticon-down\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"down\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- 多个展示模式 -->\r\n <div\r\n v-else\r\n class=\"fc-cus-select fc-cus-select-multiple\"\r\n :class=\"{\r\n 'fc-cus-select-disabled': disabled\r\n }\"\r\n :style=\"style\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n >\r\n <div\r\n class=\"fc-cus-select-selector\"\r\n :class=\"{\r\n 'fc-cus-select-selector-borderless': !bordered\r\n }\"\r\n >\r\n <div class=\"fc-cus-select-selection-overflow\">\r\n <!-- 显示的 tags -->\r\n <div\r\n v-for=\"(item, index) in displayItems\"\r\n :key=\"index\"\r\n class=\"fc-cus-select-selection-overflow-item\"\r\n style=\"opacity: 1\"\r\n >\r\n <span class=\"fc-cus-select-selection-item\" :title=\"item.label\">\r\n <span class=\"fc-cus-select-selection-item-content\">{{\r\n item.label\r\n }}</span>\r\n <span\r\n class=\"fc-cus-select-selection-item-remove\"\r\n @click=\"removeItem(item.value, $event)\"\r\n >\r\n <span role=\"img\" aria-label=\"close\" class=\"anticon anticon-close\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </span>\r\n </div>\r\n\r\n <!-- 折叠提示 -->\r\n <div\r\n v-if=\"remainingCount > 0\"\r\n class=\"fc-cus-select-selection-overflow-item\"\r\n style=\"opacity: 1\"\r\n >\r\n <span class=\"fc-cus-select-selection-item\">\r\n <span class=\"fc-cus-select-selection-item-content\">\r\n +{{ remainingCount }}\r\n </span>\r\n </span>\r\n </div>\r\n\r\n <!-- 空值占位符 -->\r\n <span v-if=\"!hasValue\" class=\"fc-cus-select-selection-placeholder\">\r\n {{ placeholder || '请选择' }}\r\n </span>\r\n </div>\r\n <span v-if=\"showClear\" class=\"fc-cus-select-clear\" @click=\"clearValue\">\r\n <span\r\n role=\"img\"\r\n aria-label=\"close-circle\"\r\n class=\"anticon anticon-close-circle\"\r\n >\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"close-circle\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n fill-rule=\"evenodd\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n <span v-else class=\"fc-cus-select-arrow\">\r\n <span role=\"img\" aria-label=\"down\" class=\"anticon anticon-down\">\r\n <svg\r\n focusable=\"false\"\r\n data-icon=\"down\"\r\n width=\"1em\"\r\n height=\"1em\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\"\r\n viewBox=\"64 64 896 896\"\r\n >\r\n <path\r\n d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"\r\n ></path>\r\n </svg>\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n name: 'CusSelect',\r\n props: {\r\n // 当前值:统一使用对象数组格式(支持 v-model)\r\n // 单选时:[{value: '1001', label: '门店1'}] 或 []\r\n // 多选时:[{value: '1001', label: '门店1'}, {value: '1002', label: '门店2'}] 或 []\r\n modelValue: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 选项列表\r\n options: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 是否多选\r\n multiple: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 最多显示的 tag 数量(多选模式下有效)\r\n maxTagCount: {\r\n type: Number,\r\n default: undefined // 不限制时显示所有\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否禁用样式\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 自定义样式\r\n style: {\r\n type: [String, Object],\r\n default: () => ({ width: '100%' })\r\n },\r\n // 选项的 value 字段名\r\n valueKey: {\r\n type: String,\r\n default: 'value'\r\n },\r\n // 选项的 label 字段名\r\n labelKey: {\r\n type: String,\r\n default: 'label'\r\n },\r\n // 是否允许清除\r\n allowClear: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否有边框\r\n bordered: {\r\n type: Boolean,\r\n default: true\r\n }\r\n },\r\n emits: ['update:modelValue', 'change'],\r\n computed: {\r\n // 统一处理值(支持 v-model),确保始终是对象数组格式\r\n currentValue: {\r\n get() {\r\n // 确保返回对象数组格式\r\n if (!Array.isArray(this.modelValue)) {\r\n // 如果是 null、undefined 或空字符串,返回空数组\r\n if (\r\n this.modelValue === null ||\r\n this.modelValue === undefined ||\r\n this.modelValue === ''\r\n ) {\r\n return []\r\n }\r\n // 如果是单个对象,转换为数组\r\n if (typeof this.modelValue === 'object') {\r\n return [this.modelValue]\r\n }\r\n // 如果是单个值,转换为对象数组格式\r\n return [\r\n { value: this.modelValue, label: this.getLabel(this.modelValue) }\r\n ]\r\n }\r\n // 确保数组中的每个元素都是对象格式\r\n return this.modelValue.map((item) => {\r\n if (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n (item.value !== undefined || item[this.valueKey] !== undefined)\r\n ) {\r\n // 已经是对象格式\r\n return item\r\n }\r\n // 如果是单个值,转换为对象格式\r\n return {\r\n [this.valueKey]: item,\r\n [this.labelKey]: this.getLabel(item)\r\n }\r\n })\r\n },\r\n set(val) {\r\n // 确保设置的值是对象数组格式\r\n let arrayValue = []\r\n if (val !== null && val !== undefined) {\r\n if (Array.isArray(val)) {\r\n // 确保数组中的每个元素都是对象格式\r\n arrayValue = val.map((item) => {\r\n if (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n (item.value !== undefined || item[this.valueKey] !== undefined)\r\n ) {\r\n return item\r\n }\r\n // 单个值转换为对象格式\r\n return {\r\n [this.valueKey]: item,\r\n [this.labelKey]: this.getLabel(item)\r\n }\r\n })\r\n } else if (typeof val === 'object' && val !== null) {\r\n // 单个对象转换为数组\r\n arrayValue = [val]\r\n } else {\r\n // 单个值转换为对象数组格式\r\n arrayValue = [\r\n { [this.valueKey]: val, [this.labelKey]: this.getLabel(val) }\r\n ]\r\n }\r\n }\r\n // 触发 update:modelValue 事件以支持 v-model\r\n this.$emit('update:modelValue', arrayValue)\r\n this.$emit('change', arrayValue)\r\n }\r\n },\r\n // 是否有值(统一判断数组长度)\r\n hasValue() {\r\n const val = this.currentValue\r\n return Array.isArray(val) && val.length > 0\r\n },\r\n // 单个模式:显示的值对象(从数组中取第一个)\r\n displayValue() {\r\n if (!this.hasValue) return null\r\n return this.currentValue[0]\r\n },\r\n // 单个模式:显示的标签\r\n displayLabel() {\r\n if (!this.displayValue) return ''\r\n const item = this.displayValue\r\n // 如果是对象格式,直接取 label\r\n if (typeof item === 'object' && item !== null) {\r\n return (\r\n item[this.labelKey] ||\r\n item.label ||\r\n String(item[this.valueKey] || item.value || '')\r\n )\r\n }\r\n // 如果不是对象,使用 getLabel 方法查找\r\n return this.getLabel(item)\r\n },\r\n // 多个模式:所有选中的项(直接使用对象数组)\r\n allSelectedItems() {\r\n const val = this.currentValue\r\n if (!Array.isArray(val) || val.length === 0) {\r\n return []\r\n }\r\n // 直接返回对象数组,确保格式统一\r\n return val.map((item) => {\r\n if (typeof item === 'object' && item !== null) {\r\n return {\r\n value: item[this.valueKey] || item.value,\r\n label:\r\n item[this.labelKey] ||\r\n item.label ||\r\n String(item[this.valueKey] || item.value || '')\r\n }\r\n }\r\n // 如果不是对象,转换为对象格式\r\n return {\r\n value: item,\r\n label: this.getLabel(item)\r\n }\r\n })\r\n },\r\n // 多个模式:显示的项(根据 maxTagCount 限制)\r\n displayItems() {\r\n const items = this.allSelectedItems\r\n if (this.maxTagCount === undefined || this.maxTagCount === null) {\r\n return items\r\n }\r\n return items.slice(0, this.maxTagCount)\r\n },\r\n // 多个模式:剩余未显示的项数量\r\n remainingCount() {\r\n if (this.maxTagCount === undefined || this.maxTagCount === null) {\r\n return 0\r\n }\r\n const total = this.allSelectedItems.length\r\n return Math.max(0, total - this.maxTagCount)\r\n },\r\n // 是否显示清除图标\r\n showClear() {\r\n return this.allowClear && this.hasValue && !this.disabled\r\n }\r\n },\r\n methods: {\r\n // 根据 value 查找对应的 option\r\n findOptionByValue(val) {\r\n if (!this.options || this.options.length === 0) {\r\n return null\r\n }\r\n return this.options.find((opt) => {\r\n const optValue = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n return optValue === val || String(optValue) === String(val)\r\n })\r\n },\r\n // 获取显示的 label\r\n getLabel(val) {\r\n const option = this.findOptionByValue(val)\r\n if (option) {\r\n return typeof option === 'object' ? option[this.labelKey] : option\r\n }\r\n // 如果找不到对应的 option,直接显示 value\r\n return String(val)\r\n },\r\n // 删除单个项\r\n removeItem(itemValue, event) {\r\n if (this.disabled) return\r\n event.stopPropagation()\r\n const val = this.currentValue\r\n if (Array.isArray(val)) {\r\n // 根据 value 来过滤,支持对象数组格式\r\n const newValue = val.filter((item) => {\r\n if (typeof item === 'object' && item !== null) {\r\n const currentItemValue = item[this.valueKey] || item.value\r\n return currentItemValue !== itemValue\r\n }\r\n return item !== itemValue\r\n })\r\n this.currentValue = newValue\r\n }\r\n },\r\n // 清除所有值\r\n clearValue(event) {\r\n if (this.disabled) return\r\n event.stopPropagation()\r\n // 统一设置为空数组\r\n this.currentValue = []\r\n }\r\n }\r\n})\r\n</script>\r\n","<template>\n <div @click=\"handleClick\">\n <CusSelect\n :model-value=\"modelValue\"\n :options=\"mergedOptions\"\n :multiple=\"multiple\"\n :max-tag-count=\"maxTagCount\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :style=\"style\"\n :valueKey=\"valueKey\"\n :labelKey=\"labelKey\"\n :allowClear=\"allowClear\"\n :bordered=\"bordered\"\n @update:model-value=\"handleUpdate\"\n @change=\"handleChange\"\n />\n </div>\n</template>\n\n<script>\nimport { defineComponent } from 'vue'\nimport CusSelect from '../CusSelect/index.vue'\n\nexport default defineComponent({\n name: 'CusStoreSelect',\n components: {\n CusSelect\n },\n props: {\n // form-create 注入的对象,包含 API 等\n formCreateInject: {\n type: Object,\n default: null\n },\n // 当前值:统一使用数组格式(支持 v-model)\n // 单选时:[value] 或 []\n // 多选时:[value1, value2, ...] 或 []\n modelValue: {\n type: Array,\n default: () => []\n },\n // 选项列表\n options: {\n type: Array,\n default: () => []\n },\n // 是否多选\n multiple: {\n type: Boolean,\n default: false\n },\n // 最多显示的 tag 数量(多选模式下有效)\n maxTagCount: {\n type: Number,\n default: undefined // 不限制时显示所有\n },\n // 占位符\n placeholder: {\n type: String,\n default: '请选择'\n },\n // 是否禁用样式\n disabled: {\n type: Boolean,\n default: false\n },\n // 自定义样式\n style: {\n type: [String, Object],\n default: () => ({ width: '100%' })\n },\n // 选项的 value 字段名\n valueKey: {\n type: String,\n default: 'value'\n },\n // 选项的 label 字段名\n labelKey: {\n type: String,\n default: 'label'\n },\n // 是否允许清除\n allowClear: {\n type: Boolean,\n default: false\n },\n // 字段名,用于跨窗口通信时标识字段\n field: {\n type: String,\n default: ''\n },\n // 是否有边框\n bordered: {\n type: Boolean,\n default: true\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n // 消息ID计数器,用于标识每次请求\n messageId: 0,\n // 存储待处理的回调函数\n pendingCallbacks: {},\n // 内部维护的选项列表(合并父窗口返回的源对象)\n internalOptions: []\n }\n },\n computed: {\n // 合并内部选项和外部传入的选项\n mergedOptions() {\n // 如果内部有选项,优先使用内部选项\n if (this.internalOptions.length > 0) {\n // 合并去重:根据 valueKey 去重,保留内部选项(后添加的优先)\n const optionMap = new Map()\n // 先添加外部选项\n this.options.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n // 再添加内部选项(会覆盖相同 value 的选项)\n this.internalOptions.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n return Array.from(optionMap.values())\n }\n return this.options\n }\n },\n watch: {\n // 监听外部 options 变化,初始化内部选项列表\n options: {\n immediate: true,\n handler(newOptions) {\n // 如果内部选项为空,且外部有选项,初始化内部选项\n if (\n this.internalOptions.length === 0 &&\n Array.isArray(newOptions) &&\n newOptions.length > 0\n ) {\n this.internalOptions = [...newOptions]\n }\n }\n }\n },\n mounted() {\n // 监听父窗口返回的消息\n window.addEventListener('message', this.handleMessage)\n },\n beforeUnmount() {\n // 组件销毁时移除事件监听\n window.removeEventListener('message', this.handleMessage)\n },\n methods: {\n // 序列化数据,确保可以被 postMessage 发送\n // postMessage 使用结构化克隆算法,无法克隆 Vue 响应式代理对象\n serializeForPostMessage(data) {\n // 处理 null 和 undefined\n if (data === null || data === undefined) {\n return data\n }\n\n try {\n // 使用 JSON 序列化和反序列化来创建可克隆的副本\n // 这会移除 Vue 响应式代理、函数、Symbol 等不可序列化的内容\n return JSON.parse(JSON.stringify(data))\n } catch (error) {\n console.warn('CusStoreSelect: 数据序列化失败,尝试递归处理', error)\n\n // 如果 JSON 序列化失败(可能是循环引用),尝试递归处理\n if (Array.isArray(data)) {\n // 空数组直接返回\n if (data.length === 0) {\n return []\n }\n // 递归处理数组中的每个元素\n return data.map((item) => this.serializeForPostMessage(item))\n }\n\n if (typeof data === 'object') {\n const result = {}\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n try {\n result[key] = this.serializeForPostMessage(data[key])\n } catch (e) {\n // 忽略无法序列化的属性,避免整个序列化失败\n console.warn(`CusStoreSelect: 跳过无法序列化的属性: ${key}`, e)\n }\n }\n }\n return result\n }\n\n // 基本类型(string, number, boolean)直接返回\n return data\n }\n },\n handleClick() {\n // 如果禁用,不处理\n if (this.disabled) {\n return\n }\n\n // 生成唯一消息ID\n const msgId = `store-select-${\n this.field || 'default'\n }-${Date.now()}-${++this.messageId}`\n\n // 序列化所有需要传递的数据,确保可以被 postMessage 发送\n // postMessage 无法发送 Vue 响应式代理对象,必须序列化\n // 获取当前值,确保是对象数组格式\n const currentArrayValue = Array.isArray(this.modelValue)\n ? this.modelValue\n : []\n // 从对象数组中提取 value 值,用于发送给父窗口\n // 单选时发送第一个对象的 value,多选时发送所有对象的 value 数组\n let valueToSend = null\n if (currentArrayValue.length > 0) {\n valueToSend = currentArrayValue\n }\n const serializedCurrentValue =\n valueToSend === null || valueToSend === undefined\n ? null\n : this.serializeForPostMessage(valueToSend)\n\n // 发送消息给父窗口,请求打开门店选择弹窗\n const message = {\n type: 'OPEN_STORE_SELECT',\n field: this.field || '',\n multiple: this.multiple,\n currentValue: serializedCurrentValue,\n valueKey: this.valueKey,\n labelKey: this.labelKey,\n messageId: msgId\n }\n\n // 发送到父窗口(支持 iframe 场景)\n if (window.parent && window.parent !== window) {\n try {\n window.parent.postMessage(message, '*')\n } catch (error) {\n console.error('CusStoreSelect: 发送消息失败', error)\n }\n } else {\n // 如果不在 iframe 中,也可以发送到当前窗口(用于测试)\n console.warn(\n 'CusStoreSelect: 当前不在 iframe 环境中,无法向父窗口发送消息'\n )\n }\n\n // 存储回调,等待父窗口返回结果\n this.pendingCallbacks[msgId] = (value, sourceItems) => {\n // 优先使用 sourceItems(源对象数组),如果没有则根据 value 和 options 构建\n if (\n sourceItems &&\n Array.isArray(sourceItems) &&\n sourceItems.length > 0\n ) {\n // 合并到内部选项列表\n this.mergeOptions(sourceItems)\n }\n\n this.handleUpdate(value)\n this.handleChange(value)\n }\n },\n handleMessage(event) {\n // 验证消息来源(可选,根据实际需求调整)\n // if (event.origin !== 'expected-origin') return\n\n const data = event.data\n\n // 检查是否是门店选择返回的消息\n if (data && data.type === 'STORE_SELECT_RESULT') {\n const { field, value, sourceItems, messageId } = data\n\n // 验证字段名是否匹配\n if (field !== this.field) {\n return\n }\n\n // 查找对应的回调函数\n const callback = this.pendingCallbacks[messageId]\n if (callback) {\n // 执行回调,更新值并传递源对象\n // sourceItems: 源对象数组,包含完整的选项信息\n // 单选时:[{ value: '1001', label: '门店1', ... }]\n // 多选时:[{ value: '1001', label: '门店1', ... }, { value: '1002', label: '门店2', ... }]\n callback(value, sourceItems)\n // 清理已处理的回调\n delete this.pendingCallbacks[messageId]\n }\n }\n },\n // 合并选项到内部选项列表\n mergeOptions(newItems) {\n if (!Array.isArray(newItems) || newItems.length === 0) {\n return\n }\n\n // 创建选项映射,用于去重\n const optionMap = new Map()\n\n // 先将现有内部选项添加到映射\n this.internalOptions.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n\n // 再添加新选项(会覆盖相同 value 的选项)\n newItems.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n\n // 更新内部选项列表\n this.internalOptions = Array.from(optionMap.values())\n },\n handleUpdate(value) {\n this.$emit('update:modelValue', value)\n // 值更新后触发校验\n this.triggerValidate()\n },\n handleChange(value) {\n this.$emit(\n 'change',\n value,\n this.internalOptions && this.internalOptions.length > 0\n ? this.multiple\n ? this.internalOptions\n : this.internalOptions[0]\n : this.multiple\n ? []\n : null\n )\n },\n // 触发字段校验\n triggerValidate() {\n // 使用 nextTick 确保值已经更新完成\n this.$nextTick(() => {\n this.$nextTick(() => {\n try {\n // 方式1:通过 formCreateInject 中的 API 触发校验\n if (\n this.formCreateInject &&\n this.formCreateInject.api &&\n this.field\n ) {\n this.formCreateInject.api.validateField(this.field).catch(() => {\n // 校验失败时静默处理,错误会通过 form-item 显示\n })\n return\n }\n\n // 方式2:通过组件实例查找父组件中的 form-create API\n let parent = this.$parent\n while (parent) {\n if (\n parent.$options &&\n parent.$options.name === 'FormCreate' &&\n parent.fapi\n ) {\n if (this.field && parent.fapi.validateField) {\n parent.fapi.validateField(this.field).catch(() => {\n // 校验失败时静默处理\n })\n }\n break\n }\n parent = parent.$parent\n }\n } catch (error) {\n console.warn('CusStoreSelect: 触发校验失败', error)\n }\n })\n })\n }\n }\n})\n</script>\n","<template>\n <div @click=\"handleClick\">\n <CusSelect\n :model-value=\"modelValue\"\n :options=\"mergedOptions\"\n :multiple=\"multiple\"\n :max-tag-count=\"maxTagCount\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :style=\"style\"\n :valueKey=\"valueKey\"\n :labelKey=\"labelKey\"\n :allowClear=\"allowClear\"\n :bordered=\"bordered\"\n @update:model-value=\"handleUpdate\"\n @change=\"handleChange\"\n />\n </div>\n</template>\n\n<script>\nimport { defineComponent } from 'vue'\nimport CusSelect from '../CusSelect/index.vue'\n\nexport default defineComponent({\n name: 'CusStoreSelect',\n components: {\n CusSelect\n },\n props: {\n // form-create 注入的对象,包含 API 等\n formCreateInject: {\n type: Object,\n default: null\n },\n // 当前值:统一使用数组格式(支持 v-model)\n // 单选时:[value] 或 []\n // 多选时:[value1, value2, ...] 或 []\n modelValue: {\n type: Array,\n default: () => []\n },\n // 选项列表\n options: {\n type: Array,\n default: () => []\n },\n // 是否多选\n multiple: {\n type: Boolean,\n default: false\n },\n // 最多显示的 tag 数量(多选模式下有效)\n maxTagCount: {\n type: Number,\n default: undefined // 不限制时显示所有\n },\n // 占位符\n placeholder: {\n type: String,\n default: '请选择'\n },\n // 是否禁用样式\n disabled: {\n type: Boolean,\n default: false\n },\n // 自定义样式\n style: {\n type: [String, Object],\n default: () => ({ width: '100%' })\n },\n // 选项的 value 字段名\n valueKey: {\n type: String,\n default: 'value'\n },\n // 选项的 label 字段名\n labelKey: {\n type: String,\n default: 'label'\n },\n // 是否允许清除\n allowClear: {\n type: Boolean,\n default: false\n },\n // 字段名,用于跨窗口通信时标识字段\n field: {\n type: String,\n default: ''\n },\n // 是否有边框\n bordered: {\n type: Boolean,\n default: true\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n // 消息ID计数器,用于标识每次请求\n messageId: 0,\n // 存储待处理的回调函数\n pendingCallbacks: {},\n // 内部维护的选项列表(合并父窗口返回的源对象)\n internalOptions: []\n }\n },\n computed: {\n // 合并内部选项和外部传入的选项\n mergedOptions() {\n // 如果内部有选项,优先使用内部选项\n if (this.internalOptions.length > 0) {\n // 合并去重:根据 valueKey 去重,保留内部选项(后添加的优先)\n const optionMap = new Map()\n // 先添加外部选项\n this.options.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n // 再添加内部选项(会覆盖相同 value 的选项)\n this.internalOptions.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n return Array.from(optionMap.values())\n }\n return this.options\n }\n },\n watch: {\n // 监听外部 options 变化,初始化内部选项列表\n options: {\n immediate: true,\n handler(newOptions) {\n // 如果内部选项为空,且外部有选项,初始化内部选项\n if (\n this.internalOptions.length === 0 &&\n Array.isArray(newOptions) &&\n newOptions.length > 0\n ) {\n this.internalOptions = [...newOptions]\n }\n }\n }\n },\n mounted() {\n // 监听父窗口返回的消息\n window.addEventListener('message', this.handleMessage)\n },\n beforeUnmount() {\n // 组件销毁时移除事件监听\n window.removeEventListener('message', this.handleMessage)\n },\n methods: {\n // 序列化数据,确保可以被 postMessage 发送\n // postMessage 使用结构化克隆算法,无法克隆 Vue 响应式代理对象\n serializeForPostMessage(data) {\n // 处理 null 和 undefined\n if (data === null || data === undefined) {\n return data\n }\n\n try {\n // 使用 JSON 序列化和反序列化来创建可克隆的副本\n // 这会移除 Vue 响应式代理、函数、Symbol 等不可序列化的内容\n return JSON.parse(JSON.stringify(data))\n } catch (error) {\n console.warn('CusStoreSelect: 数据序列化失败,尝试递归处理', error)\n\n // 如果 JSON 序列化失败(可能是循环引用),尝试递归处理\n if (Array.isArray(data)) {\n // 空数组直接返回\n if (data.length === 0) {\n return []\n }\n // 递归处理数组中的每个元素\n return data.map((item) => this.serializeForPostMessage(item))\n }\n\n if (typeof data === 'object') {\n const result = {}\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n try {\n result[key] = this.serializeForPostMessage(data[key])\n } catch (e) {\n // 忽略无法序列化的属性,避免整个序列化失败\n console.warn(`CusStoreSelect: 跳过无法序列化的属性: ${key}`, e)\n }\n }\n }\n return result\n }\n\n // 基本类型(string, number, boolean)直接返回\n return data\n }\n },\n handleClick() {\n // 如果禁用,不处理\n if (this.disabled) {\n return\n }\n\n // 生成唯一消息ID\n const msgId = `store-select-${\n this.field || 'default'\n }-${Date.now()}-${++this.messageId}`\n\n // 序列化所有需要传递的数据,确保可以被 postMessage 发送\n // postMessage 无法发送 Vue 响应式代理对象,必须序列化\n // 获取当前值,确保是对象数组格式\n const currentArrayValue = Array.isArray(this.modelValue)\n ? this.modelValue\n : []\n // 从对象数组中提取 value 值,用于发送给父窗口\n // 单选时发送第一个对象的 value,多选时发送所有对象的 value 数组\n let valueToSend = null\n if (currentArrayValue.length > 0) {\n valueToSend = currentArrayValue\n }\n const serializedCurrentValue =\n valueToSend === null || valueToSend === undefined\n ? null\n : this.serializeForPostMessage(valueToSend)\n\n // 发送消息给父窗口,请求打开门店选择弹窗\n const message = {\n type: 'OPEN_STORE_SELECT',\n field: this.field || '',\n multiple: this.multiple,\n currentValue: serializedCurrentValue,\n valueKey: this.valueKey,\n labelKey: this.labelKey,\n messageId: msgId\n }\n\n // 发送到父窗口(支持 iframe 场景)\n if (window.parent && window.parent !== window) {\n try {\n window.parent.postMessage(message, '*')\n } catch (error) {\n console.error('CusStoreSelect: 发送消息失败', error)\n }\n } else {\n // 如果不在 iframe 中,也可以发送到当前窗口(用于测试)\n console.warn(\n 'CusStoreSelect: 当前不在 iframe 环境中,无法向父窗口发送消息'\n )\n }\n\n // 存储回调,等待父窗口返回结果\n this.pendingCallbacks[msgId] = (value, sourceItems) => {\n // 优先使用 sourceItems(源对象数组),如果没有则根据 value 和 options 构建\n if (\n sourceItems &&\n Array.isArray(sourceItems) &&\n sourceItems.length > 0\n ) {\n // 合并到内部选项列表\n this.mergeOptions(sourceItems)\n }\n\n this.handleUpdate(value)\n this.handleChange(value)\n }\n },\n handleMessage(event) {\n // 验证消息来源(可选,根据实际需求调整)\n // if (event.origin !== 'expected-origin') return\n\n const data = event.data\n\n // 检查是否是门店选择返回的消息\n if (data && data.type === 'STORE_SELECT_RESULT') {\n const { field, value, sourceItems, messageId } = data\n\n // 验证字段名是否匹配\n if (field !== this.field) {\n return\n }\n\n // 查找对应的回调函数\n const callback = this.pendingCallbacks[messageId]\n if (callback) {\n // 执行回调,更新值并传递源对象\n // sourceItems: 源对象数组,包含完整的选项信息\n // 单选时:[{ value: '1001', label: '门店1', ... }]\n // 多选时:[{ value: '1001', label: '门店1', ... }, { value: '1002', label: '门店2', ... }]\n callback(value, sourceItems)\n // 清理已处理的回调\n delete this.pendingCallbacks[messageId]\n }\n }\n },\n // 合并选项到内部选项列表\n mergeOptions(newItems) {\n if (!Array.isArray(newItems) || newItems.length === 0) {\n return\n }\n\n // 创建选项映射,用于去重\n const optionMap = new Map()\n\n // 先将现有内部选项添加到映射\n this.internalOptions.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n\n // 再添加新选项(会覆盖相同 value 的选项)\n newItems.forEach((opt) => {\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\n optionMap.set(value, opt)\n })\n\n // 更新内部选项列表\n this.internalOptions = Array.from(optionMap.values())\n },\n handleUpdate(value) {\n this.$emit('update:modelValue', value)\n // 值更新后触发校验\n this.triggerValidate()\n },\n handleChange(value) {\n this.$emit(\n 'change',\n value,\n this.internalOptions && this.internalOptions.length > 0\n ? this.multiple\n ? this.internalOptions\n : this.internalOptions[0]\n : this.multiple\n ? []\n : null\n )\n },\n // 触发字段校验\n triggerValidate() {\n // 使用 nextTick 确保值已经更新完成\n this.$nextTick(() => {\n this.$nextTick(() => {\n try {\n // 方式1:通过 formCreateInject 中的 API 触发校验\n if (\n this.formCreateInject &&\n this.formCreateInject.api &&\n this.field\n ) {\n this.formCreateInject.api.validateField(this.field).catch(() => {\n // 校验失败时静默处理,错误会通过 form-item 显示\n })\n return\n }\n\n // 方式2:通过组件实例查找父组件中的 form-create API\n let parent = this.$parent\n while (parent) {\n if (\n parent.$options &&\n parent.$options.name === 'FormCreate' &&\n parent.fapi\n ) {\n if (this.field && parent.fapi.validateField) {\n parent.fapi.validateField(this.field).catch(() => {\n // 校验失败时静默处理\n })\n }\n break\n }\n parent = parent.$parent\n }\n } catch (error) {\n console.warn('CusStoreSelect: 触发校验失败', error)\n }\n })\n })\n }\n }\n})\n</script>\n","<template>\r\n <div @click=\"handleClick\">\r\n <CusSelect\r\n :model-value=\"modelValue\"\r\n :options=\"mergedOptions\"\r\n :multiple=\"multiple\"\r\n :max-tag-count=\"maxTagCount\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :style=\"style\"\r\n :valueKey=\"valueKey\"\r\n :labelKey=\"labelKey\"\r\n :allowClear=\"allowClear\"\r\n :bordered=\"bordered\"\r\n @update:model-value=\"handleUpdate\"\r\n @change=\"handleChange\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { defineComponent } from 'vue'\r\nimport CusSelect from '../CusSelect/index.vue'\r\n\r\nexport default defineComponent({\r\n name: 'CusUserSelect',\r\n components: {\r\n CusSelect\r\n },\r\n props: {\r\n // form-create 注入的对象,包含 API 等\r\n formCreateInject: {\r\n type: Object,\r\n default: null\r\n },\r\n // 当前值:统一使用数组格式(支持 v-model)\r\n // 单选时:[value] 或 []\r\n // 多选时:[value1, value2, ...] 或 []\r\n modelValue: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 选项列表\r\n options: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 是否多选\r\n multiple: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 最多显示的 tag 数量(多选模式下有效)\r\n maxTagCount: {\r\n type: Number,\r\n default: undefined // 不限制时显示所有\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: '请选择'\r\n },\r\n // 是否禁用样式\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 自定义样式\r\n style: {\r\n type: [String, Object],\r\n default: () => ({ width: '100%' })\r\n },\r\n // 选项的 value 字段名\r\n valueKey: {\r\n type: String,\r\n default: 'value'\r\n },\r\n // 选项的 label 字段名\r\n labelKey: {\r\n type: String,\r\n default: 'label'\r\n },\r\n // 是否允许清除\r\n allowClear: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 字段名,用于跨窗口通信时标识字段\r\n field: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否有边框\r\n bordered: {\r\n type: Boolean,\r\n default: true\r\n },\r\n selectType: {\r\n type: [String, Number],\r\n default: null\r\n }\r\n },\r\n emits: ['update:modelValue', 'change'],\r\n data() {\r\n return {\r\n // 消息ID计数器,用于标识每次请求\r\n messageId: 0,\r\n // 存储待处理的回调函数\r\n pendingCallbacks: {},\r\n // 内部维护的选项列表(合并父窗口返回的源对象)\r\n internalOptions: []\r\n }\r\n },\r\n computed: {\r\n // 合并内部选项和外部传入的选项\r\n mergedOptions() {\r\n // 如果内部有选项,优先使用内部选项\r\n if (this.internalOptions.length > 0) {\r\n // 合并去重:根据 valueKey 去重,保留内部选项(后添加的优先)\r\n const optionMap = new Map()\r\n // 先添加外部选项\r\n this.options.forEach((opt) => {\r\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n optionMap.set(value, opt)\r\n })\r\n // 再添加内部选项(会覆盖相同 value 的选项)\r\n this.internalOptions.forEach((opt) => {\r\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n optionMap.set(value, opt)\r\n })\r\n return Array.from(optionMap.values())\r\n }\r\n return this.options\r\n }\r\n },\r\n watch: {\r\n // 监听外部 options 变化,初始化内部选项列表\r\n options: {\r\n immediate: true,\r\n handler(newOptions) {\r\n // 如果内部选项为空,且外部有选项,初始化内部选项\r\n if (\r\n this.internalOptions.length === 0 &&\r\n Array.isArray(newOptions) &&\r\n newOptions.length > 0\r\n ) {\r\n this.internalOptions = [...newOptions]\r\n }\r\n }\r\n }\r\n },\r\n mounted() {\r\n // 监听父窗口返回的消息\r\n window.addEventListener('message', this.handleMessage)\r\n },\r\n beforeUnmount() {\r\n // 组件销毁时移除事件监听\r\n window.removeEventListener('message', this.handleMessage)\r\n },\r\n methods: {\r\n // 序列化数据,确保可以被 postMessage 发送\r\n // postMessage 使用结构化克隆算法,无法克隆 Vue 响应式代理对象\r\n serializeForPostMessage(data) {\r\n // 处理 null 和 undefined\r\n if (data === null || data === undefined) {\r\n return data\r\n }\r\n\r\n try {\r\n // 使用 JSON 序列化和反序列化来创建可克隆的副本\r\n // 这会移除 Vue 响应式代理、函数、Symbol 等不可序列化的内容\r\n return JSON.parse(JSON.stringify(data))\r\n } catch (error) {\r\n console.warn('CusUserSelect: 数据序列化失败,尝试递归处理', error)\r\n\r\n // 如果 JSON 序列化失败(可能是循环引用),尝试递归处理\r\n if (Array.isArray(data)) {\r\n // 空数组直接返回\r\n if (data.length === 0) {\r\n return []\r\n }\r\n // 递归处理数组中的每个元素\r\n return data.map((item) => this.serializeForPostMessage(item))\r\n }\r\n\r\n if (typeof data === 'object') {\r\n const result = {}\r\n for (const key in data) {\r\n if (Object.prototype.hasOwnProperty.call(data, key)) {\r\n try {\r\n result[key] = this.serializeForPostMessage(data[key])\r\n } catch (e) {\r\n // 忽略无法序列化的属性,避免整个序列化失败\r\n console.warn(`CusUserSelect: 跳过无法序列化的属性: ${key}`, e)\r\n }\r\n }\r\n }\r\n return result\r\n }\r\n\r\n // 基本类型(string, number, boolean)直接返回\r\n return data\r\n }\r\n },\r\n handleClick() {\r\n // 如果禁用,不处理\r\n if (this.disabled) {\r\n return\r\n }\r\n\r\n // 生成唯一消息ID\r\n const msgId = `user-select-${\r\n this.field || 'default'\r\n }-${Date.now()}-${++this.messageId}`\r\n\r\n // 序列化所有需要传递的数据,确保可以被 postMessage 发送\r\n // postMessage 无法发送 Vue 响应式代理对象,必须序列化\r\n // 获取当前值,确保是对象数组格式\r\n const currentArrayValue = Array.isArray(this.modelValue)\r\n ? this.modelValue\r\n : []\r\n // 从对象数组中提取 value 值,用于发送给父窗口\r\n // 单选时发送第一个对象的 value,多选时发送所有对象的 value 数组\r\n let valueToSend = null\r\n if (currentArrayValue.length > 0) {\r\n valueToSend = currentArrayValue\r\n }\r\n const serializedCurrentValue =\r\n valueToSend === null || valueToSend === undefined\r\n ? null\r\n : this.serializeForPostMessage(valueToSend)\r\n\r\n // 发送消息给父窗口,请求打开用户选择弹窗\r\n const message = {\r\n type: 'OPEN_USER_SELECT',\r\n field: this.field || '',\r\n multiple: this.multiple,\r\n currentValue: serializedCurrentValue,\r\n valueKey: this.valueKey,\r\n labelKey: this.labelKey,\r\n selectType: this.selectType,\r\n messageId: msgId\r\n }\r\n\r\n // 发送到父窗口(支持 iframe 场景)\r\n if (window.parent && window.parent !== window) {\r\n try {\r\n window.parent.postMessage(message, '*')\r\n } catch (error) {\r\n console.error('CusUserSelect: 发送消息失败', error)\r\n }\r\n } else {\r\n // 如果不在 iframe 中,也可以发送到当前窗口(用于测试)\r\n console.warn(\r\n 'CusUserSelect: 当前不在 iframe 环境中,无法向父窗口发送消息'\r\n )\r\n }\r\n\r\n // 存储回调,等待父窗口返回结果\r\n this.pendingCallbacks[msgId] = (value, sourceItems) => {\r\n // 优先使用 sourceItems(源对象数组),如果没有则根据 value 和 options 构建\r\n if (\r\n sourceItems &&\r\n Array.isArray(sourceItems) &&\r\n sourceItems.length > 0\r\n ) {\r\n // 合并到内部选项列表\r\n this.mergeOptions(sourceItems)\r\n }\r\n\r\n this.handleUpdate(value)\r\n this.handleChange(value)\r\n }\r\n },\r\n handleMessage(event) {\r\n // 验证消息来源(可选,根据实际需求调整)\r\n // if (event.origin !== 'expected-origin') return\r\n\r\n const data = event.data\r\n\r\n // 检查是否是用户选择返回的消息\r\n if (data && data.type === 'USER_SELECT_RESULT') {\r\n const { field, value, sourceItems, messageId } = data\r\n\r\n // 验证字段名是否匹配\r\n if (field !== this.field) {\r\n return\r\n }\r\n\r\n // 查找对应的回调函数\r\n const callback = this.pendingCallbacks[messageId]\r\n if (callback) {\r\n // 执行回调,更新值并传递源对象\r\n // sourceItems: 源对象数组,包含完整的选项信息\r\n // 单选时:[{ value: '1001', label: '用户1', ... }]\r\n // 多选时:[{ value: '1001', label: '用户1', ... }, { value: '1002', label: '用户2', ... }]\r\n callback(value, sourceItems)\r\n // 清理已处理的回调\r\n delete this.pendingCallbacks[messageId]\r\n }\r\n }\r\n },\r\n // 合并选项到内部选项列表\r\n mergeOptions(newItems) {\r\n if (!Array.isArray(newItems) || newItems.length === 0) {\r\n return\r\n }\r\n\r\n // 创建选项映射,用于去重\r\n const optionMap = new Map()\r\n\r\n // 先将现有内部选项添加到映射\r\n this.internalOptions.forEach((opt) => {\r\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n optionMap.set(value, opt)\r\n })\r\n\r\n // 再添加新选项(会覆盖相同 value 的选项)\r\n newItems.forEach((opt) => {\r\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n optionMap.set(value, opt)\r\n })\r\n\r\n // 更新内部选项列表\r\n this.internalOptions = Array.from(optionMap.values())\r\n },\r\n handleUpdate(value) {\r\n this.$emit('update:modelValue', value)\r\n // 值更新后触发校验\r\n this.triggerValidate()\r\n },\r\n handleChange(value) {\r\n this.$emit(\r\n 'change',\r\n value,\r\n this.internalOptions && this.internalOptions.length > 0\r\n ? this.multiple\r\n ? this.internalOptions\r\n : this.internalOptions[0]\r\n : this.multiple\r\n ? []\r\n : null\r\n )\r\n },\r\n // 触发字段校验\r\n triggerValidate() {\r\n // 使用 nextTick 确保值已经更新完成\r\n this.$nextTick(() => {\r\n this.$nextTick(() => {\r\n try {\r\n // 方式1:通过 formCreateInject 中的 API 触发校验\r\n if (\r\n this.formCreateInject &&\r\n this.formCreateInject.api &&\r\n this.field\r\n ) {\r\n this.formCreateInject.api.validateField(this.field).catch(() => {\r\n // 校验失败时静默处理,错误会通过 form-item 显示\r\n })\r\n return\r\n }\r\n\r\n // 方式2:通过组件实例查找父组件中的 form-create API\r\n let parent = this.$parent\r\n while (parent) {\r\n if (\r\n parent.$options &&\r\n parent.$options.name === 'FormCreate' &&\r\n parent.fapi\r\n ) {\r\n if (this.field && parent.fapi.validateField) {\r\n parent.fapi.validateField(this.field).catch(() => {\r\n // 校验失败时静默处理\r\n })\r\n }\r\n break\r\n }\r\n parent = parent.$parent\r\n }\r\n } catch (error) {\r\n console.warn('CusUserSelect: 触发校验失败', error)\r\n }\r\n })\r\n })\r\n }\r\n }\r\n})\r\n</script>\r\n","<template>\r\n <div @click=\"handleClick\">\r\n <CusSelect\r\n :model-value=\"modelValue\"\r\n :options=\"mergedOptions\"\r\n :multiple=\"multiple\"\r\n :max-tag-count=\"maxTagCount\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :style=\"style\"\r\n :valueKey=\"valueKey\"\r\n :labelKey=\"labelKey\"\r\n :allowClear=\"allowClear\"\r\n :bordered=\"bordered\"\r\n @update:model-value=\"handleUpdate\"\r\n @change=\"handleChange\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { defineComponent } from 'vue'\r\nimport CusSelect from '../CusSelect/index.vue'\r\n\r\nexport default defineComponent({\r\n name: 'CusUserSelect',\r\n components: {\r\n CusSelect\r\n },\r\n props: {\r\n // form-create 注入的对象,包含 API 等\r\n formCreateInject: {\r\n type: Object,\r\n default: null\r\n },\r\n // 当前值:统一使用数组格式(支持 v-model)\r\n // 单选时:[value] 或 []\r\n // 多选时:[value1, value2, ...] 或 []\r\n modelValue: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 选项列表\r\n options: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 是否多选\r\n multiple: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 最多显示的 tag 数量(多选模式下有效)\r\n maxTagCount: {\r\n type: Number,\r\n default: undefined // 不限制时显示所有\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: '请选择'\r\n },\r\n // 是否禁用样式\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 自定义样式\r\n style: {\r\n type: [String, Object],\r\n default: () => ({ width: '100%' })\r\n },\r\n // 选项的 value 字段名\r\n valueKey: {\r\n type: String,\r\n default: 'value'\r\n },\r\n // 选项的 label 字段名\r\n labelKey: {\r\n type: String,\r\n default: 'label'\r\n },\r\n // 是否允许清除\r\n allowClear: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 字段名,用于跨窗口通信时标识字段\r\n field: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否有边框\r\n bordered: {\r\n type: Boolean,\r\n default: true\r\n },\r\n selectType: {\r\n type: [String, Number],\r\n default: null\r\n }\r\n },\r\n emits: ['update:modelValue', 'change'],\r\n data() {\r\n return {\r\n // 消息ID计数器,用于标识每次请求\r\n messageId: 0,\r\n // 存储待处理的回调函数\r\n pendingCallbacks: {},\r\n // 内部维护的选项列表(合并父窗口返回的源对象)\r\n internalOptions: []\r\n }\r\n },\r\n computed: {\r\n // 合并内部选项和外部传入的选项\r\n mergedOptions() {\r\n // 如果内部有选项,优先使用内部选项\r\n if (this.internalOptions.length > 0) {\r\n // 合并去重:根据 valueKey 去重,保留内部选项(后添加的优先)\r\n const optionMap = new Map()\r\n // 先添加外部选项\r\n this.options.forEach((opt) => {\r\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n optionMap.set(value, opt)\r\n })\r\n // 再添加内部选项(会覆盖相同 value 的选项)\r\n this.internalOptions.forEach((opt) => {\r\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n optionMap.set(value, opt)\r\n })\r\n return Array.from(optionMap.values())\r\n }\r\n return this.options\r\n }\r\n },\r\n watch: {\r\n // 监听外部 options 变化,初始化内部选项列表\r\n options: {\r\n immediate: true,\r\n handler(newOptions) {\r\n // 如果内部选项为空,且外部有选项,初始化内部选项\r\n if (\r\n this.internalOptions.length === 0 &&\r\n Array.isArray(newOptions) &&\r\n newOptions.length > 0\r\n ) {\r\n this.internalOptions = [...newOptions]\r\n }\r\n }\r\n }\r\n },\r\n mounted() {\r\n // 监听父窗口返回的消息\r\n window.addEventListener('message', this.handleMessage)\r\n },\r\n beforeUnmount() {\r\n // 组件销毁时移除事件监听\r\n window.removeEventListener('message', this.handleMessage)\r\n },\r\n methods: {\r\n // 序列化数据,确保可以被 postMessage 发送\r\n // postMessage 使用结构化克隆算法,无法克隆 Vue 响应式代理对象\r\n serializeForPostMessage(data) {\r\n // 处理 null 和 undefined\r\n if (data === null || data === undefined) {\r\n return data\r\n }\r\n\r\n try {\r\n // 使用 JSON 序列化和反序列化来创建可克隆的副本\r\n // 这会移除 Vue 响应式代理、函数、Symbol 等不可序列化的内容\r\n return JSON.parse(JSON.stringify(data))\r\n } catch (error) {\r\n console.warn('CusUserSelect: 数据序列化失败,尝试递归处理', error)\r\n\r\n // 如果 JSON 序列化失败(可能是循环引用),尝试递归处理\r\n if (Array.isArray(data)) {\r\n // 空数组直接返回\r\n if (data.length === 0) {\r\n return []\r\n }\r\n // 递归处理数组中的每个元素\r\n return data.map((item) => this.serializeForPostMessage(item))\r\n }\r\n\r\n if (typeof data === 'object') {\r\n const result = {}\r\n for (const key in data) {\r\n if (Object.prototype.hasOwnProperty.call(data, key)) {\r\n try {\r\n result[key] = this.serializeForPostMessage(data[key])\r\n } catch (e) {\r\n // 忽略无法序列化的属性,避免整个序列化失败\r\n console.warn(`CusUserSelect: 跳过无法序列化的属性: ${key}`, e)\r\n }\r\n }\r\n }\r\n return result\r\n }\r\n\r\n // 基本类型(string, number, boolean)直接返回\r\n return data\r\n }\r\n },\r\n handleClick() {\r\n // 如果禁用,不处理\r\n if (this.disabled) {\r\n return\r\n }\r\n\r\n // 生成唯一消息ID\r\n const msgId = `user-select-${\r\n this.field || 'default'\r\n }-${Date.now()}-${++this.messageId}`\r\n\r\n // 序列化所有需要传递的数据,确保可以被 postMessage 发送\r\n // postMessage 无法发送 Vue 响应式代理对象,必须序列化\r\n // 获取当前值,确保是对象数组格式\r\n const currentArrayValue = Array.isArray(this.modelValue)\r\n ? this.modelValue\r\n : []\r\n // 从对象数组中提取 value 值,用于发送给父窗口\r\n // 单选时发送第一个对象的 value,多选时发送所有对象的 value 数组\r\n let valueToSend = null\r\n if (currentArrayValue.length > 0) {\r\n valueToSend = currentArrayValue\r\n }\r\n const serializedCurrentValue =\r\n valueToSend === null || valueToSend === undefined\r\n ? null\r\n : this.serializeForPostMessage(valueToSend)\r\n\r\n // 发送消息给父窗口,请求打开用户选择弹窗\r\n const message = {\r\n type: 'OPEN_USER_SELECT',\r\n field: this.field || '',\r\n multiple: this.multiple,\r\n currentValue: serializedCurrentValue,\r\n valueKey: this.valueKey,\r\n labelKey: this.labelKey,\r\n selectType: this.selectType,\r\n messageId: msgId\r\n }\r\n\r\n // 发送到父窗口(支持 iframe 场景)\r\n if (window.parent && window.parent !== window) {\r\n try {\r\n window.parent.postMessage(message, '*')\r\n } catch (error) {\r\n console.error('CusUserSelect: 发送消息失败', error)\r\n }\r\n } else {\r\n // 如果不在 iframe 中,也可以发送到当前窗口(用于测试)\r\n console.warn(\r\n 'CusUserSelect: 当前不在 iframe 环境中,无法向父窗口发送消息'\r\n )\r\n }\r\n\r\n // 存储回调,等待父窗口返回结果\r\n this.pendingCallbacks[msgId] = (value, sourceItems) => {\r\n // 优先使用 sourceItems(源对象数组),如果没有则根据 value 和 options 构建\r\n if (\r\n sourceItems &&\r\n Array.isArray(sourceItems) &&\r\n sourceItems.length > 0\r\n ) {\r\n // 合并到内部选项列表\r\n this.mergeOptions(sourceItems)\r\n }\r\n\r\n this.handleUpdate(value)\r\n this.handleChange(value)\r\n }\r\n },\r\n handleMessage(event) {\r\n // 验证消息来源(可选,根据实际需求调整)\r\n // if (event.origin !== 'expected-origin') return\r\n\r\n const data = event.data\r\n\r\n // 检查是否是用户选择返回的消息\r\n if (data && data.type === 'USER_SELECT_RESULT') {\r\n const { field, value, sourceItems, messageId } = data\r\n\r\n // 验证字段名是否匹配\r\n if (field !== this.field) {\r\n return\r\n }\r\n\r\n // 查找对应的回调函数\r\n const callback = this.pendingCallbacks[messageId]\r\n if (callback) {\r\n // 执行回调,更新值并传递源对象\r\n // sourceItems: 源对象数组,包含完整的选项信息\r\n // 单选时:[{ value: '1001', label: '用户1', ... }]\r\n // 多选时:[{ value: '1001', label: '用户1', ... }, { value: '1002', label: '用户2', ... }]\r\n callback(value, sourceItems)\r\n // 清理已处理的回调\r\n delete this.pendingCallbacks[messageId]\r\n }\r\n }\r\n },\r\n // 合并选项到内部选项列表\r\n mergeOptions(newItems) {\r\n if (!Array.isArray(newItems) || newItems.length === 0) {\r\n return\r\n }\r\n\r\n // 创建选项映射,用于去重\r\n const optionMap = new Map()\r\n\r\n // 先将现有内部选项添加到映射\r\n this.internalOptions.forEach((opt) => {\r\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n optionMap.set(value, opt)\r\n })\r\n\r\n // 再添加新选项(会覆盖相同 value 的选项)\r\n newItems.forEach((opt) => {\r\n const value = typeof opt === 'object' ? opt[this.valueKey] : opt\r\n optionMap.set(value, opt)\r\n })\r\n\r\n // 更新内部选项列表\r\n this.internalOptions = Array.from(optionMap.values())\r\n },\r\n handleUpdate(value) {\r\n this.$emit('update:modelValue', value)\r\n // 值更新后触发校验\r\n this.triggerValidate()\r\n },\r\n handleChange(value) {\r\n this.$emit(\r\n 'change',\r\n value,\r\n this.internalOptions && this.internalOptions.length > 0\r\n ? this.multiple\r\n ? this.internalOptions\r\n : this.internalOptions[0]\r\n : this.multiple\r\n ? []\r\n : null\r\n )\r\n },\r\n // 触发字段校验\r\n triggerValidate() {\r\n // 使用 nextTick 确保值已经更新完成\r\n this.$nextTick(() => {\r\n this.$nextTick(() => {\r\n try {\r\n // 方式1:通过 formCreateInject 中的 API 触发校验\r\n if (\r\n this.formCreateInject &&\r\n this.formCreateInject.api &&\r\n this.field\r\n ) {\r\n this.formCreateInject.api.validateField(this.field).catch(() => {\r\n // 校验失败时静默处理,错误会通过 form-item 显示\r\n })\r\n return\r\n }\r\n\r\n // 方式2:通过组件实例查找父组件中的 form-create API\r\n let parent = this.$parent\r\n while (parent) {\r\n if (\r\n parent.$options &&\r\n parent.$options.name === 'FormCreate' &&\r\n parent.fapi\r\n ) {\r\n if (this.field && parent.fapi.validateField) {\r\n parent.fapi.validateField(this.field).catch(() => {\r\n // 校验失败时静默处理\r\n })\r\n }\r\n break\r\n }\r\n parent = parent.$parent\r\n }\r\n } catch (error) {\r\n console.warn('CusUserSelect: 触发校验失败', error)\r\n }\r\n })\r\n })\r\n }\r\n }\r\n})\r\n</script>\r\n","import upload from '@form-create/component-antdv-upload/src/index'\nimport frame from '@form-create/component-antdv-frame/src/index'\nimport group from '@form-create/component-antdv-group/src/index'\nimport subForm from '@form-create/component-subform/src/index'\nimport QuestionCircleOutlined from './icon/QuestionCircleOutlined.vue'\nimport CusSelect from './CusSelect/index.vue'\nimport CusStoreSelect from './CusStoreSelect/index.vue'\nimport CusUserSelect from './CusUserSelect/index.vue'\n\nexport default [\n upload,\n frame,\n group,\n subForm,\n QuestionCircleOutlined,\n CusSelect,\n CusStoreSelect,\n CusUserSelect\n]\n","import {hasProperty} from '@form-create/utils/lib/type';\r\n\r\nexport default {\r\n name: 'checkbox',\r\n modelField: 'value',\r\n mergeProp(ctx) {\r\n const props = ctx.prop.props;\r\n if (!hasProperty(props, 'options'))\r\n props.options = ctx.prop.options || [];\r\n }\r\n\r\n}\r\n","import checkbox from './checkbox';\n\nexport default {\n ...checkbox, name: 'radio'\n};\n","import checkbox from './checkbox'\nimport { hasProperty } from '@form-create/utils/lib/type'\n\nexport default {\n ...checkbox,\n name: 'select',\n mergeProp(ctx) {\n const props = ctx.prop.props\n if (!hasProperty(props, 'options')) props.options = ctx.prop.options || []\n\n // 检测 loading 状态:从 effectData('fetch') 中获取 loading 状态\n const fetchData = ctx.effectData('fetch')\n const isLoading = fetchData && fetchData.loading === true\n\n // 如果正在加载,设置 disabled 和 loading\n if (isLoading) {\n props.disabled = true\n props.loading = true\n }\n },\n render(children, ctx) {\n // 检测 loading 状态(与 mergeProp 中的逻辑保持一致)\n const fetchData = ctx.effectData('fetch')\n const isLoading = fetchData && fetchData.loading === true\n\n // 如果有 loading 插槽且正在加载,将 loading 插槽传递给组件的 notFoundContent 插槽\n if (isLoading && children.loading) {\n // 将 loading 插槽合并到 children 中,作为 notFoundContent\n const newChildren = { ...children }\n newChildren.notFoundContent = children.loading\n return ctx.$render.defaultRender(ctx, newChildren)\n }\n\n // 调用默认渲染\n return ctx.$render.defaultRender(ctx, children)\n }\n}\n","import { hasProperty } from '@form-create/utils/lib/type'\r\n\r\nexport default {\r\n name: 'cascader',\r\n mergeProp(ctx) {\r\n const props = ctx.prop.props\r\n if (!hasProperty(props, 'options')) props.options = ctx.prop.options || []\r\n\r\n // 检测 loading 状态:从 effectData('fetch') 中获取 loading 状态\r\n const fetchData = ctx.effectData('fetch')\r\n const isLoading = fetchData && fetchData.loading === true\r\n\r\n // 如果正在加载,设置 disabled 和 loading\r\n if (isLoading) {\r\n props.disabled = true\r\n props.loading = true\r\n }\r\n },\r\n render(children, ctx) {\r\n // 检测 loading 状态(与 mergeProp 中的逻辑保持一致)\r\n const fetchData = ctx.effectData('fetch')\r\n const isLoading = fetchData && fetchData.loading === true\r\n\r\n // 如果有 loading 插槽且正在加载,将 loading 插槽传递给组件的 notFoundContent 插槽\r\n if (isLoading && children.loading) {\r\n // 将 loading 插槽合并到 children 中,作为 notFoundContent\r\n const newChildren = { ...children }\r\n newChildren.notFoundContent = children.loading\r\n return ctx.$render.defaultRender(ctx, newChildren)\r\n }\r\n\r\n // 调用默认渲染\r\n return ctx.$render.defaultRender(ctx, children)\r\n }\r\n}\r\n","import { creatorFactory } from '@longhongguo/form-create-core/src/index'\n\nconst FORMAT_TYPE = {\n date: 'YYYY-MM-DD',\n month: 'YYYY-MM',\n week: 'YYYY-wo',\n quarter: 'YYYY-qQ',\n year: 'YYYY'\n}\n\nconst name = 'datePicker'\n\nexport default {\n name,\n maker: (function () {\n return ['date', 'month', 'week'].reduce(\n (initial, type) => {\n initial[type] = creatorFactory(name, { type })\n return initial\n },\n {\n dateRange: creatorFactory(name, { type: 'range' }),\n datetimeRange: creatorFactory(name, (m) =>\n m.props({ type: 'range', showTime: true })\n )\n }\n )\n })(),\n modelField: 'value',\n mergeProp(ctx) {\n const props = ctx.prop.props\n const type = props.type || props.picker\n if (!props.valueFormat) {\n props.valueFormat =\n (FORMAT_TYPE[type] || FORMAT_TYPE['date']) +\n (props.showTime && (!type || type === 'date') ? ' HH:mm:ss' : '')\n }\n },\n render(children, ctx) {\n return ctx.$render.vNode[\n (ctx.prop.props.range === true ? 'range' : 'date') + 'Picker'\n ](ctx.prop, children)\n }\n}\n","import { creatorFactory } from '@longhongguo/form-create-core/src/index'\n\nconst name = 'hidden'\n\nexport default {\n name,\n maker: {\n [name]: (field, value) => creatorFactory(name)('', field, value)\n },\n render() {\n return []\n }\n}\n","import { creatorFactory } from '@longhongguo/form-create-core/src/index'\n\nconst name = 'input'\nexport default {\n name,\n maker: (function () {\n return ['password', 'url', 'email', 'text', 'textarea', 'search'].reduce(\n (maker, type) => {\n maker[type] = creatorFactory(name, { type })\n return maker\n },\n {\n idate: creatorFactory(name, { type: 'date' })\n }\n )\n })(),\n modelField: 'value',\n render(children, ctx) {\n let type = ctx.prop.props.type\n if (['textarea', 'search', 'password'].indexOf(type) === -1) type = 'input'\n\n type =\n {\n textarea: 'aTextarea',\n search: 'aInputSearch',\n password: 'aInputPassword'\n }[type] || 'aInput'\n return ctx.$render.vNode.make(type, ctx.prop, children)\n }\n}\n","export default {\n name: 'timePicker',\n modelField: 'value',\n mergeProp(ctx) {\n const props = ctx.prop.props;\n if (!props.valueFormat) {\n props.valueFormat = 'HH:mm:ss';\n }\n },\n render(children, ctx) {\n return ctx.$render.vNode['time' +( ctx.prop.props.range === true ? 'Range' : '') + 'Picker'](ctx.prop, children);\n }\n\n}\n\n","export default {\n name: 'tree',\n modelField: 'checkedKeys',\n mergeProp(ctx) {\n const props = ctx.prop.props;\n if (!props.fieldNames)\n props.fieldNames = {\n key: 'id'\n };\n else if (!props.fieldNames.key) props.fieldNames.key = 'id';\n props.checkedKeys = ctx.rule.value;\n props.checkable = true;\n },\n\n}\n\n","export default {\n name: 'FcRow',\n render(_, ctx) {\n return ctx.vNode.col({props: {span: 24}}, {\n default: () => [\n ctx.vNode.row(ctx.prop, _)\n ]\n })\n }\n}\n","import timePicker from './timePicker';\n\nconst name = 'timeRangePicker';\n\nexport default {\n ...timePicker,\n name,\n render(children, ctx) {\n return ctx.$render.vNode['timeRangePicker'](ctx.prop, children);\n }\n}\n","import checkbox from './checkbox'\nimport radio from './radio'\nimport select from './select'\nimport cascader from './cascader'\nimport datePicker from './datePicker'\nimport hidden from './hidden'\nimport input from './input'\nimport timePicker from './timePicker'\nimport tree from './tree'\nimport row from './row'\nimport rangePicker from './rangePicker'\nimport timeRangePicker from './timeRangePicker'\nimport cusStoreSelect from './cusStoreSelect'\nimport cusUserSelect from './cusUserSelect'\n\nexport default [\n checkbox,\n datePicker,\n rangePicker,\n hidden,\n input,\n timePicker,\n timeRangePicker,\n tree,\n radio,\n select,\n cascader,\n row,\n cusStoreSelect,\n cusUserSelect\n]\n","import datePicker from './datePicker';\n\nconst name = 'rangePicker';\n\nexport default {\n ...datePicker,\n name,\n maker: {},\n render(children, ctx) {\n return ctx.$render.vNode['rangePicker'](ctx.prop, children);\n }\n}\n","import { hasProperty } from '@form-create/utils/lib/type'\r\nimport { nextTick } from 'vue'\r\n\r\nexport default {\r\n name: 'cusStoreSelect',\r\n modelField: 'modelValue',\r\n // 将 form-create 内部的值转换为对象数组格式\r\n toFormValue(value, ctx) {\r\n // 组件内部统一使用对象数组格式 [{value, label, ...}]\r\n if (value === null || value === undefined || value === '') {\r\n return []\r\n }\r\n if (Array.isArray(value)) {\r\n // 确保数组中的每个元素都是对象格式\r\n return value.map((item) => {\r\n if (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n (item.value !== undefined || item.label !== undefined)\r\n ) {\r\n // 已经是对象格式\r\n return item\r\n }\r\n // 如果是单个值,需要转换为对象格式(但此时没有 label,会在组件内部处理)\r\n return item\r\n })\r\n }\r\n // 单个值转换为数组(组件内部会处理对象转换)\r\n return [value]\r\n },\r\n // 将组件返回的数组格式转换为 form-create 内部格式(可选,保持原值)\r\n toValue(formValue, ctx) {\r\n // 保持数组格式,不转换\r\n return formValue\r\n },\r\n mergeProp(ctx) {\r\n const props = ctx.prop.props\r\n // 确保 options 存在\r\n if (!hasProperty(props, 'options')) {\r\n props.options = ctx.prop.options || []\r\n }\r\n // 传递字段名到组件,用于跨窗口通信时标识字段\r\n if (!hasProperty(props, 'field')) {\r\n props.field = ctx.rule.field || ''\r\n }\r\n // 确保初始值转换为数组格式\r\n if (ctx.rule.value !== undefined) {\r\n const currentValue = ctx.rule.value\r\n if (\r\n currentValue === null ||\r\n currentValue === undefined ||\r\n currentValue === ''\r\n ) {\r\n ctx.rule.value = []\r\n } else if (!Array.isArray(currentValue)) {\r\n ctx.rule.value = [currentValue]\r\n }\r\n }\r\n },\r\n render(children, ctx) {\r\n // 使用默认渲染\r\n const vnode = ctx.$render.defaultRender(ctx, children)\r\n\r\n // 添加校验触发逻辑:在值变化时触发校验\r\n if (vnode && vnode.props && vnode.props.on) {\r\n // 保存原始的 update:modelValue 事件处理器(form-create 自动添加的)\r\n const originalUpdateModelValue = vnode.props.on['update:modelValue']\r\n\r\n // 创建校验触发函数\r\n const triggerValidate = () => {\r\n // 延迟触发校验,确保值已经更新完成\r\n // 使用多个 nextTick 确保 form-create 内部的值更新流程完成\r\n nextTick(() => {\r\n nextTick(() => {\r\n try {\r\n // 方式1:通过 field 名称触发校验(推荐)\r\n const fieldName = ctx.rule.field\r\n if (fieldName) {\r\n ctx.$handle.api.validateField(fieldName).catch(() => {\r\n // 校验失败时静默处理,错误会通过 form-item 显示\r\n })\r\n return\r\n }\r\n\r\n // 方式2:通过字段上下文ID触发校验(备用)\r\n const fieldCtx = ctx.$handle.getFieldCtx(ctx.rule.field)\r\n if (fieldCtx && fieldCtx.id) {\r\n ctx.$handle.$manager.validateField(fieldCtx.id).catch(() => {\r\n // 校验失败时静默处理,错误会通过 form-item 显示\r\n })\r\n }\r\n } catch (error) {\r\n // 静默处理错误,避免影响正常流程\r\n console.warn('CusStoreSelect: 触发校验失败', error)\r\n }\r\n })\r\n })\r\n }\r\n\r\n // 包装 update:modelValue 事件,在值更新后触发校验\r\n vnode.props.on['update:modelValue'] = (...args) => {\r\n // 先调用原始的事件处理器(form-create 的 onInput,会更新值和触发其他逻辑)\r\n if (originalUpdateModelValue) {\r\n originalUpdateModelValue(...args)\r\n }\r\n // 触发校验\r\n triggerValidate()\r\n }\r\n\r\n // 同时监听 change 事件,确保所有情况下都能触发校验\r\n const originalChange = vnode.props.on['change']\r\n if (originalChange) {\r\n vnode.props.on['change'] = (...args) => {\r\n // 先调用原始的 change 处理器\r\n originalChange(...args)\r\n // 触发校验\r\n triggerValidate()\r\n }\r\n } else {\r\n // 如果没有原始的 change 处理器,直接添加\r\n vnode.props.on['change'] = triggerValidate\r\n }\r\n }\r\n\r\n return vnode\r\n }\r\n}\r\n","import { hasProperty } from '@form-create/utils/lib/type'\r\nimport { nextTick } from 'vue'\r\n\r\nexport default {\r\n name: 'cusUserSelect',\r\n modelField: 'modelValue',\r\n // 将 form-create 内部的值转换为对象数组格式\r\n toFormValue(value, ctx) {\r\n // 组件内部统一使用对象数组格式 [{value, label, ...}]\r\n if (value === null || value === undefined || value === '') {\r\n return []\r\n }\r\n if (Array.isArray(value)) {\r\n // 确保数组中的每个元素都是对象格式\r\n return value.map((item) => {\r\n if (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n (item.value !== undefined || item.label !== undefined)\r\n ) {\r\n // 已经是对象格式\r\n return item\r\n }\r\n // 如果是单个值,需要转换为对象格式(但此时没有 label,会在组件内部处理)\r\n return item\r\n })\r\n }\r\n // 单个值转换为数组(组件内部会处理对象转换)\r\n return [value]\r\n },\r\n // 将组件返回的数组格式转换为 form-create 内部格式(可选,保持原值)\r\n toValue(formValue, ctx) {\r\n // 保持数组格式,不转换\r\n return formValue\r\n },\r\n mergeProp(ctx) {\r\n const props = ctx.prop.props\r\n // 确保 options 存在\r\n if (!hasProperty(props, 'options')) {\r\n props.options = ctx.prop.options || []\r\n }\r\n // 传递字段名到组件,用于跨窗口通信时标识字段\r\n if (!hasProperty(props, 'field')) {\r\n props.field = ctx.rule.field || ''\r\n }\r\n // 传递 formCreateInject 到组件,用于在组件内部触发校验\r\n if (!hasProperty(props, 'formCreateInject')) {\r\n props.formCreateInject = ctx.inject\r\n }\r\n // 确保初始值转换为数组格式\r\n if (ctx.rule.value !== undefined) {\r\n const currentValue = ctx.rule.value\r\n if (\r\n currentValue === null ||\r\n currentValue === undefined ||\r\n currentValue === ''\r\n ) {\r\n ctx.rule.value = []\r\n } else if (!Array.isArray(currentValue)) {\r\n ctx.rule.value = [currentValue]\r\n }\r\n }\r\n },\r\n render(children, ctx) {\r\n // 使用默认渲染\r\n const vnode = ctx.$render.defaultRender(ctx, children)\r\n\r\n // 添加校验触发逻辑:在值变化时触发校验\r\n if (vnode && vnode.props && vnode.props.on) {\r\n // 保存原始的 update:modelValue 事件处理器(form-create 自动添加的)\r\n const originalUpdateModelValue = vnode.props.on['update:modelValue']\r\n\r\n // 创建校验触发函数\r\n const triggerValidate = () => {\r\n // 延迟触发校验,确保值已经更新完成\r\n // 使用多个 nextTick 确保 form-create 内部的值更新流程完成\r\n nextTick(() => {\r\n nextTick(() => {\r\n try {\r\n // 方式1:通过 field 名称触发校验(推荐)\r\n const fieldName = ctx.rule.field\r\n if (fieldName) {\r\n ctx.$handle.api.validateField(fieldName).catch(() => {\r\n // 校验失败时静默处理,错误会通过 form-item 显示\r\n })\r\n return\r\n }\r\n\r\n // 方式2:通过字段上下文ID触发校验(备用)\r\n const fieldCtx = ctx.$handle.getFieldCtx(ctx.rule.field)\r\n if (fieldCtx && fieldCtx.id) {\r\n ctx.$handle.$manager.validateField(fieldCtx.id).catch(() => {\r\n // 校验失败时静默处理,错误会通过 form-item 显示\r\n })\r\n }\r\n } catch (error) {\r\n // 静默处理错误,避免影响正常流程\r\n console.warn('CusUserSelect: 触发校验失败', error)\r\n }\r\n })\r\n })\r\n }\r\n\r\n // 包装 update:modelValue 事件,在值更新后触发校验\r\n vnode.props.on['update:modelValue'] = (...args) => {\r\n // 先调用原始的事件处理器(form-create 的 onInput,会更新值和触发其他逻辑)\r\n if (originalUpdateModelValue) {\r\n originalUpdateModelValue(...args)\r\n }\r\n // 触发校验\r\n triggerValidate()\r\n }\r\n\r\n // 同时监听 change 事件,确保所有情况下都能触发校验\r\n const originalChange = vnode.props.on['change']\r\n if (originalChange) {\r\n vnode.props.on['change'] = (...args) => {\r\n // 先调用原始的 change 处理器\r\n originalChange(...args)\r\n // 触发校验\r\n triggerValidate()\r\n }\r\n } else {\r\n // 如果没有原始的 change 处理器,直接添加\r\n vnode.props.on['change'] = triggerValidate\r\n }\r\n }\r\n\r\n return vnode\r\n }\r\n}\r\n","const PRE = 'a'\nexport default {\n tooltip: PRE + 'Tooltip',\n popover: PRE + 'Popover',\n button: PRE + 'Button',\n icon: PRE + 'Icon',\n slider: PRE + 'Slider',\n rate: PRE + 'Rate',\n upload: 'fcUpload',\n cascader: PRE + 'Cascader',\n timePicker: PRE + 'TimePicker',\n timeRangePicker: PRE + 'TimeRangePicker',\n datePicker: PRE + 'DatePicker',\n rangePicker: PRE + 'RangePicker',\n switch: PRE + 'Switch',\n select: PRE + 'Select',\n checkbox: PRE + 'CheckboxGroup',\n radio: PRE + 'RadioGroup',\n input: PRE + 'Input',\n inputNumber: PRE + 'InputNumber',\n treeSelect: PRE + 'TreeSelect',\n search: PRE + 'InputSearch',\n inputPassword: PRE + 'InputPassword',\n textarea: PRE + 'Textarea',\n formItem: PRE + 'FormItem',\n form: PRE + 'Form',\n frame: 'fcFrame',\n col: PRE + 'Col',\n row: PRE + 'Row',\n tree: PRE + 'Tree',\n autoComplete: PRE + 'AutoComplete',\n transfer: PRE + 'Transfer',\n group: 'fcGroup',\n array: 'fcGroup',\n subForm: 'fcSubForm',\n object: 'fcSubForm'\n}\n","import getConfig from './config'\r\nimport mergeProps from '@form-create/utils/lib/mergeprops'\r\nimport is, { hasProperty } from '@form-create/utils/lib/type'\r\nimport extend from '@form-create/utils/lib/extend'\r\n\r\nfunction isTooltip(info) {\r\n return info.type === 'tooltip'\r\n}\r\n\r\nfunction tidy(props, name) {\r\n if (!hasProperty(props, name)) return\r\n if (is.String(props[name])) {\r\n props[name] = { [name]: props[name], show: true }\r\n }\r\n}\r\n\r\nfunction isFalse(val) {\r\n return val === false\r\n}\r\n\r\nfunction tidyBool(opt, name) {\r\n if (hasProperty(opt, name) && !is.Object(opt[name])) {\r\n opt[name] = { show: !!opt[name] }\r\n }\r\n}\r\n\r\nfunction tidyRule(rule) {\r\n const _rule = { ...rule }\r\n delete _rule.children\r\n return _rule\r\n}\r\n\r\nexport default {\r\n validate() {\r\n const form = this.form()\r\n if (form) {\r\n return form.validate()\r\n } else {\r\n return new Promise((v) => v())\r\n }\r\n },\r\n validateField(field) {\r\n const form = this.form()\r\n if (form) {\r\n return form.validateFields(field)\r\n } else {\r\n return new Promise((v) => v())\r\n }\r\n },\r\n clearValidateState(ctx) {\r\n const fItem = this.vm.refs[ctx.wrapRef]\r\n if (fItem) {\r\n fItem.clearValidate()\r\n }\r\n },\r\n tidyOptions(options) {\r\n ;['submitBtn', 'resetBtn', 'row', 'info', 'wrap', 'col', 'title'].forEach(\r\n (name) => {\r\n tidyBool(options, name)\r\n }\r\n )\r\n return options\r\n },\r\n tidyRule({ prop }) {\r\n tidy(prop, 'title')\r\n tidy(prop, 'info')\r\n return prop\r\n },\r\n mergeProp(ctx) {\r\n const def = {\r\n info: {\r\n type: 'popover',\r\n placement: 'topLeft',\r\n icon: 'QuestionCircleOutlined'\r\n },\r\n title: {},\r\n col: { span: 24 },\r\n wrap: {}\r\n }\r\n ;['info', 'wrap', 'col', 'title'].forEach((name) => {\r\n ctx.prop[name] = mergeProps(\r\n [this.options[name] || {}, ctx.prop[name] || {}],\r\n def[name]\r\n )\r\n })\r\n\r\n // 为 upload 组件自动添加 onPreview,确保始终向父窗口发送预览通知\r\n if (ctx.rule.type === 'upload' && !ctx.prop.props.onPreview) {\r\n const sendPreviewMessage = function (file) {\r\n if (window.parent && window.parent !== window) {\r\n window.parent.postMessage(\r\n {\r\n type: 'upload-preview',\r\n file: {\r\n url: file.url,\r\n name: file.name,\r\n uid: file.uid,\r\n size: file.size,\r\n type: file.type\r\n },\r\n timestamp: Date.now()\r\n },\r\n '*'\r\n )\r\n }\r\n }\r\n ctx.prop.props.onPreview = function (file) {\r\n sendPreviewMessage(file)\r\n // 不执行默认预览,只发送消息\r\n }\r\n } else if (ctx.rule.type === 'upload' && ctx.prop.props.onPreview) {\r\n // 如果用户已经设置了 onPreview,包装它以确保先发送消息\r\n const originalOnPreview = ctx.prop.props.onPreview\r\n const sendPreviewMessage = function (file) {\r\n if (window.parent && window.parent !== window) {\r\n window.parent.postMessage(\r\n {\r\n type: 'upload-preview',\r\n file: {\r\n url: file.url,\r\n name: file.name,\r\n uid: file.uid,\r\n size: file.size,\r\n type: file.type\r\n },\r\n timestamp: Date.now()\r\n },\r\n '*'\r\n )\r\n }\r\n }\r\n ctx.prop.props.onPreview = function (file) {\r\n sendPreviewMessage(file)\r\n if (originalOnPreview && typeof originalOnPreview === 'function') {\r\n originalOnPreview.apply(this, arguments)\r\n }\r\n }\r\n }\r\n },\r\n getDefaultOptions() {\r\n return getConfig()\r\n },\r\n adapterValidate(validate, validator) {\r\n validate.validator = (rule, value) => {\r\n return new Promise((resolve, reject) => {\r\n const callback = (err) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve()\r\n }\r\n }\r\n return validator(value, callback)\r\n })\r\n }\r\n return validate\r\n },\r\n update() {\r\n const form = this.options.form\r\n this.rule = {\r\n props: { ...form },\r\n on: {\r\n submit: (e) => {\r\n e.preventDefault()\r\n }\r\n },\r\n style: form.style,\r\n type: 'form'\r\n }\r\n },\r\n beforeRender() {\r\n const { key, ref, $handle } = this\r\n const form = this.options.form\r\n extend(this.rule, {\r\n key,\r\n ref,\r\n class: [\r\n form.className,\r\n form.class,\r\n 'form-create',\r\n this.$handle.preview ? 'is-preview' : ''\r\n ]\r\n })\r\n extend(this.rule.props, {\r\n model: $handle.formData\r\n })\r\n },\r\n render(children) {\r\n if (children.slotLen() && !this.$handle.preview) {\r\n children.setSlot(undefined, () => this.makeFormBtn())\r\n }\r\n return this.$r(\r\n this.rule,\r\n isFalse(this.options.row.show)\r\n ? children.getSlots()\r\n : [this.makeRow(children)]\r\n )\r\n },\r\n makeWrap(ctx, children) {\r\n const rule = ctx.prop\r\n const uni = `${this.key}${ctx.key}`\r\n const col = rule.col\r\n const isTitle = this.isTitle(rule) && rule.wrap.title !== false\r\n const { layout, col: _col } = this.rule.props\r\n const cls = rule.wrap.class\r\n delete rule.wrap.class\r\n delete rule.wrap.title\r\n const item = isFalse(rule.wrap.show)\r\n ? children\r\n : this.$r(\r\n mergeProps([\r\n rule.wrap,\r\n {\r\n props: {\r\n ...tidyRule(rule.wrap || {}),\r\n hasFeedback: rule.hasFeedback || false,\r\n name: ctx.id,\r\n rules: ctx.injectValidate(),\r\n ...(layout !== 'horizontal'\r\n ? { labelCol: {}, wrapperCol: {} }\r\n : {})\r\n },\r\n class: this.$render.mergeClass(\r\n cls || rule.className,\r\n 'fc-form-item'\r\n ),\r\n key: `${uni}fi`,\r\n ref: ctx.wrapRef,\r\n type: 'formItem'\r\n }\r\n ]),\r\n {\r\n default: () => children,\r\n ...(isTitle ? { label: () => this.makeInfo(rule, uni, ctx) } : {})\r\n }\r\n )\r\n return layout === 'inline' || isFalse(_col) || isFalse(col.show)\r\n ? item\r\n : this.makeCol(rule, uni, [item])\r\n },\r\n isTitle(rule) {\r\n if (this.options.form.title === false) return false\r\n const title = rule.title\r\n return !((!title.title && !title.native) || isFalse(title.show))\r\n },\r\n makeInfo(rule, uni, ctx) {\r\n const titleProp = { ...rule.title }\r\n const infoProp = { ...rule.info }\r\n if (this.options.form.title === false) return false\r\n if ((!titleProp.title && !titleProp.native) || isFalse(titleProp.show))\r\n return\r\n const isTip = isTooltip(infoProp)\r\n const titleSlot = this.getSlot('title')\r\n const children = [\r\n titleSlot\r\n ? titleSlot({\r\n title: ctx.refRule?.__$title?.value,\r\n rule: ctx.rule,\r\n options: this.options\r\n })\r\n : ctx.refRule?.__$title?.value\r\n ]\r\n\r\n if (\r\n !isFalse(infoProp.show) &&\r\n (infoProp.info || infoProp.native) &&\r\n !isFalse(infoProp.icon)\r\n ) {\r\n const prop = {\r\n type: infoProp.type || 'popover',\r\n props: tidyRule(infoProp),\r\n key: `${uni}pop`\r\n }\r\n\r\n delete prop.props.icon\r\n delete prop.props.show\r\n delete prop.props.info\r\n delete prop.props.align\r\n delete prop.props.native\r\n\r\n const field = isTip ? 'title' : 'content'\r\n if (infoProp.info && !hasProperty(prop.props, field)) {\r\n prop.props[field] = ctx.refRule?.__$info?.value\r\n }\r\n children[infoProp.align !== 'left' ? 'unshift' : 'push'](\r\n this.$r(mergeProps([infoProp, prop]), {\r\n [titleProp.slot || 'default']: () =>\r\n this.$r({\r\n type:\r\n infoProp.icon === true\r\n ? 'QuestionCircleOutlined'\r\n : infoProp.icon || '',\r\n props: {\r\n type:\r\n infoProp.icon === true\r\n ? 'QuestionCircleOutlined'\r\n : infoProp.icon\r\n },\r\n key: `${uni}i`\r\n })\r\n })\r\n )\r\n }\r\n\r\n const _prop = mergeProps([\r\n titleProp,\r\n {\r\n props: tidyRule(titleProp),\r\n key: `${uni}tit`,\r\n class: 'fc-form-title',\r\n type: titleProp.type || 'span'\r\n }\r\n ])\r\n\r\n delete _prop.props.show\r\n delete _prop.props.title\r\n delete _prop.props.native\r\n\r\n return this.$r(_prop, children)\r\n },\r\n makeCol(rule, uni, children) {\r\n const col = rule.col\r\n return this.$r(\r\n {\r\n class: this.$render.mergeClass(col.class, 'fc-form-col'),\r\n type: 'col',\r\n props: col || { span: 24 },\r\n key: `${uni}col`\r\n },\r\n children\r\n )\r\n },\r\n makeRow(children) {\r\n const row = this.options.row || {}\r\n return this.$r(\r\n {\r\n type: 'row',\r\n props: row,\r\n class: this.$render.mergeClass(row.class, 'fc-form-row'),\r\n key: `${this.key}row`\r\n },\r\n children\r\n )\r\n },\r\n makeFormBtn() {\r\n let vn = []\r\n if (!isFalse(this.options.submitBtn.show)) {\r\n vn.push(this.makeSubmitBtn())\r\n }\r\n if (!isFalse(this.options.resetBtn.show)) {\r\n vn.push(this.makeResetBtn())\r\n }\r\n if (!vn.length) {\r\n return\r\n }\r\n let { labelCol, wrapperCol, layout } = this.rule.props\r\n if (layout !== 'horizontal') {\r\n labelCol = wrapperCol = {}\r\n }\r\n const item = this.$r(\r\n {\r\n type: 'formItem',\r\n class: 'fc-form-item fc-form-footer',\r\n key: `${this.key}fb`,\r\n props: {\r\n labelCol,\r\n wrapperCol,\r\n label: ' ',\r\n colon: false\r\n }\r\n },\r\n vn\r\n )\r\n\r\n return layout === 'inline'\r\n ? item\r\n : this.$r(\r\n {\r\n type: 'col',\r\n class: 'fc-form-col',\r\n props: { span: 24 },\r\n key: `${this.key}fc`\r\n },\r\n [item]\r\n )\r\n },\r\n\r\n makeResetBtn() {\r\n const resetBtn = { ...this.options.resetBtn }\r\n const innerText =\r\n resetBtn.innerText || this.$handle.api.t('reset') || '重置'\r\n delete resetBtn.innerText\r\n delete resetBtn.click\r\n delete resetBtn.col\r\n delete resetBtn.show\r\n return this.$r(\r\n {\r\n type: 'button',\r\n props: resetBtn,\r\n class: 'fc-reset-btn',\r\n style: { width: resetBtn.width, marginLeft: '10px' },\r\n on: {\r\n click: () => {\r\n const fApi = this.$handle.api\r\n this.options.resetBtn.click\r\n ? this.options.resetBtn.click(fApi)\r\n : fApi.resetFields()\r\n }\r\n },\r\n key: `${this.key}b2`\r\n },\r\n [innerText]\r\n )\r\n },\r\n makeSubmitBtn() {\r\n const submitBtn = { ...this.options.submitBtn }\r\n const innerText =\r\n submitBtn.innerText || this.$handle.api.t('submit') || '提交'\r\n delete submitBtn.innerText\r\n delete submitBtn.click\r\n delete submitBtn.col\r\n delete submitBtn.show\r\n return this.$r(\r\n {\r\n type: 'button',\r\n props: submitBtn,\r\n class: 'fc-submit-btn',\r\n style: { width: submitBtn.width },\r\n on: {\r\n click: () => {\r\n const fApi = this.$handle.api\r\n this.options.submitBtn.click\r\n ? this.options.submitBtn.click(fApi)\r\n : fApi.submit().catch(() => {})\r\n }\r\n },\r\n key: `${this.key}b1`\r\n },\r\n [innerText]\r\n )\r\n }\r\n}\r\n","const UNDEF = undefined\n\nexport default function getConfig() {\n return {\n form: {\n hideRequiredMark: false,\n layout: 'horizontal',\n labelAlign: 'right',\n labelCol: {\n span: 3\n },\n wrapperCol: {\n span: 21\n },\n validateOnRuleChange: true\n },\n row: {\n gutter: 0\n },\n submitBtn: {\n disabled: false,\n loading: false,\n type: 'primary',\n innerText: '',\n show: false,\n col: UNDEF,\n click: UNDEF\n },\n resetBtn: {\n disabled: false,\n loading: false,\n type: 'default',\n innerText: '',\n show: false,\n col: UNDEF,\n click: UNDEF\n }\n }\n}\n","import { creatorFactory } from '@longhongguo/form-create-core/src/index'\n\nconst maker = {}\n\nfunction useAlias(maker) {\n ;[\n 'treeSelect',\n 'upload',\n 'frame',\n 'autoComplete',\n 'cascader',\n 'datePicker',\n 'frame',\n 'inputNumber',\n 'inputPassword',\n 'radio',\n 'rate',\n 'switch',\n 'rate',\n 'slider',\n 'timePicker'\n ].reduce((maker, name) => {\n maker[name] = creatorFactory(name)\n return maker\n }, maker)\n maker.auto = maker.autoComplete\n maker.number = maker.inputNumber\n maker.time = maker.timePicker\n maker.password = maker.inputPassword\n}\n\nfunction useFrame(maker) {\n const types = {\n frameInputs: ['input', 0],\n frameFiles: ['file', 0],\n frameImages: ['image', 0],\n frameInputOne: ['input', 1],\n frameFileOne: ['file', 1],\n frameImageOne: ['image', 1]\n }\n\n Object.keys(types).reduce((maker, key) => {\n maker[key] = creatorFactory('frame', (m) =>\n m.props({ type: types[key][0], maxLength: types[key][1] })\n )\n return maker\n }, maker)\n\n maker.frameInput = maker.frameInputs\n maker.frameFile = maker.frameFiles\n maker.frameImage = maker.frameImages\n}\n\nfunction useSlider(maker) {\n maker['sliderRange'] = creatorFactory('slider', { range: true })\n}\n\nfunction useSelect(m) {\n const name = 'select'\n m.selectMultiple = creatorFactory(name, { mode: 'multiple' })\n m.selectTags = creatorFactory(name, { mode: 'tags' })\n m.selectCombobox = creatorFactory(name, { mode: 'combobox' })\n}\n\nfunction useUpload(maker) {\n const types = {\n image: ['image', 0],\n file: ['file', 0],\n uploadFileOne: ['file', 1],\n uploadImageOne: ['image', 1]\n }\n\n Object.keys(types).reduce((maker, key) => {\n maker[key] = creatorFactory('upload', (m) =>\n m.props({\n uploadType: types[key][0],\n maxLength: types[key][1]\n })\n )\n return maker\n }, maker)\n\n maker.uploadImage = maker.image\n maker.uploadFile = maker.file\n}\n\nfunction useCusStoreSelect(maker) {\n maker.cusStoreSelect = creatorFactory('cusStoreSelect')\n maker.storeSelect = maker.cusStoreSelect\n}\n\nfunction useCusUserSelect(maker) {\n maker.cusUserSelect = creatorFactory('cusUserSelect')\n maker.userSelect = maker.cusUserSelect\n}\n\nuseAlias(maker)\nuseSlider(maker)\nuseFrame(maker)\nuseUpload(maker)\nuseSelect(maker)\nuseCusStoreSelect(maker)\nuseCusUserSelect(maker)\n\nexport default maker\n","import extend from '@form-create/utils/lib/extend'\nimport is from '@form-create/utils/lib/type'\nimport { invoke } from '@longhongguo/form-create-core/src/frame/util'\nimport toArray from '@form-create/utils/lib/toarray'\n\nfunction tidyBtnProp(btn, def) {\n if (is.Boolean(btn)) btn = { show: btn }\n else if (!is.Undef(btn) && !is.Object(btn)) btn = { show: def }\n return btn\n}\n\nexport default function extendApi(api, h) {\n return {\n formEl() {\n return h.$manager.form()\n },\n wrapEl(id) {\n const ctx = h.getFieldCtx(id)\n if (!ctx) return\n return h.vm.refs[ctx.wrapRef]\n },\n validate(callback) {\n return new Promise((resolve, reject) => {\n const forms = api.children\n const all = [h.$manager.validate()]\n forms\n .filter((v) => !v.isScope)\n .forEach((v) => {\n all.push(v.validate())\n })\n Promise.all(all)\n .then(() => {\n resolve(true)\n callback && callback(true)\n })\n .catch((e) => {\n reject(e)\n callback && callback(e)\n h.vm.emit('validate-fail', e, { api })\n h.emitEvent('validate-fail', e, { api })\n })\n })\n },\n validateField(field, callback) {\n return new Promise((resolve, reject) => {\n const ctx = h.getFieldCtx(field)\n if (!ctx) return\n const sub = h.subForm[ctx.id]\n const all = [h.$manager.validateField(ctx.id)]\n toArray(sub)\n .filter((v) => !v.isScope)\n .forEach((v) => {\n all.push(v.validate())\n })\n Promise.all(all)\n .then(() => {\n resolve(null)\n callback && callback(null)\n })\n .catch((e) => {\n reject(e)\n callback && callback(e)\n h.vm.emit('validate-field-fail', e, { field, api })\n })\n })\n },\n clearValidateState(fields, clearSub = true) {\n api.helper.tidyFields(fields).forEach((field) => {\n if (clearSub) this.clearSubValidateState(field)\n h.getCtxs(field).forEach((ctx) => {\n h.$manager.clearValidateState(ctx)\n })\n })\n },\n clearSubValidateState(fields) {\n api.helper.tidyFields(fields).forEach((field) => {\n h.getCtxs(field).forEach((ctx) => {\n const subForm = h.subForm[ctx.id]\n if (!subForm) return\n if (Array.isArray(subForm)) {\n subForm.forEach((form) => {\n form.clearValidateState()\n })\n } else if (subForm) {\n subForm.clearValidateState()\n }\n })\n })\n },\n btn: {\n loading: (loading = true) => {\n api.submitBtnProps({ loading: !!loading })\n },\n disabled: (disabled = true) => {\n api.submitBtnProps({ disabled: !!disabled })\n },\n show: (isShow = true) => {\n api.submitBtnProps({ show: !!isShow })\n }\n },\n resetBtn: {\n loading: (loading = true) => {\n api.resetBtnProps({ loading: !!loading })\n },\n disabled: (disabled = true) => {\n api.resetBtnProps({ disabled: !!disabled })\n },\n show: (isShow = true) => {\n api.resetBtnProps({ show: !!isShow })\n }\n },\n submitBtnProps: (props = {}) => {\n let btn = tidyBtnProp(h.options.submitBtn, true)\n extend(btn, props)\n h.options.submitBtn = btn\n api.refreshOptions()\n },\n resetBtnProps: (props = {}) => {\n let btn = tidyBtnProp(h.options.resetBtn, false)\n extend(btn, props)\n h.options.resetBtn = btn\n api.refreshOptions()\n },\n submit(successFn, failFn) {\n return new Promise((resolve, reject) => {\n const promise =\n h.options.validateOnSubmit === false\n ? Promise.resolve()\n : api.validate()\n promise\n .then(() => {\n let formData = api.formData()\n h.beforeSubmit(formData)\n .then(() => {\n is.Function(successFn) && invoke(() => successFn(formData, api))\n is.Function(h.options.onSubmit) &&\n invoke(() => h.options.onSubmit(formData, api))\n h.vm.emit('submit', formData, api)\n resolve(formData)\n })\n .catch((e) => {})\n })\n .catch((...args) => {\n is.Function(failFn) && invoke(() => failFn(api, ...args))\n reject(...args)\n })\n })\n },\n /**\n * 封装请求工具,用于自定义校验规则等场景\n * 基于 frame/fetch.js 封装的 fetch 方法\n *\n * @param {string|object} config - 请求配置,可以是 URL 字符串或配置对象\n * @param {string} config.action - 请求地址(必需)\n * @param {string} config.method - 请求方法,默认 'get'\n * @param {object} config.data - 请求数据(POST/PUT等),用于表单或JSON格式\n * @param {object} config.query - 查询参数(GET请求)\n * @param {string} config.dataType - 数据类型:'json' 表示 JSON 格式(默认),其他值表示表单格式(FormData)\n * @param {object} config.headers - 请求头\n * @param {function|string} config.parse - 数据解析函数或路径字符串\n * @returns {Promise} 返回 Promise,resolve 时返回解析后的数据\n *\n * @example\n * // JSON 格式 POST 请求(默认)\n * await this.api.request({\n * action: '/api/check-username',\n * method: 'post',\n * data: { username: 'test' },\n * dataType: 'json' // 或不设置,默认 JSON\n * });\n *\n * @example\n * // 表单格式 POST 请求\n * await this.api.request({\n * action: '/api/check-username',\n * method: 'post',\n * data: { username: 'test' },\n * dataType: 'form' // 或任意非 'json' 的值,会使用 FormData\n * });\n *\n * @example\n * // 在自定义校验规则中使用\n * validator: async function(value, callback) {\n * try {\n * const result = await this.api.request({\n * action: '/api/check-username',\n * method: 'post',\n * data: { username: value }, // 使用 data,不是 params\n * dataType: 'form' // 表单形式\n * });\n * if (result.exists) {\n * callback('用户名已存在');\n * } else {\n * callback();\n * }\n * } catch (error) {\n * callback('校验失败,请稍后重试');\n * }\n * }\n */\n request(config) {\n // 如果传入的是字符串,转换为配置对象\n if (typeof config === 'string') {\n config = { action: config }\n }\n // 使用 api.fetch 方法,它内部使用 frame/fetch.js 封装的 asyncFetch\n return api.fetch(config)\n },\n // 节流,在指定时间间隔内,如果多次触发,只执行一次\n throttle(fn, delay) {\n let lastTime = 0\n return function (...args) {\n const context = this\n const now = Date.now()\n if (now - lastTime >= (delay || 0)) {\n lastTime = now\n fn.call(context, ...args)\n }\n }\n },\n // 防抖,在指定时间间隔内,如果多次触发,只执行最后一次\n debounce(fn, delay) {\n let timer = null\n return function (...args) {\n const context = this\n if (timer !== null) {\n clearTimeout(timer)\n }\n timer = setTimeout(() => {\n fn.call(context, ...args)\n }, delay || 0)\n }\n }\n }\n}\n","export default {\n autoComplete: 'value',\n cascader: 'value',\n inputNumber: 'value',\n inputPassword: 'value',\n textarea: 'value',\n rate: 'value',\n slider: 'value',\n treeSelect: 'value',\n switch: 'checked',\n cusStoreSelect: 'modelValue',\n cusUserSelect: 'modelValue'\n}\n","import is from '@form-create/utils/lib/type';\n\nconst required = {\n name: 'required',\n load(inject, rule, api) {\n const val = parseVal(inject.getValue());\n if (val.required === false) {\n inject.clearProp();\n api.clearValidateState([rule.field]);\n } else {\n const validate = {\n required: true,\n validator(_, v) {\n return new Promise((resolve, reject) => {\n is.empty(v) ? reject(validate.message) : resolve();\n })\n },\n ...val,\n };\n const title = rule.__fc__.refRule?.__$title?.value;\n if (!validate.message) {\n validate.message = api.t('required', {title}) || (title + (api.getLocale() === 'en' ? ' is required' : '不能为空'));\n } else {\n const match = validate.message.match(/^\\{\\{\\s*\\$t\\.(.+)\\s*\\}\\}$/);\n if (match) {\n validate.message = api.t(match[1], {title});\n }\n }\n inject.getProp().validate = [validate];\n }\n api.sync(rule);\n },\n watch(...args) {\n required.load(...args);\n }\n}\n\nfunction parseVal(val) {\n if (is.Boolean(val)) {\n return {required: val}\n } else if (is.String(val)) {\n return {message: val};\n } else if (is.Undef(val)) {\n return {required: false};\n } else if (is.Function(val)) {\n return {validator: val};\n } else if (!is.Object(val)) {\n return {};\n } else {\n return val;\n }\n}\n\n\nexport default required\n","import components from '../components'\nimport parsers from '../parsers'\nimport alias from './alias'\nimport manager from './manager'\nimport FormCreateFactory from '@longhongguo/form-create-core/src/index'\nimport makers from './maker'\nimport '../style/index.css'\nimport extendApi from './api'\nimport modelFields from './modelFields'\nimport required from './provider'\n\nfunction install(FormCreate) {\n FormCreate.componentAlias(alias)\n\n Object.keys(modelFields).forEach((k) => {\n FormCreate.setModelField(k, modelFields[k])\n })\n\n components.forEach((component) => {\n FormCreate.component(component.name, component)\n })\n\n FormCreate.register(required)\n\n parsers.forEach((parser) => {\n FormCreate.parser(parser)\n })\n\n Object.keys(makers).forEach((name) => {\n FormCreate.maker[name] = makers[name]\n })\n\n if (typeof window !== 'undefined' && window.antd) {\n FormCreate.useApp((_, app) => {\n app.use(window.antd)\n })\n }\n}\n\nexport default function antdvFormCreate() {\n return FormCreateFactory({\n ui: 'process.env.UI',\n version: 'process.env.VERSION',\n manager,\n install,\n extendApi,\n attrs: {\n normal: ['col', 'wrap'],\n array: ['className'],\n key: ['title', 'info']\n }\n })\n}\n","import antdvFormCreate from './core/index';\n\nconst FormCreate = antdvFormCreate();\n\nif (typeof window !== 'undefined') {\n window.formCreate = FormCreate;\n}\n\nconst maker = FormCreate.maker;\n\nexport {maker}\n\nexport default FormCreate;\n"],"names":["script$3","name","_hoisted_1","class","_openBlock","_createElementBlock","_cache","_createElementVNode","height","width","xmlns","viewBox","d","fill","script$2","defineComponent","props","modelValue","type","Array","default","options","multiple","Boolean","maxTagCount","Number","undefined","placeholder","String","disabled","style","Object","valueKey","labelKey","allowClear","bordered","emits","computed","currentValue","get","isArray","this","map","item","value","[object Object]","getLabel","label","set","val","arrayValue","$emit","hasValue","length","displayValue","displayLabel","allSelectedItems","displayItems","items","slice","remainingCount","total","Math","max","showClear","methods","findOptionByValue","find","opt","optValue","option","removeItem","itemValue","event","stopPropagation","newValue","filter","clearValue","_hoisted_6","_hoisted_8","opacity","_hoisted_11","_hoisted_12","_createCommentVNode","_ctx","_Fragment","key","tabindex","_renderList","index","title","_toDisplayString","onClick","$event","role","aria-label","focusable","data-icon","aria-hidden","fill-rule","_hoisted_10","_hoisted_13","args","_hoisted_14","_hoisted_3","_hoisted_4","script$1","components","CusSelect","formCreateInject","field","data","messageId","pendingCallbacks","internalOptions","mergedOptions","optionMap","Map","forEach","from","values","watch","immediate","handler","newOptions","mounted","window","addEventListener","handleMessage","beforeUnmount","removeEventListener","serializeForPostMessage","JSON","parse","stringify","error","console","warn","result","prototype","hasOwnProperty","call","e","handleClick","msgId","Date","now","currentArrayValue","valueToSend","serializedCurrentValue","message","parent","postMessage","sourceItems","mergeOptions","handleUpdate","handleChange","callback","newItems","triggerValidate","$nextTick","api","validateField","catch","$parent","$options","fapi","_createVNode","_component_CusSelect","model-value","max-tag-count","onUpdate:modelValue","onChange","script","selectType","upload","frame","group","subForm","QuestionCircleOutlined","CusStoreSelect","CusUserSelect","checkbox","modelField","mergeProp","ctx","prop","hasProperty","radio","select","fetchData","effectData","loading","render","children","newChildren","notFoundContent","$render","defaultRender","cascader","FORMAT_TYPE","date","month","week","quarter","year","datePicker","maker","reduce","initial","creatorFactory","dateRange","datetimeRange","m","showTime","picker","valueFormat","vNode","range","hidden","input","idate","indexOf","textarea","search","password","make","timePicker","tree","fieldNames","checkedKeys","rule","checkable","row","_","col","span","parsers","toFormValue","toValue","formValue","vnode","on","originalUpdateModelValue","nextTick","fieldName","$handle","fieldCtx","getFieldCtx","id","$manager","originalChange","inject","alias","tooltip","PRE","popover","button","icon","slider","rate","timeRangePicker","rangePicker","switch","inputNumber","treeSelect","inputPassword","formItem","form","autoComplete","transfer","array","object","tidy","is","show","isFalse","tidyRule","_rule","manager","validate","Promise","v","validateFields","clearValidateState","fItem","vm","refs","wrapRef","clearValidate","tidyOptions","tidyBool","def","info","placement","wrap","mergeProps","onPreview","originalOnPreview","sendPreviewMessage","file","url","uid","size","timestamp","apply","arguments","getDefaultOptions","hideRequiredMark","layout","labelAlign","labelCol","wrapperCol","validateOnRuleChange","gutter","submitBtn","innerText","click","resetBtn","adapterValidate","validator","resolve","reject","err","update","submit","preventDefault","beforeRender","ref","extend","className","preview","model","formData","slotLen","setSlot","makeFormBtn","$r","getSlots","makeRow","makeWrap","uni","isTitle","_col","cls","hasFeedback","rules","injectValidate","mergeClass","makeInfo","makeCol","native","_ctx$refRule","_ctx$refRule2","titleProp","infoProp","isTip","titleSlot","getSlot","refRule","__$title","align","_ctx$refRule3","__$info","slot","_prop","vn","push","makeSubmitBtn","makeResetBtn","colon","t","marginLeft","fApi","resetFields","tidyBtnProp","btn","Undef","extendApi","h","formEl","wrapEl","forms","all","isScope","then","emit","emitEvent","sub","toArray","fields","clearSub","helper","tidyFields","clearSubValidateState","getCtxs","submitBtnProps","isShow","resetBtnProps","refreshOptions","successFn","failFn","validateOnSubmit","beforeSubmit","Function","invoke","onSubmit","request","config","action","fetch","throttle","fn","delay","lastTime","context","debounce","timer","clearTimeout","setTimeout","auto","number","time","useAlias","useSlider","types","frameInputs","frameFiles","frameImages","frameInputOne","frameFileOne","frameImageOne","keys","maxLength","frameInput","frameFile","frameImage","useFrame","image","uploadFileOne","uploadImageOne","uploadType","uploadImage","uploadFile","useUpload","selectMultiple","mode","selectTags","selectCombobox","cusStoreSelect","storeSelect","useCusStoreSelect","cusUserSelect","userSelect","useCusUserSelect","modelFields","required","load","parseVal","getValue","clearProp","_rule$__fc__$refRule","empty","__fc__","match","getLocale","getProp","sync","install","FormCreate","componentAlias","k","setModelField","component","register","parser","makers","antd","useApp","app","use","FormCreateFactory","ui","version","attrs","normal","formCreate"],"mappings":"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"}