@longhongguo/form-create-ant-design-vue 3.3.13 → 3.3.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/form-create.esm.js +2 -2
- package/dist/form-create.esm.js.map +1 -1
- package/dist/form-create.js +2 -2
- package/dist/form-create.js.map +1 -1
- package/package.json +1 -1
- package/src/parsers/accTable.js +23 -131
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-create.esm.js","sources":["../src/components/icon/QuestionCircleOutlined.vue","../src/components/icon/QuestionCircleOutlined.vue?vue&type=template&id=72badc20&lang.js","../src/components/CusSelect/index.vue","../src/components/CusSelect/index.vue?vue&type=template&id=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/rangePicker.js","../src/parsers/timeRangePicker.js","../src/parsers/cusStoreSelect.js","../src/parsers/cusUserSelect.js","../src/parsers/flex.js","../src/parsers/space.js","../src/parsers/spin.js","../src/parsers/div.js","../src/parsers/alert.js","../src/parsers/card.js","../src/parsers/accTable.js","../src/parsers/index.js","../src/core/alias.js","../src/core/manager.js","../src/core/config.js","../src/core/maker.js","../src/core/test.js","../src/core/host.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 '@longhongguo/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 // readOnly 属性的处理:如果设置了 readOnly,强制设置 disabled = true\n // 从 rule.props 或 ctx.prop.props 中读取 readOnly\n const isReadOnly =\n ctx.rule.props?.readOnly === true || props.readOnly === true\n if (isReadOnly) {\n props.disabled = 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\nimport { parseFn } from '@form-create/utils/lib/json'\r\nimport is from '@form-create/utils/lib/type'\r\nimport deepSet from '@form-create/utils/lib/deepset'\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 // 处理 loadData 函数\r\n if (props.loadData) {\r\n const api = ctx.$handle?.api\r\n const rule = ctx.rule\r\n const ctxRef = ctx\r\n\r\n // 解析函数(如果是字符串)\r\n let parsedFn = is.String(props.loadData)\r\n ? parseFn(props.loadData)\r\n : props.loadData\r\n\r\n // 如果不是函数,尝试包装\r\n if (!is.Function(parsedFn) && is.String(props.loadData)) {\r\n try {\r\n const code = props.loadData.trim()\r\n if (\r\n !code.startsWith('function') &&\r\n !code.startsWith('[[FORM-CREATE-PREFIX-function') &&\r\n !code.startsWith('$FNX:')\r\n ) {\r\n parsedFn = new Function(\r\n 'selectedOptions',\r\n 'options',\r\n 'updateOptions',\r\n 'api',\r\n 'rule',\r\n code\r\n )\r\n }\r\n } catch (e) {\r\n // 解析 loadData 失败,静默处理\r\n }\r\n }\r\n\r\n // 保存原始的 parsedFn,用于回显时调用(需要在 if 块外定义)\r\n let originalLoadDataFn = null\r\n\r\n if (is.Function(parsedFn)) {\r\n // 保存原始的 parsedFn,用于回显时调用\r\n originalLoadDataFn = parsedFn\r\n\r\n // 包装 loadData 函数\r\n props.loadData = function (selectedOptions) {\r\n if (!selectedOptions || selectedOptions.length === 0) return\r\n\r\n const targetOption = selectedOptions[selectedOptions.length - 1]\r\n\r\n if (targetOption?.isLeaf === true) {\r\n return\r\n }\r\n\r\n const options = props.options || []\r\n\r\n // 创建 updateOptions 函数,完全按照 effect.fetch 的方式\r\n // 关键:effect.fetch 使用 deepSet(inject.getProp(), 'props.options', val) 然后 api.sync(rule)\r\n const updateOptions = () => {\r\n // 关键:创建新数组时,同时创建新对象,确保引用完全改变\r\n // 这样可以触发 Vue 的响应式更新,即使对象属性被修改了\r\n const currentOptions = props.options || []\r\n\r\n // 递归查找并更新选项的函数\r\n // 通过 value 路径来查找,避免引用问题\r\n const updateOptionRecursive = (\r\n optionsList,\r\n pathValues,\r\n depth,\r\n newChildren\r\n ) => {\r\n if (!pathValues || pathValues.length === 0) {\r\n // 如果没有路径,直接返回深拷贝的选项\r\n return optionsList.map((item) => ({\r\n ...item,\r\n children: item.children\r\n ? item.children.map((child) => ({ ...child }))\r\n : undefined\r\n }))\r\n }\r\n\r\n const currentValue = pathValues[depth]\r\n const isLast = depth === pathValues.length - 1\r\n\r\n return optionsList.map((item) => {\r\n const newItem = { ...item }\r\n\r\n // 如果当前项匹配路径的当前层级值\r\n if (\r\n (item.value !== undefined && item.value === currentValue) ||\r\n (item.id !== undefined && item.id === currentValue)\r\n ) {\r\n if (isLast) {\r\n // 是最后一个值(目标项),更新 children\r\n newItem.children = newChildren\r\n ? [...newChildren]\r\n : undefined\r\n newItem.loading = false\r\n // 保持其他属性不变,但深拷贝 children\r\n return newItem\r\n } else {\r\n // 不是最后一个,需要递归更新其 children\r\n if (item.children && item.children.length > 0) {\r\n // 递归更新子项\r\n newItem.children = updateOptionRecursive(\r\n item.children,\r\n pathValues,\r\n depth + 1,\r\n newChildren\r\n )\r\n } else {\r\n // 如果没有 children,保持 undefined\r\n newItem.children = undefined\r\n }\r\n return newItem\r\n }\r\n }\r\n\r\n // 不匹配的项,也需要递归处理其 children(以防路径在其他分支)\r\n if (item.children && item.children.length > 0) {\r\n newItem.children = updateOptionRecursive(\r\n item.children,\r\n pathValues,\r\n depth,\r\n newChildren\r\n )\r\n } else {\r\n // 如果没有 children,深拷贝基本结构\r\n newItem.children = undefined\r\n }\r\n\r\n return newItem\r\n })\r\n }\r\n\r\n // 从 selectedOptions 中提取 value 路径\r\n const pathValues = selectedOptions.map((opt) => opt.value || opt.id)\r\n\r\n // 使用递归函数更新选项(从第0层开始)\r\n const newOptions = updateOptionRecursive(\r\n currentOptions,\r\n pathValues,\r\n 0,\r\n targetOption ? targetOption.children : undefined\r\n )\r\n\r\n // 完全按照 effect.fetch 的方式:使用 deepSet 在响应式对象上设置值\r\n // effect.fetch 使用: deepSet(inject.getProp(), 'props.options', val)\r\n // inject.getProp() 返回 ctx.effectData('fetch')\r\n // 所以我们应该在同一个位置设置:ctxRef.effectData('fetch')\r\n const fetchData = ctxRef.effectData('fetch')\r\n if (fetchData) {\r\n // 关键:在 fetchData 上设置,就像 effect.fetch 那样\r\n deepSet(fetchData, 'props.options', newOptions)\r\n }\r\n\r\n // 同时直接更新 props.options(这是最终传递给组件的值)\r\n props.options = newOptions\r\n\r\n // 同步到 ctx.prop.props.options(确保 mergeRule 能获取到最新值)\r\n if (ctxRef.prop?.props) {\r\n ctxRef.prop.props.options = newOptions\r\n }\r\n\r\n // 同步到 rule.props.options\r\n if (ctxRef.rule?.props) {\r\n ctxRef.rule.props.options = newOptions\r\n }\r\n\r\n // 调用 api.sync 触发更新,就像 effect.fetch 那样\r\n if (api && rule) {\r\n api.sync(rule)\r\n }\r\n\r\n // 刷新组件\r\n if (ctxRef.$handle) {\r\n ctxRef.$handle.refresh()\r\n }\r\n }\r\n\r\n // 关键:在调用用户函数之前,立即设置 loading 并更新\r\n // 这样确保 loading 状态能立即显示\r\n if (targetOption) {\r\n targetOption.loading = true\r\n updateOptions()\r\n }\r\n\r\n // 调用用户函数\r\n const result = parsedFn.call(\r\n this,\r\n selectedOptions,\r\n options,\r\n updateOptions,\r\n api,\r\n rule\r\n )\r\n\r\n // 如果用户函数返回 Promise,等待完成\r\n if (result && typeof result.then === 'function') {\r\n return result.finally(() => {\r\n updateOptions()\r\n })\r\n }\r\n\r\n return result\r\n }\r\n }\r\n\r\n // 处理回显时的数据加载 - 当 value 变化时触发(包括初始值和 setValue)\r\n // 使用一个函数来处理,可以在多个地方调用\r\n const triggerLoadDataForValue = (valueToLoad) => {\r\n if (\r\n !valueToLoad ||\r\n !Array.isArray(valueToLoad) ||\r\n valueToLoad.length <= 1 ||\r\n !props.loadData ||\r\n typeof props.loadData !== 'function'\r\n ) {\r\n return\r\n }\r\n\r\n // 延迟执行,等待 effect.fetch 完成第一级数据加载\r\n const timerKey = `_loadDataTimer_${ctx.rule._fc_id || Date.now()}`\r\n if (ctx.rule[timerKey]) {\r\n clearTimeout(ctx.rule[timerKey])\r\n }\r\n\r\n ctx.rule[timerKey] = setTimeout(() => {\r\n let retryCount = 0\r\n const maxRetries = 50 // 最多重试50次,即5秒\r\n\r\n const loadInitialData = async () => {\r\n retryCount++\r\n const fetchData = ctxRef.effectData('fetch')\r\n\r\n // 如果超过最大重试次数,停止\r\n if (retryCount > maxRetries) {\r\n return\r\n }\r\n\r\n // 如果还在加载第一级数据,等待\r\n if (fetchData && fetchData.loading === true) {\r\n setTimeout(loadInitialData, 100)\r\n return\r\n }\r\n\r\n let currentOptions = props.options || []\r\n\r\n if (!currentOptions || currentOptions.length === 0) {\r\n // 检查 fetchData 中是否有 options\r\n if (fetchData && fetchData.props && fetchData.props.options) {\r\n currentOptions = fetchData.props.options\r\n props.options = currentOptions\r\n } else {\r\n setTimeout(loadInitialData, 100)\r\n return\r\n }\r\n }\r\n\r\n if (!currentOptions || currentOptions.length === 0) {\r\n return\r\n }\r\n\r\n // 递归加载缺失的数据\r\n const loadMissingData = async (pathValues, startDepth) => {\r\n if (startDepth >= pathValues.length - 1) {\r\n return\r\n }\r\n\r\n // 重新获取最新的 options\r\n currentOptions = props.options || []\r\n\r\n // 构建 selectedOptions(从根到当前层级)\r\n const selectedOptions = []\r\n let currentLevelOptions = currentOptions\r\n for (let i = 0; i <= startDepth; i++) {\r\n const val = pathValues[i]\r\n const option = currentLevelOptions.find(\r\n (opt) => opt.value === val || opt.id === val\r\n )\r\n if (option) {\r\n selectedOptions.push(option)\r\n currentLevelOptions = option.children || []\r\n } else {\r\n return\r\n }\r\n }\r\n\r\n const currentOption = selectedOptions[startDepth]\r\n\r\n // 如果已经是叶子节点,不需要加载\r\n if (currentOption.isLeaf === true) {\r\n return\r\n }\r\n\r\n // 检查是否需要加载子级数据\r\n const nextValue = pathValues[startDepth + 1]\r\n if (nextValue === undefined || nextValue === null) {\r\n return\r\n }\r\n\r\n // 检查是否已有子级数据\r\n const hasChildren =\r\n currentOption.children &&\r\n Array.isArray(currentOption.children) &&\r\n currentOption.children.length > 0\r\n\r\n if (!hasChildren) {\r\n // 需要触发 loadData 加载\r\n // 设置 loading 状态\r\n currentOption.loading = true\r\n\r\n try {\r\n const result = props.loadData(selectedOptions)\r\n\r\n // 如果返回 Promise,等待完成\r\n if (result && typeof result.then === 'function') {\r\n await result\r\n }\r\n\r\n // 等待数据更新\r\n await new Promise((resolve) => setTimeout(resolve, 300))\r\n\r\n // 继续加载下一级\r\n if (startDepth + 1 < pathValues.length - 1) {\r\n await loadMissingData(pathValues, startDepth + 1)\r\n }\r\n } catch (error) {\r\n currentOption.loading = false\r\n }\r\n } else {\r\n // 已经有 children,直接继续加载下一级\r\n await loadMissingData(pathValues, startDepth + 1)\r\n }\r\n }\r\n\r\n // 开始加载数据\r\n loadMissingData(valueToLoad, 0).catch(() => {\r\n // 静默处理错误\r\n })\r\n }\r\n\r\n loadInitialData()\r\n }, 500)\r\n }\r\n\r\n // 在 mergeProp 中触发(处理初始值和 setValue 的情况)\r\n const currentValue = ctx.rule.value\r\n // 检查 value 是否变化(通过比较字符串化的值)\r\n const valueKey = JSON.stringify(currentValue || [])\r\n const lastValueKey = ctx.rule._lastLoadDataValueKey\r\n\r\n if (\r\n valueKey !== lastValueKey &&\r\n currentValue &&\r\n Array.isArray(currentValue)\r\n ) {\r\n ctx.rule._lastLoadDataValueKey = valueKey\r\n triggerLoadDataForValue(currentValue)\r\n }\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 mounted(ctx) {\r\n // mounted 时也触发一次,确保初始值能正确加载\r\n const value = ctx.rule.value\r\n const props = ctx.prop.props\r\n\r\n if (value && Array.isArray(value) && value.length > 1 && props.loadData) {\r\n // 延迟一点,确保 mergeProp 已完成\r\n setTimeout(() => {\r\n const loadDataFn = ctx.prop.props.loadData\r\n if (loadDataFn && typeof loadDataFn === 'function') {\r\n // 重新触发一次加载逻辑(会通过 mergeProp 中的逻辑处理)\r\n // 通过触发 value 变化来触发加载\r\n ctx.rule._lastLoadDataValueKey = null\r\n }\r\n }, 100)\r\n }\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 mounted(ctx) {\n // 预览模式下,为 textarea 设置自适应高度\n if (\n ctx.prop.props?.type === 'textarea' &&\n ctx.prop.props?.readOnly &&\n ctx.$handle?.preview === true\n ) {\n const adjustTextareaHeight = (textareaEl) => {\n if (!textareaEl) return\n // 重置高度,然后设置为 scrollHeight\n textareaEl.style.height = 'auto'\n const scrollHeight = textareaEl.scrollHeight\n if (scrollHeight > 0) {\n textareaEl.style.height = scrollHeight + 'px'\n }\n textareaEl.style.overflow = 'hidden'\n }\n\n // 延迟执行,确保 DOM 已完全渲染\n setTimeout(() => {\n const el = ctx.el\n if (!el) return\n\n // 查找 textarea 元素\n const textarea =\n el.querySelector('textarea.ant-input') || el.querySelector('textarea')\n if (!textarea) return\n\n // 首次调整高度\n adjustTextareaHeight(textarea)\n\n // 使用 MutationObserver 监听内容变化\n if (typeof MutationObserver !== 'undefined') {\n const observer = new MutationObserver(() => {\n adjustTextareaHeight(textarea)\n })\n\n observer.observe(textarea, {\n attributes: true,\n attributeFilter: ['value'],\n childList: true,\n subtree: true,\n characterData: true\n })\n\n // 定期检查并调整(备用方案)\n const intervalId = setInterval(() => {\n adjustTextareaHeight(textarea)\n }, 200)\n\n // 在组件销毁时清理\n if (ctx.$handle && ctx.$handle.vm) {\n ctx.$handle.vm.$once('hook:beforeUnmount', () => {\n observer.disconnect()\n clearInterval(intervalId)\n })\n }\n }\n }, 100)\n }\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 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 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 { 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 // 读取 resetMarginBottom 配置,用于重置包裹 flex 的 ant-form-item 的 margin-bottom\r\n const resetMarginBottom =\r\n props.resetMarginBottom ?? ctx.rule.resetMarginBottom ?? false\r\n if (resetMarginBottom) {\r\n // 将 class 添加到 wrap 配置中,使其应用到包裹 flex 的 ant-form-item 上\r\n if (!ctx.rule.wrap) {\r\n ctx.rule.wrap = {}\r\n }\r\n if (typeof ctx.rule.wrap === 'object' && !ctx.rule.wrap.class) {\r\n ctx.rule.wrap.class = ''\r\n }\r\n const wrapClass =\r\n typeof ctx.rule.wrap === 'object'\r\n ? (ctx.rule.wrap.class || '').split(' ').filter(Boolean)\r\n : []\r\n if (!wrapClass.includes('_fc-reset-margin-bottom')) {\r\n wrapClass.push('_fc-reset-margin-bottom')\r\n if (typeof ctx.rule.wrap === 'object') {\r\n ctx.rule.wrap.class = wrapClass.join(' ')\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 // 读取 resetMarginBottom 配置,用于重置包裹 space 的 ant-form-item 的 margin-bottom\r\n const resetMarginBottom =\r\n props.resetMarginBottom ?? ctx.rule.resetMarginBottom ?? false\r\n if (resetMarginBottom) {\r\n // 将 class 添加到 wrap 配置中,使其应用到包裹 space 的 ant-form-item 上\r\n if (!ctx.rule.wrap) {\r\n ctx.rule.wrap = {}\r\n }\r\n if (typeof ctx.rule.wrap === 'object' && !ctx.rule.wrap.class) {\r\n ctx.rule.wrap.class = ''\r\n }\r\n const wrapClass = typeof ctx.rule.wrap === 'object' \r\n ? (ctx.rule.wrap.class || '').split(' ').filter(Boolean)\r\n : []\r\n if (!wrapClass.includes('_fc-reset-margin-bottom')) {\r\n wrapClass.push('_fc-reset-margin-bottom')\r\n if (typeof ctx.rule.wrap === 'object') {\r\n ctx.rule.wrap.class = wrapClass.join(' ')\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","import { hasProperty } from '@form-create/utils/lib/type'\r\n\r\nexport default {\r\n name: 'spin',\r\n mergeProp(ctx) {\r\n // 确保不显示标题\r\n if (!ctx.rule.wrap) {\r\n ctx.rule.wrap = {}\r\n }\r\n ctx.rule.wrap.title = false\r\n\r\n const props = ctx.prop.props || {}\r\n\r\n // 读取 containerMode 配置\r\n const containerMode =\r\n ctx.rule.containerMode ??\r\n ctx.rule.props?.containerMode ??\r\n ctx.prop.props?.containerMode ??\r\n true\r\n\r\n // 如果不是容器模式,清空 children\r\n if (!containerMode) {\r\n ctx.rule.children = []\r\n }\r\n\r\n if (!hasProperty(props, 'spinning')) {\r\n props.spinning =\r\n ctx.prop.props?.spinning ?? ctx.rule.props?.spinning ?? false\r\n }\r\n\r\n // 如果没有子组件且不是容器模式,spinning 不应该为 true(避免显示空加载状态)\r\n const hasChildren =\r\n ctx.rule.children &&\r\n Array.isArray(ctx.rule.children) &&\r\n ctx.rule.children.length > 0\r\n if (!containerMode && !hasChildren && props.spinning) {\r\n // 独立模式下如果没有内容,不建议显示加载状态\r\n // 但这里不强制修改,让用户自己控制\r\n }\r\n\r\n // 支持从多个位置读取配置\r\n const bindField =\r\n ctx.rule.bindField ||\r\n ctx.rule.props?.bindField ||\r\n ctx.prop.props?.bindField\r\n let bindMode =\r\n ctx.rule.bindMode || ctx.rule.props?.bindMode || ctx.prop.props?.bindMode\r\n\r\n // 如果没有设置 bindMode,根据是否有 bindField 自动判断\r\n if (!bindMode) {\r\n 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: 'props.spinning',\r\n modify: true,\r\n wait: 300,\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 === 'props.spinning'\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 }\r\n }\r\n }\r\n\r\n // 只在容器模式下处理 children\r\n if (containerMode) {\r\n // 确保 children 存在\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 确保子组件不被 a-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 },\r\n render(children, ctx) {\r\n // 获取 spinning 状态\r\n const props = ctx.prop.props || {}\r\n const spinning = props.spinning || false\r\n\r\n // 设置组件类型为 a-spin\r\n if (!ctx.prop.props) {\r\n ctx.prop.props = {}\r\n }\r\n\r\n // 映射 props\r\n ctx.prop.props.spinning = spinning\r\n\r\n // 如果有 tip,设置 tip prop\r\n const tip = ctx.rule.tip || ctx.rule.props?.tip || ctx.prop.props?.tip\r\n if (tip) {\r\n ctx.prop.props.tip = tip\r\n }\r\n\r\n // 如果有 delay,设置 delay prop\r\n const delay =\r\n ctx.rule.delay || ctx.rule.props?.delay || ctx.prop.props?.delay\r\n if (delay != null) {\r\n ctx.prop.props.delay = delay\r\n }\r\n\r\n // 如果有 size,设置 size prop\r\n const size = ctx.rule.size || ctx.rule.props?.size || ctx.prop.props?.size\r\n if (size) {\r\n ctx.prop.props.size = size\r\n }\r\n\r\n // 设置类型为 a-spin\r\n if (ctx.prop.type === 'spin') {\r\n ctx.prop.type = 'a-spin'\r\n }\r\n\r\n // 读取 containerMode 配置\r\n const containerMode =\r\n ctx.rule.containerMode ??\r\n ctx.rule.props?.containerMode ??\r\n ctx.prop.props?.containerMode ??\r\n true\r\n\r\n // 如果不是容器模式,不渲染 children,直接使用 defaultRender\r\n if (!containerMode) {\r\n return ctx.$render.defaultRender(ctx, undefined)\r\n }\r\n\r\n // 容器模式:使用传入的 children 参数\r\n // children 参数已经是渲染好的 vnodes,直接传递给 a-spin\r\n const childrenNodes =\r\n children && Array.isArray(children) ? children : children || []\r\n\r\n // 将 spin 容器包装在 col 中,确保它占满整行(span: 24)\r\n // 直接使用 vNode.make 来渲染 a-spin,并传入 childrenNodes(类似 flex 组件的处理方式)\r\n return ctx.vNode.col(\r\n { props: { span: 24 } },\r\n {\r\n default: () => [ctx.vNode.make('a-spin', ctx.prop, childrenNodes)]\r\n }\r\n )\r\n }\r\n}\r\n","export default {\r\n name: 'div',\r\n mergeProp(ctx) {\r\n // 确保 children 存在\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 为 div 容器的所有子组件设置 col: false,避免被 a-col 包装\r\n // 这样子组件可以直接作为 div 的子元素\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 // 使用简单的 div 元素作为容器\r\n const prop = { ...ctx.prop }\r\n\r\n // 确保 type 是 'div'\r\n if (prop.type === 'div') {\r\n prop.type = 'div'\r\n }\r\n\r\n // children 会通过 form-create 的机制自动渲染\r\n const childrenNodes = children || []\r\n\r\n // 直接返回 div,不使用 a-col 或 a-row 包装\r\n // 确保样式是自适应(width: 100% 可能会影响布局,所以不设置)\r\n if (!prop.props) {\r\n prop.props = {}\r\n }\r\n if (!prop.props.style) {\r\n prop.props.style = {}\r\n }\r\n // 宽高自适应,不设置固定值\r\n // 保留用户自定义的样式\r\n\r\n // 直接使用 vNode.make 渲染 div,不包装\r\n return ctx.vNode.make('div', prop, childrenNodes)\r\n }\r\n}\r\n\r\n","export default {\r\n name: 'aAlert',\r\n // Alert 是非输入组件,不需要 modelField\r\n mergeProp(ctx) {\r\n const props = ctx.prop.props || {}\r\n // 如果没有 message 但有 description,将 description 作为 message\r\n // 这样 Alert 会显示为小的样式(只有 message,没有 description)\r\n if ((!props.message || props.message === '') && props.description) {\r\n props.message = props.description\r\n delete props.description\r\n }\r\n },\r\n render(children, ctx) {\r\n // 使用默认渲染,通过 alias 映射到 aAlert 组件\r\n return ctx.$render.defaultRender(ctx, children)\r\n }\r\n}\r\n","export default {\r\n name: 'aCard',\r\n mergeProp(ctx) {\r\n // 确保 children 存在\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 为 Card 容器的所有子组件设置 col: false,避免被 a-col 包装\r\n // 这样子组件可以直接作为 Card 的子元素\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 // 使用默认渲染,通过 alias 映射到 aCard 组件\r\n return ctx.$render.defaultRender(ctx, children)\r\n }\r\n}\r\n\r\n","import { hasProperty } from '@form-create/utils/lib/type'\r\nimport { deepCopy } from '@form-create/utils/lib/deepextend'\r\nimport { h } from 'vue'\r\n\r\n// 简单的 getValue 函数,根据路径字符串获取嵌套对象的值\r\nfunction getValue(obj, path) {\r\n if (!obj || !path) return undefined\r\n const keys = path.split('.')\r\n let value = obj\r\n for (const key of keys) {\r\n if (value == null) return undefined\r\n value = value[key]\r\n }\r\n return value\r\n}\r\n\r\n// 文件加载时立即打印\r\nconsole.log('[accTable] ✅ accTable.js 文件已加载')\r\n\r\nexport default {\r\n name: 'accTable',\r\n init(ctx) {\r\n // 在初始化时就设置 beforeFetch 钩子,确保在第一次请求之前就已经添加\r\n console.log('[accTable] init 被调用')\r\n const rule = ctx.rule\r\n\r\n // 如果启用了分页且有远程数据源,在 init 时就添加 beforeFetch 钩子\r\n if (\r\n rule.effect?.fetch &&\r\n rule.props?.pagination &&\r\n typeof rule.props.pagination === 'object' &&\r\n rule.props.pagination.current !== undefined\r\n ) {\r\n const originalFetch = rule.effect.fetch\r\n if (typeof originalFetch === 'object') {\r\n const savedOriginalBeforeFetch = originalFetch.beforeFetch\r\n const isOurBeforeFetch =\r\n savedOriginalBeforeFetch &&\r\n savedOriginalBeforeFetch._accTablePaginationHook === true\r\n\r\n if (!isOurBeforeFetch) {\r\n console.log('[accTable] 在 init 中提前设置 beforeFetch 钩子')\r\n // 获取分页参数配置\r\n const pageParamName = rule.props?.paginationPageParam || 'page'\r\n const pageSizeParamName =\r\n rule.props?.paginationPageSizeParam || 'pageSize'\r\n const paramType = rule.props?.paginationParamType || 'query'\r\n const savedRule = rule\r\n\r\n originalFetch.beforeFetch = (config, { api }) => {\r\n const currentPagination = savedRule?.props?.pagination\r\n if (currentPagination && typeof currentPagination === 'object') {\r\n const currentPage = currentPagination.current || 1\r\n const currentPageSize = currentPagination.pageSize || 10\r\n\r\n if (paramType === 'query') {\r\n config.query = {\r\n ...(config.query || {}),\r\n [pageParamName]: currentPage,\r\n [pageSizeParamName]: currentPageSize\r\n }\r\n } else {\r\n config.data = {\r\n ...(config.data || {}),\r\n [pageParamName]: currentPage,\r\n [pageSizeParamName]: currentPageSize\r\n }\r\n }\r\n }\r\n\r\n // 调用原始的 beforeFetch 钩子(如果存在)\r\n if (\r\n savedOriginalBeforeFetch &&\r\n typeof savedOriginalBeforeFetch === 'function'\r\n ) {\r\n try {\r\n const result = savedOriginalBeforeFetch(config, { api })\r\n if (result && typeof result.then === 'function') {\r\n return result.catch((err) => {\r\n console.error(\r\n '[accTable] 原始 beforeFetch 钩子执行出错:',\r\n err\r\n )\r\n return Promise.resolve()\r\n })\r\n }\r\n return result\r\n } catch (err) {\r\n console.error('[accTable] 原始 beforeFetch 钩子执行出错:', err)\r\n }\r\n }\r\n }\r\n\r\n originalFetch.beforeFetch._accTablePaginationHook = true\r\n console.log('[accTable] ✅ 在 init 中 beforeFetch 钩子已添加')\r\n }\r\n }\r\n }\r\n },\r\n mergeProp(ctx) {\r\n console.log('[accTable] ========== mergeProp 被调用 ==========')\r\n console.log('[accTable] 调用堆栈:', new Error().stack)\r\n const props = ctx.prop.props || {}\r\n const rule = ctx.rule\r\n const api = ctx.api\r\n\r\n console.log('[accTable] mergeProp 基本信息:', {\r\n ruleType: rule.type,\r\n ruleName: rule.name,\r\n hasEffect: !!rule.effect,\r\n hasFetch: !!rule.effect?.fetch,\r\n fetchValue: rule.effect?.fetch,\r\n fetchType: typeof rule.effect?.fetch,\r\n hasPagination: !!rule.props?.pagination,\r\n paginationConfig: rule.props?.pagination,\r\n paginationType: typeof rule.props?.pagination,\r\n allRuleProps: Object.keys(rule.props || {})\r\n })\r\n\r\n // 处理列配置 - 每次都要更新,确保 width 等属性变化时能生效\r\n let columns = rule.props?.columns || []\r\n // Struct 组件返回的是数组对象,直接使用;如果是字符串,尝试解析为 JSON(向后兼容)\r\n if (typeof columns === 'string') {\r\n try {\r\n const parsed = JSON.parse(columns)\r\n if (Array.isArray(parsed)) {\r\n columns = parsed\r\n }\r\n } catch (e) {\r\n console.warn('accTable columns parse error:', e)\r\n columns = []\r\n }\r\n }\r\n // 确保 columns 是数组\r\n if (!Array.isArray(columns)) {\r\n columns = []\r\n }\r\n // 过滤掉 hidden 为 true 的列,同时确保所有其他属性(如 width、align、fixed 等)都被保留\r\n const processedColumns = columns\r\n .filter((col) => !col || !col.hidden)\r\n .map((col) => {\r\n // 创建列对象的副本,确保所有属性都被保留(包括 width、align、fixed 等)\r\n const column = { ...col }\r\n\r\n // 处理 width 属性:确保它能够正确传递\r\n // Ant Design Vue Table 支持 width 为 number 或 string\r\n // 如果 width 是纯数字字符串(如 \"100\"),可以转换为数字以便更好的性能\r\n // 如果 width 是带单位的字符串(如 \"100px\"),保持字符串\r\n if (\r\n column.width !== undefined &&\r\n column.width !== null &&\r\n column.width !== ''\r\n ) {\r\n if (typeof column.width === 'string') {\r\n // 如果是纯数字字符串,转换为数字\r\n const numValue = Number(column.width)\r\n if (\r\n !isNaN(numValue) &&\r\n isFinite(numValue) &&\r\n column.width.trim() === String(numValue)\r\n ) {\r\n column.width = numValue\r\n }\r\n // 如果不是纯数字(如 \"100px\"),保持字符串\r\n }\r\n // 如果已经是数字,直接使用\r\n }\r\n\r\n // 处理单元格表单组件\r\n if (\r\n column.cellType &&\r\n ['input', 'select', 'radio'].includes(column.cellType)\r\n ) {\r\n const cellType = column.cellType\r\n const dataIndex = column.dataIndex\r\n // 确保 cellOptions 是数组\r\n let cellOptions = column.cellOptions\r\n if (!Array.isArray(cellOptions)) {\r\n cellOptions = []\r\n }\r\n const cellProps = column.cellProps || {}\r\n\r\n // 创建 customRender 函数\r\n column.customRender = ({ text, record, index }) => {\r\n const cellValue = record && dataIndex ? record[dataIndex] : text\r\n // 在 render 函数内部再次确保 cellOptions 是数组(因为可能在外部被修改)\r\n const options = Array.isArray(column.cellOptions)\r\n ? column.cellOptions\r\n : []\r\n\r\n if (cellType === 'input') {\r\n // 渲染 input 组件 - 使用组件名字符串\r\n return h('a-input', {\r\n value: cellValue,\r\n onChange: (e) => {\r\n const val =\r\n e.target?.value !== undefined\r\n ? e.target.value\r\n : e?.target?.inputValue !== undefined\r\n ? e.target.inputValue\r\n : e\r\n if (record && dataIndex) {\r\n record[dataIndex] = val\r\n // 触发表格数据更新\r\n if (ctx.api && ctx.api.form && rule.field) {\r\n ctx.api.form[rule.field] = props.dataSource\r\n }\r\n }\r\n },\r\n placeholder: cellProps.placeholder || '',\r\n disabled: cellProps.disabled || false,\r\n size: cellProps.size || 'small',\r\n ...cellProps\r\n })\r\n } else if (cellType === 'select') {\r\n // 渲染 select 组件 - 使用组件名字符串\r\n return h(\r\n 'a-select',\r\n {\r\n value: cellValue,\r\n onChange: (val) => {\r\n if (record && dataIndex) {\r\n record[dataIndex] = val\r\n // 触发表格数据更新\r\n if (ctx.api && ctx.api.form && rule.field) {\r\n ctx.api.form[rule.field] = props.dataSource\r\n }\r\n }\r\n },\r\n placeholder: cellProps.placeholder || '',\r\n disabled: cellProps.disabled || false,\r\n size: cellProps.size || 'small',\r\n ...cellProps\r\n },\r\n {\r\n default: () =>\r\n options.map((opt) => {\r\n return h('a-select-option', {\r\n key: opt.value,\r\n value: opt.value,\r\n label: opt.label\r\n })\r\n })\r\n }\r\n )\r\n } else if (cellType === 'radio') {\r\n // 渲染 radio 组件 - 使用组件名字符串\r\n return h(\r\n 'a-radio-group',\r\n {\r\n value: cellValue,\r\n onChange: (e) => {\r\n const val =\r\n e.target?.value !== undefined ? e.target.value : e\r\n if (record && dataIndex) {\r\n record[dataIndex] = val\r\n // 触发表格数据更新\r\n if (ctx.api && ctx.api.form && rule.field) {\r\n ctx.api.form[rule.field] = props.dataSource\r\n }\r\n }\r\n },\r\n disabled: cellProps.disabled || false,\r\n size: cellProps.size || 'small',\r\n ...cellProps\r\n },\r\n {\r\n default: () =>\r\n options.map((opt) => {\r\n return h(\r\n 'a-radio',\r\n {\r\n key: opt.value,\r\n value: opt.value\r\n },\r\n {\r\n default: () => opt.label || opt.value\r\n }\r\n )\r\n })\r\n }\r\n )\r\n }\r\n\r\n // 如果没有匹配的类型,返回原始文本\r\n return text\r\n }\r\n }\r\n\r\n // 确保其他列属性也被保留(align、fixed、title、dataIndex 等)\r\n return column\r\n })\r\n\r\n // 始终更新 props.columns,确保列配置变化(包括 width)时能生效\r\n props.columns = processedColumns\r\n\r\n // 初始化数据源\r\n if (!hasProperty(props, 'dataSource')) {\r\n let dataSource = rule.value || rule.props?.dataSource || []\r\n // Struct 组件返回的是数组对象,直接使用;如果是字符串,尝试解析为 JSON(向后兼容)\r\n if (typeof dataSource === 'string' && !rule.effect?.fetch) {\r\n try {\r\n const parsed = JSON.parse(dataSource)\r\n if (Array.isArray(parsed)) {\r\n dataSource = parsed\r\n }\r\n } catch (e) {\r\n console.warn('accTable dataSource parse error:', e)\r\n dataSource = []\r\n }\r\n }\r\n // 确保 dataSource 是数组\r\n if (!Array.isArray(dataSource)) {\r\n dataSource = []\r\n }\r\n props.dataSource = dataSource\r\n }\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 // 设置 loading 状态\r\n if (hasProperty(props, 'loading')) {\r\n props.loading =\r\n rule.props?.loading !== undefined ? rule.props.loading : isLoading\r\n } else {\r\n props.loading = isLoading\r\n }\r\n\r\n // 处理分页配置\r\n const paginationConfig = rule.props?.pagination\r\n console.log('[accTable] 开始处理分页配置:', {\r\n hasPaginationProp: hasProperty(props, 'pagination'),\r\n paginationConfig,\r\n paginationConfigType: typeof paginationConfig\r\n })\r\n\r\n // 处理分页 props(只有在 props 中没有 pagination 时才初始化)\r\n if (!hasProperty(props, 'pagination')) {\r\n console.log('[accTable] 分页配置检查:', {\r\n paginationConfig,\r\n isFalse: paginationConfig === false,\r\n isObject: paginationConfig && typeof paginationConfig === 'object'\r\n })\r\n\r\n if (paginationConfig === false) {\r\n props.pagination = false\r\n } else if (paginationConfig && typeof paginationConfig === 'object') {\r\n const pagination = {\r\n current: paginationConfig.current || 1,\r\n pageSize: paginationConfig.pageSize || 10,\r\n total: paginationConfig.total || 0,\r\n showSizeChanger: paginationConfig.showSizeChanger !== false,\r\n showQuickJumper: paginationConfig.showQuickJumper || false,\r\n showTotal: paginationConfig.showTotal,\r\n ...paginationConfig\r\n }\r\n\r\n props.pagination = pagination\r\n } else {\r\n // 默认不启用分页\r\n props.pagination = false\r\n }\r\n }\r\n\r\n // 无论 props.pagination 是否已存在,只要满足条件就添加/检查 beforeFetch 钩子\r\n console.log('[accTable] 检查分页钩子添加条件:', {\r\n hasFetch: !!rule.effect?.fetch,\r\n hasPaginationConfig: !!paginationConfig,\r\n paginationConfigType: typeof paginationConfig,\r\n paginationConfigValue: paginationConfig,\r\n paginationCurrent: paginationConfig?.current,\r\n paginationCurrentDefined: paginationConfig?.current !== undefined\r\n })\r\n\r\n if (\r\n rule.effect?.fetch &&\r\n paginationConfig &&\r\n typeof paginationConfig === 'object' &&\r\n paginationConfig.current !== undefined\r\n ) {\r\n console.log('[accTable] ✅ 满足条件,进入分页请求参数处理逻辑')\r\n // 获取分页参数配置\r\n const pageParamName = rule.props?.paginationPageParam || 'page'\r\n const pageSizeParamName =\r\n rule.props?.paginationPageSizeParam || 'pageSize'\r\n const paramType = rule.props?.paginationParamType || 'query' // 'query' 或 'data'\r\n const responseDataPath = rule.props?.paginationResponseDataPath || 'data'\r\n const responseTotalPath =\r\n rule.props?.paginationResponseTotalPath || 'total'\r\n\r\n // 获取当前分页对象(从 props 或 paginationConfig)\r\n const currentPaginationObj = props.pagination || paginationConfig\r\n\r\n console.log('[accTable] 分页配置初始化:', {\r\n hasFetch: !!rule.effect?.fetch,\r\n paginationConfig,\r\n pageParamName,\r\n pageSizeParamName,\r\n paramType,\r\n currentPage: currentPaginationObj?.current,\r\n currentPageSize: currentPaginationObj?.pageSize\r\n })\r\n\r\n // 包装 fetch 配置,通过 beforeFetch 钩子动态注入分页参数\r\n const originalFetch = rule.effect.fetch\r\n console.log('[accTable] 原始 fetch 配置:', {\r\n type: typeof originalFetch,\r\n isObject: typeof originalFetch === 'object',\r\n originalFetch,\r\n hasBeforeFetch: typeof originalFetch?.beforeFetch === 'function'\r\n })\r\n\r\n if (typeof originalFetch === 'object') {\r\n // 保存原始配置和分页参数配置到闭包中\r\n const savedParamType = paramType\r\n const savedPageParamName = pageParamName\r\n const savedPageSizeParamName = pageSizeParamName\r\n const savedOriginalBeforeFetch = originalFetch.beforeFetch\r\n // 在闭包中保存 rule 的引用,因为 beforeFetch 只接收 (config, {api}) 参数\r\n const savedRule = rule\r\n\r\n // 检查是否已经添加过我们的 beforeFetch 钩子(通过检查函数是否包含特定标记)\r\n const isOurBeforeFetch =\r\n savedOriginalBeforeFetch &&\r\n savedOriginalBeforeFetch._accTablePaginationHook === true\r\n\r\n if (!isOurBeforeFetch) {\r\n // 添加 beforeFetch 钩子来注入分页参数\r\n // 注意:form-create 的 beforeFetch 只接收 (config, {api}) 参数,没有 rule\r\n originalFetch.beforeFetch = (config, { api }) => {\r\n console.log('[accTable] beforeFetch 被调用:', {\r\n configAction: config?.action,\r\n hasApi: !!api,\r\n ruleProps: savedRule?.props,\r\n pagination: savedRule?.props?.pagination\r\n })\r\n\r\n // 从闭包中获取当前分页配置\r\n const currentPagination = savedRule?.props?.pagination\r\n console.log('[accTable] 当前分页配置:', {\r\n currentPagination,\r\n isObject: typeof currentPagination === 'object',\r\n currentPage: currentPagination?.current,\r\n currentPageSize: currentPagination?.pageSize\r\n })\r\n\r\n if (currentPagination && typeof currentPagination === 'object') {\r\n const currentPage = currentPagination.current || 1\r\n const currentPageSize = currentPagination.pageSize || 10\r\n\r\n console.log('[accTable] 准备添加分页参数:', {\r\n savedParamType,\r\n savedPageParamName,\r\n savedPageSizeParamName,\r\n currentPage,\r\n currentPageSize,\r\n existingQuery: config.query,\r\n existingData: config.data\r\n })\r\n\r\n // 添加分页参数(使用闭包中保存的参数名)\r\n if (savedParamType === 'query') {\r\n // 合并已有的 query 参数,确保不覆盖用户自定义的参数\r\n config.query = {\r\n ...(config.query || {}),\r\n [savedPageParamName]: currentPage,\r\n [savedPageSizeParamName]: currentPageSize\r\n }\r\n console.log('[accTable] 添加 query 参数后:', {\r\n query: config.query\r\n })\r\n } else {\r\n // 合并已有的 data 参数,确保不覆盖用户自定义的参数\r\n config.data = {\r\n ...(config.data || {}),\r\n [savedPageParamName]: currentPage,\r\n [savedPageSizeParamName]: currentPageSize\r\n }\r\n console.log('[accTable] 添加 data 参数后:', {\r\n data: config.data\r\n })\r\n }\r\n } else {\r\n console.warn('[accTable] 分页配置无效,无法添加分页参数:', {\r\n currentPagination,\r\n type: typeof currentPagination\r\n })\r\n }\r\n\r\n // 调用原始的 beforeFetch 钩子(如果存在)\r\n // 原始钩子可能也只接收 (config, {api}) 参数\r\n // 使用 try-catch 包装,避免原始钩子中的错误影响我们的逻辑\r\n if (\r\n savedOriginalBeforeFetch &&\r\n typeof savedOriginalBeforeFetch === 'function'\r\n ) {\r\n console.log('[accTable] 调用原始 beforeFetch 钩子')\r\n try {\r\n const result = savedOriginalBeforeFetch(config, { api })\r\n // 如果原始钩子返回了 Promise,处理它\r\n if (result && typeof result.then === 'function') {\r\n return result.catch((err) => {\r\n console.error(\r\n '[accTable] 原始 beforeFetch 钩子执行出错:',\r\n err\r\n )\r\n // 即使原始钩子出错,也继续执行\r\n return Promise.resolve()\r\n })\r\n }\r\n return result\r\n } catch (err) {\r\n console.error('[accTable] 原始 beforeFetch 钩子执行出错:', err)\r\n // 即使原始钩子出错,也继续执行,不影响分页参数的添加\r\n }\r\n }\r\n\r\n console.log('[accTable] beforeFetch 完成,最终 config:', {\r\n query: config.query,\r\n data: config.data,\r\n action: config.action\r\n })\r\n }\r\n\r\n // 标记这是我们添加的钩子,避免重复添加\r\n originalFetch.beforeFetch._accTablePaginationHook = true\r\n console.log('[accTable] ✅ beforeFetch 钩子已添加并标记')\r\n } else {\r\n console.log('[accTable] ⚠️ beforeFetch 钩子已存在,跳过添加')\r\n }\r\n console.log('[accTable] beforeFetch 钩子处理完成')\r\n } else {\r\n console.warn('[accTable] fetch 配置不是对象类型:', {\r\n type: typeof originalFetch,\r\n originalFetch\r\n })\r\n }\r\n\r\n // 添加分页 onChange 和 onShowSizeChange 事件处理(确保事件处理函数存在,且只设置一次)\r\n const paginationObj = props.pagination || paginationConfig\r\n if (paginationObj && typeof paginationObj === 'object') {\r\n // 检查是否已经设置过事件处理函数(通过标记判断)\r\n if (!paginationObj._accTableHandlersSet) {\r\n if (!paginationObj.onChange) {\r\n paginationObj.onChange = (page, size) => {\r\n console.log('[accTable] pagination onChange 被调用:', {\r\n page,\r\n size\r\n })\r\n // 更新分页配置\r\n if (rule.props?.pagination) {\r\n rule.props.pagination.current = page\r\n rule.props.pagination.pageSize = size\r\n }\r\n // 分页参数已经通过 beforeFetch 钩子自动添加,只需要触发重新加载\r\n ctx.api.sync(rule)\r\n setTimeout(() => {\r\n ctx.api.refresh()\r\n }, 0)\r\n }\r\n }\r\n\r\n if (!paginationObj.onShowSizeChange) {\r\n paginationObj.onShowSizeChange = (current, size) => {\r\n console.log('[accTable] pagination onShowSizeChange 被调用:', {\r\n current,\r\n size\r\n })\r\n if (rule.props?.pagination) {\r\n rule.props.pagination.current = 1 // 改变每页条数时重置到第一页\r\n rule.props.pagination.pageSize = size\r\n }\r\n // 分页参数已经通过 beforeFetch 钩子自动添加,只需要触发重新加载\r\n ctx.api.sync(rule)\r\n setTimeout(() => {\r\n ctx.api.refresh()\r\n }, 0)\r\n }\r\n }\r\n\r\n // 标记事件处理函数已设置,避免重复设置\r\n paginationObj._accTableHandlersSet = true\r\n\r\n // 如果 props.pagination 不存在,将 paginationObj 赋值给 props.pagination\r\n if (!props.pagination) {\r\n props.pagination = paginationObj\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 处理远程数据响应,解析总记录数和数据列表\r\n if (rule.effect?.fetch && rule.props?.pagination) {\r\n const fetchData = ctx.effectData('fetch')\r\n if (fetchData && fetchData.value) {\r\n const responseDataPath =\r\n rule.props?.paginationResponseDataPath || 'data'\r\n const responseTotalPath =\r\n rule.props?.paginationResponseTotalPath || 'total'\r\n\r\n try {\r\n // 解析数据列表\r\n const dataList = getValue(fetchData.value, responseDataPath)\r\n if (Array.isArray(dataList)) {\r\n props.dataSource = dataList\r\n rule.value = dataList\r\n rule.props.dataSource = dataList\r\n }\r\n\r\n // 解析总记录数\r\n const total = getValue(fetchData.value, responseTotalPath)\r\n if (\r\n typeof total === 'number' &&\r\n rule.props.pagination &&\r\n typeof rule.props.pagination === 'object'\r\n ) {\r\n rule.props.pagination.total = total\r\n if (props.pagination && typeof props.pagination === 'object') {\r\n props.pagination.total = total\r\n }\r\n }\r\n } catch (e) {\r\n console.warn('accTable parse response error:', e)\r\n }\r\n }\r\n }\r\n\r\n // 设置其他常用配置\r\n if (hasProperty(rule.props, 'bordered')) {\r\n props.bordered = rule.props.bordered\r\n }\r\n if (hasProperty(rule.props, 'size')) {\r\n props.size = rule.props.size\r\n }\r\n if (hasProperty(rule.props, 'scroll')) {\r\n props.scroll = rule.props.scroll\r\n }\r\n if (hasProperty(rule.props, 'rowKey')) {\r\n props.rowKey = rule.props.rowKey || 'id'\r\n }\r\n if (hasProperty(rule.props, 'rowSelection')) {\r\n props.rowSelection = rule.props.rowSelection\r\n }\r\n if (hasProperty(rule.props, 'sticky')) {\r\n props.sticky = rule.props.sticky\r\n }\r\n if (hasProperty(rule.props, 'virtual')) {\r\n props.virtual = rule.props.virtual\r\n }\r\n },\r\n render(children, ctx) {\r\n console.log('[accTable] render 方法被调用')\r\n // 使用默认渲染\r\n return ctx.$render.defaultRender(ctx, children)\r\n }\r\n}\r\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'\nimport spin from './spin'\nimport div from './div'\nimport alert from './alert'\nimport card from './card'\nimport accTable from './accTable'\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 spin,\n div,\n alert,\n card,\n accTable\n]\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 spin: PRE + 'Spin',\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 image: PRE + 'Image',\n aImage: PRE + 'Image',\n alert: PRE + 'Alert',\n aAlert: PRE + 'Alert',\n Alert: PRE + 'Alert',\n card: PRE + 'Card',\n aCard: PRE + 'Card',\n Card: PRE + 'Card',\n accTable: PRE + 'Table',\n accTableTable: PRE + 'Table'\n}\n","import getConfig from './config'\r\nimport mergeProps from '@form-create/utils/lib/mergeprops'\r\nimport is, { hasProperty } from '@form-create/utils/lib/type'\r\nimport extend from '@form-create/utils/lib/extend'\r\n\r\nfunction isTooltip(info) {\r\n return info.type === 'tooltip'\r\n}\r\n\r\nfunction tidy(props, name) {\r\n if (!hasProperty(props, name)) return\r\n if (is.String(props[name])) {\r\n props[name] = { [name]: props[name], show: true }\r\n }\r\n}\r\n\r\nfunction isFalse(val) {\r\n return val === false\r\n}\r\n\r\nfunction tidyBool(opt, name) {\r\n if (hasProperty(opt, name) && !is.Object(opt[name])) {\r\n opt[name] = { show: !!opt[name] }\r\n }\r\n}\r\n\r\nfunction tidyRule(rule) {\r\n const _rule = { ...rule }\r\n delete _rule.children\r\n return _rule\r\n}\r\n\r\nexport default {\r\n validate() {\r\n const form = this.form()\r\n if (form) {\r\n return form.validate()\r\n } else {\r\n return new Promise((v) => v())\r\n }\r\n },\r\n validateField(field) {\r\n const form = this.form()\r\n if (form) {\r\n return form.validateFields(field)\r\n } else {\r\n return new Promise((v) => v())\r\n }\r\n },\r\n clearValidateState(ctx) {\r\n const fItem = this.vm.refs[ctx.wrapRef]\r\n if (fItem) {\r\n fItem.clearValidate()\r\n }\r\n },\r\n tidyOptions(options) {\r\n ;['submitBtn', 'resetBtn', 'row', 'info', 'wrap', 'col', 'title'].forEach(\r\n (name) => {\r\n tidyBool(options, name)\r\n }\r\n )\r\n return options\r\n },\r\n tidyRule({ prop }) {\r\n tidy(prop, 'title')\r\n tidy(prop, 'info')\r\n return prop\r\n },\r\n mergeProp(ctx) {\r\n const def = {\r\n info: {\r\n type: 'popover',\r\n placement: 'topLeft',\r\n icon: 'QuestionCircleOutlined'\r\n },\r\n title: {},\r\n col: { span: 24 },\r\n wrap: {}\r\n }\r\n ;['info', 'wrap', 'col', 'title'].forEach((name) => {\r\n ctx.prop[name] = mergeProps(\r\n [this.options[name] || {}, ctx.prop[name] || {}],\r\n def[name]\r\n )\r\n })\r\n\r\n // 预览模式下:对 upload 组件设置 disabled\r\n // wangEditor 组件使用只读模式(readOnly),允许复制和点击链接\r\n // textarea 组件使用只读模式(readOnly),允许复制和自适应高度\r\n // select 组件使用 disabled 实现只读效果(通过 CSS 样式来保持外观)\r\n // 如果组件单独设置了 readOnly 属性,也应用相同的预览模式逻辑\r\n const isPreviewMode = this.$handle.preview === true\r\n // 从 rule.props 或 ctx.prop.props 中读取 readOnly 属性\r\n const isReadOnly =\r\n ctx.rule.props?.readOnly === true || ctx.prop.props?.readOnly === true\r\n const shouldApplyPreviewStyle = isPreviewMode || isReadOnly\r\n\r\n if (shouldApplyPreviewStyle) {\r\n if (ctx.rule.type === 'upload') {\r\n if (ctx.prop.props) {\r\n ctx.prop.props.disabled = true\r\n }\r\n } else if (ctx.rule.type === 'fcEditor') {\r\n // wangEditor 使用只读模式,不设置 disabled\r\n // 只读模式允许复制和点击链接,但禁止编辑\r\n if (ctx.prop.props) {\r\n ctx.prop.props.readOnly = true\r\n // 预览模式和只读模式下隐藏 placeholder\r\n delete ctx.prop.props.placeholder\r\n // 预览模式和只读模式下移除固定高度,使用自适应\r\n delete ctx.prop.props.height\r\n }\r\n } else if (\r\n ctx.rule.type === 'input' &&\r\n ctx.prop.props?.type === 'textarea'\r\n ) {\r\n // textarea 使用只读模式,不设置 disabled\r\n // 只读模式允许复制,但禁止编辑\r\n if (ctx.prop.props) {\r\n ctx.prop.props.readOnly = true\r\n // 完全自适应高度,不限制最大高度\r\n ctx.prop.props.autoSize = true\r\n // 移除 rows 属性,让 autoSize 完全控制高度\r\n delete ctx.prop.props.rows\r\n // 预览模式和只读模式下隐藏 placeholder\r\n delete ctx.prop.props.placeholder\r\n // 预览模式和只读模式下隐藏字符计数\r\n ctx.prop.props.showCount = false\r\n }\r\n } else if (ctx.rule.type === 'select') {\r\n // select 组件在预览模式下使用 disabled 实现只读效果\r\n // 注意:Ant Design Vue 的 Select 组件不支持 readOnly 属性\r\n // 所以在预览模式下使用 disabled,并通过 CSS 样式来保持外观\r\n // 强制设置 disabled = true,覆盖用户可能设置的 disabled: false\r\n if (ctx.prop.props) {\r\n ctx.prop.props.disabled = true\r\n // 预览模式和只读模式下隐藏 placeholder\r\n delete ctx.prop.props.placeholder\r\n // 如果原本设置了 readOnly,保留这个标记以便 CSS 识别\r\n if (isReadOnly) {\r\n // 可以在这里添加一个标记,但 Select 组件不支持 readOnly\r\n // 所以我们通过 disabled 来实现,CSS 会处理样式\r\n }\r\n }\r\n } else if (ctx.rule.type === 'input') {\r\n // input 组件支持 readOnly 属性\r\n // 如果设置了 readOnly,直接使用组件的 readOnly 属性\r\n if (ctx.prop.props && isReadOnly) {\r\n ctx.prop.props.readOnly = true\r\n // 预览模式和只读模式下隐藏 placeholder\r\n delete ctx.prop.props.placeholder\r\n // 预览模式和只读模式下隐藏字符计数\r\n ctx.prop.props.showCount = false\r\n } else if (ctx.prop.props && isPreviewMode) {\r\n // 全局预览模式下也隐藏 placeholder\r\n delete ctx.prop.props.placeholder\r\n // 全局预览模式下隐藏字符计数\r\n ctx.prop.props.showCount = false\r\n }\r\n } else if (\r\n ctx.rule.type === 'datePicker' ||\r\n ctx.rule.type === 'timePicker' ||\r\n ctx.rule.type === 'timeRangePicker' ||\r\n ctx.rule.type === 'rangePicker' ||\r\n ctx.rule.type === 'cascader'\r\n ) {\r\n // 日期选择器、时间选择器、级联选择器等组件\r\n // 预览模式和只读模式下隐藏 placeholder\r\n if (ctx.prop.props) {\r\n if (ctx.rule.type === 'cascader') {\r\n ctx.prop.props.disabled = true\r\n }\r\n delete ctx.prop.props.placeholder\r\n }\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 // 为 aImage 组件自动添加预览拦截,确保始终向父窗口发送预览通知\r\n if (\r\n (ctx.rule.type === 'image' || ctx.rule.type === 'aImage') &&\r\n !ctx.prop.props.preview\r\n ) {\r\n const sendImagePreviewMessage = function (src) {\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: src || ctx.prop.props.src || ''\r\n },\r\n timestamp: Date.now()\r\n },\r\n '*'\r\n )\r\n }\r\n }\r\n\r\n // 拦截 Image 组件的预览,发送消息给父窗口并阻止默认预览\r\n const imageSrc = ctx.prop.props.src || ''\r\n ctx.prop.props.preview = {\r\n visible: false,\r\n src: imageSrc,\r\n onVisibleChange: (visible, prevVisible) => {\r\n if (visible && !prevVisible) {\r\n // 发送预览通知给父窗口\r\n sendImagePreviewMessage(imageSrc)\r\n // 返回 false 阻止默认预览显示\r\n return false\r\n }\r\n }\r\n }\r\n } else if (\r\n (ctx.rule.type === 'image' || ctx.rule.type === 'aImage') &&\r\n ctx.prop.props.preview\r\n ) {\r\n // 如果用户已经设置了 preview,包装它以确保先发送消息\r\n const originalPreview = ctx.prop.props.preview\r\n const sendImagePreviewMessage = function (src) {\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: src || ctx.prop.props.src || ''\r\n },\r\n timestamp: Date.now()\r\n },\r\n '*'\r\n )\r\n }\r\n }\r\n\r\n const imageSrc = ctx.prop.props.src || ''\r\n const originalOnVisibleChange = originalPreview?.onVisibleChange\r\n\r\n ctx.prop.props.preview = {\r\n ...originalPreview,\r\n visible: originalPreview.visible || false,\r\n src: originalPreview.src || imageSrc,\r\n onVisibleChange: (visible, prevVisible) => {\r\n if (visible && !prevVisible) {\r\n // 先发送消息给父窗口\r\n sendImagePreviewMessage(originalPreview.src || imageSrc)\r\n }\r\n // 执行用户自定义的 onVisibleChange\r\n if (\r\n originalOnVisibleChange &&\r\n typeof originalOnVisibleChange === 'function'\r\n ) {\r\n return originalOnVisibleChange.apply(this, arguments)\r\n }\r\n // 默认阻止预览显示\r\n return false\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\nfunction useSpin(maker) {\n maker.spin = creatorFactory('spin')\n}\n\nuseAlias(maker)\nuseSlider(maker)\nuseFrame(maker)\nuseUpload(maker)\nuseSelect(maker)\nuseCusStoreSelect(maker)\nuseCusUserSelect(maker)\nuseText(maker)\nuseFlex(maker)\nuseSpace(maker)\nuseSpin(maker)\n\nexport default maker\n","/**\r\n * 常用校验工具类\r\n * 提供各种日常校验方法\r\n */\r\nclass Validator {\r\n /**\r\n * 校验手机号(中国大陆)\r\n * @param {string} value - 要校验的值\r\n * @param {boolean} strict - 是否严格模式(11位,1开头),默认 true\r\n * @returns {boolean} 校验结果\r\n */\r\n mobile(value, strict = false) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n if (strict) {\r\n // 严格模式:11位,1开头,第二位为3-9\r\n return /^1[3-9]\\d{9}$/.test(str)\r\n } else {\r\n // 宽松模式:1开头,10-11位数字\r\n return /^1\\d{10,11}$/.test(str)\r\n }\r\n }\r\n\r\n /**\r\n * 校验邮箱\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n email(value) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n // 邮箱正则:支持常见邮箱格式\r\n return /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(\r\n str\r\n )\r\n }\r\n\r\n /**\r\n * 校验身份证号(中国大陆18位)\r\n * @param {string} value - 要校验的值\r\n * @param {boolean} checkCode - 是否校验校验码,默认 true\r\n * @returns {boolean} 校验结果\r\n */\r\n idCard(value, checkCode = true) {\r\n if (!value) return false\r\n const str = String(value).trim().toUpperCase()\r\n\r\n // 基本格式校验:18位,前17位数字,最后一位数字或X\r\n if (!/^\\d{17}[\\dX]$/.test(str)) {\r\n return false\r\n }\r\n\r\n if (!checkCode) {\r\n return true\r\n }\r\n\r\n // 校验码校验\r\n const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]\r\n const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']\r\n\r\n let sum = 0\r\n for (let i = 0; i < 17; i++) {\r\n sum += parseInt(str[i]) * weights[i]\r\n }\r\n const checkCodeIndex = sum % 11\r\n return str[17] === checkCodes[checkCodeIndex]\r\n }\r\n\r\n /**\r\n * 校验URL\r\n * @param {string} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {boolean} options.requireProtocol - 是否要求协议(http/https),默认 false\r\n * @returns {boolean} 校验结果\r\n */\r\n url(value, options = {}) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n const { requireProtocol = false } = options\r\n\r\n if (requireProtocol) {\r\n return /^https?:\\/\\/.+\\..+/.test(str)\r\n } else {\r\n // 支持带协议或不带协议\r\n return /^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$/.test(\r\n str\r\n )\r\n }\r\n }\r\n\r\n /**\r\n * 校验IP地址(IPv4)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n ip(value) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n const parts = str.split('.')\r\n if (parts.length !== 4) return false\r\n return parts.every((part) => {\r\n const num = parseInt(part, 10)\r\n return num >= 0 && num <= 255 && String(num) === part\r\n })\r\n }\r\n\r\n /**\r\n * 校验数字\r\n * @param {string|number} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {boolean} options.integer - 是否必须为整数,默认 false\r\n * @param {boolean} options.positive - 是否必须为正数,默认 false\r\n * @param {boolean} options.negative - 是否必须为负数,默认 false\r\n * @param {number} options.min - 最小值\r\n * @param {number} options.max - 最大值\r\n * @returns {boolean} 校验结果\r\n */\r\n number(value, options = {}) {\r\n if (value === null || value === undefined || value === '') return false\r\n const num = Number(value)\r\n if (isNaN(num)) return false\r\n\r\n const {\r\n integer = false,\r\n positive = false,\r\n negative = false,\r\n min,\r\n max\r\n } = options\r\n\r\n if (integer && !Number.isInteger(num)) return false\r\n if (positive && num <= 0) return false\r\n if (negative && num >= 0) return false\r\n if (min !== undefined && num < min) return false\r\n if (max !== undefined && num > max) return false\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 校验字符串长度\r\n * @param {string} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {number} options.min - 最小长度\r\n * @param {number} options.max - 最大长度\r\n * @param {number} options.len - 固定长度(优先级高于 min/max)\r\n * @returns {boolean} 校验结果\r\n */\r\n length(value, options = {}) {\r\n if (value === null || value === undefined) return false\r\n const str = String(value)\r\n const { min, max, len } = options\r\n\r\n if (len !== undefined) {\r\n return str.length === len\r\n }\r\n\r\n if (min !== undefined && str.length < min) return false\r\n if (max !== undefined && str.length > max) return false\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 校验正则表达式\r\n * @param {string} value - 要校验的值\r\n * @param {RegExp|string} pattern - 正则表达式或正则字符串\r\n * @returns {boolean} 校验结果\r\n */\r\n pattern(value, pattern) {\r\n if (!value || !pattern) return false\r\n const str = String(value)\r\n let regex\r\n if (pattern instanceof RegExp) {\r\n regex = pattern\r\n } else {\r\n try {\r\n regex = new RegExp(pattern)\r\n } catch (e) {\r\n return false\r\n }\r\n }\r\n return regex.test(str)\r\n }\r\n\r\n /**\r\n * 校验日期\r\n * @param {string|Date} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {string|Date} options.min - 最小日期\r\n * @param {string|Date} options.max - 最大日期\r\n * @param {string} options.format - 日期格式,如 'YYYY-MM-DD',默认自动识别\r\n * @returns {boolean} 校验结果\r\n */\r\n date(value, options = {}) {\r\n if (!value) return false\r\n let date\r\n if (value instanceof Date) {\r\n date = value\r\n } else {\r\n date = new Date(value)\r\n if (isNaN(date.getTime())) return false\r\n }\r\n\r\n const { min, max } = options\r\n if (min) {\r\n const minDate = min instanceof Date ? min : new Date(min)\r\n if (date < minDate) return false\r\n }\r\n if (max) {\r\n const maxDate = max instanceof Date ? max : new Date(max)\r\n if (date > maxDate) return false\r\n }\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 校验是否为空\r\n * @param {*} value - 要校验的值\r\n * @param {boolean} trim - 是否去除空格,默认 true\r\n * @returns {boolean} 是否为空\r\n */\r\n empty(value, trim = true) {\r\n if (value === null || value === undefined) return true\r\n if (typeof value === 'string') {\r\n return trim ? value.trim() === '' : value === ''\r\n }\r\n if (Array.isArray(value)) {\r\n return value.length === 0\r\n }\r\n if (typeof value === 'object') {\r\n return Object.keys(value).length === 0\r\n }\r\n return false\r\n }\r\n\r\n /**\r\n * 校验是否不为空(empty 的反向)\r\n * @param {*} value - 要校验的值\r\n * @param {boolean} trim - 是否去除空格,默认 true\r\n * @returns {boolean} 是否不为空\r\n */\r\n notEmpty(value, trim = true) {\r\n return !this.empty(value, trim)\r\n }\r\n\r\n /**\r\n * 校验中文\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n chinese(value) {\r\n if (!value) return false\r\n return /^[\\u4e00-\\u9fa5]+$/.test(String(value))\r\n }\r\n\r\n /**\r\n * 校验字母\r\n * @param {string} value - 要校验的值\r\n * @param {boolean} caseSensitive - 是否区分大小写,默认 false(不区分)\r\n * @returns {boolean} 校验结果\r\n */\r\n alpha(value, caseSensitive = false) {\r\n if (!value) return false\r\n const str = String(value)\r\n if (caseSensitive) {\r\n return /^[a-zA-Z]+$/.test(str)\r\n } else {\r\n return /^[a-z]+$/i.test(str)\r\n }\r\n }\r\n\r\n /**\r\n * 校验字母和数字\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n alphanumeric(value) {\r\n if (!value) return false\r\n return /^[a-zA-Z0-9]+$/.test(String(value))\r\n }\r\n\r\n /**\r\n * 校验整数\r\n * @param {string|number} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n integer(value) {\r\n return this.number(value, { integer: true })\r\n }\r\n\r\n /**\r\n * 校验正数\r\n * @param {string|number} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n positive(value) {\r\n return this.number(value, { positive: true })\r\n }\r\n\r\n /**\r\n * 校验负数\r\n * @param {string|number} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n negative(value) {\r\n return this.number(value, { negative: true })\r\n }\r\n\r\n /**\r\n * 校验银行卡号(中国大陆,16-19位)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n bankCard(value) {\r\n if (!value) return false\r\n const str = String(value).replace(/\\s/g, '')\r\n // 银行卡号通常是16-19位数字\r\n return /^\\d{16,19}$/.test(str)\r\n }\r\n\r\n /**\r\n * 校验邮政编码(中国大陆,6位数字)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n postcode(value) {\r\n if (!value) return false\r\n return /^\\d{6}$/.test(String(value).trim())\r\n }\r\n\r\n /**\r\n * 校验车牌号(中国大陆)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n licensePlate(value) {\r\n if (!value) return false\r\n const str = String(value).trim().toUpperCase()\r\n // 支持普通车牌和新能源车牌\r\n return (\r\n /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$/.test(\r\n str\r\n ) ||\r\n /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z]((\\d{5}[DF])|([DF][A-Z0-9]\\d{4}))$/.test(\r\n str\r\n )\r\n )\r\n }\r\n\r\n /**\r\n * 校验统一社会信用代码(18位)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n creditCode(value) {\r\n if (!value) return false\r\n const str = String(value).trim().toUpperCase()\r\n // 统一社会信用代码:18位,字母数字组合\r\n return /^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/.test(str)\r\n }\r\n\r\n /**\r\n * 校验值是否在指定范围内\r\n * @param {*} value - 要校验的值\r\n * @param {Array} enumList - 允许的值列表\r\n * @returns {boolean} 校验结果\r\n */\r\n enum(value, enumList) {\r\n if (!Array.isArray(enumList) || enumList.length === 0) return false\r\n return enumList.includes(value)\r\n }\r\n\r\n /**\r\n * 校验值是否相等\r\n * @param {*} value1 - 第一个值\r\n * @param {*} value2 - 第二个值\r\n * @param {boolean} strict - 是否严格相等(===),默认 true\r\n * @returns {boolean} 校验结果\r\n */\r\n equal(value1, value2, strict = false) {\r\n if (strict) {\r\n return value1 === value2\r\n } else {\r\n return value1 == value2 // eslint-disable-line eqeqeq\r\n }\r\n }\r\n\r\n /**\r\n * 校验值是否不相等\r\n * @param {*} value1 - 第一个值\r\n * @param {*} value2 - 第二个值\r\n * @param {boolean} strict - 是否严格相等(===),默认 true\r\n * @returns {boolean} 校验结果\r\n */\r\n notEqual(value1, value2, strict = true) {\r\n return !this.equal(value1, value2, strict)\r\n }\r\n\r\n /**\r\n * 校验是否全为大写\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n uppercase(value) {\r\n if (!value) return false\r\n const str = String(value)\r\n return str === str.toUpperCase() && /[A-Z]/.test(str)\r\n }\r\n\r\n /**\r\n * 校验是否全为小写\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n lowercase(value) {\r\n if (!value) return false\r\n const str = String(value)\r\n return str === str.toLowerCase() && /[a-z]/.test(str)\r\n }\r\n\r\n /**\r\n * 校验用户名(字母、数字、下划线,3-20位)\r\n * @param {string} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {number} options.min - 最小长度,默认 3\r\n * @param {number} options.max - 最大长度,默认 20\r\n * @returns {boolean} 校验结果\r\n */\r\n username(value, options = {}) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n const { min = 3, max = 20 } = options\r\n if (str.length < min || str.length > max) return false\r\n return /^[a-zA-Z0-9_]+$/.test(str)\r\n }\r\n\r\n /**\r\n * 校验密码强度\r\n * @param {string} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {number} options.min - 最小长度,默认 6\r\n * @param {number} options.max - 最大长度,默认 20\r\n * @param {boolean} options.requireNumber - 是否必须包含数字,默认 false\r\n * @param {boolean} options.requireLetter - 是否必须包含字母,默认 false\r\n * @param {boolean} options.requireSpecial - 是否必须包含特殊字符,默认 false\r\n * @returns {boolean} 校验结果\r\n */\r\n password(value, options = {}) {\r\n if (!value) return false\r\n const str = String(value)\r\n const {\r\n min = 6,\r\n max = 20,\r\n requireNumber = false,\r\n requireLetter = false,\r\n requireSpecial = false\r\n } = options\r\n\r\n if (str.length < min || str.length > max) return false\r\n if (requireNumber && !/\\d/.test(str)) return false\r\n if (requireLetter && !/[a-zA-Z]/.test(str)) return false\r\n if (requireSpecial && !/[!@#$%^&*(),.?\":{}|<>]/.test(str)) return false\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 校验十六进制颜色值\r\n * @param {string} value - 要校验的值(如 #fff 或 #ffffff)\r\n * @returns {boolean} 校验结果\r\n */\r\n hexColor(value) {\r\n if (!value) return false\r\n return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(String(value).trim())\r\n }\r\n\r\n /**\r\n * 校验QQ号(5-11位数字)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n qq(value) {\r\n if (!value) return false\r\n return /^[1-9]\\d{4,10}$/.test(String(value).trim())\r\n }\r\n\r\n /**\r\n * 校验微信号(6-20位,字母、数字、下划线、减号)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n wechat(value) {\r\n if (!value) return false\r\n return /^[a-zA-Z0-9_-]{6,20}$/.test(String(value).trim())\r\n }\r\n\r\n /**\r\n * 校验固定电话(中国大陆)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n tel(value) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n // 支持带区号的固定电话:010-12345678 或 01012345678\r\n return /^(0\\d{2,3}-?)?\\d{7,8}$/.test(str)\r\n }\r\n\r\n /**\r\n * 校验MAC地址\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n mac(value) {\r\n if (!value) return false\r\n const str = String(value).trim().toUpperCase()\r\n return /^([0-9A-F]{2}:){5}[0-9A-F]{2}$/.test(str)\r\n }\r\n\r\n /**\r\n * 校验Base64编码\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n base64(value) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n if (str.length % 4 !== 0) return false\r\n try {\r\n return btoa(atob(str)) === str\r\n } catch (e) {\r\n return false\r\n }\r\n }\r\n\r\n /**\r\n * 校验JSON字符串\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n json(value) {\r\n if (!value) return false\r\n try {\r\n JSON.parse(String(value))\r\n return true\r\n } catch (e) {\r\n return false\r\n }\r\n }\r\n\r\n /**\r\n * 校验数字字符串(纯数字组成)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n numeric(value) {\r\n if (value === null || value === undefined) return false\r\n return /^\\d+$/.test(String(value))\r\n }\r\n\r\n /**\r\n * 校验URL路径(不含协议和域名)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n path(value) {\r\n if (!value) return false\r\n return /^\\/[^\\s]*$/.test(String(value).trim())\r\n }\r\n\r\n /**\r\n * 校验端口号(1-65535)\r\n * @param {string|number} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n port(value) {\r\n return this.number(value, { integer: true, min: 1, max: 65535 })\r\n }\r\n}\r\n\r\n// 创建单例实例\r\nconst validator = new Validator()\r\n\r\nexport default validator\r\n","let isProduct = null\r\ntry {\r\n if (parent?.window?.location) {\r\n isProduct =\r\n parent?.window?.location.origin == 'https://zxgj.zhixianai.com' ||\r\n parent?.window?.location.origin == 'http://zxgj.zhixianai.com'\r\n }\r\n} catch (error) {\r\n isProduct = null\r\n}\r\nexport const MERCHANT_URL =\r\n isProduct !== null && isProduct\r\n ? 'https://merchant-api.zhixianai.com/api'\r\n : isProduct === false\r\n ? 'https://sandbox-merchant-api.zhixianai.com/api'\r\n : ''\r\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'\nimport validator from './test'\nimport moment from 'moment'\nimport { MERCHANT_URL } from './host'\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 getStoreInfo(storeId) {\n if (!storeId) {\n return Promise.resolve(null)\n }\n let config = {\n action: `${MERCHANT_URL}/storeInfo/page`,\n method: 'post',\n dataType: 'json',\n data: {\n current: 1,\n size: 1,\n params: {\n storeId: storeId || ''\n }\n }\n }\n return new Promise((resolve, reject) => {\n api\n .fetch(config)\n .then((res) => {\n if (res?.code === 0) {\n resolve(res?.data?.records?.[0] || null)\n } else {\n resolve(null)\n }\n })\n .catch((err) => {\n reject(err)\n })\n })\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 * 提供各种常用的校验方法\n *\n * @example\n * // 校验手机号\n * if (this.api.validator.mobile('13800138000')) {\n * console.log('手机号格式正确')\n * }\n *\n * @example\n * // 校验邮箱\n * if (this.api.validator.email('test@example.com')) {\n * console.log('邮箱格式正确')\n * }\n *\n * @example\n * // 在自定义校验规则中使用\n * validator: function(value, callback) {\n * if (!this.api.validator.mobile(value)) {\n * callback('请输入正确的手机号')\n * } else {\n * callback()\n * }\n * }\n */\n $validator: validator,\n $moment: moment,\n /**\n * 启用或禁用预览模式\n * 预览模式下:\n * - 表单 form-item 间距调小\n * - 组件边框不展示\n * - 字数限制等提示信息不展示\n * - 必填标记不展示\n *\n * @param {boolean} enabled - 是否启用预览模式,默认为 true\n * @returns {void}\n *\n * @example\n * // 启用预览模式\n * this.api.previewMode(true)\n *\n * @example\n * // 禁用预览模式\n * this.api.previewMode(false)\n */\n previewMode(enabled = true) {\n // 更新 options 中的 preview 配置\n api.updateOptions({ preview: !!enabled })\n // 触发刷新,使样式生效\n api.refresh()\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 '@longhongguo/component-antdv-upload/dist/index.css'\nimport extendApi from './api'\nimport modelFields from './modelFields'\nimport required from './provider'\n\nfunction install(FormCreate) {\n FormCreate.componentAlias(alias)\n\n Object.keys(modelFields).forEach((k) => {\n FormCreate.setModelField(k, modelFields[k])\n })\n\n components.forEach((component) => {\n FormCreate.component(component.name, component)\n })\n\n FormCreate.register(required)\n\n parsers.forEach((parser) => {\n FormCreate.parser(parser)\n })\n\n Object.keys(makers).forEach((name) => {\n FormCreate.maker[name] = makers[name]\n })\n\n if (typeof window !== 'undefined' && window.antd) {\n FormCreate.useApp((_, app) => {\n app.use(window.antd)\n })\n }\n}\n\nexport default function antdvFormCreate() {\n return FormCreateFactory({\n ui: 'process.env.UI',\n version: 'process.env.VERSION',\n manager,\n install,\n extendApi,\n attrs: {\n normal: ['col', 'wrap'],\n array: ['className'],\n key: ['title', 'info']\n }\n })\n}\n","import antdvFormCreate from './core/index';\n\nconst FormCreate = antdvFormCreate();\n\nif (typeof window !== 'undefined') {\n window.formCreate = FormCreate;\n}\n\nconst maker = FormCreate.maker;\n\nexport {maker}\n\nexport default FormCreate;\n"],"names":["script$6","name","_hoisted_1","class","_openBlock","_createElementBlock","_cache","_createElementVNode","height","width","xmlns","viewBox","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","_ctx","_Fragment","key","tabindex","_renderList","index","title","_toDisplayString","onClick","$event","role","aria-label","focusable","data-icon","aria-hidden","fill-rule","_hoisted_10","_hoisted_13","args","_hoisted_14","_hoisted_3","_hoisted_4","script$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","_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","_ctx$rule$props","fetchData","effectData","loading","readOnly","render","newChildren","notFoundContent","$render","defaultRender","cascader","loadData","_ctx$$handle","$handle","ctxRef","parsedFn","parseFn","code","trim","startsWith","selectedOptions","targetOption","isLeaf","updateOptions","_ctxRef$prop","_ctxRef$rule","currentOptions","updateOptionRecursive","optionsList","pathValues","depth","child","isLast","id","deepSet","sync","refresh","then","finally","triggerLoadDataForValue","valueToLoad","timerKey","_fc_id","clearTimeout","setTimeout","retryCount","loadInitialData","async","loadMissingData","startDepth","currentLevelOptions","i","currentOption","nextValue","Promise","resolve","_lastLoadDataValueKey","loadDataFn","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","loadStrVar","getValue","renderChildren","_ctx$rule","currentChildren","join","_ctx$prop$props3","_ctx$prop$props4","_ctx$prop$props5","bindMode","loadDataConfig","attr","to","modify","wait","effect","_textLoadDataWatched","loadDataRef","toRef","newVal","oldVal","formCreateChild","innerHTML","make","input","idate","textarea","search","password","adjustTextareaHeight","textareaEl","scrollHeight","overflow","el","querySelector","MutationObserver","observer","observe","attributes","attributeFilter","childList","subtree","characterData","intervalId","setInterval","vm","$once","disconnect","clearInterval","timePicker","tree","fieldNames","checkedKeys","checkable","row","_","col","span","rangePicker","timeRangePicker","cusStoreSelect","toFormValue","toValue","formValue","vnode","on","originalUpdateModelValue","nextTick","fieldName","fieldCtx","getFieldCtx","$manager","originalChange","cusUserSelect","inject","flex","_ref","_props$resetMarginBot","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","show","resetMarginBottom","wrap","wrapClass","split","includes","_ctx$rule$props$child","isVertical","ensureClass","childFlex","flexValue","_ref2","_ctx$rule$props$child2","_ctx$rule$props2","childWidth","widthValue","childrenNodes","space","direction","size","spaceStyles","compact","spin","_ctx$rule$containerMo","_ctx$rule$props3","_ctx$rule$props4","containerMode","_ref3","_ctx$prop$props$spinn","spinning","hasChildren","_ctx$rule$props5","_ctx$rule$props6","_ctx$prop$props6","_ctx$rule$props7","_ctx$prop$props7","_ref4","_ref5","_ctx$rule$containerMo2","_ctx$rule$props8","_ctx$prop$props8","tip","delay","div","alert","description","card","obj","path","log","parsers","init","_rule$effect","_rule$props","fetch","pagination","current","originalFetch","savedOriginalBeforeFetch","beforeFetch","_accTablePaginationHook","_rule$props2","_rule$props3","_rule$props4","pageParamName","paginationPageParam","pageSizeParamName","paginationPageSizeParam","paramType","paginationParamType","savedRule","config","_savedRule$props","currentPagination","currentPage","currentPageSize","pageSize","query","err","_rule$effect2","_rule$effect3","_rule$effect4","_rule$props5","_rule$props6","_rule$props7","_rule$props8","_rule$props1","_rule$effect6","_rule$effect7","_rule$effect9","_rule$props17","Error","stack","ruleType","ruleName","hasEffect","hasFetch","fetchValue","fetchType","hasPagination","paginationConfig","paginationType","allRuleProps","parsed","processedColumns","numValue","isNaN","isFinite","cellType","dataIndex","cellOptions","cellProps","customRender","record","cellValue","h","_e$target","_e$target2","target","inputValue","dataSource","_e$target3","_rule$props9","_rule$effect5","isLoading","_rule$props0","hasPaginationProp","paginationConfigType","isFalse","isObject","showSizeChanger","showQuickJumper","showTotal","hasPaginationConfig","paginationConfigValue","paginationCurrent","paginationCurrentDefined","_rule$props10","_rule$props11","_rule$props12","_rule$props13","_rule$props14","_rule$effect8","paginationResponseDataPath","paginationResponseTotalPath","currentPaginationObj","hasBeforeFetch","savedParamType","savedPageParamName","savedPageSizeParamName","_savedRule$props2","_savedRule$props3","configAction","action","hasApi","ruleProps","existingQuery","existingData","paginationObj","_accTableHandlersSet","page","_rule$props15","onShowSizeChange","_rule$props16","_rule$props18","_rule$props19","responseDataPath","responseTotalPath","dataList","scroll","rowKey","rowSelection","sticky","virtual","alias","tooltip","PRE","popover","button","icon","slider","rate","switch","inputNumber","treeSelect","inputPassword","formItem","space-compact","autoComplete","transfer","array","object","image","aImage","aAlert","Alert","aCard","Card","accTable","accTableTable","tidy","tidyRule","_rule","manager","validate","validateFields","clearValidateState","fItem","refs","wrapRef","clearValidate","tidyOptions","tidyBool","def","info","placement","mergeProps","isPreviewMode","isReadOnly","autoSize","rows","showCount","parentType","parentMenu","_menu","onPreview","originalOnPreview","sendPreviewMessage","file","url","uid","timestamp","apply","arguments","originalPreview","sendImagePreviewMessage","src","imageSrc","originalOnVisibleChange","onVisibleChange","visible","prevVisible","getDefaultOptions","hideRequiredMark","layout","labelAlign","labelCol","wrapperCol","validateOnRuleChange","gutter","click","adapterValidate","validator","reject","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","auto","number","time","useAlias","useSlider","types","frameInputs","frameFiles","frameImages","frameInputOne","frameFileOne","frameImageOne","maxLength","frameInput","frameFile","frameImage","useFrame","uploadFileOne","uploadImageOne","uploadType","uploadImage","uploadFile","useUpload","selectMultiple","mode","selectTags","selectCombobox","storeSelect","useCusStoreSelect","userSelect","useCusUserSelect","useText","useFlex","useSpace","useSpin","mobile","strict","test","email","idCard","checkCode","toUpperCase","weights","sum","parseInt","checkCodeIndex","requireProtocol","ip","parts","every","part","num","integer","positive","negative","isInteger","len","pattern","regex","RegExp","getTime","empty","notEmpty","chinese","alpha","caseSensitive","alphanumeric","bankCard","replace","postcode","licensePlate","creditCode","enum","enumList","equal","value1","value2","notEqual","uppercase","lowercase","toLowerCase","username","requireNumber","requireLetter","requireSpecial","hexColor","qq","wechat","tel","mac","base64","btoa","atob","json","numeric","port","isProduct","_parent","_parent2","_parent3","location","origin","MERCHANT_URL","tidyBtnProp","btn","Undef","extendApi","formEl","wrapEl","forms","all","isScope","emit","emitEvent","sub","toArray","fields","clearSub","helper","tidyFields","clearSubValidateState","getCtxs","submitBtnProps","isShow","resetBtnProps","refreshOptions","successFn","failFn","validateOnSubmit","beforeSubmit","invoke","onSubmit","request","getStoreInfo","storeId","method","dataType","params","res","_res$data","records","throttle","fn","lastTime","context","debounce","timer","$validator","$moment","moment","previewMode","enabled","modelFields","load","parseVal","clearProp","_rule$__fc__$refRule","__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.esm.js","sources":["../src/components/icon/QuestionCircleOutlined.vue","../src/components/icon/QuestionCircleOutlined.vue?vue&type=template&id=72badc20&lang.js","../src/components/CusSelect/index.vue","../src/components/CusSelect/index.vue?vue&type=template&id=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/accTable.js","../src/parsers/index.js","../src/parsers/rangePicker.js","../src/parsers/timeRangePicker.js","../src/parsers/cusStoreSelect.js","../src/parsers/cusUserSelect.js","../src/parsers/flex.js","../src/parsers/space.js","../src/parsers/spin.js","../src/parsers/div.js","../src/parsers/alert.js","../src/parsers/card.js","../src/core/alias.js","../src/core/manager.js","../src/core/config.js","../src/core/maker.js","../src/core/test.js","../src/core/host.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 '@longhongguo/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 // readOnly 属性的处理:如果设置了 readOnly,强制设置 disabled = true\n // 从 rule.props 或 ctx.prop.props 中读取 readOnly\n const isReadOnly =\n ctx.rule.props?.readOnly === true || props.readOnly === true\n if (isReadOnly) {\n props.disabled = 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\nimport { parseFn } from '@form-create/utils/lib/json'\r\nimport is from '@form-create/utils/lib/type'\r\nimport deepSet from '@form-create/utils/lib/deepset'\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 // 处理 loadData 函数\r\n if (props.loadData) {\r\n const api = ctx.$handle?.api\r\n const rule = ctx.rule\r\n const ctxRef = ctx\r\n\r\n // 解析函数(如果是字符串)\r\n let parsedFn = is.String(props.loadData)\r\n ? parseFn(props.loadData)\r\n : props.loadData\r\n\r\n // 如果不是函数,尝试包装\r\n if (!is.Function(parsedFn) && is.String(props.loadData)) {\r\n try {\r\n const code = props.loadData.trim()\r\n if (\r\n !code.startsWith('function') &&\r\n !code.startsWith('[[FORM-CREATE-PREFIX-function') &&\r\n !code.startsWith('$FNX:')\r\n ) {\r\n parsedFn = new Function(\r\n 'selectedOptions',\r\n 'options',\r\n 'updateOptions',\r\n 'api',\r\n 'rule',\r\n code\r\n )\r\n }\r\n } catch (e) {\r\n // 解析 loadData 失败,静默处理\r\n }\r\n }\r\n\r\n // 保存原始的 parsedFn,用于回显时调用(需要在 if 块外定义)\r\n let originalLoadDataFn = null\r\n\r\n if (is.Function(parsedFn)) {\r\n // 保存原始的 parsedFn,用于回显时调用\r\n originalLoadDataFn = parsedFn\r\n\r\n // 包装 loadData 函数\r\n props.loadData = function (selectedOptions) {\r\n if (!selectedOptions || selectedOptions.length === 0) return\r\n\r\n const targetOption = selectedOptions[selectedOptions.length - 1]\r\n\r\n if (targetOption?.isLeaf === true) {\r\n return\r\n }\r\n\r\n const options = props.options || []\r\n\r\n // 创建 updateOptions 函数,完全按照 effect.fetch 的方式\r\n // 关键:effect.fetch 使用 deepSet(inject.getProp(), 'props.options', val) 然后 api.sync(rule)\r\n const updateOptions = () => {\r\n // 关键:创建新数组时,同时创建新对象,确保引用完全改变\r\n // 这样可以触发 Vue 的响应式更新,即使对象属性被修改了\r\n const currentOptions = props.options || []\r\n\r\n // 递归查找并更新选项的函数\r\n // 通过 value 路径来查找,避免引用问题\r\n const updateOptionRecursive = (\r\n optionsList,\r\n pathValues,\r\n depth,\r\n newChildren\r\n ) => {\r\n if (!pathValues || pathValues.length === 0) {\r\n // 如果没有路径,直接返回深拷贝的选项\r\n return optionsList.map((item) => ({\r\n ...item,\r\n children: item.children\r\n ? item.children.map((child) => ({ ...child }))\r\n : undefined\r\n }))\r\n }\r\n\r\n const currentValue = pathValues[depth]\r\n const isLast = depth === pathValues.length - 1\r\n\r\n return optionsList.map((item) => {\r\n const newItem = { ...item }\r\n\r\n // 如果当前项匹配路径的当前层级值\r\n if (\r\n (item.value !== undefined && item.value === currentValue) ||\r\n (item.id !== undefined && item.id === currentValue)\r\n ) {\r\n if (isLast) {\r\n // 是最后一个值(目标项),更新 children\r\n newItem.children = newChildren\r\n ? [...newChildren]\r\n : undefined\r\n newItem.loading = false\r\n // 保持其他属性不变,但深拷贝 children\r\n return newItem\r\n } else {\r\n // 不是最后一个,需要递归更新其 children\r\n if (item.children && item.children.length > 0) {\r\n // 递归更新子项\r\n newItem.children = updateOptionRecursive(\r\n item.children,\r\n pathValues,\r\n depth + 1,\r\n newChildren\r\n )\r\n } else {\r\n // 如果没有 children,保持 undefined\r\n newItem.children = undefined\r\n }\r\n return newItem\r\n }\r\n }\r\n\r\n // 不匹配的项,也需要递归处理其 children(以防路径在其他分支)\r\n if (item.children && item.children.length > 0) {\r\n newItem.children = updateOptionRecursive(\r\n item.children,\r\n pathValues,\r\n depth,\r\n newChildren\r\n )\r\n } else {\r\n // 如果没有 children,深拷贝基本结构\r\n newItem.children = undefined\r\n }\r\n\r\n return newItem\r\n })\r\n }\r\n\r\n // 从 selectedOptions 中提取 value 路径\r\n const pathValues = selectedOptions.map((opt) => opt.value || opt.id)\r\n\r\n // 使用递归函数更新选项(从第0层开始)\r\n const newOptions = updateOptionRecursive(\r\n currentOptions,\r\n pathValues,\r\n 0,\r\n targetOption ? targetOption.children : undefined\r\n )\r\n\r\n // 完全按照 effect.fetch 的方式:使用 deepSet 在响应式对象上设置值\r\n // effect.fetch 使用: deepSet(inject.getProp(), 'props.options', val)\r\n // inject.getProp() 返回 ctx.effectData('fetch')\r\n // 所以我们应该在同一个位置设置:ctxRef.effectData('fetch')\r\n const fetchData = ctxRef.effectData('fetch')\r\n if (fetchData) {\r\n // 关键:在 fetchData 上设置,就像 effect.fetch 那样\r\n deepSet(fetchData, 'props.options', newOptions)\r\n }\r\n\r\n // 同时直接更新 props.options(这是最终传递给组件的值)\r\n props.options = newOptions\r\n\r\n // 同步到 ctx.prop.props.options(确保 mergeRule 能获取到最新值)\r\n if (ctxRef.prop?.props) {\r\n ctxRef.prop.props.options = newOptions\r\n }\r\n\r\n // 同步到 rule.props.options\r\n if (ctxRef.rule?.props) {\r\n ctxRef.rule.props.options = newOptions\r\n }\r\n\r\n // 调用 api.sync 触发更新,就像 effect.fetch 那样\r\n if (api && rule) {\r\n api.sync(rule)\r\n }\r\n\r\n // 刷新组件\r\n if (ctxRef.$handle) {\r\n ctxRef.$handle.refresh()\r\n }\r\n }\r\n\r\n // 关键:在调用用户函数之前,立即设置 loading 并更新\r\n // 这样确保 loading 状态能立即显示\r\n if (targetOption) {\r\n targetOption.loading = true\r\n updateOptions()\r\n }\r\n\r\n // 调用用户函数\r\n const result = parsedFn.call(\r\n this,\r\n selectedOptions,\r\n options,\r\n updateOptions,\r\n api,\r\n rule\r\n )\r\n\r\n // 如果用户函数返回 Promise,等待完成\r\n if (result && typeof result.then === 'function') {\r\n return result.finally(() => {\r\n updateOptions()\r\n })\r\n }\r\n\r\n return result\r\n }\r\n }\r\n\r\n // 处理回显时的数据加载 - 当 value 变化时触发(包括初始值和 setValue)\r\n // 使用一个函数来处理,可以在多个地方调用\r\n const triggerLoadDataForValue = (valueToLoad) => {\r\n if (\r\n !valueToLoad ||\r\n !Array.isArray(valueToLoad) ||\r\n valueToLoad.length <= 1 ||\r\n !props.loadData ||\r\n typeof props.loadData !== 'function'\r\n ) {\r\n return\r\n }\r\n\r\n // 延迟执行,等待 effect.fetch 完成第一级数据加载\r\n const timerKey = `_loadDataTimer_${ctx.rule._fc_id || Date.now()}`\r\n if (ctx.rule[timerKey]) {\r\n clearTimeout(ctx.rule[timerKey])\r\n }\r\n\r\n ctx.rule[timerKey] = setTimeout(() => {\r\n let retryCount = 0\r\n const maxRetries = 50 // 最多重试50次,即5秒\r\n\r\n const loadInitialData = async () => {\r\n retryCount++\r\n const fetchData = ctxRef.effectData('fetch')\r\n\r\n // 如果超过最大重试次数,停止\r\n if (retryCount > maxRetries) {\r\n return\r\n }\r\n\r\n // 如果还在加载第一级数据,等待\r\n if (fetchData && fetchData.loading === true) {\r\n setTimeout(loadInitialData, 100)\r\n return\r\n }\r\n\r\n let currentOptions = props.options || []\r\n\r\n if (!currentOptions || currentOptions.length === 0) {\r\n // 检查 fetchData 中是否有 options\r\n if (fetchData && fetchData.props && fetchData.props.options) {\r\n currentOptions = fetchData.props.options\r\n props.options = currentOptions\r\n } else {\r\n setTimeout(loadInitialData, 100)\r\n return\r\n }\r\n }\r\n\r\n if (!currentOptions || currentOptions.length === 0) {\r\n return\r\n }\r\n\r\n // 递归加载缺失的数据\r\n const loadMissingData = async (pathValues, startDepth) => {\r\n if (startDepth >= pathValues.length - 1) {\r\n return\r\n }\r\n\r\n // 重新获取最新的 options\r\n currentOptions = props.options || []\r\n\r\n // 构建 selectedOptions(从根到当前层级)\r\n const selectedOptions = []\r\n let currentLevelOptions = currentOptions\r\n for (let i = 0; i <= startDepth; i++) {\r\n const val = pathValues[i]\r\n const option = currentLevelOptions.find(\r\n (opt) => opt.value === val || opt.id === val\r\n )\r\n if (option) {\r\n selectedOptions.push(option)\r\n currentLevelOptions = option.children || []\r\n } else {\r\n return\r\n }\r\n }\r\n\r\n const currentOption = selectedOptions[startDepth]\r\n\r\n // 如果已经是叶子节点,不需要加载\r\n if (currentOption.isLeaf === true) {\r\n return\r\n }\r\n\r\n // 检查是否需要加载子级数据\r\n const nextValue = pathValues[startDepth + 1]\r\n if (nextValue === undefined || nextValue === null) {\r\n return\r\n }\r\n\r\n // 检查是否已有子级数据\r\n const hasChildren =\r\n currentOption.children &&\r\n Array.isArray(currentOption.children) &&\r\n currentOption.children.length > 0\r\n\r\n if (!hasChildren) {\r\n // 需要触发 loadData 加载\r\n // 设置 loading 状态\r\n currentOption.loading = true\r\n\r\n try {\r\n const result = props.loadData(selectedOptions)\r\n\r\n // 如果返回 Promise,等待完成\r\n if (result && typeof result.then === 'function') {\r\n await result\r\n }\r\n\r\n // 等待数据更新\r\n await new Promise((resolve) => setTimeout(resolve, 300))\r\n\r\n // 继续加载下一级\r\n if (startDepth + 1 < pathValues.length - 1) {\r\n await loadMissingData(pathValues, startDepth + 1)\r\n }\r\n } catch (error) {\r\n currentOption.loading = false\r\n }\r\n } else {\r\n // 已经有 children,直接继续加载下一级\r\n await loadMissingData(pathValues, startDepth + 1)\r\n }\r\n }\r\n\r\n // 开始加载数据\r\n loadMissingData(valueToLoad, 0).catch(() => {\r\n // 静默处理错误\r\n })\r\n }\r\n\r\n loadInitialData()\r\n }, 500)\r\n }\r\n\r\n // 在 mergeProp 中触发(处理初始值和 setValue 的情况)\r\n const currentValue = ctx.rule.value\r\n // 检查 value 是否变化(通过比较字符串化的值)\r\n const valueKey = JSON.stringify(currentValue || [])\r\n const lastValueKey = ctx.rule._lastLoadDataValueKey\r\n\r\n if (\r\n valueKey !== lastValueKey &&\r\n currentValue &&\r\n Array.isArray(currentValue)\r\n ) {\r\n ctx.rule._lastLoadDataValueKey = valueKey\r\n triggerLoadDataForValue(currentValue)\r\n }\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 mounted(ctx) {\r\n // mounted 时也触发一次,确保初始值能正确加载\r\n const value = ctx.rule.value\r\n const props = ctx.prop.props\r\n\r\n if (value && Array.isArray(value) && value.length > 1 && props.loadData) {\r\n // 延迟一点,确保 mergeProp 已完成\r\n setTimeout(() => {\r\n const loadDataFn = ctx.prop.props.loadData\r\n if (loadDataFn && typeof loadDataFn === 'function') {\r\n // 重新触发一次加载逻辑(会通过 mergeProp 中的逻辑处理)\r\n // 通过触发 value 变化来触发加载\r\n ctx.rule._lastLoadDataValueKey = null\r\n }\r\n }, 100)\r\n }\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 mounted(ctx) {\n // 预览模式下,为 textarea 设置自适应高度\n if (\n ctx.prop.props?.type === 'textarea' &&\n ctx.prop.props?.readOnly &&\n ctx.$handle?.preview === true\n ) {\n const adjustTextareaHeight = (textareaEl) => {\n if (!textareaEl) return\n // 重置高度,然后设置为 scrollHeight\n textareaEl.style.height = 'auto'\n const scrollHeight = textareaEl.scrollHeight\n if (scrollHeight > 0) {\n textareaEl.style.height = scrollHeight + 'px'\n }\n textareaEl.style.overflow = 'hidden'\n }\n\n // 延迟执行,确保 DOM 已完全渲染\n setTimeout(() => {\n const el = ctx.el\n if (!el) return\n\n // 查找 textarea 元素\n const textarea =\n el.querySelector('textarea.ant-input') || el.querySelector('textarea')\n if (!textarea) return\n\n // 首次调整高度\n adjustTextareaHeight(textarea)\n\n // 使用 MutationObserver 监听内容变化\n if (typeof MutationObserver !== 'undefined') {\n const observer = new MutationObserver(() => {\n adjustTextareaHeight(textarea)\n })\n\n observer.observe(textarea, {\n attributes: true,\n attributeFilter: ['value'],\n childList: true,\n subtree: true,\n characterData: true\n })\n\n // 定期检查并调整(备用方案)\n const intervalId = setInterval(() => {\n adjustTextareaHeight(textarea)\n }, 200)\n\n // 在组件销毁时清理\n if (ctx.$handle && ctx.$handle.vm) {\n ctx.$handle.vm.$once('hook:beforeUnmount', () => {\n observer.disconnect()\n clearInterval(intervalId)\n })\n }\n }\n }, 100)\n }\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 { hasProperty } from '@form-create/utils/lib/type'\r\nimport { deepCopy } from '@form-create/utils/lib/deepextend'\r\nimport { h } from 'vue'\r\n\r\n// 简单的 getValue 函数,根据路径字符串获取嵌套对象的值\r\nfunction getValue(obj, path) {\r\n if (!obj || !path) return undefined\r\n const keys = path.split('.')\r\n let value = obj\r\n for (const key of keys) {\r\n if (value == null) return undefined\r\n value = value[key]\r\n }\r\n return value\r\n}\r\n\r\nexport default {\r\n name: 'accTable',\r\n init(ctx) {\r\n // 在初始化时就设置 beforeFetch 钩子,确保在第一次请求之前就已经添加\r\n const rule = ctx.rule\r\n\r\n // 如果启用了分页且有远程数据源,在 init 时就添加 beforeFetch 钩子\r\n if (\r\n rule.effect?.fetch &&\r\n rule.props?.pagination &&\r\n typeof rule.props.pagination === 'object' &&\r\n rule.props.pagination.current !== undefined\r\n ) {\r\n const originalFetch = rule.effect.fetch\r\n if (typeof originalFetch === 'object') {\r\n const savedOriginalBeforeFetch = originalFetch.beforeFetch\r\n const isOurBeforeFetch =\r\n savedOriginalBeforeFetch &&\r\n savedOriginalBeforeFetch._accTablePaginationHook === true\r\n\r\n if (!isOurBeforeFetch) {\r\n // 获取分页参数配置\r\n const pageParamName = rule.props?.paginationPageParam || 'page'\r\n const pageSizeParamName =\r\n rule.props?.paginationPageSizeParam || 'pageSize'\r\n const paramType = rule.props?.paginationParamType || 'query'\r\n const savedRule = rule\r\n\r\n originalFetch.beforeFetch = (config, { api }) => {\r\n const currentPagination = savedRule?.props?.pagination\r\n if (currentPagination && typeof currentPagination === 'object') {\r\n const currentPage = currentPagination.current || 1\r\n const currentPageSize = currentPagination.pageSize || 10\r\n\r\n if (paramType === 'query') {\r\n config.query = {\r\n ...(config.query || {}),\r\n [pageParamName]: currentPage,\r\n [pageSizeParamName]: currentPageSize\r\n }\r\n } else {\r\n config.data = {\r\n ...(config.data || {}),\r\n [pageParamName]: currentPage,\r\n [pageSizeParamName]: currentPageSize\r\n }\r\n }\r\n }\r\n\r\n // 调用原始的 beforeFetch 钩子(如果存在)\r\n if (\r\n savedOriginalBeforeFetch &&\r\n typeof savedOriginalBeforeFetch === 'function'\r\n ) {\r\n try {\r\n const result = savedOriginalBeforeFetch(config, { api })\r\n if (result && typeof result.then === 'function') {\r\n return result.catch((err) => {\r\n console.error(\r\n '[accTable] 原始 beforeFetch 钩子执行出错:',\r\n err\r\n )\r\n return Promise.resolve()\r\n })\r\n }\r\n return result\r\n } catch (err) {\r\n console.error('[accTable] 原始 beforeFetch 钩子执行出错:', err)\r\n }\r\n }\r\n }\r\n\r\n originalFetch.beforeFetch._accTablePaginationHook = true\r\n }\r\n }\r\n }\r\n },\r\n mergeProp(ctx) {\r\n const props = ctx.prop.props || {}\r\n const rule = ctx.rule\r\n const api = ctx.api\r\n\r\n // 处理列配置 - 每次都要更新,确保 width 等属性变化时能生效\r\n let columns = rule.props?.columns || []\r\n // Struct 组件返回的是数组对象,直接使用;如果是字符串,尝试解析为 JSON(向后兼容)\r\n if (typeof columns === 'string') {\r\n try {\r\n const parsed = JSON.parse(columns)\r\n if (Array.isArray(parsed)) {\r\n columns = parsed\r\n }\r\n } catch (e) {\r\n console.warn('accTable columns parse error:', e)\r\n columns = []\r\n }\r\n }\r\n // 确保 columns 是数组\r\n if (!Array.isArray(columns)) {\r\n columns = []\r\n }\r\n // 过滤掉 hidden 为 true 的列,同时确保所有其他属性(如 width、align、fixed 等)都被保留\r\n const processedColumns = columns\r\n .filter((col) => !col || !col.hidden)\r\n .map((col) => {\r\n // 创建列对象的副本,确保所有属性都被保留(包括 width、align、fixed 等)\r\n const column = { ...col }\r\n\r\n // 处理 width 属性:确保它能够正确传递\r\n // Ant Design Vue Table 支持 width 为 number 或 string\r\n // 如果 width 是纯数字字符串(如 \"100\"),可以转换为数字以便更好的性能\r\n // 如果 width 是带单位的字符串(如 \"100px\"),保持字符串\r\n if (\r\n column.width !== undefined &&\r\n column.width !== null &&\r\n column.width !== ''\r\n ) {\r\n if (typeof column.width === 'string') {\r\n // 如果是纯数字字符串,转换为数字\r\n const numValue = Number(column.width)\r\n if (\r\n !isNaN(numValue) &&\r\n isFinite(numValue) &&\r\n column.width.trim() === String(numValue)\r\n ) {\r\n column.width = numValue\r\n }\r\n // 如果不是纯数字(如 \"100px\"),保持字符串\r\n }\r\n // 如果已经是数字,直接使用\r\n }\r\n\r\n // 处理单元格表单组件\r\n if (\r\n column.cellType &&\r\n ['input', 'select', 'radio'].includes(column.cellType)\r\n ) {\r\n const cellType = column.cellType\r\n const dataIndex = column.dataIndex\r\n const cellProps = column.cellProps || {}\r\n\r\n // 创建 customRender 函数\r\n column.customRender = ({ text, record, index }) => {\r\n const cellValue = record && dataIndex ? record[dataIndex] : text\r\n // 将 cellOptions 转换为数组格式(支持对象和数组两种格式)\r\n let options = []\r\n const cellOptions = column.cellOptions\r\n if (Array.isArray(cellOptions)) {\r\n // 如果已经是数组,直接使用\r\n options = cellOptions\r\n } else if (cellOptions && typeof cellOptions === 'object') {\r\n // 如果是对象,转换为数组格式 { 是: 1, 否: 0 } => [{label: '是', value: 1}, {label: '否', value: 0}]\r\n options = Object.keys(cellOptions).map((label) => ({\r\n label,\r\n value: cellOptions[label]\r\n }))\r\n }\r\n\r\n if (cellType === 'input') {\r\n // 渲染 input 组件\r\n return h('a-input', {\r\n value: cellValue,\r\n 'onUpdate:value': (val) => {\r\n // Ant Design Vue 的 Input 使用 value 和 onUpdate:value\r\n if (record && dataIndex) {\r\n record[dataIndex] = val\r\n // 触发表格数据更新\r\n if (ctx.api && ctx.api.form && rule.field) {\r\n ctx.api.form[rule.field] = props.dataSource\r\n }\r\n }\r\n },\r\n placeholder: cellProps.placeholder || '',\r\n disabled: cellProps.disabled || false,\r\n size: cellProps.size || 'small',\r\n ...cellProps\r\n })\r\n } else if (cellType === 'select') {\r\n // 渲染 select 组件\r\n return h(\r\n 'a-select',\r\n {\r\n value: cellValue,\r\n 'onUpdate:value': (val) => {\r\n // Ant Design Vue 的 Select 使用 value 和 onUpdate:value\r\n if (record && dataIndex) {\r\n record[dataIndex] = val\r\n // 触发表格数据更新\r\n if (ctx.api && ctx.api.form && rule.field) {\r\n ctx.api.form[rule.field] = props.dataSource\r\n }\r\n }\r\n },\r\n placeholder: cellProps.placeholder || '',\r\n disabled: cellProps.disabled || false,\r\n size: cellProps.size || 'small',\r\n ...cellProps\r\n },\r\n {\r\n default: () =>\r\n options.map((opt) => {\r\n return h('a-select-option', {\r\n key: opt.value,\r\n value: opt.value,\r\n label: opt.label\r\n })\r\n })\r\n }\r\n )\r\n } else if (cellType === 'radio') {\r\n // 渲染 radio 组件\r\n return h(\r\n 'a-radio-group',\r\n {\r\n modelValue: cellValue,\r\n 'onUpdate:modelValue': (val) => {\r\n // Ant Design Vue 的 RadioGroup 使用 modelValue\r\n if (record && dataIndex) {\r\n record[dataIndex] = val\r\n // 触发表格数据更新\r\n if (ctx.api && ctx.api.form && rule.field) {\r\n ctx.api.form[rule.field] = props.dataSource\r\n }\r\n }\r\n },\r\n disabled: cellProps.disabled || false,\r\n size: cellProps.size || 'small',\r\n ...cellProps\r\n },\r\n {\r\n default: () =>\r\n options.map((opt) => {\r\n return h(\r\n 'a-radio',\r\n {\r\n key: opt.value,\r\n value: opt.value\r\n },\r\n {\r\n default: () => opt.label || opt.value\r\n }\r\n )\r\n })\r\n }\r\n )\r\n }\r\n\r\n // 如果没有匹配的类型,返回原始文本\r\n return text\r\n }\r\n }\r\n\r\n // 确保其他列属性也被保留(align、fixed、title、dataIndex 等)\r\n return column\r\n })\r\n\r\n // 始终更新 props.columns,确保列配置变化(包括 width)时能生效\r\n props.columns = processedColumns\r\n\r\n // 初始化数据源\r\n if (!hasProperty(props, 'dataSource')) {\r\n let dataSource = rule.value || rule.props?.dataSource || []\r\n // Struct 组件返回的是数组对象,直接使用;如果是字符串,尝试解析为 JSON(向后兼容)\r\n if (typeof dataSource === 'string' && !rule.effect?.fetch) {\r\n try {\r\n const parsed = JSON.parse(dataSource)\r\n if (Array.isArray(parsed)) {\r\n dataSource = parsed\r\n }\r\n } catch (e) {\r\n console.warn('accTable dataSource parse error:', e)\r\n dataSource = []\r\n }\r\n }\r\n // 确保 dataSource 是数组\r\n if (!Array.isArray(dataSource)) {\r\n dataSource = []\r\n }\r\n props.dataSource = dataSource\r\n }\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 // 设置 loading 状态\r\n if (hasProperty(props, 'loading')) {\r\n props.loading =\r\n rule.props?.loading !== undefined ? rule.props.loading : isLoading\r\n } else {\r\n props.loading = isLoading\r\n }\r\n\r\n // 处理分页配置\r\n const paginationConfig = rule.props?.pagination\r\n\r\n // 处理分页 props(只有在 props 中没有 pagination 时才初始化)\r\n if (!hasProperty(props, 'pagination')) {\r\n if (paginationConfig === false) {\r\n props.pagination = false\r\n } else if (paginationConfig && typeof paginationConfig === 'object') {\r\n const pagination = {\r\n current: paginationConfig.current || 1,\r\n pageSize: paginationConfig.pageSize || 10,\r\n total: paginationConfig.total || 0,\r\n showSizeChanger: paginationConfig.showSizeChanger !== false,\r\n showQuickJumper: paginationConfig.showQuickJumper || false,\r\n showTotal: paginationConfig.showTotal,\r\n ...paginationConfig\r\n }\r\n\r\n props.pagination = pagination\r\n } else {\r\n // 默认不启用分页\r\n props.pagination = false\r\n }\r\n }\r\n\r\n // 无论 props.pagination 是否已存在,只要满足条件就添加/检查 beforeFetch 钩子\r\n if (\r\n rule.effect?.fetch &&\r\n paginationConfig &&\r\n typeof paginationConfig === 'object' &&\r\n paginationConfig.current !== undefined\r\n ) {\r\n // 获取分页参数配置\r\n const pageParamName = rule.props?.paginationPageParam || 'page'\r\n const pageSizeParamName =\r\n rule.props?.paginationPageSizeParam || 'pageSize'\r\n const paramType = rule.props?.paginationParamType || 'query' // 'query' 或 'data'\r\n const responseDataPath = rule.props?.paginationResponseDataPath || 'data'\r\n const responseTotalPath =\r\n rule.props?.paginationResponseTotalPath || 'total'\r\n\r\n // 获取当前分页对象(从 props 或 paginationConfig)\r\n const currentPaginationObj = props.pagination || paginationConfig\r\n\r\n // 包装 fetch 配置,通过 beforeFetch 钩子动态注入分页参数\r\n const originalFetch = rule.effect.fetch\r\n\r\n if (typeof originalFetch === 'object') {\r\n // 保存原始配置和分页参数配置到闭包中\r\n const savedParamType = paramType\r\n const savedPageParamName = pageParamName\r\n const savedPageSizeParamName = pageSizeParamName\r\n const savedOriginalBeforeFetch = originalFetch.beforeFetch\r\n // 在闭包中保存 rule 的引用,因为 beforeFetch 只接收 (config, {api}) 参数\r\n const savedRule = rule\r\n\r\n // 检查是否已经添加过我们的 beforeFetch 钩子(通过检查函数是否包含特定标记)\r\n const isOurBeforeFetch =\r\n savedOriginalBeforeFetch &&\r\n savedOriginalBeforeFetch._accTablePaginationHook === true\r\n\r\n if (!isOurBeforeFetch) {\r\n // 添加 beforeFetch 钩子来注入分页参数\r\n // 注意:form-create 的 beforeFetch 只接收 (config, {api}) 参数,没有 rule\r\n originalFetch.beforeFetch = (config, { api }) => {\r\n // 从闭包中获取当前分页配置\r\n const currentPagination = savedRule?.props?.pagination\r\n\r\n if (currentPagination && typeof currentPagination === 'object') {\r\n const currentPage = currentPagination.current || 1\r\n const currentPageSize = currentPagination.pageSize || 10\r\n\r\n // 添加分页参数(使用闭包中保存的参数名)\r\n if (savedParamType === 'query') {\r\n // 合并已有的 query 参数,确保不覆盖用户自定义的参数\r\n config.query = {\r\n ...(config.query || {}),\r\n [savedPageParamName]: currentPage,\r\n [savedPageSizeParamName]: currentPageSize\r\n }\r\n } else {\r\n // 合并已有的 data 参数,确保不覆盖用户自定义的参数\r\n config.data = {\r\n ...(config.data || {}),\r\n [savedPageParamName]: currentPage,\r\n [savedPageSizeParamName]: currentPageSize\r\n }\r\n }\r\n } else {\r\n console.warn('[accTable] 分页配置无效,无法添加分页参数:', {\r\n currentPagination,\r\n type: typeof currentPagination\r\n })\r\n }\r\n\r\n // 调用原始的 beforeFetch 钩子(如果存在)\r\n // 原始钩子可能也只接收 (config, {api}) 参数\r\n // 使用 try-catch 包装,避免原始钩子中的错误影响我们的逻辑\r\n if (\r\n savedOriginalBeforeFetch &&\r\n typeof savedOriginalBeforeFetch === 'function'\r\n ) {\r\n try {\r\n const result = savedOriginalBeforeFetch(config, { api })\r\n // 如果原始钩子返回了 Promise,处理它\r\n if (result && typeof result.then === 'function') {\r\n return result.catch((err) => {\r\n console.error(\r\n '[accTable] 原始 beforeFetch 钩子执行出错:',\r\n err\r\n )\r\n // 即使原始钩子出错,也继续执行\r\n return Promise.resolve()\r\n })\r\n }\r\n return result\r\n } catch (err) {\r\n console.error('[accTable] 原始 beforeFetch 钩子执行出错:', err)\r\n // 即使原始钩子出错,也继续执行,不影响分页参数的添加\r\n }\r\n }\r\n }\r\n\r\n // 标记这是我们添加的钩子,避免重复添加\r\n originalFetch.beforeFetch._accTablePaginationHook = true\r\n }\r\n } else {\r\n console.warn('[accTable] fetch 配置不是对象类型:', {\r\n type: typeof originalFetch,\r\n originalFetch\r\n })\r\n }\r\n\r\n // 添加分页 onChange 和 onShowSizeChange 事件处理(确保事件处理函数存在,且只设置一次)\r\n const paginationObj = props.pagination || paginationConfig\r\n if (paginationObj && typeof paginationObj === 'object') {\r\n // 检查是否已经设置过事件处理函数(通过标记判断)\r\n if (!paginationObj._accTableHandlersSet) {\r\n if (!paginationObj.onChange) {\r\n paginationObj.onChange = (page, size) => {\r\n // 更新分页配置\r\n if (rule.props?.pagination) {\r\n rule.props.pagination.current = page\r\n rule.props.pagination.pageSize = size\r\n }\r\n // 分页参数已经通过 beforeFetch 钩子自动添加,只需要触发重新加载\r\n ctx.api.sync(rule)\r\n setTimeout(() => {\r\n ctx.api.refresh()\r\n }, 0)\r\n }\r\n }\r\n\r\n if (!paginationObj.onShowSizeChange) {\r\n paginationObj.onShowSizeChange = (current, size) => {\r\n if (rule.props?.pagination) {\r\n rule.props.pagination.current = 1 // 改变每页条数时重置到第一页\r\n rule.props.pagination.pageSize = size\r\n }\r\n // 分页参数已经通过 beforeFetch 钩子自动添加,只需要触发重新加载\r\n ctx.api.sync(rule)\r\n setTimeout(() => {\r\n ctx.api.refresh()\r\n }, 0)\r\n }\r\n }\r\n\r\n // 标记事件处理函数已设置,避免重复设置\r\n paginationObj._accTableHandlersSet = true\r\n\r\n // 如果 props.pagination 不存在,将 paginationObj 赋值给 props.pagination\r\n if (!props.pagination) {\r\n props.pagination = paginationObj\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 处理远程数据响应,解析总记录数和数据列表\r\n if (rule.effect?.fetch && rule.props?.pagination) {\r\n const fetchData = ctx.effectData('fetch')\r\n if (fetchData && fetchData.value) {\r\n const responseDataPath =\r\n rule.props?.paginationResponseDataPath || 'data'\r\n const responseTotalPath =\r\n rule.props?.paginationResponseTotalPath || 'total'\r\n\r\n try {\r\n // 解析数据列表\r\n const dataList = getValue(fetchData.value, responseDataPath)\r\n if (Array.isArray(dataList)) {\r\n props.dataSource = dataList\r\n rule.value = dataList\r\n rule.props.dataSource = dataList\r\n }\r\n\r\n // 解析总记录数\r\n const total = getValue(fetchData.value, responseTotalPath)\r\n if (\r\n typeof total === 'number' &&\r\n rule.props.pagination &&\r\n typeof rule.props.pagination === 'object'\r\n ) {\r\n rule.props.pagination.total = total\r\n if (props.pagination && typeof props.pagination === 'object') {\r\n props.pagination.total = total\r\n }\r\n }\r\n } catch (e) {\r\n console.warn('accTable parse response error:', e)\r\n }\r\n }\r\n }\r\n\r\n // 设置其他常用配置\r\n if (hasProperty(rule.props, 'bordered')) {\r\n props.bordered = rule.props.bordered\r\n }\r\n if (hasProperty(rule.props, 'size')) {\r\n props.size = rule.props.size\r\n }\r\n if (hasProperty(rule.props, 'scroll')) {\r\n props.scroll = rule.props.scroll\r\n }\r\n if (hasProperty(rule.props, 'rowKey')) {\r\n props.rowKey = rule.props.rowKey || 'id'\r\n }\r\n if (hasProperty(rule.props, 'rowSelection')) {\r\n props.rowSelection = rule.props.rowSelection\r\n }\r\n if (hasProperty(rule.props, 'sticky')) {\r\n props.sticky = rule.props.sticky\r\n }\r\n if (hasProperty(rule.props, 'virtual')) {\r\n props.virtual = rule.props.virtual\r\n }\r\n },\r\n render(children, ctx) {\r\n // 使用默认渲染\r\n return ctx.$render.defaultRender(ctx, children)\r\n }\r\n}\r\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'\nimport spin from './spin'\nimport div from './div'\nimport alert from './alert'\nimport card from './card'\nimport accTable from './accTable'\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 spin,\n div,\n alert,\n card,\n accTable\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 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 { 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 // 读取 resetMarginBottom 配置,用于重置包裹 flex 的 ant-form-item 的 margin-bottom\r\n const resetMarginBottom =\r\n props.resetMarginBottom ?? ctx.rule.resetMarginBottom ?? false\r\n if (resetMarginBottom) {\r\n // 将 class 添加到 wrap 配置中,使其应用到包裹 flex 的 ant-form-item 上\r\n if (!ctx.rule.wrap) {\r\n ctx.rule.wrap = {}\r\n }\r\n if (typeof ctx.rule.wrap === 'object' && !ctx.rule.wrap.class) {\r\n ctx.rule.wrap.class = ''\r\n }\r\n const wrapClass =\r\n typeof ctx.rule.wrap === 'object'\r\n ? (ctx.rule.wrap.class || '').split(' ').filter(Boolean)\r\n : []\r\n if (!wrapClass.includes('_fc-reset-margin-bottom')) {\r\n wrapClass.push('_fc-reset-margin-bottom')\r\n if (typeof ctx.rule.wrap === 'object') {\r\n ctx.rule.wrap.class = wrapClass.join(' ')\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 // 读取 resetMarginBottom 配置,用于重置包裹 space 的 ant-form-item 的 margin-bottom\r\n const resetMarginBottom =\r\n props.resetMarginBottom ?? ctx.rule.resetMarginBottom ?? false\r\n if (resetMarginBottom) {\r\n // 将 class 添加到 wrap 配置中,使其应用到包裹 space 的 ant-form-item 上\r\n if (!ctx.rule.wrap) {\r\n ctx.rule.wrap = {}\r\n }\r\n if (typeof ctx.rule.wrap === 'object' && !ctx.rule.wrap.class) {\r\n ctx.rule.wrap.class = ''\r\n }\r\n const wrapClass = typeof ctx.rule.wrap === 'object' \r\n ? (ctx.rule.wrap.class || '').split(' ').filter(Boolean)\r\n : []\r\n if (!wrapClass.includes('_fc-reset-margin-bottom')) {\r\n wrapClass.push('_fc-reset-margin-bottom')\r\n if (typeof ctx.rule.wrap === 'object') {\r\n ctx.rule.wrap.class = wrapClass.join(' ')\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","import { hasProperty } from '@form-create/utils/lib/type'\r\n\r\nexport default {\r\n name: 'spin',\r\n mergeProp(ctx) {\r\n // 确保不显示标题\r\n if (!ctx.rule.wrap) {\r\n ctx.rule.wrap = {}\r\n }\r\n ctx.rule.wrap.title = false\r\n\r\n const props = ctx.prop.props || {}\r\n\r\n // 读取 containerMode 配置\r\n const containerMode =\r\n ctx.rule.containerMode ??\r\n ctx.rule.props?.containerMode ??\r\n ctx.prop.props?.containerMode ??\r\n true\r\n\r\n // 如果不是容器模式,清空 children\r\n if (!containerMode) {\r\n ctx.rule.children = []\r\n }\r\n\r\n if (!hasProperty(props, 'spinning')) {\r\n props.spinning =\r\n ctx.prop.props?.spinning ?? ctx.rule.props?.spinning ?? false\r\n }\r\n\r\n // 如果没有子组件且不是容器模式,spinning 不应该为 true(避免显示空加载状态)\r\n const hasChildren =\r\n ctx.rule.children &&\r\n Array.isArray(ctx.rule.children) &&\r\n ctx.rule.children.length > 0\r\n if (!containerMode && !hasChildren && props.spinning) {\r\n // 独立模式下如果没有内容,不建议显示加载状态\r\n // 但这里不强制修改,让用户自己控制\r\n }\r\n\r\n // 支持从多个位置读取配置\r\n const bindField =\r\n ctx.rule.bindField ||\r\n ctx.rule.props?.bindField ||\r\n ctx.prop.props?.bindField\r\n let bindMode =\r\n ctx.rule.bindMode || ctx.rule.props?.bindMode || ctx.prop.props?.bindMode\r\n\r\n // 如果没有设置 bindMode,根据是否有 bindField 自动判断\r\n if (!bindMode) {\r\n 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: 'props.spinning',\r\n modify: true,\r\n wait: 300,\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 === 'props.spinning'\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 }\r\n }\r\n }\r\n\r\n // 只在容器模式下处理 children\r\n if (containerMode) {\r\n // 确保 children 存在\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 确保子组件不被 a-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 },\r\n render(children, ctx) {\r\n // 获取 spinning 状态\r\n const props = ctx.prop.props || {}\r\n const spinning = props.spinning || false\r\n\r\n // 设置组件类型为 a-spin\r\n if (!ctx.prop.props) {\r\n ctx.prop.props = {}\r\n }\r\n\r\n // 映射 props\r\n ctx.prop.props.spinning = spinning\r\n\r\n // 如果有 tip,设置 tip prop\r\n const tip = ctx.rule.tip || ctx.rule.props?.tip || ctx.prop.props?.tip\r\n if (tip) {\r\n ctx.prop.props.tip = tip\r\n }\r\n\r\n // 如果有 delay,设置 delay prop\r\n const delay =\r\n ctx.rule.delay || ctx.rule.props?.delay || ctx.prop.props?.delay\r\n if (delay != null) {\r\n ctx.prop.props.delay = delay\r\n }\r\n\r\n // 如果有 size,设置 size prop\r\n const size = ctx.rule.size || ctx.rule.props?.size || ctx.prop.props?.size\r\n if (size) {\r\n ctx.prop.props.size = size\r\n }\r\n\r\n // 设置类型为 a-spin\r\n if (ctx.prop.type === 'spin') {\r\n ctx.prop.type = 'a-spin'\r\n }\r\n\r\n // 读取 containerMode 配置\r\n const containerMode =\r\n ctx.rule.containerMode ??\r\n ctx.rule.props?.containerMode ??\r\n ctx.prop.props?.containerMode ??\r\n true\r\n\r\n // 如果不是容器模式,不渲染 children,直接使用 defaultRender\r\n if (!containerMode) {\r\n return ctx.$render.defaultRender(ctx, undefined)\r\n }\r\n\r\n // 容器模式:使用传入的 children 参数\r\n // children 参数已经是渲染好的 vnodes,直接传递给 a-spin\r\n const childrenNodes =\r\n children && Array.isArray(children) ? children : children || []\r\n\r\n // 将 spin 容器包装在 col 中,确保它占满整行(span: 24)\r\n // 直接使用 vNode.make 来渲染 a-spin,并传入 childrenNodes(类似 flex 组件的处理方式)\r\n return ctx.vNode.col(\r\n { props: { span: 24 } },\r\n {\r\n default: () => [ctx.vNode.make('a-spin', ctx.prop, childrenNodes)]\r\n }\r\n )\r\n }\r\n}\r\n","export default {\r\n name: 'div',\r\n mergeProp(ctx) {\r\n // 确保 children 存在\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 为 div 容器的所有子组件设置 col: false,避免被 a-col 包装\r\n // 这样子组件可以直接作为 div 的子元素\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 // 使用简单的 div 元素作为容器\r\n const prop = { ...ctx.prop }\r\n\r\n // 确保 type 是 'div'\r\n if (prop.type === 'div') {\r\n prop.type = 'div'\r\n }\r\n\r\n // children 会通过 form-create 的机制自动渲染\r\n const childrenNodes = children || []\r\n\r\n // 直接返回 div,不使用 a-col 或 a-row 包装\r\n // 确保样式是自适应(width: 100% 可能会影响布局,所以不设置)\r\n if (!prop.props) {\r\n prop.props = {}\r\n }\r\n if (!prop.props.style) {\r\n prop.props.style = {}\r\n }\r\n // 宽高自适应,不设置固定值\r\n // 保留用户自定义的样式\r\n\r\n // 直接使用 vNode.make 渲染 div,不包装\r\n return ctx.vNode.make('div', prop, childrenNodes)\r\n }\r\n}\r\n\r\n","export default {\r\n name: 'aAlert',\r\n // Alert 是非输入组件,不需要 modelField\r\n mergeProp(ctx) {\r\n const props = ctx.prop.props || {}\r\n // 如果没有 message 但有 description,将 description 作为 message\r\n // 这样 Alert 会显示为小的样式(只有 message,没有 description)\r\n if ((!props.message || props.message === '') && props.description) {\r\n props.message = props.description\r\n delete props.description\r\n }\r\n },\r\n render(children, ctx) {\r\n // 使用默认渲染,通过 alias 映射到 aAlert 组件\r\n return ctx.$render.defaultRender(ctx, children)\r\n }\r\n}\r\n","export default {\r\n name: 'aCard',\r\n mergeProp(ctx) {\r\n // 确保 children 存在\r\n if (!ctx.rule.children) {\r\n ctx.rule.children = []\r\n }\r\n\r\n // 为 Card 容器的所有子组件设置 col: false,避免被 a-col 包装\r\n // 这样子组件可以直接作为 Card 的子元素\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 // 使用默认渲染,通过 alias 映射到 aCard 组件\r\n return ctx.$render.defaultRender(ctx, children)\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 spin: PRE + 'Spin',\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 image: PRE + 'Image',\n aImage: PRE + 'Image',\n alert: PRE + 'Alert',\n aAlert: PRE + 'Alert',\n Alert: PRE + 'Alert',\n card: PRE + 'Card',\n aCard: PRE + 'Card',\n Card: PRE + 'Card',\n accTable: PRE + 'Table',\n accTableTable: PRE + 'Table'\n}\n","import getConfig from './config'\r\nimport mergeProps from '@form-create/utils/lib/mergeprops'\r\nimport is, { hasProperty } from '@form-create/utils/lib/type'\r\nimport extend from '@form-create/utils/lib/extend'\r\n\r\nfunction isTooltip(info) {\r\n return info.type === 'tooltip'\r\n}\r\n\r\nfunction tidy(props, name) {\r\n if (!hasProperty(props, name)) return\r\n if (is.String(props[name])) {\r\n props[name] = { [name]: props[name], show: true }\r\n }\r\n}\r\n\r\nfunction isFalse(val) {\r\n return val === false\r\n}\r\n\r\nfunction tidyBool(opt, name) {\r\n if (hasProperty(opt, name) && !is.Object(opt[name])) {\r\n opt[name] = { show: !!opt[name] }\r\n }\r\n}\r\n\r\nfunction tidyRule(rule) {\r\n const _rule = { ...rule }\r\n delete _rule.children\r\n return _rule\r\n}\r\n\r\nexport default {\r\n validate() {\r\n const form = this.form()\r\n if (form) {\r\n return form.validate()\r\n } else {\r\n return new Promise((v) => v())\r\n }\r\n },\r\n validateField(field) {\r\n const form = this.form()\r\n if (form) {\r\n return form.validateFields(field)\r\n } else {\r\n return new Promise((v) => v())\r\n }\r\n },\r\n clearValidateState(ctx) {\r\n const fItem = this.vm.refs[ctx.wrapRef]\r\n if (fItem) {\r\n fItem.clearValidate()\r\n }\r\n },\r\n tidyOptions(options) {\r\n ;['submitBtn', 'resetBtn', 'row', 'info', 'wrap', 'col', 'title'].forEach(\r\n (name) => {\r\n tidyBool(options, name)\r\n }\r\n )\r\n return options\r\n },\r\n tidyRule({ prop }) {\r\n tidy(prop, 'title')\r\n tidy(prop, 'info')\r\n return prop\r\n },\r\n mergeProp(ctx) {\r\n const def = {\r\n info: {\r\n type: 'popover',\r\n placement: 'topLeft',\r\n icon: 'QuestionCircleOutlined'\r\n },\r\n title: {},\r\n col: { span: 24 },\r\n wrap: {}\r\n }\r\n ;['info', 'wrap', 'col', 'title'].forEach((name) => {\r\n ctx.prop[name] = mergeProps(\r\n [this.options[name] || {}, ctx.prop[name] || {}],\r\n def[name]\r\n )\r\n })\r\n\r\n // 预览模式下:对 upload 组件设置 disabled\r\n // wangEditor 组件使用只读模式(readOnly),允许复制和点击链接\r\n // textarea 组件使用只读模式(readOnly),允许复制和自适应高度\r\n // select 组件使用 disabled 实现只读效果(通过 CSS 样式来保持外观)\r\n // 如果组件单独设置了 readOnly 属性,也应用相同的预览模式逻辑\r\n const isPreviewMode = this.$handle.preview === true\r\n // 从 rule.props 或 ctx.prop.props 中读取 readOnly 属性\r\n const isReadOnly =\r\n ctx.rule.props?.readOnly === true || ctx.prop.props?.readOnly === true\r\n const shouldApplyPreviewStyle = isPreviewMode || isReadOnly\r\n\r\n if (shouldApplyPreviewStyle) {\r\n if (ctx.rule.type === 'upload') {\r\n if (ctx.prop.props) {\r\n ctx.prop.props.disabled = true\r\n }\r\n } else if (ctx.rule.type === 'fcEditor') {\r\n // wangEditor 使用只读模式,不设置 disabled\r\n // 只读模式允许复制和点击链接,但禁止编辑\r\n if (ctx.prop.props) {\r\n ctx.prop.props.readOnly = true\r\n // 预览模式和只读模式下隐藏 placeholder\r\n delete ctx.prop.props.placeholder\r\n // 预览模式和只读模式下移除固定高度,使用自适应\r\n delete ctx.prop.props.height\r\n }\r\n } else if (\r\n ctx.rule.type === 'input' &&\r\n ctx.prop.props?.type === 'textarea'\r\n ) {\r\n // textarea 使用只读模式,不设置 disabled\r\n // 只读模式允许复制,但禁止编辑\r\n if (ctx.prop.props) {\r\n ctx.prop.props.readOnly = true\r\n // 完全自适应高度,不限制最大高度\r\n ctx.prop.props.autoSize = true\r\n // 移除 rows 属性,让 autoSize 完全控制高度\r\n delete ctx.prop.props.rows\r\n // 预览模式和只读模式下隐藏 placeholder\r\n delete ctx.prop.props.placeholder\r\n // 预览模式和只读模式下隐藏字符计数\r\n ctx.prop.props.showCount = false\r\n }\r\n } else if (ctx.rule.type === 'select') {\r\n // select 组件在预览模式下使用 disabled 实现只读效果\r\n // 注意:Ant Design Vue 的 Select 组件不支持 readOnly 属性\r\n // 所以在预览模式下使用 disabled,并通过 CSS 样式来保持外观\r\n // 强制设置 disabled = true,覆盖用户可能设置的 disabled: false\r\n if (ctx.prop.props) {\r\n ctx.prop.props.disabled = true\r\n // 预览模式和只读模式下隐藏 placeholder\r\n delete ctx.prop.props.placeholder\r\n // 如果原本设置了 readOnly,保留这个标记以便 CSS 识别\r\n if (isReadOnly) {\r\n // 可以在这里添加一个标记,但 Select 组件不支持 readOnly\r\n // 所以我们通过 disabled 来实现,CSS 会处理样式\r\n }\r\n }\r\n } else if (ctx.rule.type === 'input') {\r\n // input 组件支持 readOnly 属性\r\n // 如果设置了 readOnly,直接使用组件的 readOnly 属性\r\n if (ctx.prop.props && isReadOnly) {\r\n ctx.prop.props.readOnly = true\r\n // 预览模式和只读模式下隐藏 placeholder\r\n delete ctx.prop.props.placeholder\r\n // 预览模式和只读模式下隐藏字符计数\r\n ctx.prop.props.showCount = false\r\n } else if (ctx.prop.props && isPreviewMode) {\r\n // 全局预览模式下也隐藏 placeholder\r\n delete ctx.prop.props.placeholder\r\n // 全局预览模式下隐藏字符计数\r\n ctx.prop.props.showCount = false\r\n }\r\n } else if (\r\n ctx.rule.type === 'datePicker' ||\r\n ctx.rule.type === 'timePicker' ||\r\n ctx.rule.type === 'timeRangePicker' ||\r\n ctx.rule.type === 'rangePicker' ||\r\n ctx.rule.type === 'cascader'\r\n ) {\r\n // 日期选择器、时间选择器、级联选择器等组件\r\n // 预览模式和只读模式下隐藏 placeholder\r\n if (ctx.prop.props) {\r\n if (ctx.rule.type === 'cascader') {\r\n ctx.prop.props.disabled = true\r\n }\r\n delete ctx.prop.props.placeholder\r\n }\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 // 为 aImage 组件自动添加预览拦截,确保始终向父窗口发送预览通知\r\n if (\r\n (ctx.rule.type === 'image' || ctx.rule.type === 'aImage') &&\r\n !ctx.prop.props.preview\r\n ) {\r\n const sendImagePreviewMessage = function (src) {\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: src || ctx.prop.props.src || ''\r\n },\r\n timestamp: Date.now()\r\n },\r\n '*'\r\n )\r\n }\r\n }\r\n\r\n // 拦截 Image 组件的预览,发送消息给父窗口并阻止默认预览\r\n const imageSrc = ctx.prop.props.src || ''\r\n ctx.prop.props.preview = {\r\n visible: false,\r\n src: imageSrc,\r\n onVisibleChange: (visible, prevVisible) => {\r\n if (visible && !prevVisible) {\r\n // 发送预览通知给父窗口\r\n sendImagePreviewMessage(imageSrc)\r\n // 返回 false 阻止默认预览显示\r\n return false\r\n }\r\n }\r\n }\r\n } else if (\r\n (ctx.rule.type === 'image' || ctx.rule.type === 'aImage') &&\r\n ctx.prop.props.preview\r\n ) {\r\n // 如果用户已经设置了 preview,包装它以确保先发送消息\r\n const originalPreview = ctx.prop.props.preview\r\n const sendImagePreviewMessage = function (src) {\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: src || ctx.prop.props.src || ''\r\n },\r\n timestamp: Date.now()\r\n },\r\n '*'\r\n )\r\n }\r\n }\r\n\r\n const imageSrc = ctx.prop.props.src || ''\r\n const originalOnVisibleChange = originalPreview?.onVisibleChange\r\n\r\n ctx.prop.props.preview = {\r\n ...originalPreview,\r\n visible: originalPreview.visible || false,\r\n src: originalPreview.src || imageSrc,\r\n onVisibleChange: (visible, prevVisible) => {\r\n if (visible && !prevVisible) {\r\n // 先发送消息给父窗口\r\n sendImagePreviewMessage(originalPreview.src || imageSrc)\r\n }\r\n // 执行用户自定义的 onVisibleChange\r\n if (\r\n originalOnVisibleChange &&\r\n typeof originalOnVisibleChange === 'function'\r\n ) {\r\n return originalOnVisibleChange.apply(this, arguments)\r\n }\r\n // 默认阻止预览显示\r\n return false\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\nfunction useSpin(maker) {\n maker.spin = creatorFactory('spin')\n}\n\nuseAlias(maker)\nuseSlider(maker)\nuseFrame(maker)\nuseUpload(maker)\nuseSelect(maker)\nuseCusStoreSelect(maker)\nuseCusUserSelect(maker)\nuseText(maker)\nuseFlex(maker)\nuseSpace(maker)\nuseSpin(maker)\n\nexport default maker\n","/**\r\n * 常用校验工具类\r\n * 提供各种日常校验方法\r\n */\r\nclass Validator {\r\n /**\r\n * 校验手机号(中国大陆)\r\n * @param {string} value - 要校验的值\r\n * @param {boolean} strict - 是否严格模式(11位,1开头),默认 true\r\n * @returns {boolean} 校验结果\r\n */\r\n mobile(value, strict = false) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n if (strict) {\r\n // 严格模式:11位,1开头,第二位为3-9\r\n return /^1[3-9]\\d{9}$/.test(str)\r\n } else {\r\n // 宽松模式:1开头,10-11位数字\r\n return /^1\\d{10,11}$/.test(str)\r\n }\r\n }\r\n\r\n /**\r\n * 校验邮箱\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n email(value) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n // 邮箱正则:支持常见邮箱格式\r\n return /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(\r\n str\r\n )\r\n }\r\n\r\n /**\r\n * 校验身份证号(中国大陆18位)\r\n * @param {string} value - 要校验的值\r\n * @param {boolean} checkCode - 是否校验校验码,默认 true\r\n * @returns {boolean} 校验结果\r\n */\r\n idCard(value, checkCode = true) {\r\n if (!value) return false\r\n const str = String(value).trim().toUpperCase()\r\n\r\n // 基本格式校验:18位,前17位数字,最后一位数字或X\r\n if (!/^\\d{17}[\\dX]$/.test(str)) {\r\n return false\r\n }\r\n\r\n if (!checkCode) {\r\n return true\r\n }\r\n\r\n // 校验码校验\r\n const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]\r\n const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']\r\n\r\n let sum = 0\r\n for (let i = 0; i < 17; i++) {\r\n sum += parseInt(str[i]) * weights[i]\r\n }\r\n const checkCodeIndex = sum % 11\r\n return str[17] === checkCodes[checkCodeIndex]\r\n }\r\n\r\n /**\r\n * 校验URL\r\n * @param {string} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {boolean} options.requireProtocol - 是否要求协议(http/https),默认 false\r\n * @returns {boolean} 校验结果\r\n */\r\n url(value, options = {}) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n const { requireProtocol = false } = options\r\n\r\n if (requireProtocol) {\r\n return /^https?:\\/\\/.+\\..+/.test(str)\r\n } else {\r\n // 支持带协议或不带协议\r\n return /^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$/.test(\r\n str\r\n )\r\n }\r\n }\r\n\r\n /**\r\n * 校验IP地址(IPv4)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n ip(value) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n const parts = str.split('.')\r\n if (parts.length !== 4) return false\r\n return parts.every((part) => {\r\n const num = parseInt(part, 10)\r\n return num >= 0 && num <= 255 && String(num) === part\r\n })\r\n }\r\n\r\n /**\r\n * 校验数字\r\n * @param {string|number} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {boolean} options.integer - 是否必须为整数,默认 false\r\n * @param {boolean} options.positive - 是否必须为正数,默认 false\r\n * @param {boolean} options.negative - 是否必须为负数,默认 false\r\n * @param {number} options.min - 最小值\r\n * @param {number} options.max - 最大值\r\n * @returns {boolean} 校验结果\r\n */\r\n number(value, options = {}) {\r\n if (value === null || value === undefined || value === '') return false\r\n const num = Number(value)\r\n if (isNaN(num)) return false\r\n\r\n const {\r\n integer = false,\r\n positive = false,\r\n negative = false,\r\n min,\r\n max\r\n } = options\r\n\r\n if (integer && !Number.isInteger(num)) return false\r\n if (positive && num <= 0) return false\r\n if (negative && num >= 0) return false\r\n if (min !== undefined && num < min) return false\r\n if (max !== undefined && num > max) return false\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 校验字符串长度\r\n * @param {string} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {number} options.min - 最小长度\r\n * @param {number} options.max - 最大长度\r\n * @param {number} options.len - 固定长度(优先级高于 min/max)\r\n * @returns {boolean} 校验结果\r\n */\r\n length(value, options = {}) {\r\n if (value === null || value === undefined) return false\r\n const str = String(value)\r\n const { min, max, len } = options\r\n\r\n if (len !== undefined) {\r\n return str.length === len\r\n }\r\n\r\n if (min !== undefined && str.length < min) return false\r\n if (max !== undefined && str.length > max) return false\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 校验正则表达式\r\n * @param {string} value - 要校验的值\r\n * @param {RegExp|string} pattern - 正则表达式或正则字符串\r\n * @returns {boolean} 校验结果\r\n */\r\n pattern(value, pattern) {\r\n if (!value || !pattern) return false\r\n const str = String(value)\r\n let regex\r\n if (pattern instanceof RegExp) {\r\n regex = pattern\r\n } else {\r\n try {\r\n regex = new RegExp(pattern)\r\n } catch (e) {\r\n return false\r\n }\r\n }\r\n return regex.test(str)\r\n }\r\n\r\n /**\r\n * 校验日期\r\n * @param {string|Date} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {string|Date} options.min - 最小日期\r\n * @param {string|Date} options.max - 最大日期\r\n * @param {string} options.format - 日期格式,如 'YYYY-MM-DD',默认自动识别\r\n * @returns {boolean} 校验结果\r\n */\r\n date(value, options = {}) {\r\n if (!value) return false\r\n let date\r\n if (value instanceof Date) {\r\n date = value\r\n } else {\r\n date = new Date(value)\r\n if (isNaN(date.getTime())) return false\r\n }\r\n\r\n const { min, max } = options\r\n if (min) {\r\n const minDate = min instanceof Date ? min : new Date(min)\r\n if (date < minDate) return false\r\n }\r\n if (max) {\r\n const maxDate = max instanceof Date ? max : new Date(max)\r\n if (date > maxDate) return false\r\n }\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 校验是否为空\r\n * @param {*} value - 要校验的值\r\n * @param {boolean} trim - 是否去除空格,默认 true\r\n * @returns {boolean} 是否为空\r\n */\r\n empty(value, trim = true) {\r\n if (value === null || value === undefined) return true\r\n if (typeof value === 'string') {\r\n return trim ? value.trim() === '' : value === ''\r\n }\r\n if (Array.isArray(value)) {\r\n return value.length === 0\r\n }\r\n if (typeof value === 'object') {\r\n return Object.keys(value).length === 0\r\n }\r\n return false\r\n }\r\n\r\n /**\r\n * 校验是否不为空(empty 的反向)\r\n * @param {*} value - 要校验的值\r\n * @param {boolean} trim - 是否去除空格,默认 true\r\n * @returns {boolean} 是否不为空\r\n */\r\n notEmpty(value, trim = true) {\r\n return !this.empty(value, trim)\r\n }\r\n\r\n /**\r\n * 校验中文\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n chinese(value) {\r\n if (!value) return false\r\n return /^[\\u4e00-\\u9fa5]+$/.test(String(value))\r\n }\r\n\r\n /**\r\n * 校验字母\r\n * @param {string} value - 要校验的值\r\n * @param {boolean} caseSensitive - 是否区分大小写,默认 false(不区分)\r\n * @returns {boolean} 校验结果\r\n */\r\n alpha(value, caseSensitive = false) {\r\n if (!value) return false\r\n const str = String(value)\r\n if (caseSensitive) {\r\n return /^[a-zA-Z]+$/.test(str)\r\n } else {\r\n return /^[a-z]+$/i.test(str)\r\n }\r\n }\r\n\r\n /**\r\n * 校验字母和数字\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n alphanumeric(value) {\r\n if (!value) return false\r\n return /^[a-zA-Z0-9]+$/.test(String(value))\r\n }\r\n\r\n /**\r\n * 校验整数\r\n * @param {string|number} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n integer(value) {\r\n return this.number(value, { integer: true })\r\n }\r\n\r\n /**\r\n * 校验正数\r\n * @param {string|number} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n positive(value) {\r\n return this.number(value, { positive: true })\r\n }\r\n\r\n /**\r\n * 校验负数\r\n * @param {string|number} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n negative(value) {\r\n return this.number(value, { negative: true })\r\n }\r\n\r\n /**\r\n * 校验银行卡号(中国大陆,16-19位)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n bankCard(value) {\r\n if (!value) return false\r\n const str = String(value).replace(/\\s/g, '')\r\n // 银行卡号通常是16-19位数字\r\n return /^\\d{16,19}$/.test(str)\r\n }\r\n\r\n /**\r\n * 校验邮政编码(中国大陆,6位数字)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n postcode(value) {\r\n if (!value) return false\r\n return /^\\d{6}$/.test(String(value).trim())\r\n }\r\n\r\n /**\r\n * 校验车牌号(中国大陆)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n licensePlate(value) {\r\n if (!value) return false\r\n const str = String(value).trim().toUpperCase()\r\n // 支持普通车牌和新能源车牌\r\n return (\r\n /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$/.test(\r\n str\r\n ) ||\r\n /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z]((\\d{5}[DF])|([DF][A-Z0-9]\\d{4}))$/.test(\r\n str\r\n )\r\n )\r\n }\r\n\r\n /**\r\n * 校验统一社会信用代码(18位)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n creditCode(value) {\r\n if (!value) return false\r\n const str = String(value).trim().toUpperCase()\r\n // 统一社会信用代码:18位,字母数字组合\r\n return /^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/.test(str)\r\n }\r\n\r\n /**\r\n * 校验值是否在指定范围内\r\n * @param {*} value - 要校验的值\r\n * @param {Array} enumList - 允许的值列表\r\n * @returns {boolean} 校验结果\r\n */\r\n enum(value, enumList) {\r\n if (!Array.isArray(enumList) || enumList.length === 0) return false\r\n return enumList.includes(value)\r\n }\r\n\r\n /**\r\n * 校验值是否相等\r\n * @param {*} value1 - 第一个值\r\n * @param {*} value2 - 第二个值\r\n * @param {boolean} strict - 是否严格相等(===),默认 true\r\n * @returns {boolean} 校验结果\r\n */\r\n equal(value1, value2, strict = false) {\r\n if (strict) {\r\n return value1 === value2\r\n } else {\r\n return value1 == value2 // eslint-disable-line eqeqeq\r\n }\r\n }\r\n\r\n /**\r\n * 校验值是否不相等\r\n * @param {*} value1 - 第一个值\r\n * @param {*} value2 - 第二个值\r\n * @param {boolean} strict - 是否严格相等(===),默认 true\r\n * @returns {boolean} 校验结果\r\n */\r\n notEqual(value1, value2, strict = true) {\r\n return !this.equal(value1, value2, strict)\r\n }\r\n\r\n /**\r\n * 校验是否全为大写\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n uppercase(value) {\r\n if (!value) return false\r\n const str = String(value)\r\n return str === str.toUpperCase() && /[A-Z]/.test(str)\r\n }\r\n\r\n /**\r\n * 校验是否全为小写\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n lowercase(value) {\r\n if (!value) return false\r\n const str = String(value)\r\n return str === str.toLowerCase() && /[a-z]/.test(str)\r\n }\r\n\r\n /**\r\n * 校验用户名(字母、数字、下划线,3-20位)\r\n * @param {string} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {number} options.min - 最小长度,默认 3\r\n * @param {number} options.max - 最大长度,默认 20\r\n * @returns {boolean} 校验结果\r\n */\r\n username(value, options = {}) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n const { min = 3, max = 20 } = options\r\n if (str.length < min || str.length > max) return false\r\n return /^[a-zA-Z0-9_]+$/.test(str)\r\n }\r\n\r\n /**\r\n * 校验密码强度\r\n * @param {string} value - 要校验的值\r\n * @param {object} options - 选项\r\n * @param {number} options.min - 最小长度,默认 6\r\n * @param {number} options.max - 最大长度,默认 20\r\n * @param {boolean} options.requireNumber - 是否必须包含数字,默认 false\r\n * @param {boolean} options.requireLetter - 是否必须包含字母,默认 false\r\n * @param {boolean} options.requireSpecial - 是否必须包含特殊字符,默认 false\r\n * @returns {boolean} 校验结果\r\n */\r\n password(value, options = {}) {\r\n if (!value) return false\r\n const str = String(value)\r\n const {\r\n min = 6,\r\n max = 20,\r\n requireNumber = false,\r\n requireLetter = false,\r\n requireSpecial = false\r\n } = options\r\n\r\n if (str.length < min || str.length > max) return false\r\n if (requireNumber && !/\\d/.test(str)) return false\r\n if (requireLetter && !/[a-zA-Z]/.test(str)) return false\r\n if (requireSpecial && !/[!@#$%^&*(),.?\":{}|<>]/.test(str)) return false\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 校验十六进制颜色值\r\n * @param {string} value - 要校验的值(如 #fff 或 #ffffff)\r\n * @returns {boolean} 校验结果\r\n */\r\n hexColor(value) {\r\n if (!value) return false\r\n return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(String(value).trim())\r\n }\r\n\r\n /**\r\n * 校验QQ号(5-11位数字)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n qq(value) {\r\n if (!value) return false\r\n return /^[1-9]\\d{4,10}$/.test(String(value).trim())\r\n }\r\n\r\n /**\r\n * 校验微信号(6-20位,字母、数字、下划线、减号)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n wechat(value) {\r\n if (!value) return false\r\n return /^[a-zA-Z0-9_-]{6,20}$/.test(String(value).trim())\r\n }\r\n\r\n /**\r\n * 校验固定电话(中国大陆)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n tel(value) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n // 支持带区号的固定电话:010-12345678 或 01012345678\r\n return /^(0\\d{2,3}-?)?\\d{7,8}$/.test(str)\r\n }\r\n\r\n /**\r\n * 校验MAC地址\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n mac(value) {\r\n if (!value) return false\r\n const str = String(value).trim().toUpperCase()\r\n return /^([0-9A-F]{2}:){5}[0-9A-F]{2}$/.test(str)\r\n }\r\n\r\n /**\r\n * 校验Base64编码\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n base64(value) {\r\n if (!value) return false\r\n const str = String(value).trim()\r\n if (str.length % 4 !== 0) return false\r\n try {\r\n return btoa(atob(str)) === str\r\n } catch (e) {\r\n return false\r\n }\r\n }\r\n\r\n /**\r\n * 校验JSON字符串\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n json(value) {\r\n if (!value) return false\r\n try {\r\n JSON.parse(String(value))\r\n return true\r\n } catch (e) {\r\n return false\r\n }\r\n }\r\n\r\n /**\r\n * 校验数字字符串(纯数字组成)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n numeric(value) {\r\n if (value === null || value === undefined) return false\r\n return /^\\d+$/.test(String(value))\r\n }\r\n\r\n /**\r\n * 校验URL路径(不含协议和域名)\r\n * @param {string} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n path(value) {\r\n if (!value) return false\r\n return /^\\/[^\\s]*$/.test(String(value).trim())\r\n }\r\n\r\n /**\r\n * 校验端口号(1-65535)\r\n * @param {string|number} value - 要校验的值\r\n * @returns {boolean} 校验结果\r\n */\r\n port(value) {\r\n return this.number(value, { integer: true, min: 1, max: 65535 })\r\n }\r\n}\r\n\r\n// 创建单例实例\r\nconst validator = new Validator()\r\n\r\nexport default validator\r\n","let isProduct = null\r\ntry {\r\n if (parent?.window?.location) {\r\n isProduct =\r\n parent?.window?.location.origin == 'https://zxgj.zhixianai.com' ||\r\n parent?.window?.location.origin == 'http://zxgj.zhixianai.com'\r\n }\r\n} catch (error) {\r\n isProduct = null\r\n}\r\nexport const MERCHANT_URL =\r\n isProduct !== null && isProduct\r\n ? 'https://merchant-api.zhixianai.com/api'\r\n : isProduct === false\r\n ? 'https://sandbox-merchant-api.zhixianai.com/api'\r\n : ''\r\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'\nimport validator from './test'\nimport moment from 'moment'\nimport { MERCHANT_URL } from './host'\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 getStoreInfo(storeId) {\n if (!storeId) {\n return Promise.resolve(null)\n }\n let config = {\n action: `${MERCHANT_URL}/storeInfo/page`,\n method: 'post',\n dataType: 'json',\n data: {\n current: 1,\n size: 1,\n params: {\n storeId: storeId || ''\n }\n }\n }\n return new Promise((resolve, reject) => {\n api\n .fetch(config)\n .then((res) => {\n if (res?.code === 0) {\n resolve(res?.data?.records?.[0] || null)\n } else {\n resolve(null)\n }\n })\n .catch((err) => {\n reject(err)\n })\n })\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 * 提供各种常用的校验方法\n *\n * @example\n * // 校验手机号\n * if (this.api.validator.mobile('13800138000')) {\n * console.log('手机号格式正确')\n * }\n *\n * @example\n * // 校验邮箱\n * if (this.api.validator.email('test@example.com')) {\n * console.log('邮箱格式正确')\n * }\n *\n * @example\n * // 在自定义校验规则中使用\n * validator: function(value, callback) {\n * if (!this.api.validator.mobile(value)) {\n * callback('请输入正确的手机号')\n * } else {\n * callback()\n * }\n * }\n */\n $validator: validator,\n $moment: moment,\n /**\n * 启用或禁用预览模式\n * 预览模式下:\n * - 表单 form-item 间距调小\n * - 组件边框不展示\n * - 字数限制等提示信息不展示\n * - 必填标记不展示\n *\n * @param {boolean} enabled - 是否启用预览模式,默认为 true\n * @returns {void}\n *\n * @example\n * // 启用预览模式\n * this.api.previewMode(true)\n *\n * @example\n * // 禁用预览模式\n * this.api.previewMode(false)\n */\n previewMode(enabled = true) {\n // 更新 options 中的 preview 配置\n api.updateOptions({ preview: !!enabled })\n // 触发刷新,使样式生效\n api.refresh()\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 '@longhongguo/component-antdv-upload/dist/index.css'\nimport extendApi from './api'\nimport modelFields from './modelFields'\nimport required from './provider'\n\nfunction install(FormCreate) {\n FormCreate.componentAlias(alias)\n\n Object.keys(modelFields).forEach((k) => {\n FormCreate.setModelField(k, modelFields[k])\n })\n\n components.forEach((component) => {\n FormCreate.component(component.name, component)\n })\n\n FormCreate.register(required)\n\n parsers.forEach((parser) => {\n FormCreate.parser(parser)\n })\n\n Object.keys(makers).forEach((name) => {\n FormCreate.maker[name] = makers[name]\n })\n\n if (typeof window !== 'undefined' && window.antd) {\n FormCreate.useApp((_, app) => {\n app.use(window.antd)\n })\n }\n}\n\nexport default function antdvFormCreate() {\n return FormCreateFactory({\n ui: 'process.env.UI',\n version: 'process.env.VERSION',\n manager,\n install,\n extendApi,\n attrs: {\n normal: ['col', 'wrap'],\n array: ['className'],\n key: ['title', 'info']\n }\n })\n}\n","import antdvFormCreate from './core/index';\n\nconst FormCreate = antdvFormCreate();\n\nif (typeof window !== 'undefined') {\n window.formCreate = FormCreate;\n}\n\nconst maker = FormCreate.maker;\n\nexport {maker}\n\nexport default FormCreate;\n"],"names":["script$6","name","_hoisted_1","class","_openBlock","_createElementBlock","_cache","_createElementVNode","height","width","xmlns","viewBox","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","_ctx","_Fragment","key","tabindex","_renderList","index","title","_toDisplayString","onClick","$event","role","aria-label","focusable","data-icon","aria-hidden","fill-rule","_hoisted_10","_hoisted_13","args","_hoisted_14","_hoisted_3","_hoisted_4","script$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","_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","_ctx$rule$props","fetchData","effectData","loading","readOnly","render","newChildren","notFoundContent","$render","defaultRender","cascader","loadData","_ctx$$handle","$handle","ctxRef","parsedFn","parseFn","code","trim","startsWith","selectedOptions","targetOption","isLeaf","updateOptions","_ctxRef$prop","_ctxRef$rule","currentOptions","updateOptionRecursive","optionsList","pathValues","depth","child","isLast","id","deepSet","sync","refresh","then","finally","triggerLoadDataForValue","valueToLoad","timerKey","_fc_id","clearTimeout","setTimeout","retryCount","loadInitialData","async","loadMissingData","startDepth","currentLevelOptions","i","currentOption","nextValue","Promise","resolve","_lastLoadDataValueKey","loadDataFn","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","loadStrVar","getValue","renderChildren","_ctx$rule","currentChildren","join","_ctx$prop$props3","_ctx$prop$props4","_ctx$prop$props5","bindMode","loadDataConfig","attr","to","modify","wait","effect","_textLoadDataWatched","loadDataRef","toRef","newVal","oldVal","formCreateChild","innerHTML","make","input","idate","textarea","search","password","adjustTextareaHeight","textareaEl","scrollHeight","overflow","el","querySelector","MutationObserver","observer","observe","attributes","attributeFilter","childList","subtree","characterData","intervalId","setInterval","vm","$once","disconnect","clearInterval","timePicker","tree","fieldNames","checkedKeys","checkable","row","_","col","span","obj","path","split","parsers","toFormValue","toValue","formValue","vnode","on","originalUpdateModelValue","nextTick","fieldName","fieldCtx","getFieldCtx","$manager","originalChange","inject","_ref","_props$resetMarginBot","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","show","resetMarginBottom","wrap","wrapClass","includes","_ctx$rule$props$child","isVertical","ensureClass","childFlex","flexValue","_ref2","_ctx$rule$props$child2","_ctx$rule$props2","childWidth","widthValue","childrenNodes","direction","size","spaceStyles","compact","_ctx$rule$containerMo","_ctx$rule$props3","_ctx$rule$props4","containerMode","_ref3","_ctx$prop$props$spinn","spinning","hasChildren","_ctx$rule$props5","_ctx$rule$props6","_ctx$prop$props6","_ctx$rule$props7","_ctx$prop$props7","_ref4","_ref5","_ctx$rule$containerMo2","_ctx$rule$props8","_ctx$prop$props8","tip","delay","description","init","_rule$effect","_rule$props","fetch","pagination","current","originalFetch","savedOriginalBeforeFetch","beforeFetch","_accTablePaginationHook","_rule$props2","_rule$props3","_rule$props4","pageParamName","paginationPageParam","pageSizeParamName","paginationPageSizeParam","paramType","paginationParamType","savedRule","config","_savedRule$props","currentPagination","currentPage","currentPageSize","pageSize","query","err","_rule$props5","_rule$props8","_rule$effect3","_rule$effect4","_rule$props14","parsed","processedColumns","numValue","isNaN","isFinite","cellType","dataIndex","cellProps","customRender","record","cellValue","cellOptions","h","onUpdate:value","dataSource","_rule$props6","_rule$effect2","isLoading","_rule$props7","paginationConfig","showSizeChanger","showQuickJumper","showTotal","_rule$props9","_rule$props0","_rule$props1","_rule$props10","_rule$props11","paginationResponseDataPath","paginationResponseTotalPath","savedParamType","savedPageParamName","savedPageSizeParamName","_savedRule$props2","paginationObj","_accTableHandlersSet","page","_rule$props12","onShowSizeChange","_rule$props13","_rule$props15","_rule$props16","responseDataPath","responseTotalPath","dataList","scroll","rowKey","rowSelection","sticky","virtual","alias","tooltip","PRE","popover","button","icon","slider","rate","timeRangePicker","rangePicker","switch","inputNumber","treeSelect","inputPassword","formItem","flex","space","space-compact","spin","autoComplete","transfer","array","object","image","aImage","alert","aAlert","Alert","card","aCard","Card","accTable","accTableTable","tidy","isFalse","tidyRule","_rule","manager","validate","validateFields","clearValidateState","fItem","refs","wrapRef","clearValidate","tidyOptions","tidyBool","def","info","placement","mergeProps","isPreviewMode","isReadOnly","autoSize","rows","showCount","parentType","parentMenu","_menu","onPreview","originalOnPreview","sendPreviewMessage","file","url","uid","timestamp","apply","arguments","originalPreview","sendImagePreviewMessage","src","imageSrc","originalOnVisibleChange","onVisibleChange","visible","prevVisible","getDefaultOptions","hideRequiredMark","layout","labelAlign","labelCol","wrapperCol","validateOnRuleChange","gutter","click","adapterValidate","validator","reject","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","auto","number","time","useAlias","useSlider","types","frameInputs","frameFiles","frameImages","frameInputOne","frameFileOne","frameImageOne","maxLength","frameInput","frameFile","frameImage","useFrame","uploadFileOne","uploadImageOne","uploadType","uploadImage","uploadFile","useUpload","selectMultiple","mode","selectTags","selectCombobox","cusStoreSelect","storeSelect","useCusStoreSelect","cusUserSelect","userSelect","useCusUserSelect","useText","useFlex","useSpace","useSpin","mobile","strict","test","email","idCard","checkCode","toUpperCase","weights","sum","parseInt","checkCodeIndex","requireProtocol","ip","parts","every","part","num","integer","positive","negative","isInteger","len","pattern","regex","RegExp","getTime","empty","notEmpty","chinese","alpha","caseSensitive","alphanumeric","bankCard","replace","postcode","licensePlate","creditCode","enum","enumList","equal","value1","value2","notEqual","uppercase","lowercase","toLowerCase","username","requireNumber","requireLetter","requireSpecial","hexColor","qq","wechat","tel","mac","base64","btoa","atob","json","numeric","port","isProduct","_parent","_parent2","_parent3","location","origin","MERCHANT_URL","tidyBtnProp","btn","Undef","extendApi","formEl","wrapEl","forms","all","isScope","emit","emitEvent","sub","toArray","fields","clearSub","helper","tidyFields","clearSubValidateState","getCtxs","submitBtnProps","isShow","resetBtnProps","refreshOptions","successFn","failFn","validateOnSubmit","beforeSubmit","invoke","onSubmit","request","action","getStoreInfo","storeId","method","dataType","params","res","_res$data","records","throttle","fn","lastTime","context","debounce","timer","$validator","$moment","moment","previewMode","enabled","modelFields","load","parseVal","clearProp","_rule$__fc__$refRule","__fc__","match","getLocale","getProp","install","FormCreate","componentAlias","setModelField","component","register","parser","makers","antd","useApp","app","use","FormCreateFactory","ui","version","attrs","normal","formCreate"],"mappings":";;;;;;4sCAcA,IAAeA,EAAA,CACXC,KAAM,0BCdF,MAAAC,EAAA,CAAAC,MAAM,0CAAZ,OAAAC,IAAAC,EASM,OATNH,EASM,IAAAI,EAAA,KAAAA,EAAA,GAAA,CARJC,EAOK,MAAA,CAPAC,OAAO,MAAMC,MAAM,MAAMC,MAAM,6BAA6BC,QAAQ,kBACvEJ,EAE8B,OAAA,CAD1BK,EAAE,iLACFC,KAAK,iBACTN,EAE8B,OAAA,CAD1BK,EAAE,0aACFC,KAAK,2BCiLf,IAAAC,EAAeC,EAAgB,CAC7Bd,KAAM,YACNe,MAAO,CAILC,WAAY,CACVC,KAAMC,MACNC,QAASA,IAAM,IAGjBC,QAAS,CACPH,KAAMC,MACNC,QAASA,IAAM,IAGjBE,YAAa,CACXJ,KAAMC,MACNC,QAASA,IAAM,IAGjBG,SAAU,CACRL,KAAMM,QACNJ,SAAS,GAGXK,YAAa,CACXP,KAAMQ,OACNN,aAASO,GAGXC,YAAa,CACXV,KAAMW,OACNT,QAAS,IAGXU,SAAU,CACRZ,KAAMM,QACNJ,SAAS,GAGXW,MAAO,CACLb,KAAM,CAACW,OAAQG,QACfZ,QAASA,KAAO,CAAEX,MAAO,UAG3BwB,SAAU,CACRf,KAAMW,OACNT,QAAS,SAGXc,SAAU,CACRhB,KAAMW,OACNT,QAAS,SAGXe,WAAY,CACVjB,KAAMM,QACNJ,SAAS,GAGXgB,SAAU,CACRlB,KAAMM,QACNJ,SAAS,IAGbiB,MAAO,CAAC,oBAAqB,qBAAsB,UACnDC,SAAU,CAERC,aAAc,CACZC,MAEE,OAAKrB,MAAMsB,QAAQC,KAAKzB,YAmBjByB,KAAKzB,WAAW0B,IAAKC,GAER,iBAATA,GACE,OAATA,QACgBjB,IAAfiB,EAAKC,YAA+ClB,IAAxBiB,EAAKF,KAAKT,UAMlC,CACLa,CAACJ,KAAKT,UAAWW,EACjBE,CAACJ,KAAKR,UAAWQ,KAAKK,SAASH,IALxBA,GAvBa,OAApBF,KAAKzB,iBACeU,IAApBe,KAAKzB,YACe,KAApByB,KAAKzB,WAEE,GAGsB,iBAApByB,KAAKzB,WACP,CAACyB,KAAKzB,YAGR,CACL,CAAE4B,MAAOH,KAAKzB,WAAY+B,MAAON,KAAKK,SAASL,KAAKzB,eAoB1DgC,IAAIC,GAEF,IAAIC,EAAa,GACbD,MAAAA,IAGAC,EAFEhC,MAAMsB,QAAQS,GAEHA,EAAIP,IAAKC,GAEF,iBAATA,GACE,OAATA,QACgBjB,IAAfiB,EAAKC,YAA+ClB,IAAxBiB,EAAKF,KAAKT,UAKlC,CACLa,CAACJ,KAAKT,UAAWW,EACjBE,CAACJ,KAAKR,UAAWQ,KAAKK,SAASH,IALxBA,GAQa,iBAARM,GAA4B,OAARA,EAEvB,CAACA,GAGD,CACX,CAAEJ,CAACJ,KAAKT,UAAWiB,EAAKJ,CAACJ,KAAKR,UAAWQ,KAAKK,SAASG,MAK7DR,KAAKU,MAAM,oBAAqBD,GAChCT,KAAKU,MAAM,SAAUD,KAIzBE,WACE,MAAMH,EAAMR,KAAKH,aACjB,OAAOpB,MAAMsB,QAAQS,IAAQA,EAAII,OAAS,GAG5CC,eACE,OAAKb,KAAKW,SACHX,KAAKH,aAAa,GADE,MAI7BiB,eACE,IAAKd,KAAKa,aAAc,MAAO,GAC/B,MAAMX,EAAOF,KAAKa,aAElB,MAAoB,iBAATX,GAA8B,OAATA,EAE5BA,EAAKF,KAAKR,WACVU,EAAKI,OACLnB,OAAOe,EAAKF,KAAKT,WAAaW,EAAKC,OAAS,IAIzCH,KAAKK,SAASH,IAGvBa,mBACE,MAAMP,EAAMR,KAAKH,aACjB,OAAKpB,MAAMsB,QAAQS,IAAuB,IAAfA,EAAII,OAIxBJ,EAAIP,IAAKC,GACM,iBAATA,GAA8B,OAATA,EACvB,CACLC,MAAOD,EAAKF,KAAKT,WAAaW,EAAKC,MACnCG,MACEJ,EAAKF,KAAKR,WACVU,EAAKI,OACLnB,OAAOe,EAAKF,KAAKT,WAAaW,EAAKC,OAAS,KAI3C,CACLA,MAAOD,EACPI,MAAON,KAAKK,SAASH,KAhBhB,IAqBXc,eACE,MAAMC,EAAQjB,KAAKe,iBACnB,YAAyB9B,IAArBe,KAAKjB,aAAkD,OAArBiB,KAAKjB,YAClCkC,EAEFA,EAAMC,MAAM,EAAGlB,KAAKjB,cAG7BoC,iBACE,QAAyBlC,IAArBe,KAAKjB,aAAkD,OAArBiB,KAAKjB,YACzC,OAAO,EAET,MAAMqC,EAAQpB,KAAKe,iBAAiBH,OACpC,OAAOS,KAAKC,IAAI,EAAGF,EAAQpB,KAAKjB,cAGlCwC,YACE,OAAOvB,KAAKP,YAAcO,KAAKW,WAAaX,KAAKZ,WAGrDoC,QAAS,CAEPC,kBAAkBjB,GAChB,OAAKR,KAAKrB,SAAmC,IAAxBqB,KAAKrB,QAAQiC,OAG3BZ,KAAKrB,QAAQ+C,KAAMC,IACxB,MAAMC,EAA0B,iBAARD,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAChE,OAAOC,IAAapB,GAAOrB,OAAOyC,KAAczC,OAAOqB,KAJhD,MAQXH,SAASG,GACP,MAAMqB,EAAS7B,KAAKyB,kBAAkBjB,GACtC,OAAIqB,EACuB,iBAAXA,EAAsBA,EAAO7B,KAAKR,UAAYqC,EAGvD1C,OAAOqB,IAGhBsB,WAAWC,EAAWC,GACpB,GAAIhC,KAAKZ,SAAU,OACnB4C,EAAMC,kBACN,MAAMzB,EAAMR,KAAKH,aACjB,GAAIpB,MAAMsB,QAAQS,GAAM,CAEtB,MAAM0B,EAAW1B,EAAI2B,OAAQjC,IAC3B,GAAoB,iBAATA,GAA8B,OAATA,EAAe,CAE7C,OADyBA,EAAKF,KAAKT,WAAaW,EAAKC,SACzB4B,EAE9B,OAAO7B,IAAS6B,IAEZnD,EAAcoB,KAAKpB,YAAYuD,OAAQjC,IACnCgC,EAASE,KAAMC,GACdA,EAAQrC,KAAKT,YAAcW,EAAKF,KAAKT,YAGhDS,KAAKU,MAAM,qBAAsB9B,GACjCoB,KAAKH,aAAeqC,IAIxBI,WAAWN,GACT,GAAIhC,KAAKZ,SAAU,OACnB4C,EAAMC,kBAENjC,KAAKH,aAAe,GACpB,MAAMjB,EAAcoB,KAAKpB,YAAYuD,OAAQjC,IACnCF,KAAKH,aAAauC,KAAMC,GACvBA,EAAQrC,KAAKT,YAAcW,EAAKF,KAAKT,YAGhDS,KAAKU,MAAM,qBAAsB9B,iDC3apBnB,MAAM,gDAyBNA,MAAM,sCAoCd8E,EAAA,CAAA9E,MAAM,gDASC+E,EAAA,CAAA/E,MAAM,+DA8BdA,MAAM,wCACN4B,MAAA,CAAiBoD,QAAA,MAEXC,EAAA,CAAAjF,MAAM,gCACJkF,EAAA,CAAAlF,MAAM,iDAOOA,MAAM,iDA0BlBA,MAAM,2EAhKvBmF,EAAc,YAELC,EAAQhE,cAmEjBlB,EA6GKmF,EAAA,CAAAC,IAAA,GAAA,CA9GLH,EAAc,YACd/E,EA6GK,MAAA,CA3GHJ,SAAM,uCAAqC,0BACnCoF,EAAAzD,YAGPC,QAAOwD,EAAKxD,OACZ2D,SAAUH,kBAEXhF,EAmGK,MAAA,CAlGHJ,SAAM,yBAAuB,sCACrBoF,EAAAnD,cAIR7B,EAqDK,MArDL0E,EAqDK,CApDHK,EAAgB,eAChBlF,GAAA,GAAAC,EAgCKmF,EA/BqB,KAAAG,EAAAJ,EAAA7B,aAAhB,CAAAd,EAAMgD,SADhBvF,EAgCK,MAAA,CA9BFoF,IAAKG,EACNzF,MAAM,wCACN4B,MAAA,CAAiBoD,QAAA,OAEjB5E,EAyBM,OAAA,CAzBAJ,MAAM,+BAAgC0F,MAAOjD,EAAKI,QACtDzC,EAEQ,OAFR2E,EACEY,EAAAlD,EAAKI,OAAI,GAEXzC,EAoBM,OAAA,CAnBJJ,MAAM,sCACL4F,WAAOR,EAAUf,WAAC5B,EAAKC,MAAOmD,qBAE/BzF,EAeM,OAAA,CAfA0F,KAAK,MAAMC,aAAW,QAAQ/F,MAAM,0BACxCI,EAaK,MAAA,CAZH4F,UAAU,QACVC,YAAU,QACV3F,MAAM,MACND,OAAO,MACPK,KAAK,eACLwF,cAAY,OACZC,YAAU,UACV3F,QAAQ,kBAERJ,EAEO,OAAA,CADLK,EAAE,6pBAQd0E,EAAY,UAEJC,EAAa1B,eAAA,GADrBzD,IAAAC,EAUK,MAVLkG,EAUK,CALHhG,EAIM,OAJN6E,EAIM,CAHJ7E,EAEM,OAFN8E,EAAkD,OAC5CE,uCAKVD,EAAa,WACAC,EAAQlC,2BAArBhD,EAEM,OAFNmG,EAEMV,EADDP,EAAU3D,aAAA,OAAA,MAGL2D,EAAStB,eAArB5D,EAqBM,OAAA,OArBiBF,MAAM,sBAAuB4F,4BAAOR,EAAUP,YAAAO,EAAAP,cAAAyB,sBACnElG,EAmBM,OAAA,CAlBJ0F,KAAK,MACLC,aAAW,eACX/F,MAAM,iCAENI,EAaK,MAAA,CAZH4F,UAAU,QACVC,YAAU,eACV3F,MAAM,MACND,OAAO,MACPK,KAAK,eACLwF,cAAY,OACZC,YAAU,UACV3F,QAAQ,kBAERJ,EAEO,OAAA,CADLK,EAAE,gtBAKVR,IAAAC,EAgBM,OAhBNqG,GAgBM,IAAApG,EAAA,KAAAA,EAAA,GAAA,CAfJC,EAcM,OAAA,CAdA0F,KAAK,MAAMC,aAAW,OAAO/F,MAAM,yBACvCI,EAYK,MAAA,CAXH4F,UAAU,QACVC,YAAU,OACV3F,MAAM,MACND,OAAO,MACPK,KAAK,eACLwF,cAAY,OACZ1F,QAAQ,kBAERJ,EAEO,OAAA,CADLK,EAAE,kOA3KdP,EAiEK,MAAA,OA/DHF,SAAM,qCAAmC,0BACjCoF,EAAAzD,YAGPC,QAAOwD,EAAKxD,OACZ2D,SAAUH,kBAEXhF,EAuDK,MAAA,CAtDHJ,SAAM,yBAAuB,sCACrBoF,EAAAnD,cAKAmD,EAAYhC,kBADpBlD,EAMM,OAAA,OAJJF,MAAM,+BACL0F,MAAON,EAAY/B,gBAEjB+B,2BAELlF,EAEM,OAFNsG,EAEMb,EADDP,EAAU3D,aAAA,OAAA,IAEH2D,EAAStB,eAArB5D,EAqBM,OAAA,OArBiBF,MAAM,sBAAuB4F,4BAAOR,EAAUP,YAAAO,EAAAP,cAAAyB,sBACnElG,EAmBM,OAAA,CAlBJ0F,KAAK,MACLC,aAAW,eACX/F,MAAM,iCAENI,EAaK,MAAA,CAZH4F,UAAU,QACVC,YAAU,eACV3F,MAAM,MACND,OAAO,MACPK,KAAK,eACLwF,cAAY,OACZC,YAAU,UACV3F,QAAQ,kBAERJ,EAEO,OAAA,CADLK,EAAE,gtBAKVR,IAAAC,EAgBM,OAhBNuG,EAgBM,IAAAtG,EAAA,KAAAA,EAAA,GAAA,CAfJC,EAcM,OAAA,CAdA0F,KAAK,MAAMC,aAAW,OAAO/F,MAAM,yBACvCI,EAYK,MAAA,CAXH4F,UAAU,QACVC,YAAU,OACV3F,MAAM,MACND,OAAO,MACPK,KAAK,eACLwF,cAAY,OACZ1F,QAAQ,kBAERJ,EAEO,OAAA,CADLK,EAAE,8NCpChB,IAAAiG,GAAe9F,EAAgB,CAC7Bd,KAAM,iBACN6G,WAAY,CACVC,UAAAA,GAEF/F,MAAO,CAELgG,iBAAkB,CAChB9F,KAAMc,OACNZ,QAAS,MAKXH,WAAY,CACVC,KAAMC,MACNC,QAASA,IAAM,IAGjBC,QAAS,CACPH,KAAMC,MACNC,QAASA,IAAM,IAGjBG,SAAU,CACRL,KAAMM,QACNJ,SAAS,GAGXK,YAAa,CACXP,KAAMQ,OACNN,aAASO,GAGXC,YAAa,CACXV,KAAMW,OACNT,QAAS,OAGXU,SAAU,CACRZ,KAAMM,QACNJ,SAAS,GAGXW,MAAO,CACLb,KAAM,CAACW,OAAQG,QACfZ,QAASA,KAAO,CAAEX,MAAO,UAG3BwB,SAAU,CACRf,KAAMW,OACNT,QAAS,SAGXc,SAAU,CACRhB,KAAMW,OACNT,QAAS,SAGXe,WAAY,CACVjB,KAAMM,QACNJ,SAAS,GAGX6F,MAAO,CACL/F,KAAMW,OACNT,QAAS,IAGXgB,SAAU,CACRlB,KAAMM,QACNJ,SAAS,GAGX8F,WAAY,CACVhG,KAAMc,OACNZ,QAASA,KAAO,KAElB+F,aAAc,CACZjG,KAAMkG,SACNhG,QAASA,SAGbiB,MAAO,CAAC,oBAAqB,UAC7BgF,KAAIA,KACK,CAELC,UAAW,EAEXC,iBAAkB,GAElBC,gBAAiB,GACjBlG,YAAa,KAGjBgB,SAAU,CAERmF,gBAEE,GAAI/E,KAAK8E,gBAAgBlE,OAAS,EAAG,CAEnC,MAAMoE,EAAY,IAAIC,IAWtB,OATAjF,KAAKrB,QAAQuG,QAASvD,IACpB,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DqD,EAAUzE,IAAIJ,EAAOwB,KAGvB3B,KAAK8E,gBAAgBI,QAASvD,IAC5B,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DqD,EAAUzE,IAAIJ,EAAOwB,KAEhBlD,MAAM0G,KAAKH,EAAUI,UAE9B,OAAOpF,KAAKrB,UAGhB0G,MAAO,CAEL1G,QAAS,CACP2G,WAAW,EACXC,QAAQC,GAG4B,IAAhCxF,KAAK8E,gBAAgBlE,QACrBnC,MAAMsB,QAAQyF,IACdA,EAAW5E,OAAS,IAEpBZ,KAAK8E,gBAAkB,IAAIU,OAKnCC,UAEEC,OAAOC,iBAAiB,UAAW3F,KAAK4F,gBAE1CC,gBAEEH,OAAOI,oBAAoB,UAAW9F,KAAK4F,gBAE7CpE,QAAS,CAGPuE,wBAAwBpB,GAEtB,GAAIA,MAAAA,EACF,OAAOA,EAGT,IAGE,OAAOqB,KAAKC,MAAMD,KAAKE,UAAUvB,IACjC,MAAOwB,GAIP,GAHAC,QAAQC,KAAK,iCAAkCF,GAG3C1H,MAAMsB,QAAQ4E,GAEhB,OAAoB,IAAhBA,EAAK/D,OACA,GAGF+D,EAAK1E,IAAKC,GAASF,KAAK+F,wBAAwB7F,IAGzD,GAAoB,iBAATyE,EAAmB,CAC5B,MAAM2B,EAAS,GACf,IAAK,MAAMvD,KAAO4B,EAChB,GAAIrF,OAAOiH,UAAUC,eAAeC,KAAK9B,EAAM5B,GAC7C,IACEuD,EAAOvD,GAAO/C,KAAK+F,wBAAwBpB,EAAK5B,IAChD,MAAO2D,GAEPN,QAAQC,KAAK,+BAA+BtD,EAAO2D,GAIzD,OAAOJ,EAIT,OAAO3B,IAGXgC,cAEE,GAAI3G,KAAKZ,SACP,OAIF,MAAMwH,EAAQ,gBACZ5G,KAAKuE,OAAS,aACZsC,KAAKC,WAAW9G,KAAK4E,YAKnBmC,EAAoBtI,MAAMsB,QAAQC,KAAKzB,YACzCyB,KAAKzB,WACL,GAGJ,IAAIyI,EAAc,KACdD,EAAkBnG,OAAS,IAC7BoG,EAAcD,GAEhB,MAAME,EACJD,MAAAA,EACI,KACAhH,KAAK+F,wBAAwBiB,GAG7BxC,EAAa,IACdxE,KAAKwE,YAENxE,KAAKyE,cACPnF,OAAO4H,OAAO1C,EAAYxE,KAAKyE,gBAEjC,MAAM0C,EAAU,CACd3I,KAAM,oBACN+F,MAAOvE,KAAKuE,OAAS,GACrB1F,SAAUmB,KAAKnB,SACfgB,aAAcoH,EACd1H,SAAUS,KAAKT,SACfC,SAAUQ,KAAKR,SACfgF,WAAAA,EACAI,UAAWgC,GAIb,GAAIlB,OAAO0B,QAAU1B,OAAO0B,SAAW1B,OACrC,IACEA,OAAO0B,OAAOC,YAAYF,EAAS,KACnC,MAAOhB,GACPC,QAAQD,MAAM,yBAA0BA,QAI1CC,QAAQC,KACN,8CAKJrG,KAAK6E,iBAAiB+B,GAAS,CAACzG,EAAOvB,KAGnCA,GACAH,MAAMsB,QAAQnB,IACdA,EAAYgC,OAAS,GAGrBZ,KAAKsH,aAAa1I,GAGpBoB,KAAKpB,YAAcA,EACnBoB,KAAKuH,aAAapH,GAClBH,KAAKwH,aAAarH,KAGtByF,cAAc5D,GAIZ,MAAM2C,EAAO3C,EAAM2C,KAGnB,GAAIA,GAAsB,wBAAdA,EAAKnG,KAAgC,CAC/C,MAAM+F,MAAEA,EAAKpE,MAAEA,EAAKvB,YAAEA,EAAWgG,UAAEA,GAAcD,EAGjD,GAAIJ,IAAUvE,KAAKuE,MACjB,OAIF,MAAMkD,EAAWzH,KAAK6E,iBAAiBD,GACnC6C,IAKFA,EAAStH,EAAOvB,UAEToB,KAAK6E,iBAAiBD,MAKnC0C,aAAaI,GACX,IAAKjJ,MAAMsB,QAAQ2H,IAAiC,IAApBA,EAAS9G,OACvC,OAIF,MAAMoE,EAAY,IAAIC,IAGtBjF,KAAK8E,gBAAgBI,QAASvD,IAC5B,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DqD,EAAUzE,IAAIJ,EAAOwB,KAIvB+F,EAASxC,QAASvD,IAChB,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DqD,EAAUzE,IAAIJ,EAAOwB,KAIvB3B,KAAK8E,gBAAkBrG,MAAM0G,KAAKH,EAAUI,WAE9CmC,aAAapH,GACXH,KAAKU,MAAM,oBAAqBP,GAEhCH,KAAK2H,mBAEPH,aAAarH,GACXH,KAAKU,MACH,SACAP,EACAH,KAAKpB,aAAeoB,KAAKpB,YAAYgC,OAAS,EAC1CZ,KAAKnB,SACHmB,KAAKpB,YACLoB,KAAKpB,YAAY,GACnBoB,KAAKnB,SACL,GACA,OAIR8I,kBAEE3H,KAAK4H,UAAU,KACb5H,KAAK4H,UAAU,KACb,IAEE,GACE5H,KAAKsE,kBACLtE,KAAKsE,iBAAiBuD,KACtB7H,KAAKuE,MAKL,YAHAvE,KAAKsE,iBAAiBuD,IAAIC,cAAc9H,KAAKuE,OAAOwD,MAAM,QAO5D,IAAIX,EAASpH,KAAKgI,QAClB,KAAOZ,GAAQ,CACb,GACEA,EAAOa,UACkB,eAAzBb,EAAOa,SAAS1K,MAChB6J,EAAOc,KACP,CACIlI,KAAKuE,OAAS6C,EAAOc,KAAKJ,eAC5BV,EAAOc,KAAKJ,cAAc9H,KAAKuE,OAAOwD,MAAM,QAI9C,MAEFX,EAASA,EAAOY,SAElB,MAAO7B,GACPC,QAAQC,KAAK,yBAA0BF,8ECzYjDxI,EAiBK,MAAA,CAjBC0F,4BAAOR,EAAW8D,aAAA9D,EAAA8D,eAAA5C,MACtBoE,EAeCC,EAAA,CAdEC,cAAaxF,EAAUtE,WACvBI,QAASkE,EAAakC,cACfuD,eAAczF,EAAWjE,kDAAXiE,EAAWjE,YAAA0E,GAChCzE,SAAUgE,EAAQhE,SAClB0J,gBAAe1F,EAAW9D,YAC1BG,YAAa2D,EAAW3D,YACxBE,SAAUyD,EAAQzD,SAClBC,QAAOwD,EAAKxD,OACZE,SAAUsD,EAAQtD,SAClBC,SAAUqD,EAAQrD,SAClBC,WAAYoD,EAAUpD,WACtBC,SAAUmD,EAAQnD,SAClB8I,sBAAoB3F,EAAY0E,aAChCkB,SAAQ5F,EAAY2E,6MCS3B,IAAAkB,GAAerK,EAAgB,CAC7Bd,KAAM,gBACN6G,WAAY,CACVC,UAAAA,GAEF/F,MAAO,CAELgG,iBAAkB,CAChB9F,KAAMc,OACNZ,QAAS,MAKXH,WAAY,CACVC,KAAMC,MACNC,QAASA,IAAM,IAGjBC,QAAS,CACPH,KAAMC,MACNC,QAASA,IAAM,IAGjBG,SAAU,CACRL,KAAMM,QACNJ,SAAS,GAGXK,YAAa,CACXP,KAAMQ,OACNN,aAASO,GAGXC,YAAa,CACXV,KAAMW,OACNT,QAAS,OAGXU,SAAU,CACRZ,KAAMM,QACNJ,SAAS,GAGXW,MAAO,CACLb,KAAM,CAACW,OAAQG,QACfZ,QAASA,KAAO,CAAEX,MAAO,UAG3BwB,SAAU,CACRf,KAAMW,OACNT,QAAS,SAGXc,SAAU,CACRhB,KAAMW,OACNT,QAAS,SAGXe,WAAY,CACVjB,KAAMM,QACNJ,SAAS,GAGX6F,MAAO,CACL/F,KAAMW,OACNT,QAAS,IAGXgB,SAAU,CACRlB,KAAMM,QACNJ,SAAS,GAEXiK,WAAY,CACVnK,KAAM,CAACW,OAAQH,QACfN,QAAS,MAEX8F,WAAY,CACVhG,KAAMc,OACNZ,QAASA,KAAO,KAElB+F,aAAc,CACZjG,KAAMkG,SACNhG,QAASA,SAGbiB,MAAO,CAAC,oBAAqB,UAC7BgF,KAAIA,KACK,CAELC,UAAW,EAEXC,iBAAkB,GAElBC,gBAAiB,GACjBlG,YAAa,KAGjBgB,SAAU,CAERmF,gBAEE,GAAI/E,KAAK8E,gBAAgBlE,OAAS,EAAG,CAEnC,MAAMoE,EAAY,IAAIC,IAWtB,OATAjF,KAAKrB,QAAQuG,QAASvD,IACpB,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DqD,EAAUzE,IAAIJ,EAAOwB,KAGvB3B,KAAK8E,gBAAgBI,QAASvD,IAC5B,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DqD,EAAUzE,IAAIJ,EAAOwB,KAEhBlD,MAAM0G,KAAKH,EAAUI,UAE9B,OAAOpF,KAAKrB,UAGhB0G,MAAO,CAEL1G,QAAS,CACP2G,WAAW,EACXC,QAAQC,GAG4B,IAAhCxF,KAAK8E,gBAAgBlE,QACrBnC,MAAMsB,QAAQyF,IACdA,EAAW5E,OAAS,IAEpBZ,KAAK8E,gBAAkB,IAAIU,OAKnCC,UAEEC,OAAOC,iBAAiB,UAAW3F,KAAK4F,gBAE1CC,gBAEEH,OAAOI,oBAAoB,UAAW9F,KAAK4F,gBAE7CpE,QAAS,CAGPuE,wBAAwBpB,GAEtB,GAAIA,MAAAA,EACF,OAAOA,EAGT,IAGE,OAAOqB,KAAKC,MAAMD,KAAKE,UAAUvB,IACjC,MAAOwB,GAIP,GAHAC,QAAQC,KAAK,gCAAiCF,GAG1C1H,MAAMsB,QAAQ4E,GAEhB,OAAoB,IAAhBA,EAAK/D,OACA,GAGF+D,EAAK1E,IAAKC,GAASF,KAAK+F,wBAAwB7F,IAGzD,GAAoB,iBAATyE,EAAmB,CAC5B,MAAM2B,EAAS,GACf,IAAK,MAAMvD,KAAO4B,EAChB,GAAIrF,OAAOiH,UAAUC,eAAeC,KAAK9B,EAAM5B,GAC7C,IACEuD,EAAOvD,GAAO/C,KAAK+F,wBAAwBpB,EAAK5B,IAChD,MAAO2D,GAEPN,QAAQC,KAAK,8BAA8BtD,EAAO2D,GAIxD,OAAOJ,EAIT,OAAO3B,IAGXgC,cAEE,GAAI3G,KAAKZ,SACP,OAIF,MAAMwH,EAAQ,eACZ5G,KAAKuE,OAAS,aACZsC,KAAKC,WAAW9G,KAAK4E,YAKnBmC,EAAoBtI,MAAMsB,QAAQC,KAAKzB,YACzCyB,KAAKzB,WACL,GAGJ,IAAIyI,EAAc,KACdD,EAAkBnG,OAAS,IAC7BoG,EAAcD,GAEhB,MAAME,EACJD,MAAAA,EACI,KACAhH,KAAK+F,wBAAwBiB,GAG7BxC,EAAa,IACdxE,KAAKwE,YAENxE,KAAKyE,cACPnF,OAAO4H,OAAO1C,EAAYxE,KAAKyE,gBAGjC,MAAM0C,EAAU,CACd3I,KAAM,mBACN+F,MAAOvE,KAAKuE,OAAS,GACrB1F,SAAUmB,KAAKnB,SACfgB,aAAcoH,EACd1H,SAAUS,KAAKT,SACfC,SAAUQ,KAAKR,SACfmJ,WAAY3I,KAAK2I,WACjBnE,WAAAA,EACAI,UAAWgC,GAIb,GAAIlB,OAAO0B,QAAU1B,OAAO0B,SAAW1B,OACrC,IACEA,OAAO0B,OAAOC,YAAYF,EAAS,KACnC,MAAOhB,GACPC,QAAQD,MAAM,wBAAyBA,QAIzCC,QAAQC,KACN,6CAKJrG,KAAK6E,iBAAiB+B,GAAS,CAACzG,EAAOvB,KAGnCA,GACAH,MAAMsB,QAAQnB,IACdA,EAAYgC,OAAS,GAGrBZ,KAAKsH,aAAa1I,GAGpBoB,KAAKpB,YAAcA,EAEnBoB,KAAKuH,aAAapH,GAClBH,KAAKwH,aAAarH,KAGtByF,cAAc5D,GAIZ,MAAM2C,EAAO3C,EAAM2C,KAGnB,GAAIA,GAAsB,uBAAdA,EAAKnG,KAA+B,CAC9C,MAAM+F,MAAEA,EAAKpE,MAAEA,EAAKvB,YAAEA,EAAWgG,UAAEA,GAAcD,EAGjD,GAAIJ,IAAUvE,KAAKuE,MACjB,OAIF,MAAMkD,EAAWzH,KAAK6E,iBAAiBD,GACnC6C,IAKFA,EAAStH,EAAOvB,UAEToB,KAAK6E,iBAAiBD,MAKnC0C,aAAaI,GACX,IAAKjJ,MAAMsB,QAAQ2H,IAAiC,IAApBA,EAAS9G,OACvC,OAIF,MAAMoE,EAAY,IAAIC,IAGtBjF,KAAK8E,gBAAgBI,QAASvD,IAC5B,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DqD,EAAUzE,IAAIJ,EAAOwB,KAIvB+F,EAASxC,QAASvD,IAChB,MAAMxB,EAAuB,iBAARwB,EAAmBA,EAAI3B,KAAKT,UAAYoC,EAC7DqD,EAAUzE,IAAIJ,EAAOwB,KAIvB3B,KAAK8E,gBAAkBrG,MAAM0G,KAAKH,EAAUI,WAE9CmC,aAAapH,GACXH,KAAKU,MAAM,oBAAqBP,GAEhCH,KAAK2H,mBAEPH,aAAarH,GACXH,KAAKU,MACH,SACAP,EACAH,KAAKpB,aAAeoB,KAAKpB,YAAYgC,OAAS,EAC1CZ,KAAKnB,SACHmB,KAAKpB,YACLoB,KAAKpB,YAAY,GACnBoB,KAAKnB,SACL,GACA,OAIR8I,kBAEE3H,KAAK4H,UAAU,KACb5H,KAAK4H,UAAU,KACb,IAEE,GACE5H,KAAKsE,kBACLtE,KAAKsE,iBAAiBuD,KACtB7H,KAAKuE,MAKL,YAHAvE,KAAKsE,iBAAiBuD,IAAIC,cAAc9H,KAAKuE,OAAOwD,MAAM,QAO5D,IAAIX,EAASpH,KAAKgI,QAClB,KAAOZ,GAAQ,CACb,GACEA,EAAOa,UACkB,eAAzBb,EAAOa,SAAS1K,MAChB6J,EAAOc,KACP,CACIlI,KAAKuE,OAAS6C,EAAOc,KAAKJ,eAC5BV,EAAOc,KAAKJ,cAAc9H,KAAKuE,OAAOwD,MAAM,QAI9C,MAEFX,EAASA,EAAOY,SAElB,MAAO7B,GACPC,QAAQC,KAAK,wBAAyBF,8EC/YhDxI,EAiBK,MAAA,CAjBC0F,4BAAOR,EAAW8D,aAAA9D,EAAA8D,eAAA5C,MACtBoE,EAeCC,EAAA,CAdEC,cAAaxF,EAAUtE,WACvBI,QAASkE,EAAakC,cACfuD,eAAczF,EAAWjE,kDAAXiE,EAAWjE,YAAA0E,GAChCzE,SAAUgE,EAAQhE,SAClB0J,gBAAe1F,EAAW9D,YAC1BG,YAAa2D,EAAW3D,YACxBE,SAAUyD,EAAQzD,SAClBC,QAAOwD,EAAKxD,OACZE,SAAUsD,EAAQtD,SAClBC,SAAUqD,EAAQrD,SAClBC,WAAYoD,EAAUpD,WACtBC,SAAUmD,EAAQnD,SAClB8I,sBAAoB3F,EAAY0E,aAChCkB,SAAQ5F,EAAY2E,6MCW3B,IAAeoB,GAAA,CACbrL,KAAM,YACNoC,MAAO,CAAC,SAAU,MAAO,SAAU,qBACnCrB,MAAO,CACLgG,iBAAkBhF,OAClBf,WAAY,CACVC,KAAMC,MACNC,QAASA,IAAM,IAEjBmK,QAAS,CACPrK,KAAMC,MACNqK,UAAU,EACVpK,QAASA,IAAM,IAEjBqK,kBAAmB,CACjBvK,KAAMM,QACNJ,SAAS,GAEXsK,UAAW,CACTxK,KAAMM,QACNJ,SAAS,GAEXuK,QAAS,CACPzK,KAAMM,QACNJ,SAAS,GAEXC,QAAS,CACPH,KAAMc,OACNZ,QAASA,IACPwK,EAAS,CACPC,WAAW,EACXC,UAAU,KAGhBC,IAAKrK,OACLsC,IAAKtC,OACLI,SAAUN,SAEZuG,MAAO,CACL9G,WAAY,CACVgH,UACEvF,KAAKsJ,eAEPC,MAAM,GAERC,2BAA4B,SAAUC,GACpCzJ,KAAK0J,UAAUC,SAAS,GAAGrL,MAAMsL,QAC/B5J,KAAK6I,QAAQjI,QAAU6I,EAAI,EAAI,KAGrC9E,OACE,MAAO,CACLkF,KAAM,GACNC,IAAK,GACL5B,KAAM,GACN6B,KAAMC,EAAQhK,KAAKsE,iBAAiB2F,KAAKC,SACzCC,QAAS,GACTC,SAAU,GACVV,UAAW,CACTlL,KAAM,KACN6L,UAAU,EACVC,QAAQ,EACRC,SAAS,EACTZ,SAAU,CACR,CACEnL,KAAM,KACNa,MAAO,CACLmL,UAAW,UAEbF,QAAQ,EACRC,SAAS,EACTjM,MAAO,CACLsL,QACE5J,KAAK6I,QAAQjI,QAAUZ,KAAKsE,iBAAiBmG,QAAU,EAAI,IAE/Dd,SAAU,CAAC3J,KAAKsE,iBAAiBoG,EAAE,cAAgB,aAM7DlJ,QAAS,CACPmJ,aACE3K,KAAK4K,eAEPA,cACE,MAAMzK,EAAQH,KAAK8J,IAChB7J,IAAI,CAAC4K,EAAIC,KACD,IACD9K,KAAKzB,WAAWuM,IAAQ,MACzB9K,KAAKkI,KAAK6C,oBAAoBF,MAGpC1I,OAAQ6I,IACP,IAAKhL,KAAK+I,kBACR,OAAO,EAET,GAAIiC,MAAAA,EACF,OAAO,EAET,IAAIC,GAAO,EAIX,OAHA3L,OAAO4L,KAAKF,GAAG9F,QAASiG,IACtBF,EAAOA,QAAkBhM,IAAT+L,EAAEG,IAA6B,KAATH,EAAEG,IAAsB,OAATH,EAAEG,KAElDF,IAELG,EAAMpF,KAAKE,UAAU/F,GACvBiL,IAAQpL,KAAKoK,WACfpK,KAAKoK,SAAWgB,EAChBpL,KAAKU,MAAM,oBAAqBP,GAChCH,KAAKU,MAAM,SAAUP,KAGzBkL,WAAWP,EAAKQ,GACd,MAAMC,EAAMvL,KAAK8J,IAAIgB,GACrB9K,KAAKkI,KAAKsD,oBAAoBD,EAAKD,GAAU,IAE/ChC,cACE,MAAM8B,EAAMpF,KAAKE,UAAUlG,KAAKzB,YAC5ByB,KAAKoK,WAAagB,IAGtBpL,KAAKoK,SAAWgB,EAChBpL,KAAK8J,IAAM9J,KAAK8J,IAAI2B,OAAO,EAAGzL,KAAKzB,WAAWqC,QACzCZ,KAAKzB,WAAWqC,OAGnBZ,KAAK0L,aAFL1L,KAAK2L,WAIP3L,KAAKzB,WAAW2G,QAAQ,CAACP,EAAMmG,KACxB9K,KAAK8J,IAAIgB,IACZ9K,KAAK4L,SAEP5L,KAAKqL,WAAWP,EAAKnG,GAAQ,MAE/B3E,KAAK6J,KAAK,GAAGF,SAAS,GAAGA,SAAW3J,KAAK8J,MAE3C6B,WACM3L,KAAK8J,IAAIlJ,QACXZ,KAAK8J,IAAI2B,OAAO,EAAGzL,KAAK8J,IAAIlJ,QAE9BZ,KAAK8J,IAAI+B,KAAK7L,KAAK0J,YAErBgC,aACM1L,KAAK8J,IAAI,IAAM9J,KAAK8J,IAAI,GAAGO,UAC7BrK,KAAK8J,IAAI2B,OAAO,EAAG,IAGvBK,OAAOhB,GAEH9K,KAAKZ,WACJY,KAAKgJ,WACLhJ,KAAKqJ,IAAM,GAAKrJ,KAAK8J,IAAIlJ,QAAUZ,KAAKqJ,MAI3CrJ,KAAK8J,IAAI2B,OAAOX,EAAK,GACrB9K,KAAK4K,cACD5K,KAAK8J,IAAIlJ,OACXZ,KAAK8J,IAAI5E,QAAS2F,GAAO7K,KAAK+L,UAAUlB,IAExC7K,KAAK2L,WAEP3L,KAAKU,MAAM,SAAUoK,KAEvBc,OAAOX,GACL,GAAIA,GAAQjL,KAAKZ,SACf,OAEF,MAAMyL,EAAK7K,KAAKsE,iBAAiB2F,KAAK+B,UAAUhM,KAAKmK,SAAS,GACtC,IAApBnK,KAAK8J,IAAIlJ,QAAgBZ,KAAK8J,IAAI,GAAGO,UACvCrK,KAAK8J,IAAI2B,OAAO,EAAG,GAErBzL,KAAK8J,IAAI+B,KAAKhB,GACd7K,KAAK+L,UAAUlB,GACXI,IACFjL,KAAKU,MAAM,MAAOV,KAAK8J,IAAIlJ,QAC3BZ,KAAK4K,gBAGTmB,UAAUlB,GACR,MAAMC,EAAM9K,KAAK8J,IAAImC,QAAQpB,GAC7BA,EAAGlB,SAAS,GAAGrL,MAAM4N,UAAYpB,EAAM,EACvCD,EAAGlB,SAASkB,EAAGlB,SAAS/I,OAAS,GAAG+I,SAAS,GAAGrL,MAAM+E,QAAU,KAC9DrD,KAAK8L,OAAOhB,KAGhBqB,WACE,MAAMC,EAAS,CACb,CACE5N,KAAM,KACN8L,QAAQ,EACR7M,MAAO,kBACPa,MAAO,CACL4N,UAAW,OAIjB,IAAIG,EAAO,CACT,CACE7N,KAAM,KACNf,MAAO,aACP6M,QAAQ,EACRhM,MAAO,CACL4N,UAAW,OAIjBlM,KAAK6I,QAAQ3D,QAASoH,IACpBF,EAAOP,KAAK,CACVrN,KAAM,KACN8L,QAAQ,EACRjL,MAAO,IACDiN,EAAOjN,OAAS,GACpBmL,UAAW8B,EAAOC,OAAS,UAE7B9O,MAAO6O,EAAOxD,SAAW,uBAAyB,GAClDxK,MAAO,CACL4N,UAAWI,EAAOhM,OAAS,MAG/B+L,EAAKR,KAAK,CACRrN,KAAM,KACN8L,QAAQ,EACRX,SAAU,IAAK2C,EAAOzC,MAAQ,QAGlCuC,EAAOP,KAAK,CACVrN,KAAM,KACN8L,QAAQ,EACR7M,MAAO,uBACPa,MAAO,CACL4N,UAAWlM,KAAKsE,iBAAiBoG,EAAE,cAAgB,QAGvD2B,EAAKR,KAAK,CACRrN,KAAM,KACN8L,QAAQ,EACR7M,MAAO,sBACPkM,SAAU,CACR,CACEnL,KAAM,IACN8L,QAAQ,EACR7M,MAAO,sBACPa,MAAO,OAIb0B,KAAKmK,QAAUnK,KAAKsE,iBAAiB2F,KAAKuC,OAAO,CAC/C,CACEhO,KAAM,KACN8L,QAAQ,EACRC,SAAS,EACTZ,SAAU0C,KAGdrM,KAAK6J,KAAO,CACV,CACErL,KAAM,QACN8L,QAAQ,EACR7M,MAAO,eACPa,MAAO,CACLmO,OAAQ,IACRC,YAAa,IACbC,YAAa,KAEfhD,SAAU,CACR,CACEnL,KAAM,QACN8L,QAAQ,EACRX,SAAU,CACR,CACEnL,KAAM,KACN8L,QAAQ,EACRX,SAAUyC,KAIhB,CACE5N,KAAM,QACN8L,QAAQ,EACRX,SAAU3J,KAAK8J,UAO3B8C,UACE5M,KAAKmM,YAEP1G,UACEzF,KAAKsJ,iFC9TP3L,EAoBK,MAAA,CApBAF,MAAKoP,EAAA,CAAC,iBAAe,CAAAC,eAA4BC,EAAS3N,eAC7D1B,IAAAsP,EASYC,EARLC,EAAInD,MAAA,CACRlI,OAAQkL,EAAOpO,QACfkL,KAAMqD,EAAIrD,KACVsD,cAAc,EACd/N,SAAU2N,EAAQ3N,SAClBqJ,SAAQR,EAAU0C,WACX9C,IAAKqF,EAAIhF,mCAAJgF,EAAIhF,KAAA5E,GAChB8J,YAAYvK,EAAKnC,6EAKZqM,EAAA9D,WAAa8D,EAAIzL,KAAGyL,MAAW/M,KAAA8J,IAAIlJ,aAH3CoM,EAQUK,EAAA,OAPR7O,KAAK,OACLf,MAAM,WAEL4F,uBAAO4E,EAAM2D,QAAA,IACbxM,SAAU2N,EAAQ3N,qBAClB,IAA+D,aAA/DvB,EAA+D,IAAA,CAA5DJ,MAAM,0BAA0B4B,MAAA,CAAwBiO,cAAA,oBAAI,IAChElK,EAAG2J,EAAgBzI,iBAACoG,EAAC,QAAA,MAAA,6CCP3B,IAAA6C,GAAelP,EAAgB,CAC7Bd,KAAM,gBACNoH,KAAIA,KACK,MCdJ,MAAAnH,GAAA,CAAAC,MAAM,4BACJA,MAAM,yBAGNA,MAAM,mDAJb,OAAAC,IAAAC,EAKK,MALLH,GAKK,CAJ4BqF,EAAA2K,OAAO9O,SAAtChB,IAAAC,EAEK,MAFL8P,GAEK,CADHC,EAAY7K,EAAA2K,OAAA,eAEd9P,IAAAC,EAAyC,MAAzCsG,QCUJ,IAAA0J,GAAetP,EAAgB,CAC7Bd,KAAM,sBACNe,MAAO,CACLgC,MAAOnB,OACPoN,MAAOpN,OACPpB,MAAO,CAACiB,OAAQG,QAChByO,MAAOzO,OACP2J,SAAUhK,SAEZc,SAAU,CACRiO,WACE,MAAMC,EAAI9N,KAAKjC,MACTsB,EAAQ,CACZtB,MAAOgQ,EAAG/O,OAAO8O,GAAQA,EAAH,KAAYA,GAAW,SAANA,EAAyBA,EAAV,SAKxD,OAHI9N,KAAK4N,QACPvO,EAAMuO,MAAQ5N,KAAK4N,OAEdvO,IAGXsF,KAAIA,KACK,sBClCiBlH,MAAM,mBAEzBgQ,GAAA,CAAAhQ,MAAM,yDAJbE,EAOK,MAAA,CAPAF,MAAM,aAAc4B,QAAOwD,EAAQgL,YACtChQ,EAEK,MAAA,CAFAJ,MAAM,eAAgB4B,mBAAoBwD,EAAM0J,OAAA,aACvC1J,EAAQiG,cAApBnL,EAAsD,OAAtDH,GAA8C,uBAAWqF,EAAMvC,OAAA,IAAA,OAEjEzC,EAEK,MAFL4P,GAEK,CADHC,EAAY7K,EAAA2K,OAAA,kBCMlB,IAAepJ,GAAA,CACb4J,EACAC,EACAC,EACAC,EACAC,EACA/J,EACAgK,GACAC,GACAC,GACAC,GACAC,ICrBaC,GAAA,CACXnR,KAAM,WACNoR,WAAY,QACZC,UAAUC,GACN,MAAMvQ,EAAQuQ,EAAIC,KAAKxQ,MAClByQ,EAAYzQ,EAAO,aACpBA,EAAMK,QAAUkQ,EAAIC,KAAKnQ,SAAW,MCNjCqQ,GAAA,IACRN,GAAUnR,KAAM,SCAR0R,GAAA,IACVP,GACHnR,KAAM,SACNqR,UAAUC,GAAK,IAAAK,EACb,MAAM5Q,EAAQuQ,EAAIC,KAAKxQ,MAClByQ,EAAYzQ,EAAO,aAAYA,EAAMK,QAAUkQ,EAAIC,KAAKnQ,SAAW,IAGxE,MAAMwQ,EAAYN,EAAIO,WAAW,SACfD,IAAmC,IAAtBA,EAAUE,UAIvC/Q,EAAMc,UAAW,EACjBd,EAAM+Q,SAAU,KAMa,KAAf,QAAdH,EAAAL,EAAIhF,KAAKvL,aAAT4Q,IAAcA,OAAdA,EAAAA,EAAgBI,YAAwC,IAAnBhR,EAAMgR,YAE3ChR,EAAMc,UAAW,IAGrBmQ,OAAO5F,EAAUkF,GAEf,MAAMM,EAAYN,EAAIO,WAAW,SAIjC,GAHkBD,IAAmC,IAAtBA,EAAUE,SAGxB1F,EAAS0F,QAAS,CAEjC,MAAMG,EAAc,IAAK7F,GAEzB,OADA6F,EAAYC,gBAAkB9F,EAAS0F,QAChCR,EAAIa,QAAQC,cAAcd,EAAKW,GAIxC,OAAOX,EAAIa,QAAQC,cAAcd,EAAKlF,KCrC3BiG,GAAA,CACbrS,KAAM,WACNqR,UAAUC,GACR,MAAMvQ,EAAQuQ,EAAIC,KAAKxQ,MAClByQ,EAAYzQ,EAAO,aAAYA,EAAMK,QAAUkQ,EAAIC,KAAKnQ,SAAW,IAGxE,MAAMwQ,EAAYN,EAAIO,WAAW,SAUjC,GATkBD,IAAmC,IAAtBA,EAAUE,UAIvC/Q,EAAMc,UAAW,EACjBd,EAAM+Q,SAAU,GAId/Q,EAAMuR,SAAU,CAAA,IAAAC,EAClB,MAAMjI,EAAiB,QAAdiI,EAAGjB,EAAIkB,eAAO,IAAAD,OAAA,EAAXA,EAAajI,IACnBgC,EAAOgF,EAAIhF,KACXmG,EAASnB,EAGf,IAAIoB,EAAWlC,EAAG5O,OAAOb,EAAMuR,UAC3BK,EAAQ5R,EAAMuR,UACdvR,EAAMuR,SAGV,IAAK9B,EAAGrJ,SAASuL,IAAalC,EAAG5O,OAAOb,EAAMuR,UAC5C,IACE,MAAMM,EAAO7R,EAAMuR,SAASO,OAEzBD,EAAKE,WAAW,aAChBF,EAAKE,WAAW,kCAChBF,EAAKE,WAAW,WAEjBJ,EAAW,IAAIvL,SACb,kBACA,UACA,gBACA,MACA,OACAyL,IAGJ,MAAOzJ,IAQPqH,EAAGrJ,SAASuL,KAKd3R,EAAMuR,SAAW,SAAUS,GACzB,IAAKA,GAA8C,IAA3BA,EAAgB1P,OAAc,OAEtD,MAAM2P,EAAeD,EAAgBA,EAAgB1P,OAAS,GAE9D,IAA6B,KAAzB2P,MAAAA,OAAY,EAAZA,EAAcC,QAChB,OAGF,MAAM7R,EAAUL,EAAMK,SAAW,GAI3B8R,EAAgBA,KAAM,IAAAC,EAAAC,EAG1B,MAAMC,EAAiBtS,EAAMK,SAAW,GAIlCkS,EAAwBA,CAC5BC,EACAC,EACAC,EACAxB,KAEA,IAAKuB,GAAoC,IAAtBA,EAAWnQ,OAE5B,OAAOkQ,EAAY7Q,IAAKC,IAAU,IAC7BA,EACHyJ,SAAUzJ,EAAKyJ,SACXzJ,EAAKyJ,SAAS1J,IAAKgR,IAAW,IAAKA,UACnChS,KAIR,MAAMY,EAAekR,EAAWC,GAC1BE,EAASF,IAAUD,EAAWnQ,OAAS,EAE7C,OAAOkQ,EAAY7Q,IAAKC,IACtB,MAAMmC,EAAU,IAAKnC,GAGrB,YACkBjB,IAAfiB,EAAKC,OAAuBD,EAAKC,QAAUN,QAC/BZ,IAAZiB,EAAKiR,IAAoBjR,EAAKiR,KAAOtR,EAElCqR,GAEF7O,EAAQsH,SAAW6F,EACf,IAAIA,QACJvQ,EACJoD,EAAQgN,SAAU,EAEXhN,IAGHnC,EAAKyJ,UAAYzJ,EAAKyJ,SAAS/I,OAAS,EAE1CyB,EAAQsH,SAAWkH,EACjB3Q,EAAKyJ,SACLoH,EACAC,EAAQ,EACRxB,GAIFnN,EAAQsH,cAAW1K,EAEdoD,IAKPnC,EAAKyJ,UAAYzJ,EAAKyJ,SAAS/I,OAAS,EAC1CyB,EAAQsH,SAAWkH,EACjB3Q,EAAKyJ,SACLoH,EACAC,EACAxB,GAIFnN,EAAQsH,cAAW1K,EAGdoD,MAKL0O,EAAaT,EAAgBrQ,IAAK0B,GAAQA,EAAIxB,OAASwB,EAAIwP,IAG3D3L,EAAaqL,EACjBD,EACAG,EACA,EACAR,EAAeA,EAAa5G,cAAW1K,GAOnCkQ,EAAYa,EAAOZ,WAAW,SAChCD,GAEFiC,EAAQjC,EAAW,gBAAiB3J,GAItClH,EAAMK,QAAU6G,EAGDkL,QAAfA,EAAIV,EAAOlB,YAAP4B,IAAWA,GAAXA,EAAapS,QACf0R,EAAOlB,KAAKxQ,MAAMK,QAAU6G,GAIfmL,QAAfA,EAAIX,EAAOnG,YAAP8G,IAAWA,GAAXA,EAAarS,QACf0R,EAAOnG,KAAKvL,MAAMK,QAAU6G,GAI1BqC,GAAOgC,GACThC,EAAIwJ,KAAKxH,GAIPmG,EAAOD,SACTC,EAAOD,QAAQuB,WAMff,IACFA,EAAalB,SAAU,EACvBoB,KAIF,MAAMnK,EAAS2J,EAASxJ,KACtBzG,KACAsQ,EACA3R,EACA8R,EACA5I,EACAgC,GAIF,OAAIvD,GAAiC,mBAAhBA,EAAOiL,KACnBjL,EAAOkL,QAAQ,KACpBf,MAIGnK,IAMX,MAAMmL,EAA2BC,IAC/B,IACGA,IACAjT,MAAMsB,QAAQ2R,IACfA,EAAY9Q,QAAU,IACrBtC,EAAMuR,UACmB,mBAAnBvR,EAAMuR,SAEb,OAIF,MAAM8B,EAAW,mBAAkB9C,EAAIhF,KAAK+H,QAAU/K,KAAKC,OACvD+H,EAAIhF,KAAK8H,IACXE,aAAahD,EAAIhF,KAAK8H,IAGxB9C,EAAIhF,KAAK8H,GAAYG,WAAW,KAC9B,IAAIC,EAAa,EACjB,MAEMC,EAAkBC,UACtBF,IACA,MAAM5C,EAAYa,EAAOZ,WAAW,SAGpC,GAAI2C,EAPa,GAQf,OAIF,GAAI5C,IAAmC,IAAtBA,EAAUE,QAEzB,YADAyC,WAAWE,EAAiB,KAI9B,IAAIpB,EAAiBtS,EAAMK,SAAW,GAEtC,IAAKiS,GAA4C,IAA1BA,EAAehQ,OAAc,CAElD,KAAIuO,GAAaA,EAAU7Q,OAAS6Q,EAAU7Q,MAAMK,SAKlD,YADAmT,WAAWE,EAAiB,KAH5BpB,EAAiBzB,EAAU7Q,MAAMK,QACjCL,EAAMK,QAAUiS,EAOpB,IAAKA,GAA4C,IAA1BA,EAAehQ,OACpC,OAIF,MAAMsR,EAAkBD,MAAOlB,EAAYoB,KACzC,GAAIA,GAAcpB,EAAWnQ,OAAS,EACpC,OAIFgQ,EAAiBtS,EAAMK,SAAW,GAGlC,MAAM2R,EAAkB,GACxB,IAAI8B,EAAsBxB,EAC1B,IAAK,IAAIyB,EAAI,EAAGA,GAAKF,EAAYE,IAAK,CACpC,MAAM7R,EAAMuQ,EAAWsB,GACjBxQ,EAASuQ,EAAoB1Q,KAChCC,GAAQA,EAAIxB,QAAUK,GAAOmB,EAAIwP,KAAO3Q,GAE3C,IAAIqB,EAIF,OAHAyO,EAAgBzE,KAAKhK,GACrBuQ,EAAsBvQ,EAAO8H,UAAY,GAM7C,MAAM2I,EAAgBhC,EAAgB6B,GAGtC,IAA6B,IAAzBG,EAAc9B,OAChB,OAIF,MAAM+B,EAAYxB,EAAWoB,EAAa,GAC1C,GAAII,MAAAA,EACF,OASF,GAJED,EAAc3I,UACdlL,MAAMsB,QAAQuS,EAAc3I,WAC5B2I,EAAc3I,SAAS/I,OAAS,QA2B1BsR,EAAgBnB,EAAYoB,EAAa,OAzB/B,CAGhBG,EAAcjD,SAAU,EAExB,IACE,MAAM/I,EAAShI,EAAMuR,SAASS,GAG1BhK,GAAiC,mBAAhBA,EAAOiL,YACpBjL,QAIF,IAAIkM,QAASC,GAAYX,WAAWW,EAAS,MAG/CN,EAAa,EAAIpB,EAAWnQ,OAAS,SACjCsR,EAAgBnB,EAAYoB,EAAa,GAEjD,MAAOhM,GACPmM,EAAcjD,SAAU,KAS9B6C,EAAgBR,EAAa,GAAG3J,MAAM,SAKxCiK,KACC,MAICnS,EAAegP,EAAIhF,KAAK1J,MAExBZ,EAAWyG,KAAKE,UAAUrG,GAAgB,IAI9CN,IAHmBsP,EAAIhF,KAAK6I,uBAI5B7S,GACApB,MAAMsB,QAAQF,KAEdgP,EAAIhF,KAAK6I,sBAAwBnT,EACjCkS,EAAwB5R,MAI9B0P,OAAO5F,EAAUkF,GAEf,MAAMM,EAAYN,EAAIO,WAAW,SAIjC,GAHkBD,IAAmC,IAAtBA,EAAUE,SAGxB1F,EAAS0F,QAAS,CAEjC,MAAMG,EAAc,IAAK7F,GAEzB,OADA6F,EAAYC,gBAAkB9F,EAAS0F,QAChCR,EAAIa,QAAQC,cAAcd,EAAKW,GAIxC,OAAOX,EAAIa,QAAQC,cAAcd,EAAKlF,IAExClE,QAAQoJ,GAEN,MAAM1O,EAAQ0O,EAAIhF,KAAK1J,MACjB7B,EAAQuQ,EAAIC,KAAKxQ,MAEnB6B,GAAS1B,MAAMsB,QAAQI,IAAUA,EAAMS,OAAS,GAAKtC,EAAMuR,UAE7DiC,WAAW,KACT,MAAMa,EAAa9D,EAAIC,KAAKxQ,MAAMuR,SAC9B8C,GAAoC,mBAAfA,IAGvB9D,EAAIhF,KAAK6I,sBAAwB,OAElC,OCxZT,MAAME,GAAc,CAClBC,KAAM,aACNC,MAAO,UACPC,KAAM,UACNC,QAAS,UACTC,KAAM,QAGF1V,GAAO,aAEb,IAAe2V,GAAA,MACb3V,GACA4V,MACS,CAAC,OAAQ,QAAS,QAAQC,OAC/B,CAACC,EAAS7U,KACR6U,EAAQ7U,GAAQ8U,EAAe/V,GAAM,CAAEiB,KAAAA,IAChC6U,GAET,CACEE,UAAWD,EAAe/V,GAAM,CAAEiB,KAAM,UACxCgV,cAAeF,EAAe/V,GAAOkW,GACnCA,EAAEnV,MAAM,CAAEE,KAAM,QAASkV,UAAU,OAK3C/E,WAAY,QACZC,UAAUC,GACR,MAAMvQ,EAAQuQ,EAAIC,KAAKxQ,MACjBE,EAAOF,EAAME,MAAQF,EAAMqV,OAC5BrV,EAAMsV,cACTtV,EAAMsV,aACHhB,GAAYpU,IAASoU,GAAkB,QACvCtU,EAAMoV,UAAclV,GAAiB,SAATA,EAAiC,GAAd,eAGtD+Q,OAAMA,CAAC5F,EAAUkF,IACRA,EAAIa,QAAQmE,QACS,IAAzBhF,EAAIC,KAAKxQ,MAAMwV,MAAiB,QAAU,QAAU,UACrDjF,EAAIC,KAAMnF,ICrChB,IAAeoK,GAAA,MAFF,SAIXZ,MAAO,CACLY,OAAQ,CAACxP,EAAOpE,IAAUmT,EALjB,SAKiBA,CAAqB,GAAI/O,EAAOpE,IAE5DoP,OAAMA,IACG,ICPIyE,GAAA,CACbzW,KAAM,OAGN0W,cAAc,EAEdxO,QAAQoJ,GAAK,IAAAqF,EAAAC,EAEX,MAAM7V,EAAQuQ,EAAIhF,KAAKvL,OAAS,GAC1B8V,EACJvF,EAAIhF,KAAKuK,WAAa9V,EAAM8V,oBAASF,EAAIrF,EAAIC,KAAKxQ,aAAK,IAAA4V,OAAA,EAAdA,EAAgBE,WACrDC,EACJxF,EAAIhF,KAAKwK,UAAY/V,EAAM+V,mBAAQF,EAAItF,EAAIC,KAAKxQ,aAAK,IAAA6V,OAAA,EAAdA,EAAgBE,WAErDA,GAAYD,IAEdtC,WAAW,KACT,GAAIjD,EAAIkB,SAAWlB,EAAIkB,QAAQlI,IAC7B,IACE,IAAI1H,EAAQ,GAGZ,GAAIkU,EAAU,CACZ,MAAM/I,EAAWuD,EAAIkB,QAAQlI,IAAIyD,WAEjCnL,EAAQ0O,EAAIkB,QAAQuE,WAClBD,EACC9P,IAEC,MAAM/D,EAAMqO,EAAIkB,QAAQlI,IAAI0M,SAAShQ,GAErC,YACUtF,IAARuB,GACA8K,QACoBrM,IAApBqM,EAAS/G,GAEF+G,EAAS/G,GAEX/D,GAET,WAIK4T,IACPjU,EAAQ0O,EAAIkB,QAAQlI,IAAI0M,SAASH,IAAc,IAIpC,MAATjU,IACG0O,EAAIhF,KAAKF,WACZkF,EAAIhF,KAAKF,SAAW,IAEtBkF,EAAIhF,KAAKF,SAAS,GAAKxK,OAAOgB,GAE9B0O,EAAIkB,QAAQlI,IAAIwJ,KAAKxC,EAAIhF,MACzBgF,EAAIkB,QAAQuB,WAEd,MAAO5K,MAIV,MAIP8N,eAAcA,CAAC7K,EAAUkF,KAGhB,CACLnQ,QAASA,KAAM,IAAA+V,EAGb,IAAIC,EAA0B,QAAXD,EAAG5F,EAAIhF,YAAI,IAAA4K,OAAA,EAARA,EAAU9K,SAG3B+K,IACHA,EAAkB/K,GAoBpB,OAhBsBlL,MAAMsB,QAAQ2U,GAChCA,EACA,CAACA,IAIFvS,OAAQ6I,GAAMA,MAAAA,GACd/K,IAAK+K,GACA+C,EAAG5O,OAAO6L,GACLA,EAGF7L,OAAO6L,IAEf2J,KAAK,KAEO,MAIrB/F,UAAUC,GAAK,IAAA+F,EAAAC,EAAAC,EASb,MAAMxW,EAAQuQ,EAAIhF,KAAKvL,OAAS,GAC1B8V,EACJvF,EAAIhF,KAAKuK,WAAa9V,EAAM8V,oBAASQ,EAAI/F,EAAIC,KAAKxQ,aAAK,IAAAsW,OAAA,EAAdA,EAAgBR,WACrDC,EACJxF,EAAIhF,KAAKwK,UAAY/V,EAAM+V,mBAAQQ,EAAIhG,EAAIC,KAAKxQ,aAAK,IAAAuW,OAAA,EAAdA,EAAgBR,UACzD,IAAIU,EACFlG,EAAIhF,KAAKkL,UAAYzW,EAAMyW,mBAAQD,EAAIjG,EAAIC,KAAKxQ,aAAK,IAAAwW,OAAA,EAAdA,EAAgBC,UAczD,GAXKA,IAEDA,EADEV,EACS,WACFD,EACE,QAEA,UAKE,UAAbW,GAAwBX,EAAW,CACrC,MAAMY,EAAiB,CACrBC,KAAMb,EACNc,GAAI,QACJC,QAAQ,EAERC,KAAM,IAEN/P,OAAO,GAIJwJ,EAAIhF,KAAKwL,SACZxG,EAAIhF,KAAKwL,OAAS,IAEfxG,EAAIhF,KAAKwL,OAAOxF,WACnBhB,EAAIhF,KAAKwL,OAAOxF,SAAW,IAGdhB,EAAIhF,KAAKwL,OAAOxF,SAASzN,KACrClC,GAASA,EAAK+U,OAASb,GAAyB,UAAZlU,EAAKgV,MAG1CrG,EAAIhF,KAAKwL,OAAOxF,SAAShE,KAAKmJ,GAG1BnG,EAAIkB,SAAWlB,EAAIkB,QAAQsF,QAC7BxG,EAAIkB,QAAQsF,OAAOxG,EAAK,gBAKzB,GAAiB,aAAbkG,GAA2BV,EAAU,CAC5C,MAAMW,EAAiB,CACrBX,SAAUA,EACVa,GAAI,QACJC,QAAQ,EAERC,KAAM,IAEN/P,OAAO,GAGJwJ,EAAIhF,KAAKwL,SACZxG,EAAIhF,KAAKwL,OAAS,IAEfxG,EAAIhF,KAAKwL,OAAOxF,WACnBhB,EAAIhF,KAAKwL,OAAOxF,SAAW,IAM7B,IAHehB,EAAIhF,KAAKwL,OAAOxF,SAASzN,KACrClC,GAASA,EAAKmU,WAAaA,GAAwB,UAAZnU,EAAKgV,MAG7CrG,EAAIhF,KAAKwL,OAAOxF,SAAShE,KAAKmJ,GAE1BnG,EAAIkB,SAAWlB,EAAIkB,QAAQsF,SAC7BxG,EAAIkB,QAAQsF,OAAOxG,EAAK,WAGnBA,EAAIyG,uBAAsB,CAC7BzG,EAAIyG,sBAAuB,EAC3B,MAAMC,EAAcC,EAAM3G,EAAIhF,KAAKwL,OAAQ,YAC3CxG,EAAIxJ,MAAMwG,KACRxG,EACEkQ,EACA,CAACE,EAAQC,KACP7G,EAAIkB,QAAQsF,OAAOxG,EAAK,QAAS,CAAEgB,SAAU4F,KAE/C,CAAElM,MAAM,MAWY,MAA5BsF,EAAIhF,KAAK8L,iBAA4B9G,EAAIhF,KAAKF,WAChDkF,EAAIhF,KAAKF,SAAW,CAACkF,EAAIhF,KAAK8L,kBAI3B9G,EAAIhF,KAAKF,WACZkF,EAAIhF,KAAKF,SAAW,KAMN,UAAboL,GAAwBX,GACX,aAAbW,GAA2BV,MAKzBxF,EAAIhF,KAAKF,UACTlL,MAAMsB,QAAQ8O,EAAIhF,KAAKF,WAA0C,IAA7BkF,EAAIhF,KAAKF,SAAS/I,UAOrDiO,EAAIhF,KAAKF,SAHM,aAAboL,EAGkB,CAAC,IAGD,CAAC,OAK7BxF,OAAO5F,EAAUkF,GAMf,IAAImF,EAAO,GACX,GAAIrK,GAAwC,mBAArBA,EAASjL,QAC9B,IACEsV,EAAOrK,EAASjL,WAAa,GAC7B,MAAOgI,GACPsN,EAAO,GAMTA,EADU,MAARA,QAAyB/U,IAAT+U,EACX,GAEA7U,OAAO6U,GAIhB,MAAMlF,EAAO,IAAKD,EAAIC,MACjBA,EAAKxQ,QACRwQ,EAAKxQ,MAAQ,IAIG,SAAdwQ,EAAKtQ,OACPsQ,EAAKtQ,KAAO,cAGPsQ,EAAKxQ,MAAMsX,UAKlB,OADc/G,EAAIgF,MAAMgC,KAAK,MAAO/G,EAAM,CAACkF,MCzR/C,IAAe8B,GAAA,MADF,QAGX3C,MACS,CAAC,WAAY,MAAO,QAAS,OAAQ,WAAY,UAAUC,OAChE,CAACD,EAAO3U,KACN2U,EAAM3U,GAAQ8U,EANT,QAM8B,CAAE9U,KAAAA,IAC9B2U,GAET,CACE4C,MAAOzC,EAVF,QAUuB,CAAE9U,KAAM,WAI1CmQ,WAAY,QACZY,OAAO5F,EAAUkF,GACf,IAAIrQ,EAAOqQ,EAAIC,KAAKxQ,MAAME,KAS1B,OAR0D,IAAtD,CAAC,WAAY,SAAU,YAAYyN,QAAQzN,KAAcA,EAAO,SAEpEA,EACE,CACEwX,SAAU,YACVC,OAAQ,eACRC,SAAU,kBACV1X,IAAS,SACNqQ,EAAIa,QAAQmE,MAAMgC,KAAKrX,EAAMqQ,EAAIC,KAAMnF,IAEhDlE,QAAQoJ,GAAK,IAAAqF,EAAAC,EAAArE,EAEX,GAC2B,cAAXoE,QAAdA,EAAArF,EAAIC,KAAKxQ,iBAAK4V,SAAdA,EAAgB1V,OACF,QADqB2V,EACnCtF,EAAIC,KAAKxQ,aAAT6V,IAAcA,GAAdA,EAAgB7E,WACS,aAAzBQ,EAAAjB,EAAIkB,eAAO,IAAAD,OAAA,EAAXA,EAAarF,SACb,CACA,MAAM0L,EAAwBC,IAC5B,IAAKA,EAAY,OAEjBA,EAAW/W,MAAMvB,OAAS,OAC1B,MAAMuY,EAAeD,EAAWC,aAC5BA,EAAe,IACjBD,EAAW/W,MAAMvB,OAASuY,EAAe,MAE3CD,EAAW/W,MAAMiX,SAAW,UAI9BxE,WAAW,KACT,MAAMyE,EAAK1H,EAAI0H,GACf,IAAKA,EAAI,OAGT,MAAMP,EACJO,EAAGC,cAAc,uBAAyBD,EAAGC,cAAc,YAC7D,GAAKR,IAGLG,EAAqBH,GAGW,oBAArBS,kBAAkC,CAC3C,MAAMC,EAAW,IAAID,iBAAiB,KACpCN,EAAqBH,KAGvBU,EAASC,QAAQX,EAAU,CACzBY,YAAY,EACZC,gBAAiB,CAAC,SAClBC,WAAW,EACXC,SAAS,EACTC,eAAe,IAIjB,MAAMC,EAAaC,YAAY,KAC7Bf,EAAqBH,IACpB,KAGCnH,EAAIkB,SAAWlB,EAAIkB,QAAQoH,IAC7BtI,EAAIkB,QAAQoH,GAAGC,MAAM,qBAAsB,KACzCV,EAASW,aACTC,cAAcL,OAInB,QCvFMM,GAAA,CACXha,KAAM,aACNoR,WAAY,QACZC,UAAUC,GACN,MAAMvQ,EAAQuQ,EAAIC,KAAKxQ,MAClBA,EAAMsV,cACPtV,EAAMsV,YAAc,aAG5BrE,OAAMA,CAAC5F,EAAUkF,IACNA,EAAIa,QAAQmE,MAAM,SAAmC,IAAzBhF,EAAIC,KAAKxQ,MAAMwV,MAAiB,QAAU,IAAM,UAAUjF,EAAIC,KAAMnF,ICVhG6N,GAAA,CACXja,KAAM,OACNoR,WAAY,cACZC,UAAUC,GACN,MAAMvQ,EAAQuQ,EAAIC,KAAKxQ,MAClBA,EAAMmZ,WAIDnZ,EAAMmZ,WAAW1U,MAAKzE,EAAMmZ,WAAW1U,IAAM,MAHnDzE,EAAMmZ,WAAa,CACf1U,IAAK,MAGbzE,EAAMoZ,YAAc7I,EAAIhF,KAAK1J,MAC7B7B,EAAMqZ,WAAY,ICXXC,GAAA,CACXra,KAAM,QACNgS,OAAMA,CAACsI,EAAGhJ,IACCA,EAAIgF,MAAMiE,IAAI,CAACxZ,MAAO,CAACyZ,KAAM,KAAM,CACtCrZ,QAASA,IAAM,CACXmQ,EAAIgF,MAAM+D,IAAI/I,EAAIC,KAAM+I,OCAxC,SAAStD,GAASyD,EAAKC,GACrB,IAAKD,IAAQC,EAAM,OACnB,MAAM/M,EAAO+M,EAAKC,MAAM,KACxB,IAAI/X,EAAQ6X,EACZ,IAAK,MAAMjV,KAAOmI,EAAM,CACtB,GAAa,MAAT/K,EAAe,OACnBA,EAAQA,EAAM4C,GAEhB,OAAO5C,EAGT,ICOegY,GAAA,CACbzJ,GACAwE,GCrBa,IACRA,QAHM,cAKTC,MAAO,GACP5D,OAAMA,CAAC5F,EAAUkF,IACNA,EAAIa,QAAQmE,MAAmB,YAAEhF,EAAIC,KAAMnF,IDkBxDoK,GACAC,GACA8B,GACAyB,GE1Ba,IACRA,GACHha,KAJS,kBAKTgS,OAAMA,CAAC5F,EAAUkF,IACNA,EAAIa,QAAQmE,MAAuB,gBAAEhF,EAAIC,KAAMnF,IFwB5D6N,GACAxI,GACAC,GACAW,GACAgI,GGjCa,CACbra,KAAM,iBACNoR,WAAY,aAEZyJ,YAAWA,CAACjY,EAAO0O,IAEb1O,MAAAA,GAAmD,KAAVA,EACpC,GAEL1B,MAAMsB,QAAQI,GAETA,EAAMF,IAAKC,IAEE,iBAATA,GACE,OAATA,QACgBjB,IAAfiB,EAAKC,OAAuBD,EAAKI,MAM7BJ,IAIJ,CAACC,GAGVkY,QAAOA,CAACC,EAAWzJ,IAEVyJ,EAET1J,UAAUC,GACR,MAAMvQ,EAAQuQ,EAAIC,KAAKxQ,MAUvB,GARKyQ,EAAYzQ,EAAO,aACtBA,EAAMK,QAAUkQ,EAAIC,KAAKnQ,SAAW,IAGjCoQ,EAAYzQ,EAAO,WACtBA,EAAMiG,MAAQsK,EAAIhF,KAAKtF,OAAS,SAGXtF,IAAnB4P,EAAIhF,KAAK1J,MAAqB,CAChC,MAAMN,EAAegP,EAAIhF,KAAK1J,MAE5BN,MAAAA,GAEiB,KAAjBA,EAEAgP,EAAIhF,KAAK1J,MAAQ,GACP1B,MAAMsB,QAAQF,KACxBgP,EAAIhF,KAAK1J,MAAQ,CAACN,MAIxB0P,OAAO5F,EAAUkF,GAEf,MAAM0J,EAAQ1J,EAAIa,QAAQC,cAAcd,EAAKlF,GAG7C,GAAI4O,GAASA,EAAMja,OAASia,EAAMja,MAAMka,GAAI,CAE1C,MAAMC,EAA2BF,EAAMja,MAAMka,GAAG,qBAG1C7Q,EAAkBA,KAGtB+Q,EAAS,KACPA,EAAS,KACP,IAEE,MAAMC,EAAY9J,EAAIhF,KAAKtF,MAC3B,GAAIoU,EAIF,YAHA9J,EAAIkB,QAAQlI,IAAIC,cAAc6Q,GAAW5Q,MAAM,QAOjD,MAAM6Q,EAAW/J,EAAIkB,QAAQ8I,YAAYhK,EAAIhF,KAAKtF,OAC9CqU,GAAYA,EAASzH,IACvBtC,EAAIkB,QAAQ+I,SAAShR,cAAc8Q,EAASzH,IAAIpJ,MAAM,QAIxD,MAAO5B,GAEPC,QAAQC,KAAK,yBAA0BF,SAO/CoS,EAAMja,MAAMka,GAAG,qBAAuB,IAAIzU,KAEpC0U,GACFA,KAA4B1U,GAG9B4D,KAIF,MAAMoR,EAAiBR,EAAMja,MAAMka,GAAW,OAE5CD,EAAMja,MAAMka,GAAW,OADrBO,EACyB,IAAIhV,KAE7BgV,KAAkBhV,GAElB4D,KAIyBA,EAI/B,OAAO4Q,ICzHI,CACbhb,KAAM,gBACNoR,WAAY,aAEZyJ,YAAWA,CAACjY,EAAO0O,IAEb1O,MAAAA,GAAmD,KAAVA,EACpC,GAEL1B,MAAMsB,QAAQI,GAETA,EAAMF,IAAKC,IAEE,iBAATA,GACE,OAATA,QACgBjB,IAAfiB,EAAKC,OAAuBD,EAAKI,MAM7BJ,IAIJ,CAACC,GAGVkY,QAAOA,CAACC,EAAWzJ,IAEVyJ,EAET1J,UAAUC,GACR,MAAMvQ,EAAQuQ,EAAIC,KAAKxQ,MAcvB,GAZKyQ,EAAYzQ,EAAO,aACtBA,EAAMK,QAAUkQ,EAAIC,KAAKnQ,SAAW,IAGjCoQ,EAAYzQ,EAAO,WACtBA,EAAMiG,MAAQsK,EAAIhF,KAAKtF,OAAS,IAG7BwK,EAAYzQ,EAAO,sBACtBA,EAAMgG,iBAAmBuK,EAAImK,aAGR/Z,IAAnB4P,EAAIhF,KAAK1J,MAAqB,CAChC,MAAMN,EAAegP,EAAIhF,KAAK1J,MAE5BN,MAAAA,GAEiB,KAAjBA,EAEAgP,EAAIhF,KAAK1J,MAAQ,GACP1B,MAAMsB,QAAQF,KACxBgP,EAAIhF,KAAK1J,MAAQ,CAACN,MAIxB0P,OAAO5F,EAAUkF,GAEf,MAAM0J,EAAQ1J,EAAIa,QAAQC,cAAcd,EAAKlF,GAG7C,GAAI4O,GAASA,EAAMja,OAASia,EAAMja,MAAMka,GAAI,CAE1C,MAAMC,EAA2BF,EAAMja,MAAMka,GAAG,qBAG1C7Q,EAAkBA,KAGtB+Q,EAAS,KACPA,EAAS,KACP,IAEE,MAAMC,EAAY9J,EAAIhF,KAAKtF,MAC3B,GAAIoU,EAIF,YAHA9J,EAAIkB,QAAQlI,IAAIC,cAAc6Q,GAAW5Q,MAAM,QAOjD,MAAM6Q,EAAW/J,EAAIkB,QAAQ8I,YAAYhK,EAAIhF,KAAKtF,OAC9CqU,GAAYA,EAASzH,IACvBtC,EAAIkB,QAAQ+I,SAAShR,cAAc8Q,EAASzH,IAAIpJ,MAAM,QAIxD,MAAO5B,GAEPC,QAAQC,KAAK,wBAAyBF,SAO9CoS,EAAMja,MAAMka,GAAG,qBAAuB,IAAIzU,KAEpC0U,GACFA,KAA4B1U,GAG9B4D,KAIF,MAAMoR,EAAiBR,EAAMja,MAAMka,GAAW,OAE5CD,EAAMja,MAAMka,GAAW,OADrBO,EACyB,IAAIhV,KAE7BgV,KAAkBhV,GAElB4D,KAIyBA,EAI/B,OAAO4Q,IChII,CACbhb,KAAM,OACNqR,UAAUC,GAAK,IAAAqF,EAAA+E,EAAAC,EAEb,MAAM5a,EAAQuQ,EAAIhF,KAAKvL,OAAS,GAC1B6a,EAAgB7a,EAAM6a,eAAiBtK,EAAIhF,KAAKsP,eAAiB,MACjEC,EAAW9a,EAAM8a,UAAYvK,EAAIhF,KAAKuP,UAAY,SAClDC,EACJ/a,EAAM+a,gBAAkBxK,EAAIhF,KAAKwP,gBAAkB,aAC/CC,EAAahb,EAAMgb,YAAczK,EAAIhF,KAAKyP,YAAc,aACxDC,EACJjb,EAAMib,cAAgB1K,EAAIhF,KAAK0P,cAAgB,aAG3CC,EACc,WAAlBL,GAAgD,mBAAlBA,EAY1BM,EARa,CACjBC,aAAc,QACdC,WAAY,MACZC,OAAQ,SACRC,gBAAiB,gBACjBC,eAAgB,eAChBC,eAAgB,gBAESV,IAAmB,QAUxC9M,EAPW,CACfmN,aAAc,QACdC,WAAY,MACZC,OAAQ,SACRI,SAAU,WACVC,QAAS,WAEYX,IAAe,QAGjCzK,EAAIC,KAAKxQ,QACZuQ,EAAIC,KAAKxQ,MAAQ,IAInBuQ,EAAIC,KAAKxQ,MAAMkb,SAAWA,EAG1B3K,EAAIC,KAAKxQ,MAAMmb,QAAUA,EACzB5K,EAAIC,KAAKxQ,MAAMiO,MAAQA,OAGLtN,IAAdX,EAAM4b,MACRrL,EAAIC,KAAKxQ,MAAM4b,IAAM5b,EAAM4b,KAI7B,MAAMC,EAAgBtL,EAAIhF,KAAKxK,OAAS,IAGtC+a,QAASC,EACTlB,cAAemB,EACflB,SAAUmB,EACVlB,eAAgBmB,EAChBlB,WAAYmB,EACZlB,aAAcmB,KACXC,GACDR,EAGES,EAAa,CAEjBR,QAASC,GAAe,OAIxBjB,SAAUA,KAEPuB,GAIDpB,GAAiC,eAAjBA,IAClBqB,EAAWrB,aAAeA,GAM5B,MAAMsB,EAAoBhM,EAAIC,KAAKzP,OAAS,GACtCyb,GAAmC,QAAd5G,EAAArF,EAAIC,KAAKxQ,aAAT4V,IAAcA,OAAdA,EAAAA,EAAgB7U,QAAS,GAGpDwP,EAAIC,KAAKzP,MAAQ,IACZwb,KACAD,GAIA/L,EAAIC,KAAKxQ,QACZuQ,EAAIC,KAAKxQ,MAAQ,IAEnBuQ,EAAIC,KAAKxQ,MAAMe,MAAQ,IAClByb,KACAF,GAIA/L,EAAIhF,KAAKF,WACZkF,EAAIhF,KAAKF,SAAW,IAKlBkF,EAAIhF,KAAKF,UAAYlL,MAAMsB,QAAQ8O,EAAIhF,KAAKF,WAC9CkF,EAAIhF,KAAKF,SAASzE,QAAS+L,IAEvBA,GACiB,iBAAVA,GACS,cAAfA,EAAMzS,MACS,aAAfyS,EAAMzS,YAGWS,IAAdgS,EAAM6G,KAAmC,OAAd7G,EAAM6G,IACnC7G,EAAM6G,KAAM,EAEZ7G,EAAM6G,KACe,iBAAd7G,EAAM6G,MACM,IAAnB7G,EAAM6G,IAAIiD,OAEV9J,EAAM6G,IAAIiD,MAAO,MASzB,WAFuB9B,EACE,QADFC,EACrB5a,EAAM0c,yBAAiB,IAAA9B,EAAAA,EAAIrK,EAAIhF,KAAKmR,yBAAiB,IAAA/B,GAAAA,EAChC,CAEhBpK,EAAIhF,KAAKoR,OACZpM,EAAIhF,KAAKoR,KAAO,IAEW,iBAAlBpM,EAAIhF,KAAKoR,MAAsBpM,EAAIhF,KAAKoR,KAAKxd,QACtDoR,EAAIhF,KAAKoR,KAAKxd,MAAQ,IAExB,MAAMyd,EACqB,iBAAlBrM,EAAIhF,KAAKoR,MACXpM,EAAIhF,KAAKoR,KAAKxd,OAAS,IAAIya,MAAM,KAAK/V,OAAOrD,SAC9C,GACDoc,EAAUC,SAAS,6BACtBD,EAAUrP,KAAK,2BACc,iBAAlBgD,EAAIhF,KAAKoR,OAClBpM,EAAIhF,KAAKoR,KAAKxd,MAAQyd,EAAUvG,KAAK,SAK7CpF,OAAO5F,EAAUkF,GAAK,IAAAuM,EAAAlM,EAEpB,MAAMJ,EAAO,IAAKD,EAAIC,MAGJ,SAAdA,EAAKtQ,OACPsQ,EAAKtQ,KAAO,UAId,MACM2a,GADQtK,EAAIhF,KAAKvL,OAAS,IACJ6a,eAAiBtK,EAAIhF,KAAKsP,eAAiB,MACjEkC,EACc,WAAlBlC,GAAgD,mBAAlBA,EAG3BrK,EAAKxQ,QACRwQ,EAAKxQ,MAAQ,IAIf,MAAMgd,EAAcA,KACbxM,EAAKrR,QACRqR,EAAKrR,MAAQ,IAEVgB,MAAMsB,QAAQ+O,EAAKrR,SACtBqR,EAAKrR,MAAQ,CAACqR,EAAKrR,SAKjB8d,EAAqC,QAA5BH,EAAiBlM,QAAjBA,EAAGL,EAAIhF,KAAKvL,iBAAK4Q,SAAdA,EAAgBqM,iBAAS,IAAAH,EAAAA,EAAIvM,EAAIhF,KAAK0R,UACxD,GAAIA,MAAAA,GAA+D,KAAdA,EAAkB,CACrED,IACKxM,EAAKrR,MAAM0d,SAAS,uBACvBrM,EAAKrR,MAAMoO,KAAK,sBAIlB,MAAM2P,EAAYrc,OAAOoc,GAAWnL,OAE/BtB,EAAKxQ,MAAMe,QACdyP,EAAKxQ,MAAMe,MAAQ,IAErByP,EAAKxQ,MAAMe,MAAM,mBAAqBmc,EAGjC1M,EAAKzP,QACRyP,EAAKzP,MAAQ,IAEfyP,EAAKzP,MAAM,mBAAqBmc,EAIlC,GAAIH,EAAY,CAAA,IAAAI,EAAAC,EAAAC,EACd,MAAMC,EAC6CH,QADnCA,EACYC,QADZA,EACA,QADAC,EACd9M,EAAIhF,KAAKvL,aAATqd,IAAcA,OAAdA,EAAAA,EAAgBC,kBAAUF,IAAAA,EAAAA,EAAI7M,EAAIhF,KAAK+R,kBAAUH,IAAAA,EAAAA,EAAI,OAEvDH,IACKxM,EAAKrR,MAAM0d,SAAS,uBACvBrM,EAAKrR,MAAMoO,KAAK,sBAEbiD,EAAKrR,MAAM0d,SAAS,sBACvBrM,EAAKrR,MAAMoO,KAAK,qBAIlB,MAAMgQ,EAAa1c,OAAOyc,GAAYxL,OACjCtB,EAAKxQ,MAAMe,QACdyP,EAAKxQ,MAAMe,MAAQ,IAErByP,EAAKxQ,MAAMe,MAAM,oBAAsBwc,EAElC/M,EAAKzP,QACRyP,EAAKzP,MAAQ,IAEfyP,EAAKzP,MAAM,oBAAsBwc,EAInC,MAAMC,EAAgBnS,GAAY,GAIlC,OAAOkF,EAAIgF,MAAMiE,IACf,CAAExZ,MAAO,CAAEyZ,KAAM,KACjB,CACErZ,QAASA,IAAM,CAACmQ,EAAIgF,MAAMgC,KAAK,SAAU/G,EAAMgN,QCtPxC,CACbve,KAAM,QACNqR,UAAUC,GAAK,IAAAoK,EAAAC,EAEb,MAAM5a,EAAQuQ,EAAIhF,KAAKvL,OAAS,GAC1Byd,EAAYzd,EAAMyd,WAAalN,EAAIhF,KAAKkS,WAAa,aACrDC,EAAO1d,EAAM0d,MAAQnN,EAAIhF,KAAKmS,MAAQ,QACtCzP,EAAQjO,EAAMiO,OAASsC,EAAIhF,KAAK0C,MAChC0O,EAAO3c,EAAM2c,MAAQpM,EAAIhF,KAAKoR,OAAQ,EAGvCpM,EAAIC,KAAKxQ,QACZuQ,EAAIC,KAAKxQ,MAAQ,IAInBuQ,EAAIC,KAAKxQ,MAAMyd,UAAYA,EAC3BlN,EAAIC,KAAKxQ,MAAM0d,KAAOA,EAClBzP,MAAAA,GAAmD,KAAVA,IAC3CsC,EAAIC,KAAKxQ,MAAMiO,MAAQA,GAEzBsC,EAAIC,KAAKxQ,MAAM2c,KAAOA,EAGtB,MACMgB,EAAc,CAClBle,MAAO,UAFa8Q,EAAIhF,KAAKxK,OAAS,IAOnCwP,EAAIC,KAAKzP,QACZwP,EAAIC,KAAKzP,MAAQ,IAEnBwP,EAAIC,KAAKzP,MAAQ,IAAKwP,EAAIC,KAAKzP,SAAU4c,GAEpCpN,EAAIC,KAAKxQ,MAAMe,QAClBwP,EAAIC,KAAKxQ,MAAMe,MAAQ,IAEzBwP,EAAIC,KAAKxQ,MAAMe,MAAQ,IAAKwP,EAAIC,KAAKxQ,MAAMe,SAAU4c,GAGhDpN,EAAIhF,KAAKF,WACZkF,EAAIhF,KAAKF,SAAW,IAKlBkF,EAAIhF,KAAKF,UAAYlL,MAAMsB,QAAQ8O,EAAIhF,KAAKF,WAC9CkF,EAAIhF,KAAKF,SAASzE,QAAS+L,IAEvBA,GACiB,iBAAVA,GACQ,aAAfA,EAAMzS,MACS,YAAfyS,EAAMzS,YAGYS,IAAdgS,EAAM6G,KAAmC,OAAd7G,EAAM6G,IACnC7G,EAAM6G,KAAM,EAEZ7G,EAAM6G,KACe,iBAAd7G,EAAM6G,MACM,IAAnB7G,EAAM6G,IAAIiD,OAEV9J,EAAM6G,IAAIiD,MAAO,MASzB,WAFuB9B,EACE,QADFC,EACrB5a,EAAM0c,yBAAiB,IAAA9B,EAAAA,EAAIrK,EAAIhF,KAAKmR,yBAAiB,IAAA/B,GAAAA,EAChC,CAEhBpK,EAAIhF,KAAKoR,OACZpM,EAAIhF,KAAKoR,KAAO,IAEW,iBAAlBpM,EAAIhF,KAAKoR,MAAsBpM,EAAIhF,KAAKoR,KAAKxd,QACtDoR,EAAIhF,KAAKoR,KAAKxd,MAAQ,IAExB,MAAMyd,EAAqC,iBAAlBrM,EAAIhF,KAAKoR,MAC7BpM,EAAIhF,KAAKoR,KAAKxd,OAAS,IAAIya,MAAM,KAAK/V,OAAOrD,SAC9C,GACCoc,EAAUC,SAAS,6BACtBD,EAAUrP,KAAK,2BACc,iBAAlBgD,EAAIhF,KAAKoR,OAClBpM,EAAIhF,KAAKoR,KAAKxd,MAAQyd,EAAUvG,KAAK,SAK7CpF,OAAO5F,EAAUkF,GAEf,MAAMC,EAAO,IAAKD,EAAIC,OAGRD,EAAIhF,KAAKvL,OAAS,IACV4d,SAAWrN,EAAIhF,KAAKqS,UAAW,EAKnDpN,EAAKtQ,KAAO,kBAGM,UAAdsQ,EAAKtQ,OACPsQ,EAAKtQ,KAAO,WAKhB,MAAMsd,EAAgBnS,GAAY,GAIlC,OAAOkF,EAAIgF,MAAMiE,IACf,CAAExZ,MAAO,CAAEyZ,KAAM,KACjB,CACErZ,QAASA,IAAM,CAACmQ,EAAIgF,MAAMgC,KAAK/G,EAAKtQ,KAAMsQ,EAAMgN,QCrHzC,CACbve,KAAM,OACNqR,UAAUC,GAAK,IAAAoK,EAAAwC,EAAAU,EAAAjN,EAAAgF,EAAAkI,EAAAxH,EAAAyH,EAAAxH,EAERhG,EAAIhF,KAAKoR,OACZpM,EAAIhF,KAAKoR,KAAO,IAElBpM,EAAIhF,KAAKoR,KAAK9X,OAAQ,EAEtB,MAAM7E,EAAQuQ,EAAIC,KAAKxQ,OAAS,GAG1Bge,EAGyB,QAHZrD,EAEY,QAFZwC,EACKU,QADLA,EACjBtN,EAAIhF,KAAKyS,qBAAaH,IAAAA,EAAAA,EACRjN,QADQA,EACtBL,EAAIhF,KAAKvL,iBAAK4Q,SAAdA,EAAgBoN,qBAAa,IAAAb,EAAAA,EACf,QADevH,EAC7BrF,EAAIC,KAAKxQ,aAAK,IAAA4V,OAAA,EAAdA,EAAgBoI,qBAAa,IAAArD,GAAAA,EAQM,IAAAsD,EAAAC,EAAArI,EAAAwH,GAJhCW,IACHzN,EAAIhF,KAAKF,SAAW,IAGjBoF,EAAYzQ,EAAO,eACtBA,EAAMme,SACgD,QADxCF,EACY,QADZC,EACE,QADFrI,EACZtF,EAAIC,KAAKxQ,aAAT6V,IAAcA,OAAdA,EAAAA,EAAgBsI,gBAAQD,IAAAA,EAAAA,EAAkB,QAAlBb,EAAI9M,EAAIhF,KAAKvL,aAATqd,IAAcA,OAAdA,EAAAA,EAAgBc,gBAAQF,IAAAA,GAAAA,GAIxD,MAAMG,EACJ7N,EAAIhF,KAAKF,UACTlL,MAAMsB,QAAQ8O,EAAIhF,KAAKF,WACvBkF,EAAIhF,KAAKF,SAAS/I,OAAS,GACxB0b,IAAkBI,GAAepe,EAAMme,SAM5C,MAAMrI,EACJvF,EAAIhF,KAAKuK,YACKgI,QADIA,EAClBvN,EAAIhF,KAAKvL,aAAT8d,IAAcA,OAAdA,EAAAA,EAAgBhI,aACFQ,QADWA,EACzB/F,EAAIC,KAAKxQ,aAATsW,IAAcA,OAAdA,EAAAA,EAAgBR,WAClB,IAAIW,EACFlG,EAAIhF,KAAKkL,WAA0BsH,QAAlBA,EAAIxN,EAAIhF,KAAKvL,aAAT+d,IAAcA,OAAdA,EAAAA,EAAgBtH,YAA0BF,QAAlBA,EAAIhG,EAAIC,KAAKxQ,aAATuW,IAAcA,OAAdA,EAAAA,EAAgBE,UAYnE,GATKA,IAEDA,EADEX,EACS,QAEA,UAKE,UAAbW,GAAwBX,EAAW,CACrC,MAAMY,EAAiB,CACrBC,KAAMb,EACNc,GAAI,iBACJC,QAAQ,EACRC,KAAM,IACN/P,OAAO,GAIJwJ,EAAIhF,KAAKwL,SACZxG,EAAIhF,KAAKwL,OAAS,IAEfxG,EAAIhF,KAAKwL,OAAOxF,WACnBhB,EAAIhF,KAAKwL,OAAOxF,SAAW,IAGdhB,EAAIhF,KAAKwL,OAAOxF,SAASzN,KACrClC,GAASA,EAAK+U,OAASb,GAAyB,mBAAZlU,EAAKgV,MAG1CrG,EAAIhF,KAAKwL,OAAOxF,SAAShE,KAAKmJ,GAE1BnG,EAAIkB,SAAWlB,EAAIkB,QAAQsF,QAC7BxG,EAAIkB,QAAQsF,OAAOxG,EAAK,WAM1ByN,IAEGzN,EAAIhF,KAAKF,WACZkF,EAAIhF,KAAKF,SAAW,IAIlBkF,EAAIhF,KAAKF,UAAYlL,MAAMsB,QAAQ8O,EAAIhF,KAAKF,WAC9CkF,EAAIhF,KAAKF,SAASzE,QAAS+L,IAEvBA,GACiB,iBAAVA,GACQ,aAAfA,EAAMzS,MACS,YAAfyS,EAAMzS,YAGYS,IAAdgS,EAAM6G,KAAmC,OAAd7G,EAAM6G,IACnC7G,EAAM6G,KAAM,EAEZ7G,EAAM6G,KACe,iBAAd7G,EAAM6G,MACM,IAAnB7G,EAAM6G,IAAIiD,OAEV9J,EAAM6G,IAAIiD,MAAO,QAO7BxL,OAAO5F,EAAUkF,GAAK,IAAA8N,EAAA7H,EAAA8H,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAEpB,MACMX,GADQ5N,EAAIC,KAAKxQ,OAAS,IACTme,WAAY,EAG9B5N,EAAIC,KAAKxQ,QACZuQ,EAAIC,KAAKxQ,MAAQ,IAInBuQ,EAAIC,KAAKxQ,MAAMme,SAAWA,EAG1B,MAAMY,EAAMxO,EAAIhF,KAAKwT,MAAqBV,QAAlBA,EAAI9N,EAAIhF,KAAKvL,aAATqe,IAAcA,OAAdA,EAAAA,EAAgBU,OAAqBvI,QAAlBA,EAAIjG,EAAIC,KAAKxQ,aAATwW,IAAcA,OAAdA,EAAAA,EAAgBuI,KAC/DA,IACFxO,EAAIC,KAAKxQ,MAAM+e,IAAMA,GAIvB,MAAMC,EACJzO,EAAIhF,KAAKyT,QAAuBV,QAAlBA,EAAI/N,EAAIhF,KAAKvL,aAATse,IAAcA,OAAdA,EAAAA,EAAgBU,SAAuBT,QAAlBA,EAAIhO,EAAIC,KAAKxQ,aAATue,IAAcA,OAAdA,EAAAA,EAAgBS,OAChD,MAATA,IACFzO,EAAIC,KAAKxQ,MAAMgf,MAAQA,GAIzB,MAAMtB,EAAOnN,EAAIhF,KAAKmS,OAAsBc,QAAlBA,EAAIjO,EAAIhF,KAAKvL,aAATwe,IAAcA,OAAdA,EAAAA,EAAgBd,QAAsBe,QAAlBA,EAAIlO,EAAIC,KAAKxQ,aAATye,IAAcA,OAAdA,EAAAA,EAAgBf,MAClEA,IACFnN,EAAIC,KAAKxQ,MAAM0d,KAAOA,GAIF,SAAlBnN,EAAIC,KAAKtQ,OACXqQ,EAAIC,KAAKtQ,KAAO,UAWlB,KAJ+B,QAHZwe,EAEY,QAFZC,EACKC,QADLA,EACjBrO,EAAIhF,KAAKyS,qBAAaY,IAAAA,EAAAA,EACRC,QADQA,EACtBtO,EAAIhF,KAAKvL,iBAAK6e,SAAdA,EAAgBb,qBAAa,IAAAW,EAAAA,EACf,QADeG,EAC7BvO,EAAIC,KAAKxQ,aAAK,IAAA8e,OAAA,EAAdA,EAAgBd,qBAAa,IAAAU,GAAAA,GAK7B,OAAOnO,EAAIa,QAAQC,cAAcd,OAAK5P,GAKxC,MAAM6c,EACJnS,GAAYlL,MAAMsB,QAAQ4J,GAAYA,EAAWA,GAAY,GAI/D,OAAOkF,EAAIgF,MAAMiE,IACf,CAAExZ,MAAO,CAAEyZ,KAAM,KACjB,CACErZ,QAASA,IAAM,CAACmQ,EAAIgF,MAAMgC,KAAK,SAAUhH,EAAIC,KAAMgN,QCjL5C,CACbve,KAAM,MACNqR,UAAUC,GAEHA,EAAIhF,KAAKF,WACZkF,EAAIhF,KAAKF,SAAW,IAKlBkF,EAAIhF,KAAKF,UAAYlL,MAAMsB,QAAQ8O,EAAIhF,KAAKF,WAC9CkF,EAAIhF,KAAKF,SAASzE,QAAS+L,IAEvBA,GACiB,iBAAVA,GACQ,aAAfA,EAAMzS,MACS,YAAfyS,EAAMzS,YAGYS,IAAdgS,EAAM6G,KAAmC,OAAd7G,EAAM6G,IACnC7G,EAAM6G,KAAM,EAEZ7G,EAAM6G,KACe,iBAAd7G,EAAM6G,MACM,IAAnB7G,EAAM6G,IAAIiD,OAEV9J,EAAM6G,IAAIiD,MAAO,OAM3BxL,OAAO5F,EAAUkF,GAEf,MAAMC,EAAO,IAAKD,EAAIC,MAGJ,QAAdA,EAAKtQ,OACPsQ,EAAKtQ,KAAO,OAId,MAAMsd,EAAgBnS,GAAY,GAclC,OAVKmF,EAAKxQ,QACRwQ,EAAKxQ,MAAQ,IAEVwQ,EAAKxQ,MAAMe,QACdyP,EAAKxQ,MAAMe,MAAQ,IAMdwP,EAAIgF,MAAMgC,KAAK,MAAO/G,EAAMgN,KCxDxB,CACbve,KAAM,SAENqR,UAAUC,GACR,MAAMvQ,EAAQuQ,EAAIC,KAAKxQ,OAAS,GAG1BA,EAAM6I,SAA6B,KAAlB7I,EAAM6I,UAAmB7I,EAAMif,cACpDjf,EAAM6I,QAAU7I,EAAMif,mBACfjf,EAAMif,cAGjBhO,OAAMA,CAAC5F,EAAUkF,IAERA,EAAIa,QAAQC,cAAcd,EAAKlF,ICd3B,CACbpM,KAAM,QACNqR,UAAUC,GAEHA,EAAIhF,KAAKF,WACZkF,EAAIhF,KAAKF,SAAW,IAKlBkF,EAAIhF,KAAKF,UAAYlL,MAAMsB,QAAQ8O,EAAIhF,KAAKF,WAC9CkF,EAAIhF,KAAKF,SAASzE,QAAS+L,IAEvBA,GACiB,iBAAVA,GACQ,aAAfA,EAAMzS,MACS,YAAfyS,EAAMzS,YAGYS,IAAdgS,EAAM6G,KAAmC,OAAd7G,EAAM6G,IACnC7G,EAAM6G,KAAM,EAEZ7G,EAAM6G,KACe,iBAAd7G,EAAM6G,MACM,IAAnB7G,EAAM6G,IAAIiD,OAEV9J,EAAM6G,IAAIiD,MAAO,OAM3BxL,OAAMA,CAAC5F,EAAUkF,IAERA,EAAIa,QAAQC,cAAcd,EAAKlF,IXlB3B,CACbpM,KAAM,WACNigB,KAAK3O,GAAK,IAAA4O,EAAAC,EAER,MAAM7T,EAAOgF,EAAIhF,KAGjB,WACE4T,EAAA5T,EAAKwL,cAAM,IAAAoI,GAAXA,EAAaE,eAAKD,EAClB7T,EAAKvL,aAAK,IAAAof,GAAVA,EAAYE,YACqB,iBAA1B/T,EAAKvL,MAAMsf,iBACgB3e,IAAlC4K,EAAKvL,MAAMsf,WAAWC,QACtB,CACA,MAAMC,EAAgBjU,EAAKwL,OAAOsI,MAClC,GAA6B,iBAAlBG,EAA4B,CACrC,MAAMC,EAA2BD,EAAcE,YAK/C,KAHED,IACqD,IAArDA,EAAyBE,yBAEJ,CAAA,IAAAC,EAAAC,EAAAC,EAErB,MAAMC,GAA0B,QAAVH,EAAArU,EAAKvL,aAAL4f,IAAUA,OAAVA,EAAAA,EAAYI,sBAAuB,OACnDC,GACM,QAAVJ,EAAAtU,EAAKvL,aAAL6f,IAAUA,OAAVA,EAAAA,EAAYK,0BAA2B,WACnCC,GAAsB,QAAVL,EAAAvU,EAAKvL,aAAL8f,IAAUA,OAAVA,EAAAA,EAAYM,sBAAuB,QAC/CC,EAAY9U,EAElBiU,EAAcE,YAAc,CAACY,GAAU/W,IAAAA,MAAU,IAAAgX,EAC/C,MAAMC,EAAoBH,MAAAA,GAAgBE,QAAPA,EAATF,EAAWrgB,aAAXugB,IAAgBA,OAAhBA,EAAAA,EAAkBjB,WAC5C,GAAIkB,GAAkD,iBAAtBA,EAAgC,CAC9D,MAAMC,EAAcD,EAAkBjB,SAAW,EAC3CmB,EAAkBF,EAAkBG,UAAY,GAEpC,UAAdR,EACFG,EAAOM,MAAQ,IACTN,EAAOM,OAAS,GACpB9e,CAACie,GAAgBU,EACjB3e,CAACme,GAAoBS,GAGvBJ,EAAOja,KAAO,IACRia,EAAOja,MAAQ,GACnBvE,CAACie,GAAgBU,EACjB3e,CAACme,GAAoBS,GAM3B,GACEjB,GACoC,mBAA7BA,EAEP,IACE,MAAMzX,EAASyX,EAAyBa,EAAQ,CAAE/W,IAAAA,IAClD,OAAIvB,GAAiC,mBAAhBA,EAAOiL,KACnBjL,EAAOyB,MAAOoX,IACnB/Y,QAAQD,MACN,oCACAgZ,GAEK3M,QAAQC,YAGZnM,EACP,MAAO6Y,GACP/Y,QAAQD,MAAM,oCAAqCgZ,KAKzDrB,EAAcE,YAAYC,yBAA0B,MAK5DrP,UAAUC,GAAK,IAAAuQ,EAAAC,EAAAC,EAAAC,EAAAC,EACb,MAAMlhB,EAAQuQ,EAAIC,KAAKxQ,OAAS,GAC1BuL,EAAOgF,EAAIhF,KACLgF,EAAIhH,IAGhB,IAAIgB,GAAoB,QAAVuW,EAAAvV,EAAKvL,aAAL8gB,IAAUA,OAAVA,EAAAA,EAAYvW,UAAW,GAErC,GAAuB,iBAAZA,EACT,IACE,MAAM4W,EAASzZ,KAAKC,MAAM4C,GACtBpK,MAAMsB,QAAQ0f,KAChB5W,EAAU4W,GAEZ,MAAO/Y,GACPN,QAAQC,KAAK,gCAAiCK,GAC9CmC,EAAU,GAITpK,MAAMsB,QAAQ8I,KACjBA,EAAU,IAGZ,MAAM6W,EAAmB7W,EACtB1G,OAAQ2V,IAASA,IAAQA,EAAI/D,QAC7B9T,IAAK6X,IAEJ,MAAMxL,EAAS,IAAKwL,GAMpB,QACmB7Y,IAAjBqN,EAAOvO,OACU,OAAjBuO,EAAOvO,OACU,KAAjBuO,EAAOvO,OAEqB,iBAAjBuO,EAAOvO,MAAoB,CAEpC,MAAM4hB,EAAW3gB,OAAOsN,EAAOvO,QAE5B6hB,MAAMD,IACPE,SAASF,IACTrT,EAAOvO,MAAMqS,SAAWjR,OAAOwgB,KAE/BrT,EAAOvO,MAAQ4hB,GAQrB,GACErT,EAAOwT,UACP,CAAC,QAAS,SAAU,SAAS3E,SAAS7O,EAAOwT,UAC7C,CACA,MAAMA,EAAWxT,EAAOwT,SAClBC,EAAYzT,EAAOyT,UACnBC,EAAY1T,EAAO0T,WAAa,GAGtC1T,EAAO2T,aAAe,EAAGjM,KAAAA,EAAMkM,OAAAA,EAAQhd,MAAAA,MACrC,MAAMid,EAAYD,GAAUH,EAAYG,EAAOH,GAAa/L,EAE5D,IAAIrV,EAAU,GACd,MAAMyhB,EAAc9T,EAAO8T,YAY3B,OAXI3hB,MAAMsB,QAAQqgB,GAEhBzhB,EAAUyhB,EACDA,GAAsC,iBAAhBA,IAE/BzhB,EAAUW,OAAO4L,KAAKkV,GAAangB,IAAKK,IAAW,CACjDA,MAAAA,EACAH,MAAOigB,EAAY9f,OAIN,UAAbwf,EAEKO,EAAE,UAAW,CAClBlgB,MAAOggB,EACPG,iBAAmB9f,IAEb0f,GAAUH,IACZG,EAAOH,GAAavf,EAEhBqO,EAAIhH,KAAOgH,EAAIhH,IAAIoC,MAAQJ,EAAKtF,QAClCsK,EAAIhH,IAAIoC,KAAKJ,EAAKtF,OAASjG,EAAMiiB,cAIvCrhB,YAAa8gB,EAAU9gB,aAAe,GACtCE,SAAU4gB,EAAU5gB,WAAY,EAChC4c,KAAMgE,EAAUhE,MAAQ,WACrBgE,IAEiB,WAAbF,EAEFO,EACL,WACA,CACElgB,MAAOggB,EACPG,iBAAmB9f,IAEb0f,GAAUH,IACZG,EAAOH,GAAavf,EAEhBqO,EAAIhH,KAAOgH,EAAIhH,IAAIoC,MAAQJ,EAAKtF,QAClCsK,EAAIhH,IAAIoC,KAAKJ,EAAKtF,OAASjG,EAAMiiB,cAIvCrhB,YAAa8gB,EAAU9gB,aAAe,GACtCE,SAAU4gB,EAAU5gB,WAAY,EAChC4c,KAAMgE,EAAUhE,MAAQ,WACrBgE,GAEL,CACEthB,QAASA,IACPC,EAAQsB,IAAK0B,GACJ0e,EAAE,kBAAmB,CAC1Btd,IAAKpB,EAAIxB,MACTA,MAAOwB,EAAIxB,MACXG,MAAOqB,EAAIrB,WAKC,UAAbwf,EAEFO,EACL,gBACA,CACE9hB,WAAY4hB,EACZ3X,sBAAwBhI,IAElB0f,GAAUH,IACZG,EAAOH,GAAavf,EAEhBqO,EAAIhH,KAAOgH,EAAIhH,IAAIoC,MAAQJ,EAAKtF,QAClCsK,EAAIhH,IAAIoC,KAAKJ,EAAKtF,OAASjG,EAAMiiB,cAIvCnhB,SAAU4gB,EAAU5gB,WAAY,EAChC4c,KAAMgE,EAAUhE,MAAQ,WACrBgE,GAEL,CACEthB,QAASA,IACPC,EAAQsB,IAAK0B,GACJ0e,EACL,UACA,CACEtd,IAAKpB,EAAIxB,MACTA,MAAOwB,EAAIxB,OAEb,CACEzB,QAASA,IAAMiD,EAAIrB,OAASqB,EAAIxB,WASvC6T,GAKX,OAAO1H,IAOX,GAHAhO,EAAMuK,QAAU6W,GAGX3Q,EAAYzQ,EAAO,cAAe,CAAA,IAAAkiB,EAAAC,EACrC,IAAIF,EAAa1W,EAAK1J,gBAAKqgB,EAAI3W,EAAKvL,aAAK,IAAAkiB,OAAA,EAAVA,EAAYD,aAAc,GAEzD,GAA0B,iBAAfA,IAAuCE,QAAZA,EAAC5W,EAAKwL,kBAAMoL,IAAXA,EAAa9C,OAClD,IACE,MAAM8B,EAASzZ,KAAKC,MAAMsa,GACtB9hB,MAAMsB,QAAQ0f,KAChBc,EAAad,GAEf,MAAO/Y,GACPN,QAAQC,KAAK,mCAAoCK,GACjD6Z,EAAa,GAIZ9hB,MAAMsB,QAAQwgB,KACjBA,EAAa,IAEfjiB,EAAMiiB,WAAaA,EAIrB,MAAMpR,EAAYN,EAAIO,WAAW,SAC3BsR,EAAYvR,IAAmC,IAAtBA,EAAUE,QAGN,IAAAsR,EAA/B5R,EAAYzQ,EAAO,WACrBA,EAAM+Q,aACoBpQ,KAAd,QAAV0hB,EAAA9W,EAAKvL,aAAK,IAAAqiB,OAAA,EAAVA,EAAYtR,SAAwBxF,EAAKvL,MAAM+Q,QAAUqR,EAE3DpiB,EAAM+Q,QAAUqR,EAIlB,MAAME,EAA6B,QAAbvB,EAAGxV,EAAKvL,aAAK,IAAA+gB,OAAA,EAAVA,EAAYzB,WAGrC,IAAK7O,EAAYzQ,EAAO,cACtB,IAAyB,IAArBsiB,EACFtiB,EAAMsf,YAAa,OACd,GAAIgD,GAAgD,iBAArBA,EAA+B,CACnE,MAAMhD,EAAa,CACjBC,QAAS+C,EAAiB/C,SAAW,EACrCoB,SAAU2B,EAAiB3B,UAAY,GACvC7d,MAAOwf,EAAiBxf,OAAS,EACjCyf,iBAAsD,IAArCD,EAAiBC,gBAClCC,gBAAiBF,EAAiBE,kBAAmB,EACrDC,UAAWH,EAAiBG,aACzBH,GAGLtiB,EAAMsf,WAAaA,OAGnBtf,EAAMsf,YAAa,EAKvB,GACa0B,QAAXA,EAAAzV,EAAKwL,cAALiK,IAAWA,GAAXA,EAAa3B,OACbiD,GAC4B,iBAArBA,QACsB3hB,IAA7B2hB,EAAiB/C,QACjB,CAAA,IAAAmD,EAAAC,EAAAC,EAAAC,EAAAC,EAEA,MAAM/C,GAA0B,QAAV2C,EAAAnX,EAAKvL,aAAL0iB,IAAUA,OAAVA,EAAAA,EAAY1C,sBAAuB,OACnDC,GACM,QAAV0C,EAAApX,EAAKvL,aAAL2iB,IAAUA,OAAVA,EAAAA,EAAYzC,0BAA2B,WACnCC,GAAsByC,QAAVA,EAAArX,EAAKvL,iBAAK4iB,SAAVA,EAAYxC,sBAAuB,QAClB,QAAVyC,EAAAtX,EAAKvL,aAAL6iB,IAAUA,GAAVA,EAAYE,2BAEzB,QAAVD,EAAAvX,EAAKvL,aAAL8iB,IAAUA,GAAVA,EAAYE,4BAGehjB,EAAMsf,WAGnC,MAAME,EAAgBjU,EAAKwL,OAAOsI,MAElC,GAA6B,iBAAlBG,EAA4B,CAErC,MAAMyD,EAAiB9C,EACjB+C,EAAqBnD,EACrBoD,EAAyBlD,EACzBR,EAA2BD,EAAcE,YAEzCW,EAAY9U,EAIhBkU,IACqD,IAArDA,EAAyBE,0BAKzBH,EAAcE,YAAc,CAACY,GAAU/W,IAAAA,MAAU,IAAA6Z,EAE/C,MAAM5C,EAAoBH,MAAAA,GAAgB+C,QAAPA,EAAT/C,EAAWrgB,aAAXojB,IAAgBA,OAAhBA,EAAAA,EAAkB9D,WAE5C,GAAIkB,GAAkD,iBAAtBA,EAAgC,CAC9D,MAAMC,EAAcD,EAAkBjB,SAAW,EAC3CmB,EAAkBF,EAAkBG,UAAY,GAG/B,UAAnBsC,EAEF3C,EAAOM,MAAQ,IACTN,EAAOM,OAAS,GACpB9e,CAACohB,GAAqBzC,EACtB3e,CAACqhB,GAAyBzC,GAI5BJ,EAAOja,KAAO,IACRia,EAAOja,MAAQ,GACnBvE,CAACohB,GAAqBzC,EACtB3e,CAACqhB,GAAyBzC,QAI9B5Y,QAAQC,KAAK,8BAA+B,CAC1CyY,kBAAAA,EACAtgB,YAAasgB,IAOjB,GACEf,GACoC,mBAA7BA,EAEP,IACE,MAAMzX,EAASyX,EAAyBa,EAAQ,CAAE/W,IAAAA,IAElD,OAAIvB,GAAiC,mBAAhBA,EAAOiL,KACnBjL,EAAOyB,MAAOoX,IACnB/Y,QAAQD,MACN,oCACAgZ,GAGK3M,QAAQC,YAGZnM,EACP,MAAO6Y,GACP/Y,QAAQD,MAAM,oCAAqCgZ,KAOzDrB,EAAcE,YAAYC,yBAA0B,QAGtD7X,QAAQC,KAAK,6BAA8B,CACzC7H,YAAasf,EACbA,cAAAA,IAKJ,MAAM6D,EAAgBrjB,EAAMsf,YAAcgD,EACtCe,GAA0C,iBAAlBA,IAErBA,EAAcC,uBACZD,EAAclZ,WACjBkZ,EAAclZ,SAAW,CAACoZ,EAAM7F,KAAS,IAAA8F,EAEzBA,QAAdA,EAAIjY,EAAKvL,aAALwjB,IAAUA,GAAVA,EAAYlE,aACd/T,EAAKvL,MAAMsf,WAAWC,QAAUgE,EAChChY,EAAKvL,MAAMsf,WAAWqB,SAAWjD,GAGnCnN,EAAIhH,IAAIwJ,KAAKxH,GACbiI,WAAW,KACTjD,EAAIhH,IAAIyJ,WACP,KAIFqQ,EAAcI,mBACjBJ,EAAcI,iBAAmB,CAAClE,EAAS7B,KAAS,IAAAgG,EACpCA,QAAdA,EAAInY,EAAKvL,aAAL0jB,IAAUA,GAAVA,EAAYpE,aACd/T,EAAKvL,MAAMsf,WAAWC,QAAU,EAChChU,EAAKvL,MAAMsf,WAAWqB,SAAWjD,GAGnCnN,EAAIhH,IAAIwJ,KAAKxH,GACbiI,WAAW,KACTjD,EAAIhH,IAAIyJ,WACP,KAKPqQ,EAAcC,sBAAuB,EAGhCtjB,EAAMsf,aACTtf,EAAMsf,WAAa+D,KAO3B,GAAepC,QAAXA,EAAA1V,EAAKwL,cAALkK,IAAWA,GAAXA,EAAa5B,OAAmB,QAAd6B,EAAI3V,EAAKvL,aAALkhB,IAAUA,GAAVA,EAAY5B,WAAY,CAChD,MAAMzO,EAAYN,EAAIO,WAAW,SACjC,GAAID,GAAaA,EAAUhP,MAAO,CAAA,IAAA8hB,EAAAC,EAChC,MAAMC,GACM,QAAVF,EAAApY,EAAKvL,aAAL2jB,IAAUA,OAAVA,EAAAA,EAAYZ,6BAA8B,OACtCe,GACM,QAAVF,EAAArY,EAAKvL,aAAL4jB,IAAUA,OAAVA,EAAAA,EAAYZ,8BAA+B,QAE7C,IAEE,MAAMe,EAAW9N,GAASpF,EAAUhP,MAAOgiB,GACvC1jB,MAAMsB,QAAQsiB,KAChB/jB,EAAMiiB,WAAa8B,EACnBxY,EAAK1J,MAAQkiB,EACbxY,EAAKvL,MAAMiiB,WAAa8B,GAI1B,MAAMjhB,EAAQmT,GAASpF,EAAUhP,MAAOiiB,GAErB,iBAAVhhB,GACPyI,EAAKvL,MAAMsf,YACsB,iBAA1B/T,EAAKvL,MAAMsf,aAElB/T,EAAKvL,MAAMsf,WAAWxc,MAAQA,EAC1B9C,EAAMsf,YAA0C,iBAArBtf,EAAMsf,aACnCtf,EAAMsf,WAAWxc,MAAQA,IAG7B,MAAOsF,GACPN,QAAQC,KAAK,iCAAkCK,KAMjDqI,EAAYlF,EAAKvL,MAAO,cAC1BA,EAAMoB,SAAWmK,EAAKvL,MAAMoB,UAE1BqP,EAAYlF,EAAKvL,MAAO,UAC1BA,EAAM0d,KAAOnS,EAAKvL,MAAM0d,MAEtBjN,EAAYlF,EAAKvL,MAAO,YAC1BA,EAAMgkB,OAASzY,EAAKvL,MAAMgkB,QAExBvT,EAAYlF,EAAKvL,MAAO,YAC1BA,EAAMikB,OAAS1Y,EAAKvL,MAAMikB,QAAU,MAElCxT,EAAYlF,EAAKvL,MAAO,kBAC1BA,EAAMkkB,aAAe3Y,EAAKvL,MAAMkkB,cAE9BzT,EAAYlF,EAAKvL,MAAO,YAC1BA,EAAMmkB,OAAS5Y,EAAKvL,MAAMmkB,QAExB1T,EAAYlF,EAAKvL,MAAO,aAC1BA,EAAMokB,QAAU7Y,EAAKvL,MAAMokB,UAG/BnT,OAAMA,CAAC5F,EAAUkF,IAERA,EAAIa,QAAQC,cAAcd,EAAKlF,KYliB1C,IAAegZ,GAAA,CACbC,QAASC,WACTC,QAASD,WACTE,OAAQF,UACRG,KAAMH,QACNI,OAAQJ,UACRK,KAAML,QACN7U,OAAQ,WACR4B,SAAUiT,YACVtL,WAAYsL,cACZM,gBAAiBN,mBACjB3P,WAAY2P,cACZO,YAAaP,eACbQ,OAAQR,UACR5T,OAAQ4T,UACRnU,SAAUmU,iBACV7T,MAAO6T,cACP/M,MAAO+M,SACPS,YAAaT,eACbU,WAAYV,cACZ5M,OAAQ4M,eACRW,cAAeX,iBACf7M,SAAU6M,YACVY,SAAUZ,YACV5Y,KAAM4Y,QACN5U,MAAO,UACP6J,IAAK+K,OACLjL,IAAKiL,OACLa,KAAMb,QACNc,MAAOd,SACPe,gBAAiBf,gBACjBgB,KAAMhB,QACNrL,KAAMqL,QACNiB,aAAcjB,gBACdkB,SAAUlB,YACV3U,MAAO,UACP8V,MAAO,UACP7V,QAAS,YACT8V,OAAQ,YACRC,MAAOrB,SACPsB,OAAQtB,SACRuB,MAAOvB,SACPwB,OAAQxB,SACRyB,MAAOzB,SACP0B,KAAM1B,QACN2B,MAAO3B,QACP4B,KAAM5B,QACN6B,SAAU7B,SACV8B,cAAe9B,UCxCjB,SAAS+B,GAAKtmB,EAAOf,GACdwR,EAAYzQ,EAAOf,IACpBwQ,EAAG5O,OAAOb,EAAMf,MAClBe,EAAMf,GAAQ,CAAE6C,CAAC7C,GAAOe,EAAMf,GAAOwd,MAAM,IAI/C,SAAS8J,GAAQrkB,GACf,OAAe,IAARA,EAST,SAASskB,GAASjb,GAChB,MAAMkb,EAAQ,IAAKlb,GAEnB,cADOkb,EAAMpb,SACNob,EAGT,IAAeC,GAAA,CACbC,WACE,MAAMhb,EAAOjK,KAAKiK,OAClB,OAAIA,EACKA,EAAKgb,WAEL,IAAIzS,QAASxH,GAAMA,MAG9BlD,cAAcvD,GACZ,MAAM0F,EAAOjK,KAAKiK,OAClB,OAAIA,EACKA,EAAKib,eAAe3gB,GAEpB,IAAIiO,QAASxH,GAAMA,MAG9Bma,mBAAmBtW,GACjB,MAAMuW,EAAQplB,KAAKmX,GAAGkO,KAAKxW,EAAIyW,SAC3BF,GACFA,EAAMG,iBAGVC,YAAY7mB,IACT,CAAC,YAAa,WAAY,MAAO,OAAQ,OAAQ,MAAO,SAASuG,QAC/D3H,KArCP,SAAkBoE,EAAKpE,GACjBwR,EAAYpN,EAAKpE,KAAUwQ,EAAGzO,OAAOqC,EAAIpE,MAC3CoE,EAAIpE,GAAQ,CAAEwd,OAAQpZ,EAAIpE,KAoCtBkoB,CAAS9mB,EAASpB,KAGfoB,GAETmmB,SAAQA,EAAChW,KAAEA,MACT8V,GAAK9V,EAAM,SACX8V,GAAK9V,EAAM,QACJA,GAETF,UAAUC,GAAK,IAAAK,EAAAgF,EACb,MAAMwR,EAAM,CACVC,KAAM,CACJnnB,KAAM,UACNonB,UAAW,UACX5C,KAAM,0BAER7f,MAAO,GACP2U,IAAK,CAAEC,KAAM,IACbkD,KAAM,IAEP,CAAC,OAAQ,OAAQ,MAAO,SAAS/V,QAAS3H,IACzCsR,EAAIC,KAAKvR,GAAQsoB,EACf,CAAC7lB,KAAKrB,QAAQpB,IAAS,GAAIsR,EAAIC,KAAKvR,IAAS,IAC7CmoB,EAAInoB,MASR,MAAMuoB,GAAyC,IAAzB9lB,KAAK+P,QAAQtF,QAE7Bsb,GACyB,KAAf7W,QAAdA,EAAAL,EAAIhF,KAAKvL,aAAT4Q,IAAcA,OAAdA,EAAAA,EAAgBI,YAAkD,KAAf,QAAd4E,EAAArF,EAAIC,KAAKxQ,aAAT4V,IAAcA,OAAdA,EAAAA,EAAgB5E,UAG1B,IAAA6E,GAFG2R,GAAiBC,KAGzB,WAAlBlX,EAAIhF,KAAKrL,KACPqQ,EAAIC,KAAKxQ,QACXuQ,EAAIC,KAAKxQ,MAAMc,UAAW,GAED,aAAlByP,EAAIhF,KAAKrL,KAGdqQ,EAAIC,KAAKxQ,QACXuQ,EAAIC,KAAKxQ,MAAMgR,UAAW,SAEnBT,EAAIC,KAAKxQ,MAAMY,mBAEf2P,EAAIC,KAAKxQ,MAAMR,QAGN,UAAlB+Q,EAAIhF,KAAKrL,MACgB,cAAX2V,QAAdA,EAAAtF,EAAIC,KAAKxQ,aAAT6V,IAAcA,OAAdA,EAAAA,EAAgB3V,MAIZqQ,EAAIC,KAAKxQ,QACXuQ,EAAIC,KAAKxQ,MAAMgR,UAAW,EAE1BT,EAAIC,KAAKxQ,MAAM0nB,UAAW,SAEnBnX,EAAIC,KAAKxQ,MAAM2nB,YAEfpX,EAAIC,KAAKxQ,MAAMY,YAEtB2P,EAAIC,KAAKxQ,MAAM4nB,WAAY,GAEF,WAAlBrX,EAAIhF,KAAKrL,KAKdqQ,EAAIC,KAAKxQ,QACXuQ,EAAIC,KAAKxQ,MAAMc,UAAW,SAEnByP,EAAIC,KAAKxQ,MAAMY,aAOG,UAAlB2P,EAAIhF,KAAKrL,KAGdqQ,EAAIC,KAAKxQ,OAASynB,GACpBlX,EAAIC,KAAKxQ,MAAMgR,UAAW,SAEnBT,EAAIC,KAAKxQ,MAAMY,YAEtB2P,EAAIC,KAAKxQ,MAAM4nB,WAAY,GAClBrX,EAAIC,KAAKxQ,OAASwnB,WAEpBjX,EAAIC,KAAKxQ,MAAMY,YAEtB2P,EAAIC,KAAKxQ,MAAM4nB,WAAY,GAGX,eAAlBrX,EAAIhF,KAAKrL,MACS,eAAlBqQ,EAAIhF,KAAKrL,MACS,oBAAlBqQ,EAAIhF,KAAKrL,MACS,gBAAlBqQ,EAAIhF,KAAKrL,MACS,aAAlBqQ,EAAIhF,KAAKrL,MAILqQ,EAAIC,KAAKxQ,QACW,aAAlBuQ,EAAIhF,KAAKrL,OACXqQ,EAAIC,KAAKxQ,MAAMc,UAAW,UAErByP,EAAIC,KAAKxQ,MAAMY,cAO5B,GAAI2P,EAAIzH,QAAUyH,EAAIzH,OAAOyC,KAAM,CACjC,MAAMsc,EAAatX,EAAIzH,OAAOyC,KAAKrL,KAC7B4nB,EAAavX,EAAIzH,OAAOyC,KAAKwc,MAElB,SAAfF,GACe,WAAfA,GACqB,UAArBC,MAAAA,OAAU,EAAVA,EAAY7oB,OACG,UAAf4oB,GACe,YAAfA,GACqB,WAArBC,MAAAA,OAAAA,EAAAA,EAAY7oB,QAGZsR,EAAIC,KAAKgJ,KAAM,EAEXjJ,EAAIhF,OACNgF,EAAIhF,KAAKiO,KAAM,IAMrB,GAAsB,WAAlBjJ,EAAIhF,KAAKrL,MAAsBqQ,EAAIC,KAAKxQ,MAAMgoB,WAuB3C,GAAsB,WAAlBzX,EAAIhF,KAAKrL,MAAqBqQ,EAAIC,KAAKxQ,MAAMgoB,UAAW,CAEjE,MAAMC,EAAoB1X,EAAIC,KAAKxQ,MAAMgoB,UACnCE,EAAqB,SAAUC,GAC/B/gB,OAAO0B,QAAU1B,OAAO0B,SAAW1B,QACrCA,OAAO0B,OAAOC,YACZ,CACE7I,KAAM,iBACNioB,KAAM,CACJC,IAAKD,EAAKC,IACVnpB,KAAMkpB,EAAKlpB,KACXopB,IAAKF,EAAKE,IACV3K,KAAMyK,EAAKzK,KACXxd,KAAMioB,EAAKjoB,MAEbooB,UAAW/f,KAAKC,OAElB,MAIN+H,EAAIC,KAAKxQ,MAAMgoB,UAAY,SAAUG,GACnCD,EAAmBC,GACfF,GAAkD,mBAAtBA,GAC9BA,EAAkBM,MAAM7mB,KAAM8mB,iBA/CyB,CAC3D,MAAMN,EAAqB,SAAUC,GAC/B/gB,OAAO0B,QAAU1B,OAAO0B,SAAW1B,QACrCA,OAAO0B,OAAOC,YACZ,CACE7I,KAAM,iBACNioB,KAAM,CACJC,IAAKD,EAAKC,IACVnpB,KAAMkpB,EAAKlpB,KACXopB,IAAKF,EAAKE,IACV3K,KAAMyK,EAAKzK,KACXxd,KAAMioB,EAAKjoB,MAEbooB,UAAW/f,KAAKC,OAElB,MAIN+H,EAAIC,KAAKxQ,MAAMgoB,UAAY,SAAUG,GACnCD,EAAmBC,IAiCvB,GACqB,UAAlB5X,EAAIhF,KAAKrL,MAAsC,WAAlBqQ,EAAIhF,KAAKrL,MACtCqQ,EAAIC,KAAKxQ,MAAMmM,SA+BX,IACc,UAAlBoE,EAAIhF,KAAKrL,MAAsC,WAAlBqQ,EAAIhF,KAAKrL,OACvCqQ,EAAIC,KAAKxQ,MAAMmM,QACf,CAEA,MAAMsc,EAAkBlY,EAAIC,KAAKxQ,MAAMmM,QACjCuc,EAA0B,SAAUC,GACpCvhB,OAAO0B,QAAU1B,OAAO0B,SAAW1B,QACrCA,OAAO0B,OAAOC,YACZ,CACE7I,KAAM,iBACNioB,KAAM,CACJC,IAAKO,GAAOpY,EAAIC,KAAKxQ,MAAM2oB,KAAO,IAEpCL,UAAW/f,KAAKC,OAElB,MAKAogB,EAAWrY,EAAIC,KAAKxQ,MAAM2oB,KAAO,GACjCE,EAA0BJ,MAAAA,OAAAA,EAAAA,EAAiBK,gBAEjDvY,EAAIC,KAAKxQ,MAAMmM,QAAU,IACpBsc,EACHM,QAASN,EAAgBM,UAAW,EACpCJ,IAAKF,EAAgBE,KAAOC,EAC5BE,gBAAiBA,CAACC,EAASC,KACrBD,IAAYC,GAEdN,EAAwBD,EAAgBE,KAAOC,MAI/CC,GACmC,mBAA5BA,IAEAA,EAAwBN,MAAM7mB,KAAM8mB,kBApEjD,CACA,MAAME,EAA0B,SAAUC,GACpCvhB,OAAO0B,QAAU1B,OAAO0B,SAAW1B,QACrCA,OAAO0B,OAAOC,YACZ,CACE7I,KAAM,iBACNioB,KAAM,CACJC,IAAKO,GAAOpY,EAAIC,KAAKxQ,MAAM2oB,KAAO,IAEpCL,UAAW/f,KAAKC,OAElB,MAMAogB,EAAWrY,EAAIC,KAAKxQ,MAAM2oB,KAAO,GACvCpY,EAAIC,KAAKxQ,MAAMmM,QAAU,CACvB4c,SAAS,EACTJ,IAAKC,EACLE,gBAAiBA,CAACC,EAASC,KACzB,GAAID,IAAYC,EAId,OAFAN,EAAwBE,IAEjB,MAkDjBK,kBAAiBA,KCzUV,CACLtd,KAAM,CACJud,kBAAkB,EAClBC,OAAQ,aACRC,WAAY,QACZC,SAAU,CACR5P,KAAM,GAER6P,WAAY,CACV7P,KAAM,IAER8P,sBAAsB,GAExBjQ,IAAK,CACHkQ,OAAQ,GAEV3e,UAAW,CACT/J,UAAU,EACViQ,SAAS,EACT7Q,KAAM,UACN0N,UAAW,GACX6O,MAAM,EACNjD,SAzBQ7Y,EA0BR8oB,WA1BQ9oB,GA4BVmK,SAAU,CACRhK,UAAU,EACViQ,SAAS,EACT7Q,KAAM,UACN0N,UAAW,GACX6O,MAAM,EACNjD,SAlCQ7Y,EAmCR8oB,WAnCQ9oB,KD+UZ+oB,gBAAeA,CAAC/C,EAAUgD,KACxBhD,EAASgD,UAAY,CAACpe,EAAM1J,IACnB,IAAIqS,QAAQ,CAACC,EAASyV,IAQpBD,EAAU9nB,EAPCgf,IACZA,EACF+I,EAAO/I,GAEP1M,OAMDwS,GAETkD,SACE,MAAMle,EAAOjK,KAAKrB,QAAQsL,KAC1BjK,KAAK6J,KAAO,CACVvL,MAAO,IAAK2L,GACZuO,GAAI,CACF4P,OAAS1hB,IACPA,EAAE2hB,mBAGNhpB,MAAO4K,EAAK5K,MACZb,KAAM,SAGV8pB,eACE,MAAMvlB,IAAEA,EAAGwlB,IAAEA,EAAGxY,QAAEA,GAAY/P,KACxBiK,EAAOjK,KAAKrB,QAAQsL,KAC1Bue,EAAOxoB,KAAK6J,KAAM,CAChB9G,IAAAA,EACAwlB,IAAAA,EACA9qB,MAAO,CACLwM,EAAKwe,UACLxe,EAAKxM,MACL,cACAuC,KAAK+P,QAAQtF,QAAU,aAAe,MAG1C+d,EAAOxoB,KAAK6J,KAAKvL,MAAO,CACtBoqB,MAAO3Y,EAAQzE,YAGnBiE,OAAO5F,GAIL,OAHIA,EAASgf,YAAc3oB,KAAK+P,QAAQtF,SACtCd,EAASif,aAAQ3pB,EAAW,IAAMe,KAAK6oB,eAElC7oB,KAAK8oB,GACV9oB,KAAK6J,KACLgb,GAAQ7kB,KAAKrB,QAAQiZ,IAAImD,MACrBpR,EAASof,WACT,CAAC/oB,KAAKgpB,QAAQrf,MAGtBsf,SAASpa,EAAKlF,GACZ,MAAME,EAAOgF,EAAIC,KACXoa,EAAM,GAAGlpB,KAAK+C,MAAM8L,EAAI9L,MACxB+U,EAAMjO,EAAKiO,IACXqR,EAAUnpB,KAAKmpB,QAAQtf,KAA6B,IAApBA,EAAKoR,KAAK9X,OAC1CskB,OAAEA,EAAQ3P,IAAKsR,GAASppB,KAAK6J,KAAKvL,MAClC+qB,EAAMxf,EAAKoR,KAAKxd,aACfoM,EAAKoR,KAAKxd,aACVoM,EAAKoR,KAAK9X,MAGjB,IAAImmB,GAAmB,EACvB,GAAIza,EAAIzH,QAAUyH,EAAIzH,OAAOyC,KAAM,CACjC,MAAMsc,EAAatX,EAAIzH,OAAOyC,KAAKrL,KAC7B4nB,EAAavX,EAAIzH,OAAOyC,KAAKwc,MAElB,SAAfF,GACe,WAAfA,GACqB,UAArBC,MAAAA,OAAU,EAAVA,EAAY7oB,OACG,UAAf4oB,GACe,YAAfA,GACqB,WAArBC,MAAAA,OAAAA,EAAAA,EAAY7oB,QAEZ+rB,GAAmB,GAIvB,MAAMppB,EAAO2kB,GAAQhb,EAAKoR,KAAKF,MAC3BpR,EACA3J,KAAK8oB,GACHjD,EAAW,CACThc,EAAKoR,KACL,CACE3c,MAAO,IACFwmB,GAASjb,EAAKoR,MAAQ,IACzBsO,YAAa1f,EAAK0f,cAAe,EACjChsB,KAAMsR,EAAIsC,GACVqY,MAAO3a,EAAI4a,oBACI,eAAXhC,EACA,CAAEE,SAAU,GAAIC,WAAY,IAC5B,IAENnqB,MAAOuC,KAAK0P,QAAQga,WAClBL,GAAOxf,EAAK4e,UACZ,gBAEF1lB,IAAQmmB,EAAH,KACLX,IAAK1Z,EAAIyW,QACT9mB,KAAM,cAGV,CACEE,QAASA,IAAMiL,KACXwf,EAAU,CAAE7oB,MAAOA,IAAMN,KAAK2pB,SAAS9f,EAAMqf,EAAKra,IAAS,KAIvE,MAAkB,WAAX4Y,GACL5C,GAAQuE,IACRvE,GAAQ/M,EAAIiD,OACZuO,EACEppB,EACAF,KAAK4pB,QAAQ/f,EAAMqf,EAAK,CAAChpB,KAE/BipB,QAAQtf,GACN,IAAgC,IAA5B7J,KAAKrB,QAAQsL,KAAK9G,MAAiB,OAAO,EAC9C,MAAMA,EAAQ0G,EAAK1G,MACnB,SAAWA,EAAMA,QAAUA,EAAMmH,QAAWua,GAAQ1hB,EAAM4X,QAE5D4O,SAAS9f,EAAMqf,EAAKra,GAAK,IAAAgb,EAAAC,EACvB,MAAMC,EAAY,IAAKlgB,EAAK1G,OACtB6mB,EAAW,IAAKngB,EAAK8b,MAC3B,IAAgC,IAA5B3lB,KAAKrB,QAAQsL,KAAK9G,MAAiB,OAAO,EAC9C,IAAM4mB,EAAU5mB,QAAU4mB,EAAUzf,QAAWua,GAAQkF,EAAUhP,MAC/D,OACF,MAAMkP,EA5ca,YA4cKD,EA5cdxrB,KA6cV,MAAM0rB,EAAYlqB,KAAKmqB,QAAQ,SACzBxgB,EAAW,CACfugB,EACIA,EAAU,CACR/mB,cAAK0mB,EAAEhb,EAAIub,eAAO,IAAAP,GAAU,QAAVA,EAAXA,EAAaQ,gBAAbR,IAAqBA,OAArBA,EAAAA,EAAuB1pB,MAC9B0J,KAAMgF,EAAIhF,KACVlL,QAASqB,KAAKrB,kBACdmrB,EACFjb,EAAIub,eAAO,IAAAN,GAAU,QAAVA,EAAXA,EAAaO,gBAAbP,IAAqBA,OAArBA,EAAAA,EAAuB3pB,OAG7B,IACG0kB,GAAQmF,EAASjP,QACjBiP,EAASrE,MAAQqE,EAAS1f,UAC1Bua,GAAQmF,EAAShH,MAClB,CACA,MAAMlU,EAAO,CACXtQ,KAAMwrB,EAASxrB,MAAQ,UACvBF,MAAOwmB,GAASkF,GAChBjnB,IAAQmmB,EAAH,cAGApa,EAAKxQ,MAAM0kB,YACXlU,EAAKxQ,MAAMyc,YACXjM,EAAKxQ,MAAMqnB,YACX7W,EAAKxQ,MAAMiO,aACXuC,EAAKxQ,MAAMgM,OAElB,MAAM/F,EAAQ0lB,EAAQ,QAAU,UACsB,IAAAK,EAAtD,GAAIN,EAASrE,OAAS5W,EAAYD,EAAKxQ,MAAOiG,GAC5CuK,EAAKxQ,MAAMiG,GAAoB,QAAd+lB,EAAGzb,EAAIub,eAAOE,IAAAA,WAAAA,EAAXA,EAAaC,eAAO,IAAAD,OAAA,EAApBA,EAAsBnqB,MAE5CwJ,EAA4B,SAAnBqgB,EAASzd,MAAmB,UAAY,QAC/CvM,KAAK8oB,GAAGjD,EAAW,CAACmE,EAAUlb,IAAQ,CACpC1O,CAAC2pB,EAAUS,MAAQ,WAAY,IAC7BxqB,KAAK8oB,GAAG,CACNtqB,MACoB,IAAlBwrB,EAAShH,KACL,yBACAgH,EAAShH,MAAQ,GACvB1kB,MAAO,CACLE,MACoB,IAAlBwrB,EAAShH,KACL,yBACAgH,EAAShH,MAEjBjgB,IAAQmmB,EAAH,SAMf,MAAMuB,EAAQ5E,EAAW,CACvBkE,EACA,CACEzrB,MAAOwmB,GAASiF,GAChBhnB,IAAQmmB,EAAH,MACLzrB,MAAO,gBACPe,KAAMurB,EAAUvrB,MAAQ,UAQ5B,cAJOisB,EAAMnsB,MAAMyc,YACZ0P,EAAMnsB,MAAM6E,aACZsnB,EAAMnsB,MAAMgM,OAEZtK,KAAK8oB,GAAG2B,EAAO9gB,IAExBigB,QAAQ/f,EAAMqf,EAAKvf,GACjB,MAAMmO,EAAMjO,EAAKiO,IACjB,OAAO9X,KAAK8oB,GACV,CACErrB,MAAOuC,KAAK0P,QAAQga,WAAW5R,EAAIra,MAAO,eAC1Ce,KAAM,MACNF,MAAOwZ,GAAO,CAAEC,KAAM,IACtBhV,IAAQmmB,EAAH,OAEPvf,IAGJqf,QAAQrf,GACN,MAAMiO,EAAM5X,KAAKrB,QAAQiZ,KAAO,GAChC,OAAO5X,KAAK8oB,GACV,CACEtqB,KAAM,MACNF,MAAOsZ,EACPna,MAAOuC,KAAK0P,QAAQga,WAAW9R,EAAIna,MAAO,eAC1CsF,IAAQ/C,KAAK+C,IAAR,OAEP4G,IAGJkf,cACE,IAAI6B,EAAK,GAOT,GANK7F,GAAQ7kB,KAAKrB,QAAQwK,UAAU4R,OAClC2P,EAAG7e,KAAK7L,KAAK2qB,iBAEV9F,GAAQ7kB,KAAKrB,QAAQyK,SAAS2R,OACjC2P,EAAG7e,KAAK7L,KAAK4qB,iBAEVF,EAAG9pB,OACN,OAEF,IAAI+mB,SAAEA,EAAQC,WAAEA,EAAUH,OAAEA,GAAWznB,KAAK6J,KAAKvL,MAClC,eAAXmpB,IACFE,EAAWC,EAAa,IAE1B,MAAM1nB,EAAOF,KAAK8oB,GAChB,CACEtqB,KAAM,WACNf,MAAO,8BACPsF,IAAQ/C,KAAK+C,IAAR,KACLzE,MAAO,CACLqpB,SAAAA,EACAC,WAAAA,EACAtnB,MAAO,IACPuqB,OAAO,IAGXH,GAGF,MAAkB,WAAXjD,EACHvnB,EACAF,KAAK8oB,GACH,CACEtqB,KAAM,MACNf,MAAO,cACPa,MAAO,CAAEyZ,KAAM,IACfhV,IAAQ/C,KAAK+C,IAAR,MAEP,CAAC7C,KAIT0qB,eACE,MAAMxhB,EAAW,IAAKpJ,KAAKrB,QAAQyK,UAC7B8C,EACJ9C,EAAS8C,WAAalM,KAAK+P,QAAQlI,IAAI6C,EAAE,UAAY,KAKvD,cAJOtB,EAAS8C,iBACT9C,EAAS2e,aACT3e,EAAS0O,WACT1O,EAAS2R,KACT/a,KAAK8oB,GACV,CACEtqB,KAAM,SACNF,MAAO8K,EACP3L,MAAO,eACP4B,MAAO,CAAEtB,MAAOqL,EAASrL,MAAO+sB,WAAY,QAC5CtS,GAAI,CACFuP,MAAOA,KACL,MAAMgD,EAAO/qB,KAAK+P,QAAQlI,IAC1B7H,KAAKrB,QAAQyK,SAAS2e,MAClB/nB,KAAKrB,QAAQyK,SAAS2e,MAAMgD,GAC5BA,EAAKC,gBAGbjoB,IAAQ/C,KAAK+C,IAAR,MAEP,CAACmJ,KAGLye,gBACE,MAAMxhB,EAAY,IAAKnJ,KAAKrB,QAAQwK,WAC9B+C,EACJ/C,EAAU+C,WAAalM,KAAK+P,QAAQlI,IAAI6C,EAAE,WAAa,KAKzD,cAJOvB,EAAU+C,iBACV/C,EAAU4e,aACV5e,EAAU2O,WACV3O,EAAU4R,KACV/a,KAAK8oB,GACV,CACEtqB,KAAM,SACNF,MAAO6K,EACP1L,MAAO,gBACP4B,MAAO,CAAEtB,MAAOoL,EAAUpL,OAC1Bya,GAAI,CACFuP,MAAOA,KACL,MAAMgD,EAAO/qB,KAAK+P,QAAQlI,IAC1B7H,KAAKrB,QAAQwK,UAAU4e,MACnB/nB,KAAKrB,QAAQwK,UAAU4e,MAAMgD,GAC7BA,EAAK3C,SAASrgB,MAAM,UAG5BhF,IAAQ/C,KAAK+C,IAAR,MAEP,CAACmJ,ME3oBP,MAAMiH,GAAQ,GAuDd,IAAmBM,IArDnB,SAAkBN,GACf,CACC,aACA,SACA,QACA,eACA,WACA,aACA,QACA,cACA,gBACA,QACA,OACA,SACA,OACA,SACA,cACAC,OAAO,CAACD,EAAO5V,KACf4V,EAAM5V,GAAQ+V,EAAe/V,GACtB4V,GACNA,GACHA,EAAM8X,KAAO9X,EAAM2Q,aACnB3Q,EAAM+X,OAAS/X,EAAMmQ,YACrBnQ,EAAMgY,KAAOhY,EAAMoE,WACnBpE,EAAM+C,SAAW/C,EAAMqQ,cAoFzB4H,CAASjY,IA3DT,SAAmBA,GACjBA,EAAmB,YAAIG,EAAe,SAAU,CAAEQ,OAAO,IA2D3DuX,CAAUlY,IAlFV,SAAkBA,GAChB,MAAMmY,EAAQ,CACZC,YAAa,CAAC,QAAS,GACvBC,WAAY,CAAC,OAAQ,GACrBC,YAAa,CAAC,QAAS,GACvBC,cAAe,CAAC,QAAS,GACzBC,aAAc,CAAC,OAAQ,GACvBC,cAAe,CAAC,QAAS,IAG3BtsB,OAAO4L,KAAKogB,GAAOlY,OAAO,CAACD,EAAOpQ,KAChCoQ,EAAMpQ,GAAOuQ,EAAe,QAAUG,GACpCA,EAAEnV,MAAM,CAAEE,KAAM8sB,EAAMvoB,GAAK,GAAI8oB,UAAWP,EAAMvoB,GAAK,MAEhDoQ,GACNA,GAEHA,EAAM2Y,WAAa3Y,EAAMoY,YACzBpY,EAAM4Y,UAAY5Y,EAAMqY,WACxBrY,EAAM6Y,WAAa7Y,EAAMsY,YAgE3BQ,CAAS9Y,IAlDT,SAAmBA,GACjB,MAAMmY,EAAQ,CACZpH,MAAO,CAAC,QAAS,GACjBuC,KAAM,CAAC,OAAQ,GACfyF,cAAe,CAAC,OAAQ,GACxBC,eAAgB,CAAC,QAAS,IAG5B7sB,OAAO4L,KAAKogB,GAAOlY,OAAO,CAACD,EAAOpQ,KAChCoQ,EAAMpQ,GAAOuQ,EAAe,SAAWG,GACrCA,EAAEnV,MAAM,CACN8tB,WAAYd,EAAMvoB,GAAK,GACvB8oB,UAAWP,EAAMvoB,GAAK,MAGnBoQ,GACNA,GAEHA,EAAMkZ,YAAclZ,EAAM+Q,MAC1B/Q,EAAMmZ,WAAanZ,EAAMsT,KAgC3B8F,CAAUpZ,KA1DSM,GA2DTN,IAzDNqZ,eAAiBlZ,EADN,SAC2B,CAAEmZ,KAAM,aAChDhZ,GAAEiZ,WAAapZ,EAFF,SAEuB,CAAEmZ,KAAM,SAC5ChZ,GAAEkZ,eAAiBrZ,EAHN,SAG2B,CAAEmZ,KAAM,aAyBlD,SAA2BtZ,GACzBA,EAAMyZ,eAAiBtZ,EAAe,kBACtCH,EAAM0Z,YAAc1Z,EAAMyZ,eA6B5BE,CAAkB3Z,IA1BlB,SAA0BA,GACxBA,EAAM4Z,cAAgBzZ,EAAe,iBACrCH,EAAM6Z,WAAa7Z,EAAM4Z,cAyB3BE,CAAiB9Z,IAtBjB,SAAiBA,GACfA,EAAMa,KAAOV,EAAe,QAsB9B4Z,CAAQ/Z,IAnBR,SAAiBA,GACfA,EAAMuQ,KAAOpQ,EAAe,QAmB9B6Z,CAAQha,IAhBR,SAAkBA,GAChBA,EAAMwQ,MAAQrQ,EAAe,SAgB/B8Z,CAASja,IAbT,SAAiBA,GACfA,EAAM0Q,KAAOvQ,EAAe,QAa9B+Z,CAAQla,IC6cR,MAAM8U,GAAY,IAnkBlB,MAOEqF,OAAOntB,EAAOotB,GAAS,GACrB,IAAKptB,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GAAOiQ,OAC1B,OAAImd,EAEK,gBAAgBC,KAAKpiB,GAGrB,eAAeoiB,KAAKpiB,GAS/BqiB,MAAMttB,GACJ,IAAKA,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GAAOiQ,OAE1B,MAAO,wIAAwIod,KAC7IpiB,GAUJsiB,OAAOvtB,EAAOwtB,GAAY,GACxB,IAAKxtB,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GAAOiQ,OAAOwd,cAGjC,IAAK,gBAAgBJ,KAAKpiB,GACxB,OAAO,EAGT,IAAKuiB,EACH,OAAO,EAIT,MAAME,EAAU,CAAC,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAGnE,IAAIC,EAAM,EACV,IAAK,IAAIzb,EAAI,EAAGA,EAAI,GAAIA,IACtByb,GAAOC,SAAS3iB,EAAIiH,IAAMwb,EAAQxb,GAEpC,MAAM2b,EAAiBF,EAAM,GAC7B,OAAO1iB,EAAI,MAPQ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAOxC4iB,GAUhCtH,IAAIvmB,EAAOxB,EAAU,IACnB,IAAKwB,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GAAOiQ,QACpB6d,gBAAEA,GAAkB,GAAUtvB,EAEpC,OAAIsvB,EACK,qBAAqBT,KAAKpiB,GAG1B,iEAAiEoiB,KACtEpiB,GAUN8iB,GAAG/tB,GACD,IAAKA,EAAO,OAAO,EACnB,MACMguB,EADMhvB,OAAOgB,GAAOiQ,OACR8H,MAAM,KACxB,OAAqB,IAAjBiW,EAAMvtB,QACHutB,EAAMC,MAAOC,IAClB,MAAMC,EAAMP,SAASM,EAAM,IAC3B,OAAOC,GAAO,GAAKA,GAAO,KAAOnvB,OAAOmvB,KAASD,IAerDnD,OAAO/qB,EAAOxB,EAAU,IACtB,GAAIwB,MAAAA,GAAmD,KAAVA,EAAc,OAAO,EAClE,MAAMmuB,EAAMtvB,OAAOmB,GACnB,GAAIyf,MAAM0O,GAAM,OAAO,EAEvB,MAAMC,QACJA,GAAU,EAAKC,SACfA,GAAW,EAAKC,SAChBA,GAAW,EAAKplB,IAChBA,EAAG/H,IACHA,GACE3C,EAEJ,QAAI4vB,IAAYvvB,OAAO0vB,UAAUJ,QAC7BE,GAAYF,GAAO,OACnBG,GAAYH,GAAO,YACXrvB,IAARoK,GAAqBilB,EAAMjlB,WACnBpK,IAARqC,GAAqBgtB,EAAMhtB,MAcjCV,OAAOT,EAAOxB,EAAU,IACtB,GAAIwB,MAAAA,EAAuC,OAAO,EAClD,MAAMiL,EAAMjM,OAAOgB,IACbkJ,IAAEA,EAAG/H,IAAEA,EAAGqtB,IAAEA,GAAQhwB,EAE1B,YAAYM,IAAR0vB,EACKvjB,EAAIxK,SAAW+tB,SAGZ1vB,IAARoK,GAAqB+B,EAAIxK,OAASyI,WAC1BpK,IAARqC,GAAqB8J,EAAIxK,OAASU,GAWxCstB,QAAQzuB,EAAOyuB,GACb,IAAKzuB,IAAUyuB,EAAS,OAAO,EAC/B,MAAMxjB,EAAMjM,OAAOgB,GACnB,IAAI0uB,EACJ,GAAID,aAAmBE,OACrBD,EAAQD,OAER,IACEC,EAAQ,IAAIC,OAAOF,GACnB,MAAOloB,GACP,OAAO,EAGX,OAAOmoB,EAAMrB,KAAKpiB,GAYpByH,KAAK1S,EAAOxB,EAAU,IACpB,IAAKwB,EAAO,OAAO,EACnB,IAAI0S,EACJ,GAAI1S,aAAiB0G,KACnBgM,EAAO1S,OAGP,GADA0S,EAAO,IAAIhM,KAAK1G,GACZyf,MAAM/M,EAAKkc,WAAY,OAAO,EAGpC,MAAM1lB,IAAEA,EAAG/H,IAAEA,GAAQ3C,EACrB,GAAI0K,EAAK,CAEP,GAAIwJ,GADYxJ,aAAexC,KAAOwC,EAAM,IAAIxC,KAAKwC,IACjC,OAAO,EAE7B,GAAI/H,EAAK,CAEP,GAAIuR,GADYvR,aAAeuF,KAAOvF,EAAM,IAAIuF,KAAKvF,IACjC,OAAO,EAG7B,OAAO,EAST0tB,MAAM7uB,EAAOiQ,GAAO,GAClB,OAAIjQ,MAAAA,IACiB,iBAAVA,EACFiQ,EAAwB,KAAjBjQ,EAAMiQ,OAA0B,KAAVjQ,EAElC1B,MAAMsB,QAAQI,GACQ,IAAjBA,EAAMS,OAEM,iBAAVT,GAC4B,IAA9Bb,OAAO4L,KAAK/K,GAAOS,QAW9BquB,SAAS9uB,EAAOiQ,GAAO,GACrB,OAAQpQ,KAAKgvB,MAAM7uB,EAAOiQ,GAQ5B8e,QAAQ/uB,GACN,QAAKA,GACE,qBAAqBqtB,KAAKruB,OAAOgB,IAS1CgvB,MAAMhvB,EAAOivB,GAAgB,GAC3B,IAAKjvB,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GACnB,OAAIivB,EACK,cAAc5B,KAAKpiB,GAEnB,YAAYoiB,KAAKpiB,GAS5BikB,aAAalvB,GACX,QAAKA,GACE,iBAAiBqtB,KAAKruB,OAAOgB,IAQtCouB,QAAQpuB,GACN,OAAOH,KAAKkrB,OAAO/qB,EAAO,CAAEouB,SAAS,IAQvCC,SAASruB,GACP,OAAOH,KAAKkrB,OAAO/qB,EAAO,CAAEquB,UAAU,IAQxCC,SAAStuB,GACP,OAAOH,KAAKkrB,OAAO/qB,EAAO,CAAEsuB,UAAU,IAQxCa,SAASnvB,GACP,IAAKA,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GAAOovB,QAAQ,MAAO,IAEzC,MAAO,cAAc/B,KAAKpiB,GAQ5BokB,SAASrvB,GACP,QAAKA,GACE,UAAUqtB,KAAKruB,OAAOgB,GAAOiQ,QAQtCqf,aAAatvB,GACX,IAAKA,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GAAOiQ,OAAOwd,cAEjC,MACE,uEAAuEJ,KACrEpiB,IAEF,8EAA8EoiB,KAC5EpiB,GAUNskB,WAAWvvB,GACT,IAAKA,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GAAOiQ,OAAOwd,cAEjC,MAAO,uDAAuDJ,KAAKpiB,GASrEukB,KAAKxvB,EAAOyvB,GACV,SAAKnxB,MAAMsB,QAAQ6vB,IAAiC,IAApBA,EAAShvB,SAClCgvB,EAASzU,SAAShb,GAU3B0vB,MAAMC,EAAQC,EAAQxC,GAAS,GAC7B,OAAIA,EACKuC,IAAWC,EAEXD,GAAUC,EAWrBC,SAASF,EAAQC,EAAQxC,GAAS,GAChC,OAAQvtB,KAAK6vB,MAAMC,EAAQC,EAAQxC,GAQrC0C,UAAU9vB,GACR,IAAKA,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GACnB,OAAOiL,IAAQA,EAAIwiB,eAAiB,QAAQJ,KAAKpiB,GAQnD8kB,UAAU/vB,GACR,IAAKA,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GACnB,OAAOiL,IAAQA,EAAI+kB,eAAiB,QAAQ3C,KAAKpiB,GAWnDglB,SAASjwB,EAAOxB,EAAU,IACxB,IAAKwB,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GAAOiQ,QACpB/G,IAAEA,EAAM,EAAC/H,IAAEA,EAAM,IAAO3C,EAC9B,QAAIyM,EAAIxK,OAASyI,GAAO+B,EAAIxK,OAASU,IAC9B,kBAAkBksB,KAAKpiB,GAchC8K,SAAS/V,EAAOxB,EAAU,IACxB,IAAKwB,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,IACbkJ,IACJA,EAAM,EAAC/H,IACPA,EAAM,GAAE+uB,cACRA,GAAgB,EAAKC,cACrBA,GAAgB,EAAKC,eACrBA,GAAiB,GACf5xB,EAEJ,QAAIyM,EAAIxK,OAASyI,GAAO+B,EAAIxK,OAASU,OACjC+uB,IAAkB,KAAK7C,KAAKpiB,QAC5BklB,IAAkB,WAAW9C,KAAKpiB,OAClCmlB,IAAmB,yBAAyB/C,KAAKpiB,MAUvDolB,SAASrwB,GACP,QAAKA,GACE,qCAAqCqtB,KAAKruB,OAAOgB,GAAOiQ,QAQjEqgB,GAAGtwB,GACD,QAAKA,GACE,kBAAkBqtB,KAAKruB,OAAOgB,GAAOiQ,QAQ9CsgB,OAAOvwB,GACL,QAAKA,GACE,wBAAwBqtB,KAAKruB,OAAOgB,GAAOiQ,QAQpDugB,IAAIxwB,GACF,IAAKA,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GAAOiQ,OAE1B,MAAO,yBAAyBod,KAAKpiB,GAQvCwlB,IAAIzwB,GACF,IAAKA,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GAAOiQ,OAAOwd,cACjC,MAAO,iCAAiCJ,KAAKpiB,GAQ/CylB,OAAO1wB,GACL,IAAKA,EAAO,OAAO,EACnB,MAAMiL,EAAMjM,OAAOgB,GAAOiQ,OAC1B,GAAIhF,EAAIxK,OAAS,GAAM,EAAG,OAAO,EACjC,IACE,OAAOkwB,KAAKC,KAAK3lB,MAAUA,EAC3B,MAAO1E,GACP,OAAO,GASXsqB,KAAK7wB,GACH,IAAKA,EAAO,OAAO,EACnB,IAEE,OADA6F,KAAKC,MAAM9G,OAAOgB,KACX,EACP,MAAOuG,GACP,OAAO,GASXuqB,QAAQ9wB,GACN,OAAIA,MAAAA,GACG,QAAQqtB,KAAKruB,OAAOgB,IAQ7B8X,KAAK9X,GACH,QAAKA,GACE,aAAaqtB,KAAKruB,OAAOgB,GAAOiQ,QAQzC8gB,KAAK/wB,GACH,OAAOH,KAAKkrB,OAAO/qB,EAAO,CAAEouB,SAAS,EAAMllB,IAAK,EAAG/H,IAAK,UClkB5D,IAAI6vB,GAAY,KAChB,IAAI,IAAAC,GAC4BC,GAAAC,GAA9B,GAAUF,QAAVA,GAAIhqB,kBAAMgqB,IAAQA,QAARA,GAANA,GAAQ1rB,kBAAM0rB,IAAdA,GAAgBG,SAClBJ,GACqC,+BAA7BE,QAANA,GAAAjqB,kBAAMiqB,YAAAA,GAANA,GAAQ3rB,cAAM,IAAA2rB,QAAA,EAAdA,GAAgBE,SAASC,SACU,sCAAnCF,GAAAlqB,cAAM,IAAAkqB,IAAQ,QAARA,GAANA,GAAQ5rB,cAAR4rB,IAAcA,QAAdA,EAAAA,GAAgBC,SAASC,QAE7B,MAAOrrB,GACPgrB,GAAY,KAEP,MAAMM,GACG,OAAdN,IAAsBA,GAClB,0CACc,IAAdA,GACA,iDACA,GCPN,SAASO,GAAYC,EAAKjM,GAGxB,OAFI3X,EAAGjP,QAAQ6yB,GAAMA,EAAM,CAAE5W,KAAM4W,GACzB5jB,EAAG6jB,MAAMD,IAAS5jB,EAAGzO,OAAOqyB,KAAMA,EAAM,CAAE5W,KAAM2K,IACnDiM,EAGM,SAASE,GAAUhqB,EAAKwY,GACrC,MAAO,CACLyR,OAAMA,IACGzR,EAAEvH,SAAS7O,OAEpB8nB,OAAO5gB,GACL,MAAMtC,EAAMwR,EAAExH,YAAY1H,GAC1B,GAAKtC,EACL,OAAOwR,EAAElJ,GAAGkO,KAAKxW,EAAIyW,UAEvBL,SAASxd,GACA,IAAI+K,QAAQ,CAACC,EAASyV,KAC3B,MAAM8J,EAAQnqB,EAAI8B,SACZsoB,EAAM,CAAC5R,EAAEvH,SAASmM,YACxB+M,EACG7vB,OAAQ6I,IAAOA,EAAEknB,SACjBhtB,QAAS8F,IACRinB,EAAIpmB,KAAKb,EAAEia,cAEfzS,QAAQyf,IAAIA,GACT1gB,KAAK,KACJkB,GAAQ,GACRhL,GAAYA,GAAS,KAEtBM,MAAOrB,IACNwhB,EAAOxhB,GACPe,GAAYA,EAASf,GACrB2Z,EAAElJ,GAAGgb,KAAK,gBAAiBzrB,EAAG,CAAEmB,IAAAA,IAChCwY,EAAE+R,UAAU,gBAAiB1rB,EAAG,CAAEmB,IAAAA,QAI1CC,cAAaA,CAACvD,EAAOkD,IACZ,IAAI+K,QAAQ,CAACC,EAASyV,KAC3B,MAAMrZ,EAAMwR,EAAExH,YAAYtU,GAC1B,IAAKsK,EAAK,OACV,MAAMwjB,EAAMhS,EAAElS,QAAQU,EAAIsC,IACpB8gB,EAAM,CAAC5R,EAAEvH,SAAShR,cAAc+G,EAAIsC,KAC1CmhB,EAAQD,GACLlwB,OAAQ6I,IAAOA,EAAEknB,SACjBhtB,QAAS8F,IACRinB,EAAIpmB,KAAKb,EAAEia,cAEfzS,QAAQyf,IAAIA,GACT1gB,KAAK,KACJkB,EAAQ,MACRhL,GAAYA,EAAS,QAEtBM,MAAOrB,IACNwhB,EAAOxhB,GACPe,GAAYA,EAASf,GACrB2Z,EAAElJ,GAAGgb,KAAK,sBAAuBzrB,EAAG,CAAEnC,MAAAA,EAAOsD,IAAAA,QAIrDsd,mBAAmBoN,EAAQC,GAAW,GACpC3qB,EAAI4qB,OAAOC,WAAWH,GAAQrtB,QAASX,IACjCiuB,GAAUxyB,KAAK2yB,sBAAsBpuB,GACzC8b,EAAEuS,QAAQruB,GAAOW,QAAS2J,IACxBwR,EAAEvH,SAASqM,mBAAmBtW,QAIpC8jB,sBAAsBJ,GACpB1qB,EAAI4qB,OAAOC,WAAWH,GAAQrtB,QAASX,IACrC8b,EAAEuS,QAAQruB,GAAOW,QAAS2J,IACxB,MAAMV,EAAUkS,EAAElS,QAAQU,EAAIsC,IACzBhD,IACD1P,MAAMsB,QAAQoO,GAChBA,EAAQjJ,QAAS+E,IACfA,EAAKkb,uBAEEhX,GACTA,EAAQgX,2BAKhBwM,IAAK,CACHtiB,QAASA,CAACA,GAAU,KAClBxH,EAAIgrB,eAAe,CAAExjB,UAAWA,KAElCjQ,SAAUA,CAACA,GAAW,KACpByI,EAAIgrB,eAAe,CAAEzzB,WAAYA,KAEnC2b,KAAMA,CAAC+X,GAAS,KACdjrB,EAAIgrB,eAAe,CAAE9X,OAAQ+X,MAGjC1pB,SAAU,CACRiG,QAASA,CAACA,GAAU,KAClBxH,EAAIkrB,cAAc,CAAE1jB,UAAWA,KAEjCjQ,SAAUA,CAACA,GAAW,KACpByI,EAAIkrB,cAAc,CAAE3zB,WAAYA,KAElC2b,KAAMA,CAAC+X,GAAS,KACdjrB,EAAIkrB,cAAc,CAAEhY,OAAQ+X,MAGhCD,eAAgBA,CAACv0B,EAAQ,MACvB,IAAIqzB,EAAMD,GAAYrR,EAAE1hB,QAAQwK,WAAW,GAC3Cqf,EAAOmJ,EAAKrzB,GACZ+hB,EAAE1hB,QAAQwK,UAAYwoB,EACtB9pB,EAAImrB,kBAEND,cAAeA,CAACz0B,EAAQ,MACtB,IAAIqzB,EAAMD,GAAYrR,EAAE1hB,QAAQyK,UAAU,GAC1Cof,EAAOmJ,EAAKrzB,GACZ+hB,EAAE1hB,QAAQyK,SAAWuoB,EACrB9pB,EAAImrB,kBAEN5K,OAAMA,CAAC6K,EAAWC,IACT,IAAI1gB,QAAQ,CAACC,EAASyV,OAEM,IAA/B7H,EAAE1hB,QAAQw0B,iBACN3gB,QAAQC,UACR5K,EAAIod,YAEP1T,KAAK,KACJ,IAAIjG,EAAWzD,EAAIyD,WACnB+U,EAAE+S,aAAa9nB,GACZiG,KAAK,KACJxD,EAAGrJ,SAASuuB,IAAcI,EAAO,IAAMJ,EAAU3nB,EAAUzD,IAC3DkG,EAAGrJ,SAAS2b,EAAE1hB,QAAQ20B,WACpBD,EAAO,IAAMhT,EAAE1hB,QAAQ20B,SAAShoB,EAAUzD,IAC5CwY,EAAElJ,GAAGgb,KAAK,SAAU7mB,EAAUzD,GAC9B4K,EAAQnH,KAETvD,MAAOrB,SAEXqB,MAAM,IAAIhE,KACTgK,EAAGrJ,SAASwuB,IAAWG,EAAO,IAAMH,EAAOrrB,KAAQ9D,IACnDmkB,KAAUnkB,OAwDlBwvB,QAAQ3U,IAEgB,iBAAXA,IACTA,EAAS,CAAE4U,OAAQ5U,IAGd/W,EAAI8V,MAAMiB,IAEnB6U,aAAaC,GACX,IAAKA,EACH,OAAOlhB,QAAQC,QAAQ,MAEzB,IAAImM,EAAS,CACX4U,OAAW/B,GAAH,kBACRkC,OAAQ,OACRC,SAAU,OACVjvB,KAAM,CACJkZ,QAAS,EACT7B,KAAM,EACN6X,OAAQ,CACNH,QAASA,GAAW,MAI1B,OAAO,IAAIlhB,QAAQ,CAACC,EAASyV,KAC3BrgB,EACG8V,MAAMiB,GACNrN,KAAMuiB,IACgB,IAAAC,EAAH,KAAdD,MAAAA,OAAG,EAAHA,EAAK3jB,MACPsC,GAAQqhB,MAAAA,GAAS,QAANC,EAAHD,EAAKnvB,YAAI,IAAAovB,GAAS,QAATA,EAATA,EAAWC,eAAO,IAAAD,OAAA,EAAlBA,EAAqB,KAAM,MAEnCthB,EAAQ,QAGX1K,MAAOoX,IACN+I,EAAO/I,QAKf8U,SAASC,EAAI5W,GACX,IAAI6W,EAAW,EACf,OAAO,YAAapwB,GAClB,MAAMqwB,EAAUp0B,KACV8G,EAAMD,KAAKC,MACbA,EAAMqtB,IAAa7W,GAAS,KAC9B6W,EAAWrtB,EACXotB,EAAGztB,KAAK2tB,KAAYrwB,MAK1BswB,SAASH,EAAI5W,GACX,IAAIgX,EAAQ,KACZ,OAAO,YAAavwB,GAClB,MAAMqwB,EAAUp0B,KACF,OAAVs0B,GACFziB,aAAayiB,GAEfA,EAAQxiB,WAAW,KACjBoiB,EAAGztB,KAAK2tB,KAAYrwB,IACnBuZ,GAAS,KA6BhBiX,WAAYtM,GACZuM,QAASC,EAoBTC,YAAYC,GAAU,GAEpB9sB,EAAI4I,cAAc,CAAEhG,UAAWkqB,IAE/B9sB,EAAIyJ,YC9TV,IAAesjB,GAAA,CACb9Q,aAAc,QACdlU,SAAU,QACV0T,YAAa,QACbE,cAAe,QACfxN,SAAU,QACVkN,KAAM,QACND,OAAQ,QACRM,WAAY,QACZF,OAAQ,UACRuJ,eAAgB,aAChBG,cAAe,cCTjB,MAAMjkB,GAAW,CACbvL,KAAM,WACNs3B,KAAK7b,EAAQnP,EAAMhC,GACf,MAAMrH,EAgCd,SAAkBA,GACd,OAAIuN,EAAGjP,QAAQ0B,GACJ,CAACsI,SAAUtI,GACXuN,EAAG5O,OAAOqB,GACV,CAAC2G,QAAS3G,GACVuN,EAAG6jB,MAAMpxB,GACT,CAACsI,UAAU,GACXiF,EAAGrJ,SAASlE,GACZ,CAACynB,UAAWznB,GACXuN,EAAGzO,OAAOkB,GAGXA,EAFA,GA1CKs0B,CAAS9b,EAAOzE,YAC5B,IAAqB,IAAjB/T,EAAIsI,SACJkQ,EAAO+b,YACPltB,EAAIsd,mBAAmB,CAACtb,EAAKtF,YAC1B,CAAA,IAAAywB,EACH,MAAM/P,EAAW,CACbnc,UAAU,EACVmf,UAASA,CAACpQ,EAAG7M,IACF,IAAIwH,QAAQ,CAACC,EAASyV,KACzBna,EAAGihB,MAAMhkB,GAAKkd,EAAOjD,EAAS9d,SAAWsL,SAG9CjS,GAED2C,EAA2B6xB,QAAtBA,EAAGnrB,EAAKorB,OAAO7K,mBAAO4K,WAAAA,EAAnBA,EAAqB3K,gBAAQ,IAAA2K,OAAA,EAA7BA,EAA+B70B,MAC7C,GAAK8kB,EAAS9d,QAEP,CACH,MAAM+tB,EAAQjQ,EAAS9d,QAAQ+tB,MAAM,6BACjCA,IACAjQ,EAAS9d,QAAUU,EAAI6C,EAAEwqB,EAAM,GAAI,CAAC/xB,MAAAA,UAJxC8hB,EAAS9d,QAAUU,EAAI6C,EAAE,WAAY,CAACvH,MAAAA,KAAYA,GAA6B,OAApB0E,EAAIstB,YAAuB,eAAiB,QAO3Gnc,EAAOoc,UAAUnQ,SAAW,CAACA,GAEjCpd,EAAIwJ,KAAKxH,IAEbxE,SAAStB,GACL+E,GAAS+rB,QAAQ9wB,KCpBzB,SAASsxB,GAAQC,GACfA,EAAWC,eAAe5S,IAE1BrjB,OAAO4L,KAAK0pB,IAAa1vB,QAASiG,IAChCmqB,EAAWE,cAAcrqB,EAAGypB,GAAYzpB,MAG1C/G,GAAWc,QAASuwB,IAClBH,EAAWG,UAAUA,EAAUl4B,KAAMk4B,KAGvCH,EAAWI,SAAS5sB,IAEpBqP,GAAQjT,QAASywB,IACfL,EAAWK,OAAOA,KAGpBr2B,OAAO4L,KAAK0qB,IAAQ1wB,QAAS3H,IAC3B+3B,EAAWniB,MAAM5V,GAAQq4B,GAAOr4B,KAGZ,oBAAXmI,QAA0BA,OAAOmwB,MAC1CP,EAAWQ,OAAO,CAACje,EAAGke,KACpBA,EAAIC,IAAItwB,OAAOmwB,QClCrB,MAAMP,GDwCGW,EAAkB,CACvBC,GAAI,mBACJC,QAAS,WACTnR,QAAAA,GACAqQ,QAAAA,GACAxD,UAAAA,GACAuE,MAAO,CACLC,OAAQ,CAAC,MAAO,QAChBrS,MAAO,CAAC,aACRjhB,IAAK,CAAC,QAAS,WC/CC,oBAAX2C,SACPA,OAAO4wB,WAAahB,IAGxB,MAAMniB,GAAQmiB,GAAWniB"}
|