diff --git a/projects/nshmp-apps/src/app/gmm/distance/state/app.actions.ts b/projects/nshmp-apps/src/app/gmm/distance/state/app.actions.ts deleted file mode 100644 index ec9233dceba4ecb3566776da1d9a0b1bc5b086dc..0000000000000000000000000000000000000000 --- a/projects/nshmp-apps/src/app/gmm/distance/state/app.actions.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - GmmDistanceResponse, - GmmDistanceUsage, -} from '@ghsc/nshmp-utils-ts/libs/nshmp-ws/gmm-services'; -import {createActionGroup, emptyProps, props} from '@ngrx/store'; -import {sharedActions} from 'projects/nshmp-apps/src/shared/state/shared'; - -/** - * GMM distance NGRX actions. - */ -export const actions = createActionGroup({ - events: { - ...sharedActions, - /** Action to set the initial form values from query or default */ - 'Initial Form Set': emptyProps(), - /** Service response action */ - 'Service Response': props<{serviceResponses: GmmDistanceResponse[]}>(), - /** Usage response action */ - 'Usage Response': props<{usageResponses: GmmDistanceUsage}>(), - }, - source: 'GMM vs Distance', -}); diff --git a/projects/nshmp-apps/src/app/gmm/distance/state/app.effects.ts b/projects/nshmp-apps/src/app/gmm/distance/state/app.effects.ts deleted file mode 100644 index 8a5dfef38f17ce4241a0d96c028e9d1a1e8a8233..0000000000000000000000000000000000000000 --- a/projects/nshmp-apps/src/app/gmm/distance/state/app.effects.ts +++ /dev/null @@ -1,134 +0,0 @@ -import {Injectable} from '@angular/core'; -import {gmmUtils} from '@ghsc/nshmp-lib-ng/gmm'; -import {NshmpService, SpinnerService} from '@ghsc/nshmp-lib-ng/nshmp'; -import {plotUtils} from '@ghsc/nshmp-lib-ng/plot'; -import { - GmmDistanceResponse, - GmmDistanceUsage, -} from '@ghsc/nshmp-utils-ts/libs/nshmp-ws/gmm-services'; -import {Actions, createEffect, ofType} from '@ngrx/effects'; -import {concatLatestFrom} from '@ngrx/operators'; -import {Store} from '@ngrx/store'; -import {environment} from 'projects/nshmp-apps/src/environments/environment'; -import {catchError, exhaustMap, map, mergeMap} from 'rxjs/operators'; - -import {defaultFormValues} from '../utils/app.default-values'; -import {serviceResponseToPlotData} from '../utils/response.handler'; -import {actions} from './app.actions'; -import {distanceAppFeature} from './app.reducer'; - -/** - * NGRX application effects. - */ -@Injectable() -export class GmmDistanceAppEffects { - /** nshmp-ws base URL */ - baseUrl = environment.webServices.data.url; - /** GMM service URL */ - serviceUrl = `${this.baseUrl}${environment.webServices.data.services.gmmDistance}`; - - /** - * Call the services. - */ - callService$ = createEffect(() => - this.actions$.pipe( - ofType(actions.callServices), - concatLatestFrom(() => - this.store.select(distanceAppFeature.selectGmmDistanceAppState) - ), - exhaustMap(([, state]) => { - this.spinnerService.show(SpinnerService.MESSAGE_SERVICE); - - const urls = gmmUtils.serviceEndpoints( - this.serviceUrl, - state.controlForm.value, - state.controlForm.value.multiSelectableParam - ); - - return this.nshmpService.callServices$(urls).pipe( - mergeMap((serviceResponses: GmmDistanceResponse[]) => { - this.spinnerService.remove(); - return [actions.serviceResponse({serviceResponses})]; - }), - catchError((error: Error) => this.nshmpService.throwError$(error)) - ); - }), - catchError((error: Error) => this.nshmpService.throwError$(error)) - ) - ); - - /** - * Transform the service responses to plot data. - */ - createData$ = createEffect(() => - this.actions$.pipe( - ofType(actions.serviceResponse), - concatLatestFrom(() => - this.store.select(distanceAppFeature.selectGmmDistanceAppState) - ), - map(([, state]) => { - const plots = plotUtils.updateAppPlotSettings( - serviceResponseToPlotData(state) - ); - return actions.plots({plots}); - }), - catchError((error: Error) => this.nshmpService.throwError$(error)) - ) - ); - - /** - * Initialize the application. - */ - init$ = createEffect(() => - this.actions$.pipe( - ofType(actions.init), - concatLatestFrom(() => - this.store.select(distanceAppFeature.selectControlForm) - ), - exhaustMap(([, form]) => { - this.spinnerService.show(SpinnerService.MESSAGE_METADATA); - - return this.nshmpService - .callService$<GmmDistanceUsage>(this.serviceUrl) - .pipe( - mergeMap(usage => { - this.spinnerService.remove(); - const parameters = usage.response.parameters; - const values = defaultFormValues(parameters); - const controls = form.controls; - - const typedActions = gmmUtils.initialFormSetActions( - form, - values, - parameters - ); - typedActions.push(actions.usageResponse({usageResponses: usage})); - gmmUtils.addFormAction( - parameters.rMax, - controls.rMax.id, - values.rMax, - typedActions - ); - gmmUtils.addFormAction( - parameters.rMin, - controls.rMin.id, - values.rMin, - typedActions - ); - - return typedActions; - }), - catchError((error: Error) => this.nshmpService.throwError$(error)) - ); - }), - catchError((error: Error) => this.nshmpService.throwError$(error)) - ) - ); - - constructor( - private actions$: Actions, - private nshmpService: NshmpService, - private spinnerService: SpinnerService, - private store: Store - ) {} -} diff --git a/projects/nshmp-apps/src/app/gmm/distance/state/app.reducer.ts b/projects/nshmp-apps/src/app/gmm/distance/state/app.reducer.ts deleted file mode 100644 index 78d59977aca060470f404557084f4024761c5154..0000000000000000000000000000000000000000 --- a/projects/nshmp-apps/src/app/gmm/distance/state/app.reducer.ts +++ /dev/null @@ -1,281 +0,0 @@ -import {GmmFormControlIds, gmmUtils} from '@ghsc/nshmp-lib-ng/gmm'; -import {NshmpPlot} from '@ghsc/nshmp-lib-ng/plot'; -import {createFeature, createReducer, createSelector, on} from '@ngrx/store'; -import { - box, - createFormGroupState, - disable, - enable, - onNgrxForms, - onNgrxFormsAction, - setValue, - SetValueAction, - unbox, - updateGroup, - wrapReducerWithFormStateUpdate, -} from 'ngrx-forms'; -import {environment} from 'projects/nshmp-apps/src/environments/environment'; -import { - onPlotRedraw, - onPlotSettingsForm, - onResetSetting, -} from 'projects/nshmp-apps/src/shared/state/shared'; - -import {FormControls} from '../models/form-controls.model'; -import { - defaultFormValues, - defaultPlots, - MEAN_PLOT_SETTING_ID, -} from '../utils/app.default-values'; -import {validateControlPanelForm} from '../utils/control-form.validators'; -import {serviceResponseToPlotData} from '../utils/response.handler'; -import {actions} from './app.actions'; -import {AppState, CONTROL_FORM_ID, INITIAL_STATE} from './app.state'; - -/** Form state key ids */ -const formKeys = { - control: { - gmmSource: `${CONTROL_FORM_ID}.${GmmFormControlIds.GMM_SOURCE}`, - multiSelectable: `${CONTROL_FORM_ID}.${GmmFormControlIds.MULTI_SELECTABLE_PARAM}`, - Mw: `${CONTROL_FORM_ID}.${GmmFormControlIds.MW}`, - showEpistemicUncertainty: `${CONTROL_FORM_ID}.${GmmFormControlIds.SHOW_EPISTEMIC_UNCERTAINTY}`, - vs30: `${CONTROL_FORM_ID}.${GmmFormControlIds.VS30}`, - }, - settings: { - mean: MEAN_PLOT_SETTING_ID, - }, -}; - -const baseUrl = environment.webServices.data.url; -const endpoint = environment.webServices.data.services.gmmDistance; -const serviceUrl = `${baseUrl}${endpoint}`; - -/** - * GMM distance NGRX application feature. - */ -export const distanceAppFeature = createFeature({ - extraSelectors: ({selectPlots}) => ({ - selectMeanPlot: createSelector(selectPlots, plots => - plots.get(gmmUtils.PlotType.MEANS) - ), - }), - name: 'gmmDistanceApp', - reducer: createReducer( - /** Application intitial sate */ - INITIAL_STATE, - /* On NGRX forms */ - onNgrxForms(), - /* On form change */ - onNgrxFormsAction(SetValueAction, (state, action) => { - const clearPlots = new Map<string, NshmpPlot>(); - - state.plots.forEach((plot, key) => - clearPlots.set(key, { - ...plot, - plotData: { - ...plot.plotData, - data: [ - ...plot.plotData.data.map(data => { - data = {...data}; - data.x = []; - data.y = []; - return data; - }), - ], - }, - }) - ); - - const clearState: AppState = { - ...state, - controlForm: updateGroup<FormControls>({ - showEpistemicUncertainty: control => - disable(setValue(control, false)), - })(state.controlForm), - plots: clearPlots, - serviceResponses: null, - }; - - const serviceCallInfo = gmmUtils.serviceCallInfo({ - multiSelectableParam: clearState.controlForm.value.multiSelectableParam, - serviceName: clearState.serviceCallInfo.serviceName, - serviceResponses: clearState.serviceResponses, - serviceUrl, - values: clearState.controlForm.value, - }); - - switch (action.controlId) { - case formKeys.control.multiSelectable: { - let form = {...clearState.controlForm}; - const parameters = - clearState.usageResponses?.response?.parameters || null; - - if (form.value.multiSelectableParam === GmmFormControlIds.MW) { - form = updateGroup<FormControls>({ - gmmSource: gmm => setValue(gmm, box([])), - Mw: Mw => setValue(Mw, (parameters.Mw.value as number) || null), - MwMulti: Mw => setValue(Mw, box([])), - })(clearState.controlForm); - } else if ( - form.value.multiSelectableParam === GmmFormControlIds.VS30 - ) { - form = updateGroup<FormControls>({ - gmmSource: gmm => setValue(gmm, box([])), - vs30: vs30 => - setValue(vs30, (parameters.vs30.value as number) || null), - vs30Multi: vs30 => setValue(vs30, box([])), - })(clearState.controlForm); - } - - return { - ...clearState, - controlForm: form, - serviceCallInfo, - }; - } - case formKeys.control.gmmSource: { - const gmm = unbox(clearState.controlForm.value.gmmSource); - - if ( - clearState.usageResponses && - clearState.controlForm.controls.gmmSource && - gmm.length > 0 - ) { - const supportedImts = gmmUtils.getSupportedImts( - gmm, - clearState.usageResponses - ); - const controlForm = gmmUtils.onGmmChange( - clearState.controlForm, - supportedImts - ); - return { - ...clearState, - controlForm, - serviceCallInfo, - supportedImts, - }; - } - return { - ...clearState, - serviceCallInfo, - }; - } - case formKeys.control.showEpistemicUncertainty: { - return { - ...state, - plots: serviceResponseToPlotData(state), - }; - } - default: { - if (action.controlId.includes(formKeys.settings.mean)) { - return onPlotSettingsForm(state, action); - } else { - return { - ...clearState, - serviceCallInfo, - }; - } - } - } - }), - /* On init action */ - on(actions.init, () => { - return { - ...INITIAL_STATE, - }; - }), - /* On reset control panel action */ - on(actions.resetControlPanel, state => { - const controlForm = createFormGroupState<FormControls>( - CONTROL_FORM_ID, - defaultFormValues(state.usageResponses.response.parameters) - ); - - state = { - ...state, - controlForm, - plots: INITIAL_STATE.plots, - serviceResponses: INITIAL_STATE.serviceResponses, - }; - - return { - ...state, - serviceCallInfo: gmmUtils.serviceCallInfo({ - multiSelectableParam: state.controlForm.value.multiSelectableParam, - serviceName: state.serviceCallInfo.serviceName, - serviceResponses: state.serviceResponses, - serviceUrl, - values: state.controlForm.value, - }), - }; - }), - /* On reset plot settings action */ - on(actions.resetSettings, state => { - return onResetSetting(state, defaultPlots()); - }), - /* On plots action */ - on(actions.plots, (state, {plots}) => { - return { - ...state, - plots, - }; - }), - /* On plot redraw action */ - on(actions.plotRedraw, state => { - return onPlotRedraw(state); - }), - /* On service call info action */ - on(actions.serviceCallInfo, (state, {serviceCallInfo}) => { - return { - ...state, - serviceCallInfo: { - ...state.serviceCallInfo, - ...serviceCallInfo, - }, - }; - }), - /* On service response action */ - on(actions.serviceResponse, (state, {serviceResponses}) => { - const response = serviceResponses; - const means = response.map(s => s.response.means); - const sigmas = response.map(s => s.response.sigmas); - const hasLogicTree = gmmUtils.hasTree([...means, ...sigmas]); - - state = { - ...state, - controlForm: updateGroup<FormControls>({ - showEpistemicUncertainty: hasLogicTree ? enable : disable, - })(state.controlForm), - serviceResponses: response, - }; - - return { - ...state, - serviceCallInfo: gmmUtils.serviceCallInfo({ - multiSelectableParam: state.controlForm.value.multiSelectableParam, - serviceName: state.serviceCallInfo.serviceName, - serviceResponses: state.serviceResponses, - serviceUrl, - values: state.controlForm.value, - }), - }; - }), - /* On usage response action */ - on(actions.usageResponse, (state, {usageResponses}) => { - return { - ...state, - usageResponses: usageResponses, - }; - }) - ), -}); - -/** - * Application NGRX reducer with validators. - */ -distanceAppFeature.reducer = wrapReducerWithFormStateUpdate( - distanceAppFeature.reducer, - state => state.controlForm, - validateControlPanelForm -); diff --git a/projects/nshmp-apps/src/app/gmm/gmm.routes.ts b/projects/nshmp-apps/src/app/gmm/gmm.routes.ts index 15ed496220e7a1f09be025666021de63974f2a66..52138a14c49bbf2b5051944fdb2864fdffa313ed 100644 --- a/projects/nshmp-apps/src/app/gmm/gmm.routes.ts +++ b/projects/nshmp-apps/src/app/gmm/gmm.routes.ts @@ -2,8 +2,6 @@ import {Routes} from '@angular/router'; import {provideEffects} from '@ngrx/effects'; import {provideState} from '@ngrx/store'; -import {GmmDistanceAppEffects} from './distance/state/app.effects'; -import {distanceAppFeature} from './distance/state/app.reducer'; import {MagnitudeAppEffects} from './magnitude/state/app.effects'; import {magnitudeAppFeature} from './magnitude/state/app.reducer'; import {SpectraAppEffects} from './spectra/state/app.effects'; @@ -15,10 +13,6 @@ const routes: Routes = [ loadComponent: () => import('./distance/app.component').then(com => com.AppComponent), path: 'distance', - providers: [ - provideState(distanceAppFeature), - provideEffects(GmmDistanceAppEffects), - ], }, { loadComponent: () =>