|
@@ -20,6 +20,7 @@ defineProps({
|
|
|
default: 'vertical',
|
|
|
},
|
|
|
})
|
|
|
+const emits = defineEmits(['submit'])
|
|
|
const types = {
|
|
|
TextField: WdInput,
|
|
|
Submit: WdButton,
|
|
@@ -38,51 +39,78 @@ const defaultProps = {
|
|
|
block: true,
|
|
|
},
|
|
|
}
|
|
|
+const verticalDefaultProps = {
|
|
|
+ TextField: {
|
|
|
+ noBorder: true,
|
|
|
+ style: {},
|
|
|
+ customClass: 'rounded border border-[#e1e1e1] border-solid p-1',
|
|
|
+ placeholder: ' ',
|
|
|
+ },
|
|
|
+ Submit: {
|
|
|
+ customClass: 'w-full! rounded-lg! my-4!',
|
|
|
+ block: true,
|
|
|
+ },
|
|
|
+}
|
|
|
+const submit = () => {
|
|
|
+ emits('submit', modelValue)
|
|
|
+}
|
|
|
// const
|
|
|
</script>
|
|
|
<template>
|
|
|
- <wd-form ref="form" :model="modelValue">
|
|
|
- <wd-cell-group border>
|
|
|
- <template
|
|
|
- v-for="([prop, { type, label, props }], index) in Object.entries(schema)"
|
|
|
- :key="index"
|
|
|
- >
|
|
|
- <div class="grid mb-4">
|
|
|
- <label
|
|
|
- v-if="type !== 'Submit' && direction === 'vertical'"
|
|
|
- class="text-black/40 text-sm font-normal font-['PingFang SC'] leading-relaxed mb-1"
|
|
|
- :for="prop"
|
|
|
- >
|
|
|
- {{ label || prop }}
|
|
|
- </label>
|
|
|
- <!-- #ifdef H5 -->
|
|
|
- <component :is="types[type]" :name="prop" v-bind="defaultProps[type]">
|
|
|
- <span v-if="type === 'Submit'">提交</span>
|
|
|
- </component>
|
|
|
- <!-- #endif -->
|
|
|
- <!-- #ifdef MP-WEIXIN -->
|
|
|
- <wd-input
|
|
|
- v-if="type === 'TextField'"
|
|
|
- v-bind="{ label, ...props }"
|
|
|
- v-model="modelValue[prop]"
|
|
|
- ></wd-input>
|
|
|
- <wd-picker
|
|
|
- v-if="type === 'Select'"
|
|
|
- v-bind="{ label, ...props }"
|
|
|
- v-model="modelValue[prop]"
|
|
|
- ></wd-picker>
|
|
|
- <wd-radio-group
|
|
|
- v-if="type === 'Radio'"
|
|
|
- v-bind="{ label, ...props, cell: true, shape: 'button' }"
|
|
|
- v-model="modelValue[prop]"
|
|
|
- >
|
|
|
- <template v-for="{ label, value } of props.columns" :key="value">
|
|
|
- <wd-radio :value="value">{{ label }}</wd-radio>
|
|
|
- </template>
|
|
|
- </wd-radio-group>
|
|
|
- <!-- #endif -->
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </wd-cell-group>
|
|
|
+ <wd-form ref="form" :model="modelValue" @submit="submit">
|
|
|
+ <template
|
|
|
+ v-for="([prop, { type, label, props }], index) in Object.entries(schema)"
|
|
|
+ :key="index"
|
|
|
+ >
|
|
|
+ <div class="grid mb-4">
|
|
|
+ <label
|
|
|
+ v-if="type !== 'Submit' && direction === 'vertical'"
|
|
|
+ class="text-black/40 text-sm font-normal font-['PingFang SC'] leading-relaxed mb-1"
|
|
|
+ :for="prop"
|
|
|
+ >
|
|
|
+ {{ label || prop }}
|
|
|
+ </label>
|
|
|
+ <!-- #ifdef H5 -->
|
|
|
+ <component :is="types[type]" :name="prop" v-bind="defaultProps[type]">
|
|
|
+ <span v-if="type === 'Submit'">提交</span>
|
|
|
+ </component>
|
|
|
+ <!-- #endif -->
|
|
|
+ <!-- #ifdef MP-WEIXIN -->
|
|
|
+ <wd-input
|
|
|
+ v-if="type === 'TextField'"
|
|
|
+ v-bind="{
|
|
|
+ ...(direction === 'vertical' ? verticalDefaultProps[type] : {}),
|
|
|
+ ...props,
|
|
|
+ }"
|
|
|
+ v-model="modelValue[prop]"
|
|
|
+ ></wd-input>
|
|
|
+ <wd-picker
|
|
|
+ v-if="type === 'Select'"
|
|
|
+ v-bind="{ label, ...props }"
|
|
|
+ v-model="modelValue[prop]"
|
|
|
+ ></wd-picker>
|
|
|
+ <wd-radio-group
|
|
|
+ v-if="type === 'Radio'"
|
|
|
+ v-bind="{ label, ...props, cell: true, shape: 'button' }"
|
|
|
+ v-model="modelValue[prop]"
|
|
|
+ >
|
|
|
+ <template v-for="{ label, value } of props.columns" :key="value">
|
|
|
+ <wd-radio :value="value">{{ label }}</wd-radio>
|
|
|
+ </template>
|
|
|
+ </wd-radio-group>
|
|
|
+ <wd-button
|
|
|
+ v-if="type === 'Submit'"
|
|
|
+ v-bind="{
|
|
|
+ ...(direction === 'vertical' ? verticalDefaultProps[type] : {}),
|
|
|
+ ...props,
|
|
|
+ formType: 'submit',
|
|
|
+ }"
|
|
|
+ @click="submit"
|
|
|
+ >
|
|
|
+ <span v-if="type === 'Submit'">提交</span>
|
|
|
+ </wd-button>
|
|
|
+ <!-- #endif -->
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
</wd-form>
|
|
|
</template>
|