@longhongguo/form-create-ant-design-vue 3.2.65 → 3.2.66

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.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=228f8426&lang.js","../src/components/CusStoreSelect/index.vue","../src/components/CusStoreSelect/index.vue?vue&type=template&id=00ba930b&lang.js","../src/components/CusUserSelect/index.vue","../src/components/CusUserSelect/index.vue?vue&type=template&id=54621955&lang.js","../src/components/tableForm/TableForm.vue","../src/components/tableForm/TableForm.vue?vue&type=template&id=7d8ce230&lang.js","../src/components/tableForm/TableFormView.vue","../src/components/tableForm/TableFormView.vue?vue&type=template&id=13cd901b&lang.js","../src/components/tableForm/TableFormColumnView.vue","../src/components/tableForm/TableFormColumnView.vue?vue&type=template&id=4a2dbc30&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/text.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/parsers/flex.js","../src/parsers/space.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 sourceItems: {\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', 'update:sourceItems', '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 const sourceItems = this.sourceItems.filter((item) => {\r\n return !newValue.some((newItem) => {\r\n return newItem[this.valueKey] === item[this.valueKey]\r\n })\r\n })\r\n this.$emit('update:sourceItems', sourceItems)\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 const sourceItems = this.sourceItems.filter((item) => {\r\n return !this.currentValue.some((newItem) => {\r\n return newItem[this.valueKey] === item[this.valueKey]\r\n })\r\n })\r\n this.$emit('update:sourceItems', sourceItems)\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 sourceItems: {\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', 'update:sourceItems', '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 const sourceItems = this.sourceItems.filter((item) => {\r\n return !newValue.some((newItem) => {\r\n return newItem[this.valueKey] === item[this.valueKey]\r\n })\r\n })\r\n this.$emit('update:sourceItems', sourceItems)\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 const sourceItems = this.sourceItems.filter((item) => {\r\n return !this.currentValue.some((newItem) => {\r\n return newItem[this.valueKey] === item[this.valueKey]\r\n })\r\n })\r\n this.$emit('update:sourceItems', sourceItems)\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 v-model:source-items=\"sourceItems\"\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 extraQuery: {\n type: Object,\n default: () => ({})\n },\n extraQueryFn: {\n type: Function,\n default: () => {}\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n // 消息ID计数器,用于标识每次请求\n messageId: 0,\n // 存储待处理的回调函数\n pendingCallbacks: {},\n // 内部维护的选项列表(合并父窗口返回的源对象)\n internalOptions: [],\n sourceItems: []\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 extraQuery = {\n ...this.extraQuery\n }\n if (this.extraQueryFn) {\n Object.assign(extraQuery, this.extraQueryFn())\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 extraQuery,\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.sourceItems = sourceItems\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.sourceItems && this.sourceItems.length > 0\n ? this.multiple\n ? this.sourceItems\n : this.sourceItems[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 v-model:source-items=\"sourceItems\"\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 extraQuery: {\n type: Object,\n default: () => ({})\n },\n extraQueryFn: {\n type: Function,\n default: () => {}\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n // 消息ID计数器,用于标识每次请求\n messageId: 0,\n // 存储待处理的回调函数\n pendingCallbacks: {},\n // 内部维护的选项列表(合并父窗口返回的源对象)\n internalOptions: [],\n sourceItems: []\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 extraQuery = {\n ...this.extraQuery\n }\n if (this.extraQueryFn) {\n Object.assign(extraQuery, this.extraQueryFn())\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 extraQuery,\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.sourceItems = sourceItems\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.sourceItems && this.sourceItems.length > 0\n ? this.multiple\n ? this.sourceItems\n : this.sourceItems[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 v-model:source-items=\"sourceItems\"\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 extraQuery: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n extraQueryFn: {\r\n type: Function,\r\n default: () => {}\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 sourceItems: []\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 extraQuery = {\r\n ...this.extraQuery\r\n }\r\n if (this.extraQueryFn) {\r\n Object.assign(extraQuery, this.extraQueryFn())\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 extraQuery,\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.sourceItems = sourceItems\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.sourceItems && this.sourceItems.length > 0\r\n ? this.multiple\r\n ? this.sourceItems\r\n : this.sourceItems[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 v-model:source-items=\"sourceItems\"\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 extraQuery: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n extraQueryFn: {\r\n type: Function,\r\n default: () => {}\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 sourceItems: []\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 extraQuery = {\r\n ...this.extraQuery\r\n }\r\n if (this.extraQueryFn) {\r\n Object.assign(extraQuery, this.extraQueryFn())\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 extraQuery,\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.sourceItems = sourceItems\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.sourceItems && this.sourceItems.length > 0\r\n ? this.multiple\r\n ? this.sourceItems\r\n : this.sourceItems[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>\n <div class=\"_fc-table-form\" :class=\"{ '_fc-disabled': disabled }\">\n <component\n :is=\"Form\"\n :option=\"options\"\n :rule=\"rule\"\n :extendOption=\"true\"\n :disabled=\"disabled\"\n @change=\"formChange\"\n v-model:api=\"fapi\"\n @emit-event=\"$emit\"\n ></component>\n <a-button\n type=\"link\"\n class=\"fc-clock\"\n v-if=\"addable && (!max || max > this.trs.length)\"\n @click=\"addRaw(true)\"\n :disabled=\"disabled\"\n ><i class=\"fc-icon icon-add-circle\" style=\"font-weight: 700\"></i>\n {{ formCreateInject.t('add') || '添加' }}\n </a-button>\n </div>\n</template>\n\n<script>\nimport { markRaw, reactive } from 'vue'\n\nexport default {\n name: 'TableForm',\n emits: ['change', 'add', 'delete', 'update:modelValue'],\n props: {\n formCreateInject: Object,\n modelValue: {\n type: Array,\n default: () => []\n },\n columns: {\n type: Array,\n required: true,\n default: () => []\n },\n filterEmptyColumn: {\n type: Boolean,\n default: true\n },\n deletable: {\n type: Boolean,\n default: true\n },\n addable: {\n type: Boolean,\n default: true\n },\n options: {\n type: Object,\n default: () =>\n reactive({\n submitBtn: false,\n resetBtn: false\n })\n },\n min: Number,\n max: Number,\n disabled: Boolean\n },\n watch: {\n modelValue: {\n handler() {\n this.updateTable()\n },\n deep: true\n },\n 'formCreateInject.preview': function (n) {\n this.emptyRule.children[0].props.colspan =\n this.columns.length + (n ? 1 : 2)\n }\n },\n data() {\n return {\n rule: [],\n trs: [],\n fapi: {},\n Form: markRaw(this.formCreateInject.form.$form()),\n copyTrs: '',\n oldValue: '',\n emptyRule: {\n type: 'tr',\n _isEmpty: true,\n native: true,\n subRule: true,\n children: [\n {\n type: 'td',\n style: {\n textAlign: 'center'\n },\n native: true,\n subRule: true,\n props: {\n colspan:\n this.columns.length + (this.formCreateInject.preview ? 1 : 2)\n },\n children: [this.formCreateInject.t('dataEmpty') || '暂无数据']\n }\n ]\n }\n }\n },\n methods: {\n formChange() {\n this.updateValue()\n },\n updateValue() {\n const value = this.trs\n .map((tr, idx) => {\n return {\n ...(this.modelValue[idx] || {}),\n ...this.fapi.getChildrenFormData(tr)\n }\n })\n .filter((v) => {\n if (!this.filterEmptyColumn) {\n return true\n }\n if (v === undefined || v === null) {\n return false\n }\n let flag = false\n Object.keys(v).forEach((k) => {\n flag = flag || (v[k] !== undefined && v[k] !== '' && v[k] !== null)\n })\n return flag\n })\n const str = JSON.stringify(value)\n if (str !== this.oldValue) {\n this.oldValue = str\n this.$emit('update:modelValue', value)\n this.$emit('change', value)\n }\n },\n setRawData(idx, formData) {\n const raw = this.trs[idx]\n this.fapi.setChildrenFormData(raw, formData, true)\n },\n updateTable() {\n const str = JSON.stringify(this.modelValue)\n if (this.oldValue === str) {\n return\n }\n this.oldValue = str\n this.trs = this.trs.splice(0, this.modelValue.length)\n if (!this.modelValue.length) {\n this.addEmpty()\n } else {\n this.clearEmpty()\n }\n this.modelValue.forEach((data, idx) => {\n if (!this.trs[idx]) {\n this.addRaw()\n }\n this.setRawData(idx, data || {})\n })\n this.rule[0].children[1].children = this.trs\n },\n addEmpty() {\n if (this.trs.length) {\n this.trs.splice(0, this.trs.length)\n }\n this.trs.push(this.emptyRule)\n },\n clearEmpty() {\n if (this.trs[0] && this.trs[0]._isEmpty) {\n this.trs.splice(0, 1)\n }\n },\n delRaw(idx) {\n if (\n this.disabled ||\n !this.deletable ||\n (this.min > 0 && this.trs.length <= this.min)\n ) {\n return\n }\n this.trs.splice(idx, 1)\n this.updateValue()\n if (this.trs.length) {\n this.trs.forEach((tr) => this.updateRaw(tr))\n } else {\n this.addEmpty()\n }\n this.$emit('delete', idx)\n },\n addRaw(flag) {\n if (flag && this.disabled) {\n return\n }\n const tr = this.formCreateInject.form.parseJson(this.copyTrs)[0]\n if (this.trs.length === 1 && this.trs[0]._isEmpty) {\n this.trs.splice(0, 1)\n }\n this.trs.push(tr)\n this.updateRaw(tr)\n if (flag) {\n this.$emit('add', this.trs.length)\n this.updateValue()\n }\n },\n updateRaw(tr) {\n const idx = this.trs.indexOf(tr)\n tr.children[0].props.innerText = idx + 1\n tr.children[tr.children.length - 1].children[0].props.onClick = () => {\n this.delRaw(idx)\n }\n },\n loadRule() {\n const header = [\n {\n type: 'th',\n native: true,\n class: '_fc-tf-head-idx',\n props: {\n innerText: '#'\n }\n }\n ]\n let body = [\n {\n type: 'td',\n class: '_fc-tf-idx',\n native: true,\n props: {\n innerText: '0'\n }\n }\n ]\n this.columns.forEach((column) => {\n header.push({\n type: 'th',\n native: true,\n style: {\n ...(column.style || {}),\n textAlign: column.align || 'center'\n },\n class: column.required ? '_fc-tf-head-required' : '',\n props: {\n innerText: column.label || ''\n }\n })\n body.push({\n type: 'td',\n native: true,\n children: [...(column.rule || [])]\n })\n })\n header.push({\n type: 'th',\n native: true,\n class: '_fc-tf-edit fc-clock',\n props: {\n innerText: this.formCreateInject.t('operation') || '操作'\n }\n })\n body.push({\n type: 'td',\n native: true,\n class: '_fc-tf-btn fc-clock',\n children: [\n {\n type: 'i',\n native: true,\n class: 'fc-icon icon-delete',\n props: {}\n }\n ]\n })\n this.copyTrs = this.formCreateInject.form.toJson([\n {\n type: 'tr',\n native: true,\n subRule: true,\n children: body\n }\n ])\n this.rule = [\n {\n type: 'table',\n native: true,\n class: '_fc-tf-table',\n props: {\n border: '1',\n cellspacing: '0',\n cellpadding: '0'\n },\n children: [\n {\n type: 'thead',\n native: true,\n children: [\n {\n type: 'tr',\n native: true,\n children: header\n }\n ]\n },\n {\n type: 'tbody',\n native: true,\n children: this.trs\n }\n ]\n }\n ]\n }\n },\n created() {\n this.loadRule()\n },\n mounted() {\n this.updateTable()\n }\n}\n</script>\n","<template>\n <div class=\"_fc-table-form\" :class=\"{ '_fc-disabled': disabled }\">\n <component\n :is=\"Form\"\n :option=\"options\"\n :rule=\"rule\"\n :extendOption=\"true\"\n :disabled=\"disabled\"\n @change=\"formChange\"\n v-model:api=\"fapi\"\n @emit-event=\"$emit\"\n ></component>\n <a-button\n type=\"link\"\n class=\"fc-clock\"\n v-if=\"addable && (!max || max > this.trs.length)\"\n @click=\"addRaw(true)\"\n :disabled=\"disabled\"\n ><i class=\"fc-icon icon-add-circle\" style=\"font-weight: 700\"></i>\n {{ formCreateInject.t('add') || '添加' }}\n </a-button>\n </div>\n</template>\n\n<script>\nimport { markRaw, reactive } from 'vue'\n\nexport default {\n name: 'TableForm',\n emits: ['change', 'add', 'delete', 'update:modelValue'],\n props: {\n formCreateInject: Object,\n modelValue: {\n type: Array,\n default: () => []\n },\n columns: {\n type: Array,\n required: true,\n default: () => []\n },\n filterEmptyColumn: {\n type: Boolean,\n default: true\n },\n deletable: {\n type: Boolean,\n default: true\n },\n addable: {\n type: Boolean,\n default: true\n },\n options: {\n type: Object,\n default: () =>\n reactive({\n submitBtn: false,\n resetBtn: false\n })\n },\n min: Number,\n max: Number,\n disabled: Boolean\n },\n watch: {\n modelValue: {\n handler() {\n this.updateTable()\n },\n deep: true\n },\n 'formCreateInject.preview': function (n) {\n this.emptyRule.children[0].props.colspan =\n this.columns.length + (n ? 1 : 2)\n }\n },\n data() {\n return {\n rule: [],\n trs: [],\n fapi: {},\n Form: markRaw(this.formCreateInject.form.$form()),\n copyTrs: '',\n oldValue: '',\n emptyRule: {\n type: 'tr',\n _isEmpty: true,\n native: true,\n subRule: true,\n children: [\n {\n type: 'td',\n style: {\n textAlign: 'center'\n },\n native: true,\n subRule: true,\n props: {\n colspan:\n this.columns.length + (this.formCreateInject.preview ? 1 : 2)\n },\n children: [this.formCreateInject.t('dataEmpty') || '暂无数据']\n }\n ]\n }\n }\n },\n methods: {\n formChange() {\n this.updateValue()\n },\n updateValue() {\n const value = this.trs\n .map((tr, idx) => {\n return {\n ...(this.modelValue[idx] || {}),\n ...this.fapi.getChildrenFormData(tr)\n }\n })\n .filter((v) => {\n if (!this.filterEmptyColumn) {\n return true\n }\n if (v === undefined || v === null) {\n return false\n }\n let flag = false\n Object.keys(v).forEach((k) => {\n flag = flag || (v[k] !== undefined && v[k] !== '' && v[k] !== null)\n })\n return flag\n })\n const str = JSON.stringify(value)\n if (str !== this.oldValue) {\n this.oldValue = str\n this.$emit('update:modelValue', value)\n this.$emit('change', value)\n }\n },\n setRawData(idx, formData) {\n const raw = this.trs[idx]\n this.fapi.setChildrenFormData(raw, formData, true)\n },\n updateTable() {\n const str = JSON.stringify(this.modelValue)\n if (this.oldValue === str) {\n return\n }\n this.oldValue = str\n this.trs = this.trs.splice(0, this.modelValue.length)\n if (!this.modelValue.length) {\n this.addEmpty()\n } else {\n this.clearEmpty()\n }\n this.modelValue.forEach((data, idx) => {\n if (!this.trs[idx]) {\n this.addRaw()\n }\n this.setRawData(idx, data || {})\n })\n this.rule[0].children[1].children = this.trs\n },\n addEmpty() {\n if (this.trs.length) {\n this.trs.splice(0, this.trs.length)\n }\n this.trs.push(this.emptyRule)\n },\n clearEmpty() {\n if (this.trs[0] && this.trs[0]._isEmpty) {\n this.trs.splice(0, 1)\n }\n },\n delRaw(idx) {\n if (\n this.disabled ||\n !this.deletable ||\n (this.min > 0 && this.trs.length <= this.min)\n ) {\n return\n }\n this.trs.splice(idx, 1)\n this.updateValue()\n if (this.trs.length) {\n this.trs.forEach((tr) => this.updateRaw(tr))\n } else {\n this.addEmpty()\n }\n this.$emit('delete', idx)\n },\n addRaw(flag) {\n if (flag && this.disabled) {\n return\n }\n const tr = this.formCreateInject.form.parseJson(this.copyTrs)[0]\n if (this.trs.length === 1 && this.trs[0]._isEmpty) {\n this.trs.splice(0, 1)\n }\n this.trs.push(tr)\n this.updateRaw(tr)\n if (flag) {\n this.$emit('add', this.trs.length)\n this.updateValue()\n }\n },\n updateRaw(tr) {\n const idx = this.trs.indexOf(tr)\n tr.children[0].props.innerText = idx + 1\n tr.children[tr.children.length - 1].children[0].props.onClick = () => {\n this.delRaw(idx)\n }\n },\n loadRule() {\n const header = [\n {\n type: 'th',\n native: true,\n class: '_fc-tf-head-idx',\n props: {\n innerText: '#'\n }\n }\n ]\n let body = [\n {\n type: 'td',\n class: '_fc-tf-idx',\n native: true,\n props: {\n innerText: '0'\n }\n }\n ]\n this.columns.forEach((column) => {\n header.push({\n type: 'th',\n native: true,\n style: {\n ...(column.style || {}),\n textAlign: column.align || 'center'\n },\n class: column.required ? '_fc-tf-head-required' : '',\n props: {\n innerText: column.label || ''\n }\n })\n body.push({\n type: 'td',\n native: true,\n children: [...(column.rule || [])]\n })\n })\n header.push({\n type: 'th',\n native: true,\n class: '_fc-tf-edit fc-clock',\n props: {\n innerText: this.formCreateInject.t('operation') || '操作'\n }\n })\n body.push({\n type: 'td',\n native: true,\n class: '_fc-tf-btn fc-clock',\n children: [\n {\n type: 'i',\n native: true,\n class: 'fc-icon icon-delete',\n props: {}\n }\n ]\n })\n this.copyTrs = this.formCreateInject.form.toJson([\n {\n type: 'tr',\n native: true,\n subRule: true,\n children: body\n }\n ])\n this.rule = [\n {\n type: 'table',\n native: true,\n class: '_fc-tf-table',\n props: {\n border: '1',\n cellspacing: '0',\n cellpadding: '0'\n },\n children: [\n {\n type: 'thead',\n native: true,\n children: [\n {\n type: 'tr',\n native: true,\n children: header\n }\n ]\n },\n {\n type: 'tbody',\n native: true,\n children: this.trs\n }\n ]\n }\n ]\n }\n },\n created() {\n this.loadRule()\n },\n mounted() {\n this.updateTable()\n }\n}\n</script>\n","<template>\n <div class=\"_fd-table-form\">\n <div class=\"_fd-tf-wrap\" v-if=\"$slots.default\">\n <slot></slot>\n </div>\n <div class=\"_fc-child-empty\" v-else></div>\n </div>\n</template>\n\n<script>\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n name: 'TableFormView',\n data() {\n return {}\n }\n})\n</script>\n","<template>\n <div class=\"_fd-table-form\">\n <div class=\"_fd-tf-wrap\" v-if=\"$slots.default\">\n <slot></slot>\n </div>\n <div class=\"_fc-child-empty\" v-else></div>\n </div>\n</template>\n\n<script>\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n name: 'TableFormView',\n data() {\n return {}\n }\n})\n</script>\n","<template>\n <div class=\"_fd-tf-col\" :style=\"colStyle\">\n <div class=\"_fd-tf-title\" :style=\"{ textAlign: align || 'center' }\">\n <span v-if=\"required\" class=\"_fd-tf-required\">*</span>{{ label || '' }}\n </div>\n <div class=\"_fd-tf-con\">\n <slot></slot>\n </div>\n </div>\n</template>\n\n<script>\nimport is from '@form-create/utils/lib/type'\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n name: 'TableFormColumnView',\n props: {\n label: String,\n align: String,\n width: [Number, String],\n color: String,\n required: Boolean\n },\n computed: {\n colStyle() {\n const w = this.width\n const style = {\n width: is.Number(w) ? `${w}px` : !w || w === 'auto' ? '180px' : w\n }\n if (this.color) {\n style.color = this.color\n }\n return style\n }\n },\n data() {\n return {}\n }\n})\n</script>\n","<template>\n <div class=\"_fd-tf-col\" :style=\"colStyle\">\n <div class=\"_fd-tf-title\" :style=\"{ textAlign: align || 'center' }\">\n <span v-if=\"required\" class=\"_fd-tf-required\">*</span>{{ label || '' }}\n </div>\n <div class=\"_fd-tf-con\">\n <slot></slot>\n </div>\n </div>\n</template>\n\n<script>\nimport is from '@form-create/utils/lib/type'\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n name: 'TableFormColumnView',\n props: {\n label: String,\n align: String,\n width: [Number, String],\n color: String,\n required: Boolean\n },\n computed: {\n colStyle() {\n const w = this.width\n const style = {\n width: is.Number(w) ? `${w}px` : !w || w === 'auto' ? '180px' : w\n }\n if (this.color) {\n style.color = this.color\n }\n return style\n }\n },\n data() {\n return {}\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'\nimport CusUserSelect from './CusUserSelect/index.vue'\nimport TableForm from './tableForm/TableForm.vue'\nimport TableFormView from './tableForm/TableFormView.vue'\nimport TableFormColumnView from './tableForm/TableFormColumnView.vue'\n\nexport default [\n upload,\n frame,\n group,\n subForm,\n QuestionCircleOutlined,\n CusSelect,\n CusStoreSelect,\n CusUserSelect,\n TableForm,\n TableFormView,\n TableFormColumnView\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 is from '@form-create/utils/lib/type'\r\nimport { watch, toRef } from 'vue'\r\n\r\nexport default {\r\n name: 'text',\r\n // 设置 loadChildren 为 false,避免 children 被当作子组件处理\r\n // text 的 children 只是简单的文本内容,不需要作为子组件加载\r\n loadChildren: false,\r\n // 组件挂载后,手动触发一次 loadData 更新,确保表单数据准备好后再获取初始值\r\n mounted(ctx) {\r\n // 如果是动态绑定的 Text 组件,在挂载后手动解析模板并更新值\r\n const props = ctx.rule.props || {}\r\n const bindField =\r\n ctx.rule.bindField || props.bindField || ctx.prop.props?.bindField\r\n const template =\r\n ctx.rule.template || props.template || ctx.prop.props?.template\r\n\r\n if (template || bindField) {\r\n // 延迟执行,确保表单数据已经准备好\r\n setTimeout(() => {\r\n if (ctx.$handle && ctx.$handle.api) {\r\n try {\r\n let value = ''\r\n\r\n // 如果是模板模式,手动解析模板字符串\r\n if (template) {\r\n const formData = ctx.$handle.api.formData()\r\n // 使用 loadStrVar 解析模板,传入一个 get 函数来获取表单数据\r\n value = ctx.$handle.loadStrVar(\r\n template,\r\n (field) => {\r\n // 使用 api.getValue 获取表单字段值\r\n const val = ctx.$handle.api.getValue(field)\r\n // 如果 getValue 返回 undefined,尝试从 formData 直接获取\r\n if (\r\n val === undefined &&\r\n formData &&\r\n formData[field] !== undefined\r\n ) {\r\n return formData[field]\r\n }\r\n return val\r\n },\r\n null\r\n )\r\n }\r\n // 如果是字段绑定模式,直接获取字段值\r\n else if (bindField) {\r\n value = ctx.$handle.api.getValue(bindField) || ''\r\n }\r\n\r\n // 更新 rule.children(转换为字符串)\r\n if (value != null) {\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n ctx.rule.children[0] = String(value)\r\n // 触发同步和刷新\r\n ctx.$handle.api.sync(ctx.rule)\r\n ctx.$handle.refresh()\r\n }\r\n } catch (e) {\r\n // 静默处理错误\r\n }\r\n }\r\n }, 500) // 增加延迟,确保表单数据完全准备好\r\n }\r\n },\r\n // 处理 children 的渲染,将 children 数组转换为可渲染的内容\r\n renderChildren(children, ctx) {\r\n // 使用 computed 确保响应式更新\r\n // 每次 rule.children 变化时,都会重新计算\r\n return {\r\n default: () => {\r\n // 每次都重新从 rule.children 获取最新值(loadData 会更新这个值)\r\n // 不要使用闭包中的 children 参数,因为它可能是旧值\r\n let currentChildren = ctx.rule?.children\r\n\r\n // 如果 rule.children 不存在,才使用传入的 children 参数(初始值)\r\n if (!currentChildren) {\r\n currentChildren = children\r\n }\r\n\r\n // 确保是数组\r\n const childrenArray = Array.isArray(currentChildren)\r\n ? currentChildren\r\n : [currentChildren]\r\n\r\n // 过滤并转换字符串,参考 html parser 的实现\r\n const text = childrenArray\r\n .filter((v) => v !== null && v !== undefined)\r\n .map((v) => {\r\n if (is.String(v)) {\r\n return v\r\n }\r\n // 如果是对象或其他类型,转换为字符串\r\n return String(v)\r\n })\r\n .join('')\r\n\r\n return text || ''\r\n }\r\n }\r\n },\r\n mergeProp(ctx) {\r\n // 确保没有 field 的组件能正常显示\r\n // 如果 prop.native 未设置,默认设置为 false,让组件被 makeWrap 包装(这样可以显示 title)\r\n // 但如果需要直接渲染,可以设置 native: true\r\n\r\n // 支持从多个位置读取配置:\r\n // 1. ctx.rule.bindField / ctx.rule.template(直接在 rule 中)\r\n // 2. ctx.rule.props.bindField / ctx.rule.props.template(在 props 中)\r\n // 3. ctx.prop.props.bindField / ctx.prop.props.template(在 prop.props 中)\r\n const props = ctx.rule.props || {}\r\n const bindField =\r\n ctx.rule.bindField || props.bindField || ctx.prop.props?.bindField\r\n const template =\r\n ctx.rule.template || props.template || ctx.prop.props?.template\r\n let bindMode =\r\n ctx.rule.bindMode || props.bindMode || ctx.prop.props?.bindMode\r\n\r\n // 如果没有设置 bindMode,根据是否有 bindField 或 template 自动判断\r\n if (!bindMode) {\r\n if (template) {\r\n bindMode = 'template'\r\n } else if (bindField) {\r\n bindMode = 'field'\r\n } else {\r\n bindMode = 'static'\r\n }\r\n }\r\n\r\n // 如果配置了 bindField(绑定单个字段),使用 loadData 来实现动态绑定\r\n if (bindMode === 'field' && bindField) {\r\n const loadDataConfig = {\r\n attr: bindField,\r\n to: 'child',\r\n modify: true,\r\n // 增加 debounce 延迟,避免频繁更新导致循环\r\n wait: 300,\r\n // 确保 watch 开启,但通过 debounce 控制频率\r\n watch: true\r\n }\r\n\r\n // 添加到 effect 中(避免重复添加)\r\n if (!ctx.rule.effect) {\r\n ctx.rule.effect = {}\r\n }\r\n if (!ctx.rule.effect.loadData) {\r\n ctx.rule.effect.loadData = []\r\n }\r\n // 检查是否已存在相同的配置,避免重复添加\r\n const exists = ctx.rule.effect.loadData.some(\r\n (item) => item.attr === bindField && item.to === 'child'\r\n )\r\n if (!exists) {\r\n ctx.rule.effect.loadData.push(loadDataConfig)\r\n // 手动触发 effect 来确保 loadData provider 被调用\r\n // 使用 effect 方法,它会正确设置 ctx 和 input\r\n if (ctx.$handle && ctx.$handle.effect) {\r\n ctx.$handle.effect(ctx, 'loaded')\r\n }\r\n }\r\n }\r\n // 如果配置了 template(模板字符串),支持多个字段绑定\r\n else if (bindMode === 'template' && template) {\r\n const loadDataConfig = {\r\n template: template,\r\n to: 'child',\r\n modify: true,\r\n // 增加 debounce 延迟,避免频繁更新导致循环\r\n wait: 300,\r\n // 确保 watch 开启,但通过 debounce 控制频率\r\n watch: true\r\n }\r\n\r\n if (!ctx.rule.effect) {\r\n ctx.rule.effect = {}\r\n }\r\n if (!ctx.rule.effect.loadData) {\r\n ctx.rule.effect.loadData = []\r\n }\r\n // 检查是否已存在相同的配置,避免重复添加\r\n const exists = ctx.rule.effect.loadData.some(\r\n (item) => item.template === template && item.to === 'child'\r\n )\r\n if (!exists) {\r\n ctx.rule.effect.loadData.push(loadDataConfig)\r\n // 手动触发 effect 来确保 loadData provider 被调用\r\n if (ctx.$handle && ctx.$handle.effect) {\r\n ctx.$handle.effect(ctx, 'loaded')\r\n // 同时手动添加 watch,监听 effect.loadData 的变化\r\n // 这样当 effect.loadData 被修改时,也会触发 provider\r\n if (!ctx._textLoadDataWatched) {\r\n ctx._textLoadDataWatched = true\r\n const loadDataRef = toRef(ctx.rule.effect, 'loadData')\r\n ctx.watch.push(\r\n watch(\r\n loadDataRef,\r\n (newVal, oldVal) => {\r\n ctx.$handle.effect(ctx, 'watch', { loadData: newVal })\r\n },\r\n { deep: true }\r\n )\r\n )\r\n }\r\n }\r\n }\r\n }\r\n // 静态模式:使用 formCreateChild 或 children 作为内容\r\n // formCreateChild 会作为 children[0] 渲染,如果已有 children,也会正常渲染\r\n\r\n // 如果配置了 formCreateChild,将其转换为 children\r\n if (ctx.rule.formCreateChild != null && !ctx.rule.children) {\r\n ctx.rule.children = [ctx.rule.formCreateChild]\r\n }\r\n\r\n // 确保 children 存在(如果没有设置,默认为空数组)\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 对于动态绑定的情况,初始化时设置一个占位符,确保组件能被渲染\r\n // loadData 会在初始化后立即执行一次,更新这个值\r\n if (\r\n (bindMode === 'field' && bindField) ||\r\n (bindMode === 'template' && template)\r\n ) {\r\n // 如果 children 是空数组或未设置,设置为一个非空字符串\r\n // 这样确保组件会被渲染,然后 loadData 会更新内容\r\n if (\r\n !ctx.rule.children ||\r\n (Array.isArray(ctx.rule.children) && ctx.rule.children.length === 0)\r\n ) {\r\n // 对于 template 模式,先不设置占位符,等待 loadData 执行\r\n // 因为如果设置了占位符,可能会覆盖 loadData 的结果\r\n if (bindMode === 'template') {\r\n // template 模式下,等待 loadData 执行后更新\r\n // 但为了确保组件能渲染,至少设置一个空字符串\r\n ctx.rule.children = ['']\r\n } else {\r\n // field 模式下,设置一个空格字符串作为占位符\r\n ctx.rule.children = [' ']\r\n }\r\n }\r\n }\r\n },\r\n render(children, ctx) {\r\n // text 组件使用 div 渲染,内容来自 children\r\n // 使用 children.default() 获取响应式内容,参考 html parser 的实现\r\n\r\n // 获取文本内容(children.default() 会从 renderChildren 返回的响应式函数中获取)\r\n // renderChildren 返回的 default 函数会从 ctx.rule.children 获取最新值\r\n let text = ''\r\n if (children && typeof children.default === 'function') {\r\n try {\r\n text = children.default() || ''\r\n } catch (e) {\r\n text = ''\r\n }\r\n }\r\n\r\n // 确保 text 是字符串\r\n if (text == null || text === undefined) {\r\n text = ''\r\n } else {\r\n text = String(text)\r\n }\r\n\r\n // 复制 prop,避免修改原始对象\r\n const prop = { ...ctx.prop }\r\n if (!prop.props) {\r\n prop.props = {}\r\n }\r\n\r\n // 确保 type 是 'div'\r\n if (prop.type === 'text') {\r\n prop.type = 'div'\r\n }\r\n\r\n delete prop.props.innerHTML\r\n\r\n // 直接使用 vNode.make 渲染 div,文本作为子节点\r\n // 即使 text 为空,也传递 [text] 确保渲染出 div\r\n const vnode = ctx.vNode.make('div', prop, [text])\r\n return vnode\r\n }\r\n}\r\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 text from './text' // text parser 必须在 input 之前注册,避免被 input 的 maker.text 覆盖\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'\nimport flex from './flex'\nimport space from './space'\n\nexport default [\n checkbox,\n datePicker,\n rangePicker,\n hidden,\n text, // text parser 必须在 input 之前,确保 type: 'text' 时优先匹配 text parser\n input,\n timePicker,\n timeRangePicker,\n tree,\n radio,\n select,\n cascader,\n row,\n cusStoreSelect,\n cusUserSelect,\n flex,\n space\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","export default {\r\n name: 'flex',\r\n mergeProp(ctx) {\r\n // 从 props 中读取 flex 布局配置\r\n const props = ctx.rule.props || {}\r\n const flexDirection = props.flexDirection || ctx.rule.flexDirection || 'row'\r\n const flexWrap = props.flexWrap || ctx.rule.flexWrap || 'nowrap'\r\n const justifyContent =\r\n props.justifyContent || ctx.rule.justifyContent || 'flex-start'\r\n const alignItems = props.alignItems || ctx.rule.alignItems || 'flex-start'\r\n const alignContent =\r\n props.alignContent || ctx.rule.alignContent || 'flex-start'\r\n\r\n // 映射 CSS flexbox 值到 Ant Design Vue Flex 组件的 props\r\n const vertical =\r\n flexDirection === 'column' || flexDirection === 'column-reverse'\r\n const wrap = flexWrap === 'wrap'\r\n\r\n // 映射 justifyContent 到 justify\r\n const justifyMap = {\r\n 'flex-start': 'start',\r\n 'flex-end': 'end',\r\n center: 'center',\r\n 'space-between': 'space-between',\r\n 'space-around': 'space-around',\r\n 'space-evenly': 'space-evenly'\r\n }\r\n const justify = justifyMap[justifyContent] || 'start'\r\n\r\n // 映射 alignItems 到 align\r\n const alignMap = {\r\n 'flex-start': 'start',\r\n 'flex-end': 'end',\r\n center: 'center',\r\n baseline: 'baseline',\r\n stretch: 'stretch'\r\n }\r\n const align = alignMap[alignItems] || 'start'\r\n\r\n // 设置到 prop.props,用于传递给 a-flex 组件\r\n if (!ctx.prop.props) {\r\n ctx.prop.props = {}\r\n }\r\n\r\n // 映射 Ant Design Vue Flex 组件的 props\r\n ctx.prop.props.vertical = vertical\r\n // 注意:不设置 wrap prop,因为 Ant Design Vue 的 Flex 组件的 wrap prop 类型可能不匹配\r\n // 换行功能完全通过 CSS 样式来实现\r\n ctx.prop.props.justify = justify\r\n ctx.prop.props.align = align\r\n\r\n // 如果设置了 gap,也传递\r\n if (props.gap !== undefined) {\r\n ctx.prop.props.gap = props.gap\r\n }\r\n\r\n // 合并样式(不要直接修改 ctx.rule.style,避免响应式循环)\r\n const existingStyle = ctx.rule.style || {}\r\n // 排除已经被 Flex 组件处理的样式\r\n const {\r\n display: userDisplay,\r\n flexDirection: _fd,\r\n flexWrap: _fw,\r\n justifyContent: _jc,\r\n alignItems: _ai,\r\n alignContent: _ac,\r\n ...otherStyles\r\n } = existingStyle\r\n\r\n // 构建样式对象,确保从 props 读取的配置能够应用到样式中\r\n const flexStyles = {\r\n // 保留用户设置的 display,如果没有则设置为 'flex'\r\n display: userDisplay || 'flex',\r\n // 确保 flex 容器占满整行\r\n // 在样式中设置 flexWrap,确保从 props 读取的配置能够生效\r\n // 这是关键的:将 props.flexWrap 的值('wrap' 或 'nowrap')应用到样式中\r\n flexWrap: flexWrap,\r\n // 合并其他用户自定义样式\r\n ...otherStyles\r\n }\r\n\r\n // 如果设置了 alignContent,添加到样式中\r\n if (alignContent && alignContent !== 'flex-start') {\r\n flexStyles.alignContent = alignContent\r\n }\r\n\r\n // 同时设置到 ctx.prop.style 和 ctx.prop.props.style\r\n // form-create 会将 prop.style 应用到组件上,但有时也需要 prop.props.style\r\n // 保留已有的 prop.style 和 prop.props.style,然后合并新的样式\r\n const existingPropStyle = ctx.prop.style || {}\r\n const existingPropsStyle = ctx.prop.props?.style || {}\r\n\r\n // 合并样式到 ctx.prop.style(保留已有样式,新的样式优先)\r\n ctx.prop.style = {\r\n ...existingPropStyle,\r\n ...flexStyles\r\n }\r\n\r\n // 同时也合并到 props.style,确保样式生效\r\n if (!ctx.prop.props) {\r\n ctx.prop.props = {}\r\n }\r\n ctx.prop.props.style = {\r\n ...existingPropsStyle,\r\n ...flexStyles\r\n }\r\n\r\n // 确保 children 存在\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 为 flex 容器的所有子组件设置 col: false,避免被 a-col 包装\r\n // 这样可以确保子组件直接作为 flex 子项,而不是占满整行\r\n if (ctx.rule.children && Array.isArray(ctx.rule.children)) {\r\n ctx.rule.children.forEach((child) => {\r\n if (\r\n child &&\r\n typeof child === 'object' &&\r\n !child.type === 'DragTool' &&\r\n !child.type === 'DragBox'\r\n ) {\r\n // 只有当 col 未设置或为默认值时才设置\r\n if (child.col === undefined || child.col === null) {\r\n child.col = false\r\n } else if (\r\n child.col &&\r\n typeof child.col === 'object' &&\r\n child.col.show !== false\r\n ) {\r\n child.col.show = false\r\n }\r\n }\r\n })\r\n }\r\n },\r\n render(children, ctx) {\r\n // 使用 Ant Design Vue 的 Flex 组件\r\n const prop = { ...ctx.prop }\r\n\r\n // 将 type 设置为 'a-flex',form-create 会自动识别\r\n if (prop.type === 'flex') {\r\n prop.type = 'a-flex'\r\n }\r\n\r\n // 读取 flexDirection 来判断是否是垂直方向\r\n const props = ctx.rule.props || {}\r\n const flexDirection = props.flexDirection || ctx.rule.flexDirection || 'row'\r\n const isVertical =\r\n flexDirection === 'column' || flexDirection === 'column-reverse'\r\n\r\n // 初始化 prop.props 和 prop.class(如果需要的话)\r\n if (!prop.props) {\r\n prop.props = {}\r\n }\r\n\r\n // 添加自定义 class 的辅助函数\r\n const ensureClass = () => {\r\n if (!prop.class) {\r\n prop.class = []\r\n }\r\n if (!Array.isArray(prop.class)) {\r\n prop.class = [prop.class]\r\n }\r\n }\r\n\r\n // 读取 childFlex 配置\r\n const childFlex = ctx.rule.props?.childFlex ?? ctx.rule.childFlex\r\n if (childFlex !== undefined && childFlex !== null && childFlex !== '') {\r\n ensureClass()\r\n if (!prop.class.includes('_fc-flex-container')) {\r\n prop.class.push('_fc-flex-container')\r\n }\r\n\r\n // 通过 CSS 变量传递 flex 值\r\n const flexValue = String(childFlex).trim()\r\n // 合并到样式中,设置 CSS 变量\r\n if (!prop.props.style) {\r\n prop.props.style = {}\r\n }\r\n prop.props.style['--fc-child-flex'] = flexValue\r\n\r\n // 同时也设置到 prop.style\r\n if (!prop.style) {\r\n prop.style = {}\r\n }\r\n prop.style['--fc-child-flex'] = flexValue\r\n }\r\n\r\n // 如果是垂直方向,读取 childWidth 配置(默认 100%)\r\n if (isVertical) {\r\n const childWidth =\r\n ctx.rule.props?.childWidth ?? ctx.rule.childWidth ?? '100%'\r\n\r\n ensureClass()\r\n if (!prop.class.includes('_fc-flex-container')) {\r\n prop.class.push('_fc-flex-container')\r\n }\r\n if (!prop.class.includes('_fc-flex-vertical')) {\r\n prop.class.push('_fc-flex-vertical')\r\n }\r\n\r\n // 通过 CSS 变量传递宽度值\r\n const widthValue = String(childWidth).trim()\r\n if (!prop.props.style) {\r\n prop.props.style = {}\r\n }\r\n prop.props.style['--fc-child-width'] = widthValue\r\n\r\n if (!prop.style) {\r\n prop.style = {}\r\n }\r\n prop.style['--fc-child-width'] = widthValue\r\n }\r\n\r\n // children 会通过 form-create 的机制自动渲染\r\n const childrenNodes = children || []\r\n\r\n // 将 flex 容器包装在 col 中,确保它占满整行(span: 24)\r\n // 这样 flex 容器才能有足够的宽度,子项才能自适应展示\r\n return ctx.vNode.col(\r\n { props: { span: 24 } },\r\n {\r\n default: () => [ctx.vNode.make('a-flex', prop, childrenNodes)]\r\n }\r\n )\r\n }\r\n}\r\n","export default {\r\n name: 'space',\r\n mergeProp(ctx) {\r\n // 从 props 中读取 Space 组件配置\r\n const props = ctx.rule.props || {}\r\n const direction = props.direction || ctx.rule.direction || 'horizontal'\r\n const size = props.size || ctx.rule.size || 'small'\r\n const align = props.align || ctx.rule.align\r\n const wrap = props.wrap || ctx.rule.wrap || false\r\n\r\n // 设置到 prop.props,用于传递给 a-space 组件\r\n if (!ctx.prop.props) {\r\n ctx.prop.props = {}\r\n }\r\n\r\n // 映射 Ant Design Vue Space 组件的 props\r\n ctx.prop.props.direction = direction\r\n ctx.prop.props.size = size\r\n if (align !== undefined && align !== null && align !== '') {\r\n ctx.prop.props.align = align\r\n }\r\n ctx.prop.props.wrap = wrap\r\n\r\n // 合并样式,确保 Space 容器占满整行\r\n const existingStyle = ctx.rule.style || {}\r\n const spaceStyles = {\r\n width: '100%',\r\n ...existingStyle\r\n }\r\n\r\n // 同时设置到 ctx.prop.style 和 ctx.prop.props.style\r\n if (!ctx.prop.style) {\r\n ctx.prop.style = {}\r\n }\r\n ctx.prop.style = { ...ctx.prop.style, ...spaceStyles }\r\n\r\n if (!ctx.prop.props.style) {\r\n ctx.prop.props.style = {}\r\n }\r\n ctx.prop.props.style = { ...ctx.prop.props.style, ...spaceStyles }\r\n\r\n // 确保 children 存在\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 为 space 容器的所有子组件设置 col: false,避免被 a-col 包装\r\n // Space 组件会自动处理子项间距,不需要 col 包装\r\n if (ctx.rule.children && Array.isArray(ctx.rule.children)) {\r\n ctx.rule.children.forEach((child) => {\r\n if (\r\n child &&\r\n typeof child === 'object' &&\r\n child.type !== 'DragTool' &&\r\n child.type !== 'DragBox'\r\n ) {\r\n // 只有当 col 未设置或为默认值时才设置\r\n if (child.col === undefined || child.col === null) {\r\n child.col = false\r\n } else if (\r\n child.col &&\r\n typeof child.col === 'object' &&\r\n child.col.show !== false\r\n ) {\r\n child.col.show = false\r\n }\r\n }\r\n })\r\n }\r\n },\r\n render(children, ctx) {\r\n // 使用 Ant Design Vue 的 Space 组件\r\n const prop = { ...ctx.prop }\r\n\r\n // 将 type 设置为 'a-space',form-create 会自动识别\r\n if (prop.type === 'space') {\r\n prop.type = 'a-space'\r\n }\r\n\r\n // children 会通过 form-create 的机制自动渲染\r\n const childrenNodes = children || []\r\n\r\n // 将 space 容器包装在 col 中,确保它占满整行(span: 24)\r\n // 这样 space 容器才能有足够的宽度\r\n return ctx.vNode.col(\r\n { props: { span: 24 } },\r\n {\r\n default: () => [ctx.vNode.make('a-space', prop, childrenNodes)]\r\n }\r\n )\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 flex: PRE + 'Flex',\n space: PRE + 'Space',\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 // 检查父容器是否是 flex 或 space 类型,如果是,自动设置 col: false 避免被 a-col 包装\r\n // 需要在合并完 col 后再检查,确保能覆盖默认值\r\n if (ctx.parent && ctx.parent.rule) {\r\n const parentType = ctx.parent.rule.type\r\n const parentMenu = ctx.parent.rule._menu\r\n if (\r\n parentType === 'flex' ||\r\n parentType === 'a-flex' ||\r\n parentMenu?.name === 'flex' ||\r\n parentType === 'space' ||\r\n parentType === 'a-space' ||\r\n parentMenu?.name === 'space'\r\n ) {\r\n // 如果父容器是 flex 或 space,强制设置 col 为 false,禁用 col 包装\r\n ctx.prop.col = false\r\n // 同时设置 rule.col 以确保在 makeWrap 中也能识别\r\n if (ctx.rule) {\r\n ctx.rule.col = false\r\n }\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\r\n // 检查父容器是否是 flex 或 space 类型,如果是,强制禁用 col 包装\r\n let shouldDisableCol = false\r\n if (ctx.parent && ctx.parent.rule) {\r\n const parentType = ctx.parent.rule.type\r\n const parentMenu = ctx.parent.rule._menu\r\n if (\r\n parentType === 'flex' ||\r\n parentType === 'a-flex' ||\r\n parentMenu?.name === 'flex' ||\r\n parentType === 'space' ||\r\n parentType === 'a-space' ||\r\n parentMenu?.name === 'space'\r\n ) {\r\n shouldDisableCol = true\r\n }\r\n }\r\n\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 // 如果父容器是 flex,或者 layout 是 inline,或者 col 被显式禁用,则不使用 col 包装\r\n return layout === 'inline' ||\r\n isFalse(_col) ||\r\n isFalse(col.show) ||\r\n shouldDisableCol\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\nfunction useText(maker) {\n maker.text = creatorFactory('text')\n}\n\nfunction useFlex(maker) {\n maker.flex = creatorFactory('flex')\n}\n\nfunction useSpace(maker) {\n maker.space = creatorFactory('space')\n}\n\nuseAlias(maker)\nuseSlider(maker)\nuseFrame(maker)\nuseUpload(maker)\nuseSelect(maker)\nuseCusStoreSelect(maker)\nuseCusUserSelect(maker)\nuseText(maker)\nuseFlex(maker)\nuseSpace(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 '../style/icon.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$6","name","_hoisted_1","class","_openBlock","openBlock","_createElementBlock","_cache","_createElementVNode","height","width","xmlns","viewBox","createElementVNode","d","fill","script$5","defineComponent","props","modelValue","type","Array","default","options","sourceItems","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","some","newItem","clearValue","_hoisted_6","_hoisted_8","opacity","_hoisted_11","_hoisted_12","_createCommentVNode","createCommentVNode","_ctx","createElementBlock","_Fragment","key","tabindex","_renderList","renderList","index","title","_toDisplayString","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$4","components","CusSelect","formCreateInject","field","extraQuery","extraQueryFn","Function","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","assign","message","parent","postMessage","mergeOptions","handleUpdate","handleChange","callback","newItems","triggerValidate","$nextTick","api","validateField","catch","$parent","$options","fapi","_createVNode","createVNode","_component_CusSelect","model-value","source-items","max-tag-count","onUpdate:modelValue","onChange","script$3","selectType","script$2","columns","required","filterEmptyColumn","deletable","addable","reactive","submitBtn","resetBtn","min","updateTable","deep","formCreateInject.preview","n","emptyRule","children","colspan","rule","trs","Form","markRaw","form","$form","copyTrs","oldValue","_isEmpty","native","subRule","textAlign","preview","t","formChange","updateValue","tr","idx","getChildrenFormData","v","flag","keys","k","str","setRawData","formData","raw","setChildrenFormData","splice","clearEmpty","addEmpty","addRaw","push","delRaw","updateRaw","parseJson","indexOf","innerText","loadRule","header","body","column","align","toJson","border","cellspacing","cellpadding","created","_normalizeClass","_fc-disabled","$props","_createBlock","_resolveDynamicComponent","$data","extendOption","onEmitEvent","_component_a_button","font-weight","script$1","$slots","_hoisted_2","_renderSlot","script","color","colStyle","w","is","upload","frame","group","subForm","QuestionCircleOutlined","CusStoreSelect","CusUserSelect","TableForm","TableFormView","TableFormColumnView","checkbox","modelField","mergeProp","ctx","prop","hasProperty","radio","select","fetchData","effectData","loading","render","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","text","loadChildren","_ctx$prop$props","_ctx$prop$props2","bindField","template","setTimeout","$handle","loadStrVar","getValue","sync","refresh","renderChildren","_ctx$rule","currentChildren","join","_ctx$prop$props3","_ctx$prop$props4","_ctx$prop$props5","bindMode","loadDataConfig","attr","to","modify","wait","effect","loadData","_textLoadDataWatched","loadDataRef","toRef","newVal","oldVal","formCreateChild","innerHTML","make","input","idate","textarea","search","password","timePicker","tree","fieldNames","checkedKeys","checkable","row","_","col","span","parsers","toFormValue","toValue","formValue","vnode","on","originalUpdateModelValue","nextTick","fieldName","fieldCtx","getFieldCtx","id","$manager","originalChange","inject","flexDirection","flexWrap","justifyContent","alignItems","alignContent","vertical","justify","flex-start","flex-end","center","space-between","space-around","space-evenly","baseline","stretch","gap","existingStyle","display","userDisplay","_fd","_fw","_jc","_ai","_ac","otherStyles","flexStyles","existingPropStyle","existingPropsStyle","child","show","_ctx$rule$props$child","_ctx$rule$props","isVertical","ensureClass","childFlex","includes","flexValue","trim","_ref","_ctx$rule$props$child2","_ctx$rule$props2","childWidth","widthValue","childrenNodes","direction","size","wrap","spaceStyles","alias","tooltip","PRE","popover","button","icon","slider","rate","timeRangePicker","rangePicker","switch","inputNumber","treeSelect","inputPassword","formItem","flex","space","autoComplete","transfer","array","object","tidy","isFalse","tidyRule","_rule","manager","validate","Promise","validateFields","clearValidateState","fItem","vm","refs","wrapRef","clearValidate","tidyOptions","tidyBool","def","info","placement","mergeProps","parentType","parentMenu","_menu","onPreview","originalOnPreview","sendPreviewMessage","file","url","uid","timestamp","apply","arguments","getDefaultOptions","hideRequiredMark","layout","labelAlign","labelCol","wrapperCol","validateOnRuleChange","gutter","click","adapterValidate","validator","resolve","reject","err","update","submit","preventDefault","beforeRender","ref","extend","className","model","slotLen","setSlot","makeFormBtn","$r","getSlots","makeRow","makeWrap","uni","isTitle","_col","cls","shouldDisableCol","hasFeedback","rules","injectValidate","mergeClass","makeInfo","makeCol","_ctx$refRule","_ctx$refRule2","titleProp","infoProp","isTip","titleSlot","getSlot","refRule","__$title","_ctx$refRule3","__$info","slot","_prop","vn","makeSubmitBtn","makeResetBtn","colon","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","invoke","onSubmit","request","config","action","fetch","throttle","fn","delay","lastTime","context","debounce","timer","clearTimeout","auto","number","time","useAlias","useSlider","types","frameInputs","frameFiles","frameImages","frameInputOne","frameFileOne","frameImageOne","maxLength","frameInput","frameFile","frameImage","useFrame","image","uploadFileOne","uploadImageOne","uploadType","uploadImage","uploadFile","useUpload","selectMultiple","mode","selectTags","selectCombobox","cusStoreSelect","storeSelect","useCusStoreSelect","cusUserSelect","userSelect","useCusUserSelect","useText","useFlex","useSpace","modelFields","load","parseVal","clearProp","_rule$__fc__$refRule","empty","__fc__","match","getLocale","getProp","install","FormCreate","componentAlias","setModelField","component","register","parser","makers","antd","useApp","app","use","FormCreateFactory","ui","version","attrs","normal","formCreate"],"mappings":"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"}
1
+ {"version":3,"file":"form-create.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=228f8426&lang.js","../src/components/CusStoreSelect/index.vue","../src/components/CusStoreSelect/index.vue?vue&type=template&id=00ba930b&lang.js","../src/components/CusUserSelect/index.vue","../src/components/CusUserSelect/index.vue?vue&type=template&id=54621955&lang.js","../src/components/tableForm/TableForm.vue","../src/components/tableForm/TableForm.vue?vue&type=template&id=7d8ce230&lang.js","../src/components/tableForm/TableFormView.vue","../src/components/tableForm/TableFormView.vue?vue&type=template&id=13cd901b&lang.js","../src/components/tableForm/TableFormColumnView.vue","../src/components/tableForm/TableFormColumnView.vue?vue&type=template&id=4a2dbc30&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/text.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/parsers/flex.js","../src/parsers/space.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 sourceItems: {\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', 'update:sourceItems', '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 const sourceItems = this.sourceItems.filter((item) => {\r\n return !newValue.some((newItem) => {\r\n return newItem[this.valueKey] === item[this.valueKey]\r\n })\r\n })\r\n this.$emit('update:sourceItems', sourceItems)\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 const sourceItems = this.sourceItems.filter((item) => {\r\n return !this.currentValue.some((newItem) => {\r\n return newItem[this.valueKey] === item[this.valueKey]\r\n })\r\n })\r\n this.$emit('update:sourceItems', sourceItems)\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 sourceItems: {\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', 'update:sourceItems', '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 const sourceItems = this.sourceItems.filter((item) => {\r\n return !newValue.some((newItem) => {\r\n return newItem[this.valueKey] === item[this.valueKey]\r\n })\r\n })\r\n this.$emit('update:sourceItems', sourceItems)\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 const sourceItems = this.sourceItems.filter((item) => {\r\n return !this.currentValue.some((newItem) => {\r\n return newItem[this.valueKey] === item[this.valueKey]\r\n })\r\n })\r\n this.$emit('update:sourceItems', sourceItems)\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 v-model:source-items=\"sourceItems\"\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 extraQuery: {\n type: Object,\n default: () => ({})\n },\n extraQueryFn: {\n type: Function,\n default: () => {}\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n // 消息ID计数器,用于标识每次请求\n messageId: 0,\n // 存储待处理的回调函数\n pendingCallbacks: {},\n // 内部维护的选项列表(合并父窗口返回的源对象)\n internalOptions: [],\n sourceItems: []\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 extraQuery = {\n ...this.extraQuery\n }\n if (this.extraQueryFn) {\n Object.assign(extraQuery, this.extraQueryFn())\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 extraQuery,\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.sourceItems = sourceItems\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.sourceItems && this.sourceItems.length > 0\n ? this.multiple\n ? this.sourceItems\n : this.sourceItems[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 v-model:source-items=\"sourceItems\"\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 extraQuery: {\n type: Object,\n default: () => ({})\n },\n extraQueryFn: {\n type: Function,\n default: () => {}\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n // 消息ID计数器,用于标识每次请求\n messageId: 0,\n // 存储待处理的回调函数\n pendingCallbacks: {},\n // 内部维护的选项列表(合并父窗口返回的源对象)\n internalOptions: [],\n sourceItems: []\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 extraQuery = {\n ...this.extraQuery\n }\n if (this.extraQueryFn) {\n Object.assign(extraQuery, this.extraQueryFn())\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 extraQuery,\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.sourceItems = sourceItems\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.sourceItems && this.sourceItems.length > 0\n ? this.multiple\n ? this.sourceItems\n : this.sourceItems[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 v-model:source-items=\"sourceItems\"\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 extraQuery: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n extraQueryFn: {\r\n type: Function,\r\n default: () => {}\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 sourceItems: []\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 extraQuery = {\r\n ...this.extraQuery\r\n }\r\n if (this.extraQueryFn) {\r\n Object.assign(extraQuery, this.extraQueryFn())\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 extraQuery,\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.sourceItems = sourceItems\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.sourceItems && this.sourceItems.length > 0\r\n ? this.multiple\r\n ? this.sourceItems\r\n : this.sourceItems[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 v-model:source-items=\"sourceItems\"\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 extraQuery: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n extraQueryFn: {\r\n type: Function,\r\n default: () => {}\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 sourceItems: []\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 extraQuery = {\r\n ...this.extraQuery\r\n }\r\n if (this.extraQueryFn) {\r\n Object.assign(extraQuery, this.extraQueryFn())\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 extraQuery,\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.sourceItems = sourceItems\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.sourceItems && this.sourceItems.length > 0\r\n ? this.multiple\r\n ? this.sourceItems\r\n : this.sourceItems[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>\n <div class=\"_fc-table-form\" :class=\"{ '_fc-disabled': disabled }\">\n <component\n :is=\"Form\"\n :option=\"options\"\n :rule=\"rule\"\n :extendOption=\"true\"\n :disabled=\"disabled\"\n @change=\"formChange\"\n v-model:api=\"fapi\"\n @emit-event=\"$emit\"\n ></component>\n <a-button\n type=\"link\"\n class=\"fc-clock\"\n v-if=\"addable && (!max || max > this.trs.length)\"\n @click=\"addRaw(true)\"\n :disabled=\"disabled\"\n ><i class=\"fc-icon icon-add-circle\" style=\"font-weight: 700\"></i>\n {{ formCreateInject.t('add') || '添加' }}\n </a-button>\n </div>\n</template>\n\n<script>\nimport { markRaw, reactive } from 'vue'\n\nexport default {\n name: 'TableForm',\n emits: ['change', 'add', 'delete', 'update:modelValue'],\n props: {\n formCreateInject: Object,\n modelValue: {\n type: Array,\n default: () => []\n },\n columns: {\n type: Array,\n required: true,\n default: () => []\n },\n filterEmptyColumn: {\n type: Boolean,\n default: true\n },\n deletable: {\n type: Boolean,\n default: true\n },\n addable: {\n type: Boolean,\n default: true\n },\n options: {\n type: Object,\n default: () =>\n reactive({\n submitBtn: false,\n resetBtn: false\n })\n },\n min: Number,\n max: Number,\n disabled: Boolean\n },\n watch: {\n modelValue: {\n handler() {\n this.updateTable()\n },\n deep: true\n },\n 'formCreateInject.preview': function (n) {\n this.emptyRule.children[0].props.colspan =\n this.columns.length + (n ? 1 : 2)\n }\n },\n data() {\n return {\n rule: [],\n trs: [],\n fapi: {},\n Form: markRaw(this.formCreateInject.form.$form()),\n copyTrs: '',\n oldValue: '',\n emptyRule: {\n type: 'tr',\n _isEmpty: true,\n native: true,\n subRule: true,\n children: [\n {\n type: 'td',\n style: {\n textAlign: 'center'\n },\n native: true,\n subRule: true,\n props: {\n colspan:\n this.columns.length + (this.formCreateInject.preview ? 1 : 2)\n },\n children: [this.formCreateInject.t('dataEmpty') || '暂无数据']\n }\n ]\n }\n }\n },\n methods: {\n formChange() {\n this.updateValue()\n },\n updateValue() {\n const value = this.trs\n .map((tr, idx) => {\n return {\n ...(this.modelValue[idx] || {}),\n ...this.fapi.getChildrenFormData(tr)\n }\n })\n .filter((v) => {\n if (!this.filterEmptyColumn) {\n return true\n }\n if (v === undefined || v === null) {\n return false\n }\n let flag = false\n Object.keys(v).forEach((k) => {\n flag = flag || (v[k] !== undefined && v[k] !== '' && v[k] !== null)\n })\n return flag\n })\n const str = JSON.stringify(value)\n if (str !== this.oldValue) {\n this.oldValue = str\n this.$emit('update:modelValue', value)\n this.$emit('change', value)\n }\n },\n setRawData(idx, formData) {\n const raw = this.trs[idx]\n this.fapi.setChildrenFormData(raw, formData, true)\n },\n updateTable() {\n const str = JSON.stringify(this.modelValue)\n if (this.oldValue === str) {\n return\n }\n this.oldValue = str\n this.trs = this.trs.splice(0, this.modelValue.length)\n if (!this.modelValue.length) {\n this.addEmpty()\n } else {\n this.clearEmpty()\n }\n this.modelValue.forEach((data, idx) => {\n if (!this.trs[idx]) {\n this.addRaw()\n }\n this.setRawData(idx, data || {})\n })\n this.rule[0].children[1].children = this.trs\n },\n addEmpty() {\n if (this.trs.length) {\n this.trs.splice(0, this.trs.length)\n }\n this.trs.push(this.emptyRule)\n },\n clearEmpty() {\n if (this.trs[0] && this.trs[0]._isEmpty) {\n this.trs.splice(0, 1)\n }\n },\n delRaw(idx) {\n if (\n this.disabled ||\n !this.deletable ||\n (this.min > 0 && this.trs.length <= this.min)\n ) {\n return\n }\n this.trs.splice(idx, 1)\n this.updateValue()\n if (this.trs.length) {\n this.trs.forEach((tr) => this.updateRaw(tr))\n } else {\n this.addEmpty()\n }\n this.$emit('delete', idx)\n },\n addRaw(flag) {\n if (flag && this.disabled) {\n return\n }\n const tr = this.formCreateInject.form.parseJson(this.copyTrs)[0]\n if (this.trs.length === 1 && this.trs[0]._isEmpty) {\n this.trs.splice(0, 1)\n }\n this.trs.push(tr)\n this.updateRaw(tr)\n if (flag) {\n this.$emit('add', this.trs.length)\n this.updateValue()\n }\n },\n updateRaw(tr) {\n const idx = this.trs.indexOf(tr)\n tr.children[0].props.innerText = idx + 1\n tr.children[tr.children.length - 1].children[0].props.onClick = () => {\n this.delRaw(idx)\n }\n },\n loadRule() {\n const header = [\n {\n type: 'th',\n native: true,\n class: '_fc-tf-head-idx',\n props: {\n innerText: '#'\n }\n }\n ]\n let body = [\n {\n type: 'td',\n class: '_fc-tf-idx',\n native: true,\n props: {\n innerText: '0'\n }\n }\n ]\n this.columns.forEach((column) => {\n header.push({\n type: 'th',\n native: true,\n style: {\n ...(column.style || {}),\n textAlign: column.align || 'center'\n },\n class: column.required ? '_fc-tf-head-required' : '',\n props: {\n innerText: column.label || ''\n }\n })\n body.push({\n type: 'td',\n native: true,\n children: [...(column.rule || [])]\n })\n })\n header.push({\n type: 'th',\n native: true,\n class: '_fc-tf-edit fc-clock',\n props: {\n innerText: this.formCreateInject.t('operation') || '操作'\n }\n })\n body.push({\n type: 'td',\n native: true,\n class: '_fc-tf-btn fc-clock',\n children: [\n {\n type: 'i',\n native: true,\n class: 'fc-icon icon-delete',\n props: {}\n }\n ]\n })\n this.copyTrs = this.formCreateInject.form.toJson([\n {\n type: 'tr',\n native: true,\n subRule: true,\n children: body\n }\n ])\n this.rule = [\n {\n type: 'table',\n native: true,\n class: '_fc-tf-table',\n props: {\n border: '1',\n cellspacing: '0',\n cellpadding: '0'\n },\n children: [\n {\n type: 'thead',\n native: true,\n children: [\n {\n type: 'tr',\n native: true,\n children: header\n }\n ]\n },\n {\n type: 'tbody',\n native: true,\n children: this.trs\n }\n ]\n }\n ]\n }\n },\n created() {\n this.loadRule()\n },\n mounted() {\n this.updateTable()\n }\n}\n</script>\n","<template>\n <div class=\"_fc-table-form\" :class=\"{ '_fc-disabled': disabled }\">\n <component\n :is=\"Form\"\n :option=\"options\"\n :rule=\"rule\"\n :extendOption=\"true\"\n :disabled=\"disabled\"\n @change=\"formChange\"\n v-model:api=\"fapi\"\n @emit-event=\"$emit\"\n ></component>\n <a-button\n type=\"link\"\n class=\"fc-clock\"\n v-if=\"addable && (!max || max > this.trs.length)\"\n @click=\"addRaw(true)\"\n :disabled=\"disabled\"\n ><i class=\"fc-icon icon-add-circle\" style=\"font-weight: 700\"></i>\n {{ formCreateInject.t('add') || '添加' }}\n </a-button>\n </div>\n</template>\n\n<script>\nimport { markRaw, reactive } from 'vue'\n\nexport default {\n name: 'TableForm',\n emits: ['change', 'add', 'delete', 'update:modelValue'],\n props: {\n formCreateInject: Object,\n modelValue: {\n type: Array,\n default: () => []\n },\n columns: {\n type: Array,\n required: true,\n default: () => []\n },\n filterEmptyColumn: {\n type: Boolean,\n default: true\n },\n deletable: {\n type: Boolean,\n default: true\n },\n addable: {\n type: Boolean,\n default: true\n },\n options: {\n type: Object,\n default: () =>\n reactive({\n submitBtn: false,\n resetBtn: false\n })\n },\n min: Number,\n max: Number,\n disabled: Boolean\n },\n watch: {\n modelValue: {\n handler() {\n this.updateTable()\n },\n deep: true\n },\n 'formCreateInject.preview': function (n) {\n this.emptyRule.children[0].props.colspan =\n this.columns.length + (n ? 1 : 2)\n }\n },\n data() {\n return {\n rule: [],\n trs: [],\n fapi: {},\n Form: markRaw(this.formCreateInject.form.$form()),\n copyTrs: '',\n oldValue: '',\n emptyRule: {\n type: 'tr',\n _isEmpty: true,\n native: true,\n subRule: true,\n children: [\n {\n type: 'td',\n style: {\n textAlign: 'center'\n },\n native: true,\n subRule: true,\n props: {\n colspan:\n this.columns.length + (this.formCreateInject.preview ? 1 : 2)\n },\n children: [this.formCreateInject.t('dataEmpty') || '暂无数据']\n }\n ]\n }\n }\n },\n methods: {\n formChange() {\n this.updateValue()\n },\n updateValue() {\n const value = this.trs\n .map((tr, idx) => {\n return {\n ...(this.modelValue[idx] || {}),\n ...this.fapi.getChildrenFormData(tr)\n }\n })\n .filter((v) => {\n if (!this.filterEmptyColumn) {\n return true\n }\n if (v === undefined || v === null) {\n return false\n }\n let flag = false\n Object.keys(v).forEach((k) => {\n flag = flag || (v[k] !== undefined && v[k] !== '' && v[k] !== null)\n })\n return flag\n })\n const str = JSON.stringify(value)\n if (str !== this.oldValue) {\n this.oldValue = str\n this.$emit('update:modelValue', value)\n this.$emit('change', value)\n }\n },\n setRawData(idx, formData) {\n const raw = this.trs[idx]\n this.fapi.setChildrenFormData(raw, formData, true)\n },\n updateTable() {\n const str = JSON.stringify(this.modelValue)\n if (this.oldValue === str) {\n return\n }\n this.oldValue = str\n this.trs = this.trs.splice(0, this.modelValue.length)\n if (!this.modelValue.length) {\n this.addEmpty()\n } else {\n this.clearEmpty()\n }\n this.modelValue.forEach((data, idx) => {\n if (!this.trs[idx]) {\n this.addRaw()\n }\n this.setRawData(idx, data || {})\n })\n this.rule[0].children[1].children = this.trs\n },\n addEmpty() {\n if (this.trs.length) {\n this.trs.splice(0, this.trs.length)\n }\n this.trs.push(this.emptyRule)\n },\n clearEmpty() {\n if (this.trs[0] && this.trs[0]._isEmpty) {\n this.trs.splice(0, 1)\n }\n },\n delRaw(idx) {\n if (\n this.disabled ||\n !this.deletable ||\n (this.min > 0 && this.trs.length <= this.min)\n ) {\n return\n }\n this.trs.splice(idx, 1)\n this.updateValue()\n if (this.trs.length) {\n this.trs.forEach((tr) => this.updateRaw(tr))\n } else {\n this.addEmpty()\n }\n this.$emit('delete', idx)\n },\n addRaw(flag) {\n if (flag && this.disabled) {\n return\n }\n const tr = this.formCreateInject.form.parseJson(this.copyTrs)[0]\n if (this.trs.length === 1 && this.trs[0]._isEmpty) {\n this.trs.splice(0, 1)\n }\n this.trs.push(tr)\n this.updateRaw(tr)\n if (flag) {\n this.$emit('add', this.trs.length)\n this.updateValue()\n }\n },\n updateRaw(tr) {\n const idx = this.trs.indexOf(tr)\n tr.children[0].props.innerText = idx + 1\n tr.children[tr.children.length - 1].children[0].props.onClick = () => {\n this.delRaw(idx)\n }\n },\n loadRule() {\n const header = [\n {\n type: 'th',\n native: true,\n class: '_fc-tf-head-idx',\n props: {\n innerText: '#'\n }\n }\n ]\n let body = [\n {\n type: 'td',\n class: '_fc-tf-idx',\n native: true,\n props: {\n innerText: '0'\n }\n }\n ]\n this.columns.forEach((column) => {\n header.push({\n type: 'th',\n native: true,\n style: {\n ...(column.style || {}),\n textAlign: column.align || 'center'\n },\n class: column.required ? '_fc-tf-head-required' : '',\n props: {\n innerText: column.label || ''\n }\n })\n body.push({\n type: 'td',\n native: true,\n children: [...(column.rule || [])]\n })\n })\n header.push({\n type: 'th',\n native: true,\n class: '_fc-tf-edit fc-clock',\n props: {\n innerText: this.formCreateInject.t('operation') || '操作'\n }\n })\n body.push({\n type: 'td',\n native: true,\n class: '_fc-tf-btn fc-clock',\n children: [\n {\n type: 'i',\n native: true,\n class: 'fc-icon icon-delete',\n props: {}\n }\n ]\n })\n this.copyTrs = this.formCreateInject.form.toJson([\n {\n type: 'tr',\n native: true,\n subRule: true,\n children: body\n }\n ])\n this.rule = [\n {\n type: 'table',\n native: true,\n class: '_fc-tf-table',\n props: {\n border: '1',\n cellspacing: '0',\n cellpadding: '0'\n },\n children: [\n {\n type: 'thead',\n native: true,\n children: [\n {\n type: 'tr',\n native: true,\n children: header\n }\n ]\n },\n {\n type: 'tbody',\n native: true,\n children: this.trs\n }\n ]\n }\n ]\n }\n },\n created() {\n this.loadRule()\n },\n mounted() {\n this.updateTable()\n }\n}\n</script>\n","<template>\n <div class=\"_fd-table-form\">\n <div class=\"_fd-tf-wrap\" v-if=\"$slots.default\">\n <slot></slot>\n </div>\n <div class=\"_fc-child-empty\" v-else></div>\n </div>\n</template>\n\n<script>\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n name: 'TableFormView',\n data() {\n return {}\n }\n})\n</script>\n","<template>\n <div class=\"_fd-table-form\">\n <div class=\"_fd-tf-wrap\" v-if=\"$slots.default\">\n <slot></slot>\n </div>\n <div class=\"_fc-child-empty\" v-else></div>\n </div>\n</template>\n\n<script>\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n name: 'TableFormView',\n data() {\n return {}\n }\n})\n</script>\n","<template>\n <div class=\"_fd-tf-col\" :style=\"colStyle\">\n <div class=\"_fd-tf-title\" :style=\"{ textAlign: align || 'center' }\">\n <span v-if=\"required\" class=\"_fd-tf-required\">*</span>{{ label || '' }}\n </div>\n <div class=\"_fd-tf-con\">\n <slot></slot>\n </div>\n </div>\n</template>\n\n<script>\nimport is from '@form-create/utils/lib/type'\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n name: 'TableFormColumnView',\n props: {\n label: String,\n align: String,\n width: [Number, String],\n color: String,\n required: Boolean\n },\n computed: {\n colStyle() {\n const w = this.width\n const style = {\n width: is.Number(w) ? `${w}px` : !w || w === 'auto' ? '180px' : w\n }\n if (this.color) {\n style.color = this.color\n }\n return style\n }\n },\n data() {\n return {}\n }\n})\n</script>\n","<template>\n <div class=\"_fd-tf-col\" :style=\"colStyle\">\n <div class=\"_fd-tf-title\" :style=\"{ textAlign: align || 'center' }\">\n <span v-if=\"required\" class=\"_fd-tf-required\">*</span>{{ label || '' }}\n </div>\n <div class=\"_fd-tf-con\">\n <slot></slot>\n </div>\n </div>\n</template>\n\n<script>\nimport is from '@form-create/utils/lib/type'\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n name: 'TableFormColumnView',\n props: {\n label: String,\n align: String,\n width: [Number, String],\n color: String,\n required: Boolean\n },\n computed: {\n colStyle() {\n const w = this.width\n const style = {\n width: is.Number(w) ? `${w}px` : !w || w === 'auto' ? '180px' : w\n }\n if (this.color) {\n style.color = this.color\n }\n return style\n }\n },\n data() {\n return {}\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'\nimport CusUserSelect from './CusUserSelect/index.vue'\nimport TableForm from './tableForm/TableForm.vue'\nimport TableFormView from './tableForm/TableFormView.vue'\nimport TableFormColumnView from './tableForm/TableFormColumnView.vue'\n\nexport default [\n upload,\n frame,\n group,\n subForm,\n QuestionCircleOutlined,\n CusSelect,\n CusStoreSelect,\n CusUserSelect,\n TableForm,\n TableFormView,\n TableFormColumnView\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 is from '@form-create/utils/lib/type'\r\nimport { watch, toRef } from 'vue'\r\n\r\nexport default {\r\n name: 'text',\r\n // 设置 loadChildren 为 false,避免 children 被当作子组件处理\r\n // text 的 children 只是简单的文本内容,不需要作为子组件加载\r\n loadChildren: false,\r\n // 组件挂载后,手动触发一次 loadData 更新,确保表单数据准备好后再获取初始值\r\n mounted(ctx) {\r\n // 如果是动态绑定的 Text 组件,在挂载后手动解析模板并更新值\r\n const props = ctx.rule.props || {}\r\n const bindField =\r\n ctx.rule.bindField || props.bindField || ctx.prop.props?.bindField\r\n const template =\r\n ctx.rule.template || props.template || ctx.prop.props?.template\r\n\r\n if (template || bindField) {\r\n // 延迟执行,确保表单数据已经准备好\r\n setTimeout(() => {\r\n if (ctx.$handle && ctx.$handle.api) {\r\n try {\r\n let value = ''\r\n\r\n // 如果是模板模式,手动解析模板字符串\r\n if (template) {\r\n const formData = ctx.$handle.api.formData()\r\n // 使用 loadStrVar 解析模板,传入一个 get 函数来获取表单数据\r\n value = ctx.$handle.loadStrVar(\r\n template,\r\n (field) => {\r\n // 使用 api.getValue 获取表单字段值\r\n const val = ctx.$handle.api.getValue(field)\r\n // 如果 getValue 返回 undefined,尝试从 formData 直接获取\r\n if (\r\n val === undefined &&\r\n formData &&\r\n formData[field] !== undefined\r\n ) {\r\n return formData[field]\r\n }\r\n return val\r\n },\r\n null\r\n )\r\n }\r\n // 如果是字段绑定模式,直接获取字段值\r\n else if (bindField) {\r\n value = ctx.$handle.api.getValue(bindField) || ''\r\n }\r\n\r\n // 更新 rule.children(转换为字符串)\r\n if (value != null) {\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n ctx.rule.children[0] = String(value)\r\n // 触发同步和刷新\r\n ctx.$handle.api.sync(ctx.rule)\r\n ctx.$handle.refresh()\r\n }\r\n } catch (e) {\r\n // 静默处理错误\r\n }\r\n }\r\n }, 500) // 增加延迟,确保表单数据完全准备好\r\n }\r\n },\r\n // 处理 children 的渲染,将 children 数组转换为可渲染的内容\r\n renderChildren(children, ctx) {\r\n // 使用 computed 确保响应式更新\r\n // 每次 rule.children 变化时,都会重新计算\r\n return {\r\n default: () => {\r\n // 每次都重新从 rule.children 获取最新值(loadData 会更新这个值)\r\n // 不要使用闭包中的 children 参数,因为它可能是旧值\r\n let currentChildren = ctx.rule?.children\r\n\r\n // 如果 rule.children 不存在,才使用传入的 children 参数(初始值)\r\n if (!currentChildren) {\r\n currentChildren = children\r\n }\r\n\r\n // 确保是数组\r\n const childrenArray = Array.isArray(currentChildren)\r\n ? currentChildren\r\n : [currentChildren]\r\n\r\n // 过滤并转换字符串,参考 html parser 的实现\r\n const text = childrenArray\r\n .filter((v) => v !== null && v !== undefined)\r\n .map((v) => {\r\n if (is.String(v)) {\r\n return v\r\n }\r\n // 如果是对象或其他类型,转换为字符串\r\n return String(v)\r\n })\r\n .join('')\r\n\r\n return text || ''\r\n }\r\n }\r\n },\r\n mergeProp(ctx) {\r\n // 确保没有 field 的组件能正常显示\r\n // 如果 prop.native 未设置,默认设置为 false,让组件被 makeWrap 包装(这样可以显示 title)\r\n // 但如果需要直接渲染,可以设置 native: true\r\n\r\n // 支持从多个位置读取配置:\r\n // 1. ctx.rule.bindField / ctx.rule.template(直接在 rule 中)\r\n // 2. ctx.rule.props.bindField / ctx.rule.props.template(在 props 中)\r\n // 3. ctx.prop.props.bindField / ctx.prop.props.template(在 prop.props 中)\r\n const props = ctx.rule.props || {}\r\n const bindField =\r\n ctx.rule.bindField || props.bindField || ctx.prop.props?.bindField\r\n const template =\r\n ctx.rule.template || props.template || ctx.prop.props?.template\r\n let bindMode =\r\n ctx.rule.bindMode || props.bindMode || ctx.prop.props?.bindMode\r\n\r\n // 如果没有设置 bindMode,根据是否有 bindField 或 template 自动判断\r\n if (!bindMode) {\r\n if (template) {\r\n bindMode = 'template'\r\n } else if (bindField) {\r\n bindMode = 'field'\r\n } else {\r\n bindMode = 'static'\r\n }\r\n }\r\n\r\n // 如果配置了 bindField(绑定单个字段),使用 loadData 来实现动态绑定\r\n if (bindMode === 'field' && bindField) {\r\n const loadDataConfig = {\r\n attr: bindField,\r\n to: 'child',\r\n modify: true,\r\n // 增加 debounce 延迟,避免频繁更新导致循环\r\n wait: 300,\r\n // 确保 watch 开启,但通过 debounce 控制频率\r\n watch: true\r\n }\r\n\r\n // 添加到 effect 中(避免重复添加)\r\n if (!ctx.rule.effect) {\r\n ctx.rule.effect = {}\r\n }\r\n if (!ctx.rule.effect.loadData) {\r\n ctx.rule.effect.loadData = []\r\n }\r\n // 检查是否已存在相同的配置,避免重复添加\r\n const exists = ctx.rule.effect.loadData.some(\r\n (item) => item.attr === bindField && item.to === 'child'\r\n )\r\n if (!exists) {\r\n ctx.rule.effect.loadData.push(loadDataConfig)\r\n // 手动触发 effect 来确保 loadData provider 被调用\r\n // 使用 effect 方法,它会正确设置 ctx 和 input\r\n if (ctx.$handle && ctx.$handle.effect) {\r\n ctx.$handle.effect(ctx, 'loaded')\r\n }\r\n }\r\n }\r\n // 如果配置了 template(模板字符串),支持多个字段绑定\r\n else if (bindMode === 'template' && template) {\r\n const loadDataConfig = {\r\n template: template,\r\n to: 'child',\r\n modify: true,\r\n // 增加 debounce 延迟,避免频繁更新导致循环\r\n wait: 300,\r\n // 确保 watch 开启,但通过 debounce 控制频率\r\n watch: true\r\n }\r\n\r\n if (!ctx.rule.effect) {\r\n ctx.rule.effect = {}\r\n }\r\n if (!ctx.rule.effect.loadData) {\r\n ctx.rule.effect.loadData = []\r\n }\r\n // 检查是否已存在相同的配置,避免重复添加\r\n const exists = ctx.rule.effect.loadData.some(\r\n (item) => item.template === template && item.to === 'child'\r\n )\r\n if (!exists) {\r\n ctx.rule.effect.loadData.push(loadDataConfig)\r\n // 手动触发 effect 来确保 loadData provider 被调用\r\n if (ctx.$handle && ctx.$handle.effect) {\r\n ctx.$handle.effect(ctx, 'loaded')\r\n // 同时手动添加 watch,监听 effect.loadData 的变化\r\n // 这样当 effect.loadData 被修改时,也会触发 provider\r\n if (!ctx._textLoadDataWatched) {\r\n ctx._textLoadDataWatched = true\r\n const loadDataRef = toRef(ctx.rule.effect, 'loadData')\r\n ctx.watch.push(\r\n watch(\r\n loadDataRef,\r\n (newVal, oldVal) => {\r\n ctx.$handle.effect(ctx, 'watch', { loadData: newVal })\r\n },\r\n { deep: true }\r\n )\r\n )\r\n }\r\n }\r\n }\r\n }\r\n // 静态模式:使用 formCreateChild 或 children 作为内容\r\n // formCreateChild 会作为 children[0] 渲染,如果已有 children,也会正常渲染\r\n\r\n // 如果配置了 formCreateChild,将其转换为 children\r\n if (ctx.rule.formCreateChild != null && !ctx.rule.children) {\r\n ctx.rule.children = [ctx.rule.formCreateChild]\r\n }\r\n\r\n // 确保 children 存在(如果没有设置,默认为空数组)\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 对于动态绑定的情况,初始化时设置一个占位符,确保组件能被渲染\r\n // loadData 会在初始化后立即执行一次,更新这个值\r\n if (\r\n (bindMode === 'field' && bindField) ||\r\n (bindMode === 'template' && template)\r\n ) {\r\n // 如果 children 是空数组或未设置,设置为一个非空字符串\r\n // 这样确保组件会被渲染,然后 loadData 会更新内容\r\n if (\r\n !ctx.rule.children ||\r\n (Array.isArray(ctx.rule.children) && ctx.rule.children.length === 0)\r\n ) {\r\n // 对于 template 模式,先不设置占位符,等待 loadData 执行\r\n // 因为如果设置了占位符,可能会覆盖 loadData 的结果\r\n if (bindMode === 'template') {\r\n // template 模式下,等待 loadData 执行后更新\r\n // 但为了确保组件能渲染,至少设置一个空字符串\r\n ctx.rule.children = ['']\r\n } else {\r\n // field 模式下,设置一个空格字符串作为占位符\r\n ctx.rule.children = [' ']\r\n }\r\n }\r\n }\r\n },\r\n render(children, ctx) {\r\n // text 组件使用 div 渲染,内容来自 children\r\n // 使用 children.default() 获取响应式内容,参考 html parser 的实现\r\n\r\n // 获取文本内容(children.default() 会从 renderChildren 返回的响应式函数中获取)\r\n // renderChildren 返回的 default 函数会从 ctx.rule.children 获取最新值\r\n let text = ''\r\n if (children && typeof children.default === 'function') {\r\n try {\r\n text = children.default() || ''\r\n } catch (e) {\r\n text = ''\r\n }\r\n }\r\n\r\n // 确保 text 是字符串\r\n if (text == null || text === undefined) {\r\n text = ''\r\n } else {\r\n text = String(text)\r\n }\r\n\r\n // 复制 prop,避免修改原始对象\r\n const prop = { ...ctx.prop }\r\n if (!prop.props) {\r\n prop.props = {}\r\n }\r\n\r\n // 确保 type 是 'div'\r\n if (prop.type === 'text') {\r\n prop.type = 'div'\r\n }\r\n\r\n delete prop.props.innerHTML\r\n\r\n // 直接使用 vNode.make 渲染 div,文本作为子节点\r\n // 即使 text 为空,也传递 [text] 确保渲染出 div\r\n const vnode = ctx.vNode.make('div', prop, [text])\r\n return vnode\r\n }\r\n}\r\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 text from './text' // text parser 必须在 input 之前注册,避免被 input 的 maker.text 覆盖\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'\nimport flex from './flex'\nimport space from './space'\n\nexport default [\n checkbox,\n datePicker,\n rangePicker,\n hidden,\n text, // text parser 必须在 input 之前,确保 type: 'text' 时优先匹配 text parser\n input,\n timePicker,\n timeRangePicker,\n tree,\n radio,\n select,\n cascader,\n row,\n cusStoreSelect,\n cusUserSelect,\n flex,\n space\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","export default {\r\n name: 'flex',\r\n mergeProp(ctx) {\r\n // 从 props 中读取 flex 布局配置\r\n const props = ctx.rule.props || {}\r\n const flexDirection = props.flexDirection || ctx.rule.flexDirection || 'row'\r\n const flexWrap = props.flexWrap || ctx.rule.flexWrap || 'nowrap'\r\n const justifyContent =\r\n props.justifyContent || ctx.rule.justifyContent || 'flex-start'\r\n const alignItems = props.alignItems || ctx.rule.alignItems || 'flex-start'\r\n const alignContent =\r\n props.alignContent || ctx.rule.alignContent || 'flex-start'\r\n\r\n // 映射 CSS flexbox 值到 Ant Design Vue Flex 组件的 props\r\n const vertical =\r\n flexDirection === 'column' || flexDirection === 'column-reverse'\r\n const wrap = flexWrap === 'wrap'\r\n\r\n // 映射 justifyContent 到 justify\r\n const justifyMap = {\r\n 'flex-start': 'start',\r\n 'flex-end': 'end',\r\n center: 'center',\r\n 'space-between': 'space-between',\r\n 'space-around': 'space-around',\r\n 'space-evenly': 'space-evenly'\r\n }\r\n const justify = justifyMap[justifyContent] || 'start'\r\n\r\n // 映射 alignItems 到 align\r\n const alignMap = {\r\n 'flex-start': 'start',\r\n 'flex-end': 'end',\r\n center: 'center',\r\n baseline: 'baseline',\r\n stretch: 'stretch'\r\n }\r\n const align = alignMap[alignItems] || 'start'\r\n\r\n // 设置到 prop.props,用于传递给 a-flex 组件\r\n if (!ctx.prop.props) {\r\n ctx.prop.props = {}\r\n }\r\n\r\n // 映射 Ant Design Vue Flex 组件的 props\r\n ctx.prop.props.vertical = vertical\r\n // 注意:不设置 wrap prop,因为 Ant Design Vue 的 Flex 组件的 wrap prop 类型可能不匹配\r\n // 换行功能完全通过 CSS 样式来实现\r\n ctx.prop.props.justify = justify\r\n ctx.prop.props.align = align\r\n\r\n // 如果设置了 gap,也传递\r\n if (props.gap !== undefined) {\r\n ctx.prop.props.gap = props.gap\r\n }\r\n\r\n // 合并样式(不要直接修改 ctx.rule.style,避免响应式循环)\r\n const existingStyle = ctx.rule.style || {}\r\n // 排除已经被 Flex 组件处理的样式\r\n const {\r\n display: userDisplay,\r\n flexDirection: _fd,\r\n flexWrap: _fw,\r\n justifyContent: _jc,\r\n alignItems: _ai,\r\n alignContent: _ac,\r\n ...otherStyles\r\n } = existingStyle\r\n\r\n // 构建样式对象,确保从 props 读取的配置能够应用到样式中\r\n const flexStyles = {\r\n // 保留用户设置的 display,如果没有则设置为 'flex'\r\n display: userDisplay || 'flex',\r\n // 确保 flex 容器占满整行\r\n // 在样式中设置 flexWrap,确保从 props 读取的配置能够生效\r\n // 这是关键的:将 props.flexWrap 的值('wrap' 或 'nowrap')应用到样式中\r\n flexWrap: flexWrap,\r\n // 合并其他用户自定义样式\r\n ...otherStyles\r\n }\r\n\r\n // 如果设置了 alignContent,添加到样式中\r\n if (alignContent && alignContent !== 'flex-start') {\r\n flexStyles.alignContent = alignContent\r\n }\r\n\r\n // 同时设置到 ctx.prop.style 和 ctx.prop.props.style\r\n // form-create 会将 prop.style 应用到组件上,但有时也需要 prop.props.style\r\n // 保留已有的 prop.style 和 prop.props.style,然后合并新的样式\r\n const existingPropStyle = ctx.prop.style || {}\r\n const existingPropsStyle = ctx.prop.props?.style || {}\r\n\r\n // 合并样式到 ctx.prop.style(保留已有样式,新的样式优先)\r\n ctx.prop.style = {\r\n ...existingPropStyle,\r\n ...flexStyles\r\n }\r\n\r\n // 同时也合并到 props.style,确保样式生效\r\n if (!ctx.prop.props) {\r\n ctx.prop.props = {}\r\n }\r\n ctx.prop.props.style = {\r\n ...existingPropsStyle,\r\n ...flexStyles\r\n }\r\n\r\n // 确保 children 存在\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 为 flex 容器的所有子组件设置 col: false,避免被 a-col 包装\r\n // 这样可以确保子组件直接作为 flex 子项,而不是占满整行\r\n if (ctx.rule.children && Array.isArray(ctx.rule.children)) {\r\n ctx.rule.children.forEach((child) => {\r\n if (\r\n child &&\r\n typeof child === 'object' &&\r\n !child.type === 'DragTool' &&\r\n !child.type === 'DragBox'\r\n ) {\r\n // 只有当 col 未设置或为默认值时才设置\r\n if (child.col === undefined || child.col === null) {\r\n child.col = false\r\n } else if (\r\n child.col &&\r\n typeof child.col === 'object' &&\r\n child.col.show !== false\r\n ) {\r\n child.col.show = false\r\n }\r\n }\r\n })\r\n }\r\n },\r\n render(children, ctx) {\r\n // 使用 Ant Design Vue 的 Flex 组件\r\n const prop = { ...ctx.prop }\r\n\r\n // 将 type 设置为 'a-flex',form-create 会自动识别\r\n if (prop.type === 'flex') {\r\n prop.type = 'a-flex'\r\n }\r\n\r\n // 读取 flexDirection 来判断是否是垂直方向\r\n const props = ctx.rule.props || {}\r\n const flexDirection = props.flexDirection || ctx.rule.flexDirection || 'row'\r\n const isVertical =\r\n flexDirection === 'column' || flexDirection === 'column-reverse'\r\n\r\n // 初始化 prop.props 和 prop.class(如果需要的话)\r\n if (!prop.props) {\r\n prop.props = {}\r\n }\r\n\r\n // 添加自定义 class 的辅助函数\r\n const ensureClass = () => {\r\n if (!prop.class) {\r\n prop.class = []\r\n }\r\n if (!Array.isArray(prop.class)) {\r\n prop.class = [prop.class]\r\n }\r\n }\r\n\r\n // 读取 childFlex 配置\r\n const childFlex = ctx.rule.props?.childFlex ?? ctx.rule.childFlex\r\n if (childFlex !== undefined && childFlex !== null && childFlex !== '') {\r\n ensureClass()\r\n if (!prop.class.includes('_fc-flex-container')) {\r\n prop.class.push('_fc-flex-container')\r\n }\r\n\r\n // 通过 CSS 变量传递 flex 值\r\n const flexValue = String(childFlex).trim()\r\n // 合并到样式中,设置 CSS 变量\r\n if (!prop.props.style) {\r\n prop.props.style = {}\r\n }\r\n prop.props.style['--fc-child-flex'] = flexValue\r\n\r\n // 同时也设置到 prop.style\r\n if (!prop.style) {\r\n prop.style = {}\r\n }\r\n prop.style['--fc-child-flex'] = flexValue\r\n }\r\n\r\n // 如果是垂直方向,读取 childWidth 配置(默认 100%)\r\n if (isVertical) {\r\n const childWidth =\r\n ctx.rule.props?.childWidth ?? ctx.rule.childWidth ?? '100%'\r\n\r\n ensureClass()\r\n if (!prop.class.includes('_fc-flex-container')) {\r\n prop.class.push('_fc-flex-container')\r\n }\r\n if (!prop.class.includes('_fc-flex-vertical')) {\r\n prop.class.push('_fc-flex-vertical')\r\n }\r\n\r\n // 通过 CSS 变量传递宽度值\r\n const widthValue = String(childWidth).trim()\r\n if (!prop.props.style) {\r\n prop.props.style = {}\r\n }\r\n prop.props.style['--fc-child-width'] = widthValue\r\n\r\n if (!prop.style) {\r\n prop.style = {}\r\n }\r\n prop.style['--fc-child-width'] = widthValue\r\n }\r\n\r\n // children 会通过 form-create 的机制自动渲染\r\n const childrenNodes = children || []\r\n\r\n // 将 flex 容器包装在 col 中,确保它占满整行(span: 24)\r\n // 这样 flex 容器才能有足够的宽度,子项才能自适应展示\r\n return ctx.vNode.col(\r\n { props: { span: 24 } },\r\n {\r\n default: () => [ctx.vNode.make('a-flex', prop, childrenNodes)]\r\n }\r\n )\r\n }\r\n}\r\n","export default {\r\n name: 'space',\r\n mergeProp(ctx) {\r\n // 从 props 中读取 Space 组件配置\r\n const props = ctx.rule.props || {}\r\n const direction = props.direction || ctx.rule.direction || 'horizontal'\r\n const size = props.size || ctx.rule.size || 'small'\r\n const align = props.align || ctx.rule.align\r\n const wrap = props.wrap || ctx.rule.wrap || false\r\n\r\n // 设置到 prop.props,用于传递给 a-space 组件\r\n if (!ctx.prop.props) {\r\n ctx.prop.props = {}\r\n }\r\n\r\n // 映射 Ant Design Vue Space 组件的 props\r\n ctx.prop.props.direction = direction\r\n ctx.prop.props.size = size\r\n if (align !== undefined && align !== null && align !== '') {\r\n ctx.prop.props.align = align\r\n }\r\n ctx.prop.props.wrap = wrap\r\n\r\n // 合并样式,确保 Space 容器占满整行\r\n const existingStyle = ctx.rule.style || {}\r\n const spaceStyles = {\r\n width: '100%',\r\n ...existingStyle\r\n }\r\n\r\n // 同时设置到 ctx.prop.style 和 ctx.prop.props.style\r\n if (!ctx.prop.style) {\r\n ctx.prop.style = {}\r\n }\r\n ctx.prop.style = { ...ctx.prop.style, ...spaceStyles }\r\n\r\n if (!ctx.prop.props.style) {\r\n ctx.prop.props.style = {}\r\n }\r\n ctx.prop.props.style = { ...ctx.prop.props.style, ...spaceStyles }\r\n\r\n // 确保 children 存在\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 为 space 容器的所有子组件设置 col: false,避免被 a-col 包装\r\n // Space 组件会自动处理子项间距,不需要 col 包装\r\n if (ctx.rule.children && Array.isArray(ctx.rule.children)) {\r\n ctx.rule.children.forEach((child) => {\r\n if (\r\n child &&\r\n typeof child === 'object' &&\r\n child.type !== 'DragTool' &&\r\n child.type !== 'DragBox'\r\n ) {\r\n // 只有当 col 未设置或为默认值时才设置\r\n if (child.col === undefined || child.col === null) {\r\n child.col = false\r\n } else if (\r\n child.col &&\r\n typeof child.col === 'object' &&\r\n child.col.show !== false\r\n ) {\r\n child.col.show = false\r\n }\r\n }\r\n })\r\n }\r\n },\r\n render(children, ctx) {\r\n // 使用 Ant Design Vue 的 Space 组件\r\n const prop = { ...ctx.prop }\r\n\r\n // 读取 compact 配置,决定使用 Space 还是 Space.Compact\r\n const props = ctx.rule.props || {}\r\n const compact = props.compact || ctx.rule.compact || false\r\n\r\n // 根据 compact 属性决定使用哪个组件\r\n if (compact) {\r\n // 使用 Space.Compact 紧凑布局\r\n prop.type = 'a-space-compact'\r\n } else {\r\n // 使用普通 Space 组件\r\n if (prop.type === 'space') {\r\n prop.type = 'a-space'\r\n }\r\n }\r\n\r\n // children 会通过 form-create 的机制自动渲染\r\n const childrenNodes = children || []\r\n\r\n // 将 space 容器包装在 col 中,确保它占满整行(span: 24)\r\n // 这样 space 容器才能有足够的宽度\r\n return ctx.vNode.col(\r\n { props: { span: 24 } },\r\n {\r\n default: () => [ctx.vNode.make(prop.type, prop, childrenNodes)]\r\n }\r\n )\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 flex: PRE + 'Flex',\n space: PRE + 'Space',\n 'space-compact': PRE + 'SpaceCompact',\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 // 检查父容器是否是 flex 或 space 类型,如果是,自动设置 col: false 避免被 a-col 包装\r\n // 需要在合并完 col 后再检查,确保能覆盖默认值\r\n if (ctx.parent && ctx.parent.rule) {\r\n const parentType = ctx.parent.rule.type\r\n const parentMenu = ctx.parent.rule._menu\r\n if (\r\n parentType === 'flex' ||\r\n parentType === 'a-flex' ||\r\n parentMenu?.name === 'flex' ||\r\n parentType === 'space' ||\r\n parentType === 'a-space' ||\r\n parentMenu?.name === 'space'\r\n ) {\r\n // 如果父容器是 flex 或 space,强制设置 col 为 false,禁用 col 包装\r\n ctx.prop.col = false\r\n // 同时设置 rule.col 以确保在 makeWrap 中也能识别\r\n if (ctx.rule) {\r\n ctx.rule.col = false\r\n }\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\r\n // 检查父容器是否是 flex 或 space 类型,如果是,强制禁用 col 包装\r\n let shouldDisableCol = false\r\n if (ctx.parent && ctx.parent.rule) {\r\n const parentType = ctx.parent.rule.type\r\n const parentMenu = ctx.parent.rule._menu\r\n if (\r\n parentType === 'flex' ||\r\n parentType === 'a-flex' ||\r\n parentMenu?.name === 'flex' ||\r\n parentType === 'space' ||\r\n parentType === 'a-space' ||\r\n parentMenu?.name === 'space'\r\n ) {\r\n shouldDisableCol = true\r\n }\r\n }\r\n\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 // 如果父容器是 flex,或者 layout 是 inline,或者 col 被显式禁用,则不使用 col 包装\r\n return layout === 'inline' ||\r\n isFalse(_col) ||\r\n isFalse(col.show) ||\r\n shouldDisableCol\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\nfunction useText(maker) {\n maker.text = creatorFactory('text')\n}\n\nfunction useFlex(maker) {\n maker.flex = creatorFactory('flex')\n}\n\nfunction useSpace(maker) {\n maker.space = creatorFactory('space')\n}\n\nuseAlias(maker)\nuseSlider(maker)\nuseFrame(maker)\nuseUpload(maker)\nuseSelect(maker)\nuseCusStoreSelect(maker)\nuseCusUserSelect(maker)\nuseText(maker)\nuseFlex(maker)\nuseSpace(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 '../style/icon.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$6","name","_hoisted_1","class","_openBlock","openBlock","_createElementBlock","_cache","_createElementVNode","height","width","xmlns","viewBox","createElementVNode","d","fill","script$5","defineComponent","props","modelValue","type","Array","default","options","sourceItems","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","some","newItem","clearValue","_hoisted_6","_hoisted_8","opacity","_hoisted_11","_hoisted_12","_createCommentVNode","createCommentVNode","_ctx","createElementBlock","_Fragment","key","tabindex","_renderList","renderList","index","title","_toDisplayString","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$4","components","CusSelect","formCreateInject","field","extraQuery","extraQueryFn","Function","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","assign","message","parent","postMessage","mergeOptions","handleUpdate","handleChange","callback","newItems","triggerValidate","$nextTick","api","validateField","catch","$parent","$options","fapi","_createVNode","createVNode","_component_CusSelect","model-value","source-items","max-tag-count","onUpdate:modelValue","onChange","script$3","selectType","script$2","columns","required","filterEmptyColumn","deletable","addable","reactive","submitBtn","resetBtn","min","updateTable","deep","formCreateInject.preview","n","emptyRule","children","colspan","rule","trs","Form","markRaw","form","$form","copyTrs","oldValue","_isEmpty","native","subRule","textAlign","preview","t","formChange","updateValue","tr","idx","getChildrenFormData","v","flag","keys","k","str","setRawData","formData","raw","setChildrenFormData","splice","clearEmpty","addEmpty","addRaw","push","delRaw","updateRaw","parseJson","indexOf","innerText","loadRule","header","body","column","align","toJson","border","cellspacing","cellpadding","created","_normalizeClass","_fc-disabled","$props","_createBlock","_resolveDynamicComponent","$data","extendOption","onEmitEvent","_component_a_button","font-weight","script$1","$slots","_hoisted_2","_renderSlot","script","color","colStyle","w","is","upload","frame","group","subForm","QuestionCircleOutlined","CusStoreSelect","CusUserSelect","TableForm","TableFormView","TableFormColumnView","checkbox","modelField","mergeProp","ctx","prop","hasProperty","radio","select","fetchData","effectData","loading","render","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","text","loadChildren","_ctx$prop$props","_ctx$prop$props2","bindField","template","setTimeout","$handle","loadStrVar","getValue","sync","refresh","renderChildren","_ctx$rule","currentChildren","join","_ctx$prop$props3","_ctx$prop$props4","_ctx$prop$props5","bindMode","loadDataConfig","attr","to","modify","wait","effect","loadData","_textLoadDataWatched","loadDataRef","toRef","newVal","oldVal","formCreateChild","innerHTML","make","input","idate","textarea","search","password","timePicker","tree","fieldNames","checkedKeys","checkable","row","_","col","span","parsers","toFormValue","toValue","formValue","vnode","on","originalUpdateModelValue","nextTick","fieldName","fieldCtx","getFieldCtx","id","$manager","originalChange","inject","flexDirection","flexWrap","justifyContent","alignItems","alignContent","vertical","justify","flex-start","flex-end","center","space-between","space-around","space-evenly","baseline","stretch","gap","existingStyle","display","userDisplay","_fd","_fw","_jc","_ai","_ac","otherStyles","flexStyles","existingPropStyle","existingPropsStyle","child","show","_ctx$rule$props$child","_ctx$rule$props","isVertical","ensureClass","childFlex","includes","flexValue","trim","_ref","_ctx$rule$props$child2","_ctx$rule$props2","childWidth","widthValue","childrenNodes","direction","size","wrap","spaceStyles","compact","alias","tooltip","PRE","popover","button","icon","slider","rate","timeRangePicker","rangePicker","switch","inputNumber","treeSelect","inputPassword","formItem","flex","space","space-compact","autoComplete","transfer","array","object","tidy","isFalse","tidyRule","_rule","manager","validate","Promise","validateFields","clearValidateState","fItem","vm","refs","wrapRef","clearValidate","tidyOptions","tidyBool","def","info","placement","mergeProps","parentType","parentMenu","_menu","onPreview","originalOnPreview","sendPreviewMessage","file","url","uid","timestamp","apply","arguments","getDefaultOptions","hideRequiredMark","layout","labelAlign","labelCol","wrapperCol","validateOnRuleChange","gutter","click","adapterValidate","validator","resolve","reject","err","update","submit","preventDefault","beforeRender","ref","extend","className","model","slotLen","setSlot","makeFormBtn","$r","getSlots","makeRow","makeWrap","uni","isTitle","_col","cls","shouldDisableCol","hasFeedback","rules","injectValidate","mergeClass","makeInfo","makeCol","_ctx$refRule","_ctx$refRule2","titleProp","infoProp","isTip","titleSlot","getSlot","refRule","__$title","_ctx$refRule3","__$info","slot","_prop","vn","makeSubmitBtn","makeResetBtn","colon","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","invoke","onSubmit","request","config","action","fetch","throttle","fn","delay","lastTime","context","debounce","timer","clearTimeout","auto","number","time","useAlias","useSlider","types","frameInputs","frameFiles","frameImages","frameInputOne","frameFileOne","frameImageOne","maxLength","frameInput","frameFile","frameImage","useFrame","image","uploadFileOne","uploadImageOne","uploadType","uploadImage","uploadFile","useUpload","selectMultiple","mode","selectTags","selectCombobox","cusStoreSelect","storeSelect","useCusStoreSelect","cusUserSelect","userSelect","useCusUserSelect","useText","useFlex","useSpace","modelFields","load","parseVal","clearProp","_rule$__fc__$refRule","empty","__fc__","match","getLocale","getProp","install","FormCreate","componentAlias","setModelField","component","register","parser","makers","antd","useApp","app","use","FormCreateFactory","ui","version","attrs","normal","formCreate"],"mappings":"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"}