|
@@ -1,20 +1,9 @@
|
|
<template>
|
|
<template>
|
|
<div>
|
|
<div>
|
|
- <van-form
|
|
|
|
- @submit="onSubmit"
|
|
|
|
- :disabled="formOption.disabled"
|
|
|
|
- :readonly="formOption.readonly"
|
|
|
|
- :label-width="formOption.labelWidth"
|
|
|
|
- :label-align="formOption.labelAlign || 'top'"
|
|
|
|
- :scroll-to-error="formOption.scroll"
|
|
|
|
- ref="testForm"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-form @submit="onSubmit" :disabled="formOption.disabled" :readonly="formOption.readonly" :label-width="formOption.labelWidth"
|
|
|
|
+ :label-align="formOption.labelAlign || 'top'" :scroll-to-error="formOption.scroll" ref="testForm">
|
|
<van-cell-group inset>
|
|
<van-cell-group inset>
|
|
- <div
|
|
|
|
- v-for="(i, index) in formConfig"
|
|
|
|
- :key="index"
|
|
|
|
- :style="i.style || ''"
|
|
|
|
- >
|
|
|
|
|
|
+ <div v-for="(i, index) in formConfig" :key="index" :style="i.style || ''">
|
|
<van-field v-if="i.type == 'title'" style="background: #ecebeb">
|
|
<van-field v-if="i.type == 'title'" style="background: #ecebeb">
|
|
<template #input>
|
|
<template #input>
|
|
<div class="_title">
|
|
<div class="_title">
|
|
@@ -22,335 +11,137 @@
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
</van-field>
|
|
</van-field>
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'input'"
|
|
|
|
- v-model="formData[i.prop]"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- :type="i.itemType ? i.itemType : 'text'"
|
|
|
|
- :placeholder="i.placeholder ? i.placeholder : '请输入'"
|
|
|
|
- :clearable="i.clearable ? i.clearable : false"
|
|
|
|
- :readonly="getFieldReadonly(i)"
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- :right-icon="i.isNeedRightBtn ? i.rightIcon : ''"
|
|
|
|
- @click-right-icon="i.isNeedRightBtn ? i.rightIconClick() : () => {}"
|
|
|
|
- @blur="
|
|
|
|
|
|
+ <van-field v-if="i.type == 'input'" v-model="formData[i.prop]" :label="i.label" :name="i.prop" :type="i.itemType ? i.itemType : 'text'"
|
|
|
|
+ :placeholder="i.placeholder ? i.placeholder : '请输入'" :clearable="i.clearable ? i.clearable : false"
|
|
|
|
+ :readonly="getFieldReadonly(i)" :rules="getRules(i)" :required="getRequired(i)" :right-icon="i.isNeedRightBtn ? i.rightIcon : ''"
|
|
|
|
+ @click-right-icon="i.isNeedRightBtn ? i.rightIconClick() : () => {}" @blur="
|
|
i.isNeedBlurMethon ? i.blurMethon(formData[i.prop]) : () => {}
|
|
i.isNeedBlurMethon ? i.blurMethon(formData[i.prop]) : () => {}
|
|
- "
|
|
|
|
- @input="
|
|
|
|
|
|
+ " @input="
|
|
() => {
|
|
() => {
|
|
return i.inputFn ? i.inputFn(formData[i.prop]) : () => {};
|
|
return i.inputFn ? i.inputFn(formData[i.prop]) : () => {};
|
|
}
|
|
}
|
|
- "
|
|
|
|
- >
|
|
|
|
|
|
+ ">
|
|
</van-field>
|
|
</van-field>
|
|
<!-- switch -->
|
|
<!-- switch -->
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'switch'"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-field v-if="i.type == 'switch'" :label="i.label" :name="i.prop" :required="getRequired(i)">
|
|
<template #input>
|
|
<template #input>
|
|
<van-switch v-model="formData[i.prop]" />
|
|
<van-switch v-model="formData[i.prop]" />
|
|
</template>
|
|
</template>
|
|
</van-field>
|
|
</van-field>
|
|
<!-- 多选checkbox -->
|
|
<!-- 多选checkbox -->
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'checkbox'"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-field v-if="i.type == 'checkbox'" :label="i.label" :name="i.prop" :rules="getRules(i)" :required="getRequired(i)">
|
|
<template #input>
|
|
<template #input>
|
|
- <van-checkbox-group
|
|
|
|
- v-model="formData[i.prop]"
|
|
|
|
- direction="horizontal"
|
|
|
|
- >
|
|
|
|
- <van-checkbox
|
|
|
|
- shape="square"
|
|
|
|
- v-for="j in i.data"
|
|
|
|
- :key="j.value"
|
|
|
|
- :name="j.value"
|
|
|
|
- >{{ j.text }}</van-checkbox
|
|
|
|
- >
|
|
|
|
|
|
+ <van-checkbox-group v-model="formData[i.prop]" direction="horizontal">
|
|
|
|
+ <van-checkbox shape="square" v-for="j in i.data" :key="j.value" :name="j.value">{{ j.text }}</van-checkbox>
|
|
</van-checkbox-group>
|
|
</van-checkbox-group>
|
|
</template>
|
|
</template>
|
|
</van-field>
|
|
</van-field>
|
|
<!-- 单选radio -->
|
|
<!-- 单选radio -->
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'radio'"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-field v-if="i.type == 'radio'" :label="i.label" :name="i.prop" :rules="getRules(i)" :required="getRequired(i)">
|
|
<template #input>
|
|
<template #input>
|
|
- <van-radio-group
|
|
|
|
- v-model="formData[i.prop]"
|
|
|
|
- direction="horizontal"
|
|
|
|
- >
|
|
|
|
- <van-radio
|
|
|
|
- v-for="j in i.data"
|
|
|
|
- :key="j.value"
|
|
|
|
- :name="j.value || j.id"
|
|
|
|
- >{{ j.label || j.title }}</van-radio
|
|
|
|
- >
|
|
|
|
|
|
+ <van-radio-group v-model="formData[i.prop]" direction="horizontal">
|
|
|
|
+ <van-radio v-for="j in i.data" :key="j.value" :name="j.value || j.id">{{ j.label || j.title }}</van-radio>
|
|
</van-radio-group>
|
|
</van-radio-group>
|
|
</template>
|
|
</template>
|
|
</van-field>
|
|
</van-field>
|
|
<!-- 单选 -->
|
|
<!-- 单选 -->
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'picker' && i.itemType == 'onePicker'"
|
|
|
|
- v-show="!i.showStatus"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- v-model="formData[i.prop + 'Name']"
|
|
|
|
- is-link
|
|
|
|
- :readonly="true"
|
|
|
|
- :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
- @click="
|
|
|
|
|
|
+ <van-field v-if="i.type == 'picker' && i.itemType == 'onePicker'" v-show="!i.showStatus" :label="i.label" :name="i.prop"
|
|
|
|
+ v-model="formData[i.prop + 'Name']" is-link :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'" @click="
|
|
() =>
|
|
() =>
|
|
formOption.readonly || i.readonly ? '' : (i.showPicker = true)
|
|
formOption.readonly || i.readonly ? '' : (i.showPicker = true)
|
|
- "
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- >
|
|
|
|
|
|
+ " :rules="getRules(i)" :required="getRequired(i)">
|
|
</van-field>
|
|
</van-field>
|
|
- <van-popup
|
|
|
|
- v-model:show="i.showPicker"
|
|
|
|
- round
|
|
|
|
- position="bottom"
|
|
|
|
- v-if="i.type == 'picker' && i.itemType == 'onePicker'"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-popup v-model:show="i.showPicker" round position="bottom" v-if="i.type == 'picker' && i.itemType == 'onePicker'">
|
|
<div class="searchBox">
|
|
<div class="searchBox">
|
|
- <van-search
|
|
|
|
- v-if="i.isNeedSearch && i.isNeedSearch === true"
|
|
|
|
- v-model="i.searchKeyword"
|
|
|
|
- show-action
|
|
|
|
- label=""
|
|
|
|
- placeholder="请输入搜索关键词"
|
|
|
|
- @search="onSearchData(i)"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-search v-if="i.isNeedSearch && i.isNeedSearch === true" v-model="i.searchKeyword" show-action label="" placeholder="请输入搜索关键词"
|
|
|
|
+ @search="onSearchData(i)">
|
|
<template #action>
|
|
<template #action>
|
|
<div @click="onSearchData(i)">搜索</div>
|
|
<div @click="onSearchData(i)">搜索</div>
|
|
</template>
|
|
</template>
|
|
</van-search>
|
|
</van-search>
|
|
</div>
|
|
</div>
|
|
- <van-picker
|
|
|
|
- :columns="i.data"
|
|
|
|
- :columns-field-names="
|
|
|
|
|
|
+ <van-picker :columns="i.data" :columns-field-names="
|
|
i.fieldNames ? i.fieldNames : onePickerFieldNames
|
|
i.fieldNames ? i.fieldNames : onePickerFieldNames
|
|
- "
|
|
|
|
- @cancel="i.showPicker = false"
|
|
|
|
- @confirm="
|
|
|
|
|
|
+ " @cancel="i.showPicker = false" @confirm="
|
|
(option) =>
|
|
(option) =>
|
|
i.changeFn
|
|
i.changeFn
|
|
? i.changeFn(option, i, index)
|
|
? i.changeFn(option, i, index)
|
|
: onConfirmPicker(option, i, index)
|
|
: onConfirmPicker(option, i, index)
|
|
- "
|
|
|
|
- />
|
|
|
|
|
|
+ " />
|
|
</van-popup>
|
|
</van-popup>
|
|
<!-- 多选 -->
|
|
<!-- 多选 -->
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'"
|
|
|
|
- v-show="!i.showStatus"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- v-model="formData[i.prop + 'Name']"
|
|
|
|
- is-link
|
|
|
|
- :readonly="true"
|
|
|
|
- :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
- @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-field v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'" v-show="!i.showStatus" :label="i.label" :name="i.prop"
|
|
|
|
+ v-model="formData[i.prop + 'Name']" is-link :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
+ @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)">
|
|
</van-field>
|
|
</van-field>
|
|
- <van-popup
|
|
|
|
- v-model:show="i.showPicker"
|
|
|
|
- round
|
|
|
|
- position="bottom"
|
|
|
|
- :style="{ height: '40%' }"
|
|
|
|
- v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'"
|
|
|
|
- >
|
|
|
|
- <van-checkbox-group
|
|
|
|
- v-model="formData[i.prop]"
|
|
|
|
- @change="
|
|
|
|
|
|
+ <van-popup v-model:show="i.showPicker" round position="bottom" :style="{ height: '40%' }"
|
|
|
|
+ v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'">
|
|
|
|
+ <van-checkbox-group v-model="formData[i.prop]" @change="
|
|
changeCheckboxGroup(formData, i.prop, i.data, i.fieldNames)
|
|
changeCheckboxGroup(formData, i.prop, i.data, i.fieldNames)
|
|
- "
|
|
|
|
- class="multipleChoice"
|
|
|
|
- >
|
|
|
|
- <van-checkbox
|
|
|
|
- v-for="item in i.data"
|
|
|
|
- :key="item.value"
|
|
|
|
- :name="item.value"
|
|
|
|
- >{{ item.text }}</van-checkbox
|
|
|
|
- >
|
|
|
|
|
|
+ " class="multipleChoice">
|
|
|
|
+ <van-checkbox v-for="item in i.data" :key="item.value" :name="item.value">{{ item.text }}</van-checkbox>
|
|
</van-checkbox-group>
|
|
</van-checkbox-group>
|
|
</van-popup>
|
|
</van-popup>
|
|
<!-- 时间选择器 -->
|
|
<!-- 时间选择器 -->
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'picker' && i.itemType == 'datePicker'"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- v-model="formData[i.prop]"
|
|
|
|
- is-link
|
|
|
|
- :readonly="true"
|
|
|
|
- :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
- @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-field v-if="i.type == 'picker' && i.itemType == 'datePicker'" :label="i.label" :name="i.prop" v-model="formData[i.prop]" is-link
|
|
|
|
+ :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
+ @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)">
|
|
</van-field>
|
|
</van-field>
|
|
- <van-popup
|
|
|
|
- v-model:show="i.showPicker"
|
|
|
|
- round
|
|
|
|
- position="bottom"
|
|
|
|
- v-if="i.type == 'picker' && i.itemType == 'datePicker'"
|
|
|
|
- >
|
|
|
|
- <van-date-picker
|
|
|
|
- v-model="currentDate"
|
|
|
|
- @confirm="(option) => onConfirmPicker(option, i, index)"
|
|
|
|
- @cancel="i.showPicker = false"
|
|
|
|
- :min-date="i.minDate"
|
|
|
|
- :max-date="i.maxDate"
|
|
|
|
- :columns-type="i.columnsType"
|
|
|
|
- />
|
|
|
|
|
|
+ <van-popup v-model:show="i.showPicker" round position="bottom" v-if="i.type == 'picker' && i.itemType == 'datePicker'">
|
|
|
|
+ <van-date-picker v-model="currentDate" @confirm="(option) => onConfirmPicker(option, i, index)" @cancel="i.showPicker = false"
|
|
|
|
+ :min-date="i.minDate" :max-date="i.maxDate" :columns-type="i.columnsType" />
|
|
</van-popup>
|
|
</van-popup>
|
|
<!-- 时间选择器 带时分秒 -->
|
|
<!-- 时间选择器 带时分秒 -->
|
|
|
|
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'picker' && i.itemType == 'datePickerTime'"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- v-model="formData[i.prop]"
|
|
|
|
- is-link
|
|
|
|
- :readonly="true"
|
|
|
|
- :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
- @click="
|
|
|
|
|
|
+ <van-field v-if="i.type == 'picker' && i.itemType == 'datePickerTime'" :label="i.label" :name="i.prop" v-model="formData[i.prop]" is-link
|
|
|
|
+ :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'" @click="
|
|
() =>
|
|
() =>
|
|
!formOption.readonly
|
|
!formOption.readonly
|
|
? i.needDefault
|
|
? i.needDefault
|
|
? defaultTimeFn(i, index)
|
|
? defaultTimeFn(i, index)
|
|
: (i.showPicker = true)
|
|
: (i.showPicker = true)
|
|
: ''
|
|
: ''
|
|
- "
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- >
|
|
|
|
|
|
+ " :rules="getRules(i)" :required="getRequired(i)">
|
|
</van-field>
|
|
</van-field>
|
|
- <van-popup
|
|
|
|
- v-model:show="i.showPicker"
|
|
|
|
- round
|
|
|
|
- position="bottom"
|
|
|
|
- v-if="i.type == 'picker' && i.itemType == 'datePickerTime'"
|
|
|
|
- >
|
|
|
|
- <van-picker-group
|
|
|
|
- :tabs="['日期', '时间']"
|
|
|
|
- @confirm="() => datePickerTimeConfirm(i, index)"
|
|
|
|
- @cancel="i.showPicker = false"
|
|
|
|
- >
|
|
|
|
- <van-date-picker
|
|
|
|
- v-model="datePickerDateArr"
|
|
|
|
- :columns-type="i.columnsType"
|
|
|
|
- />
|
|
|
|
- <van-time-picker
|
|
|
|
- v-model="datePickerTimeArr"
|
|
|
|
- :columns-type="['hour', 'minute', 'second']"
|
|
|
|
- />
|
|
|
|
|
|
+ <van-popup v-model:show="i.showPicker" round position="bottom" v-if="i.type == 'picker' && i.itemType == 'datePickerTime'">
|
|
|
|
+ <van-picker-group :tabs="['日期', '时间']" @confirm="() => datePickerTimeConfirm(i, index)" @cancel="i.showPicker = false">
|
|
|
|
+ <van-date-picker v-model="datePickerDateArr" :columns-type="i.columnsType" />
|
|
|
|
+ <van-time-picker v-model="datePickerTimeArr" :columns-type="['hour', 'minute', 'second']" />
|
|
</van-picker-group>
|
|
</van-picker-group>
|
|
</van-popup>
|
|
</van-popup>
|
|
<!-- 级联 城市 -->
|
|
<!-- 级联 城市 -->
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'cascader' && i.itemType == 'city'"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- v-model="formData[i.prop + 'Name']"
|
|
|
|
- is-link
|
|
|
|
- :readonly="true"
|
|
|
|
- :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
- @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- />
|
|
|
|
- <van-popup
|
|
|
|
- v-if="i.type == 'cascader' && i.itemType == 'city'"
|
|
|
|
- v-model:show="i.showPicker"
|
|
|
|
- round
|
|
|
|
- position="bottom"
|
|
|
|
- >
|
|
|
|
- <van-cascader
|
|
|
|
- v-model="formData[i.prop]"
|
|
|
|
- :title="i.title ? i.title : '请选择'"
|
|
|
|
- :options="cityOption"
|
|
|
|
- @close="i.showPicker = false"
|
|
|
|
- @change="(option) => cityOnChange(option, i, index)"
|
|
|
|
- @finish="
|
|
|
|
|
|
+ <van-field v-if="i.type == 'cascader' && i.itemType == 'city'" :label="i.label" :name="i.prop" v-model="formData[i.prop + 'Name']" is-link
|
|
|
|
+ :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
+ @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)" />
|
|
|
|
+ <van-popup v-if="i.type == 'cascader' && i.itemType == 'city'" v-model:show="i.showPicker" round position="bottom">
|
|
|
|
+ <van-cascader v-model="formData[i.prop]" :title="i.title ? i.title : '请选择'" :options="cityOption" @close="i.showPicker = false"
|
|
|
|
+ @change="(option) => cityOnChange(option, i, index)" @finish="
|
|
(option) =>
|
|
(option) =>
|
|
i.finishFn ? i.finishFn(option) : () => (i.showPicker = false)
|
|
i.finishFn ? i.finishFn(option) : () => (i.showPicker = false)
|
|
- "
|
|
|
|
- />
|
|
|
|
|
|
+ " />
|
|
</van-popup>
|
|
</van-popup>
|
|
<!-- 级联 公共 -->
|
|
<!-- 级联 公共 -->
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'cascader' && i.itemType == 'common'"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- v-model="formData[i.prop + 'Name']"
|
|
|
|
- is-link
|
|
|
|
- :readonly="true"
|
|
|
|
- :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
- @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- />
|
|
|
|
- <van-popup
|
|
|
|
- v-if="i.type == 'cascader' && i.itemType == 'common'"
|
|
|
|
- v-model:show="i.showPicker"
|
|
|
|
- round
|
|
|
|
- position="bottom"
|
|
|
|
- >
|
|
|
|
- <van-cascader
|
|
|
|
- v-model="formData[i.prop]"
|
|
|
|
- :title="i.title ? i.title : '请选择'"
|
|
|
|
- :options="i.data"
|
|
|
|
- :field-names="i.fieldNames ? i.fieldNames : fieldNames"
|
|
|
|
- @close="i.showPicker = false"
|
|
|
|
- @change="(option) => commonOnChange(option, i, index)"
|
|
|
|
- @finish="
|
|
|
|
|
|
+ <van-field v-if="i.type == 'cascader' && i.itemType == 'common'" :label="i.label" :name="i.prop" v-model="formData[i.prop + 'Name']" is-link
|
|
|
|
+ :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
+ @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)" />
|
|
|
|
+ <van-popup v-if="i.type == 'cascader' && i.itemType == 'common'" v-model:show="i.showPicker" round position="bottom">
|
|
|
|
+ <van-cascader v-model="formData[i.prop]" :title="i.title ? i.title : '请选择'" :options="i.data"
|
|
|
|
+ :field-names="i.fieldNames ? i.fieldNames : fieldNames" @close="i.showPicker = false"
|
|
|
|
+ @change="(option) => commonOnChange(option, i, index)" @finish="
|
|
(option) =>
|
|
(option) =>
|
|
i.finishFn ? i.finishFn(i, option) : handleCommonFinish(index)
|
|
i.finishFn ? i.finishFn(i, option) : handleCommonFinish(index)
|
|
- "
|
|
|
|
- />
|
|
|
|
|
|
+ " />
|
|
</van-popup>
|
|
</van-popup>
|
|
<!-- 文件上传 -->
|
|
<!-- 文件上传 -->
|
|
- <van-field
|
|
|
|
- name="uploader"
|
|
|
|
- v-if="i.type == 'upload'"
|
|
|
|
- :label="i.label"
|
|
|
|
- :readonly="i.readonly ? true : false"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-field name="uploader" v-if="i.type == 'upload'" :label="i.label" :readonly="i.readonly ? true : false">
|
|
<template #input>
|
|
<template #input>
|
|
- <van-uploader
|
|
|
|
- v-model="formData[i.prop]"
|
|
|
|
- :after-read="afterRead"
|
|
|
|
- multiple
|
|
|
|
- :show-upload="i.showUpload === undefined ? true : i.showUpload"
|
|
|
|
- :max-count="9"
|
|
|
|
- :max-size="5 * 1024 * 1024"
|
|
|
|
- @oversize="onOversize"
|
|
|
|
- />
|
|
|
|
|
|
+ <van-uploader v-model="formData[i.prop]" :after-read="afterRead" multiple
|
|
|
|
+ :show-upload="i.showUpload === undefined ? true : i.showUpload" :max-count="9" :max-size="5 * 1024 * 1024"
|
|
|
|
+ @oversize="onOversize" />
|
|
</template>
|
|
</template>
|
|
</van-field>
|
|
</van-field>
|
|
<!-- 插槽 -->
|
|
<!-- 插槽 -->
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'slot'"
|
|
|
|
- :label="i.label"
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-field v-if="i.type == 'slot'" :label="i.label" :rules="getRules(i)" :required="getRequired(i)">
|
|
<template #input>
|
|
<template #input>
|
|
<div style="width: 100%">
|
|
<div style="width: 100%">
|
|
<slot :name="i.slotName"> {{ i.slotName }}插槽占位符 </slot>
|
|
<slot :name="i.slotName"> {{ i.slotName }}插槽占位符 </slot>
|
|
@@ -360,123 +151,64 @@
|
|
</div>
|
|
</div>
|
|
</van-cell-group>
|
|
</van-cell-group>
|
|
<!-- 循环业务数据 -->
|
|
<!-- 循环业务数据 -->
|
|
- <van-cell-group
|
|
|
|
- inset
|
|
|
|
- v-for="(item, index) in formData[btnConfigCopy.prop]"
|
|
|
|
- :key="index"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-cell-group inset v-for="(item, index) in formData[btnConfigCopy.prop]" :key="index">
|
|
<div class="row">
|
|
<div class="row">
|
|
<div>{{ btnConfigCopy.listTitle || "明细" }}{{ index + 1 }}</div>
|
|
<div>{{ btnConfigCopy.listTitle || "明细" }}{{ index + 1 }}</div>
|
|
- <van-button
|
|
|
|
- plain
|
|
|
|
- type="primary"
|
|
|
|
- @click="handleRemove(index, btnConfigCopy)"
|
|
|
|
- size="mini"
|
|
|
|
- style="border: none; background: #ecebeb"
|
|
|
|
- :disabled="formOption.readonly"
|
|
|
|
- v-if="
|
|
|
|
|
|
+ <van-button plain type="primary" @click="handleRemove(index, btnConfigCopy)" size="mini" style="border: none; background: #ecebeb"
|
|
|
|
+ :disabled="formOption.readonly" v-if="
|
|
formOption.btnConfig !== undefined && formOption.btnConfig.isNeed
|
|
formOption.btnConfig !== undefined && formOption.btnConfig.isNeed
|
|
- "
|
|
|
|
- >删除</van-button
|
|
|
|
- >
|
|
|
|
|
|
+ ">删除</van-button>
|
|
</div>
|
|
</div>
|
|
<!-- 循环表单数据 -->
|
|
<!-- 循环表单数据 -->
|
|
<div v-for="(i, sonIndex) in btnConfigCopy.listConfig" :key="i.prop">
|
|
<div v-for="(i, sonIndex) in btnConfigCopy.listConfig" :key="i.prop">
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'input'"
|
|
|
|
- v-model="formData[btnConfigCopy.prop][index][i.prop]"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- :type="i.itemType ? i.itemType : 'text'"
|
|
|
|
- :placeholder="i.placeholder ? i.placeholder : '请输入'"
|
|
|
|
- :clearable="i.clearable ? i.clearable : false"
|
|
|
|
- :readonly="getFieldReadonly(i)"
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- @change="
|
|
|
|
|
|
+ <van-field v-if="i.type == 'input'" v-model="formData[btnConfigCopy.prop][index][i.prop]" :label="i.label" :name="i.prop"
|
|
|
|
+ :type="i.itemType ? i.itemType : 'text'" :placeholder="i.placeholder ? i.placeholder : '请输入'"
|
|
|
|
+ :clearable="i.clearable ? i.clearable : false" :readonly="getFieldReadonly(i)" :rules="getRules(i)" :required="getRequired(i)"
|
|
|
|
+ @change="
|
|
(val) => {
|
|
(val) => {
|
|
return i.changeFn ? i.changeFn(index, val) : () => {};
|
|
return i.changeFn ? i.changeFn(index, val) : () => {};
|
|
}
|
|
}
|
|
- "
|
|
|
|
- >
|
|
|
|
|
|
+ ">
|
|
</van-field>
|
|
</van-field>
|
|
<!-- 单选 -->
|
|
<!-- 单选 -->
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'picker' && i.itemType == 'onePicker'"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- v-model="formData[btnConfigCopy.prop][index][i.prop + 'Name']"
|
|
|
|
- is-link
|
|
|
|
- :readonly="true"
|
|
|
|
- :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
- @click="handleListItemClick(i, index, sonIndex)"
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-field v-if="i.type == 'picker' && i.itemType == 'onePicker'" :label="i.label" :name="i.prop"
|
|
|
|
+ v-model="formData[btnConfigCopy.prop][index][i.prop + 'Name']" is-link :readonly="true"
|
|
|
|
+ :placeholder="i.placeholder ? i.placeholder : '请选择'" @click="handleListItemClick(i, index, sonIndex)" :rules="getRules(i)"
|
|
|
|
+ :required="getRequired(i)">
|
|
<template #input v-if="i.isShowScanCode">
|
|
<template #input v-if="i.isShowScanCode">
|
|
<div style="display: flex; height: 24px">
|
|
<div style="display: flex; height: 24px">
|
|
<div style="width: calc(100vw - 100px)">
|
|
<div style="width: calc(100vw - 100px)">
|
|
{{ formData[btnConfigCopy.prop][index][i.prop + "Name"] }}
|
|
{{ formData[btnConfigCopy.prop][index][i.prop + "Name"] }}
|
|
</div>
|
|
</div>
|
|
<div style="width: 100px; float: right; margin-top: -20px">
|
|
<div style="width: 100px; float: right; margin-top: -20px">
|
|
- <van-button
|
|
|
|
- plain
|
|
|
|
- type="primary"
|
|
|
|
- @click.native.stop="i.scanCode(index)"
|
|
|
|
- size="mini"
|
|
|
|
- style="border: none"
|
|
|
|
- >扫码</van-button
|
|
|
|
- >
|
|
|
|
|
|
+ <van-button plain type="primary" @click.native.stop="i.scanCode(index)" size="mini" style="border: none">扫码</van-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
</van-field>
|
|
</van-field>
|
|
<!-- 时间选择器 -->
|
|
<!-- 时间选择器 -->
|
|
- <van-field
|
|
|
|
- v-if="i.type == 'picker' && i.itemType == 'datePicker'"
|
|
|
|
- :label="i.label"
|
|
|
|
- :name="i.prop"
|
|
|
|
- v-model="formData[btnConfigCopy.prop][index][i.prop]"
|
|
|
|
- is-link
|
|
|
|
- :readonly="true"
|
|
|
|
- :placeholder="i.placeholder ? i.placeholder : '请选择'"
|
|
|
|
- @click="handleListItemClick(i, index, sonIndex)"
|
|
|
|
- :rules="getRules(i)"
|
|
|
|
- :required="getRequired(i)"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-field v-if="i.type == 'picker' && i.itemType == 'datePicker'" :label="i.label" :name="i.prop"
|
|
|
|
+ v-model="formData[btnConfigCopy.prop][index][i.prop]" is-link :readonly="true"
|
|
|
|
+ :placeholder="i.placeholder ? i.placeholder : '请选择'" @click="handleListItemClick(i, index, sonIndex)" :rules="getRules(i)"
|
|
|
|
+ :required="getRequired(i)">
|
|
</van-field>
|
|
</van-field>
|
|
</div>
|
|
</div>
|
|
</van-cell-group>
|
|
</van-cell-group>
|
|
<!-- 单独写个循环,保证弹窗唯一 -->
|
|
<!-- 单独写个循环,保证弹窗唯一 -->
|
|
<div v-for="(item, index) in btnConfigCopy.listConfig" :key="index">
|
|
<div v-for="(item, index) in btnConfigCopy.listConfig" :key="index">
|
|
- <van-popup
|
|
|
|
- v-model:show="item.showPicker"
|
|
|
|
- round
|
|
|
|
- position="bottom"
|
|
|
|
- v-if="item.type == 'picker' && item.itemType == 'onePicker'"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-popup v-model:show="item.showPicker" round position="bottom" v-if="item.type == 'picker' && item.itemType == 'onePicker'">
|
|
<div class="searchBox">
|
|
<div class="searchBox">
|
|
- <van-search
|
|
|
|
- v-if="item.isNeedSearch && item.isNeedSearch === true"
|
|
|
|
- v-model="item.searchKeyword"
|
|
|
|
- show-action
|
|
|
|
- label=""
|
|
|
|
- placeholder="请输入搜索关键词"
|
|
|
|
- @search="onSearchData(item)"
|
|
|
|
- >
|
|
|
|
|
|
+ <van-search v-if="item.isNeedSearch && item.isNeedSearch === true" v-model="item.searchKeyword" show-action label=""
|
|
|
|
+ placeholder="请输入搜索关键词" @search="onSearchData(item)">
|
|
<template #action>
|
|
<template #action>
|
|
<div @click="onSearchData(item)">搜索</div>
|
|
<div @click="onSearchData(item)">搜索</div>
|
|
</template>
|
|
</template>
|
|
</van-search>
|
|
</van-search>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
- <van-picker
|
|
|
|
- :columns="item.data"
|
|
|
|
- :columns-field-names="
|
|
|
|
|
|
+ <van-picker :columns="item.data" :columns-field-names="
|
|
item.fieldNames ? item.fieldNames : onePickerFieldNames
|
|
item.fieldNames ? item.fieldNames : onePickerFieldNames
|
|
- "
|
|
|
|
- @cancel="item.showPicker = false"
|
|
|
|
- @confirm="
|
|
|
|
|
|
+ " @cancel="item.showPicker = false" @confirm="
|
|
(option) =>
|
|
(option) =>
|
|
item.changeFn
|
|
item.changeFn
|
|
? item.changeFn(
|
|
? item.changeFn(
|
|
@@ -487,47 +219,24 @@
|
|
btnConfigCopy.prop
|
|
btnConfigCopy.prop
|
|
)
|
|
)
|
|
: onConfirmListPicker(option, item)
|
|
: onConfirmListPicker(option, item)
|
|
- "
|
|
|
|
- />
|
|
|
|
|
|
+ " />
|
|
</van-popup>
|
|
</van-popup>
|
|
- <van-popup
|
|
|
|
- v-model:show="item.showPicker"
|
|
|
|
- round
|
|
|
|
- position="bottom"
|
|
|
|
- v-if="item.type == 'picker' && item.itemType == 'datePicker'"
|
|
|
|
- >
|
|
|
|
- <van-date-picker
|
|
|
|
- @confirm="(option) => onConfirmListPicker(option, item)"
|
|
|
|
- @cancel="item.showPicker = false"
|
|
|
|
- :min-date="item.minDate"
|
|
|
|
- :max-date="item.maxDate"
|
|
|
|
- :columns-type="item.columnsType"
|
|
|
|
- />
|
|
|
|
|
|
+ <van-popup v-model:show="item.showPicker" round position="bottom" v-if="item.type == 'picker' && item.itemType == 'datePicker'">
|
|
|
|
+ <van-date-picker @confirm="(option) => onConfirmListPicker(option, item)" @cancel="item.showPicker = false" :min-date="item.minDate"
|
|
|
|
+ :max-date="item.maxDate" :columns-type="item.columnsType" />
|
|
</van-popup>
|
|
</van-popup>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<!-- 按钮 -->
|
|
<!-- 按钮 -->
|
|
- <div
|
|
|
|
- class="btn-box"
|
|
|
|
- v-if="formOption.btnConfig !== undefined && formOption.btnConfig.isNeed"
|
|
|
|
- >
|
|
|
|
- <van-button
|
|
|
|
- :plain="btnConfigCopy.plain ? btnConfigCopy.plain : false"
|
|
|
|
- :type="btnConfigCopy.itemType ? btnConfigCopy.itemType : 'primary'"
|
|
|
|
- :size="btnConfigCopy.size ? btnConfigCopy.size : 'small'"
|
|
|
|
- style="width: 100%; border: none"
|
|
|
|
- @click="handlePush()"
|
|
|
|
- >
|
|
|
|
|
|
+ <div class="btn-box" v-if="formOption.btnConfig !== undefined && formOption.btnConfig.isNeed">
|
|
|
|
+ <van-button :plain="btnConfigCopy.plain ? btnConfigCopy.plain : false" :type="btnConfigCopy.itemType ? btnConfigCopy.itemType : 'primary'"
|
|
|
|
+ :size="btnConfigCopy.size ? btnConfigCopy.size : 'small'" style="width: 100%; border: none" @click="handlePush()">
|
|
<template #icon>
|
|
<template #icon>
|
|
- <van-icon
|
|
|
|
- :name="btnConfigCopy.icon ? btnConfigCopy.icon : 'plus'"
|
|
|
|
- :size="12"
|
|
|
|
- />
|
|
|
|
|
|
+ <van-icon :name="btnConfigCopy.icon ? btnConfigCopy.icon : 'plus'" :size="12" />
|
|
</template>
|
|
</template>
|
|
{{
|
|
{{
|
|
btnConfigCopy.btnName ? btnConfigCopy.btnName : "添加"
|
|
btnConfigCopy.btnName ? btnConfigCopy.btnName : "添加"
|
|
- }}</van-button
|
|
|
|
- >
|
|
|
|
|
|
+ }}</van-button>
|
|
</div>
|
|
</div>
|
|
<div style="margin: 16px" v-show="!formOption.hiddenSubmitBtn">
|
|
<div style="margin: 16px" v-show="!formOption.hiddenSubmitBtn">
|
|
<van-button round block type="primary" native-type="submit">
|
|
<van-button round block type="primary" native-type="submit">
|
|
@@ -711,7 +420,6 @@ const formDataListShowLabelOne = () => {
|
|
const jele = btnConfigCopy.listConfig[j];
|
|
const jele = btnConfigCopy.listConfig[j];
|
|
if (jele.type === "picker" && jele.itemType !== "datePicker") {
|
|
if (jele.type === "picker" && jele.itemType !== "datePicker") {
|
|
if (jele.data && jele.data.length > 0) {
|
|
if (jele.data && jele.data.length > 0) {
|
|
- console.log(jele.data, "wwwww");
|
|
|
|
formData.value[btnConfigCopy.prop][i][jele.prop + "Name"] =
|
|
formData.value[btnConfigCopy.prop][i][jele.prop + "Name"] =
|
|
selectDataEcho(
|
|
selectDataEcho(
|
|
jele,
|
|
jele,
|