113 lines
3.3 KiB
JavaScript
113 lines
3.3 KiB
JavaScript
import {map, reduce, filter} from './utils'
|
|
|
|
/**
|
|
* Curried function for creating the formState
|
|
* @param {Object} options
|
|
*/
|
|
export const formulateState = (options = {}) => () => Object.assign({
|
|
values: {},
|
|
errors: {},
|
|
validationErrors: {},
|
|
meta: {}
|
|
}, options)
|
|
|
|
/**
|
|
* Function for creating the formGetters
|
|
* @param {string} module
|
|
* @param {Object} getters
|
|
*/
|
|
export const formulateGetters = (moduleName = '', getters = {}) => Object.assign({
|
|
formValues (state) {
|
|
return state.values
|
|
},
|
|
formErrors (state) {
|
|
return state.errors
|
|
},
|
|
formValidationErrors (state) {
|
|
return state.validationErrors
|
|
},
|
|
formMeta (state) {
|
|
return reduce(state.meta, (forms, form, fields) => {
|
|
forms[form] = reduce(fields, (arr, field, data) => arr.concat(data), [])
|
|
return forms
|
|
}, {})
|
|
},
|
|
hasErrors (state) {
|
|
return map(state.errors, (form, errors) => {
|
|
return reduce(errors, (hasErrors, field, errors) => hasErrors || !!errors.length, false)
|
|
})
|
|
},
|
|
hasValidationErrors (state) {
|
|
return map(state.validationErrors, (form, errors) => {
|
|
return reduce(errors, (hasErrors, field, errors) => hasErrors || !!errors.length, false)
|
|
})
|
|
}
|
|
}, getters)
|
|
|
|
/**
|
|
* Function for creating the formActions
|
|
* @param {string} moduleName
|
|
* @param {Object} actions
|
|
*/
|
|
export const formulateActions = (moduleName = '', actions = {}) => Object.assign({
|
|
}, actions)
|
|
|
|
/**
|
|
* Function for creating the formMutations
|
|
* @param {Object} mutations
|
|
*/
|
|
export const formulateMutations = (mutations = {}) => Object.assign({
|
|
setFieldValue (state, {form, field, value}) {
|
|
state.values = Object.assign({}, state.values, {
|
|
[form]: Object.assign({}, state.values[form] || {}, {[field]: value})
|
|
})
|
|
},
|
|
setFieldErrors (state, {form, field, errors}) {
|
|
state.errors = Object.assign({}, state.errors, {
|
|
[form]: Object.assign({}, state.errors[form] || {}, {[field]: errors})
|
|
})
|
|
},
|
|
setFieldValidationErrors (state, {form, field, errors}) {
|
|
state.validationErrors = Object.assign({}, state.validationErrors, {
|
|
[form]: Object.assign({}, state.validationErrors[form] || {}, {[field]: errors})
|
|
})
|
|
},
|
|
setFieldMeta (state, {form, field, data}) {
|
|
state.meta = Object.assign({}, state.meta, {
|
|
[form]: Object.assign({}, state.meta[form] || {}, {[field]: data})
|
|
})
|
|
},
|
|
resetForm (state, form) {
|
|
if (state.values[form]) {
|
|
state.values = Object.assign({}, state.values, {
|
|
[form]: map(state.values[form], (key, value) => undefined)
|
|
})
|
|
}
|
|
},
|
|
removeField (state, {form, field}) {
|
|
for (let group in state) {
|
|
if (state[group][form] && state[group][form].hasOwnProperty(field)) {
|
|
state[group][form] = filter(state[group][form], (key, value) => key !== field)
|
|
}
|
|
}
|
|
},
|
|
removeFieldValidationErrors (state, {form, field}) {
|
|
state.validationErrors = Object.assign({}, state.validationErrors, {
|
|
[form]: filter(state.validationErrors[form] || {}, key => key !== field)
|
|
})
|
|
}
|
|
}, mutations)
|
|
|
|
/**
|
|
* Function for exposing a full vuex module.
|
|
* @param {string} moduleName
|
|
* @param {Object} validation
|
|
*/
|
|
export const formulateModule = (moduleName) => ({
|
|
state: formulateState(),
|
|
getters: formulateGetters(moduleName),
|
|
actions: formulateActions(moduleName),
|
|
mutations: formulateMutations(),
|
|
namespaced: true
|
|
})
|