blob: 8ea871132c3a8df20715bb89aed0d5114685f5c8 [file] [log] [blame]
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding
copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a
copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS
IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */
<template>
<el-form ref="formtable" :model="formData" :rules="rules" :inline="inline" :label-position="labelPosition" :class="{ 'demo-form-inline': inline, form_style: true, form_label: label }">
<el-form-item v-for="item of formItem" :key="item.itemID" :label="$t(item.label)" :prop="item.itemID" :style="{ width: item.labelWidth }">
<span v-if="iconArr.icon[item.icon]" class="icon_span">
<svg class="icon" aria-hidden="true">
<use :xlink:href="`#icon-${iconArr.icon[item.icon]}`"></use>
</svg>
</span>
<el-input
v-if="item.type === 'INPUT'"
v-model="formData[item.itemID]"
:size="item.size"
:style="{ width: item.width }"
:placeholder="$t(item.placeholder)"
:disabled="item.disabled"
@blur="getFormData"
@keyup.enter="getFormData"
:suffix-icon="item.suffixIcon"
:prefix-icon="item.prefixIcon"
>
<template #prepend v-if="item.inputHeader">{{ typeof item.inputHeaderText === 'function' ? item.inputHeaderText(formData, item) : formData[item.inputHeaderText] }}</template>
</el-input>
<el-select
v-if="item.type === 'SELECT'"
v-model="formData[item.itemID]"
:style="{ width: item.width }"
:multiple="item.multiple"
:size="item.size"
:collapse-tags="item.multiple"
placeholder="请选择"
@change="getFormData($event, 'select')"
>
<el-option v-for="item in item.options" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
<el-input :size="item.size" v-if="item.type === 'TEXT'" v-model="formData[item.itemID]" class="input-inner" :suffix-icon="item.suffixIcon" :prefix-icon="item.prefixIcon" readonly> </el-input>
<el-date-picker
v-model="formData[item.itemID]"
v-if="item.type === 'DATE'"
:size="item.size"
:style="{ width: item.width }"
prefix-icon=""
range-separator="~"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)]"
type="datetimerange"
:start-placeholder="$t(item.startPlaceholder)"
:end-placeholder="$t(item.endPlaceholder)"
:disabledDate="item.disabledDate"
@change="getFormData"
>
</el-date-picker>
<el-radio-group v-model="formData[item.itemID]" v-if="item.type === 'RADIO'" :size="item.size" :style="{ width: item.width }">
<el-radio label="true">true</el-radio>
<el-radio label="false">false</el-radio>
</el-radio-group>
<el-date-picker v-model="formData[item.itemID]" v-if="item.type === 'DATETIME'" type="datetime" :style="{ width: item.width }" :placeholder="item.placeholder"> </el-date-picker>
<el-input v-model="formData[item.itemID]" v-if="item.type === 'INPUTNUM'" :placeholder="$t(item.placeholder)" :style="{ width: item.width }" controls-position="right">
<template #append>
<span v-if="item.unit" style="padding: 0 10px">{{ item.unit }}</span>
<div class="icon_but">
<div
style="top: -1px"
@click.stop="
() => {
formData[item.itemID]++;
}
"
>
<span style="top: 0">
<i class="el-icon-caret-top" />
</span>
</div>
<div
class="down"
style="bottom: -2px"
@click.stop="
() => {
formData[item.itemID]--;
}
"
>
<span style="bottom: 0">
<i class="el-icon-caret-bottom" />
</span>
</div>
</div>
</template>
</el-input>
</el-form-item>
<input id="hiddenText" type="text" style="display: none" />
</el-form>
</template>
<script>
import { ElForm, ElFormItem, ElInput, ElDatePicker, ElSelect, ElOption, ElRadioGroup, ElRadio } from 'element-plus';
import { reactive, toRefs, ref } from 'vue';
// import { useI18n } from 'vue-i18n';
export default {
name: 'FormTable',
props: {
form: Array,
labelIcon: Boolean,
},
setup(props, { emit }) {
// const { t } = useI18n();
const formObj = reactive(props.form);
const label = reactive(props.labelIcon);
const iconArr = reactive({
icon: {
INT64: 'int64',
BOOLEAN: 'buer',
INT32: 'int32',
TEXT: 'TEXT',
DOUBLE: 'DOUBLE',
FLOAT: 'FLOAT',
},
});
const formtable = ref(null);
let prop = {};
const requiredArry = formObj.formItem.filter((item) => item.required);
if (requiredArry.length > 0) {
requiredArry.forEach((item) => {
prop[item.itemID] = item.rules;
});
}
const rules = reactive(prop);
function getFormData(val, type) {
emit('serchFormData', { value: val, type });
}
function checkData(obj) {
return new Promise((resolve, reject) => {
formtable.value.validate((valid) => {
if (valid) {
// alert('成功');
obj.flag = false;
return resolve('success');
} else {
obj.flag = true;
return reject('error');
}
});
});
}
function clearValidator() {
formtable.value.clearValidate();
}
return {
...toRefs(formObj),
iconArr,
label,
formtable,
rules,
clearValidator,
checkData,
getFormData,
};
},
components: {
ElForm,
ElFormItem,
ElInput,
ElDatePicker,
ElSelect,
ElOption,
ElRadioGroup,
ElRadio,
},
};
</script>
<style lang="scss" scoped>
.demo-form-inline {
display: flex;
}
</style>
<style lang="scss">
.form_label {
.el-form-item__label {
padding: 0 20px;
}
.icon_span {
position: absolute;
top: -1px;
left: 0;
}
}
.form_style {
.el-form-item__content {
vertical-align: middle;
line-height: 30px;
}
.el-input__icon {
line-height: 30px;
}
.el-input-group__append {
line-height: 23px;
background: #fff;
padding: 0 0;
overflow: hidden;
}
.el-input-group__prepend {
line-height: 23px;
}
.icon_but {
flex-direction: column;
display: inline-flex;
width: 30px;
justify-content: space-evenly;
div {
cursor: pointer;
width: 30px;
height: 13px;
text-align: center;
border: 1px solid #e7eaf2;
position: absolute;
span {
right: 7px;
position: absolute;
line-height: 0px;
}
}
}
}
.input-inner {
.el-input__inner {
border: none !important;
}
}
</style>