@aspire-ui/element-component-pro 1.0.1 → 1.0.3
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/README.md +141 -7
- package/dist/ProForm/ApiSelect.vue.d.ts +67 -0
- package/dist/ProForm/ProForm.vue.d.ts +5 -1
- package/dist/ProForm/ProFormItem.vue.d.ts +4 -0
- package/dist/ProForm/TreeSelect.vue.d.ts +64 -0
- package/dist/ProTable/ProTable.vue.d.ts +421 -0
- package/dist/ProTable/TableAction.vue.d.ts +43 -0
- package/dist/ProTable/index.d.ts +8 -0
- package/dist/ProTable/types/index.d.ts +252 -0
- package/dist/ProTable/useProTable.d.ts +14 -0
- package/dist/element-component-pro.es.js +959 -302
- package/dist/element-component-pro.es.js.map +1 -1
- package/dist/element-component-pro.umd.js +2 -2
- package/dist/element-component-pro.umd.js.map +1 -1
- package/dist/index.d.ts +1369 -25
- package/dist/style.css +1 -1
- package/dist/types/index.d.ts +13 -51
- package/dist/useComponentSetting.d.ts +12 -0
- package/package.json +7 -5
- package/src/ProForm/ApiSelect.vue +85 -0
- package/src/ProForm/ProForm.vue +13 -3
- package/src/ProForm/ProFormItem.vue +53 -1
- package/src/ProForm/TreeSelect.vue +272 -0
- package/src/ProForm/useForm.ts +0 -1
- package/src/ProTable/ProTable.vue +773 -0
- package/src/ProTable/TableAction.vue +193 -0
- package/src/ProTable/index.ts +20 -0
- package/src/ProTable/types/index.ts +236 -0
- package/src/ProTable/useProTable.ts +79 -0
- package/src/index.ts +13 -10
- package/src/types/index.ts +26 -46
- package/src/useComponentSetting.ts +35 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element-component-pro.umd.js","sources":["../src/ProForm/ProFormItem.vue","../src/ProForm/ProForm.vue","../src/ProForm/useForm.ts","../src/index.ts"],"sourcesContent":["<template>\n <el-form-item\n v-if=\"shouldRender\"\n v-show=\"shouldShow\"\n :prop=\"schema.field\"\n :required=\"schema.required\"\n :rules=\"effectiveRules\"\n >\n <template slot=\"label\">\n <span>{{ schema.label }}</span>\n <el-tooltip\n v-if=\"schema.helpMessage\"\n placement=\"top\"\n effect=\"light\"\n v-bind=\"schema.helpComponentProps || {}\"\n >\n <template slot=\"content\">\n <template v-if=\"Array.isArray(schema.helpMessage)\">\n <div v-for=\"(msg, i) in schema.helpMessage\" :key=\"i\" class=\"ecp-pro-form-item__help-item\">\n {{ msg }}\n </div>\n </template>\n <span v-else>{{ schema.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-pro-form-item__help-icon\" />\n </el-tooltip>\n </template>\n <!-- render 自定义渲染 -->\n <template v-if=\"schema.render\">\n <component :is=\"renderComponent\" />\n </template>\n <!-- slot 自定义插槽(由 ProForm 传入 default slot) -->\n <slot v-else-if=\"hasSlot\" :model=\"formModel\" :schema=\"schema\" :field=\"schema.field\" :values=\"formModel\" />\n <!-- 默认组件渲染 -->\n <template v-else>\n <el-input\n v-if=\"schema.component === 'input' || !schema.component\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-input-number\n v-else-if=\"schema.component === 'input-number'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-select\n class=\"ecp-pro-form-item__select\"\n v-else-if=\"schema.component === 'select'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-option\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n />\n </el-select>\n <el-date-picker\n v-else-if=\"schema.component === 'date-picker'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-date-picker\n v-else-if=\"schema.component === 'date-range'\"\n v-model=\"formModel[schema.field]\"\n type=\"daterange\"\n range-separator=\"至\"\n start-placeholder=\"开始日期\"\n end-placeholder=\"结束日期\"\n value-format=\"yyyy-MM-dd\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-switch\n v-else-if=\"schema.component === 'switch'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-cascader\n v-else-if=\"schema.component === 'cascader'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-checkbox-group\n v-else-if=\"schema.component === 'checkbox'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-checkbox\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-checkbox>\n </el-checkbox-group>\n <el-radio-group\n v-else-if=\"schema.component === 'radio'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-radio\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-radio>\n </el-radio-group>\n </template>\n </el-form-item>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots, h } from 'vue'\nimport type { ProFormSchema, RenderCallbackParams } from '../types'\n\nconst props = defineProps<{\n schema: ProFormSchema\n formModel: Record<string, unknown>\n formDisabled?: boolean\n autoPlaceholder?: boolean\n formActionType?: import('../types').FormActionType\n}>()\n\nconst slots = useSlots()\n\nconst renderParams = computed<RenderCallbackParams>(() => ({\n schema: props.schema,\n values: props.formModel,\n model: props.formModel,\n field: props.schema.field,\n}))\n\nconst shouldRender = computed(() => {\n const ifShow = props.schema.ifShow\n if (ifShow === undefined) return true\n if (typeof ifShow === 'boolean') return ifShow\n return ifShow(renderParams.value)\n})\n\nconst shouldShow = computed(() => {\n const show = props.schema.show\n if (show === undefined) return true\n if (typeof show === 'boolean') return show\n return show(renderParams.value)\n})\n\nconst effectiveDisabled = computed(() => {\n if (props.formDisabled) return true\n const dyn = props.schema.dynamicDisabled\n if (dyn === undefined) return false\n if (typeof dyn === 'boolean') return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveRules = computed(() => {\n const dyn = props.schema.dynamicRules\n if (!dyn) return props.schema.rules\n if (Array.isArray(dyn)) return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveComponentPropsAndListeners = computed(() => {\n const cp = props.schema.componentProps\n if (!cp) return { props: {}, listeners: {} }\n const raw = typeof cp === 'function'\n ? cp({\n ...renderParams.value,\n formActionType: props.formActionType,\n })\n : { ...cp }\n const propsOnly: Record<string, unknown> = {}\n const listeners: Record<string, (...args: unknown[]) => unknown> = {}\n for (const [key, value] of Object.entries(raw)) {\n if (key.length > 2 && /^on[A-Za-z]/.test(key) && typeof value === 'function') {\n const eventName = key.slice(2).charAt(0).toLowerCase() + key.slice(3)\n listeners[eventName] = value as (...args: unknown[]) => unknown\n } else {\n propsOnly[key] = value\n }\n }\n return { props: propsOnly, listeners }\n})\n\nconst effectiveComponentProps = computed(() => effectiveComponentPropsAndListeners.value.props)\nconst effectiveComponentListeners = computed(() => effectiveComponentPropsAndListeners.value.listeners)\n\nconst hasSlot = computed(() => !!slots.default)\n\nconst getOptions = (props: Record<string, unknown>): Array<{ label: string; value: unknown }> | undefined => {\n const opts = props?.options\n return Array.isArray(opts) ? opts : undefined\n}\n\nconst renderComponent = computed(() => {\n const renderFn = props.schema.render\n if (!renderFn) return null\n return {\n render() {\n const result = renderFn(renderParams.value)\n if (Array.isArray(result)) {\n return h('span', result)\n }\n return result\n },\n }\n})\n</script>\n\n<style scoped>\n.ecp-pro-form-item__help-icon {\n margin-left: 4px;\n color: #909399;\n cursor: help;\n font-size: 14px;\n}\n.ecp-pro-form-item__help-icon:hover {\n color: #409eff;\n}\n.ecp-pro-form-item__help-item {\n margin-bottom: 4px;\n}\n.ecp-pro-form-item__help-item:last-child {\n margin-bottom: 0;\n}\n</style>\n","<template>\n <div ref=\"formWrapRef\" class=\"ecp-pro-form\">\n <el-form class=\"ecp-pro-form\" ref=\"formRef\" :model=\"formModel\" :rules=\"formRules\" :label-width=\"effectiveProps.labelWidth\"\n :label-position=\"effectiveProps.labelPosition\" :size=\"effectiveProps.size\" :disabled=\"effectiveProps.disabled\"\n v-bind=\"$attrs\" v-on=\"formListeners\">\n <slot name=\"formHeader\" />\n <el-row :gutter=\"effectiveProps.gutter\" :style=\"effectiveProps.baseRowStyle\">\n <template v-for=\"schema in displaySchemas\">\n <el-col v-if=\"shouldShow(schema)\" :key=\"schema.field\" v-bind=\"getColProps(schema)\"\n :offset=\"schema.colProps?.offset ?? effectiveProps.baseColProps?.offset ?? 0\" :data-field=\"schema.field\">\n <ProFormItem :schema=\"schema\" :form-model=\"formModel\" :form-disabled=\"effectiveProps.disabled\"\n :auto-placeholder=\"effectiveProps.autoSetPlaceholder\" :form-action-type=\"formActionRef\">\n <template v-if=\"slots[getSlotName(schema)]\">\n <slot :name=\"getSlotName(schema)\" :model=\"formModel\" :schema=\"schema\" :field=\"schema.field\"\n :values=\"formModel\" />\n </template>\n </ProFormItem>\n </el-col>\n </template>\n <el-col class=\"ecp-pro-form_col\" v-if=\"effectiveProps.showActionButtonGroup\"\n v-bind=\"hasMoreFields ? { span: 24 } : effectiveProps.actionColOptions || { span: 6 }\">\n <FormActions :show-action-button-group=\"effectiveProps.showActionButtonGroup\"\n :show-submit-button=\"effectiveProps.showSubmitButton\" :show-reset-button=\"effectiveProps.showResetButton\"\n :submit-button-text=\"effectiveProps.submitButtonText\" :reset-button-text=\"effectiveProps.resetButtonText\"\n :submit-button-icon=\"effectiveProps.submitButtonIcon\" :reset-button-icon=\"effectiveProps.resetButtonIcon\"\n :submit-loading=\"submitLoading\" :show-advanced-button=\"effectiveProps.showAdvancedButton\"\n :has-more-fields=\"hasMoreFields\" :collapsed=\"collapsed\" :action-col-options=\"effectiveActionColOptions\"\n @submit=\"handleSubmit\" @reset=\"handleReset\" @toggle=\"collapsed = !collapsed\">\n <template slot=\"submitBefore\">\n <slot name=\"submitBefore\" />\n </template>\n <template slot=\"resetBefore\">\n <slot name=\"resetBefore\" />\n </template>\n <template slot=\"advanceBefore\">\n <slot name=\"advanceBefore\" />\n </template>\n <template slot=\"advanceAfter\">\n <slot name=\"advanceAfter\" />\n </template>\n <template slot=\"actions\">\n <slot name=\"actions\" />\n </template>\n </FormActions>\n </el-col>\n </el-row>\n <el-button v-if=\"effectiveProps.showAdvancedButton && hasMoreFields\" type=\"text\" class=\"ecp-form-actions__advance\"\n @click=\"collapsed = !collapsed\">\n <i class=\"el-icon-d-arrow-left\" :class=\"collapsed ? 'down' : 'up'\" />\n {{ collapsed ? '展开' : '收起' }}\n </el-button>\n <slot name=\"formFooter\" />\n </el-form>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, useSlots, onMounted, onUnmounted } from 'vue'\nimport ProFormItem from './ProFormItem.vue'\nimport FormActions from './FormActions.vue'\nimport type { ProFormSchema, ProFormProps, FormActionType, ColEx, ScrollToFieldOptions, FormListeners } from '../types'\n\nconst props = withDefaults(\n defineProps<{\n schemas?: ProFormSchema[]\n initialValues?: Record<string, unknown>\n labelWidth?: string\n labelPosition?: 'left' | 'right' | 'top'\n gutter?: number\n size?: 'medium' | 'small' | 'large'\n disabled?: boolean\n baseColProps?: ColEx\n baseRowStyle?: Record<string, string | number>\n autoSetPlaceholder?: boolean\n showSubmitButton?: boolean\n showResetButton?: boolean\n submitButtonText?: string\n resetButtonText?: string\n submitButtonIcon?: string\n resetButtonIcon?: string\n showActionButtonGroup?: boolean\n actionColOptions?: ColEx\n showAdvancedButton?: boolean\n autoAdvancedLine?: number\n alwaysShowLines?: number\n submitFunc?: () => Promise<void>\n resetFunc?: () => Promise<void>\n submitOnReset?: boolean\n formListeners?: FormListeners\n }>(),\n {\n labelWidth: '120px',\n labelPosition: 'right',\n gutter: 24,\n size: 'medium',\n autoSetPlaceholder: true,\n showSubmitButton: true,\n showResetButton: true,\n submitButtonText: '提交',\n resetButtonText: '重置',\n submitButtonIcon: 'el-icon-search',\n resetButtonIcon: 'el-icon-refresh-left',\n showActionButtonGroup: true,\n showAdvancedButton: false,\n autoAdvancedLine: 3,\n alwaysShowLines: 1,\n baseColProps: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n actionColOptions: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n submitOnReset: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'submit', values: Record<string, unknown>): void\n (e: 'reset'): void\n (e: 'register', formAction: FormActionType): void\n}>()\nconst slots = useSlots()\nconst formRef = ref()\nconst formWrapRef = ref()\nconst submitLoading = ref(false)\nconst collapsed = ref(true)\nconst formModel = ref<Record<string, unknown>>({})\nconst formRules = ref<Record<string, unknown[]>>({})\nconst innerSchemas = ref<ProFormSchema[]>([])\nconst innerProps = ref<Partial<ProFormProps>>({})\n\n/** Element UI 栅格断点 (px) */\nconst BREAKPOINTS = { xl: 1920, lg: 1200, md: 992, sm: 768 }\n\n/** 根据当前视口宽度获取 ColEx 的有效 span(与 el-col 断点逻辑一致) */\nconst getEffectiveSpan = (colProps?: ColEx | null, baseColProps?: ColEx | null, width?: number): number => {\n const w = width ?? (typeof window !== 'undefined' ? window.innerWidth : 1920)\n const col = colProps ?? {}\n const base = baseColProps ?? {}\n const fallback = base.span ?? 8\n if (w >= BREAKPOINTS.xl) return col.xl ?? base.xl ?? col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.lg) return col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.md) return col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n // if (w < BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n return col.xs ?? base.xs ?? col.span ?? fallback\n}\n\nconst effectiveProps = computed(() => ({ ...props, ...innerProps.value }))\nconst effectiveActionColOptions = computed(() => effectiveProps.value.actionColOptions ?? { span: 24 })\n\n/** 当前视口宽度,用于响应式计算 span */\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1920)\n\n/** 计算前 maxLines 行能容纳的 schema 数量(考虑栅格断点,每个 field 可有自己的 span) */\nconst getVisibleSchemaCount = (\n schemas: ProFormSchema[],\n baseColProps: ColEx | undefined,\n maxLines: number,\n width: number\n) => {\n let remaining = 24\n let rows = 1\n let count = 0\n for (const schema of schemas) {\n const span = getEffectiveSpan(schema.colProps, baseColProps, width)\n if (span > remaining) {\n rows++\n if (rows > maxLines) break\n remaining = 24 - span\n } else {\n remaining -= span\n }\n count++\n }\n return count\n}\n\nconst hasMoreFields = computed(() => {\n const schemas = innerSchemas.value.filter((s) => shouldShow(s))\n\n if (!effectiveProps.value.showAdvancedButton) return false\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n console.log(schemas.length, maxVisible)\n return schemas.length > maxVisible\n})\n\nconst formListeners = computed((): FormListeners => {\n return effectiveProps.value.formListeners ?? {}\n})\n\nconst displaySchemas = computed(() => {\n const schemas = innerSchemas.value.filter((s) => {\n return shouldShow(s)\n })\n if (!effectiveProps.value.showAdvancedButton || !collapsed.value) return schemas\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n return schemas.slice(0, maxVisible)\n})\n\nconst shouldShow = (schema: ProFormSchema) => {\n let ifShow = true\n let show = true\n if (typeof schema.ifShow === 'function') {\n ifShow = schema.ifShow({ schema, values: formModel.value, model: formModel.value, field: schema.field })\n }\n if (typeof schema.ifShow === 'boolean') {\n ifShow = schema.ifShow\n }\n if (typeof schema.show === 'function') {\n show = schema.show({ schema, values: formModel.value, model: formModel.value, field: schema.field })\n }\n if (typeof schema.show === 'boolean') {\n show = schema.show\n }\n return ifShow && show\n}\nconst getColProps = (schema: ProFormSchema) => {\n return schema.colProps ?? effectiveProps.value.baseColProps ?? {}\n}\nconst getSlotName = (schema: ProFormSchema) => schema.slot || schema.field\n\nconst initForm = () => {\n const model: Record<string, unknown> = {}\n const rules: Record<string, unknown[]> = {}\n const initialValues = effectiveProps.value.initialValues ?? props.initialValues\n innerSchemas.value.forEach((schema) => {\n model[schema.field] = schema.defaultValue ?? initialValues?.[schema.field]\n if (schema.rules?.length) rules[schema.field] = schema.rules\n })\n formModel.value = { ...formModel.value, ...model }\n formRules.value = rules\n}\n\nconst filterByIfShow = (values: Record<string, unknown>) => {\n const result = { ...values }\n innerSchemas.value.forEach((schema) => {\n const ifShow = schema.ifShow\n if (ifShow === undefined) return\n const visible = typeof ifShow === 'boolean' ? ifShow : ifShow({ schema, values, model: values, field: schema.field })\n if (!visible) delete result[schema.field]\n })\n return result\n}\n\nconst processFieldMapToTime = (values: Record<string, unknown>) => {\n const filtered = filterByIfShow(values)\n const fieldMap = innerProps.value.fieldMapToTime\n if (!fieldMap?.length) return filtered\n const result = { ...filtered }\n fieldMap.forEach(([field, [startKey, endKey]]) => {\n const val = result[field]\n if (Array.isArray(val) && val.length === 2) {\n delete result[field]\n ; (result as Record<string, unknown>)[startKey] = val[0]\n ; (result as Record<string, unknown>)[endKey] = val[1]\n }\n })\n return result\n}\n\nconst handleSubmit = async () => {\n try {\n await formRef.value?.validate()\n if (effectiveProps.value.submitFunc) {\n await effectiveProps.value.submitFunc()\n } else {\n submitLoading.value = true\n emit('submit', processFieldMapToTime({ ...formModel.value }))\n }\n } catch (e) {\n console.error('Form validation failed:', e)\n } finally {\n submitLoading.value = false\n }\n}\n\nconst handleReset = async () => {\n if (effectiveProps.value.resetFunc) {\n await effectiveProps.value.resetFunc()\n } else {\n formRef.value?.resetFields()\n initForm()\n emit('reset')\n if (effectiveProps.value.submitOnReset) await handleSubmit()\n }\n}\n\nconst setFieldsValue = (values: Record<string, unknown>) => {\n formModel.value = { ...formModel.value, ...values }\n return Promise.resolve()\n}\n\nconst getFieldsValue = () => processFieldMapToTime({ ...formModel.value })\n\nconst resetFields = async () => {\n formRef.value?.resetFields()\n initForm()\n}\n\nconst validate = (nameList?: string[]) =>\n formRef.value?.validate(nameList) ?? Promise.resolve()\n\nconst validateFields = (nameList?: string[]) => {\n if (!formRef.value) return Promise.resolve()\n if (!nameList?.length) return formRef.value.validate()\n return Promise.all(nameList.map((prop) => new Promise((resolve, reject) => {\n formRef.value.validateField(prop, (valid: boolean) => (valid ? resolve(undefined) : reject(new Error('Validation failed'))))\n })))\n}\n\nconst scrollToField = async (name: string, options?: ScrollToFieldOptions) => {\n const el = formWrapRef.value?.querySelector(`[data-field=\"${name}\"]`)\n if (el) {\n el.scrollIntoView({ behavior: options?.behavior ?? 'smooth', block: options?.block ?? 'nearest' })\n }\n return Promise.resolve()\n}\n\nconst clearValidate = (name?: string | string[]) => {\n formRef.value?.clearValidate(name)\n}\n\nconst updateSchema = async (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => {\n const list = Array.isArray(data) ? data : [data]\n list.forEach((item) => {\n const idx = innerSchemas.value.findIndex((s) => s.field === item.field)\n if (idx >= 0) innerSchemas.value[idx] = { ...innerSchemas.value[idx], ...item }\n })\n}\n\nconst appendSchemaByField = async (schema: ProFormSchema, prefixField?: string, first?: boolean) => {\n if (first) innerSchemas.value.unshift(schema)\n else if (prefixField) {\n const idx = innerSchemas.value.findIndex((s) => s.field === prefixField)\n innerSchemas.value.splice(idx + 1, 0, schema)\n } else innerSchemas.value.push(schema)\n initForm()\n}\n\nconst removeSchemaByField = async (field: string | string[]) => {\n const fields = Array.isArray(field) ? field : [field]\n innerSchemas.value = innerSchemas.value.filter((s) => !fields.includes(s.field))\n}\n\nconst setProps = async (formProps: Partial<ProFormProps>) => {\n innerProps.value = { ...innerProps.value, ...formProps }\n if (formProps.schemas) {\n innerSchemas.value = [...formProps.schemas]\n debugger\n initForm()\n }\n}\n\nconst formActionRef: FormActionType = {\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit: handleSubmit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n}\n\ndefineExpose(formActionRef)\n\nconst syncSchemas = () => {\n innerSchemas.value = [...(props.schemas ?? [])]\n initForm()\n}\n\nconst handleResize = () => {\n if (typeof window !== 'undefined') windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n syncSchemas()\n emit('register', formActionRef)\n if (typeof window !== 'undefined') window.addEventListener('resize', handleResize)\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') window.removeEventListener('resize', handleResize)\n})\n\nwatch(() => [props.schemas, props.initialValues], syncSchemas, { deep: true })\n</script>\n\n<style scoped>\n.ecp-pro-form {\n padding: 16px;\n position: relative;\n}\n\n.ecp-pro-form__advance {\n margin-bottom: 16px;\n}\n\n.ecp-pro-form_col {\n position: relative;\n float: right;\n}\n\n.el-icon-d-arrow-left.up {\n transform: rotate(90deg);\n}\n\n.el-icon-d-arrow-left.down {\n transform: rotate(-90deg);\n}\n\n.ecp-form-actions__advance {\n position: absolute;\n bottom: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n</style>\n","import { ref, watch, unref, type Ref } from 'vue'\nimport type { ProFormSchema, ProFormProps, FormActionType } from '../types'\n\nexport interface UseFormProps extends ProFormProps {\n schemas?: ProFormSchema[]\n}\n\n/** 支持 ref/computed 的 props(参考 Vben Admin:参数 props 内的值可以是 computed 或者 ref 类型) */\nexport type UseFormPropsReactive = UseFormProps | Ref<UseFormProps | undefined>\n\nexport interface UseFormReturn {\n /** 用于 @register,接收表单实例的 formAction */\n register: (formAction: FormActionType) => void\n formAction: { value: FormActionType | null }\n getFieldsValue: () => Record<string, unknown>\n setFieldsValue: (values: Record<string, unknown>) => Promise<void>\n resetFields: () => Promise<void>\n validate: (nameList?: string[]) => Promise<unknown>\n validateFields: (nameList?: string[]) => Promise<unknown>\n submit: () => Promise<void>\n scrollToField: (name: string, options?: import('../types').ScrollToFieldOptions) => Promise<void>\n clearValidate: (name?: string | string[]) => void\n updateSchema: (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => Promise<void>\n appendSchemaByField: (schema: ProFormSchema, prefixField?: string, first?: boolean) => Promise<void>\n removeSchemaByField: (field: string | string[]) => Promise<void>\n setProps: (props: Partial<ProFormProps>) => Promise<void>\n}\n\nexport function useForm(props?: UseFormPropsReactive): [UseFormReturn['register'], Omit<UseFormReturn, 'register'>] {\n const formAction = ref<FormActionType | null>(null)\n const formPropsRef = ref<UseFormProps | undefined>(props ? unref(props as Ref<UseFormProps | undefined>) : undefined)\n\n const getFormProps = () => (props ? unref(props as Ref<UseFormProps | undefined>) : undefined) as UseFormProps | undefined\n\n const register = (action: FormActionType) => {\n formAction.value = action\n const formProps = getFormProps()\n debugger\n if (formProps && Object.keys(formProps).length > 0) {\n action.setProps(formProps)\n }\n }\n\n if (props) {\n watch(\n () => getFormProps(),\n (formProps) => {\n formPropsRef.value = formProps\n if (formProps && formAction.value) {\n formAction.value.setProps(formProps)\n }\n },\n { deep: true }\n )\n }\n\n const getFieldsValue = () => formAction.value?.getFieldsValue() ?? {}\n\n const setFieldsValue = async (values: Record<string, unknown>) => {\n await formAction.value?.setFieldsValue(values)\n }\n\n const resetFields = async () => {\n await formAction.value?.resetFields()\n }\n\n const validate = (nameList?: string[]) =>\n formAction.value?.validate(nameList) ?? Promise.resolve()\n\n const validateFields = (nameList?: string[]) =>\n formAction.value?.validateFields(nameList) ?? Promise.resolve()\n\n const submit = () => formAction.value?.submit() ?? Promise.resolve()\n\n const scrollToField = (name: string, options?: import('../types').ScrollToFieldOptions) =>\n formAction.value?.scrollToField(name, options) ?? Promise.resolve()\n\n const clearValidate = (name?: string | string[]) => {\n formAction.value?.clearValidate(name)\n }\n\n const updateSchema = (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) =>\n formAction.value?.updateSchema(data) ?? Promise.resolve()\n\n const appendSchemaByField = (schema: ProFormSchema, prefixField?: string, first?: boolean) =>\n formAction.value?.appendSchemaByField(schema, prefixField, first) ?? Promise.resolve()\n\n const removeSchemaByField = (field: string | string[]) =>\n formAction.value?.removeSchemaByField(field) ?? Promise.resolve()\n\n const setProps = async (formProps: Partial<ProFormProps>) => {\n formPropsRef.value = { ...formPropsRef.value, ...formProps }\n await formAction.value?.setProps(formProps)\n }\n\n const result: UseFormReturn = {\n register,\n formAction,\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n }\n\n return [register, result]\n}\n","import type { VueConstructor } from 'vue'\n// import ProTable from './ProTable'\nimport ProForm, { ProFormItem, FormActions } from './ProForm'\n// import ProCard from './ProCard'\n// import ProDescriptions from './ProDescriptions'\nimport { useForm } from './ProForm/useForm'\n\nexport { ProForm, ProFormItem, FormActions, useForm }\nexport * from './types'\n\nconst components = [\n // { name: 'ProTable', component: ProTable },\n { name: 'ProForm', component: ProForm },\n { name: 'ProFormItem', component: ProFormItem },\n { name: 'FormActions', component: FormActions }\n // { name: 'ProCard', component: ProCard },\n // { name: 'ProDescriptions', component: ProDescriptions },\n]\n\nexport function install(Vue: VueConstructor) {\n components.forEach(({ name, component }) => {\n Vue.component(name, component)\n })\n}\n\nexport default {\n install,\n // ProTable,\n ProForm,\n // ProCard,\n // ProDescriptions,\n}\n"],"names":["slots","useSlots","renderParams","computed","props","shouldRender","ifShow","shouldShow","show","effectiveDisabled","dyn","effectiveRules","effectiveComponentPropsAndListeners","cp","raw","propsOnly","listeners","key","value","eventName","effectiveComponentProps","effectiveComponentListeners","hasSlot","getOptions","opts","renderComponent","renderFn","result","h","formRef","ref","formWrapRef","submitLoading","collapsed","formModel","formRules","innerSchemas","innerProps","BREAKPOINTS","getEffectiveSpan","colProps","baseColProps","width","w","col","base","fallback","effectiveProps","effectiveActionColOptions","windowWidth","getVisibleSchemaCount","schemas","maxLines","remaining","rows","count","schema","span","hasMoreFields","s","lines","maxVisible","formListeners","displaySchemas","getColProps","getSlotName","initForm","model","rules","initialValues","_a","filterByIfShow","values","processFieldMapToTime","filtered","fieldMap","field","startKey","endKey","val","handleSubmit","emit","e","handleReset","setFieldsValue","getFieldsValue","resetFields","validate","nameList","validateFields","prop","resolve","reject","valid","scrollToField","name","options","el","clearValidate","updateSchema","data","item","idx","appendSchemaByField","prefixField","first","removeSchemaByField","fields","setProps","formProps","formActionRef","expose","syncSchemas","handleResize","onMounted","onUnmounted","watch","useForm","formAction","formPropsRef","unref","getFormProps","register","action","components","ProForm","ProFormItem","FormActions","install","Vue","component","index"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"element-component-pro.umd.js","sources":["../src/useComponentSetting.ts","../src/ProTable/ProTable.vue","../src/ProTable/TableAction.vue","../src/ProTable/useProTable.ts","../src/ProForm/ApiSelect.vue","../src/ProForm/TreeSelect.vue","../src/ProForm/ProFormItem.vue","../src/ProForm/ProForm.vue","../src/ProForm/useForm.ts","../src/index.ts"],"sourcesContent":["import { reactive } from 'vue'\n\n/** 组件默认配置存储:组件名 -> 默认 props/配置 */\nconst componentSettings = reactive<Record<string, Record<string, unknown>>>({})\n\nexport interface UseComponentSettingReturn {\n /** 获取组件默认配置;不传参时返回全部组件的配置 */\n getSetting: (componentName?: string) => Record<string, unknown>\n /** 设置组件默认配置(与已有配置浅合并) */\n setSetting: (componentName: string, config: Record<string, unknown>) => void\n}\n\n/**\n * 组件默认配置:供所有组件统一获取/设置默认配置\n * - getSetting:获取组件默认配置,用于初始化或合并 props\n * - setSetting:设置组件默认配置,可在应用入口或按需调用\n */\nexport function useComponentSetting(): UseComponentSettingReturn {\n const getSetting = (componentName?: string): Record<string, unknown> => {\n if (componentName === undefined) {\n return { ...componentSettings }\n }\n return { ...(componentSettings[componentName] ?? {}) }\n }\n\n const setSetting = (componentName: string, config: Record<string, unknown>): void => {\n const current = componentSettings[componentName]\n componentSettings[componentName] = current ? { ...current, ...config } : { ...config }\n }\n\n return {\n getSetting,\n setSetting,\n }\n}\n","<template>\n <div class=\"ecp-pro-table\">\n <!-- 标题栏 -->\n <div v-if=\"showTitleBar\" class=\"ecp-pro-table__header\">\n <div class=\"ecp-pro-table__title-wrapper\">\n <span class=\"ecp-pro-table__title\">{{ effectiveProps.title }}</span>\n <el-tooltip v-if=\"effectiveProps.titleHelpMessage\" class=\"ecp-pro-table__help\" placement=\"top\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(effectiveProps.titleHelpMessage)\">\n <div v-for=\"(msg, i) in effectiveProps.titleHelpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ effectiveProps.titleHelpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </div>\n <div class=\"ecp-pro-table__toolbar\">\n <slot name=\"tableTitle\" />\n <slot name=\"toolbar\" />\n <slot name=\"toolbar-right\">\n <el-button\n v-if=\"effectiveProps.tableSetting?.redo !== false\"\n type=\"text\"\n icon=\"el-icon-refresh\"\n size=\"small\"\n @click=\"handleReload\"\n >\n 刷新\n </el-button>\n </slot>\n </div>\n </div>\n\n <!-- 表格主体(Element UI el-table 无 loading 属性,使用 v-loading 指令) -->\n <div ref=\"tableWrapRef\" class=\"ecp-pro-table__body\" v-loading=\"loading\">\n <el-table\n ref=\"tableRef\"\n :data=\"innerData\"\n :row-key=\"effectiveProps.rowKey\"\n :border=\"effectiveProps.bordered\"\n :stripe=\"effectiveProps.striped\"\n :size=\"effectiveProps.size\"\n :max-height=\"effectiveProps.maxHeight\"\n :height=\"effectiveProps.height\"\n :default-sort=\"effectiveProps.defaultSort\"\n :span-method=\"effectiveProps.spanMethod\"\n :tree-props=\"effectiveProps.treeProps\"\n :default-expand-all=\"effectiveProps.defaultExpandAll\"\n :expand-row-keys=\"effectiveProps.expandRowKeys || []\"\n :lazy=\"effectiveProps.lazy\"\n :load=\"effectiveProps.load\"\n v-bind=\"effectiveProps.tableProps\"\n :row-class-name=\"effectiveProps.rowClassName\"\n @row-click=\"handleRowClick\"\n @row-dblclick=\"handleRowDblclick\"\n @sort-change=\"handleSortChange\"\n @expand-change=\"handleExpandChange\"\n >\n <!-- 选择列:自定义实现,参考 VbenAdmin,支持单选/多选/禁用/跨页 -->\n <el-table-column\n v-if=\"effectiveProps.rowSelection\"\n :width=\"effectiveProps.rowSelection.width || 48\"\n :fixed=\"effectiveProps.rowSelection.fixed\"\n align=\"center\"\n >\n <template slot=\"header\" slot-scope=\"_\">\n <!-- 多选:表头全选 -->\n <el-checkbox\n v-if=\"effectiveProps.rowSelection.type !== 'radio'\"\n :value=\"isAllCurrentPageSelected\"\n :indeterminate=\"isIndeterminate\"\n :disabled=\"!hasSelectableRows\"\n @change=\"handleSelectAll\"\n />\n <span v-else />\n </template>\n <template slot-scope=\"scope\">\n <!-- 多选 -->\n <el-checkbox\n v-if=\"effectiveProps.rowSelection.type !== 'radio'\"\n :value=\"isRowSelected(scope.row)\"\n :disabled=\"getCheckboxDisabled(scope.row)\"\n @change=\"(val) => handleCheckboxChange(scope.row, val)\"\n @click.native.stop\n />\n <!-- 单选 -->\n <el-radio\n v-else\n :value=\"selectedRows[0]?.[rowKeyField]\"\n :label=\"scope.row[rowKeyField]\"\n :disabled=\"getRadioDisabled(scope.row)\"\n @change=\"handleRadioSelect(scope.row)\"\n @click.native.stop\n >\n <span />\n </el-radio>\n </template>\n </el-table-column>\n <!-- 序号列 -->\n <el-table-column\n v-if=\"effectiveProps.showIndexColumn\"\n type=\"index\"\n :label=\"effectiveProps.indexColumnProps?.title || '序号'\"\n :width=\"effectiveProps.indexColumnProps?.width || 60\"\n :fixed=\"effectiveProps.indexColumnProps?.fixed\"\n :align=\"effectiveProps.indexColumnProps?.align || 'center'\"\n />\n <!-- 数据列 -->\n <template v-for=\"col in displayColumns\">\n <el-table-column\n v-if=\"shouldShowColumn(col)\"\n :key=\"col.dataIndex || col.key || col.title\"\n :prop=\"col.dataIndex\"\n :label=\"col.title\"\n :width=\"getColumnWidth(col)\"\n :min-width=\"isRatioWidth(col.width) ? undefined : col.minWidth\"\n :fixed=\"col.fixed\"\n :align=\"col.align || 'left'\"\n :sortable=\"col.sortable\"\n :formatter=\"col.formatter\"\n :show-overflow-tooltip=\"col.ellipsis !== false && effectiveProps.ellipsis !== false\"\n >\n <template slot=\"header\" slot-scope=\"_\">\n <!-- 1. 列级自定义表头:header-[dataIndex],例如 #header-age -->\n <slot\n v-if=\"col.dataIndex && $scopedSlots[`header-${col.dataIndex}`]\"\n :name=\"`header-${col.dataIndex}`\"\n :column=\"col\"\n />\n <!-- 2. 全局表头渲染:headerCell,类似 Vben 的 headerCell 用法 -->\n <slot\n v-else-if=\"$scopedSlots['headerCell']\"\n name=\"headerCell\"\n :column=\"col\"\n />\n <!-- 3. 默认表头渲染:标题 + helpMessage 提示 -->\n <template v-else>\n <span>{{ col.title }}</span>\n <el-tooltip v-if=\"col.helpMessage\" class=\"ecp-pro-table__col-help\" placement=\"top\" effect=\"dark\">\n <template slot=\"content\">\n <span v-if=\"Array.isArray(col.helpMessage)\">\n <div v-for=\"(msg, i) in col.helpMessage\" :key=\"i\">{{ msg }}</div>\n </span>\n <span v-else>{{ col.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question\" />\n </el-tooltip>\n </template>\n </template>\n <template slot-scope=\"scope\">\n <slot\n v-if=\"col.dataIndex && $scopedSlots[col.dataIndex]\"\n :name=\"col.dataIndex\"\n :row=\"scope.row\"\n :column=\"col\"\n :index=\"scope.$index\"\n :value=\"scope.row[col.dataIndex]\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"col\"\n :record=\"scope.row\"\n :index=\"scope.$index\"\n :value=\"scope.row[col.dataIndex]\"\n :custom-render=\"col.customRender\"\n :value-enum=\"col.valueEnum\"\n />\n <DefaultCellRenderer v-else :column=\"col\" :record=\"scope.row\" :index=\"scope.$index\" :value=\"scope.row[col.dataIndex]\" />\n </template>\n </el-table-column>\n </template>\n <!-- 操作列 -->\n <el-table-column\n v-if=\"effectiveProps.actionColumn\"\n :label=\"effectiveProps.actionColumn.title || '操作'\"\n :width=\"effectiveProps.actionColumn.width || 150\"\n :fixed=\"effectiveProps.actionColumn.fixed || 'right'\"\n :align=\"effectiveProps.actionColumn.align || 'center'\"\n >\n <template slot-scope=\"scope\">\n <slot\n v-if=\"$scopedSlots['action']\"\n name=\"action\"\n :record=\"scope.row\"\n :column=\"effectiveProps.actionColumn\"\n :index=\"scope.$index\"\n />\n <BodyCellRenderer\n v-else-if=\"$scopedSlots['bodyCell']\"\n :slot-render=\"$scopedSlots['bodyCell']\"\n :column=\"effectiveProps.actionColumn\"\n :record=\"scope.row\"\n :index=\"scope.$index\"\n :value=\"undefined\"\n :custom-render=\"effectiveProps.actionColumn.customRender\"\n :value-enum=\"effectiveProps.actionColumn.valueEnum\"\n />\n </template>\n </el-table-column>\n </el-table>\n </div>\n\n <!-- 分页 -->\n <div v-if=\"showPagination\" class=\"ecp-pro-table__pagination\">\n <el-pagination\n :current-page=\"pagination.page\"\n :page-sizes=\"pagination.pageSizes\"\n :page-size=\"pagination.pageSize\"\n :total=\"pagination.total\"\n :layout=\"(effectiveProps.pagination && typeof effectiveProps.pagination === 'object' ? effectiveProps.pagination.layout : null) || 'total, sizes, prev, pager, next, jumper'\"\n v-bind=\"(effectiveProps.pagination && typeof effectiveProps.pagination === 'object' && effectiveProps.pagination.props) || {}\"\n @size-change=\"handleSizeChange\"\n @current-change=\"handleCurrentChange\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// @ts-nocheck - Vue 2 el-table-column slot-scope 类型推断存在已知限制,暂用此方式消除模板内 scope 相关告警\nimport { ref, computed, watch, onMounted, onUnmounted, useSlots, nextTick, defineComponent, h } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport type { ProColumn, ProTableProps, TableActionType, FetchSetting, FetchParams } from './types'\n\nconst DefaultCellRenderer = defineComponent({\n name: 'EcpProTableDefaultCellRenderer',\n props: {\n column: { type: Object, required: true },\n record: { type: Object, required: true },\n index: { type: Number, required: true },\n value: { required: false },\n },\n setup(p) {\n return () => {\n const col = p.column as any\n if (col?.customRender) {\n const r = col.customRender({ text: p.value, record: p.record, index: p.index })\n if (typeof r === 'string' || typeof r === 'number') return h('span', String(r))\n return r as any\n }\n if (col?.valueEnum) {\n const text = col.valueEnum?.[p.value]?.text ?? p.value\n return h('span', text == null ? '' : String(text))\n }\n return h('span', p.value == null ? '' : String(p.value))\n }\n },\n})\n\nconst BodyCellRenderer = defineComponent({\n name: 'EcpProTableBodyCellRenderer',\n props: {\n slotRender: { type: Function, required: true },\n column: { type: Object, required: true },\n record: { type: Object, required: true },\n index: { type: Number, required: true },\n value: { required: false },\n customRender: { type: Function, required: false },\n valueEnum: { type: Object, required: false },\n },\n setup(p) {\n return () => {\n const slot = p.slotRender as any\n const nodes = slot?.({ column: p.column, record: p.record, index: p.index, value: p.value })\n\n const normalize = (n: any) => {\n if (n == null) return []\n if (Array.isArray(n)) return n.filter((x) => x != null && x !== false && !x.isComment)\n return [n]\n }\n const normalized = normalize(nodes)\n if (normalized.length > 0) return nodes\n\n // slot 未返回内容时,回退到默认渲染(对齐 vbenAdmin bodyCell 用法)\n const col = { ...(p.column as any) }\n if (p.customRender) col.customRender = p.customRender\n if (p.valueEnum) col.valueEnum = p.valueEnum\n return h(DefaultCellRenderer as any, { props: { column: col, record: p.record, index: p.index, value: p.value } })\n }\n },\n})\n\nconst props = withDefaults(\n defineProps<{\n columns?: ProColumn[]\n dataSource?: Record<string, unknown>[]\n api?: (params: Record<string, unknown>) => Promise<{ list?: unknown[]; items?: unknown[]; total?: number }>\n rowKey?: string\n title?: string\n titleHelpMessage?: string | string[]\n bordered?: boolean\n striped?: boolean\n size?: 'medium' | 'small' | 'large'\n loading?: boolean\n maxHeight?: number | string\n height?: number | string\n ellipsis?: boolean\n showIndexColumn?: boolean\n indexColumnProps?: Partial<ProColumn>\n actionColumn?: Partial<ProColumn>\n rowSelection?: { type?: 'checkbox' | 'radio'; width?: number; fixed?: 'left' | 'right'; getCheckboxProps?: (r: Record<string, unknown>) => { disabled?: boolean }; getRadioProps?: (r: Record<string, unknown>) => { disabled?: boolean } }\n clearSelectOnPageChange?: boolean\n pagination?: false | { pageSize?: number; pageSizes?: number[]; layout?: string; props?: Record<string, unknown> } | Record<string, unknown>\n tableSetting?: { redo?: boolean; size?: boolean; setting?: boolean; fullScreen?: boolean }\n fetchSetting?: FetchSetting\n beforeFetch?: (params: Record<string, unknown>) => Record<string, unknown>\n afterFetch?: (data: unknown) => unknown\n immediate?: boolean\n searchInfo?: Record<string, unknown>\n defaultSort?: { prop: string; order: 'ascending' | 'descending' }\n tableProps?: Record<string, unknown>\n rowClassName?: string | ((params: { row: Record<string, unknown>; rowIndex: number }) => string)\n spanMethod?: (params: { row: Record<string, unknown>; column: Record<string, unknown>; rowIndex: number; columnIndex: number }) => [number, number] | { rowspan: number; colspan: number }\n treeProps?: { hasChildren?: string; children?: string }\n defaultExpandAll?: boolean\n expandRowKeys?: (string | number)[]\n lazy?: boolean\n load?: (row: Record<string, unknown>, treeNode: { level: number; expanded: boolean; loaded: boolean }, resolve: (data: Record<string, unknown>[]) => void) => void\n }>(),\n {\n rowKey: 'id',\n clearSelectOnPageChange: false,\n bordered: false,\n striped: true,\n size: 'medium',\n loading: false,\n ellipsis: true,\n showIndexColumn: true,\n pagination: () => ({ pageSize: 10, pageSizes: [10, 20, 50, 100] }),\n tableSetting: () => ({ redo: true }),\n fetchSetting: () => ({\n pageField: 'page',\n sizeField: 'pageSize',\n listField: 'list',\n totalField: 'total',\n }),\n immediate: true,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'register', action: TableActionType): void\n (e: 'fetch-success', data: { items: unknown[]; total: number }): void\n (e: 'fetch-error', error: unknown): void\n (e: 'selection-change', data: { keys: (string | number)[]; rows: Record<string, unknown>[] }): void\n (e: 'row-click', record: Record<string, unknown>, event: Event): void\n (e: 'row-dblclick', record: Record<string, unknown>, event: Event): void\n (e: 'sort-change', sortInfo: { prop: string; order: string }): void\n (e: 'expand-change', row: Record<string, unknown>, expanded: boolean | Record<string, unknown>[]): void\n}>()\n\nconst slots = useSlots()\nconst tableRef = ref()\nconst tableWrapRef = ref()\nconst containerWidth = ref(0)\nconst loading = ref(props.loading ?? false)\nconst innerData = ref<Record<string, unknown>[]>([])\nconst rawDataSource = ref<Record<string, unknown>>({})\nconst innerColumns = ref<ProColumn[]>([])\nconst innerProps = ref<Partial<ProTableProps>>({})\nconst selectedRows = ref<Record<string, unknown>[]>([])\nconst showPaginationRef = ref<boolean | null>(null)\n\nconst pagination = ref({\n page: 1,\n pageSize: (props.pagination && typeof props.pagination === 'object') ? (props.pagination.pageSize ?? 10) : 10,\n pageSizes: (props.pagination && typeof props.pagination === 'object') ? (props.pagination.pageSizes ?? [10, 20, 50, 100]) : [10, 20, 50, 100],\n total: 0,\n})\n\nconst { getSetting: getComponentSetting } = useComponentSetting()\nconst effectiveProps = computed(() => ({ ...getComponentSetting('ProTable'), ...props, ...innerProps.value }))\nconst showTitleBar = computed(() => !!effectiveProps.value.title || !!slots.tableTitle || !!slots.toolbar)\nconst showPagination = computed(() => {\n if (showPaginationRef.value !== null) return showPaginationRef.value\n return !!props.pagination && typeof props.pagination === 'object'\n})\n\nconst rowKeyField = computed(() => effectiveProps.value.rowKey || 'id')\n\n/** 选中行 key 集合(用于快速判断) */\nconst selectedKeysSet = computed(() => new Set(selectedRows.value.map((r) => r[rowKeyField.value] as string | number)))\n\n/** 显示列 */\nconst displayColumns = computed(() =>\n innerColumns.value.filter((c) => !c.hideInTable && !c.defaultHidden)\n)\n\n/** 固定列总宽度 */\nconst fixedColumnsWidth = computed(() => {\n let w = 0\n if (effectiveProps.value.rowSelection) w += Number(effectiveProps.value.rowSelection.width) || 48\n if (effectiveProps.value.showIndexColumn) w += Number(effectiveProps.value.indexColumnProps?.width) || 60\n if (effectiveProps.value.actionColumn) w += Number(effectiveProps.value.actionColumn?.width) || 150\n return w\n})\n\nconst isRatioWidth = (w: number | string | undefined) => typeof w === 'number' && w > 0\nconst totalRatio = computed(() => {\n const cols = displayColumns.value.filter((c) => shouldShowColumn(c) && isRatioWidth(c.width))\n return cols.reduce((sum, c) => sum + (typeof c.width === 'number' ? c.width : 0), 0)\n})\n\nconst fixedDataColumnsWidth = computed(() => {\n const cols = displayColumns.value.filter((c) => shouldShowColumn(c) && typeof c.width === 'string')\n return cols.reduce((sum, c) => sum + (Number(getColumnWidth(c)) || 80), 0)\n})\n\nconst parseWidthPx = (v: number | string | undefined): number | null =>\n v == null ? null : typeof v === 'number' ? v : parseInt(String(v).replace(/px$/i, ''), 10) || null\n\nconst getColumnWidth = (col: ProColumn): number | string | undefined => {\n const w = col.width\n if (isRatioWidth(w) && totalRatio.value > 0 && containerWidth.value > 0 && typeof w === 'number') {\n const available = containerWidth.value - fixedColumnsWidth.value - fixedDataColumnsWidth.value\n let result = Math.floor((available * w) / totalRatio.value)\n const minPx = parseWidthPx(col.minWidth) ?? 60\n const maxPx = parseWidthPx(col.maxWidth)\n result = Math.max(minPx, result)\n if (maxPx != null) result = Math.min(maxPx, result)\n return result\n }\n if (typeof w === 'string') {\n const basePx = parseWidthPx(w) ?? 80\n const minPx = parseWidthPx(col.minWidth)\n const maxPx = parseWidthPx(col.maxWidth)\n let result = basePx\n if (minPx != null) result = Math.max(minPx, result)\n if (maxPx != null) result = Math.min(maxPx, result)\n return result\n }\n return col.width\n}\n\nconst shouldShowColumn = (col: ProColumn) => {\n if (col.ifShow === false) return false\n if (typeof col.ifShow === 'function') return col.ifShow({ column: col })\n return true\n}\n\n/** 当前页可选行(未禁用) */\nconst selectableRows = computed(() => {\n const getDisabled = effectiveProps.value.rowSelection?.getCheckboxProps\n if (!getDisabled) return innerData.value\n return innerData.value.filter((row) => !getDisabled(row)?.disabled)\n})\n\nconst hasSelectableRows = computed(() => selectableRows.value.length > 0)\n\n/** 当前页是否全选 */\nconst isAllCurrentPageSelected = computed(() => {\n if (selectableRows.value.length === 0) return false\n return selectableRows.value.every((row) => selectedKeysSet.value.has(row[rowKeyField.value] as string | number))\n})\n\n/** 半选状态 */\nconst isIndeterminate = computed(() => {\n const selectedCount = selectableRows.value.filter((row) => selectedKeysSet.value.has(row[rowKeyField.value] as string | number)).length\n return selectedCount > 0 && selectedCount < selectableRows.value.length\n})\n\nconst isRowSelected = (row: Record<string, unknown>) =>\n selectedKeysSet.value.has(row[rowKeyField.value] as string | number)\n\nconst getCheckboxDisabled = (row: Record<string, unknown>) =>\n effectiveProps.value.rowSelection?.getCheckboxProps?.(row)?.disabled ?? false\n\nconst getRadioDisabled = (row: Record<string, unknown>) =>\n effectiveProps.value.rowSelection?.getRadioProps?.(row)?.disabled ?? false\n\nconst emitSelectionChange = () => {\n const keys = selectedRows.value.map((r) => r[rowKeyField.value] as string | number)\n emit('selection-change', { keys, rows: selectedRows.value })\n}\n\nconst handleCheckboxChange = (row: Record<string, unknown>, checked: boolean) => {\n const key = row[rowKeyField.value] as string | number\n if (checked) {\n selectedRows.value = [...selectedRows.value.filter((r) => r[rowKeyField.value] !== key), row]\n } else {\n selectedRows.value = selectedRows.value.filter((r) => r[rowKeyField.value] !== key)\n }\n emitSelectionChange()\n}\n\nconst handleRadioSelect = (row: Record<string, unknown>) => {\n selectedRows.value = [row]\n emitSelectionChange()\n}\n\nconst handleSelectAll = (checked: boolean) => {\n if (checked) {\n const keySet = new Set(selectedRows.value.map((r) => r[rowKeyField.value]))\n const toAdd = selectableRows.value.filter((row) => !keySet.has(row[rowKeyField.value]))\n selectedRows.value = [...selectedRows.value, ...toAdd]\n } else {\n const currentPageKeys = new Set(innerData.value.map((r) => r[rowKeyField.value]))\n selectedRows.value = selectedRows.value.filter((r) => !currentPageKeys.has(r[rowKeyField.value]))\n }\n emitSelectionChange()\n}\n\nconst fetchData = async (opt?: FetchParams) => {\n if (!props.api) {\n if (props.dataSource) return\n innerData.value = []\n return\n }\n loading.value = true\n try {\n const fs = effectiveProps.value.fetchSetting ?? {}\n const pageField = fs.pageField ?? 'page'\n const sizeField = fs.sizeField ?? 'pageSize'\n const listField = fs.listField ?? 'list'\n const totalField = fs.totalField ?? 'total'\n const params: Record<string, unknown> = {\n [pageField]: opt?.page ?? pagination.value.page,\n [sizeField]: opt?.pageSize ?? pagination.value.pageSize,\n ...props.searchInfo,\n ...opt?.searchInfo,\n }\n if (opt?.page != null) pagination.value.page = opt.page\n if (opt?.pageSize != null) pagination.value.pageSize = opt.pageSize\n const processedParams = props.beforeFetch ? props.beforeFetch(params) : params\n const res = await props.api!(processedParams)\n rawDataSource.value = (res || {}) as Record<string, unknown>\n const data = (props.afterFetch ? props.afterFetch(res) : res) as Record<string, unknown>\n const list = (data[listField] ?? data.items ?? data.list ?? []) as unknown[]\n const total = (data[totalField] ?? 0) as number\n innerData.value = list as Record<string, unknown>[]\n pagination.value.total = total\n emit('fetch-success', { items: list, total })\n } catch (e) {\n emit('fetch-error', e)\n } finally {\n loading.value = false\n }\n}\n\nconst handleReload = () => fetchData(undefined)\nconst handleSizeChange = (size: number) => {\n if (effectiveProps.value.clearSelectOnPageChange) {\n selectedRows.value = []\n }\n pagination.value.pageSize = size\n pagination.value.page = 1\n fetchData(undefined)\n}\nconst handleCurrentChange = (page: number) => {\n if (effectiveProps.value.clearSelectOnPageChange) {\n selectedRows.value = []\n }\n pagination.value.page = page\n fetchData(undefined)\n}\nconst handleRowClick = (row: Record<string, unknown>, _column: unknown, event: Event) => emit('row-click', row, event)\nconst handleRowDblclick = (row: Record<string, unknown>, _column: unknown, event: Event) => emit('row-dblclick', row, event)\nconst handleSortChange = ({ prop, order }: { prop: string; order: string }) => emit('sort-change', { prop, order })\nconst handleExpandChange = (row: Record<string, unknown>, expanded: boolean | Record<string, unknown>[]) => emit('expand-change', row, expanded)\n\nconst findRowIndex = (key: string | number) =>\n innerData.value.findIndex((r) => r[rowKeyField.value] === key)\n\nconst tableAction: TableActionType = {\n setProps: (p) => { innerProps.value = { ...innerProps.value, ...p } },\n reload: (opt) => fetchData(opt),\n redoHeight: () => { tableRef.value?.doLayout?.() },\n setLoading: (v) => { loading.value = v },\n getDataSource: () => innerData.value,\n getRawDataSource: () => rawDataSource.value,\n setTableData: (data) => { innerData.value = data ?? [] },\n getColumns: () => innerColumns.value,\n setColumns: (cols) => {\n if (Array.isArray(cols) && cols.length > 0 && typeof cols[0] === 'string') {\n const keyList = cols as string[]\n const fromProps = (props.columns ?? []).filter((c) => keyList.includes((c.key ?? c.dataIndex) as string))\n const ordered = keyList.map((k) => fromProps.find((c) => (c.key ?? c.dataIndex) === k)).filter(Boolean) as ProColumn[]\n if (ordered.length) innerColumns.value = ordered\n } else {\n innerColumns.value = (cols as ProColumn[]) ?? []\n }\n },\n setPagination: (info) => {\n if (info?.page) pagination.value.page = info.page\n if (info?.pageSize) pagination.value.pageSize = info.pageSize\n if (info?.total !== undefined) pagination.value.total = info.total\n },\n getSelectRowKeys: () => selectedRows.value.map((r) => r[rowKeyField.value] as string | number),\n getSelectRows: () => selectedRows.value,\n clearSelectedRowKeys: () => { selectedRows.value = []; emitSelectionChange() },\n setSelectedRowKeys: (keys) => {\n const keySet = new Set(keys)\n const rows = innerData.value.filter((r) => keySet.has(r[rowKeyField.value] as string | number))\n keys.forEach((k) => {\n if (!rows.some((r) => r[rowKeyField.value] === k)) {\n rows.push({ [rowKeyField.value]: k } as Record<string, unknown>)\n }\n })\n selectedRows.value = rows\n emitSelectionChange()\n },\n deleteSelectRowByKey: (key) => {\n selectedRows.value = selectedRows.value.filter((r) => r[rowKeyField.value] !== key)\n emitSelectionChange()\n },\n updateTableData: (index, key, value) => {\n if (index < 0 || index >= innerData.value.length) return\n innerData.value = [...innerData.value]\n innerData.value[index] = { ...innerData.value[index], [key]: value }\n },\n updateTableDataRecord: (rowKey, record) => {\n const idx = findRowIndex(rowKey)\n if (idx < 0) return\n innerData.value = [...innerData.value]\n innerData.value[idx] = { ...innerData.value[idx], ...record }\n return innerData.value[idx]\n },\n deleteTableDataRecord: (rowKey) => {\n const keys = Array.isArray(rowKey) ? rowKey : [rowKey]\n const keySet = new Set(keys)\n innerData.value = innerData.value.filter((r) => !keySet.has(r[rowKeyField.value] as string | number))\n },\n insertTableDataRecord: (record, index) => {\n const arr = [...innerData.value]\n if (index == null || index >= arr.length) arr.push(record)\n else arr.splice(index, 0, record)\n innerData.value = arr\n return record\n },\n getPaginationRef: () =>\n showPagination.value\n ? { page: pagination.value.page, pageSize: Number(pagination.value.pageSize) || 10, total: pagination.value.total }\n : false,\n getShowPagination: () => showPagination.value,\n setShowPagination: (show) => { showPaginationRef.value = show },\n getRowSelection: () => effectiveProps.value.rowSelection,\n expandAll: () => {\n const childrenKey = effectiveProps.value.treeProps?.children ?? 'children'\n const flattenRows = (rows: Record<string, unknown>[]): Record<string, unknown>[] => {\n const result: Record<string, unknown>[] = []\n rows.forEach((row) => {\n result.push(row)\n const children = row[childrenKey] as Record<string, unknown>[] | undefined\n if (Array.isArray(children) && children.length > 0) {\n result.push(...flattenRows(children))\n }\n })\n return result\n }\n const allRows = flattenRows(innerData.value)\n allRows.forEach((row) => tableRef.value?.toggleRowExpansion?.(row, true))\n },\n collapseAll: () => {\n const childrenKey = effectiveProps.value.treeProps?.children ?? 'children'\n const flattenRows = (rows: Record<string, unknown>[]): Record<string, unknown>[] => {\n const result: Record<string, unknown>[] = []\n rows.forEach((row) => {\n result.push(row)\n const children = row[childrenKey] as Record<string, unknown>[] | undefined\n if (Array.isArray(children) && children.length > 0) {\n result.push(...flattenRows(children))\n }\n })\n return result\n }\n const allRows = flattenRows(innerData.value)\n allRows.forEach((row) => tableRef.value?.toggleRowExpansion?.(row, false))\n },\n}\n\ndefineExpose(tableAction)\n\nconst syncColumns = () => { innerColumns.value = [...(props.columns ?? [])] }\n\nconst loadData = () => {\n if (props.api && effectiveProps.value.immediate !== false) {\n fetchData(undefined)\n } else if (props.dataSource) {\n innerData.value = [...props.dataSource]\n if (!props.api && props.pagination !== false) {\n pagination.value.total = props.dataSource.length\n }\n }\n}\n\nconst updateContainerWidth = () => {\n if (tableWrapRef.value) containerWidth.value = tableWrapRef.value.offsetWidth || 0\n}\n\nlet resizeObserver: ResizeObserver | null = null\nlet observedEl: Element | null = null\n\nonMounted(() => {\n syncColumns()\n emit('register', tableAction)\n loadData()\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', updateContainerWidth)\n resizeObserver = new ResizeObserver(updateContainerWidth)\n nextTick(() => {\n updateContainerWidth()\n observedEl = tableWrapRef.value\n if (observedEl) resizeObserver?.observe(observedEl)\n })\n }\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateContainerWidth)\n if (resizeObserver && observedEl) {\n resizeObserver.unobserve(observedEl)\n observedEl = null\n }\n }\n})\n\nwatch(() => props.columns, syncColumns, { deep: true })\nwatch(() => props.dataSource, () => {\n if (!props.api && props.dataSource) innerData.value = [...props.dataSource]\n}, { deep: true })\nwatch(() => props.loading, (v) => { loading.value = v ?? false })\n</script>\n\n<style scoped>\n.ecp-pro-table {\n padding: 16px;\n background: #fff;\n width: 100%;\n box-sizing: border-box;\n}\n.ecp-pro-table :deep(.el-table) {\n width: 100% !important;\n}\n.ecp-pro-table__header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.ecp-pro-table__title-wrapper {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-pro-table__title {\n font-size: 16px;\n font-weight: 600;\n}\n.ecp-pro-table__help {\n color: #909399;\n cursor: help;\n}\n.ecp-pro-table__toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.ecp-pro-table__body {\n width: 100%;\n}\n.ecp-pro-table__pagination {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n}\n.ecp-pro-table__col-help {\n margin-left: 4px;\n color: #909399;\n cursor: help;\n}\n</style>\n","<template>\n <div class=\"ecp-table-action\">\n <!-- 主操作按钮组 -->\n <span\n v-for=\"(action, index) in visibleActions\"\n :key=\"`action-${index}`\"\n class=\"ecp-table-action__item\"\n >\n <!-- 气泡确认 -->\n <el-popconfirm\n v-if=\"action.popConfirm\"\n :title=\"action.popConfirm.title\"\n :confirm-button-text=\"action.popConfirm.okText || '确定'\"\n :cancel-button-text=\"action.popConfirm.cancelText || '取消'\"\n @confirm=\"(e) => handlePopConfirm(action, 'confirm', e)\"\n @cancel=\"(e) => handlePopConfirm(action, 'cancel', e)\"\n >\n <span slot=\"reference\">\n <component\n :is=\"action.tooltip ? 'el-tooltip' : 'span'\"\n v-bind=\"action.tooltip ? normalizeTooltip(action.tooltip) : {}\"\n >\n <el-button\n :type=\"getButtonType(action)\"\n size=\"small\"\n :disabled=\"action.disabled\"\n v-bind=\"action.props\"\n @click=\"(e) => handleClick(action, e)\"\n >\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </el-button>\n </component>\n </span>\n </el-popconfirm>\n\n <!-- 普通按钮 -->\n <component\n v-else\n :is=\"action.tooltip ? 'el-tooltip' : 'span'\"\n v-bind=\"action.tooltip ? normalizeTooltip(action.tooltip) : {}\"\n >\n <el-button\n :type=\"getButtonType(action)\"\n size=\"small\"\n :disabled=\"action.disabled\"\n v-bind=\"action.props\"\n @click=\"(e) => handleClick(action, e)\"\n >\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </el-button>\n </component>\n\n <el-divider v-if=\"action.divider\" direction=\"vertical\" />\n </span>\n\n <!-- 下拉更多操作 -->\n <el-dropdown v-if=\"visibleDropDownActions.length\" trigger=\"click\" @command=\"handleDropdownCommand\">\n <span class=\"ecp-table-action__more\">\n <el-button type=\"text\" size=\"small\">\n 更多<i class=\"el-icon-arrow-down el-icon--right\" />\n </el-button>\n </span>\n <el-dropdown-menu slot=\"dropdown\">\n <el-dropdown-item\n v-for=\"(action, index) in visibleDropDownActions\"\n :key=\"`dropdown-${index}`\"\n :command=\"index\"\n :disabled=\"action.disabled\"\n :divided=\"!!action.divider\"\n >\n <span class=\"ecp-table-action__dropdown-item\">\n <i v-if=\"action.icon\" :class=\"['ecp-table-action__icon', action.icon]\" />\n <span>{{ action.label }}</span>\n </span>\n </el-dropdown-item>\n </el-dropdown-menu>\n </el-dropdown>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { MessageBox } from 'element-ui'\nimport type { TableActionItem } from './types'\n\nconst props = withDefaults(\n defineProps<{\n actions?: TableActionItem[]\n dropDownActions?: TableActionItem[]\n /** 是否阻止按钮 click 冒泡,参考 VbenAdmin stopButtonPropagation */\n stopButtonPropagation?: boolean\n }>(),\n {\n actions: () => [],\n dropDownActions: () => [],\n stopButtonPropagation: false,\n }\n)\n\nconst normalizeTooltip = (tooltip?: TableActionItem['tooltip']) => {\n if (!tooltip) return {}\n if (typeof tooltip === 'string') {\n return { content: tooltip }\n }\n return tooltip as Record<string, unknown>\n}\n\nconst getButtonType = (action: TableActionItem) => {\n if (action.type) return action.type\n if (action.color === 'error') return 'danger'\n if (action.color === 'success') return 'success'\n if (action.color === 'warning') return 'warning'\n return 'text'\n}\n\nconst filterVisible = (list: TableActionItem[]) =>\n list.filter((item) => {\n const { ifShow } = item\n if (typeof ifShow === 'boolean') return ifShow\n if (typeof ifShow === 'function') return ifShow(item)\n return true\n })\n\nconst visibleActions = computed(() => filterVisible(props.actions || []))\nconst visibleDropDownActions = computed(() => filterVisible(props.dropDownActions || []))\n\nconst handleClick = (action: TableActionItem, e: MouseEvent) => {\n if (props.stopButtonPropagation) {\n e.stopPropagation()\n }\n action.onClick?.(e)\n}\n\nconst handlePopConfirm = (action: TableActionItem, type: 'confirm' | 'cancel', e: MouseEvent) => {\n if (props.stopButtonPropagation) {\n e.stopPropagation()\n }\n if (!action.popConfirm) return\n if (type === 'confirm') {\n action.popConfirm.confirm?.()\n } else {\n action.popConfirm.cancel?.()\n }\n}\n\nconst handleDropdownCommand = (index: number | string) => {\n const idx = Number(index)\n const action = visibleDropDownActions.value[idx]\n if (!action || action.disabled) return\n if (action.popConfirm) {\n const title = action.popConfirm.title\n const okText = action.popConfirm.okText || '确定'\n const cancelText = action.popConfirm.cancelText || '取消'\n MessageBox.confirm(title, '提示', {\n confirmButtonText: okText,\n cancelButtonText: cancelText,\n type: 'warning',\n })\n .then(() => action.popConfirm?.confirm?.())\n .catch(() => action.popConfirm?.cancel?.())\n return\n }\n action.onClick?.({} as MouseEvent)\n}\n</script>\n\n<style scoped>\n.ecp-table-action {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-table-action__item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n.ecp-table-action__icon {\n margin-right: 4px;\n}\n.ecp-table-action__more {\n display: inline-flex;\n align-items: center;\n}\n.ecp-table-action__dropdown-item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n</style>\n\n","import { ref, watch, unref, type Ref } from 'vue'\nimport type { ProTableProps, TableActionType } from './types'\n\nexport type UseProTableReturn = [\n (instance: TableActionType) => void,\n TableActionType\n]\n\n/** 支持 ref/computed 的 props */\nexport type UseProTablePropsReactive = ProTableProps | Ref<ProTableProps | undefined>\n\n/**\n * 用于 ProTable 的 useProTable,支持通过 ref 调用表格方法\n * @param props ProTable 的 props 配置,传入后会通过 setProps 同步到表格(支持 ref/computed 响应式更新)\n */\nexport function useProTable(props?: UseProTablePropsReactive): UseProTableReturn {\n const tableActionRef = ref<TableActionType | null>(null)\n\n const getTableProps = (): ProTableProps | undefined =>\n (props ? unref(props as Ref<ProTableProps | undefined>) : undefined) as ProTableProps | undefined\n\n const getTableAction = (): TableActionType => {\n const action = unref(tableActionRef)\n if (!action) {\n throw new Error('ProTable instance has not been registered')\n }\n return action\n }\n\n const register = (instance: TableActionType) => {\n tableActionRef.value = instance\n const tableProps = getTableProps()\n if (tableProps && Object.keys(tableProps).length > 0) {\n instance.setProps(tableProps)\n }\n }\n\n if (props) {\n watch(\n () => getTableProps(),\n (tableProps) => {\n if (tableProps && tableActionRef.value) {\n tableActionRef.value.setProps(tableProps)\n }\n },\n { deep: true }\n )\n }\n\n const tableActions: UseProTableReturn[1] = {\n setProps: (p) => getTableAction().setProps(p),\n reload: (opt) => getTableAction().reload(opt),\n redoHeight: () => getTableAction().redoHeight(),\n setLoading: (v) => getTableAction().setLoading(v),\n getDataSource: () => getTableAction().getDataSource(),\n getRawDataSource: () => getTableAction().getRawDataSource(),\n setTableData: (data) => getTableAction().setTableData(data),\n getColumns: () => getTableAction().getColumns(),\n setColumns: (cols) => getTableAction().setColumns(cols),\n setPagination: (info) => getTableAction().setPagination(info),\n getSelectRowKeys: () => getTableAction().getSelectRowKeys(),\n getSelectRows: () => getTableAction().getSelectRows(),\n clearSelectedRowKeys: () => getTableAction().clearSelectedRowKeys(),\n setSelectedRowKeys: (keys) => getTableAction().setSelectedRowKeys(keys),\n deleteSelectRowByKey: (key) => getTableAction().deleteSelectRowByKey(key),\n updateTableData: (index, key, value) => getTableAction().updateTableData(index, key, value),\n updateTableDataRecord: (rowKey, record) => getTableAction().updateTableDataRecord(rowKey, record),\n deleteTableDataRecord: (rowKey) => getTableAction().deleteTableDataRecord(rowKey),\n insertTableDataRecord: (record, index) => getTableAction().insertTableDataRecord(record, index),\n getPaginationRef: () => getTableAction().getPaginationRef(),\n getShowPagination: () => getTableAction().getShowPagination(),\n setShowPagination: (show) => getTableAction().setShowPagination(show),\n getRowSelection: () => getTableAction().getRowSelection(),\n expandAll: () => getTableAction().expandAll?.(),\n collapseAll: () => getTableAction().collapseAll?.(),\n }\n\n return [register, tableActions]\n}\n","<template>\n <el-select :value=\"value\" :placeholder=\"placeholder\" :disabled=\"disabled\" :loading=\"loading\" :clearable=\"clearable\"\n :filterable=\"filterable\" :multiple=\"multiple\" v-bind=\"$attrs\" @input=\"$emit('input', $event)\"\n @visible-change=\"onVisibleChange\">\n <el-option v-for=\"opt in options\" :key=\"String(opt.value)\" :label=\"opt.label\" :value=\"opt.value\" />\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n /** 拉取选项的接口,返回 Promise<Array<{ label, value }>> 或 { list: [] };可接收当前 params 作为参数 */\n api?: (params?: Record<string, unknown>) => Promise<unknown>\n /** 请求参数,变化时会重新拉取 options */\n params?: Record<string, unknown>\n /** 是否懒加载:为 true 时在展开下拉时再请求数据,不在挂载时请求 */\n lazy?: boolean\n /** 接口返回列表中「标签」字段名,默认 'label' */\n labelField?: string\n /** 接口返回列表中「值」字段名,默认 'value' */\n valueField?: string\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n filterable?: boolean\n multiple?: boolean\n }>(),\n { labelField: 'label', valueField: 'value', lazy: false }\n)\n\ndefineEmits<{ (e: 'input', value: unknown): void }>()\n\nconst loading = ref(false)\nconst options = ref<Array<{ label: string; value: unknown }>>([])\n\nconst onVisibleChange = (visible: boolean) => {\n if (props.lazy && visible) fetchOptions()\n}\n\nconst fetchOptions = async () => {\n if (!props.api) return\n loading.value = true\n try {\n const res = await props.api(props.params)\n const raw = Array.isArray(res)\n ? res\n : ((res as Record<string, unknown>)?.list as unknown[]) ??\n ((res as Record<string, unknown>)?.data as unknown[]) ??\n []\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n options.value = raw.map((item: unknown) => {\n const o = item as Record<string, unknown>\n return {\n label: String(o[labelKey] ?? o.label ?? ''),\n value: o[valueKey] ?? o.value,\n }\n })\n } finally {\n loading.value = false\n }\n}\n\nonMounted(() => {\n if (!props.lazy) fetchOptions()\n})\nwatch(() => props.api, () => { \n if (!props.lazy) {\n fetchOptions()\n } else {\n options.value = []\n }\n}, { deep: true }\n)\nwatch(() => props.params, () => {\n if (props.lazy) {\n options.value = []\n } else {\n fetchOptions()\n }\n}, { deep: true })\n</script>\n","<template>\n <div class=\"ecp-tree-select\" ref=\"rootRef\">\n <el-input\n :value=\"displayText\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :clearable=\"clearable\"\n readonly\n suffix-icon=\"el-icon-arrow-down\"\n class=\"ecp-tree-select__input\"\n @focus=\"openDropdown\"\n @clear=\"clearValue\"\n />\n <transition name=\"el-zoom-in-top\">\n <div v-show=\"dropdownVisible\" class=\"ecp-tree-select__dropdown\">\n <div v-if=\"filterable\" class=\"ecp-tree-select__filter-inner\">\n <el-input\n v-model=\"filterText\"\n size=\"small\"\n placeholder=\"搜索节点\"\n prefix-icon=\"el-icon-search\"\n clearable\n @click.native.stop\n />\n </div>\n <el-tree\n v-show=\"!loading\"\n ref=\"treeRef\"\n :data=\"treeData\"\n :props=\"treeProps\"\n :node-key=\"valueField\"\n :filter-node-method=\"filterable ? filterNodeMethod : undefined\"\n :highlight-current=\"true\"\n default-expand-all\n @node-click=\"onNodeClick\"\n />\n <div v-if=\"loading\" class=\"ecp-tree-select__loading\">\n <i class=\"el-icon-loading\" /> 加载中...\n </div>\n </div>\n </transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted, computed, nextTick } from 'vue'\n\ninterface TreeNode {\n label?: string\n value?: unknown\n children?: TreeNode[]\n [key: string]: unknown\n}\n\nconst props = withDefaults(\n defineProps<{\n value?: unknown\n /** 树数据,直接传入时优先使用,不请求 api */\n treeData?: unknown[]\n api?: (params?: Record<string, unknown>) => Promise<unknown>\n params?: Record<string, unknown>\n lazy?: boolean\n labelField?: string\n valueField?: string\n childrenField?: string\n filterable?: boolean\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n }>(),\n {\n labelField: 'label',\n valueField: 'value',\n childrenField: 'children',\n lazy: false,\n }\n)\n\nconst emit = defineEmits<{ (e: 'input', value: unknown): void }>()\n\nconst rootRef = ref<HTMLElement>()\nconst treeRef = ref()\nconst dropdownVisible = ref(false)\nconst loading = ref(false)\nconst filterText = ref('')\nconst treeData = ref<TreeNode[]>([])\nconst flatLabelMap = ref<Record<string, string>>({})\n\nconst treeProps = computed(() => ({\n label: props.labelField,\n children: props.childrenField,\n}))\n\nfunction normalizeNode(node: Record<string, unknown>): TreeNode {\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n const childrenKey = props.childrenField ?? 'children'\n const children = node[childrenKey] as unknown[]\n const out: TreeNode = {}\n out[props.labelField ?? 'label'] = node[labelKey] ?? node.label\n out[props.valueField ?? 'value'] = node[valueKey] ?? node.value\n if (Array.isArray(children) && children.length) {\n out[props.childrenField ?? 'children'] = children.map((c) => normalizeNode(c as Record<string, unknown>))\n }\n return out\n}\n\nfunction buildFlatLabelMap(nodes: TreeNode[], prefix = ''): Record<string, string> {\n const map: Record<string, string> = {}\n const labelKey = props.labelField ?? 'label'\n const valueKey = props.valueField ?? 'value'\n const childrenKey = props.childrenField ?? 'children'\n for (const node of nodes) {\n const label = String(node[labelKey] ?? node.label ?? '')\n const value = node[valueKey] ?? node.value\n if (value !== undefined && value !== null) {\n map[String(value)] = prefix ? prefix + ' / ' + label : label\n }\n const children = node[childrenKey] ?? node.children\n if (Array.isArray(children) && children.length) {\n Object.assign(map, buildFlatLabelMap(children as TreeNode[], label))\n }\n }\n return map\n}\n\nfunction hasTreeDataProp() {\n const td = props.treeData\n return Array.isArray(td) && td.length > 0\n}\n\nfunction applyTreeData(nodes: TreeNode[]) {\n treeData.value = nodes\n flatLabelMap.value = buildFlatLabelMap(nodes)\n}\n\nfunction syncFromTreeDataProp() {\n const td = props.treeData\n if (!Array.isArray(td) || td.length === 0) return\n const normalized = td.map((item) => normalizeNode(item as Record<string, unknown>))\n applyTreeData(normalized)\n}\n\nconst displayText = computed(() => {\n if (props.value == null || props.value === '') return ''\n return flatLabelMap.value[String(props.value)] ?? String(props.value)\n})\n\nconst filterNodeMethod = (value: string, data: TreeNode) => {\n if (!value) return true\n const labelKey = props.labelField ?? 'label'\n const label = String(data[labelKey] ?? data.label ?? '')\n return label.toLowerCase().includes(value.toLowerCase())\n}\n\nwatch(filterText, (val) => {\n treeRef.value?.filter(val)\n})\n\nlet clickOutsideHandler: ((e: MouseEvent) => void) | null = null\n\nfunction openDropdown() {\n if (props.disabled) return\n dropdownVisible.value = true\n if (props.lazy && !hasTreeDataProp()) fetchData()\n nextTick(() => {\n clickOutsideHandler = (e: MouseEvent) => {\n if (rootRef.value && !rootRef.value.contains(e.target as Node)) {\n closeDropdown()\n }\n }\n document.addEventListener('click', clickOutsideHandler)\n })\n}\n\nfunction closeDropdown() {\n dropdownVisible.value = false\n filterText.value = ''\n if (clickOutsideHandler) {\n document.removeEventListener('click', clickOutsideHandler)\n clickOutsideHandler = null\n }\n}\n\nfunction clearValue() {\n emit('input', undefined)\n}\n\nfunction onNodeClick(data: TreeNode) {\n const valueKey = props.valueField ?? 'value'\n const val = data[valueKey] ?? data.value\n emit('input', val)\n closeDropdown()\n}\n\nasync function fetchData() {\n if (!props.api || hasTreeDataProp()) return\n loading.value = true\n try {\n const res = await props.api(props.params)\n const raw = Array.isArray(res)\n ? res\n : ((res as Record<string, unknown>)?.list as unknown[]) ??\n ((res as Record<string, unknown>)?.data as unknown[]) ??\n []\n treeData.value = raw.map((item) => normalizeNode(item as Record<string, unknown>))\n flatLabelMap.value = buildFlatLabelMap(treeData.value)\n } finally {\n loading.value = false\n }\n}\n\nonMounted(() => {\n if (hasTreeDataProp()) {\n syncFromTreeDataProp()\n } else if (!props.lazy) {\n fetchData()\n }\n})\n\nwatch(() => props.treeData, () => {\n if (hasTreeDataProp()) {\n syncFromTreeDataProp()\n } else {\n treeData.value = []\n flatLabelMap.value = {}\n if (!props.lazy && props.api) fetchData()\n }\n}, { deep: true })\n\nwatch(() => props.api, () => {\n if (hasTreeDataProp()) return\n if (!props.lazy) fetchData()\n else { treeData.value = []; flatLabelMap.value = {} }\n}, { deep: true })\n\nwatch(() => props.params, () => {\n if (hasTreeDataProp()) return\n if (props.lazy) { treeData.value = []; flatLabelMap.value = {} }\n else fetchData()\n}, { deep: true })\n</script>\n\n<style scoped>\n.ecp-tree-select {\n position: relative;\n width: 100%;\n}\n.ecp-tree-select__filter-inner {\n margin-bottom: 8px;\n}\n.ecp-tree-select__dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n max-height: 280px;\n overflow: auto;\n background: #fff;\n border: 1px solid #dcdfe6;\n border-radius: 4px;\n margin-top: 4px;\n z-index: 1000;\n padding: 8px;\n}\n.ecp-tree-select__loading {\n padding: 24px;\n text-align: center;\n color: #909399;\n font-size: 14px;\n}\n</style>\n","<template>\n <el-form-item\n v-if=\"shouldRender\"\n v-show=\"shouldShow\"\n :prop=\"schema.field\"\n :required=\"schema.required\"\n :rules=\"effectiveRules\"\n >\n <template slot=\"label\">\n <span>{{ schema.label }}</span>\n <el-tooltip\n v-if=\"schema.helpMessage\"\n placement=\"top\"\n effect=\"light\"\n v-bind=\"schema.helpComponentProps || {}\"\n >\n <template slot=\"content\">\n <template v-if=\"Array.isArray(schema.helpMessage)\">\n <div v-for=\"(msg, i) in schema.helpMessage\" :key=\"i\" class=\"ecp-pro-form-item__help-item\">\n {{ msg }}\n </div>\n </template>\n <span v-else>{{ schema.helpMessage }}</span>\n </template>\n <i class=\"el-icon-question ecp-pro-form-item__help-icon\" />\n </el-tooltip>\n </template>\n <!-- render 自定义渲染 -->\n <template v-if=\"schema.render\">\n <component :is=\"renderComponent\" />\n </template>\n <!-- slot 自定义插槽(由 ProForm 传入 default slot) -->\n <slot v-else-if=\"hasSlot\" :model=\"formModel\" :schema=\"schema\" :field=\"schema.field\" :values=\"formModel\" />\n <!-- 默认组件渲染 -->\n <template v-else>\n <!-- 自定义 component:组件名或内联组件 -->\n <component\n v-if=\"resolvedCustomComponent\"\n :is=\"resolvedCustomComponent\"\n :value=\"formModel[schema.field]\"\n @input=\"setFieldValue\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-input\n v-else-if=\"schema.component === 'input' || !schema.component\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请输入${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-input-number\n v-else-if=\"schema.component === 'input-number'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-select\n class=\"ecp-pro-form-item__select\"\n v-else-if=\"schema.component === 'select'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-option\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.label\"\n :value=\"opt.value\"\n />\n </el-select>\n <ApiSelect\n v-else-if=\"schema.component === 'api-select'\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <TreeSelect\n v-else-if=\"schema.component === 'tree-select'\"\n :value=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n @input=\"setFieldValue\"\n />\n <el-date-picker\n v-else-if=\"schema.component === 'date-picker'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-date-picker\n v-else-if=\"schema.component === 'date-range'\"\n v-model=\"formModel[schema.field]\"\n type=\"daterange\"\n range-separator=\"至\"\n start-placeholder=\"开始日期\"\n end-placeholder=\"结束日期\"\n value-format=\"yyyy-MM-dd\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-switch\n v-else-if=\"schema.component === 'switch'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-cascader\n v-else-if=\"schema.component === 'cascader'\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"schema.placeholder || (autoPlaceholder ? `请选择${schema.label}` : undefined)\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n />\n <el-checkbox-group\n v-else-if=\"schema.component === 'checkbox'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-checkbox\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-checkbox>\n </el-checkbox-group>\n <el-radio-group\n v-else-if=\"schema.component === 'radio'\"\n v-model=\"formModel[schema.field]\"\n :disabled=\"effectiveDisabled\"\n v-bind=\"effectiveComponentProps\"\n v-on=\"effectiveComponentListeners\"\n >\n <el-radio\n v-for=\"opt in (getOptions(effectiveComponentProps) || [])\"\n :key=\"String(opt.value)\"\n :label=\"opt.value\"\n >\n {{ opt.label }}\n </el-radio>\n </el-radio-group>\n </template>\n </el-form-item>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots, h } from 'vue'\nimport ApiSelect from './ApiSelect.vue'\nimport TreeSelect from './TreeSelect.vue'\nimport type { ProFormSchema, RenderCallbackParams } from '../types'\n\nconst BUILT_IN_COMPONENTS: Set<string> = new Set([\n 'input', 'select', 'api-select', 'tree-select', 'date-picker', 'date-range', 'input-number',\n 'switch', 'cascader', 'checkbox', 'radio',\n])\n\nconst props = defineProps<{\n schema: ProFormSchema\n formModel: Record<string, unknown>\n formDisabled?: boolean\n autoPlaceholder?: boolean\n formActionType?: import('../types').FormActionType\n /** 自定义组件映射(由 ProForm 传入) */\n customComponents?: Record<string, unknown>\n}>()\n\nconst slots = useSlots()\n\nconst renderParams = computed<RenderCallbackParams>(() => ({\n schema: props.schema,\n values: props.formModel,\n model: props.formModel,\n field: props.schema.field,\n}))\n\nconst shouldRender = computed(() => {\n const ifShow = props.schema.ifShow\n if (ifShow === undefined) return true\n if (typeof ifShow === 'boolean') return ifShow\n return ifShow(renderParams.value)\n})\n\nconst shouldShow = computed(() => {\n const show = props.schema.show\n if (show === undefined) return true\n if (typeof show === 'boolean') return show\n return show(renderParams.value)\n})\n\nconst effectiveDisabled = computed(() => {\n if (props.formDisabled) return true\n const dyn = props.schema.dynamicDisabled\n if (dyn === undefined) return false\n if (typeof dyn === 'boolean') return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveRules = computed(() => {\n const dyn = props.schema.dynamicRules\n if (!dyn) return props.schema.rules\n if (Array.isArray(dyn)) return dyn\n return dyn(renderParams.value)\n})\n\nconst effectiveComponentPropsAndListeners = computed(() => {\n const cp = props.schema.componentProps\n if (!cp) return { props: {}, listeners: {} }\n const raw = typeof cp === 'function'\n ? cp({\n ...renderParams.value,\n formActionType: props.formActionType,\n })\n : { ...cp }\n const propsOnly: Record<string, unknown> = {}\n const listeners: Record<string, (...args: unknown[]) => unknown> = {}\n for (const [key, value] of Object.entries(raw)) {\n if (key.length > 2 && /^on[A-Za-z]/.test(key) && typeof value === 'function') {\n const eventName = key.slice(2).charAt(0).toLowerCase() + key.slice(3)\n listeners[eventName] = value as (...args: unknown[]) => unknown\n } else {\n propsOnly[key] = value\n }\n }\n return { props: propsOnly, listeners }\n})\n\nconst effectiveComponentProps = computed(() => effectiveComponentPropsAndListeners.value.props)\nconst effectiveComponentListeners = computed(() => effectiveComponentPropsAndListeners.value.listeners)\n\nconst hasSlot = computed(() => !!slots.default)\n\nconst getOptions = (props: Record<string, unknown>): Array<{ label: string; value: unknown }> | undefined => {\n const opts = props?.options\n return Array.isArray(opts) ? opts : undefined\n}\n\nconst resolvedCustomComponent = computed(() => {\n const c = props.schema.component\n if (c == null) return null\n if (typeof c === 'string') {\n if (BUILT_IN_COMPONENTS.has(c)) return null\n return (props.customComponents && props.customComponents[c]) || c\n }\n return c\n})\n\nconst setFieldValue = (v: unknown) => {\n props.formModel[props.schema.field] = v\n}\n\nconst renderComponent = computed(() => {\n const renderFn = props.schema.render\n if (!renderFn) return null\n return {\n render() {\n const result = renderFn(renderParams.value)\n if (Array.isArray(result)) {\n return h('span', result)\n }\n return result\n },\n }\n})\n</script>\n\n<style scoped>\n.ecp-pro-form-item__help-icon {\n margin-left: 4px;\n color: #909399;\n cursor: help;\n font-size: 14px;\n}\n.ecp-pro-form-item__help-icon:hover {\n color: #409eff;\n}\n.ecp-pro-form-item__help-item {\n margin-bottom: 4px;\n}\n.ecp-pro-form-item__help-item:last-child {\n margin-bottom: 0;\n}\n</style>\n","<template>\n <div ref=\"formWrapRef\" class=\"ecp-pro-form\">\n <el-form class=\"ecp-pro-form\" ref=\"formRef\" :model=\"formModel\" :rules=\"formRules\" :label-width=\"effectiveProps.labelWidth\"\n :label-position=\"effectiveProps.labelPosition\" :size=\"effectiveProps.size\" :disabled=\"effectiveProps.disabled\"\n v-bind=\"$attrs\" v-on=\"formListeners\">\n <slot name=\"formHeader\" />\n <el-row :gutter=\"effectiveProps.gutter\" :style=\"effectiveProps.baseRowStyle\">\n <template v-for=\"schema in displaySchemas\">\n <el-col v-if=\"shouldShow(schema)\" :key=\"schema.field\" v-bind=\"getColProps(schema)\"\n :offset=\"schema.colProps?.offset ?? effectiveProps.baseColProps?.offset ?? 0\" :data-field=\"schema.field\">\n <ProFormItem :schema=\"schema\" :form-model=\"formModel\" :form-disabled=\"effectiveProps.disabled\"\n :auto-placeholder=\"effectiveProps.autoSetPlaceholder\" :form-action-type=\"formActionRef\"\n :custom-components=\"formCustomComponents\">\n <template v-if=\"slots[getSlotName(schema)]\">\n <slot :name=\"getSlotName(schema)\" :model=\"formModel\" :schema=\"schema\" :field=\"schema.field\"\n :values=\"formModel\" />\n </template>\n </ProFormItem>\n </el-col>\n </template>\n <el-col class=\"ecp-pro-form_col\" v-if=\"effectiveProps.showActionButtonGroup\"\n v-bind=\"hasMoreFields ? { span: 24 } : effectiveProps.actionColOptions || { span: 6 }\">\n <FormActions :show-action-button-group=\"effectiveProps.showActionButtonGroup\"\n :show-submit-button=\"effectiveProps.showSubmitButton\" :show-reset-button=\"effectiveProps.showResetButton\"\n :submit-button-text=\"effectiveProps.submitButtonText\" :reset-button-text=\"effectiveProps.resetButtonText\"\n :submit-button-icon=\"effectiveProps.submitButtonIcon\" :reset-button-icon=\"effectiveProps.resetButtonIcon\"\n :submit-loading=\"submitLoading\" :show-advanced-button=\"effectiveProps.showAdvancedButton\"\n :has-more-fields=\"hasMoreFields\" :collapsed=\"collapsed\" :action-col-options=\"effectiveActionColOptions\"\n @submit=\"handleSubmit\" @reset=\"handleReset\" @toggle=\"collapsed = !collapsed\">\n <template slot=\"submitBefore\">\n <slot name=\"submitBefore\" />\n </template>\n <template slot=\"resetBefore\">\n <slot name=\"resetBefore\" />\n </template>\n <template slot=\"advanceBefore\">\n <slot name=\"advanceBefore\" />\n </template>\n <template slot=\"advanceAfter\">\n <slot name=\"advanceAfter\" />\n </template>\n <template slot=\"actions\">\n <slot name=\"actions\" />\n </template>\n </FormActions>\n </el-col>\n </el-row>\n <el-button v-if=\"effectiveProps.showAdvancedButton && hasMoreFields\" type=\"text\" class=\"ecp-form-actions__advance\"\n @click=\"collapsed = !collapsed\">\n <i class=\"el-icon-d-arrow-left\" :class=\"collapsed ? 'down' : 'up'\" />\n {{ collapsed ? '展开' : '收起' }}\n </el-button>\n <slot name=\"formFooter\" />\n </el-form>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, useSlots, onMounted, onUnmounted } from 'vue'\nimport { useComponentSetting } from '../useComponentSetting'\nimport ProFormItem from './ProFormItem.vue'\nimport FormActions from './FormActions.vue'\nimport type { ProFormSchema, ProFormProps, FormActionType, ColEx, ScrollToFieldOptions, FormListeners } from '../types'\n\nconst props = withDefaults(\n defineProps<{\n schemas?: ProFormSchema[]\n initialValues?: Record<string, unknown>\n labelWidth?: string\n labelPosition?: 'left' | 'right' | 'top'\n gutter?: number\n size?: 'medium' | 'small' | 'large'\n disabled?: boolean\n baseColProps?: ColEx\n baseRowStyle?: Record<string, string | number>\n autoSetPlaceholder?: boolean\n showSubmitButton?: boolean\n showResetButton?: boolean\n submitButtonText?: string\n resetButtonText?: string\n submitButtonIcon?: string\n resetButtonIcon?: string\n showActionButtonGroup?: boolean\n actionColOptions?: ColEx\n showAdvancedButton?: boolean\n autoAdvancedLine?: number\n alwaysShowLines?: number\n submitFunc?: () => Promise<void>\n resetFunc?: () => Promise<void>\n submitOnReset?: boolean\n formListeners?: FormListeners\n /** 自定义组件映射(组件名 -> 组件),供 schema.component 使用 */\n components?: Record<string, unknown>\n }>(),\n {\n labelWidth: '120px',\n labelPosition: 'right',\n gutter: 24,\n size: 'medium',\n autoSetPlaceholder: true,\n showSubmitButton: true,\n showResetButton: true,\n submitButtonText: '提交',\n resetButtonText: '重置',\n submitButtonIcon: 'el-icon-search',\n resetButtonIcon: 'el-icon-refresh-left',\n showActionButtonGroup: true,\n showAdvancedButton: false,\n autoAdvancedLine: 3,\n alwaysShowLines: 1,\n baseColProps: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n actionColOptions: () => ({ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }),\n submitOnReset: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'submit', values: Record<string, unknown>): void\n (e: 'reset'): void\n (e: 'register', formAction: FormActionType): void\n}>()\nconst slots = useSlots()\nconst formRef = ref()\nconst formWrapRef = ref()\nconst submitLoading = ref(false)\nconst collapsed = ref(true)\nconst formModel = ref<Record<string, unknown>>({})\nconst formRules = ref<Record<string, unknown[]>>({})\nconst innerSchemas = ref<ProFormSchema[]>([])\nconst innerProps = ref<Partial<ProFormProps>>({})\n\n/** Element UI 栅格断点 (px) */\nconst BREAKPOINTS = { xl: 1920, lg: 1200, md: 992, sm: 768 }\n\n/** 根据当前视口宽度获取 ColEx 的有效 span(与 el-col 断点逻辑一致) */\nconst getEffectiveSpan = (colProps?: ColEx | null, baseColProps?: ColEx | null, width?: number): number => {\n const w = width ?? (typeof window !== 'undefined' ? window.innerWidth : 1920)\n const col = colProps ?? {}\n const base = baseColProps ?? {}\n const fallback = base.span ?? 8\n if (w >= BREAKPOINTS.xl) return col.xl ?? base.xl ?? col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.lg) return col.lg ?? base.lg ?? col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.md) return col.md ?? base.md ?? col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n if (w >= BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n // if (w < BREAKPOINTS.sm) return col.sm ?? base.sm ?? col.xs ?? base.xs ?? col.span ?? fallback\n return col.xs ?? base.xs ?? col.span ?? fallback\n}\n\nconst { getSetting: getComponentSetting } = useComponentSetting()\nconst effectiveProps = computed(() => ({ ...getComponentSetting('ProForm'), ...props, ...innerProps.value }))\n/** 传给 ProFormItem 的自定义组件映射:显式合并 setSetting 与 props,避免响应式代理导致组件引用丢失 */\nconst formCustomComponents = computed(() => ({\n ...(getComponentSetting('ProForm').components as Record<string, unknown> | undefined) ?? {},\n ...(props.components ?? {}),\n ...(innerProps.value.components ?? {}),\n}))\nconst effectiveActionColOptions = computed(() => effectiveProps.value.actionColOptions ?? { span: 24 })\n\n/** 当前视口宽度,用于响应式计算 span */\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1920)\n\n/** 计算前 maxLines 行能容纳的 schema 数量(考虑栅格断点,每个 field 可有自己的 span) */\nconst getVisibleSchemaCount = (\n schemas: ProFormSchema[],\n baseColProps: ColEx | undefined,\n maxLines: number,\n width: number\n) => {\n let remaining = 24\n let rows = 1\n let count = 0\n for (const schema of schemas) {\n const span = getEffectiveSpan(schema.colProps, baseColProps, width)\n if (span > remaining) {\n rows++\n if (rows > maxLines) break\n remaining = 24 - span\n } else {\n remaining -= span\n }\n count++\n }\n return count\n}\n\nconst hasMoreFields = computed(() => {\n const schemas = innerSchemas.value.filter((s) => shouldShow(s))\n\n if (!effectiveProps.value.showAdvancedButton) return false\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n console.log(schemas.length, maxVisible)\n return schemas.length > maxVisible\n})\n\nconst formListeners = computed((): FormListeners => {\n return effectiveProps.value.formListeners ?? {}\n})\n\nconst displaySchemas = computed(() => {\n const schemas = innerSchemas.value.filter((s) => {\n return shouldShow(s)\n })\n if (!effectiveProps.value.showAdvancedButton || !collapsed.value) return schemas\n const lines = effectiveProps.value.alwaysShowLines ?? 1\n const baseColProps = effectiveProps.value.baseColProps\n const maxVisible = getVisibleSchemaCount(schemas, baseColProps, lines, windowWidth.value)\n return schemas.slice(0, maxVisible)\n})\n\nconst shouldShow = (schema: ProFormSchema) => {\n let ifShow = true\n let show = true\n if (typeof schema.ifShow === 'function') {\n ifShow = schema.ifShow({ schema, values: formModel.value, model: formModel.value, field: schema.field })\n }\n if (typeof schema.ifShow === 'boolean') {\n ifShow = schema.ifShow\n }\n if (typeof schema.show === 'function') {\n show = schema.show({ schema, values: formModel.value, model: formModel.value, field: schema.field })\n }\n if (typeof schema.show === 'boolean') {\n show = schema.show\n }\n return ifShow && show\n}\nconst getColProps = (schema: ProFormSchema) => {\n return schema.colProps ?? effectiveProps.value.baseColProps ?? {}\n}\nconst getSlotName = (schema: ProFormSchema) => schema.slot || schema.field\n\nconst initForm = () => {\n const model: Record<string, unknown> = {}\n const rules: Record<string, unknown[]> = {}\n const initialValues = effectiveProps.value.initialValues ?? props.initialValues\n innerSchemas.value.forEach((schema) => {\n model[schema.field] = schema.defaultValue ?? initialValues?.[schema.field]\n if (schema.rules?.length) rules[schema.field] = schema.rules\n })\n formModel.value = { ...formModel.value, ...model }\n formRules.value = rules\n}\n\nconst filterByIfShow = (values: Record<string, unknown>) => {\n const result = { ...values }\n innerSchemas.value.forEach((schema) => {\n const ifShow = schema.ifShow\n if (ifShow === undefined) return\n const visible = typeof ifShow === 'boolean' ? ifShow : ifShow({ schema, values, model: values, field: schema.field })\n if (!visible) delete result[schema.field]\n })\n return result\n}\n\nconst processFieldMapToTime = (values: Record<string, unknown>) => {\n const filtered = filterByIfShow(values)\n const fieldMap = innerProps.value.fieldMapToTime\n if (!fieldMap?.length) return filtered\n const result = { ...filtered }\n fieldMap.forEach(([field, [startKey, endKey]]) => {\n const val = result[field]\n if (Array.isArray(val) && val.length === 2) {\n delete result[field]\n ; (result as Record<string, unknown>)[startKey] = val[0]\n ; (result as Record<string, unknown>)[endKey] = val[1]\n }\n })\n return result\n}\n\nconst handleSubmit = async () => {\n try {\n await formRef.value?.validate()\n if (effectiveProps.value.submitFunc) {\n await effectiveProps.value.submitFunc()\n } else {\n submitLoading.value = true\n emit('submit', processFieldMapToTime({ ...formModel.value }))\n }\n } catch (e) {\n console.error('Form validation failed:', e)\n } finally {\n submitLoading.value = false\n }\n}\n\nconst handleReset = async () => {\n if (effectiveProps.value.resetFunc) {\n await effectiveProps.value.resetFunc()\n } else {\n formRef.value?.resetFields()\n initForm()\n emit('reset')\n if (effectiveProps.value.submitOnReset) await handleSubmit()\n }\n}\n\nconst setFieldsValue = (values: Record<string, unknown>) => {\n formModel.value = { ...formModel.value, ...values }\n return Promise.resolve()\n}\n\nconst getFieldsValue = () => processFieldMapToTime({ ...formModel.value })\n\nconst resetFields = async () => {\n formRef.value?.resetFields()\n initForm()\n}\n\nconst validate = (nameList?: string[]) =>\n formRef.value?.validate(nameList) ?? Promise.resolve()\n\nconst validateFields = (nameList?: string[]) => {\n if (!formRef.value) return Promise.resolve()\n if (!nameList?.length) return formRef.value.validate()\n return Promise.all(nameList.map((prop) => new Promise((resolve, reject) => {\n formRef.value.validateField(prop, (valid: boolean) => (valid ? resolve(undefined) : reject(new Error('Validation failed'))))\n })))\n}\n\nconst scrollToField = async (name: string, options?: ScrollToFieldOptions) => {\n const el = formWrapRef.value?.querySelector(`[data-field=\"${name}\"]`)\n if (el) {\n el.scrollIntoView({ behavior: options?.behavior ?? 'smooth', block: options?.block ?? 'nearest' })\n }\n return Promise.resolve()\n}\n\nconst clearValidate = (name?: string | string[]) => {\n formRef.value?.clearValidate(name)\n}\n\nconst updateSchema = async (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => {\n const list = Array.isArray(data) ? data : [data]\n list.forEach((item) => {\n const idx = innerSchemas.value.findIndex((s) => s.field === item.field)\n if (idx >= 0) innerSchemas.value[idx] = { ...innerSchemas.value[idx], ...item }\n })\n}\n\nconst appendSchemaByField = async (schema: ProFormSchema, prefixField?: string, first?: boolean) => {\n if (first) innerSchemas.value.unshift(schema)\n else if (prefixField) {\n const idx = innerSchemas.value.findIndex((s) => s.field === prefixField)\n innerSchemas.value.splice(idx + 1, 0, schema)\n } else innerSchemas.value.push(schema)\n initForm()\n}\n\nconst removeSchemaByField = async (field: string | string[]) => {\n const fields = Array.isArray(field) ? field : [field]\n innerSchemas.value = innerSchemas.value.filter((s) => !fields.includes(s.field))\n}\n\nconst setProps = async (formProps: Partial<ProFormProps>) => {\n innerProps.value = { ...innerProps.value, ...formProps }\n if (formProps.schemas) {\n innerSchemas.value = [...formProps.schemas]\n initForm()\n }\n}\n\nconst formActionRef: FormActionType = {\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit: handleSubmit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n}\n\ndefineExpose(formActionRef)\n\nconst syncSchemas = () => {\n innerSchemas.value = [...(props.schemas ?? [])]\n initForm()\n}\n\nconst handleResize = () => {\n if (typeof window !== 'undefined') windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n syncSchemas()\n emit('register', formActionRef)\n if (typeof window !== 'undefined') window.addEventListener('resize', handleResize)\n})\n\nonUnmounted(() => {\n if (typeof window !== 'undefined') window.removeEventListener('resize', handleResize)\n})\n\nwatch(() => [props.schemas, props.initialValues], syncSchemas, { deep: true })\n</script>\n\n<style scoped>\n.ecp-pro-form {\n padding: 16px;\n position: relative;\n}\n\n.ecp-pro-form__advance {\n margin-bottom: 16px;\n}\n\n.ecp-pro-form_col {\n position: relative;\n float: right;\n}\n\n.el-icon-d-arrow-left.up {\n transform: rotate(90deg);\n}\n\n.el-icon-d-arrow-left.down {\n transform: rotate(-90deg);\n}\n\n.ecp-form-actions__advance {\n position: absolute;\n bottom: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n</style>\n","import { ref, watch, unref, type Ref } from 'vue'\nimport type { ProFormSchema, ProFormProps, FormActionType } from '../types'\n\nexport interface UseFormProps extends ProFormProps {\n schemas?: ProFormSchema[]\n}\n\n/** 支持 ref/computed 的 props(参考 Vben Admin:参数 props 内的值可以是 computed 或者 ref 类型) */\nexport type UseFormPropsReactive = UseFormProps | Ref<UseFormProps | undefined>\n\nexport interface UseFormReturn {\n /** 用于 @register,接收表单实例的 formAction */\n register: (formAction: FormActionType) => void\n formAction: { value: FormActionType | null }\n getFieldsValue: () => Record<string, unknown>\n setFieldsValue: (values: Record<string, unknown>) => Promise<void>\n resetFields: () => Promise<void>\n validate: (nameList?: string[]) => Promise<unknown>\n validateFields: (nameList?: string[]) => Promise<unknown>\n submit: () => Promise<void>\n scrollToField: (name: string, options?: import('../types').ScrollToFieldOptions) => Promise<void>\n clearValidate: (name?: string | string[]) => void\n updateSchema: (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) => Promise<void>\n appendSchemaByField: (schema: ProFormSchema, prefixField?: string, first?: boolean) => Promise<void>\n removeSchemaByField: (field: string | string[]) => Promise<void>\n setProps: (props: Partial<ProFormProps>) => Promise<void>\n}\n\nexport function useForm(props?: UseFormPropsReactive): [UseFormReturn['register'], Omit<UseFormReturn, 'register'>] {\n const formAction = ref<FormActionType | null>(null)\n const formPropsRef = ref<UseFormProps | undefined>(props ? unref(props as Ref<UseFormProps | undefined>) : undefined)\n\n const getFormProps = () => (props ? unref(props as Ref<UseFormProps | undefined>) : undefined) as UseFormProps | undefined\n\n const register = (action: FormActionType) => {\n formAction.value = action\n const formProps = getFormProps()\n if (formProps && Object.keys(formProps).length > 0) {\n action.setProps(formProps)\n }\n }\n\n if (props) {\n watch(\n () => getFormProps(),\n (formProps) => {\n formPropsRef.value = formProps\n if (formProps && formAction.value) {\n formAction.value.setProps(formProps)\n }\n },\n { deep: true }\n )\n }\n\n const getFieldsValue = () => formAction.value?.getFieldsValue() ?? {}\n\n const setFieldsValue = async (values: Record<string, unknown>) => {\n await formAction.value?.setFieldsValue(values)\n }\n\n const resetFields = async () => {\n await formAction.value?.resetFields()\n }\n\n const validate = (nameList?: string[]) =>\n formAction.value?.validate(nameList) ?? Promise.resolve()\n\n const validateFields = (nameList?: string[]) =>\n formAction.value?.validateFields(nameList) ?? Promise.resolve()\n\n const submit = () => formAction.value?.submit() ?? Promise.resolve()\n\n const scrollToField = (name: string, options?: import('../types').ScrollToFieldOptions) =>\n formAction.value?.scrollToField(name, options) ?? Promise.resolve()\n\n const clearValidate = (name?: string | string[]) => {\n formAction.value?.clearValidate(name)\n }\n\n const updateSchema = (data: Partial<ProFormSchema> | Partial<ProFormSchema>[]) =>\n formAction.value?.updateSchema(data) ?? Promise.resolve()\n\n const appendSchemaByField = (schema: ProFormSchema, prefixField?: string, first?: boolean) =>\n formAction.value?.appendSchemaByField(schema, prefixField, first) ?? Promise.resolve()\n\n const removeSchemaByField = (field: string | string[]) =>\n formAction.value?.removeSchemaByField(field) ?? Promise.resolve()\n\n const setProps = async (formProps: Partial<ProFormProps>) => {\n formPropsRef.value = { ...formPropsRef.value, ...formProps }\n await formAction.value?.setProps(formProps)\n }\n\n const result: UseFormReturn = {\n register,\n formAction,\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n submit,\n scrollToField,\n clearValidate,\n updateSchema,\n appendSchemaByField,\n removeSchemaByField,\n setProps,\n }\n\n return [register, result]\n}\n","import type { VueConstructor } from 'vue'\nimport ProTable, { TableAction } from './ProTable'\nimport ProForm, { ProFormItem, FormActions } from './ProForm'\nimport { useForm } from './ProForm/useForm'\nimport { useProTable } from './ProTable/useProTable'\nimport { useComponentSetting } from './useComponentSetting'\n\nexport { ProForm, ProFormItem, FormActions, useForm }\nexport { ProTable, useProTable, TableAction }\nexport { useComponentSetting }\nexport type { UseComponentSettingReturn } from './useComponentSetting'\nexport type { UseProTableReturn, UseProTablePropsReactive } from './ProTable/useProTable'\nexport * from './ProTable/types'\nexport * from './types'\n\nconst components = [\n { name: 'ProTable', component: ProTable },\n { name: 'TableAction', component: TableAction },\n { name: 'ProForm', component: ProForm },\n { name: 'ProFormItem', component: ProFormItem },\n { name: 'FormActions', component: FormActions },\n]\n\nexport function install(Vue: VueConstructor) {\n components.forEach(({ name, component }) => {\n Vue.component(name, component)\n })\n}\n\nexport default {\n install,\n ProTable,\n ProForm,\n TableAction,\n}\n"],"names":["componentSettings","reactive","useComponentSetting","componentName","config","current","DefaultCellRenderer","defineComponent","p","col","r","h","text","_b","_a","BodyCellRenderer","slot","nodes","n","x","slots","useSlots","tableRef","ref","tableWrapRef","containerWidth","loading","props","innerData","rawDataSource","innerColumns","innerProps","selectedRows","showPaginationRef","pagination","getComponentSetting","effectiveProps","computed","showTitleBar","showPagination","rowKeyField","selectedKeysSet","displayColumns","c","fixedColumnsWidth","w","isRatioWidth","totalRatio","shouldShowColumn","sum","fixedDataColumnsWidth","getColumnWidth","parseWidthPx","v","available","result","minPx","maxPx","basePx","selectableRows","getDisabled","row","hasSelectableRows","isAllCurrentPageSelected","isIndeterminate","selectedCount","isRowSelected","getCheckboxDisabled","_c","getRadioDisabled","emitSelectionChange","keys","emit","handleCheckboxChange","checked","key","handleRadioSelect","handleSelectAll","keySet","toAdd","currentPageKeys","fetchData","opt","fs","pageField","sizeField","listField","totalField","params","processedParams","res","data","list","total","e","handleReload","handleSizeChange","size","handleCurrentChange","page","handleRowClick","_column","event","handleRowDblclick","handleSortChange","prop","order","handleExpandChange","expanded","findRowIndex","tableAction","cols","keyList","fromProps","ordered","k","info","rows","index","value","rowKey","record","idx","arr","show","childrenKey","flattenRows","children","expose","syncColumns","loadData","updateContainerWidth","resizeObserver","observedEl","onMounted","nextTick","onUnmounted","watch","normalizeTooltip","tooltip","getButtonType","action","filterVisible","item","ifShow","visibleActions","visibleDropDownActions","type","_d","title","okText","cancelText","MessageBox","useProTable","tableActionRef","getTableProps","unref","getTableAction","register","instance","tableProps","options","onVisibleChange","visible","fetchOptions","raw","labelKey","valueKey","o","rootRef","treeRef","dropdownVisible","filterText","treeData","flatLabelMap","treeProps","normalizeNode","node","out","buildFlatLabelMap","prefix","map","label","hasTreeDataProp","td","applyTreeData","syncFromTreeDataProp","normalized","displayText","filterNodeMethod","val","clickOutsideHandler","openDropdown","closeDropdown","clearValue","onNodeClick","BUILT_IN_COMPONENTS","renderParams","shouldRender","shouldShow","effectiveDisabled","dyn","effectiveRules","effectiveComponentPropsAndListeners","cp","propsOnly","listeners","eventName","effectiveComponentProps","effectiveComponentListeners","hasSlot","getOptions","opts","resolvedCustomComponent","setFieldValue","renderComponent","renderFn","formRef","formWrapRef","submitLoading","collapsed","formModel","formRules","innerSchemas","BREAKPOINTS","getEffectiveSpan","colProps","baseColProps","width","base","fallback","formCustomComponents","effectiveActionColOptions","windowWidth","getVisibleSchemaCount","schemas","maxLines","remaining","count","schema","span","hasMoreFields","s","lines","maxVisible","formListeners","displaySchemas","getColProps","getSlotName","initForm","model","rules","initialValues","filterByIfShow","values","processFieldMapToTime","filtered","fieldMap","field","startKey","endKey","handleSubmit","handleReset","setFieldsValue","getFieldsValue","resetFields","validate","nameList","validateFields","resolve","reject","valid","scrollToField","name","el","clearValidate","updateSchema","appendSchemaByField","prefixField","first","removeSchemaByField","fields","setProps","formProps","formActionRef","syncSchemas","handleResize","useForm","formAction","formPropsRef","getFormProps","components","ProTable","TableAction","ProForm","ProFormItem","FormActions","install","Vue","component"],"mappings":"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"}
|