From 2cdc20590d5edc72e5961d237b403e20860cb1c9 Mon Sep 17 00:00:00 2001 From: Daniel Lazar Date: Sun, 18 Sep 2022 13:08:41 +0200 Subject: [PATCH 1/2] fix(all-tab): avoid null result during recalculation --- .../+tabs/all-tab/all-tab.component.ts | 15 ++++++++++----- .../+tabs/all-tab/all.tab.component.spec.ts | 8 ++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/apps/frontend/src/app/pages/transport-problem/+tabs/all-tab/all-tab.component.ts b/apps/frontend/src/app/pages/transport-problem/+tabs/all-tab/all-tab.component.ts index 61b1aa8..a68a9b4 100644 --- a/apps/frontend/src/app/pages/transport-problem/+tabs/all-tab/all-tab.component.ts +++ b/apps/frontend/src/app/pages/transport-problem/+tabs/all-tab/all-tab.component.ts @@ -6,7 +6,7 @@ import {checkSolvability} from '@opres/shared/utils'; import {LanguageSwitcherService} from '@frontend/components/layout/language-switcher/language-switcher.service'; import {LoadingHandlerService} from '@frontend/services/loading-handler.service'; import {UntilDestroy, untilDestroyed} from '@ngneat/until-destroy'; -import {BehaviorSubject, finalize, Observable} from 'rxjs'; +import {BehaviorSubject, finalize} from 'rxjs'; import {tap} from 'rxjs/operators'; import { @@ -26,8 +26,8 @@ import {EMPTY_TP_DATA} from '../tabs.constant'; export class AllTabComponent { public formGroup: FormGroup; public isLoading$ = this.loadingHandler.isLoading; - public results$: Observable | null = null; public currentLanguage$ = this.languageSwitcherService.currentLanguage; + public results$ = new BehaviorSubject(null); /** It contains all table data what are necessary for calculations (costs, demands, stocks). */ private tpData$ = new BehaviorSubject(EMPTY_TP_DATA); @@ -83,14 +83,19 @@ export class AllTabComponent { } const method = this.formGroup.get('method')?.value as TPMethods; - this.results$ = this.transportProblemService + this.transportProblemService .getFullCalculationResult(tpData, method) - .pipe(finalize(() => this.loadingHandler.stop())); + .pipe( + tap((response) => this.results$.next(response)), + finalize(() => this.loadingHandler.stop()), + untilDestroyed(this), + ) + .subscribe(); } public reset(): void { this.formGroup.setErrors(null); - this.results$ = null; + this.results$.next(null); this.tpData$.next(EMPTY_TP_DATA); } } diff --git a/apps/frontend/src/app/pages/transport-problem/+tabs/all-tab/all.tab.component.spec.ts b/apps/frontend/src/app/pages/transport-problem/+tabs/all-tab/all.tab.component.spec.ts index f154a3d..ad98322 100644 --- a/apps/frontend/src/app/pages/transport-problem/+tabs/all-tab/all.tab.component.spec.ts +++ b/apps/frontend/src/app/pages/transport-problem/+tabs/all-tab/all.tab.component.spec.ts @@ -53,7 +53,7 @@ describe('AllTabComponent', () => { it('should check default values', () => { expect(component.formGroup.getRawValue()).toEqual(formGroupMock); - expect(component.results$).toEqual(null); + expect(component.results$.getValue()).toEqual(null); }); it('should change number of shops', async () => { @@ -95,18 +95,18 @@ describe('AllTabComponent', () => { MatButtonHarness.with({selector: '[data-test-id="calculate-button"]'}), ); await button.click(); - expect(component.results$).not.toEqual(null); + expect(component.results$.getValue()).not.toEqual(null); expect(firstPhaseSpy).toHaveBeenCalled(); }); it('should reset states', () => { component.formGroup.setErrors({apple: 'I am an error'}); - component.results$ = of({ + component.results$.next({ firstPhase: {steps: [], epsilon: {value: 123}}, secondPhase: {steps: [], epsilon: {value: 123}}, }); component.reset(); expect(component.formGroup.errors).toEqual(null); - expect(component.results$).toEqual(null); + expect(component.results$.getValue()).toEqual(null); }); }); From de374f6e338d18018f4ad2b6023fc20121b9bfc6 Mon Sep 17 00:00:00 2001 From: Daniel Lazar Date: Sun, 18 Sep 2022 13:13:09 +0200 Subject: [PATCH 2/2] fix(epsilon-tab): avoid null result during recalculation --- .../epsilon-tab/epsilon.tab.component.spec.ts | 2 +- .../+tabs/epsilon-tab/epsilon.tab.component.ts | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/frontend/src/app/pages/transport-problem/+tabs/epsilon-tab/epsilon.tab.component.spec.ts b/apps/frontend/src/app/pages/transport-problem/+tabs/epsilon-tab/epsilon.tab.component.spec.ts index c36211c..f815214 100644 --- a/apps/frontend/src/app/pages/transport-problem/+tabs/epsilon-tab/epsilon.tab.component.spec.ts +++ b/apps/frontend/src/app/pages/transport-problem/+tabs/epsilon-tab/epsilon.tab.component.spec.ts @@ -76,7 +76,7 @@ describe('EpsilonTabComponent', () => { expect(component.secondStepFormGroup.getRawValue()).toEqual({}); expect(component.costs$.getValue()).toEqual(costsMock); expect(component.transportations$.getValue()).toEqual(transportationsMock); - expect(component.result$).toEqual(null); + expect(component.result$.getValue()).toEqual(null); component.isLoading$.subscribe((loading: boolean) => expect(loading).toEqual(false), ); diff --git a/apps/frontend/src/app/pages/transport-problem/+tabs/epsilon-tab/epsilon.tab.component.ts b/apps/frontend/src/app/pages/transport-problem/+tabs/epsilon-tab/epsilon.tab.component.ts index 81f6f11..343997f 100644 --- a/apps/frontend/src/app/pages/transport-problem/+tabs/epsilon-tab/epsilon.tab.component.ts +++ b/apps/frontend/src/app/pages/transport-problem/+tabs/epsilon-tab/epsilon.tab.component.ts @@ -5,15 +5,17 @@ import {Epsilon, Table, TransportTable} from '@opres/shared/types'; import {InputTableService} from '@opres/ui/tables'; import {LanguageSwitcherService} from '@frontend/components/layout/language-switcher/language-switcher.service'; import {LoadingHandlerService} from '@frontend/services/loading-handler.service'; +import {UntilDestroy, untilDestroyed} from '@ngneat/until-destroy'; import {forEach, mapValues} from 'lodash'; -import {BehaviorSubject, Observable} from 'rxjs'; -import {finalize} from 'rxjs/operators'; +import {BehaviorSubject} from 'rxjs'; +import {finalize, tap} from 'rxjs/operators'; import { transportProblemCacheBuster$, TransportProblemService, } from '../../transport-problem.service'; +@UntilDestroy() @Component({ selector: 'epsilon-tab', templateUrl: './epsilon.tab.template.html', @@ -37,7 +39,7 @@ export class EpsilonTabComponent { ]); public isLoading$ = this.loadingHandler.isLoading; public currentLanguage$ = this.languageSwitcherService.currentLanguage; - public result$: Observable | null = null; + public result$ = new BehaviorSubject(null); constructor( private transportProblemService: TransportProblemService, @@ -75,9 +77,14 @@ export class EpsilonTabComponent { public onCalculate(): void { this.loadingHandler.start(); const transportTable = this.getTransportTableFromCurrentInput(); - this.result$ = this.transportProblemService + this.transportProblemService .getEpsilonResult(transportTable) - .pipe(finalize(() => this.loadingHandler.stop())); + .pipe( + tap((response) => this.result$.next(response)), + finalize(() => this.loadingHandler.stop()), + untilDestroyed(this), + ) + .subscribe(); } private getTransportTableFromCurrentInput(): TransportTable {