import _ from 'underscore' export const getFirstLevelOptions = options => { const { __CT_KEYS_ORDER__, ...rest } = options return Object.keys(rest).reduce((currentOptions, currentOptionId) => { if (!options[currentOptionId].type) { return { ...currentOptions, ...getFirstLevelOptions(options[currentOptionId]) } } if (options[currentOptionId].options) { return { ...currentOptions, ...getFirstLevelOptions(options[currentOptionId].options) } } return { ...currentOptions, [currentOptionId]: options[currentOptionId] } }, {}) } export const flattenOptions = options => Object.keys(options).reduce( (result, currentId) => ({ ...result, ...(options[currentId].type ? { [currentId]: options[currentId] } : currentId === '__CT_KEYS_ORDER__' ? { [currentId]: options[currentId] } : flattenOptions(options[currentId])) }), {} ) export const getValueFromInput = (options, values) => { let firstLevelOptions = getFirstLevelOptions(options) return { ...values, ...Object.keys(firstLevelOptions).reduce( (currentValues, currentOptionId) => { let actualValue = null if (values[currentOptionId]) { if ( _.isString(values[currentOptionId]) || _.isNumber(values[currentOptionId]) ) { actualValue = values[currentOptionId] } if (_.isObject(values[currentOptionId])) { actualValue = { ...(firstLevelOptions[currentOptionId].value || {}), ...values[currentOptionId] } } if (_.isArray(values[currentOptionId])) { actualValue = values[currentOptionId] ? values[currentOptionId] : [ ...(firstLevelOptions[currentOptionId] .value || []) // ...values[currentOptionId], ] } } else { if ( Object.keys(firstLevelOptions[currentOptionId]).indexOf( 'value' ) > -1 ) { actualValue = firstLevelOptions[currentOptionId].value } else { actualValue = '' } } return { ...currentValues, [currentOptionId]: actualValue } }, {} ) } }