|
@@ -1,210 +1,223 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <template v-if="show">
|
|
|
|
|
- <text
|
|
|
|
|
- v-if="formDefineItem.type === 'static-text' "
|
|
|
|
|
- class="form-static-text"
|
|
|
|
|
- :style="(params.style as any)"
|
|
|
|
|
- :class="(params.class as any)"
|
|
|
|
|
- >
|
|
|
|
|
- {{ params?.text ?? modelValue ?? null }}
|
|
|
|
|
- </text>
|
|
|
|
|
- <Field
|
|
|
|
|
- ref="formItemRef"
|
|
|
|
|
- v-else-if="formDefineItem.type === 'text'"
|
|
|
|
|
- :label="label"
|
|
|
|
|
- :name="formDefineItem.fullName"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- :maxlength="260"
|
|
|
|
|
- :showBottomBorder="!isLast"
|
|
|
|
|
- :required="Boolean(formDefineItem.rules?.length)"
|
|
|
|
|
- v-bind="params"
|
|
|
|
|
- />
|
|
|
|
|
- <Field
|
|
|
|
|
- ref="formItemRef"
|
|
|
|
|
- v-else-if="formDefineItem.type === 'textarea'"
|
|
|
|
|
- multiline
|
|
|
|
|
- :label="label"
|
|
|
|
|
- :name="formDefineItem.fullName"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- :showBottomBorder="!isLast"
|
|
|
|
|
- :required="Boolean(formDefineItem.rules?.length)"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- v-bind="params"
|
|
|
|
|
- />
|
|
|
|
|
- <Field
|
|
|
|
|
- v-else
|
|
|
|
|
- ref="formItemRef"
|
|
|
|
|
- :label="label"
|
|
|
|
|
- :name="formDefineItem.fullName"
|
|
|
|
|
- :required="Boolean(formDefineItem.rules?.length)"
|
|
|
|
|
- :showRightArrow="extraDefine?.needArrow"
|
|
|
|
|
- :showBottomBorder="!isLast"
|
|
|
|
|
- :requireChildRef="() => itemRef"
|
|
|
|
|
- v-bind="{
|
|
|
|
|
- ...extraDefine?.itemProps || {},
|
|
|
|
|
- ...formDefineItem.itemParams,
|
|
|
|
|
- }"
|
|
|
|
|
- >
|
|
|
|
|
- <!-- <text>fullName: {{formDefineItem.fullName}}</text> -->
|
|
|
|
|
- <template v-if="formDefineItem.type === 'number'">
|
|
|
|
|
- <Stepper
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- v-bind="params"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'switch'">
|
|
|
|
|
- <Switch
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- v-bind="params"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'radio-value'">
|
|
|
|
|
- <RadioValue
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- v-bind="(params as any as RadioValueProps)"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'radio-id'">
|
|
|
|
|
- <RadioIdField
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- v-bind="(params as any as RadioIdFieldProps)"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'select'">
|
|
|
|
|
- <view>
|
|
|
|
|
- <NaPickerField
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- v-bind="(params as any as PickerFieldProps)"
|
|
|
|
|
- />
|
|
|
|
|
- </view>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'uploader'">
|
|
|
|
|
- <UploaderField
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- v-bind="(params as any as UploaderFieldProps)"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'select-id'">
|
|
|
|
|
- <PickerIdField
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- v-bind="(params as any as PickerIdFieldProps)"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'select-city'">
|
|
|
|
|
- <PickerCityField
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- v-bind="(params as any)"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'check-box'">
|
|
|
|
|
- <CheckBox
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- v-bind="params"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'check-box-list'">
|
|
|
|
|
- <CheckBoxList
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
- v-bind="(params)"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'check-box-int'">
|
|
|
|
|
- <CheckBoxToInt
|
|
|
|
|
|
|
+ <text
|
|
|
|
|
+ v-if="item.type === 'static-text' "
|
|
|
|
|
+ class="form-static-text"
|
|
|
|
|
+ :style="(params.style as any)"
|
|
|
|
|
+ :class="(params.class as any)"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ params?.text ?? model ?? null }}
|
|
|
|
|
+ </text>
|
|
|
|
|
+ <Field
|
|
|
|
|
+ ref="formItemRef"
|
|
|
|
|
+ v-else-if="item.type === 'text'"
|
|
|
|
|
+ :label="label"
|
|
|
|
|
+ :name="item.fullName"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ :maxlength="260"
|
|
|
|
|
+ :showBottomBorder="!isLast"
|
|
|
|
|
+ :required="Boolean(item.rules?.length)"
|
|
|
|
|
+ v-bind="{
|
|
|
|
|
+ ...params,
|
|
|
|
|
+ ...extraDefine?.itemProps || {},
|
|
|
|
|
+ ...item.formProps,
|
|
|
|
|
+ }"
|
|
|
|
|
+ />
|
|
|
|
|
+ <Field
|
|
|
|
|
+ ref="formItemRef"
|
|
|
|
|
+ v-else-if="item.type === 'textarea'"
|
|
|
|
|
+ multiline
|
|
|
|
|
+ :label="label"
|
|
|
|
|
+ :name="item.fullName"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ :showBottomBorder="!isLast"
|
|
|
|
|
+ :required="Boolean(item.rules?.length)"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="{
|
|
|
|
|
+ ...params,
|
|
|
|
|
+ ...extraDefine?.itemProps || {},
|
|
|
|
|
+ ...item.formProps,
|
|
|
|
|
+ }"
|
|
|
|
|
+ />
|
|
|
|
|
+ <Field
|
|
|
|
|
+ v-else
|
|
|
|
|
+ ref="formItemRef"
|
|
|
|
|
+ :label="label"
|
|
|
|
|
+ :name="item.fullName"
|
|
|
|
|
+ :required="Boolean(item.rules?.length)"
|
|
|
|
|
+ :showRightArrow="extraDefine?.needArrow"
|
|
|
|
|
+ :showBottomBorder="!isLast"
|
|
|
|
|
+ :requireChildRef="() => itemRef"
|
|
|
|
|
+ v-bind="{
|
|
|
|
|
+ ...extraDefine?.itemProps || {},
|
|
|
|
|
+ ...item.formProps,
|
|
|
|
|
+ }"
|
|
|
|
|
+ >
|
|
|
|
|
+ <!-- <text>fullName: {{item.fullName}}</text> -->
|
|
|
|
|
+ <template v-if="item.type === 'custom'">
|
|
|
|
|
+ <slot name="formCeil"
|
|
|
|
|
+ :name="item.fullName"
|
|
|
|
|
+ :item="item"
|
|
|
|
|
+ :model="model"
|
|
|
|
|
+ :onModelUpdate="onValueChanged"
|
|
|
|
|
+ :rawModel="rawModel"
|
|
|
|
|
+ :parentModel="parentModel"
|
|
|
|
|
+ :parent="parent"
|
|
|
|
|
+ :rules="item.rules"
|
|
|
|
|
+ :disabled="disabled"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'number'">
|
|
|
|
|
+ <Stepper
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="params"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'switch'">
|
|
|
|
|
+ <Switch
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="params"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'radio-value'">
|
|
|
|
|
+ <RadioValue
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="(params as any as RadioValueProps)"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'radio-id'">
|
|
|
|
|
+ <RadioIdField
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="(params as any as RadioIdFieldProps)"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'select'">
|
|
|
|
|
+ <view>
|
|
|
|
|
+ <NaPickerField
|
|
|
ref="itemRef"
|
|
ref="itemRef"
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
|
|
+ :modelValue="model"
|
|
|
@update:modelValue="onValueChanged"
|
|
@update:modelValue="onValueChanged"
|
|
|
- v-bind="params"
|
|
|
|
|
|
|
+ v-bind="(params as any as PickerFieldProps)"
|
|
|
/>
|
|
/>
|
|
|
- </template>
|
|
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'rate'">
|
|
|
|
|
+ <Rate
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="(params as any as RateProps)"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'uploader'">
|
|
|
|
|
+ <UploaderField
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="(params as any as UploaderFieldProps)"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'select-id'">
|
|
|
|
|
+ <PickerIdField
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="(params as any as PickerIdFieldProps)"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'select-city'">
|
|
|
|
|
+ <PickerCityField
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="(params as any)"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'select-lonlat'">
|
|
|
|
|
+ <PickerLonlat
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="(v:any) => onValueChanged(v)"
|
|
|
|
|
+ v-bind="params"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'check-box'">
|
|
|
|
|
+ <CheckBox
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="params"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'check-box-list'">
|
|
|
|
|
+ <CheckBoxList
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="(params)"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'check-box-int'">
|
|
|
|
|
+ <CheckBoxToInt
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ v-bind="params"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'select-lonlat'">
|
|
|
|
|
- <PickerLonlat
|
|
|
|
|
|
|
+ <template v-else-if="item.type === 'datetime'">
|
|
|
|
|
+ <view>
|
|
|
|
|
+ <DateTimePickerField
|
|
|
ref="itemRef"
|
|
ref="itemRef"
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="(v:any) => onValueChanged(v)"
|
|
|
|
|
|
|
+ :value="model"
|
|
|
v-bind="params"
|
|
v-bind="params"
|
|
|
|
|
+ @update:modelValue="(e: any) => onValueChanged(e)"
|
|
|
/>
|
|
/>
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'picker-datetime'">
|
|
|
|
|
- <view>
|
|
|
|
|
- <DateTimePickerField
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :value="modelValue"
|
|
|
|
|
- v-bind="params"
|
|
|
|
|
- @update:modelValue="(e: any) => onValueChanged(e)"
|
|
|
|
|
- />
|
|
|
|
|
- </view>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'picker-time'">
|
|
|
|
|
- <view>
|
|
|
|
|
- <TimePickerField
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :value="modelValue"
|
|
|
|
|
- v-bind="params"
|
|
|
|
|
- @update:modelValue="(e: any) => onValueChanged(e)"
|
|
|
|
|
- />
|
|
|
|
|
- </view>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'picker-date'">
|
|
|
|
|
- <view>
|
|
|
|
|
- <DatePickerField
|
|
|
|
|
- ref="itemRef"
|
|
|
|
|
- :value="modelValue"
|
|
|
|
|
- v-bind="params"
|
|
|
|
|
- @update:modelValue="(e: any) => onValueChanged(e)"
|
|
|
|
|
- />
|
|
|
|
|
- </view>
|
|
|
|
|
- </template>
|
|
|
|
|
- <!-- 在下方添加自定义组件 -->
|
|
|
|
|
- <!-- 业务代码开始 -->
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'richtext'">
|
|
|
|
|
- <RichTextEditor
|
|
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'time'">
|
|
|
|
|
+ <view>
|
|
|
|
|
+ <TimePickerField
|
|
|
ref="itemRef"
|
|
ref="itemRef"
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
|
|
+ :value="model"
|
|
|
v-bind="params"
|
|
v-bind="params"
|
|
|
|
|
+ @update:modelValue="(e: any) => onValueChanged(e)"
|
|
|
/>
|
|
/>
|
|
|
- </template>
|
|
|
|
|
- <template v-else-if="formDefineItem.type === 'recorder'">
|
|
|
|
|
- <Recorder
|
|
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-else-if="item.type === 'date'">
|
|
|
|
|
+ <view>
|
|
|
|
|
+ <DatePickerField
|
|
|
ref="itemRef"
|
|
ref="itemRef"
|
|
|
- :modelValue="modelValue"
|
|
|
|
|
- @update:modelValue="onValueChanged"
|
|
|
|
|
|
|
+ :value="model"
|
|
|
v-bind="params"
|
|
v-bind="params"
|
|
|
|
|
+ @update:modelValue="(e: any) => onValueChanged(e)"
|
|
|
/>
|
|
/>
|
|
|
- </template>
|
|
|
|
|
- <!-- 业务代码结束 -->
|
|
|
|
|
- <template v-else>
|
|
|
|
|
- <text>Fallback: unknow form type {{ formDefineItem.type }}</text>
|
|
|
|
|
- </template>
|
|
|
|
|
- </Field>
|
|
|
|
|
- </template>
|
|
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <ComponentRender v-else
|
|
|
|
|
+ ref="itemRef"
|
|
|
|
|
+ :modelValue="model"
|
|
|
|
|
+ @update:modelValue="onValueChanged"
|
|
|
|
|
+ :params="params"
|
|
|
|
|
+ :item="item"
|
|
|
|
|
+ :isLast="isLast"
|
|
|
|
|
+ />
|
|
|
|
|
+ </Field>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
-import { computed, inject, onBeforeUnmount, onMounted, ref, watch, type PropType } from 'vue';
|
|
|
|
|
-import type { FormDefineItem, IFormItemCallback } from '.';
|
|
|
|
|
|
|
+import { computed, inject, onBeforeUnmount, onMounted, ref, watch, type PropType, type Ref } from 'vue';
|
|
|
|
|
+import type { IDynamicFormItem, IDynamicFormItemCallback, IDynamicFormObject, IDynamicFormOptions, IDynamicFormRef } from '.';
|
|
|
import Field from '../form/Field.vue';
|
|
import Field from '../form/Field.vue';
|
|
|
import Stepper from '../form/Stepper.vue';
|
|
import Stepper from '../form/Stepper.vue';
|
|
|
import NaPickerField, { type PickerFieldProps } from '../form/PickerField.vue';
|
|
import NaPickerField, { type PickerFieldProps } from '../form/PickerField.vue';
|
|
@@ -221,52 +234,100 @@ import PickerLonlat from './wrappers/PickerLonlat.vue';
|
|
|
import DateTimePickerField from '../form/DateTimePickerField.vue';
|
|
import DateTimePickerField from '../form/DateTimePickerField.vue';
|
|
|
import TimePickerField from '../form/TimePickerField.vue';
|
|
import TimePickerField from '../form/TimePickerField.vue';
|
|
|
import DatePickerField from '../form/DatePickerField.vue';
|
|
import DatePickerField from '../form/DatePickerField.vue';
|
|
|
-import RichTextEditor from '@/common/components/form/RichTextEditor.vue';
|
|
|
|
|
import UploaderField, { type UploaderFieldProps } from '../form/UploaderField.vue';
|
|
import UploaderField, { type UploaderFieldProps } from '../form/UploaderField.vue';
|
|
|
import RadioIdField from './wrappers/RadioIdField.vue';
|
|
import RadioIdField from './wrappers/RadioIdField.vue';
|
|
|
import type { RadioIdFieldProps } from './wrappers/RadioIdField';
|
|
import type { RadioIdFieldProps } from './wrappers/RadioIdField';
|
|
|
-
|
|
|
|
|
-//自定义额外的组件默认配置,修改为自定义文件路径
|
|
|
|
|
-//业务代码开始
|
|
|
|
|
|
|
+import Rate, { type RateProps } from '../form/Rate.vue';
|
|
|
import ComponentConfigs from '@/common/components/dynamicf/ComponentConfigs';
|
|
import ComponentConfigs from '@/common/components/dynamicf/ComponentConfigs';
|
|
|
-import Recorder from '@/common/components/form/Recorder.vue';
|
|
|
|
|
-//业务代码结束
|
|
|
|
|
|
|
+import ComponentRender from '@/common/component/dynamicf/ComponentRender.vue';
|
|
|
|
|
+import type { Rules } from 'async-validator';
|
|
|
|
|
+
|
|
|
|
|
+export interface FormCeilProps {
|
|
|
|
|
+ value: unknown,
|
|
|
|
|
+ rawModel: unknown,
|
|
|
|
|
+ parent?: IDynamicFormItem,
|
|
|
|
|
+ parentModel: unknown,
|
|
|
|
|
+ 'onUpdate:value': (v: unknown) => void,
|
|
|
|
|
+ item: IDynamicFormItem,
|
|
|
|
|
+ name: string,
|
|
|
|
|
+ disabled: boolean,
|
|
|
|
|
+ additionalProps: Record<string, unknown>,
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
const props = defineProps({
|
|
const props = defineProps({
|
|
|
- parentModel: {
|
|
|
|
|
- type: null, //TODO: parentModel
|
|
|
|
|
|
|
+ item: {
|
|
|
|
|
+ type: Object as PropType<IDynamicFormItem>,
|
|
|
|
|
+ required: true,
|
|
|
|
|
+ },
|
|
|
|
|
+ name: {
|
|
|
|
|
+ type: String,
|
|
|
|
|
+ default: ''
|
|
|
|
|
+ },
|
|
|
|
|
+ parent: {
|
|
|
|
|
+ type: Object as PropType<IDynamicFormItem>,
|
|
|
|
|
+ default: null
|
|
|
},
|
|
},
|
|
|
- modelValue: {
|
|
|
|
|
|
|
+ disabled: {
|
|
|
|
|
+ type: Boolean,
|
|
|
|
|
+ default: false
|
|
|
|
|
+ },
|
|
|
|
|
+ model: {
|
|
|
|
|
+ type: null
|
|
|
|
|
+ },
|
|
|
|
|
+ parentModel: {
|
|
|
type: null
|
|
type: null
|
|
|
},
|
|
},
|
|
|
- formDefineItem: {
|
|
|
|
|
- type: Object as PropType<FormDefineItem>,
|
|
|
|
|
- default: () => ({})
|
|
|
|
|
|
|
+ rawModel: {
|
|
|
|
|
+ type: Object as PropType<Record<string, unknown>>,
|
|
|
|
|
+ default: null
|
|
|
|
|
+ },
|
|
|
|
|
+ noLabel: {
|
|
|
|
|
+ type: Boolean,
|
|
|
|
|
+ default: false
|
|
|
|
|
+ },
|
|
|
|
|
+ formWrapperColDefault: {
|
|
|
|
|
+ type: Object,
|
|
|
|
|
+ default: null
|
|
|
|
|
+ },
|
|
|
|
|
+ formLabelColDefault: {
|
|
|
|
|
+ type: Object,
|
|
|
|
|
+ default: null
|
|
|
|
|
+ },
|
|
|
|
|
+ isFirst: {
|
|
|
|
|
+ type: Boolean,
|
|
|
|
|
+ default: false,
|
|
|
},
|
|
},
|
|
|
isLast: {
|
|
isLast: {
|
|
|
type: Boolean,
|
|
type: Boolean,
|
|
|
default: false,
|
|
default: false,
|
|
|
- }
|
|
|
|
|
|
|
+ },
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
const formItemRef = ref();
|
|
const formItemRef = ref();
|
|
|
-const topModel = inject<any>('formTopModel', {});
|
|
|
|
|
-const formGlobalParams = inject<any>('formGlobalParams', {});
|
|
|
|
|
|
|
+const finalOptions = inject<Ref<IDynamicFormOptions>>('finalOptions');
|
|
|
|
|
+const globalParams = inject<Ref<IDynamicFormObject>>('globalParams');
|
|
|
|
|
+const formRef = inject<IDynamicFormRef>('formRef');
|
|
|
|
|
+const formName = inject('formName', '');
|
|
|
|
|
|
|
|
-function evaluateCallback(val: unknown|IFormItemCallback<unknown>) {
|
|
|
|
|
- if (typeof val === 'object' && typeof (val as IFormItemCallback<unknown>).callback === 'function')
|
|
|
|
|
- return (val as IFormItemCallback<unknown>).callback(
|
|
|
|
|
- props.modelValue,
|
|
|
|
|
- topModel.value,
|
|
|
|
|
|
|
+function evaluateCallback(val: unknown|IDynamicFormItemCallback<unknown>) {
|
|
|
|
|
+ if (typeof val === 'object' && typeof (val as IDynamicFormItemCallback<unknown>).callback === 'function')
|
|
|
|
|
+ return (val as IDynamicFormItemCallback<unknown>).callback(
|
|
|
|
|
+ props.model,
|
|
|
|
|
+ props.rawModel,
|
|
|
props.parentModel,
|
|
props.parentModel,
|
|
|
{
|
|
{
|
|
|
- formGlobalParams: formGlobalParams.value,
|
|
|
|
|
- item: props.formDefineItem,
|
|
|
|
|
|
|
+ item: props.item,
|
|
|
|
|
+ parent: props.parent,
|
|
|
|
|
+ form: formRef!,
|
|
|
|
|
+ formGlobalParams: globalParams?.value || {},
|
|
|
|
|
+ formRules: (finalOptions?.value.formRules ?? {}) as Record<string, Rules>,
|
|
|
|
|
+ isFirst: props.isFirst,
|
|
|
|
|
+ isLast: props.isLast,
|
|
|
}
|
|
}
|
|
|
);
|
|
);
|
|
|
return val as unknown;
|
|
return val as unknown;
|
|
|
}
|
|
}
|
|
|
-function evaluateCallbackObj(val: Record<string, unknown|IFormItemCallback<unknown>>) {
|
|
|
|
|
|
|
+function evaluateCallbackObj(val: Record<string, unknown|IDynamicFormItemCallback<unknown>>) {
|
|
|
const newObj = {} as Record<string, unknown>;
|
|
const newObj = {} as Record<string, unknown>;
|
|
|
for (const key in val) {
|
|
for (const key in val) {
|
|
|
if (Object.prototype.hasOwnProperty.call(val, key))
|
|
if (Object.prototype.hasOwnProperty.call(val, key))
|
|
@@ -275,29 +336,33 @@ function evaluateCallbackObj(val: Record<string, unknown|IFormItemCallback<unkno
|
|
|
return newObj;
|
|
return newObj;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-const extraDefine = computed(() => ComponentConfigs.find((item) => item.name === props.formDefineItem.type))
|
|
|
|
|
|
|
+const extraDefine = computed(() => ComponentConfigs.find((item) => item.name === props.item.type))
|
|
|
const params = computed(() => {
|
|
const params = computed(() => {
|
|
|
return {
|
|
return {
|
|
|
...extraDefine.value?.props || {},
|
|
...extraDefine.value?.props || {},
|
|
|
- ...evaluateCallbackObj(props.formDefineItem.params as any)
|
|
|
|
|
|
|
+ ...evaluateCallbackObj(props.item.additionalProps as any)
|
|
|
} as Record<string, unknown>
|
|
} as Record<string, unknown>
|
|
|
})
|
|
})
|
|
|
-const label = computed(() => evaluateCallback(props.formDefineItem.label) as string)
|
|
|
|
|
-const show = computed(() => props.formDefineItem.show === undefined || evaluateCallback(props.formDefineItem.show))
|
|
|
|
|
|
|
+const label = computed(() => evaluateCallback(props.item.label) as string)
|
|
|
|
|
|
|
|
const itemRef = ref();
|
|
const itemRef = ref();
|
|
|
-const emit = defineEmits([ 'update:modelValue' ]);
|
|
|
|
|
|
|
+const emit = defineEmits([ 'update:model' ]);
|
|
|
|
|
|
|
|
function onValueChanged(v: any) {
|
|
function onValueChanged(v: any) {
|
|
|
- props.formDefineItem.onChange?.(props.modelValue, v, topModel.value, itemRef.value);
|
|
|
|
|
- emit('update:modelValue', v);
|
|
|
|
|
|
|
+ props.item.watch?.(props.model, v, props.rawModel, getComponentRef());
|
|
|
|
|
+ emit('update:model', v);
|
|
|
|
|
+}
|
|
|
|
|
+function getComponentRef() {
|
|
|
|
|
+ if (typeof itemRef.value.getItemRef === 'function')
|
|
|
|
|
+ return itemRef.value.getItemRef();
|
|
|
|
|
+ return itemRef.value;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
- props.formDefineItem.onMounted?.(topModel.value, itemRef.value);
|
|
|
|
|
|
|
+ props.item.mounted?.(props.model, props.rawModel, getComponentRef());
|
|
|
})
|
|
})
|
|
|
onBeforeUnmount(() => {
|
|
onBeforeUnmount(() => {
|
|
|
- props.formDefineItem.onBeforeUnMount?.(topModel.value, itemRef.value);
|
|
|
|
|
|
|
+ props.item.beforeUnmount?.(props.model, props.rawModel, getComponentRef());
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
</script>
|
|
</script>
|