import { getValueName } from 'client/Containers/Calculation/Elements/tools'; import initialFilters, { noResetValueElements } from 'client/stores/CalculationStore/config/initialFilters'; import initialStatuses from 'client/stores/CalculationStore/config/initialStatuses'; import { isNil, mergeWith, pick } from 'lodash'; const valuesData = { values: {}, statuses: initialStatuses, validations: {}, options: {}, filters: initialFilters, }; const valuesActions = { getValue(sourceValueName) { return this.values[sourceValueName]; }, getValues(valuesNames) { return pick(this.values, valuesNames); }, setValue(sourceValueName, newValue) { this.values[sourceValueName] = newValue; }, setValues(values, override) { if (override) this.values = values; this.values = Object.assign(this.values, values); }, getStatus(elementName) { if (this.stores.calculationProcess.bypass.status) { const { target, value } = this.stores.calculationProcess.bypass.status; if (target.indexOf(elementName) > -1) { return value; } } return this.statuses[elementName]; }, setStatus(elementName, status) { this.statuses[elementName] = status; }, setStatuses(statuses, override) { if (override) this.statuses = statuses; this.statuses = Object.assign(this.statuses, statuses); }, getValidation(elementName) { return this.validations[elementName]; }, setValidation(elementName, validation) { this.validations[elementName] = validation; }, getOption(elementName, fields) { if (!this.options[elementName]) { return; } if (!fields) { return this.getCurrentOption(elementName); } return this.options[elementName].find(option => { return Object.keys(fields).every( fieldName => option[fieldName] === fields[fieldName], ); }); }, getOptions(elementName, fields, filtered = false) { let options = this.options[elementName]; const filter = this.filters[elementName]; if (filtered && filter) { options = filter(options); } if (!options) { return; } if (!fields) return options; return this.options[elementName].filter(option => { return Object.keys(fields).every( fieldName => option[fieldName] === fields[fieldName], ); }); }, getCurrentOption(elementName) { const valueName = getValueName(elementName); const currentValue = this.values[valueName]; if (!currentValue) { return; } const currentOption = this.options[elementName].find( x => x.value === currentValue, ); return currentOption; }, setOptions(elementName, options) { this.options[elementName] = options; }, applyOptions(options) { this.options = mergeWith(this.options, options, (obj, src) => { if (!isNil(src)) { return src; } return obj; }); }, getFilter(elementName) { return this.filters[elementName]; }, setFilter(elementName, filter) { const valueName = getValueName(elementName); const value = this.getValue(valueName); if ( filter && !filter(this.getOptions(elementName)).some(x => x.value === value) && !noResetValueElements.includes(elementName) ) { this.setValue(valueName, null); } this.filters[elementName] = filter; }, // applyFilters(filters) { // this.filters = { ...this.filters, ...filters }; // }, }; export default Object.assign(valuesData, valuesActions);