Commit 75d1bec9 authored by cuiwenlong7's avatar cuiwenlong7
Browse files

feat: 动态子表单增加withConfig

parent 0472fea8
Showing with 44 additions and 8 deletions
+44 -8
...@@ -7,9 +7,21 @@ import { cloneDeep } from 'lodash' ...@@ -7,9 +7,21 @@ import { cloneDeep } from 'lodash'
import ConditionHelper from '../../../util/condition' import ConditionHelper from '../../../util/condition'
import InterfaceHelper, { InterfaceConfig } from '../../../util/interface' import InterfaceHelper, { InterfaceConfig } from '../../../util/interface'
/**
* 子表单配置项
* - withConfig: 拓展配置
* - * - enable: 是否开启
* - * - dataField: (序列化)数据
* - * - configField: (序列化)配置
*/
export interface ImportSubformFieldConfig extends FieldConfig { export interface ImportSubformFieldConfig extends FieldConfig {
type: 'import_subform', type: 'import_subform',
interface?: InterfaceConfig interface?: InterfaceConfig
withConfig?: {
enable: boolean
dataField: string
configField: string
}
} }
export interface IImportSubformField { export interface IImportSubformField {
...@@ -17,6 +29,7 @@ export interface IImportSubformField { ...@@ -17,6 +29,7 @@ export interface IImportSubformField {
} }
interface IImportSubformFieldState { interface IImportSubformFieldState {
withConfigPath: string // 动态子表单拓展路径
didMount: boolean didMount: boolean
fields: FieldConfigs[] fields: FieldConfigs[]
formData: { status: 'normal' | 'error' | 'loading', message?: string }[] formData: { status: 'normal' | 'error' | 'loading', message?: string }[]
...@@ -40,12 +53,22 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig, ...@@ -40,12 +53,22 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig,
super(props) super(props)
this.state = { this.state = {
withConfigPath: '',
didMount: false, didMount: false,
fields: [], fields: [],
formData: [] formData: []
} }
} }
static getDerivedStateFromProps (nextProps: FieldProps<ImportSubformFieldConfig, any>, prevState: IImportSubformFieldState) {
const withConfigPath = nextProps.config.withConfig?.enable && nextProps.config.withConfig?.dataField ? `${nextProps.config.withConfig.dataField}.` : ''
if (withConfigPath !== prevState.withConfigPath) {
return { withConfigPath }
}
return null
}
didMount = async () => { didMount = async () => {
await this.setState({ await this.setState({
didMount: true didMount: true
...@@ -187,7 +210,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig, ...@@ -187,7 +210,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig,
handleValueSet = async (formFieldIndex: number, path: string, value: any, validation: true | FieldError[]) => { handleValueSet = async (formFieldIndex: number, path: string, value: any, validation: true | FieldError[]) => {
const formFieldConfig = (this.state.fields || [])[formFieldIndex] const formFieldConfig = (this.state.fields || [])[formFieldIndex]
if (formFieldConfig) { if (formFieldConfig) {
const fullPath = formFieldConfig.field === '' || path === '' ? `${formFieldConfig.field}${path}` : `${formFieldConfig.field}.${path}` const fullPath = formFieldConfig.field === '' || path === '' ? `${this.state.withConfigPath}${formFieldConfig.field}${path}` : `${this.state.withConfigPath}${formFieldConfig.field}.${path}`
await this.props.onValueSet(fullPath, value, true) await this.props.onValueSet(fullPath, value, true)
const formData = cloneDeep(this.state.formData) const formData = cloneDeep(this.state.formData)
...@@ -206,7 +229,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig, ...@@ -206,7 +229,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig,
handleValueUnset = async (formFieldIndex: number, path: string, validation: true | FieldError[]) => { handleValueUnset = async (formFieldIndex: number, path: string, validation: true | FieldError[]) => {
const formFieldConfig = (this.state.fields || [])[formFieldIndex] const formFieldConfig = (this.state.fields || [])[formFieldIndex]
if (formFieldConfig) { if (formFieldConfig) {
const fullPath = formFieldConfig.field === '' || path === '' ? `${formFieldConfig.field}${path}` : `${formFieldConfig.field}.${path}` const fullPath = formFieldConfig.field === '' || path === '' ? `${this.state.withConfigPath}${formFieldConfig.field}${path}` : `${this.state.withConfigPath}${formFieldConfig.field}.${path}`
await this.props.onValueUnset(fullPath, true) await this.props.onValueUnset(fullPath, true)
const formData = cloneDeep(this.state.formData) const formData = cloneDeep(this.state.formData)
...@@ -225,7 +248,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig, ...@@ -225,7 +248,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig,
handleValueListAppend = async (formFieldIndex: number, path: string, value: any, validation: true | FieldError[]) => { handleValueListAppend = async (formFieldIndex: number, path: string, value: any, validation: true | FieldError[]) => {
const formFieldConfig = (this.state.fields || [])[formFieldIndex] const formFieldConfig = (this.state.fields || [])[formFieldIndex]
if (formFieldConfig) { if (formFieldConfig) {
const fullPath = formFieldConfig.field === '' || path === '' ? `${formFieldConfig.field}${path}` : `${formFieldConfig.field}.${path}` const fullPath = formFieldConfig.field === '' || path === '' ? `${this.state.withConfigPath}${formFieldConfig.field}${path}` : `${this.state.withConfigPath}${formFieldConfig.field}.${path}`
await this.props.onValueListAppend(fullPath, value, true) await this.props.onValueListAppend(fullPath, value, true)
const formData = cloneDeep(this.state.formData) const formData = cloneDeep(this.state.formData)
...@@ -244,7 +267,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig, ...@@ -244,7 +267,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig,
handleValueListSplice = async (formFieldIndex: number, path: string, index: number, count: number, validation: true | FieldError[]) => { handleValueListSplice = async (formFieldIndex: number, path: string, index: number, count: number, validation: true | FieldError[]) => {
const formFieldConfig = (this.state.fields || [])[formFieldIndex] const formFieldConfig = (this.state.fields || [])[formFieldIndex]
if (formFieldConfig) { if (formFieldConfig) {
const fullPath = formFieldConfig.field === '' || path === '' ? `${formFieldConfig.field}${path}` : `${formFieldConfig.field}.${path}` const fullPath = formFieldConfig.field === '' || path === '' ? `${this.state.withConfigPath}${formFieldConfig.field}${path}` : `${this.state.withConfigPath}${formFieldConfig.field}.${path}`
await this.props.onValueListSplice(fullPath, index, count, true) await this.props.onValueListSplice(fullPath, index, count, true)
const formData = cloneDeep(this.state.formData) const formData = cloneDeep(this.state.formData)
...@@ -262,7 +285,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig, ...@@ -262,7 +285,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig,
handleValueListSort = async (formFieldIndex: number, path: string, index: number, sortType: 'up' | 'down', validation: true | FieldError[]) => { handleValueListSort = async (formFieldIndex: number, path: string, index: number, sortType: 'up' | 'down', validation: true | FieldError[]) => {
const formFieldConfig = (this.state.fields || [])[formFieldIndex] const formFieldConfig = (this.state.fields || [])[formFieldIndex]
if (formFieldConfig) { if (formFieldConfig) {
const fullPath = formFieldConfig.field === '' || path === '' ? `${formFieldConfig.field}${path}` : `${formFieldConfig.field}.${path}` const fullPath = formFieldConfig.field === '' || path === '' ? `${this.state.withConfigPath}${formFieldConfig.field}${path}` : `${this.state.withConfigPath}${formFieldConfig.field}.${path}`
await this.props.onValueListSort(fullPath, index, sortType, true) await this.props.onValueListSort(fullPath, index, sortType, true)
const formData = cloneDeep(this.state.formData) const formData = cloneDeep(this.state.formData)
...@@ -311,9 +334,22 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig, ...@@ -311,9 +334,22 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig,
{ record: this.props.record, data: this.props.data, step: this.props.step }, { record: this.props.record, data: this.props.data, step: this.props.step },
{ loadDomain: this.props.loadDomain } { loadDomain: this.props.loadDomain }
).then((data: any) => { ).then((data: any) => {
if (JSON.stringify(data) !== JSON.stringify(this.state.fields)) { let dataToUnstringfy = data
let dataToStringfy = JSON.stringify(data)
if (Object.prototype.toString.call(data) === "[object String]") {
try {
dataToStringfy = data
dataToUnstringfy = JSON.parse(data)
} catch (e) {
console.error('当前动态子表单接口响应数据格式不是合格的json字符串')
dataToUnstringfy = []
dataToStringfy = '[]'
}
}
(this.props.config.withConfig?.enable && this.props.config.withConfig?.configField) && this.props.onValueSet(this.props.config.withConfig.configField, data, true)
if (dataToStringfy !== JSON.stringify(this.state.fields)) {
this.setState({ this.setState({
fields: data fields: dataToUnstringfy
}) })
} }
}) })
...@@ -362,7 +398,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig, ...@@ -362,7 +398,7 @@ export default class ImportSubformField extends Field<ImportSubformFieldConfig,
} }
}} }}
formLayout={formLayout} formLayout={formLayout}
value={getValue(value, formFieldConfig.field)} value={getValue(value, `${this.state.withConfigPath}${formFieldConfig.field}`)}
record={record} record={record}
data={cloneDeep(data)} data={cloneDeep(data)}
step={step} step={step}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment