You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.7 KiB
75 lines
1.7 KiB
class FieldsStore { |
|
constructor(fields = {}) { |
|
this.fields = fields |
|
} |
|
|
|
setFields(fields) { |
|
Object.assign(this.fields, fields) |
|
} |
|
|
|
updateFields(fields) { |
|
this.fields = fields |
|
} |
|
|
|
clearField(name) { |
|
delete this.fields[name] |
|
} |
|
|
|
getValueFromFields(name, fields) { |
|
const field = fields[name] |
|
if (field && 'value' in field) { |
|
return field.value |
|
} |
|
return field.initialValue |
|
} |
|
|
|
getAllFieldsName() { |
|
const { fields } = this |
|
return fields ? Object.keys(fields) : [] |
|
} |
|
|
|
getField(name) { |
|
return { |
|
...this.fields[name], |
|
name, |
|
} |
|
} |
|
|
|
getFieldValuePropValue(fieldOption) { |
|
const { name, valuePropName } = fieldOption |
|
const field = this.getField(name) |
|
const fieldValue = 'value' in field ? field.value : field.initialValue |
|
|
|
return { |
|
[valuePropName]: fieldValue, |
|
} |
|
} |
|
|
|
getFieldValue(name) { |
|
return this.getValueFromFields(name, this.fields) |
|
} |
|
|
|
getFieldsValue(names) { |
|
const fields = names || this.getAllFieldsName() |
|
return fields.reduce((acc, name) => { |
|
acc[name] = this.getFieldValue(name) |
|
return acc |
|
}, {}) |
|
} |
|
|
|
resetFields(ns) { |
|
const { fields } = this |
|
const names = ns || this.getAllFieldsName() |
|
return names.reduce((acc, name) => { |
|
const field = fields[name] |
|
if (field) { |
|
acc[name] = field.initialValue |
|
} |
|
return acc |
|
}, {}) |
|
} |
|
} |
|
|
|
export default function createFieldsStore(fields) { |
|
return new FieldsStore(fields) |
|
}
|
|
|