Merge branch 'DEVELOP' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.gridFailureInformation.frontend into SI-532
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-api-client.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-api-client.ts index a64d50c..decc448 100644 --- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-api-client.ts +++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-api-client.ts
@@ -100,12 +100,6 @@ return null; } - @GET('/expected-reasons') - @Adapter(GridFailureService.expectedReasonListAdapter) - public getGridFailureExpectedReasons(): Observable<FailureExpectedReason[]> { - return null; - } - @POST('/grid-failure-informations/condense') @Adapter(GridFailureService.itemAdapter) public postGridFailuresCondensation(@Body() list: string[]): Observable<GridFailure> { @@ -138,13 +132,17 @@ @GET('/addresses/communities/{postcode}') @Adapter(GridFailureService.addressItemListAdapter) - public getAddressCommunities(@Path('postcode') postcode: string): Observable<string[]> { + public getAddressCommunities(@Path('postcode') postcode: string, @Query('branch') branch: string): Observable<string[]> { return null; } @GET('/addresses/districts') @Adapter(GridFailureService.addressItemListAdapter) - public getAddressDistricts(@Query('postcode') postcode: string, @Query('community') community: string): Observable<string[]> { + public getAddressDistricts( + @Query('postcode') postcode: string, + @Query('community') community: string, + @Query('branch') branch: string + ): Observable<string[]> { return null; } @@ -153,17 +151,23 @@ public getAddressStreets( @Query('postcode') postcode: string, @Query('community') community: string, - @Query('district') district: string + @Query('district') district: string, + @Query('branch') branch: string ): Observable<string[]> { return null; } - + @GET('/expected-reasons') + @Adapter(GridFailureService.expectedReasonListAdapter) + public getGridFailureExpectedReasons(@Query('branch') branch: string): Observable<FailureExpectedReason[]> { + return null; + } @GET('/addresses/housenumbers') @Adapter(GridFailureService.housenumberListAdapter) public getAddressHousenumbers( @Query('postcode') postcode: string, @Query('community') community: string, - @Query('street') street: string + @Query('street') street: string, + @Query('branch') branch: string ): Observable<FailureHousenumber[]> { return null; }
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.html b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.html index 4a2f394..a2cbc53 100644 --- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.html +++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.html
@@ -87,7 +87,7 @@ <div class="form-group row"> <label for="failureClassification" class="col-sm-2 col-form-label">{{ 'GridFailure.FailureClassification' | translate }}</label> <div class="col-sm-4"> - <select type="text" class="form-control" [ngrxFormControlState]="(formState?.controls)['failureClassificationId']"> + <select type="text" class="form-control" [ngrxFormControlState]="formState.controls['failureClassificationId']"> <option [value]="null" selected>{{ 'SelectOption' | translate }}</option> <option *ngFor="let classification of gridFailureDetailsSandbox.gridFailureClassifications$ | async" [value]="classification.id">{{ classification.classification @@ -100,7 +100,7 @@ <div class="form-group row"> <label for="failureType" class="col-sm-2 col-form-label">{{ 'GridFailure.FailureType' | translate }}</label> <div class="col-sm-4"> - <select type="text" class="form-control" [ngrxFormControlState]="(formState?.controls)['failureTypeId']"> + <select type="text" class="form-control" [ngrxFormControlState]="formState.controls['failureTypeId']"> <option [value]="null" selected>{{ 'SelectOption' | translate }}</option> <option *ngFor="let type of gridFailureDetailsSandbox.gridFailureTypes$ | async" [value]="type.id">{{ type.type }}</option> </select> @@ -116,7 +116,7 @@ maxlength="255" class="form-control" id="responsibility" - [ngrxFormControlState]="(formState?.controls)['responsibility']" + [ngrxFormControlState]="formState.controls['responsibility']" autocomplete="off" /> </div> @@ -126,7 +126,7 @@ <div class="form-group row"> <label for="internExtern" class="col-sm-2 col-form-label">{{ 'GridFailure.InternExtern' | translate }}</label> <div class="col-sm-4"> - <select type="text" class="form-control" id="internExtern" [ngrxFormControlState]="(formState?.controls)['internExtern']"> + <select type="text" class="form-control" id="internExtern" [ngrxFormControlState]="formState.controls['internExtern']"> <option [value]="null" selected>{{ 'SelectOption' | translate }}</option> <option *ngFor="let enum of gridFailureDetailsSandbox.internExternEnum | keyvalue" [value]="enum.key">{{ enum.value }}</option> </select> @@ -142,7 +142,7 @@ type="text" maxlength="255" class="form-control" - [ngrxFormControlState]="(formState?.controls)['statusIntern']" + [ngrxFormControlState]="formState.controls['statusIntern']" autocomplete="off" readonly /> @@ -158,7 +158,7 @@ type="text" maxlength="255" class="form-control" - [ngrxFormControlState]="(formState?.controls)['statusExtern']" + [ngrxFormControlState]="formState.controls['statusExtern']" autocomplete="off" readonly /> @@ -169,7 +169,7 @@ <div class="form-group row"> <label for="publicationStatus" class="col-sm-2 col-form-label">{{ 'GridFailure.PublicationStatus' | translate }}</label> <div class="col-sm-4"> - <select type="text" class="form-control" id="publicationStatus" [ngrxFormControlState]="(formState?.controls)['publicationStatus']"> + <select type="text" class="form-control" id="publicationStatus" [ngrxFormControlState]="formState.controls['publicationStatus']"> <option [value]="null" selected>{{ 'SelectOption' | translate }}</option> <option *ngFor="let enum of gridFailureDetailsSandbox.publicationStatusEnum | keyvalue" [value]="enum.key">{{ enum.value }}</option> </select> @@ -185,9 +185,15 @@ <div class="form-group row"> <label for="branch" class="col-sm-2 col-form-label">{{ 'GridFailure.Branch' | translate }}</label> <div class="col-sm-4"> - <select required type="text" class="form-control" [ngrxFormControlState]="(formState?.controls)['branchId']"> + <select required type="text" class="form-control" [ngrxFormControlState]="formState.controls['__formBranch']"> <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option> - <option *ngFor="let branch of gridFailureDetailsSandbox.gridFailureBranches$ | async" [value]="branch.id">{{ branch.description }}</option> + <option + *ngFor="let branch of gridFailureDetailsSandbox.gridFailureBranches$ | async" + [value]="branch" + [selected]="branch.id === formState.controls['branchId'].value" + > + {{ branch.description }}</option + > </select> </div> </div> @@ -196,7 +202,7 @@ <div class="form-group row"> <label for="voltageLevel" class="col-sm-2 col-form-label">{{ 'GridFailure.VoltageLevel' | translate }}</label> <div class="col-sm-4"> - <select required type="text" class="form-control" id="voltageLevel" [ngrxFormControlState]="(formState?.controls)['voltageLevel']"> + <select required type="text" class="form-control" id="voltageLevel" [ngrxFormControlState]="formState.controls['voltageLevel']"> <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option> <option *ngFor="let enum of gridFailureDetailsSandbox.voltageLevelEnum | keyvalue" [value]="enum.key">{{ enum.value }}</option> </select> @@ -204,10 +210,10 @@ </div> <!-- pressureLevel --> - <div class="form-group row"> + <div class="form-group row" [visibleByDependentField]="!(gridFailureDetailsSandbox.isPowerBranchSelected$ | async)"> <label for="pressureLevel" class="col-sm-2 col-form-label">{{ 'GridFailure.PressureLevel' | translate }}</label> <div class="col-sm-4"> - <select type="text" class="form-control" id="pressureLevel" [ngrxFormControlState]="(formState?.controls)['pressureLevel']"> + <select type="text" class="form-control" id="pressureLevel" [ngrxFormControlState]="formState.controls['pressureLevel']"> <option [value]="null" selected>{{ 'SelectOption' | translate }}</option> <option *ngFor="let enum of gridFailureDetailsSandbox.pressureLevelEnum | keyvalue" [value]="enum.key">{{ enum.value }}</option> </select> @@ -220,11 +226,8 @@ <div class="input-group col-sm-4"> <app-date-time-picker [isRequired]="true" - [ngrxFormControlState]="((gridFailureDetailsSandbox.gridFailureDetailsFormState$ | async)?.controls)['failureBegin']" - [isDisabled]=" - !gridFailureDetailsSandbox.saveEnabled || - ((gridFailureDetailsSandbox.gridFailureDetailsFormState$ | async)?.controls)['failureBegin']?.isDisabled - " + [ngrxFormControlState]="formState.controls['failureBegin']" + [isDisabled]="formState.controls['failureBegin']?.isDisabled" > </app-date-time-picker> </div> @@ -235,11 +238,8 @@ <label for="failureEndPlanned" class="col-sm-2 col-form-label">{{ 'GridFailure.FailureEndPlanned' | translate }}</label> <div class="input-group col-sm-4"> <app-date-time-picker - [ngrxFormControlState]="((gridFailureDetailsSandbox.gridFailureDetailsFormState$ | async)?.controls)['failureEndPlanned']" - [isDisabled]=" - !gridFailureDetailsSandbox.saveEnabled || - ((gridFailureDetailsSandbox.gridFailureDetailsFormState$ | async)?.controls)['failureEndPlanned']?.isDisabled - " + [ngrxFormControlState]="formState.controls['failureEndPlanned']" + [isDisabled]="formState.controls['failureEndPlanned']?.isDisabled" > </app-date-time-picker> </div> @@ -250,11 +250,8 @@ <label for="failureEndResupplied" class="col-sm-2 col-form-label">{{ 'GridFailure.FailureEndResupplied' | translate }}</label> <div class="input-group col-sm-4"> <app-date-time-picker - [ngrxFormControlState]="((gridFailureDetailsSandbox.gridFailureDetailsFormState$ | async)?.controls)['failureEndResupplied']" - [isDisabled]=" - !gridFailureDetailsSandbox.saveEnabled || - ((gridFailureDetailsSandbox.gridFailureDetailsFormState$ | async)?.controls)['failureEndResupplied']?.isDisabled - " + [ngrxFormControlState]="formState.controls['failureEndResupplied']" + [isDisabled]="formState.controls['failureEndResupplied']?.isDisabled" > </app-date-time-picker> </div> @@ -264,7 +261,7 @@ <div class="form-group row"> <label for="expectedReason" class="col-sm-2 col-form-label">{{ 'GridFailure.ExpectedReason' | translate }}</label> <div class="col-sm-4"> - <select required type="text" class="form-control" id="expectedReason" [ngrxFormControlState]="(formState?.controls)['expectedReasonId']"> + <select required type="text" class="form-control" id="expectedReason" [ngrxFormControlState]="formState.controls['expectedReasonId']"> <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option> <option *ngFor="let item of gridFailureDetailsSandbox.gridFailureExpectedReasons$ | async" [value]="item.id">{{ item.text }}</option> </select> @@ -276,7 +273,7 @@ maxlength="255" class="form-control" id="publicationFreetext" - [ngrxFormControlState]="(formState?.controls)['publicationFreetext']" + [ngrxFormControlState]="formState.controls['publicationFreetext']" autocomplete="off" /> </div> @@ -291,7 +288,7 @@ maxlength="255" class="form-control" id="internalRemark" - [ngrxFormControlState]="(formState?.controls)['internalRemark']" + [ngrxFormControlState]="formState.controls['internalRemark']" autocomplete="off" /> </div> @@ -307,22 +304,37 @@ <div class="btn-group" *ngIf="formState?.isEnabled"> <button class="btn btn-primary non-outline" - (click)="failureLocationView = 'NS'; disableUnnecessaryRequiredProperties(); gridFailureDetailsSandbox.resetFailureLocationValues()" - [class.active]="failureLocationView === 'NS'" + (click)=" + failureLocationView = Globals.FAILURE_LOCATION_NS; + disableUnnecessaryRequiredProperties(); + gridFailureDetailsSandbox.resetFailureLocationValues(); + resizeSetMap() + " + [class.active]="failureLocationView === Globals.FAILURE_LOCATION_NS" > {{ 'GridFailure.SubTitle3' | translate }} </button> <button class="btn btn-primary non-outline" - (click)="failureLocationView = 'MS'; disableUnnecessaryRequiredProperties(); gridFailureDetailsSandbox.resetFailureLocationValues()" - [class.active]="failureLocationView === 'MS'" + (click)=" + failureLocationView = Globals.FAILURE_LOCATION_MS; + disableUnnecessaryRequiredProperties(); + gridFailureDetailsSandbox.resetFailureLocationValues(); + resizeSetMap() + " + [class.active]="failureLocationView === Globals.FAILURE_LOCATION_MS" > {{ 'GridFailure.SubTitle4' | translate }} </button> <button class="btn btn-primary non-outline" - (click)="failureLocationView = 'map'; disableUnnecessaryRequiredProperties(); gridFailureDetailsSandbox.resetFailureLocationValues()" - [class.active]="failureLocationView === 'map'" + (click)=" + failureLocationView = Globals.FAILURE_LOCATION_MAP; + disableUnnecessaryRequiredProperties(); + gridFailureDetailsSandbox.resetFailureLocationValues(); + resizeSetMap() + " + [class.active]="failureLocationView === Globals.FAILURE_LOCATION_MAP" > {{ 'GridFailure.Map' | translate }} </button> @@ -342,7 +354,7 @@ class="form-control" id="postcode" [ngbTypeahead]="gridFailureDetailsSandbox.searchForAddressPostalcodes" - [ngrxFormControlState]="(formState?.controls)['postcode']" + [ngrxFormControlState]="formState.controls['postcode']" autocomplete="off" /> </div> @@ -357,7 +369,7 @@ type="text" class="form-control" id="city" - [ngrxFormControlState]="(formState?.controls)['city']" + [ngrxFormControlState]="formState.controls['city']" > <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option> <option *ngFor="let item of gridFailureDetailsSandbox.addressCommunities$ | async" [value]="item">{{ item }}</option> @@ -374,7 +386,7 @@ type="text" class="form-control" id="district" - [ngrxFormControlState]="(formState?.controls)['district']" + [ngrxFormControlState]="formState.controls['district']" > <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option> <option *ngFor="let item of gridFailureDetailsSandbox.addressDistricts$ | async" [value]="item">{{ item }}</option> @@ -391,7 +403,7 @@ type="text" class="form-control" id="street" - [ngrxFormControlState]="(formState?.controls)['street']" + [ngrxFormControlState]="formState.controls['street']" > <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option> <option *ngFor="let item of gridFailureDetailsSandbox.addressStreets$ | async" [value]="item">{{ item }}</option> @@ -408,7 +420,7 @@ type="text" class="form-control" id="housenumber" - [ngrxFormControlState]="(formState?.controls)['housenumber']" + [ngrxFormControlState]="formState.controls['housenumber']" > <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option> <option *ngFor="let housenumber of gridFailureDetailsSandbox.addressHouseNumbers$ | async" [value]="housenumber" @@ -434,7 +446,7 @@ (selectItem)="gridFailureDetailsSandbox.latLonMapping($event.item); gridFailureDetailsSandbox.setStationId($event.item.stationId)" [ngbTypeahead]="gridFailureDetailsSandbox.searchForStation" [ngrxValueConverter]="gridFailureDetailsSandbox.stationValueConverter" - [ngrxFormControlState]="(formState?.controls)['stationDescription']" + [ngrxFormControlState]="formState.controls['stationDescription']" [resultFormatter]="gridFailureDetailsSandbox.formatter" [inputFormatter]="gridFailureDetailsSandbox.formatter" /> @@ -444,7 +456,7 @@ <div class="form-group row"> <label for="radius" class="col-sm-5 col-form-label">{{ 'GridFailure.RadiusInMeter' | translate }}</label> <div class="col-sm-6"> - <select required type="text" class="form-control" [ngrxFormControlState]="(formState?.controls)['radiusId']"> + <select required type="text" class="form-control" [ngrxFormControlState]="formState.controls['radiusId']"> <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option> <option *ngFor="let item of gridFailureDetailsSandbox.gridFailureRadii$ | async" [value]="item.id">{{ item.radius }}</option> </select> @@ -453,6 +465,7 @@ </div> <div class="map-detail-view"> <openk-grid-failure-information-map + [mapOptions]="mapOptions" [mapDetailData]="gridFailureDetailsSandbox.currentGridFailureDetailsCoords" [setInteractionMode]="mapInteractionMode" (latLong)="gridFailureDetailsSandbox.latLonMapping($event)"
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.scss b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.scss index 51262db..e0c1552 100644 --- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.scss +++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.scss
@@ -40,6 +40,7 @@ } .version-select { + width: auto; margin: 8px; } .isDisabled {
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.ts index 7838302..1014fb0 100644 --- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.ts +++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.ts
@@ -19,6 +19,7 @@ import * as store from '@grid-failure-information-app/shared/store'; import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; +import { MapOptions } from '@openk-libs/grid-failure-information-map/shared/models/map-options.model'; @Component({ selector: 'app-grid-failure-details', @@ -32,7 +33,7 @@ public gridFailureVersions$: Observable<GridFailure[]> = this.appState$.select(store.getGridFailureVersionsData); private readonly _initialLocationView = Globals.FAILURE_LOCATION_NS; public failureLocationView: string = this._initialLocationView; - + public mapOptions: MapOptions = new MapOptions(); public get mapInteractionMode(): boolean { return this.failureLocationView === Globals.FAILURE_LOCATION_MAP; } @@ -50,7 +51,9 @@ this.gridFailureDetailsSandbox.resetStationId(); } } - + public resizeSetMap() { + this.mapOptions.forceResize$.next(true); + } public disableUnnecessaryRequiredProperties() { this.gridFailureDetailsSandbox.disableUnnecessaryRequiredProperties(this.failureLocationView); }
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.spec.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.spec.ts index ff5da6a..d829718 100644 --- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.spec.ts +++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.spec.ts
@@ -1,3 +1,4 @@ +import { browser } from 'protractor'; import { FORM_ID } from '@grid-failure-information-app/shared/store/reducers/grid-failures/grid-failure-details-form.reducer'; import { INITIAL_STATE } from './../../../shared/store/reducers/grid-failures/grid-failure-details-form.reducer'; /******************************************************************************** @@ -22,7 +23,8 @@ import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { ActionsSubject, Store } from '@ngrx/store'; import { of } from 'rxjs'; -import { createFormGroupState, EnableAction, DisableAction } from 'ngrx-forms'; +import { EnableAction, DisableAction } from 'ngrx-forms'; +import { async } from '@angular/core/testing'; describe('GridFailureDetailsSandbox', () => { let service: GridFailureDetailsSandbox; @@ -33,26 +35,23 @@ let modalService: NgbModal; let dispatchSpy: any; - beforeEach(() => { + beforeEach(async(() => { appState = { dispatch: () => {}, pipe: () => of(true), select: () => of(true), userDefinedProperties: { controlId: '' } } as any; actionSubject = { pipe: () => of(true), map: () => ({}) } as any; utilService = { displayNotification() {} } as any; router = { navigateByUrl() {} } as any; modalService = { open() {} } as any; dispatchSpy = spyOn(appState, 'dispatch').and.callFake(() => {}); - + const branch: FailureBranch = new FailureBranch(); + branch.id = '00'; + branch.name = 'OS'; + branch.description = 'ohne Sparte'; service = new GridFailureDetailsSandbox(appState, actionSubject, router, utilService, modalService); - const gridFailureDetailsFormState = createFormGroupState<GridFailure>( - FORM_ID, - new GridFailure({ - branchId: '123', - addressPolygonPoints: [1.24, 1.24], - }) - ); - service.gridFailureDetailsFormState$ = of(gridFailureDetailsFormState as any); - service.currentFormState = gridFailureDetailsFormState; + service.currentFormState = INITIAL_STATE; + service.gridFailureBranches$ = of([branch]); + service.gridFailureDetailsFormState$ = of((INITIAL_STATE.value.branchId = '00' as any)); service.noBranchId = '123'; - }); + })); it('should create GridFailureDetailsSandbox service', () => { expect(service).toBeTruthy(); @@ -88,9 +87,18 @@ expect(appState.dispatch).toHaveBeenCalledWith(gridFailureActions.loadGridFailureRadii()); }); - it('should dispatch loadGridFailureExpectedReasons Action via loadGridFailureExpectedReasons()', () => { - service.loadGridFailureExpectedReasons(); - expect(appState.dispatch).toHaveBeenCalledWith(gridFailureActions.loadGridFailureExpectedReasons()); + xit('should dispatch loadGridFailureExpectedReasons Action via registerLoadGridFailureExpectedReasons()', () => { + const branch: FailureBranch = new FailureBranch(); + branch.id = '00'; + branch.name = 'OS'; + branch.description = 'ohne Sparte'; + const branches: FailureBranch[] = [branch]; + service.gridFailureDetailsFormState$ = of((INITIAL_STATE.value.branchId = '00' as any)); + service.currentFormState = INITIAL_STATE.value.branchId = '00' as any; + service.gridFailureBranches$ = of(branches); + (service as any)._registerLoadGridFailureExpectedReasons(); + + expect(appState.dispatch).toHaveBeenCalledWith(gridFailureActions.loadGridFailureExpectedReasons({ payload: branch.name })); }); it('should dispatch loadGridFailureVersions Action via loadGridFailureVersions(id)', () => { @@ -137,12 +145,11 @@ gfdetail.responsibility = 'test'; gfdetail.postcode = '00000'; - service.currentFormState = { - ...service.currentFormState, - isValid: true, - value: gfdetail, - userDefinedProperties: { controlId: '' }, - }; + service.currentFormState = INITIAL_STATE; + (service.currentFormState as any).isValid = true; + (service.currentFormState as any).value = gfdetail; + (service.currentFormState as any).userDefinedProperties = { controlId: '' }; + service.saveGridFailure(); expect(dispatchSpy).toHaveBeenCalledWith(Object({ payload: gfdetail, type: gridFailureActions.saveGridFailure.type })); expect(spy1).toHaveBeenCalled(); @@ -155,33 +162,23 @@ gfdetail.responsibility = 'test'; gfdetail.postcode = '00000'; - service.currentFormState = { - ...service.currentFormState, - isValid: false, - value: gfdetail, - userDefinedProperties: { controlId: '' }, - }; + service.currentFormState = INITIAL_STATE; + (service.currentFormState as any).isValid = false; + (service.currentFormState as any).value = gfdetail; + (service.currentFormState as any).userDefinedProperties = { controlId: '' }; + service.saveGridFailure(); expect(spy1).toHaveBeenCalled(); }); it('should register events', () => { - let gridFailureDetailsFormResponse: any = { - value: { - failureBegin: 'test1', - failureEndPlanned: 'test2', - failureEndResupplied: 'test3', - postcode: '00000', - }, - userDefinedProperties: { controlId: '' }, - }; - service.gridFailureDetailsFormState$ = of(gridFailureDetailsFormResponse); const gridFailure: GridFailure = new GridFailure(); gridFailure.versionNumber = 3; const gridFailureVersions: GridFailure[] = [gridFailure]; spyOn(actionSubject, 'pipe').and.returnValue(of({ payload: gridFailureVersions })); const spy = spyOn(service as any, '_showButtonsByState'); + service.gridFailureDetailsFormState$ = of({ ...INITIAL_STATE }); service.registerEvents(); expect(service.currentFormState).toBeDefined(); expect(spy).toHaveBeenCalled(); @@ -199,13 +196,15 @@ postcode: { id: 'gridFailureDetailsForm.postcode' }, }, }; - spyOn(service.gridFailureDetailsFormState$, 'pipe').and.returnValue(of(formState)); + + service.gridFailureDetailsFormState$ = of({ ...INITIAL_STATE, formState }); service.registerEvents(); expect(appState.dispatch).toHaveBeenCalled(); }); it('should dispatch action in response to controlId = gridFailureDetailsForm.postcode', () => { let formState: any = { + id: 'gridFailureDetailsForm', value: { statusIntern: StateEnum.CREATED, postcode: '00000', @@ -215,7 +214,8 @@ postcode: { id: 'gridFailureDetailsForm.postcode' }, }, }; - spyOn(service.gridFailureDetailsFormState$, 'pipe').and.returnValue(of(formState)); + + service.gridFailureDetailsFormState$ = of({ ...INITIAL_STATE, formState }); service.registerEvents(); expect(appState.dispatch).toHaveBeenCalled(); }); @@ -233,13 +233,15 @@ city: { id: 'gridFailureDetailsForm.city' }, }, }; - spyOn(service.gridFailureDetailsFormState$, 'pipe').and.returnValue(of(formState)); + + service.gridFailureDetailsFormState$ = of({ ...INITIAL_STATE, formState }); service.registerEvents(); expect(appState.dispatch).toHaveBeenCalled(); }); it('should dispatch action in response to controlId = gridFailureDetailsForm.district', () => { let formState: any = { + id: 'gridFailureDetailsForm', value: { statusIntern: StateEnum.CREATED, postcode: '00000', @@ -253,13 +255,15 @@ district: { id: 'gridFailureDetailsForm.district' }, }, }; - spyOn(service.gridFailureDetailsFormState$, 'pipe').and.returnValue(of(formState)); + + service.gridFailureDetailsFormState$ = of({ ...INITIAL_STATE, formState }); service.registerEvents(); expect(appState.dispatch).toHaveBeenCalled(); }); it('should dispatch action in response to controlId = gridFailureDetailsForm.street', () => { let formState: any = { + id: 'gridFailureDetailsForm', value: { statusIntern: StateEnum.CREATED, postcode: '00000', @@ -275,7 +279,8 @@ street: { id: 'gridFailureDetailsForm.street' }, }, }; - spyOn(service.gridFailureDetailsFormState$, 'pipe').and.returnValue(of(formState)); + + service.gridFailureDetailsFormState$ = of({ ...INITIAL_STATE, formState }); service.registerEvents(); expect(appState.dispatch).toHaveBeenCalled(); }); @@ -384,11 +389,8 @@ gfdetail.id = 'id'; gfdetail.responsibility = 'test'; - service.currentFormState = { - ...service.currentFormState, - isValid: true, - value: gfdetail, - }; + (service.currentFormState as any).isValid = true; + (service.currentFormState as any).value = gfdetail; service.latLonMapping(null); expect(dispatchSpy).not.toHaveBeenCalled(); @@ -412,11 +414,9 @@ gfdetail.id = 'id'; gfdetail.stationId = '1'; - service.currentFormState = { - ...service.currentFormState, - isValid: true, - value: gfdetail, - }; + service.currentFormState = INITIAL_STATE; + (service.currentFormState as any).isValid = true; + (service.currentFormState as any).value = gfdetail; const stationId = '2'; @@ -431,11 +431,9 @@ gfdetail.longitude = 1.0; gfdetail.latitude = 1.0; - service.currentFormState = { - ...service.currentFormState, - isValid: true, - value: gfdetail, - }; + service.currentFormState = INITIAL_STATE; + (service.currentFormState as any).isValid = true; + (service.currentFormState as any).value = gfdetail; service.resetCoords(); @@ -446,12 +444,9 @@ const gfdetail = new GridFailure(); gfdetail.id = 'id'; gfdetail.stationId = 'test'; - - service.currentFormState = { - ...service.currentFormState, - isValid: true, - value: gfdetail, - }; + service.currentFormState = INITIAL_STATE; + (service.currentFormState as any).isValid = true; + (service.currentFormState as any).value = gfdetail; service.resetStationId(); @@ -532,14 +527,14 @@ it('should set the required values false if the brnach id is the right', () => { service.noBranchId = '123'; service.currentFormState = { controls: { branchId: { value: '123' } as any } as any } as any; - (service as any).setDynamicRequired(); + (service as any)._setDynamicRequired(); expect(service.isFieldRequiredDependingOnBranchId).toBeFalsy(); }); it('should set the required values true if the brnach id is the not right', () => { service.noBranchId = '456'; service.currentFormState = { controls: { branchId: { value: '123' } as any } as any } as any; - (service as any).setDynamicRequired(); + (service as any)._setDynamicRequired(); expect(service.isFieldRequiredDependingOnBranchId).toBeTruthy(); }); @@ -551,7 +546,7 @@ const branches: FailureBranch[] = [branch]; service.gridFailureBranches$ = of(branches); service.noBranchId = '123'; - (service as any).setNoBranchId(); + (service as any)._setNoBranchId(); expect(service.noBranchId).toBe('123'); }); @@ -563,7 +558,7 @@ const branches: FailureBranch[] = [branch]; service.gridFailureBranches$ = of(branches); service.noBranchId = '123'; - (service as any).setNoBranchId(); + (service as any)._setNoBranchId(); expect(service.noBranchId).toBe(null); }); @@ -573,11 +568,9 @@ gfdetail.responsibility = 'test'; gfdetail.stationId = 'test'; - service.currentFormState = { - ...service.currentFormState, - isValid: true, - value: gfdetail, - }; + service.currentFormState = INITIAL_STATE; + (service.currentFormState as any).isValid = true; + (service.currentFormState as any).value = gfdetail; service.resetFailureLocationValues(); expect(dispatchSpy).toHaveBeenCalled();
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.ts index f4aedc4..7787401 100644 --- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.ts +++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.ts
@@ -1,3 +1,4 @@ +import { NgrxValueConverters } from 'ngrx-forms'; /******************************************************************************** * Copyright (c) 2020 Contributors to the Eclipse Foundation * @@ -10,67 +11,73 @@ * * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -import { loadAddressCommunities } from '@grid-failure-information-app/shared/store/actions/grid-failures.action'; import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { SafetyQueryDialogComponent } from '@grid-failure-information-app/shared/components/dialogs/safety-query-dialog/safety-query-dialog.component'; -import { InternExternEnum, PressureLevelEnum, PublicationStatusEnum, StateEnum, VoltageLevelEnum } from '@grid-failure-information-app/shared/constants/enums'; +import * as enums from '@grid-failure-information-app/shared/constants/enums'; import { Globals } from '@grid-failure-information-app/shared/constants/globals'; -import { - FailureAddress, - FailureBranch, - FailureClassification, - FailureCoords, - FailureExpectedReason, - FailureHousenumber, - FailureRadius, - FailureState, - FailureStation, - FailureType, - GridFailure, -} from '@grid-failure-information-app/shared/models'; +import * as models from '@grid-failure-information-app/shared/models'; import { BaseFormSandbox } from '@grid-failure-information-app/shared/sandbox/base-form.sandbox'; import * as store from '@grid-failure-information-app/shared/store'; import * as gridFailureActions from '@grid-failure-information-app/shared/store/actions/grid-failures.action'; -import * as fromGridFailuresDetailFormReducer from '@grid-failure-information-app/shared/store/reducers/grid-failures/grid-failure-details-form.reducer'; -import * as gridFailuresDetailFormReducer from '@grid-failure-information-app/shared/store/reducers/grid-failures/grid-failure-details-form.reducer'; -import { navigateHome, stationToStationNameConverter as stationToStationDescriptionConverter } from '@grid-failure-information-app/shared/utility'; +import { navigateHome, stationToStationDescriptionConverter, getAddressRelevantBranch } from '@grid-failure-information-app/shared/utility'; import { unboxProperties } from '@grid-failure-information-app/shared/utility/form-utils'; import { UtilService } from '@grid-failure-information-app/shared/utility/utility.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { ofType } from '@ngrx/effects'; import { ActionsSubject, Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; -import { debounceTime, distinctUntilChanged, map, take, takeUntil } from 'rxjs/operators'; -import { FORM_ID, NO_BRANCH_ID_KEY } from '@grid-failure-information-app/shared/store/reducers/grid-failures/grid-failure-details-form.reducer'; +import { Observable, combineLatest } from 'rxjs'; +import { debounceTime, distinctUntilChanged, map, take, takeUntil, skipWhile } from 'rxjs/operators'; +import { + FORM_ID, + NO_BRANCH_ID_KEY, + INITIAL_STATE, + DEPENDENT_FIELD_KEY, +} from '@grid-failure-information-app/shared/store/reducers/grid-failures/grid-failure-details-form.reducer'; import { FormGroupState, NgrxValueConverter, SetValueAction, ResetAction, EnableAction, SetUserDefinedPropertyAction, DisableAction } from 'ngrx-forms'; @Injectable() -export class GridFailureDetailsSandbox extends BaseFormSandbox<GridFailure> { +export class GridFailureDetailsSandbox extends BaseFormSandbox<models.GridFailure> { public Globals = Globals; - public StateEnum = StateEnum; - public gridFailureDetailsFormState$: Observable<FormGroupState<GridFailure>> = this.appState$.select(store.getGridFailuresDetails); - public currentFormState: FormGroupState<GridFailure>; - public gridFailureClassifications$: Observable<FailureClassification[]> = this.appState$.select(store.getGridFailureClassificationsData); - public gridFailureTypes$: Observable<FailureType[]> = this.appState$.select(store.getGridFailureTypesData); - public gridFailureBranches$: Observable<FailureBranch[]> = this.appState$.select(store.getGridFailureBranchesData); + public StateEnum = enums.StateEnum; + public gridFailureDetailsFormState$: Observable<FormGroupState<models.GridFailure>> = this.appState$.select(store.getGridFailuresDetails); + public currentFormState: FormGroupState<models.GridFailure>; + public gridFailureClassifications$: Observable<models.FailureClassification[]> = this.appState$.select(store.getGridFailureClassificationsData); + public gridFailureTypes$: Observable<models.FailureType[]> = this.appState$.select(store.getGridFailureTypesData); + public gridFailureBranches$: Observable<models.FailureBranch[]> = this.appState$.select(store.getGridFailureBranchesData); public gridFailureActions = gridFailureActions; - public gridFailureInternalStates$: Observable<FailureState[]> = this.appState$ + public gridFailureInternalStates$: Observable<models.FailureState[]> = this.appState$ .select(store.getGridFailureStatesData) .pipe(map(states => states.filter(item => item.internal))); - public gridFailureExternalStates$: Observable<FailureState[]> = this.appState$ + public gridFailureExternalStates$: Observable<models.FailureState[]> = this.appState$ .select(store.getGridFailureStatesData) .pipe(map(states => states.filter(item => item.external))); - public gridFailureRadii$: Observable<FailureRadius[]> = this.appState$.select(store.getGridFailureRadiiData); - public gridFailureExpectedReasons$: Observable<FailureExpectedReason[]> = this.appState$.select(store.getGridFailureExpectedReasonsData); - public voltageLevelEnum = VoltageLevelEnum; - public pressureLevelEnum = PressureLevelEnum; - public publicationStatusEnum = PublicationStatusEnum; - public internExternEnum = InternExternEnum; + public gridFailureRadii$: Observable<models.FailureRadius[]> = this.appState$.select(store.getGridFailureRadiiData); + public datePickerResetEnum = enums.DatePickerResetEnum; + public voltageLevelEnum = enums.VoltageLevelEnum; + public gridFailureExpectedReasons$: Observable<models.FailureExpectedReason[]> = this.appState$.select(store.getGridFailureExpectedReasonsData); + public pressureLevelEnum = enums.PressureLevelEnum; + public publicationStatusEnum = enums.PublicationStatusEnum; + public internExternEnum = enums.InternExternEnum; public maxVersionNumber: number; - public currentGridFailureDetailsCoords: FailureCoords = new FailureCoords(); + public currentGridFailureDetailsCoords: models.FailureCoords = new models.FailureCoords(); public noBranchId: string; public isFieldRequiredDependingOnBranchId: boolean = false; + public isPowerBranchSelected$: Observable<boolean> = combineLatest( + this.appState$.select(store.getGridFailuresDetails), + this.appState$.select(store.getGridFailureBranchesData) + ).pipe( + map(([gfd, branches]) => { + if (!branches) { + return; + } + const powerBranch = branches.find(branch => branch.name === Globals.BUSINESS_RULE_FIELDS.branchStrom.key); + const powerBranchId = gfd.controls.branchId.value; + + return !!powerBranch && powerBranchId === powerBranch.id; + }), + takeUntil(this._endSubscriptions$) + ); public addressCommunities$: Observable<Array<string>> = this.actionsSubject.pipe( ofType(gridFailureActions.loadAddressCommunitiesSuccess), @@ -94,13 +101,13 @@ takeUntil(this._endSubscriptions$) ); - public addressHouseNumbers: Array<FailureHousenumber>; + public addressHouseNumbers: Array<models.FailureHousenumber>; public showQualifyButton: boolean = false; public showStornoButton: boolean = false; public showCreatedButton: boolean = false; public showUpdateButton: boolean = false; - public gridFailureAddress: FailureAddress; - private _gridFailureStations: Array<FailureStation> = new Array<FailureStation>(); + public gridFailureAddress: models.FailureAddress; + private _gridFailureStations: Array<models.FailureStation> = new Array<models.FailureStation>(); private _gridFailureId: string; private _addressPostalcodes: Array<string> = []; @@ -126,7 +133,7 @@ this._addressPostalcodes = items; }); - this.setNoBranchId(); + this._setNoBranchId(); } public loadGridFailure(gridFailureId: string): void { @@ -152,9 +159,26 @@ public loadGridFailureRadii(): void { this.appState$.dispatch(gridFailureActions.loadGridFailureRadii()); } + public dateValueConverter = NgrxValueConverters.objectToJSON; + private _registerLoadGridFailureExpectedReasons(): void { + combineLatest(this.gridFailureBranches$, this.gridFailureDetailsFormState$) + .pipe(skipWhile(([branches, formState]) => !this.currentFormState || branches.length === 0)) + .subscribe(([branches, formState]) => { + let currentBranch = branches.find(branch => !!formState && branch.id === formState.value.branchId); + this.currentFormState.value.branchId !== formState.value.branchId && + !!currentBranch && + this.appState$.dispatch(gridFailureActions.loadGridFailureExpectedReasons({ payload: currentBranch.name })); + }); - public loadGridFailureExpectedReasons(): void { - this.appState$.dispatch(gridFailureActions.loadGridFailureExpectedReasons()); + combineLatest(this.gridFailureBranches$, this.gridFailureDetailsFormState$) + .pipe( + skipWhile(([branches, formState]) => !formState || branches.length === 0), + take(1) + ) + .subscribe(([branches, formState]) => { + let currentBranch = branches.find(branch => branch.id === formState.value.branchId); + !!currentBranch && this.appState$.dispatch(gridFailureActions.loadGridFailureExpectedReasons({ payload: currentBranch.name })); + }); } public loadGridFailureStations(): void { @@ -169,9 +193,9 @@ public loadGridFailureVersion(versionNumber: number): void { this.appState$.dispatch(gridFailureActions.loadGridFailureVersion({ gridFailureId: this._gridFailureId, versionNumber: versionNumber })); if (versionNumber < this.maxVersionNumber) { - this.appState$.dispatch(new DisableAction(fromGridFailuresDetailFormReducer.FORM_ID)); + this.appState$.dispatch(new DisableAction(FORM_ID)); } else { - this.appState$.dispatch(new EnableAction(fromGridFailuresDetailFormReducer.FORM_ID)); + this.appState$.dispatch(new EnableAction(FORM_ID)); } } @@ -184,7 +208,7 @@ ) .subscribe(states => { if (states && states.length > 0) { - this.appState$.dispatch(new SetValueAction(gridFailuresDetailFormReducer.INITIAL_STATE.controls.statusInternId.id, states[0].id)); + this.appState$.dispatch(new SetValueAction(INITIAL_STATE.controls.statusInternId.id, states[0].id)); this.saveGridFailure(); } }); @@ -208,7 +232,7 @@ public saveGridFailure(): void { if (this.currentFormState.isValid) { - const gridFailure = unboxProperties(this.currentFormState.value) as GridFailure; + const gridFailure = unboxProperties(this.currentFormState.value) as models.GridFailure; this.appState$.dispatch( gridFailureActions.saveGridFailure({ @@ -245,7 +269,7 @@ takeUntil(this._endSubscriptions$) ); if (this.addressHouseNumbers.length > 0) { - const failureHousenumber: FailureHousenumber = this.addressHouseNumbers.find((housenumber: FailureHousenumber) => { + const failureHousenumber: models.FailureHousenumber = this.addressHouseNumbers.find((housenumber: models.FailureHousenumber) => { return housenumber.housenumber === hsnr; }); if (!!failureHousenumber) { @@ -254,7 +278,7 @@ return; } test$.pipe(take(1)).subscribe(addresses => { - const failureHousenumber: FailureHousenumber = addresses.find((housenumber: FailureHousenumber) => { + const failureHousenumber: models.FailureHousenumber = addresses.find((housenumber: models.FailureHousenumber) => { return housenumber.housenumber === hsnr; }); if (!!failureHousenumber) { @@ -262,7 +286,9 @@ } }); } + public registerEvents(): void { + this._registerLoadGridFailureExpectedReasons(); this.actionsSubject .pipe( ofType(gridFailureActions.loadAddressHouseNumbersSuccess), @@ -271,56 +297,63 @@ ) .subscribe(hnr => (this.addressHouseNumbers = hnr)); - this.gridFailureDetailsFormState$.pipe(takeUntil(this._endSubscriptions$)).subscribe((formState: FormGroupState<GridFailure>) => { + this.gridFailureDetailsFormState$.pipe(takeUntil(this._endSubscriptions$)).subscribe((formState: FormGroupState<models.GridFailure>) => { + if (!formState.value || !formState.controls) return; + this.currentFormState = formState; this._showButtonsByState(formState.value.statusIntern); - this.setDynamicRequired(); + this._setDynamicRequired(); - if (!formState.value || !formState.controls) return; - switch (formState.userDefinedProperties[fromGridFailuresDetailFormReducer.DEPENDENT_FIELD_KEY]) { - case formState.id: - this._loadInitialDependentFieldValues(formState); - break; + const addressRelevantBranch = getAddressRelevantBranch(formState.value.branch); + if (!!formState.value.branchId) + switch (formState.userDefinedProperties[DEPENDENT_FIELD_KEY]) { + case formState.controls.__formBranch.id: + case formState.id: + this.loadInitialAddressData(formState); + break; - case formState.controls.postcode.id: - this.appState$.dispatch(gridFailureActions.loadAddressCommunities({ payload: formState.value.postcode })); - break; + case formState.controls.postcode.id: + this.appState$.dispatch(gridFailureActions.loadAddressCommunities({ branch: addressRelevantBranch, postcode: formState.value.postcode })); + break; - case formState.controls.city.id: - this.appState$.dispatch( - gridFailureActions.loadAddressDistricts({ - postcode: formState.value.postcode, - community: formState.value.city, - }) - ); - break; + case formState.controls.city.id: + this.appState$.dispatch( + gridFailureActions.loadAddressDistricts({ + branch: addressRelevantBranch, + postcode: formState.value.postcode, + community: formState.value.city, + }) + ); + break; - case formState.controls.district.id: - this.appState$.dispatch( - gridFailureActions.loadAddressStreets({ - postcode: formState.value.postcode, - community: formState.value.city, - district: formState.value.district, - }) - ); - break; + case formState.controls.district.id: + this.appState$.dispatch( + gridFailureActions.loadAddressStreets({ + branch: addressRelevantBranch, + postcode: formState.value.postcode, + community: formState.value.city, + district: formState.value.district, + }) + ); + break; - case formState.controls.street.id: - this.appState$.dispatch( - gridFailureActions.loadAddressHouseNumbers({ - postcode: formState.value.postcode, - community: formState.value.city, - street: formState.value.street, - }) - ); - break; - case formState.controls.housenumber.id: - this.setLatLong(formState.controls.housenumber.value); - break; + case formState.controls.street.id: + this.appState$.dispatch( + gridFailureActions.loadAddressHouseNumbers({ + branch: addressRelevantBranch, + postcode: formState.value.postcode, + community: formState.value.city, + street: formState.value.street, + }) + ); + break; + case formState.controls.housenumber.id: + this.setLatLong(formState.controls.housenumber.value); + break; - default: - break; - } + default: + break; + } }); this.actionsSubject @@ -328,7 +361,7 @@ ofType(gridFailureActions.loadGridFailureVersionsSuccess), takeUntil(this._endSubscriptions$), map(action => { - const gridFailures: GridFailure[] = action['payload']; + const gridFailures: models.GridFailure[] = action['payload']; return !!gridFailures && Math.max(...gridFailures.map(o => o.versionNumber)); }) ) @@ -340,7 +373,7 @@ map(action => action.payload), takeUntil(this._endSubscriptions$) ) - .subscribe((stations: Array<FailureStation>) => { + .subscribe((stations: Array<models.FailureStation>) => { this._gridFailureStations = stations; }); @@ -350,7 +383,7 @@ map(action => action.payload), takeUntil(this._endSubscriptions$) ) - .subscribe((address: FailureAddress) => { + .subscribe((address: models.FailureAddress) => { this.gridFailureAddress = address; const event = { longitude: address.longitude, latitude: address.latitude }; this.latLonMapping(event); @@ -361,7 +394,7 @@ this.currentGridFailureDetailsCoords.latitude !== gridFailureDetails.value.latitude || this.currentGridFailureDetailsCoords.longitude !== gridFailureDetails.value.longitude ) { - this.currentGridFailureDetailsCoords = new FailureCoords(gridFailureDetails.value); + this.currentGridFailureDetailsCoords = new models.FailureCoords(gridFailureDetails.value); } }); } @@ -373,8 +406,8 @@ map(term => (term.length < 2 ? [] : this._gridFailureStations.filter(s => s.failureStationSearchString.toLowerCase().indexOf(term.toLowerCase()) > -1))) ); - public formatter = (s: FailureStation | string) => { - if (s instanceof FailureStation) return s.failureStationSearchString; + public formatter = (s: models.FailureStation | string) => { + if (s instanceof models.FailureStation) return s.failureStationSearchString; else return s; }; @@ -449,15 +482,15 @@ public disableUnnecessaryRequiredProperties(part: string): void { switch (part) { case Globals.FAILURE_LOCATION_NS: - this.appState$.dispatch(new EnableAction(fromGridFailuresDetailFormReducer.INITIAL_STATE.controls.postcode.id)); - this.appState$.dispatch(new DisableAction(fromGridFailuresDetailFormReducer.INITIAL_STATE.controls.radiusId.id)); + this.appState$.dispatch(new EnableAction(INITIAL_STATE.controls.postcode.id)); + this.appState$.dispatch(new DisableAction(INITIAL_STATE.controls.radiusId.id)); break; case Globals.FAILURE_LOCATION_MS: this._disableAddressControls(); - this.appState$.dispatch(new EnableAction(fromGridFailuresDetailFormReducer.INITIAL_STATE.controls.radiusId.id)); + this.appState$.dispatch(new EnableAction(INITIAL_STATE.controls.radiusId.id)); break; case Globals.FAILURE_LOCATION_MAP: - this.appState$.dispatch(new DisableAction(fromGridFailuresDetailFormReducer.INITIAL_STATE.controls.radiusId.id)); + this.appState$.dispatch(new DisableAction(INITIAL_STATE.controls.radiusId.id)); this._disableAddressControls(); break; default: @@ -466,24 +499,27 @@ } private _disableAddressControls(): void { - this.appState$.dispatch(new DisableAction(fromGridFailuresDetailFormReducer.INITIAL_STATE.controls.postcode.id)); - this.appState$.dispatch(new DisableAction(fromGridFailuresDetailFormReducer.INITIAL_STATE.controls.city.id)); - this.appState$.dispatch(new DisableAction(fromGridFailuresDetailFormReducer.INITIAL_STATE.controls.district.id)); - this.appState$.dispatch(new DisableAction(fromGridFailuresDetailFormReducer.INITIAL_STATE.controls.street.id)); - this.appState$.dispatch(new DisableAction(fromGridFailuresDetailFormReducer.INITIAL_STATE.controls.housenumber.id)); + this.appState$.dispatch(new DisableAction(INITIAL_STATE.controls.postcode.id)); + this.appState$.dispatch(new DisableAction(INITIAL_STATE.controls.city.id)); + this.appState$.dispatch(new DisableAction(INITIAL_STATE.controls.district.id)); + this.appState$.dispatch(new DisableAction(INITIAL_STATE.controls.street.id)); + this.appState$.dispatch(new DisableAction(INITIAL_STATE.controls.housenumber.id)); } - private _loadInitialDependentFieldValues(formState: FormGroupState<GridFailure>) { + public loadInitialAddressData(formState: FormGroupState<models.GridFailure>) { if (!formState.value || !formState.controls) return; - this.appState$.dispatch(gridFailureActions.loadAddressCommunities({ payload: formState.value.postcode })); + const addressRelevantBranch = getAddressRelevantBranch(formState.value.branch); + this.appState$.dispatch(gridFailureActions.loadAddressCommunities({ branch: addressRelevantBranch, postcode: formState.value.postcode })); this.appState$.dispatch( gridFailureActions.loadAddressDistricts({ + branch: addressRelevantBranch, postcode: formState.value.postcode, community: formState.value.city, }) ); this.appState$.dispatch( gridFailureActions.loadAddressStreets({ + branch: addressRelevantBranch, postcode: formState.value.postcode, community: formState.value.city, district: formState.value.district, @@ -491,6 +527,7 @@ ); this.appState$.dispatch( gridFailureActions.loadAddressHouseNumbers({ + branch: addressRelevantBranch, postcode: formState.value.postcode, community: formState.value.city, street: formState.value.street, @@ -502,10 +539,10 @@ this.appState$.dispatch(gridFailureActions.loadAddressPostalcodes()); } - private setNoBranchId(): void { - this.gridFailureBranches$.subscribe((branches: FailureBranch[]) => { + private _setNoBranchId(): void { + this.gridFailureBranches$.subscribe((branches: models.FailureBranch[]) => { if (branches.length > 0) { - const noBranch: FailureBranch = branches.find(branch => branch.name === Globals.NO_BRANCH_NAME); + const noBranch: models.FailureBranch = branches.find(branch => branch.name === Globals.NO_BRANCH_NAME); this.noBranchId = !!noBranch ? noBranch.id : null; this.appState$.dispatch(new SetUserDefinedPropertyAction(FORM_ID, NO_BRANCH_ID_KEY, this.noBranchId)); } @@ -513,15 +550,15 @@ } private _clear(): void { - this.appState$.dispatch(new SetValueAction(fromGridFailuresDetailFormReducer.FORM_ID, fromGridFailuresDetailFormReducer.INITIAL_STATE.value)); - this.appState$.dispatch(new ResetAction(fromGridFailuresDetailFormReducer.FORM_ID)); - this.appState$.dispatch(new EnableAction(fromGridFailuresDetailFormReducer.FORM_ID)); + this.appState$.dispatch(new SetValueAction(FORM_ID, INITIAL_STATE.value)); + this.appState$.dispatch(new ResetAction(FORM_ID)); + this.appState$.dispatch(new EnableAction(FORM_ID)); this._gridFailureId = null; this.maxVersionNumber = null; navigateHome(this._router); } - private setDynamicRequired(): void { + private _setDynamicRequired(): void { this.isFieldRequiredDependingOnBranchId = !!this.currentFormState.controls && !!this.currentFormState.controls.branchId ? this.currentFormState.controls.branchId.value !== this.noBranchId : null; } @@ -533,16 +570,16 @@ this.showUpdateButton = false; switch (state) { - case StateEnum.NEW: - case StateEnum.PLANNED: + case enums.StateEnum.NEW: + case enums.StateEnum.PLANNED: this.showCreatedButton = true; break; - case StateEnum.CREATED: - case StateEnum.UPDATED: + case enums.StateEnum.CREATED: + case enums.StateEnum.UPDATED: this.showQualifyButton = true; this.showStornoButton = true; break; - case StateEnum.QUALIFIED: + case enums.StateEnum.QUALIFIED: this.showUpdateButton = true; break; default:
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.ts index b4275a9..8d3a98a 100644 --- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.ts +++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.ts
@@ -78,7 +78,7 @@ } setTimeout(() => { this._gridApi.setFilterModel(this.sandbox.filterOptions); - }, 1000); + }, 1500); } public changeFilter(checked: boolean, userRole: string): void {
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure.resolver.spec.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure.resolver.spec.ts index 4986ad2..7057ecd 100644 --- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure.resolver.spec.ts +++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure.resolver.spec.ts
@@ -30,7 +30,6 @@ loadGridFailureTypes() {}, loadGridFailureStates() {}, loadGridFailureRadii() {}, - loadGridFailureExpectedReasons() {}, loadGridFailureStations() {}, loadAddressPostalcodes() {}, } as any;
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure.resolver.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure.resolver.ts index 789fc53..87c3820 100644 --- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure.resolver.ts +++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure.resolver.ts
@@ -35,7 +35,6 @@ this._detailSandbox.loadGridFailureTypes(); this._detailSandbox.loadGridFailureStates(); this._detailSandbox.loadGridFailureRadii(); - this._detailSandbox.loadGridFailureExpectedReasons(); this._detailSandbox.loadGridFailureStations(); this._detailSandbox.loadAddressPostalcodes(); }
diff --git a/projects/grid-failure-information-app/src/app/shared/constants/globals.ts b/projects/grid-failure-information-app/src/app/shared/constants/globals.ts index 85bfb6d..df2e451 100644 --- a/projects/grid-failure-information-app/src/app/shared/constants/globals.ts +++ b/projects/grid-failure-information-app/src/app/shared/constants/globals.ts
@@ -32,6 +32,9 @@ andCondition: 'und', orCondition: 'oder', }; + public static PROPERTIES_TO_BOX: string[] = ['addressPolygonPoints', '__formBranch']; - public static PROPERTIES_TO_BOX: string[] = ['addressPolygonPoints']; + public static BUSINESS_RULE_FIELDS: any = { + branchStrom: { key: 'S' }, + }; }
diff --git a/projects/grid-failure-information-app/src/app/shared/directives/directives.module.ts b/projects/grid-failure-information-app/src/app/shared/directives/directives.module.ts index d496cd0..8a203b2 100644 --- a/projects/grid-failure-information-app/src/app/shared/directives/directives.module.ts +++ b/projects/grid-failure-information-app/src/app/shared/directives/directives.module.ts
@@ -19,8 +19,8 @@ import { AgGridAngular } from 'ag-grid-angular'; import { DateTimePickerViewAdapterDirective } from '@grid-failure-information-app/shared/directives/date-time-picker-view-adapter.directive'; import { FormDisableDirective } from '@grid-failure-information-app/shared/directives/form-disable.directive'; -import { FormValidatorDirective } from './form-validator.directive'; - +import { FormValidatorDirective } from '@grid-failure-information-app/shared/directives/form-validator.directive'; +import { FormControlVisibilityDirective } from '@grid-failure-information-app/shared/directives/forms/form-control-ui-state.directive'; @NgModule({ imports: [CommonModule], declarations: [ @@ -31,6 +31,7 @@ FormDisableDirective, DateTimePickerViewAdapterDirective, FormValidatorDirective, + FormControlVisibilityDirective, ], exports: [ AutoResizeColumnsDirective, @@ -40,6 +41,7 @@ FormDisableDirective, DateTimePickerViewAdapterDirective, FormValidatorDirective, + FormControlVisibilityDirective, ], entryComponents: [AgGridAngular],
diff --git a/projects/grid-failure-information-app/src/app/shared/directives/forms/form-control-ui-state.directive.spec.ts b/projects/grid-failure-information-app/src/app/shared/directives/forms/form-control-ui-state.directive.spec.ts new file mode 100644 index 0000000..c4af3ca --- /dev/null +++ b/projects/grid-failure-information-app/src/app/shared/directives/forms/form-control-ui-state.directive.spec.ts
@@ -0,0 +1,8 @@ +import { FormControlVisibilityDirective } from './form-control-ui-state.directive'; + +describe('FormControlUiStateDirective', () => { + it('should create an instance', () => { + // const directive = new FormControlUiStateDirective(); + // expect(directive).toBeTruthy(); + }); +});
diff --git a/projects/grid-failure-information-app/src/app/shared/directives/forms/form-control-ui-state.directive.ts b/projects/grid-failure-information-app/src/app/shared/directives/forms/form-control-ui-state.directive.ts new file mode 100644 index 0000000..c95210a --- /dev/null +++ b/projects/grid-failure-information-app/src/app/shared/directives/forms/form-control-ui-state.directive.ts
@@ -0,0 +1,30 @@ +import { Directive, Input, HostBinding, ContentChild } from '@angular/core'; +import * as store from '@grid-failure-information-app/shared/store'; +import { Store } from '@ngrx/store'; +import { DisableAction, EnableAction, ResetAction, SetValueAction, NgrxFormControlDirective } from 'ngrx-forms'; + +@Directive({ + selector: '[visibleByDependentField]', +}) +export class FormControlVisibilityDirective { + private _isVisible: boolean; + @Input() + set visibleByDependentField(isVisible: boolean) { + this._isVisible = isVisible; + if (!this.ngrxFormControl) { + return; + } else if (isVisible) { + this._appState$.dispatch(new EnableAction(this.ngrxFormControl.state.id)); + } else { + this._appState$.dispatch(new SetValueAction(this.ngrxFormControl.state.id, '')); + this._appState$.dispatch(new DisableAction(this.ngrxFormControl.state.id)); + this._appState$.dispatch(new ResetAction(this.ngrxFormControl.state.id)); + } + } + @HostBinding('hidden') get valid() { + return !this._isVisible; + } + @ContentChild(NgrxFormControlDirective, { static: false }) + public ngrxFormControl: NgrxFormControlDirective<any>; + constructor(private _appState$: Store<store.State>) {} +}
diff --git a/projects/grid-failure-information-app/src/app/shared/models/grid-failure.model.ts b/projects/grid-failure-information-app/src/app/shared/models/grid-failure.model.ts index 2980fba..9eb6ad2 100644 --- a/projects/grid-failure-information-app/src/app/shared/models/grid-failure.model.ts +++ b/projects/grid-failure-information-app/src/app/shared/models/grid-failure.model.ts
@@ -1,3 +1,4 @@ +import { FailureBranch } from './failure-branch.model'; /******************************************************************************** * Copyright (c) 2020 Contributors to the Eclipse Foundation * @@ -12,13 +13,16 @@ ********************************************************************************/ import { Boxed, box } from 'ngrx-forms'; import { Globals } from '@grid-failure-information-app/shared/constants/globals'; - -export class GridFailure { +export class GridFailureForm { + public __formBranch: FailureBranch = {} as any; + public constructor() {} +} +export class GridFailure extends GridFailureForm { public id: string = null; public branch: string = null; public branchColorCode: string = null; public branchDescription: string = null; - public branchId: string = null; + public branchId: any = null; public condensed: boolean = null; public condensedCount: number = null; public city: string = null; @@ -63,6 +67,7 @@ public description: string = null; public constructor(data: any = null) { + super(); Object.keys(data || {}) .filter(property => this.hasOwnProperty(property)) .forEach(property => {
diff --git a/projects/grid-failure-information-app/src/app/shared/store/actions/grid-failures.action.ts b/projects/grid-failure-information-app/src/app/shared/store/actions/grid-failures.action.ts index d6ff99a..5946d68 100644 --- a/projects/grid-failure-information-app/src/app/shared/store/actions/grid-failures.action.ts +++ b/projects/grid-failure-information-app/src/app/shared/store/actions/grid-failures.action.ts
@@ -78,7 +78,9 @@ export const loadGridFailureRadiiSuccess = createAction('[GridFailureRadii] Load Success', props<{ payload: Array<FailureRadius> }>()); export const loadGridFailureRadiiFail = createAction('[GridFailureRadii] Load Fail', props<{ payload: string }>()); -export const loadGridFailureExpectedReasons = createAction('[GridFailureFailureExpectedReasons] Load'); +export const loadGridFailureExpectedReasons = createAction('[GridFailureFailureExpectedReasons] Load', (item = { payload: null }) => { + return item; +}); export const loadGridFailureExpectedReasonsSuccess = createAction( '[GridFailureFailureExpectedReasons] Load Success', props<{ payload: Array<FailureExpectedReason> }>() @@ -105,19 +107,22 @@ export const loadAddressPostalcodesSuccess = createAction('[AddressPostalcodes] Load Success', props<{ payload: Array<string> }>()); export const loadAddressPostalcodesFail = createAction('[AddressPostalcodes] Load Fail', props<{ payload: string }>()); -export const loadAddressCommunities = createAction('[AddressCommunities] Load', props<{ payload: string }>()); +export const loadAddressCommunities = createAction('[AddressCommunities] Load', props<{ branch: string; postcode: string }>()); export const loadAddressCommunitiesSuccess = createAction('[AddressCommunities] Load Success', props<{ payload: Array<string> }>()); export const loadAddressCommunitiesFail = createAction('[AddressCommunities] Load Fail', props<{ payload: string }>()); -export const loadAddressDistricts = createAction('[AddressDistricts] Load', props<{ postcode: string; community: string }>()); +export const loadAddressDistricts = createAction('[AddressDistricts] Load', props<{ branch: string; postcode: string; community: string }>()); export const loadAddressDistrictsSuccess = createAction('[AddressDistricts] Load Success', props<{ payload: Array<string> }>()); export const loadAddressDistrictsFail = createAction('[AddressDistricts] Load Fail', props<{ payload: string }>()); -export const loadAddressStreets = createAction('[AddressStreets] Load', props<{ postcode: string; community: string; district?: string }>()); +export const loadAddressStreets = createAction('[AddressStreets] Load', props<{ branch: string; postcode: string; community: string; district?: string }>()); export const loadAddressStreetsSuccess = createAction('[AddressStreets] Load Success', props<{ payload: Array<string> }>()); export const loadAddressStreetsFail = createAction('[AddressStreets] Load Fail', props<{ payload: string }>()); -export const loadAddressHouseNumbers = createAction('[AddressHouseNumbers] Load', props<{ postcode: string; community: string; street: string }>()); +export const loadAddressHouseNumbers = createAction( + '[AddressHouseNumbers] Load', + props<{ branch: string; postcode: string; community: string; street: string }>() +); export const loadAddressHouseNumbersSuccess = createAction('[AddressHouseNumbers] Load Success', props<{ payload: Array<FailureHousenumber> }>()); export const loadAddressHouseNumbersFail = createAction('[AddressHouseNumbers] Load Fail', props<{ payload: string }>());
diff --git a/projects/grid-failure-information-app/src/app/shared/store/effects/grid-failures.effect.spec.ts b/projects/grid-failure-information-app/src/app/shared/store/effects/grid-failures.effect.spec.ts index d113573..a6f2ad9 100644 --- a/projects/grid-failure-information-app/src/app/shared/store/effects/grid-failures.effect.spec.ts +++ b/projects/grid-failure-information-app/src/app/shared/store/effects/grid-failures.effect.spec.ts
@@ -385,7 +385,7 @@ expect(result).toEqual(gridFailureActions.loadAddressCommunitiesSuccess({ payload: apiResponse })); }); done(); - actions$.next(gridFailureActions.loadAddressCommunities({ payload: 'X' })); + actions$.next(gridFailureActions.loadAddressCommunities({ branch: 'S', postcode: 'X' })); }); it('should return empty Array via getAddressCommunities if postcode is empty', done => { @@ -395,7 +395,7 @@ expect(result).toEqual(gridFailureActions.loadAddressCommunitiesSuccess({ payload: apiResponse })); }); done(); - actions$.next(gridFailureActions.loadAddressCommunities({ payload: '' })); + actions$.next(gridFailureActions.loadAddressCommunities({ branch: 'S', postcode: '' })); }); it('should equal loadAddressCommunities Fail after getAddressCommunities Error', done => { @@ -404,7 +404,7 @@ expect(result).toEqual(gridFailureActions.loadAddressCommunitiesFail({ payload: 'x' })); }); done(); - actions$.next(gridFailureActions.loadAddressCommunities({ payload: 'X' })); + actions$.next(gridFailureActions.loadAddressCommunities({ branch: 'S', postcode: 'X' })); }); it('should equal loadAddressDistricts after getAddressDistricts', done => { @@ -414,7 +414,7 @@ expect(result).toEqual(gridFailureActions.loadAddressDistrictsSuccess({ payload: apiResponse })); }); done(); - actions$.next(gridFailureActions.loadAddressDistricts({ postcode: '33333', community: 'C' })); + actions$.next(gridFailureActions.loadAddressDistricts({ postcode: '33333', branch: 'S', community: 'C' })); }); it('should return empty Array via getAddressDistricts if postcode is empty', done => { @@ -424,7 +424,7 @@ expect(result).toEqual(gridFailureActions.loadAddressDistrictsSuccess({ payload: apiResponse })); }); done(); - actions$.next(gridFailureActions.loadAddressDistricts({ postcode: '', community: 'C' })); + actions$.next(gridFailureActions.loadAddressDistricts({ postcode: '', branch: 'S', community: 'C' })); }); it('should equal loadAddressDistricts Fail after getAddressDistricts Error', done => { @@ -433,7 +433,7 @@ expect(result).toEqual(gridFailureActions.loadAddressDistrictsFail({ payload: 'x' })); }); done(); - actions$.next(gridFailureActions.loadAddressDistricts({ postcode: '33333', community: 'C' })); + actions$.next(gridFailureActions.loadAddressDistricts({ postcode: '33333', branch: 'S', community: 'C' })); }); it('should equal loadAddressStreets after getAddressStreets', done => { @@ -443,7 +443,7 @@ expect(result).toEqual(gridFailureActions.loadAddressStreetsSuccess({ payload: apiResponse })); }); done(); - actions$.next(gridFailureActions.loadAddressStreets({ postcode: '33333', community: 'C', district: 'D' })); + actions$.next(gridFailureActions.loadAddressStreets({ postcode: '33333', branch: 'S', community: 'C', district: 'D' })); }); it('should return empty Array via getAddressStreets if postcode is empty', done => { @@ -453,7 +453,7 @@ expect(result).toEqual(gridFailureActions.loadAddressStreetsSuccess({ payload: apiResponse })); }); done(); - actions$.next(gridFailureActions.loadAddressStreets({ postcode: '', community: 'C', district: 'D' })); + actions$.next(gridFailureActions.loadAddressStreets({ postcode: '', branch: 'S', community: 'C', district: 'D' })); }); it('should equal loadAddressStreets Fail after getAddressStreets Error', done => { @@ -462,7 +462,7 @@ expect(result).toEqual(gridFailureActions.loadAddressStreetsFail({ payload: 'x' })); }); done(); - actions$.next(gridFailureActions.loadAddressStreets({ postcode: '33333', community: 'C', district: 'D' })); + actions$.next(gridFailureActions.loadAddressStreets({ postcode: '33333', branch: 'S', community: 'C', district: 'D' })); }); it('should equal loadAddressHouseNumbers after getAddressHousenumbers', done => { @@ -472,7 +472,7 @@ expect(result).toEqual(gridFailureActions.loadAddressHouseNumbersSuccess({ payload: apiResponse })); }); done(); - actions$.next(gridFailureActions.loadAddressHouseNumbers({ postcode: '33333', community: 'C', street: 'S' })); + actions$.next(gridFailureActions.loadAddressHouseNumbers({ postcode: '33333', branch: 'S', community: 'C', street: 'S' })); }); it('should return empty Array via getAddressHousenumbers if postcode is empty', done => { @@ -482,7 +482,7 @@ expect(result).toEqual(gridFailureActions.loadAddressHouseNumbersSuccess({ payload: apiResponse })); }); done(); - actions$.next(gridFailureActions.loadAddressHouseNumbers({ postcode: '', community: 'C', street: 'S' })); + actions$.next(gridFailureActions.loadAddressHouseNumbers({ postcode: '', branch: 'S', community: 'C', street: 'S' })); }); it('should equal loadAddressHouseNumbers Fail after getAddressHousenumbers Error', done => { @@ -491,7 +491,7 @@ expect(result).toEqual(gridFailureActions.loadAddressHouseNumbersFail({ payload: 'x' })); }); done(); - actions$.next(gridFailureActions.loadAddressHouseNumbers({ postcode: '33333', community: 'C', street: 'S' })); + actions$.next(gridFailureActions.loadAddressHouseNumbers({ postcode: '33333', branch: 'S', community: 'C', street: 'S' })); }); it('should equal loadGridFailureVersion in response to getGridFailureAddress', done => {
diff --git a/projects/grid-failure-information-app/src/app/shared/store/effects/grid-failures.effect.ts b/projects/grid-failure-information-app/src/app/shared/store/effects/grid-failures.effect.ts index 01c8927..0705759 100644 --- a/projects/grid-failure-information-app/src/app/shared/store/effects/grid-failures.effect.ts +++ b/projects/grid-failure-information-app/src/app/shared/store/effects/grid-failures.effect.ts
@@ -164,7 +164,7 @@ ofType(gridFailureActions.loadGridFailureExpectedReasons), switchMap(action => { return this._apiClient - .getGridFailureExpectedReasons() + .getGridFailureExpectedReasons(action.payload) .map((response: FailureExpectedReason[]) => gridFailureActions.loadGridFailureExpectedReasonsSuccess({ payload: response })) .catch(error => of(gridFailureActions.loadGridFailureExpectedReasonsFail({ payload: error }))); }) @@ -242,11 +242,11 @@ this._actions$.pipe( ofType(gridFailureActions.loadAddressCommunities), switchMap(action => { - if (!action.payload) { + if (!action.postcode) { return of(gridFailureActions.loadAddressCommunitiesSuccess({ payload: [] })); } return this._apiClient - .getAddressCommunities(action.payload) + .getAddressCommunities(action.postcode, action.branch) .map((response: string[]) => gridFailureActions.loadAddressCommunitiesSuccess({ payload: response })) .catch(error => of(gridFailureActions.loadAddressCommunitiesFail({ payload: error }))); }) @@ -261,7 +261,7 @@ return of(gridFailureActions.loadAddressDistrictsSuccess({ payload: [] })); } return this._apiClient - .getAddressDistricts(action.postcode, action.community) + .getAddressDistricts(action.postcode, action.community, action.branch) .map((response: string[]) => gridFailureActions.loadAddressDistrictsSuccess({ payload: response })) .catch(error => of(gridFailureActions.loadAddressDistrictsFail({ payload: error }))); }) @@ -276,7 +276,7 @@ return of(gridFailureActions.loadAddressStreetsSuccess({ payload: [] })); } return this._apiClient - .getAddressStreets(action.postcode, action.community, action.district) + .getAddressStreets(action.postcode, action.community, action.district, action.branch) .map((response: string[]) => gridFailureActions.loadAddressStreetsSuccess({ payload: response })) .catch(error => of(gridFailureActions.loadAddressStreetsFail({ payload: error }))); }) @@ -291,7 +291,7 @@ return of(gridFailureActions.loadAddressHouseNumbersSuccess({ payload: [] })); } return this._apiClient - .getAddressHousenumbers(action.postcode, action.community, action.street) + .getAddressHousenumbers(action.postcode, action.community, action.street, action.branch) .map((response: FailureHousenumber[]) => gridFailureActions.loadAddressHouseNumbersSuccess({ payload: response })) .catch(error => of(gridFailureActions.loadAddressHouseNumbersFail({ payload: error }))); })
diff --git a/projects/grid-failure-information-app/src/app/shared/store/reducers/grid-failures/grid-failure-details-form.reducer.ts b/projects/grid-failure-information-app/src/app/shared/store/reducers/grid-failures/grid-failure-details-form.reducer.ts index 8683156..0e304d3 100644 --- a/projects/grid-failure-information-app/src/app/shared/store/reducers/grid-failures/grid-failure-details-form.reducer.ts +++ b/projects/grid-failure-information-app/src/app/shared/store/reducers/grid-failures/grid-failure-details-form.reducer.ts
@@ -1,3 +1,4 @@ +import { unbox } from 'ngrx-forms'; /******************************************************************************** * Copyright (c) 2020 Contributors to the Eclipse Foundation * @@ -27,6 +28,7 @@ SetValueAction, updateGroup, validate, + box, } from 'ngrx-forms'; import { required } from 'ngrx-forms/validation'; @@ -203,6 +205,10 @@ default: if (!!action && action.type === SetValueAction.TYPE) { var formState = setUserDefinedProperty(state, DEPENDENT_FIELD_KEY, action[DEPENDENT_FIELD_KEY]); + if (action['controlId'] === INITIAL_STATE.controls.__formBranch.id) { + const branch = unbox(action['value']); + return validateForm(formState, new SetValueAction(FORM_ID, { ...formState.value, branchId: branch.id, branch: branch.name })); + } return validateForm(formState, action); } else { return validateForm(state, action);
diff --git a/projects/grid-failure-information-app/src/app/shared/utility/utilityHelpers.ts b/projects/grid-failure-information-app/src/app/shared/utility/utilityHelpers.ts index e3661d9..f35df2f 100644 --- a/projects/grid-failure-information-app/src/app/shared/utility/utilityHelpers.ts +++ b/projects/grid-failure-information-app/src/app/shared/utility/utilityHelpers.ts
@@ -1,4 +1,3 @@ -import { DateTimeModel } from '@grid-failure-information-app/shared/models/date-time.model'; /******************************************************************************** * Copyright (c) 2020 Contributors to the Eclipse Foundation * @@ -14,7 +13,8 @@ import { Router } from '@angular/router'; import { InternExternKeysEnum, InternExternValuesEnum } from '@grid-failure-information-app/shared/constants/enums'; import { NgrxValueConverter, NgrxValueConverters } from 'ngrx-forms'; - +import { DateTimeModel } from '@grid-failure-information-app/shared/models/date-time.model'; +import { Globals } from '@grid-failure-information-app/shared/constants/globals'; /** * Returns formated date based on given culture * @@ -72,7 +72,7 @@ /** * Convert a station object to station description */ -export const stationToStationNameConverter: NgrxValueConverter<any | null, string | null> = { +export const stationToStationDescriptionConverter: NgrxValueConverter<any | null, string | null> = { convertViewToStateValue(value) { if (value === null) { return null; @@ -121,3 +121,8 @@ export function getDependencyPropertyFromControlId(controlId: string): string { return controlId.substring(controlId.indexOf('.') + 1, controlId.length); } + +export function getAddressRelevantBranch(branch: string): string { + const addressRelevantBranches: string[] = [Globals.BUSINESS_RULE_FIELDS.branchStrom.key]; + return addressRelevantBranches.find(b => b === branch); +}
diff --git a/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.scss b/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.scss index d23a74a..0c6a5b8 100644 --- a/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.scss +++ b/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.scss
@@ -21,6 +21,7 @@ .map-frame { border: 2px solid black; height: 100%; + transition: height 0.5s ease-in-out; } #map {
diff --git a/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.spec.ts b/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.spec.ts index bc5a606..cd4c563 100644 --- a/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.spec.ts +++ b/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.spec.ts
@@ -25,13 +25,13 @@ it('should create', () => { expect(component).toBeTruthy(); }); - it('should call _initMap() and _setMarker after calling ngAfterViewInit', async(() => { + it('should call _initMap() and _setMarker for overviewMap after calling ngAfterViewInit', async(() => { const latitude: any = 123; const longitude: any = 456; const radius: any = 100; const marker: any = {}; let spyMap: any = spyOn(L, 'map').and.returnValue({ remove() {}, on() {} }); - let spyTileLayer: any = spyOn(L, 'tileLayer').and.returnValue({ addTo() {} }); + let spyTileLayer: any = spyOn(L, 'tileLayer').and.returnValue({ addTo() {}, on() {} }); let spyMarker: any = spyOn(L, 'marker').and.returnValue({ addTo() { return { @@ -42,16 +42,43 @@ }, }); let spyCircle: any = spyOn(L, 'circle').and.returnValue({ addTo() {} }); + component.mapData = [{ latitude: latitude, longitude: longitude, radius: radius }]; component.mapData = [{ latitude: latitude, longitude: longitude, radius: radius }]; - component.mapDetailData = { latitude: latitude, longitude: longitude }; - component.mapDetailData = {}; + expect(spyMap).toHaveBeenCalled(); expect(spyTileLayer).toHaveBeenCalled(); expect(spyMarker).toHaveBeenCalledWith([latitude, longitude], { icon: (component as any)._icon }); expect(spyCircle).toHaveBeenCalledWith([latitude, longitude], { color: '#204d74', fillColor: '#337ab7', fillOpacity: 0.3, radius: radius }); })); + it('should call _initMap() and _setMarker for detailMap after calling ngAfterViewInit', async(() => { + const latitude: any = 123; + const longitude: any = 456; + const radius: any = 100; + const marker: any = {}; + let spyMap: any = spyOn(L, 'map').and.returnValue({ remove() {}, on() {} }); + let spyTileLayer: any = spyOn(L, 'tileLayer').and.returnValue({ addTo() {}, on() {} }); + let spyMarker: any = spyOn(L, 'marker').and.returnValue({ + addTo() { + return { + on: () => { + return { bindTooltip: () => {} }; + }, + }; + }, + }); + let spyCircle: any = spyOn(L, 'circle').and.returnValue({ addTo() {} }); + + component.mapDetailData = { latitude: latitude, longitude: longitude, radius: radius }; + component.mapDetailData = { latitude: latitude }; + component.mapDetailData = { latitude: latitude, longitude: longitude, radius: radius }; + + expect(spyMap).toHaveBeenCalled(); + expect(spyTileLayer).toHaveBeenCalled(); + expect(spyMarker).toHaveBeenCalledWith([latitude, longitude], { icon: (component as any)._icon }); + })); + it('should call _drawPolygonOrCircle(gridFailure)', async(() => { const latitude: any = 123; const longitude: any = 456;
diff --git a/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.ts b/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.ts index d517a85..fc12d58 100644 --- a/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.ts +++ b/projects/openk/grid-failure-information-map/src/lib/grid-failure-information-map.component.ts
@@ -10,11 +10,12 @@ * * SPDX-License-Identifier: EPL-2.0 ********************************************************************************/ -import { Component, AfterViewInit, Input, Output, EventEmitter } from '@angular/core'; +import { Component, Input, Output, EventEmitter } from '@angular/core'; import * as L from 'leaflet'; import { Globals } from '@openk-libs/grid-failure-information-map/constants/globals'; import { GridFailureMapInformation } from '@openk-libs/grid-failure-information-map/shared/models/grid-failure-coordinates.model'; import { convertISOToLocalDateTime } from '@openk-libs/grid-failure-information-map/shared/utility/utilityHelpers'; +import { MapOptions } from '@openk-libs/grid-failure-information-map/shared/models/map-options.model'; @Component({ selector: 'openk-grid-failure-information-map', @@ -25,9 +26,21 @@ private _mapData: Array<GridFailureMapInformation> = []; private _mapDetailData: GridFailureMapInformation; private _interactionMode: boolean; + private _mapOptions: MapOptions = new MapOptions(); @Output() public gridFailureId: EventEmitter<string> = new EventEmitter(); + @Output() latLong: EventEmitter<any> = new EventEmitter(); + + @Input() + set mapOptions(mapOptions: MapOptions) { + this._mapOptions = mapOptions; + + this._mapOptions.forceResize$.subscribe(() => { + this.mapDetailData = this._mapDetailData; + }); + } + @Input() public set mapData(data: Array<any>) { data.forEach(gridFailureData => { @@ -47,7 +60,7 @@ this._mapDetailData = new GridFailureMapInformation(gridFailureDetail); if (!!this._map) { this._map.remove(); - if (this._mapDetailData.latitude && this._mapDetailData.longitude) { + if (!!this._mapDetailData.latitude && !!this._mapDetailData.longitude) { this._initMap(this._mapDetailData.latitude, this._mapDetailData.longitude, Globals.DETAIL_MAP_INITIAL_ZOOM); } else { this._initMap(Globals.OVERVIEW_MAP_INITIAL_LATITUDE, Globals.OVERVIEW_MAP_INITIAL_LONGITUDE, Globals.OVERVIEW_MAP_INITIAL_ZOOM); @@ -63,8 +76,6 @@ this._interactionMode = interactionMode; } - @Output() latLong: EventEmitter<any> = new EventEmitter(); - private _map: any; private _icon = L.icon({ iconUrl: './marker-icon.png', @@ -84,6 +95,9 @@ attribution: Globals.TITLE_ATTRIBUTION, crossOrigin: null, }); + tiles.on('load', () => { + this._map.invalidateSize(); + }); tiles.addTo(this._map); this._map.on('click', this._emitLatLongValues.bind(this));
diff --git a/projects/openk/grid-failure-information-map/src/shared/models/map-options.model.ts b/projects/openk/grid-failure-information-map/src/shared/models/map-options.model.ts new file mode 100644 index 0000000..4d4d39e --- /dev/null +++ b/projects/openk/grid-failure-information-map/src/shared/models/map-options.model.ts
@@ -0,0 +1,16 @@ +/******************************************************************************** + * Copyright (c) 2020 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + ********************************************************************************/ +import { Subject } from 'rxjs'; +export class MapOptions { + public forceResize$: Subject<any> = new Subject<any>(); +}