diff --git a/stores/calculation/options/hooks.js b/stores/calculation/options/hooks.js index 5d27809..a87cef4 100644 --- a/stores/calculation/options/hooks.js +++ b/stores/calculation/options/hooks.js @@ -3,7 +3,10 @@ import { useStore } from 'stores/hooks'; export function useOptions(elementName) { const { $calculation } = useStore(); + + const options = $calculation.$options.observeOptions(elementName); + return { - options: $calculation.$options.getOptions(elementName), + options, }; } diff --git a/stores/calculation/options/index.ts b/stores/calculation/options/index.ts index be9aeaf..e2c87a8 100644 --- a/stores/calculation/options/index.ts +++ b/stores/calculation/options/index.ts @@ -6,6 +6,7 @@ import type { Elements } from 'Components/Calculation/config/map'; import { mergeWith } from 'lodash'; import { makeAutoObservable } from 'mobx'; +import { computedFn } from 'mobx-utils'; import RootStore from 'stores/root'; import { CalculationOptions, Filter, Options, OptionsFilters } from './types'; @@ -27,8 +28,8 @@ const AUTO_SET_VALUE_ELEMENTS: Elements[] = [ export default class OptionsStore { root: RootStore; - #options: Partial = {}; - #filters: Partial = {}; + options: Partial = {}; + filters: Partial = {}; constructor(rootStore: RootStore) { makeAutoObservable(this); @@ -36,13 +37,13 @@ export default class OptionsStore { } hydrate = (initialOptions: Partial) => { - this.#options = initialOptions; + this.options = initialOptions; }; /** **************** OPTIONS **************** */ getOption(elementName: Elements) { const value = this.root.$calculation.$values.getValueByElement(elementName); - return this.#options[elementName]?.find((x) => x.value === value); + return this.options[elementName]?.find((x) => x.value === value); } getOptions( @@ -51,37 +52,39 @@ export default class OptionsStore { filtered: true; } ) { - const options = this.#options[elementName]; + const options = this.options[elementName]; if (!settings?.filtered) return options; - const filter = this.#filters[elementName]; + const filter = this.filters[elementName]; return filter ? options && filter(options) : options; } - setOptions(elementName: Elements, options: Options) { - this.#options[elementName] = options; - } + observeOptions = computedFn((elementName: Elements) => this.getOptions(elementName)); - mergeOptions(options: Partial) { - mergeWith(this.#options, options, (objValue, srcValue) => + setOptions = (elementName: Elements, options: Options) => { + this.options[elementName] = options; + }; + + mergeOptions = (options: Partial) => { + mergeWith(this.options, options, (objValue, srcValue) => objValue === undefined ? srcValue : objValue ); - } + }; - clearOptions(elementName: Elements) { - this.#options[elementName] = []; + clearOptions = (elementName: Elements) => { + this.options[elementName] = []; this.root.$calculation.$values.clearValueOfElement(elementName); - } + }; /** **************** FILTERS **************** */ getFilter(elementName: Elements) { - return this.#filters[elementName]; + return this.filters[elementName]; } - setFilter(elementName: Elements, filter: Filter) { - this.#filters[elementName] = filter; + setFilter = (elementName: Elements, filter: Filter) => { + this.filters[elementName] = filter; /** * Проверяем, что значение есть в отфильтрованном списке, @@ -106,5 +109,5 @@ export default class OptionsStore { if (filteredOptons?.length === 1 && AUTO_SET_VALUE_ELEMENTS.includes(elementName)) { this.root.$calculation.$values.setValueOfElement(elementName, filteredOptons[0].value); } - } + }; }