Files
orico-officialWebsite-ts-admin/src/components/rulesForm/index.vue
2025-04-16 16:18:24 +08:00

241 lines
10 KiB
Vue

<template>
<el-form
:model="_ruleForm"
:rules="_rules"
:label-width="labelWidth ? labelWidth : '140px'"
ref="ruleFormRef"
:validate-on-rule-change="false"
>
<template v-for="item in formData" :key="item.prop">
<!-- :limit="1" -->
<el-form-item :label="item.label" :prop="item.prop" style="margin-bottom: 20px">
<template v-if="item.type === 'input'">
<el-input
style="width: 440px"
:placeholder="item.placeholder"
v-model="_ruleForm[`${item.prop}`]"
clearable
:disabled="item.disabled"
@blur="handleInputBlur"
/>
</template>
<template v-if="item.type === 'inputSelect'">
<el-input
:placeholder="item.placeholder"
v-model="_ruleForm[`${item.prop}`]"
clearable
:disabled="item.disabled"
@blur="handleInputBlur"
>
<template #append>
<el-select v-model="_ruleForm[`${item.prop1}`]" :placeholder="item.placeholder1" style="width: 115px">
<el-option
:label="option.label"
:value="option.value"
v-for="option in item.options"
:key="option.value"
/>
</el-select>
</template>
</el-input>
</template>
<template v-if="item.type === 'inputButton'">
<el-input
:placeholder="item.placeholder"
v-model="_ruleForm[`${item.prop}`]"
clearable
:disabled="item.disabled"
>
<template #append>
<el-button @click="handleInputButtonClick">选择</el-button>
</template>
</el-input>
</template>
<template v-if="item.type === 'inputNumber'">
<el-input-number
:min="1"
:max="9999"
:controls="true"
v-model="_ruleForm[`${item.prop}`]"
:disabled="item.disabled"
:placeholder="item.placeholder"
:maxlength="item.maxLength"
step-strictly
:step="1"
controls-position="right"
></el-input-number>
</template>
<template v-if="item.type === 'textarea'">
<el-input
type="textarea"
:placeholder="item.placeholder"
v-model="_ruleForm[`${item.prop}`]"
:autosize="{ minRows: 10, maxRows: 20 }"
:disabled="item.disabled"
style="width: 440px"
/>
</template>
<template v-if="item.type === 'date'">
<el-date-picker
v-model="_ruleForm[`${item.prop}`]"
type="date"
:placeholder="item.placeholder"
clearable
:disabled="item.disabled"
/>
</template>
<template v-if="item.type === 'datetime'">
<el-date-picker
v-model="_ruleForm[`${item.prop}`]"
type="datetime"
:placeholder="item.placeholder"
clearable
:disabled="item.disabled"
format="YYYY-MM-DD HH:mm:ss"
date-format="MMM DD, YYYY"
time-format="HH:mm"
/>
</template>
<template v-if="item.type === 'radio'">
<el-radio-group v-model="_ruleForm[`${item.prop}`]" @change="handleRadioGroup(_ruleForm[`${item.prop}`])">
<el-radio
:value="option.value"
:label="option.value"
v-for="(option, optionIndex) in item.options"
:key="optionIndex"
>{{ option.label }}</el-radio
>
</el-radio-group>
</template>
<!-- <template v-if="item.type === 'radio1'">
<el-radio-group v-model="_ruleForm[`${item.prop}`]">
<el-radio
:value="option.value"
:label="option.value"
v-for="(option, optionIndex) in item.options"
:key="optionIndex"
>{{ option.label }}</el-radio
>
</el-radio-group>
</template> -->
<template v-if="item.type === 'upImg'">
<UploadImg v-model:image-url="_ruleForm[`${item.prop}`]">
<template #tip>
<div class="el-upload__tip">{{ item.prompt }}</div>
</template>
</UploadImg>
</template>
<template v-if="item.type === 'table'">
<slot />
</template>
<template v-if="item.type === 'video'">
<UploadVideo width="440px" v-model:video-url="_ruleForm[`${item.prop}`]"> </UploadVideo>
</template>
<template v-if="item.type === 'select'">
<el-select
style="width: 240px"
v-model="_ruleForm[`${item.prop}`]"
:placeholder="item.placeholder"
clearable
@change="handleSelectChange(_ruleForm[`${item.prop}`], item.prop)"
>
<el-option
:label="option.label"
:value="option.value"
v-for="option in item.options"
:key="option.value"
/>
</el-select>
</template>
<template v-if="item.type === 'treeSelect'">
<el-tree-select
clearable
v-model="_ruleForm[`${item.prop}`]"
:data="item.options"
:placeholder="item.placeholder"
:render-after-expand="false"
show-checkbox
check-strictly
@change="handleSelectChange(_ruleForm[`${item.prop}`], item.prop)"
/>
</template>
<template v-if="item.type === 'treeSelects'">
<el-tree-select
v-model="_ruleForm[`${item.prop}`]"
:data="item.options"
multiple
:render-after-expand="false"
show-checkbox
check-strictly
check-on-click-node
style="width: 240px"
/>
</template>
<template v-if="item.type === 'treeSelectInput'">
<slot />
</template>
<template v-if="item.type === 'WangEditor'">
<WangEditor v-model:value="_ruleForm[`${item.prop}`]" />
</template>
</el-form-item>
</template>
</el-form>
</template>
<script setup lang="ts">
import type { FormInstance, FormRules } from "element-plus";
import UploadVideo from "@/components/Upload/UploadVideo.vue";
import UploadImg from "@/components/Upload/UploadImg.vue";
interface IProps {
ruleForm: { [key: string]: any };
formData: any[];
rules?: FormRules;
handleInputButton?: () => void;
isIndeterminate?: boolean;
labelWidth?: any;
handleInputBlurEmits?: () => void;
handleSelectChangeEmits?: () => void;
handleRadioGroupEmits?: () => void;
handleTreesSelectChangeEmits?: () => void;
}
const emits = defineEmits<{
(e: "handleInputButton", result?: Record<string, any>): void;
(e: "handleInputBlurEmits", result?: Record<string, any>): void;
(e: "handleSelectChangeEmits", result?: Record<string, any>): void;
(e: "handleRadioGroupEmits", result?: any): void;
(e: "handleTreesSelectChangeEmits", result?: any): void;
}>();
const ruleFormRef = ref<FormInstance>();
const props = defineProps<IProps>();
//本地化处理,props是单向的,通过本地化就可以改变父组件传过来的值了
const _ruleForm = computed(() => props.ruleForm);
// 接收 rules 并设置为响应式,必须要为响应式的,否则失效
const _rules = computed(() => props.rules);
//inputButton
const handleInputButtonClick = () => {
emits("handleInputButton", {});
};
const handleInputBlur = () => {
emits("handleInputBlurEmits");
};
const handleSelectChange = (params: any, prop: any) => {
emits("handleSelectChangeEmits", { id: params, prop });
};
// const handleTreesSelectChange = (params: any) => {
// emits("handleTreesSelectChangeEmits", params);
// };
const handleRadioGroup = (value: any) => {
emits("handleRadioGroupEmits", value);
};
// 暴露给父组件的参数和方法(外部需要什么,都可以从这里暴露出去)
defineExpose({
ruleForm: _ruleForm,
ruleFormRef: ruleFormRef
});
</script>
<style scoped lang="scss"></style>