From 7e965a270901bf4201fe7a8f2c0f2bd1f6dab4cd Mon Sep 17 00:00:00 2001 From: Sofie Hofmann <29145005+sofie29@users.noreply.github.com> Date: Mon, 25 Jan 2021 08:36:50 +0100 Subject: [PATCH] TSK-1503: Refactored copy function and saving mechanism --- .../administration/administration.module.ts | 2 - .../workbasket-access-items.component.spec.ts | 23 --- .../workbasket-access-items.component.ts | 55 +++---- .../workbasket-details.component.html | 6 +- .../workbasket-details.component.spec.ts | 68 ++++++--- .../workbasket-details.component.ts | 141 +++++------------- ...ket-distribution-targets.component.spec.ts | 19 ++- ...rkbasket-distribution-targets.component.ts | 55 ++++--- .../workbasket-information.component.spec.ts | 14 -- .../workbasket-information.component.ts | 34 +---- .../workbasket-list.component.ts | 9 +- .../workbasket-overview.component.spec.ts | 26 +++- .../services/saving-workbaskets.service.ts | 28 ---- .../workbasket-store/workbasket.selectors.ts | 20 +++ .../workbasket-store/workbasket.state.ts | 92 +++++++++--- 15 files changed, 265 insertions(+), 327 deletions(-) delete mode 100644 web/src/app/administration/services/saving-workbaskets.service.ts diff --git a/web/src/app/administration/administration.module.ts b/web/src/app/administration/administration.module.ts index 4b9af5858..93304ae4e 100644 --- a/web/src/app/administration/administration.module.ts +++ b/web/src/app/administration/administration.module.ts @@ -31,7 +31,6 @@ import { WorkbasketOverviewComponent } from './components/workbasket-overview/wo /** * Services */ -import { SavingWorkbasketService } from './services/saving-workbaskets.service'; import { ClassificationDefinitionService } from './services/classification-definition.service'; import { WorkbasketDefinitionService } from './services/workbasket-definition.service'; import { ImportExportService } from './services/import-export.service'; @@ -113,7 +112,6 @@ const DECLARATIONS = [ providers: [ ClassificationDefinitionService, WorkbasketDefinitionService, - SavingWorkbasketService, ClassificationCategoriesService, ImportExportService ], diff --git a/web/src/app/administration/components/workbasket-access-items/workbasket-access-items.component.spec.ts b/web/src/app/administration/components/workbasket-access-items/workbasket-access-items.component.spec.ts index f1d7b3c21..8d4c3a0ce 100644 --- a/web/src/app/administration/components/workbasket-access-items/workbasket-access-items.component.spec.ts +++ b/web/src/app/administration/components/workbasket-access-items/workbasket-access-items.component.spec.ts @@ -6,7 +6,6 @@ import { Observable, of } from 'rxjs'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { TypeAheadComponent } from '../../../shared/components/type-ahead/type-ahead.component'; import { TypeaheadModule } from 'ngx-bootstrap'; -import { SavingWorkbasketService } from '../../services/saving-workbaskets.service'; import { RequestInProgressService } from '../../../shared/services/request-in-progress/request-in-progress.service'; import { FormsValidatorService } from '../../../shared/services/forms-validator/forms-validator.service'; import { NotificationService } from '../../../shared/services/notifications/notification.service'; @@ -31,8 +30,6 @@ import { UpdateWorkbasketAccessItems } from '../../../shared/store/workbasket-store/workbasket.actions'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { ACTION } from '../../../shared/models/action'; -import { WorkbasketAccessItems } from '../../../shared/models/workbasket-access-items'; import { MatSelectModule } from '@angular/material/select'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatFormFieldModule } from '@angular/material/form-field'; @@ -47,12 +44,6 @@ class SpinnerStub { @Input() positionClass: string; } -const savingWorkbasketServiceSpy = jest.fn().mockImplementation( - (): Partial => ({ - triggeredAccessItemsSaving: jest.fn().mockReturnValue(of(true)) - }) -); - const requestInProgressServiceSpy = jest.fn().mockImplementation( (): Partial => ({ setRequestInProgress: jest.fn() @@ -106,7 +97,6 @@ describe('WorkbasketAccessItemsComponent', () => { ], declarations: [WorkbasketAccessItemsComponent, TypeAheadComponent, SpinnerStub], providers: [ - { provide: SavingWorkbasketService, useClass: savingWorkbasketServiceSpy }, { provide: RequestInProgressService, useClass: requestInProgressServiceSpy }, { provide: FormsValidatorService, useClass: formValidatorServiceSpy }, { provide: NotificationService, useClass: notificationServiceSpy }, @@ -145,14 +135,11 @@ describe('WorkbasketAccessItemsComponent', () => { }); it('should initialize when accessItems exist', async(() => { - component.action = ACTION.COPY; let actionDispatched = false; - component.onSave = jest.fn().mockImplementation(); actions$.pipe(ofActionDispatched(GetWorkbasketAccessItems)).subscribe(() => (actionDispatched = true)); component.init(); expect(component.initialized).toBe(true); expect(actionDispatched).toBe(true); - expect(component.onSave).toHaveBeenCalled(); })); it("should discard initializing when accessItems don't exist", () => { @@ -197,14 +184,4 @@ describe('WorkbasketAccessItemsComponent', () => { expect(onSaveSpy).toHaveBeenCalled(); expect(actionDispatched).toBe(true); }); - - it('should set badge correctly', () => { - component.action = ACTION.READ; - component.setBadge(); - expect(component.badgeMessage).toMatch(''); - - component.action = ACTION.COPY; - component.setBadge(); - expect(component.badgeMessage).toMatch(`Copying workbasket: ${component.workbasket.key}`); - }); }); diff --git a/web/src/app/administration/components/workbasket-access-items/workbasket-access-items.component.ts b/web/src/app/administration/components/workbasket-access-items/workbasket-access-items.component.ts index 24b1b985b..644c8bcb8 100644 --- a/web/src/app/administration/components/workbasket-access-items/workbasket-access-items.component.ts +++ b/web/src/app/administration/components/workbasket-access-items/workbasket-access-items.component.ts @@ -16,23 +16,21 @@ import { FormArray, FormBuilder, Validators } from '@angular/forms'; import { Workbasket } from 'app/shared/models/workbasket'; import { customFieldCount, WorkbasketAccessItems } from 'app/shared/models/workbasket-access-items'; import { WorkbasketAccessItemsRepresentation } from 'app/shared/models/workbasket-access-items-representation'; -import { ACTION } from 'app/shared/models/action'; - -import { SavingInformation, SavingWorkbasketService } from 'app/administration/services/saving-workbaskets.service'; import { RequestInProgressService } from 'app/shared/services/request-in-progress/request-in-progress.service'; import { highlight } from 'app/shared/animations/validation.animation'; import { FormsValidatorService } from 'app/shared/services/forms-validator/forms-validator.service'; import { AccessIdDefinition } from 'app/shared/models/access-id'; import { EngineConfigurationSelectors } from 'app/shared/store/engine-configuration-store/engine-configuration.selectors'; -import { filter, takeUntil } from 'rxjs/operators'; +import { filter, take, takeUntil } from 'rxjs/operators'; import { NOTIFICATION_TYPES } from '../../../shared/models/notifications'; import { NotificationService } from '../../../shared/services/notifications/notification.service'; import { AccessItemsCustomisation, CustomField, getCustomFields } from '../../../shared/models/customisation'; import { GetWorkbasketAccessItems, OnButtonPressed, - UpdateWorkbasketAccessItems, - UpdateWorkbasket + SaveNewWorkbasket, + UpdateWorkbasket, + UpdateWorkbasketAccessItems } from '../../../shared/store/workbasket-store/workbasket.actions'; import { WorkbasketSelectors } from '../../../shared/store/workbasket-store/workbasket.selectors'; import { WorkbasketComponent } from '../../models/workbasket-component'; @@ -48,16 +46,12 @@ export class WorkbasketAccessItemsComponent implements OnInit, OnChanges, OnDest @Input() workbasket: Workbasket; - @Input() - action: ACTION; - @Input() expanded: boolean; @ViewChildren('htmlInputElement') inputs: QueryList; - badgeMessage = ''; selectedRows: number[] = []; workbasketClone: Workbasket; @@ -65,8 +59,8 @@ export class WorkbasketAccessItemsComponent implements OnInit, OnChanges, OnDest customFields: CustomField[]; accessItemsRepresentation: WorkbasketAccessItemsRepresentation; - accessItemsClone: Array; - accessItemsResetClone: Array; + accessItemsClone: WorkbasketAccessItems[]; + accessItemsResetClone: WorkbasketAccessItems[]; AccessItemsForm = this.formBuilder.group({ accessItemsGroups: this.formBuilder.array([]) }); @@ -76,6 +70,9 @@ export class WorkbasketAccessItemsComponent implements OnInit, OnChanges, OnDest added = false; destroy$ = new Subject(); + @Select(WorkbasketSelectors.selectedWorkbasket) + selectedWorkbasket$: Observable; + @Select(EngineConfigurationSelectors.accessItemsCustomisation) accessItemsCustomization$: Observable; @@ -89,7 +86,6 @@ export class WorkbasketAccessItemsComponent implements OnInit, OnChanges, OnDest selectedComponent$: Observable; constructor( - private savingWorkbaskets: SavingWorkbasketService, private requestInProgressService: RequestInProgressService, private formBuilder: FormBuilder, public formsValidatorService: FormsValidatorService, @@ -110,17 +106,27 @@ export class WorkbasketAccessItemsComponent implements OnInit, OnChanges, OnDest }); this.accessItemsRepresentation$.subscribe((accessItemsRepresentation) => { if (typeof accessItemsRepresentation !== 'undefined') { - this.accessItemsRepresentation = accessItemsRepresentation; + this.accessItemsRepresentation = { ...accessItemsRepresentation }; this.setAccessItemsGroups(accessItemsRepresentation.accessItems); this.accessItemsClone = this.cloneAccessItems(accessItemsRepresentation.accessItems); this.accessItemsResetClone = this.cloneAccessItems(accessItemsRepresentation.accessItems); } }); + // saving workbasket access items when workbasket already exists this.ngxsActions$.pipe(ofActionCompleted(UpdateWorkbasket), takeUntil(this.destroy$)).subscribe(() => { this.onSubmit(); }); + // saving workbasket access items when workbasket was copied or created + this.ngxsActions$.pipe(ofActionCompleted(SaveNewWorkbasket), takeUntil(this.destroy$)).subscribe(() => { + this.selectedWorkbasket$.pipe(take(1)).subscribe((workbasket) => { + this.accessItemsRepresentation._links = { self: { href: workbasket._links.accessItems.href } }; + this.setWorkbasketIdForCopy(workbasket.workbasketId); + this.onSave(); + }); + }); + this.buttonAction$ .pipe(takeUntil(this.destroy$)) .pipe(filter((buttonAction) => typeof buttonAction !== 'undefined')) @@ -168,9 +174,6 @@ export class WorkbasketAccessItemsComponent implements OnInit, OnChanges, OnDest } ngOnChanges(changes?: SimpleChanges) { - if (changes.action) { - this.setBadge(); - } if (this.workbasketClone) { if (this.workbasketClone.workbasketId != this.workbasket.workbasketId) { this.init(); @@ -189,16 +192,6 @@ export class WorkbasketAccessItemsComponent implements OnInit, OnChanges, OnDest this.requestInProgressService.setRequestInProgress(false); }); - this.savingWorkbaskets - .triggeredAccessItemsSaving() - .pipe(takeUntil(this.destroy$)) - .subscribe((savingInformation: SavingInformation) => { - if (this.action === ACTION.COPY) { - this.accessItemsRepresentation._links.self.href = savingInformation.url; - this.setWorkbasketIdForCopy(savingInformation.workbasketId); - this.onSave(); - } - }); this.initialized = true; } @@ -291,7 +284,7 @@ export class WorkbasketAccessItemsComponent implements OnInit, OnChanges, OnDest accessItemSelected(accessItem: AccessIdDefinition, row: number) { this.accessItemsGroups.controls[row].get('accessId').setValue(accessItem?.accessId); - this.accessItemsGroups.controls[row].get('accessName').setValue(accessItem.name); + this.accessItemsGroups.controls[row].get('accessName').setValue(accessItem?.name); } onSave() { @@ -335,12 +328,6 @@ export class WorkbasketAccessItemsComponent implements OnInit, OnChanges, OnDest } } - setBadge() { - if (this.action === ACTION.COPY) { - this.badgeMessage = `Copying workbasket: ${this.workbasket.key}`; - } - } - cloneAccessItems(inputaccessItem): Array { return this.AccessItemsForm.value.accessItemsGroups.map((accessItems: WorkbasketAccessItems) => ({ ...accessItems diff --git a/web/src/app/administration/components/workbasket-details/workbasket-details.component.html b/web/src/app/administration/components/workbasket-details/workbasket-details.component.html index acc4d9c66..6adff586f 100644 --- a/web/src/app/administration/components/workbasket-details/workbasket-details.component.html +++ b/web/src/app/administration/components/workbasket-details/workbasket-details.component.html @@ -2,7 +2,7 @@

{{workbasket.name}} - {{ badgeMessage }} + {{ badgeMessage$ | async }}