diff --git a/goofy-client/libs/binary-file-shared/src/lib/binary-file.service.spec.ts b/goofy-client/libs/binary-file-shared/src/lib/binary-file.service.spec.ts index 2e4977a3a058ba36259776d0d8be13b38c5b0e52..578e031db31c7a160bf8f43b0b623a4cfbd6fe1d 100644 --- a/goofy-client/libs/binary-file-shared/src/lib/binary-file.service.spec.ts +++ b/goofy-client/libs/binary-file-shared/src/lib/binary-file.service.spec.ts @@ -42,7 +42,7 @@ describe('BinaryFileService', () => { }) it('should call repository', () => { - service.uploadFile(dummyResource, dummyLinkRel, testFile).subscribe(); + service.uploadFileLegacy(dummyResource, dummyLinkRel, testFile).subscribe(); expect(repository.uploadFile).toHaveBeenCalledWith(dummyResource, dummyLinkRel, testFile); }) @@ -111,7 +111,7 @@ describe('BinaryFileService', () => { }) it('should call repository', () => { - service.uploadFileNew(dummyResource, dummyLinkRel, testFile) + service.uploadFile(dummyResource, dummyLinkRel, testFile) expect(repository.uploadFile).toHaveBeenCalledWith(dummyResource, dummyLinkRel, testFile); }) @@ -120,7 +120,7 @@ describe('BinaryFileService', () => { repository.uploadFile.mockReturnValue(of(uploadFileResponse)); repository.getFile.mockReturnValue(of(returnFile)); - service.uploadFileNew(dummyResource, dummyLinkRel, testFile); + service.uploadFile(dummyResource, dummyLinkRel, testFile); expect(repository.getFile).toHaveBeenCalledWith(fileLocation); }) diff --git a/goofy-client/libs/binary-file-shared/src/lib/binary-file.service.ts b/goofy-client/libs/binary-file-shared/src/lib/binary-file.service.ts index 4eb8bafcec3143e5f54466c8d12385a18a158249..e9726c757bc32d32d50cb5ca360b45a08c7eee98 100644 --- a/goofy-client/libs/binary-file-shared/src/lib/binary-file.service.ts +++ b/goofy-client/libs/binary-file-shared/src/lib/binary-file.service.ts @@ -15,13 +15,13 @@ export class BinaryFileService { constructor(private repository: BinaryFileRepository, private snackbarService: SnackBarService) { } - /** @deprecated use uploadFileNew instead */ - public uploadFile(resource: Resource, linkRel: string, file: File): Observable<ResourceUri> { + /** @deprecated use uploadFile instead */ + public uploadFileLegacy(resource: Resource, linkRel: string, file: File): Observable<ResourceUri> { return this.repository.uploadFile(resource, linkRel, file).pipe(map((response: HttpResponse<void>) => response.headers.get('Location'))); } //TODO Nach der Umstellung umbenennen - public uploadFileNew(resource: Resource, linkRel: string, file: File): Observable<StateResource<any>> {//Aktuell noch OzgFileResource + public uploadFile(resource: Resource, linkRel: string, file: File): Observable<StateResource<any>> {//Aktuell noch OzgFileResource return this.repository.uploadFile(resource, linkRel, file).pipe( mergeMap((response: HttpResponse<void>) => this.getFile(response.headers.get('Location'))), catchError(errorResponse => this.handleError(errorResponse.error)), diff --git a/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file-container.component.ts b/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file-container.component.ts index c1cb82195add26f6f09d893652a95c996e4f3b71..154004ca8efd9d8d4a2ca7137ead3e3659b443ec 100644 --- a/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file-container.component.ts +++ b/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file-container.component.ts @@ -30,7 +30,7 @@ export class BinaryFileContainerComponent { } uploadFile(file: File): void { - this.uploadInProgress$ = this.service.uploadFileNew(this.uploadStateResource.resource, this.linkRelUploadAttachment, file).pipe( + this.uploadInProgress$ = this.service.uploadFile(this.uploadStateResource.resource, this.linkRelUploadAttachment, file).pipe( tap((stateResource: StateResource<OzgFileResource>) => this.doAfterFileUpload(stateResource)) ); } diff --git a/goofy-client/libs/command-shared/src/lib/command.util.spec.ts b/goofy-client/libs/command-shared/src/lib/command.util.spec.ts index be381faa36ce41caf761cb227a3a9c71dccfa60b..1002d550218dfdc411faa7c542ed7b750b090e6e 100644 --- a/goofy-client/libs/command-shared/src/lib/command.util.spec.ts +++ b/goofy-client/libs/command-shared/src/lib/command.util.spec.ts @@ -1,6 +1,7 @@ -import { createCommandResource } from 'libs/command-shared/test/command' +import { createCommandListResource, createCommandResource } from 'libs/command-shared/test/command' import { CommandLinkRel } from './command.linkrel' -import { hasError, isDone, isPending, isRevokeable } from './command.util' +import { CommandListResource, CommandResource } from './command.model' +import { getPendingCommandByOrder, hasError, isDone, isPending, isRevokeable } from './command.util' describe('CommandUtil', () => { @@ -63,4 +64,26 @@ describe('CommandUtil', () => { expect(result).toBeFalsy(); }) }) + + describe('getPendingForwardCommand', () => { + + const order: string = 'dummyOrder'; + + it('should return null on non existing pending command', () => { + const listResource: CommandListResource = createCommandListResource(); + + const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, order); + + expect(pendingCommand).toBeNull(); + }) + + it('should return existing pending command', () => { + const pendingForwardCommand: CommandResource = { ...createCommandResource(), order }; + const listResource: CommandListResource = createCommandListResource([pendingForwardCommand]); + + const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, order); + + expect(pendingCommand).toBe(pendingForwardCommand); + }) + }) }) \ No newline at end of file diff --git a/goofy-client/libs/command-shared/src/lib/command.util.ts b/goofy-client/libs/command-shared/src/lib/command.util.ts index 2a349961dffe16158da147d61b7bf62ff3a507e4..9dcbd90775befb85c776dc61492d959bdbd6423e 100644 --- a/goofy-client/libs/command-shared/src/lib/command.util.ts +++ b/goofy-client/libs/command-shared/src/lib/command.util.ts @@ -32,4 +32,6 @@ export function getPendingCommandByOrder(pendingCommands: CommandListResource, c return commands.length > 0 ? commands[0] : null; } -export function doIfCommandIsDone(commandResource: CommandResource, action: () => void) { if (isObject(commandResource) && isDone(commandResource)) action(); } \ No newline at end of file +export function doIfCommandIsDone(commandResource: CommandResource, action: () => void) { + if (isObject(commandResource) && isDone(commandResource)) action(); +} \ No newline at end of file diff --git a/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.html b/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.html index 5527a14181cfc894a711bccfc6b09e1f837f35a5..8af20b60bff4fe7d2c29785717690e58494cf331 100644 --- a/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.html +++ b/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.html @@ -1,10 +1,12 @@ <a #home="routerLinkActive" routerLink="/" - routerLinkActive="active" + [routerLinkActive]="isSelected() ? 'is_active' : 'is_disabled'" [routerLinkActiveOptions]="{ exact: true }" [matTooltip]="navigationCollapse ? label: null" matRipple - matRippleColor="rgba(13,71,161, 0.08)"> + matRippleColor="rgba(13,71,161, 0.08)" + [class.active]="isSelected()" + (click)="selectItem.emit(navigationItem.ALL_VORGAENGE)"> <mat-icon>apps</mat-icon> - <h1 *ngIf="home.isActive; else homeInactive">{{label}}</h1> + <h1 *ngIf="isSelected(); else homeInactive">{{label}}</h1> <ng-template #homeInactive><span>{{label}}</span></ng-template> </a> \ No newline at end of file diff --git a/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.spec.ts b/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.spec.ts index 4a749332616862f7621018eaeae50d9bb0cdd051..e4787d237bfa83f606a0046144d69f61accfa87b 100644 --- a/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.spec.ts +++ b/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.spec.ts @@ -2,6 +2,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIcon } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterTestingModule } from '@angular/router/testing'; +import { NavigationItem } from '@goofy-client/tech-shared'; import { AllVorgaengeNavigationItemComponent } from './all-vorgaenge-navigation-item.component'; describe('AllVorgaengeNavigationItemComponent', () => { @@ -30,4 +31,23 @@ describe('AllVorgaengeNavigationItemComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + describe('isSelected', () => { + + it('should return false on my vorgaenge', () => { + component.selectedNavigationItem = NavigationItem.MY_VORGAENGE + + var result: boolean = component.isSelected(); + + expect(result).toBeFalsy(); + }) + + it('should return true on all vorgaenge', () => { + component.selectedNavigationItem = NavigationItem.ALL_VORGAENGE + + var result: boolean = component.isSelected(); + + expect(result).toBeTruthy(); + }) + }) }); \ No newline at end of file diff --git a/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.ts b/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.ts index 4a3e503a4bc29a7f55026a88c37f84bc5c4cfbb5..7d6c3db0cb03c763aae04aedead820e4239d5bec 100644 --- a/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.ts +++ b/goofy-client/libs/navigation/src/lib/navigation/all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component.ts @@ -1,4 +1,5 @@ -import { Component, Input } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { NavigationItem } from '@goofy-client/tech-shared'; @Component({ selector: 'goofy-client-all-vorgaenge-navigation-item', @@ -8,7 +9,14 @@ import { Component, Input } from '@angular/core'; export class AllVorgaengeNavigationItemComponent { @Input() navigationCollapse: boolean; + @Input() selectedNavigationItem: NavigationItem; + + @Output() selectItem: EventEmitter<NavigationItem> = new EventEmitter<NavigationItem>(); readonly label: string = 'Alle Vorgänge'; + readonly navigationItem = NavigationItem; + isSelected(): boolean { + return this.selectedNavigationItem === NavigationItem.ALL_VORGAENGE; + } } \ No newline at end of file diff --git a/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.html b/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.html index 7bc65114cf9cdb6ab93928164d5fa16189ff649e..11bab5a929aa038ffdfdfdfd3ccc6e035193fd85 100644 --- a/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.html +++ b/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.html @@ -1,10 +1,12 @@ <a #home="routerLinkActive" routerLink="/myVorgaenge" - routerLinkActive="active" + [routerLinkActive]="isSelected() ? 'is_active' : 'is_disabled'" [routerLinkActiveOptions]="{ exact: true }" [matTooltip]="navigationCollapse ? label: null" matRipple - matRippleColor="rgba(13,71,161, 0.08)"> + matRippleColor="rgba(13,71,161, 0.08)" + [class.active]="isSelected()" + (click)="selectItem.emit(navigationItem.MY_VORGAENGE)"> <mat-icon>star</mat-icon> - <h1 *ngIf="home.isActive; else homeInactive">{{label}}</h1> + <h1 *ngIf="isSelected(); else homeInactive">{{label}}</h1> <ng-template #homeInactive><span>{{label}}</span></ng-template> </a> \ No newline at end of file diff --git a/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.spec.ts b/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.spec.ts index 9989dfd640c45a6193ce3d2a696aaa490e38b260..eaa3e1d919bb92db2c4f6a75cb8829e9d677efa1 100644 --- a/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.spec.ts +++ b/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.spec.ts @@ -2,6 +2,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIcon } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterTestingModule } from '@angular/router/testing'; +import { NavigationItem } from '@goofy-client/tech-shared'; import { MyVorgaengeNavigationItemComponent } from './my-vorgaenge-navigation-item.component'; describe('MyVorgaengeNavigationItemComponent', () => { @@ -30,4 +31,23 @@ describe('MyVorgaengeNavigationItemComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + describe('isSelected', () => { + + it('should return true on my vorgaenge', () => { + component.selectedNavigationItem = NavigationItem.MY_VORGAENGE + + var result: boolean = component.isSelected(); + + expect(result).toBeTruthy(); + }) + + it('should return false on all vorgaenge', () => { + component.selectedNavigationItem = NavigationItem.ALL_VORGAENGE + + var result: boolean = component.isSelected(); + + expect(result).toBeFalsy(); + }) + }) }); diff --git a/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.ts b/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.ts index 12e8f04ffd58bdf4aac80926a659d9e9ca22bda3..b1ffbb22e2060e935dee5496cf2f9090776fa319 100644 --- a/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.ts +++ b/goofy-client/libs/navigation/src/lib/navigation/my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component.ts @@ -1,4 +1,5 @@ -import { Component, Input } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { NavigationItem } from '@goofy-client/tech-shared'; @Component({ selector: 'goofy-client-my-vorgaenge-navigation-item', @@ -8,6 +9,14 @@ import { Component, Input } from '@angular/core'; export class MyVorgaengeNavigationItemComponent { @Input() navigationCollapse: boolean; + @Input() selectedNavigationItem: NavigationItem; + + @Output() selectItem: EventEmitter<NavigationItem> = new EventEmitter<NavigationItem>(); readonly label: string = 'Meine Vorgänge'; + readonly navigationItem = NavigationItem; + + isSelected(): boolean { + return this.selectedNavigationItem === NavigationItem.MY_VORGAENGE; + } } \ No newline at end of file diff --git a/goofy-client/libs/navigation/src/lib/navigation/navigation.component.html b/goofy-client/libs/navigation/src/lib/navigation/navigation.component.html index d762d1b21599f75c5e065dadfe93355c02c1e8db..793f5e7f9f873bcf7afd21acab6532fdda1989d0 100644 --- a/goofy-client/libs/navigation/src/lib/navigation/navigation.component.html +++ b/goofy-client/libs/navigation/src/lib/navigation/navigation.component.html @@ -3,12 +3,16 @@ <ul> <li> <goofy-client-all-vorgaenge-navigation-item *ngIf="apiRootStateResource.resource | hasLink: apiRootLinkRel.VORGAENGE" data-test-id="all-vorgaenge-navigation-item" - [navigationCollapse]="navigationCollapse$ | async"> + [navigationCollapse]="navigationCollapse$ | async" + [selectedNavigationItem]="selectedNavigationItem$ | async" + (selectItem)="selectItem($event)"> </goofy-client-all-vorgaenge-navigation-item> </li> <li> <goofy-client-my-vorgaenge-navigation-item *ngIf="apiRootStateResource.resource | hasLink: apiRootLinkRel.MY_VORGAENGE" data-test-id="my-vorgaenge-navigation-item" - [navigationCollapse]="navigationCollapse$ | async"> + [navigationCollapse]="navigationCollapse$ | async" + [selectedNavigationItem]="selectedNavigationItem$ | async" + (selectItem)="selectItem($event)"> </goofy-client-my-vorgaenge-navigation-item> </li> </ul> diff --git a/goofy-client/libs/navigation/src/lib/navigation/navigation.component.spec.ts b/goofy-client/libs/navigation/src/lib/navigation/navigation.component.spec.ts index 48ba82063a5750b34d9012d7e8ace99196d4a429..6f841f16fdc72e304401ae448f6037e2e61f26c5 100644 --- a/goofy-client/libs/navigation/src/lib/navigation/navigation.component.spec.ts +++ b/goofy-client/libs/navigation/src/lib/navigation/navigation.component.spec.ts @@ -1,12 +1,12 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ApiRootLinkRel, ApiRootService } from '@goofy-client/api-root-shared'; import { AppService } from '@goofy-client/app-shared'; -import { createStateResource, HasLinkPipe } from '@goofy-client/tech-shared'; +import { createStateResource, HasLinkPipe, NavigationItem, NavigationService } from '@goofy-client/tech-shared'; import { getElementFromFixture, mock } from '@goofy-client/test-utils'; import { createApiRootResource } from 'libs/api-root-shared/test/api-root'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; -import { BehaviorSubject, of } from 'rxjs'; +import { of } from 'rxjs'; import { AllVorgaengeNavigationItemComponent } from './all-vorgaenge-navigation-item/all-vorgaenge-navigation-item.component'; import { MyVorgaengeNavigationItemComponent } from './my-vorgaenge-navigation-item/my-vorgaenge-navigation-item.component'; import { NavigationComponent } from './navigation.component'; @@ -15,9 +15,9 @@ describe('NavigationComponent', () => { let component: NavigationComponent; let fixture: ComponentFixture<NavigationComponent>; - const navigationCollapseSubj: BehaviorSubject<boolean> = new BehaviorSubject(false); - const appService = { ...mock(AppService), getNavigationCollapse: () => navigationCollapseSubj }; - const apiRootService = { ...mock(ApiRootService), getApiRoot: () => of(createStateResource(createApiRootResource())) }; + const appService = mock(AppService); + const apiRootService = mock(ApiRootService); + const navigationService = mock(NavigationService); const allVorgaenge: string = getDataTestIdOf('all-vorgaenge-navigation-item'); const myVorgaenge: string = getDataTestIdOf('my-vorgaenge-navigation-item'); @@ -32,6 +32,10 @@ describe('NavigationComponent', () => { { provide: ApiRootService, useValue: apiRootService + }, + { + provide: NavigationService, + useValue: navigationService } ], declarations: [ @@ -53,6 +57,27 @@ describe('NavigationComponent', () => { expect(component).toBeTruthy(); }); + describe('on constructor', () => { + + it('should call navigation service', () => { + fixture.detectChanges(); + + expect(navigationService.getSelectedItem).toHaveBeenCalled(); + }); + + it('should call app service', () => { + fixture.detectChanges(); + + expect(appService.getNavigationCollapse).toHaveBeenCalled(); + }); + + it('should call api root service', () => { + fixture.detectChanges(); + + expect(apiRootService.getApiRoot).toHaveBeenCalled(); + }); + }) + describe('all vorgaenge item', () => { it('should show on existing link', () => { @@ -94,4 +119,15 @@ describe('NavigationComponent', () => { expect(element).not.toBeInstanceOf(HTMLElement); }) }) + + describe('select item', () => { + + const itemToSelect: NavigationItem = NavigationItem.ALL_VORGAENGE; + + it('should call navigation service', () => { + component.selectItem(itemToSelect); + + expect(navigationService.setSelectedItem).toHaveBeenCalledWith(itemToSelect); + }) + }) }); diff --git a/goofy-client/libs/navigation/src/lib/navigation/navigation.component.ts b/goofy-client/libs/navigation/src/lib/navigation/navigation.component.ts index 113f5daf97637fec52b677188eebafe4eeb782ad..f756c884a1bf5adc63e70428c1a3cb2858f3f84c 100644 --- a/goofy-client/libs/navigation/src/lib/navigation/navigation.component.ts +++ b/goofy-client/libs/navigation/src/lib/navigation/navigation.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@goofy-client/api-root-shared'; import { AppService } from '@goofy-client/app-shared'; -import { StateResource } from '@goofy-client/tech-shared'; +import { NavigationItem, NavigationService, StateResource } from '@goofy-client/tech-shared'; import { Observable } from 'rxjs'; //TODO Componente an die Containerstruktur anpassen @@ -14,11 +14,17 @@ export class NavigationComponent { navigationCollapse$: Observable<boolean>; apiRootStateResource$: Observable<StateResource<ApiRootResource>>; + selectedNavigationItem$: Observable<NavigationItem>; readonly apiRootLinkRel = ApiRootLinkRel; - constructor(private appService: AppService, private apiRootService: ApiRootService) { + constructor(private appService: AppService, private apiRootService: ApiRootService, private navigationService: NavigationService) { this.navigationCollapse$ = this.appService.getNavigationCollapse(); this.apiRootStateResource$ = this.apiRootService.getApiRoot(); + this.selectedNavigationItem$ = this.navigationService.getSelectedItem(); + } + + selectItem(item: NavigationItem): void { + this.navigationService.setSelectedItem(item); } } \ No newline at end of file diff --git a/goofy-client/libs/tech-shared/src/lib/service/navigation.service.spec.ts b/goofy-client/libs/tech-shared/src/lib/service/navigation.service.spec.ts index 728f95838242178a5efa27316ccbe7cea7fb7d65..1f2a75e1c0eb5b7222bf928abc26934e4b5be6a6 100644 --- a/goofy-client/libs/tech-shared/src/lib/service/navigation.service.spec.ts +++ b/goofy-client/libs/tech-shared/src/lib/service/navigation.service.spec.ts @@ -4,7 +4,7 @@ import { mock, useFromMock } from '@goofy-client/test-utils'; import { ResourceUri } from '@ngxp/rest'; import { of } from 'rxjs'; import { EMPTY_STRING } from '../tech.util'; -import { NavigationService } from './navigation.service'; +import { NavigationItem, NavigationService } from './navigation.service'; describe('NavigationService', () => { let service: NavigationService; @@ -15,13 +15,15 @@ describe('NavigationService', () => { events: of({}) }; + const activatedRouteParams: Params = {}; const activatedRoute = { ...mock(ActivatedRoute), root: { firstChild: { - params: of(<Params>{}) + params: of(activatedRouteParams) } }, + params: of(activatedRouteParams) }; beforeEach(() => { @@ -72,7 +74,7 @@ describe('NavigationService', () => { service.navigateToVorgangList(); - expect(router.navigate).toHaveBeenCalledWith(['/myVorgaenge/']); + expect(router.navigate).toHaveBeenCalledWith([NavigationService.MY_VORGAENGE_PATH]); }) it('should navigate to vorganglist on navigation all vorgaenge', () => { @@ -80,7 +82,7 @@ describe('NavigationService', () => { service.navigateToVorgangList(); - expect(router.navigate).toHaveBeenCalledWith(['/']); + expect(router.navigate).toHaveBeenCalledWith([NavigationService.ROOT_PATH]); }) }) @@ -89,7 +91,7 @@ describe('NavigationService', () => { service.navigateToVorgang(linkRel); - expect(router.navigate).toHaveBeenCalledWith(['/', 'vorgang', linkRel]); + expect(router.navigate).toHaveBeenCalledWith([NavigationService.ROOT_PATH, NavigationService.URL_PARAM_MY_VORGANG, linkRel]); }) it('should navigate with search string', () => { @@ -98,7 +100,96 @@ describe('NavigationService', () => { service.search(searchString); - expect(router.navigate).toHaveBeenCalledWith(['/search/', encodeURI(searchString)]); + expect(router.navigate).toHaveBeenCalledWith(['/' + NavigationService.URL_PARAM_SEARCH + '/', encodeURI(searchString)]); + }) + }) + + describe('updateItemSelection', () => { + + beforeEach(() => { + service.setSelectedItem = jest.fn(); + }) + + it('should set selectedItem to allVorgaenge', () => { + router.url = '/'; + + service.updateItemSelection({}); + + expect(service.setSelectedItem).toHaveBeenCalledWith(NavigationItem.ALL_VORGAENGE); + }) + + it('should set selectedItem to myVorgaenge', () => { + router.url = '/myVorgaenge'; + + service.updateItemSelection({}); + + expect(service.setSelectedItem).toHaveBeenCalledWith(NavigationItem.MY_VORGAENGE); + }) + + it('should do nothing on vorgang detail', () => { + router.url = '/vorgang/'; + + service.updateItemSelection({ ['vorgangWithEingangUrl']: 'testVorgangId' }); + + expect(service.setSelectedItem).not.toHaveBeenCalled(); + }) + }) + + describe('updateRouteParameter', () => { + it('should check if route changed', () => { + service.isNewRoute = jest.fn(); + + service.updateRouteParameter(<any>activatedRoute); + + expect(service.isNewRoute).toHaveBeenCalledWith(activatedRouteParams); + }) + + describe('on new route', () => { + + beforeEach(() => { + service.isNewRoute = jest.fn(); + (<any>service).isNewRoute.mockReturnValue(true); + }) + + it('should update route parameter if is new route', () => { + service.setRouteParameter = jest.fn(); + + service.updateRouteParameter(<any>activatedRoute); + + expect(service.setRouteParameter).toHaveBeenCalledWith(activatedRouteParams); + }) + + it('should update item selection', () => { + service.updateItemSelection = jest.fn(); + + service.updateRouteParameter(<any>activatedRoute); + + expect(service.updateItemSelection).toHaveBeenCalledWith(activatedRouteParams); + }) + }) + + describe('on same route', () => { + + beforeEach(() => { + service.isNewRoute = jest.fn(); + (<any>service).isNewRoute.mockReturnValue(false); + }) + + it('should NOT update route parameter if is new route', () => { + service.setRouteParameter = jest.fn(); + + service.updateRouteParameter(<any>activatedRoute); + + expect(service.setRouteParameter).not.toHaveBeenCalled(); + }) + + it('should NOT update item selection', () => { + service.updateItemSelection = jest.fn(); + + service.updateRouteParameter(<any>activatedRoute); + + expect(service.updateItemSelection).not.toHaveBeenCalled(); + }) }) }) }); diff --git a/goofy-client/libs/tech-shared/src/lib/service/navigation.service.ts b/goofy-client/libs/tech-shared/src/lib/service/navigation.service.ts index 00e0522c5a27c6b59f4c4c35a5ad18e8e1398361..3e35b431edf9588eda608ce8d98020de71e191f3 100644 --- a/goofy-client/libs/tech-shared/src/lib/service/navigation.service.ts +++ b/goofy-client/libs/tech-shared/src/lib/service/navigation.service.ts @@ -11,6 +11,14 @@ import { isEmptyObject } from '../tech.util'; export class NavigationService { private readonly routeParameter$: BehaviorSubject<Params> = new BehaviorSubject({}); + private readonly selectedItem: BehaviorSubject<NavigationItem> = new BehaviorSubject<NavigationItem>(NavigationItem.ALL_VORGAENGE); + + private static readonly URL_PARAM_MY_VORGAENGE: string = 'myVorgaenge'; + static readonly URL_PARAM_MY_VORGANG: string = 'vorgang'; + static readonly URL_PARAM_SEARCH: string = 'search'; + + public static readonly ROOT_PATH: string = '/'; + public static readonly MY_VORGAENGE_PATH: string = NavigationService.ROOT_PATH + NavigationService.URL_PARAM_MY_VORGAENGE + '/'; private routeSubscription: Subscription; @@ -41,17 +49,32 @@ export class NavigationService { return route; } - private updateRouteParameter(route: ActivatedRoute): void { + updateRouteParameter(route: ActivatedRoute): void { if (!isNil(this.routeSubscription)) this.routeSubscription.unsubscribe(); this.routeSubscription = route.params.subscribe((params: Params) => { - if (this.isNewRoute(params)) this.routeParameter$.next(params); + if (this.isNewRoute(params)) { + this.setRouteParameter(params); + this.updateItemSelection(params); + } }); } - private isNewRoute(newParams: Params): boolean { + isNewRoute(newParams: Params): boolean { return newParams != this.routeParameter$.value } + setRouteParameter(params: Params): void { + this.routeParameter$.next(params); + } + + updateItemSelection(params: Params): void { + if (this.isMyVorgaengeNavigation()) { + this.setSelectedItem(NavigationItem.MY_VORGAENGE); + } else if (NavigationService.isVorgangListPage(params) || NavigationService.isSearch(params)) { + this.setSelectedItem(NavigationItem.ALL_VORGAENGE); + } + } + public urlChanged(): Observable<Params> { return this.routeParameter$.asObservable(); } @@ -94,7 +117,7 @@ export class NavigationService { } static isSearch(params: Params): boolean { - return Object.keys(params).length === 1 && !isNil(params['search']); + return Object.keys(params).length === 1 && !isNil(params[NavigationService.URL_PARAM_SEARCH]); } public navigateRelativeTo(relativePath: string, relativeTo: ActivatedRoute): void { @@ -102,23 +125,38 @@ export class NavigationService { } public search(searchString: string): void { - this.router.navigate([this.getRootPath() + 'search/', encodeURI(searchString)]);//TODO: encoding/decoding abstimmen + this.router.navigate([this.getRootPath() + NavigationService.URL_PARAM_SEARCH + '/', encodeURI(searchString)]);//TODO: encoding/decoding abstimmen } public navigateToVorgangList(): void { this.router.navigate([this.getRootPath()]); } - private getRootPath(): string { - return this.isMyVorgaengeNavigation() ? '/myVorgaenge/' : '/'; + public getRootPath(): string { + return this.isMyVorgaengeNavigation() + ? NavigationService.MY_VORGAENGE_PATH + : NavigationService.ROOT_PATH; } public isMyVorgaengeNavigation(): boolean { const url: string = this.router.url; - return url.includes('myVorgaenge'); + return url.includes(NavigationService.URL_PARAM_MY_VORGAENGE); } public navigateToVorgang(linkUri: ResourceUri): void { - this.router.navigate(['/', 'vorgang', linkUri]); + this.router.navigate([NavigationService.ROOT_PATH, NavigationService.URL_PARAM_MY_VORGANG, linkUri]); + } + + public getSelectedItem(): Observable<NavigationItem> { + return this.selectedItem.asObservable(); } + + public setSelectedItem(item: NavigationItem): void { + this.selectedItem.next(item); + } +} + +export enum NavigationItem { + ALL_VORGAENGE, + MY_VORGAENGE } \ No newline at end of file diff --git a/goofy-client/libs/tech-shared/src/lib/tech.util.ts b/goofy-client/libs/tech-shared/src/lib/tech.util.ts index bb77b80f25ae72776ccafd95fd463de5529e8d79..9851e8e938fa2bb6428559a4f06143acc0b976d2 100644 --- a/goofy-client/libs/tech-shared/src/lib/tech.util.ts +++ b/goofy-client/libs/tech-shared/src/lib/tech.util.ts @@ -2,6 +2,7 @@ import { isEmpty, isNil } from 'lodash-es'; import { ApiError } from './tech.model'; export const EMPTY_STRING = ''; +export const EMPTY_ARRAY = []; export function getBaseUrl(): string { const { protocol, host, } = window.location; diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component.html new file mode 100644 index 0000000000000000000000000000000000000000..7d39a34ac3129a75a91c7ac0f191d05cfe14d256 --- /dev/null +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component.html @@ -0,0 +1 @@ +<goofy-client-vorgang-detail-back-button [selectedItem]="selectedNavigationItem$ | async"></goofy-client-vorgang-detail-back-button> \ No newline at end of file diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component.scss b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..1c2dd3747b0831a0e73a7c938aacb59ecc932d20 --- /dev/null +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component.spec.ts @@ -0,0 +1,47 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { NavigationService } from '@goofy-client/tech-shared'; +import { mock } from '@goofy-client/test-utils'; +import { MockComponent } from 'ng-mocks'; +import { VorgangDetailBackButtonContainerComponent } from './vorgang-detail-back-button-container.component'; +import { VorgangDetailBackButtonComponent } from './vorgang-detail-back-button/vorgang-detail-back-button.component'; + +describe('VorgangDetailBackButtonContainerComponent', () => { + let component: VorgangDetailBackButtonContainerComponent; + let fixture: ComponentFixture<VorgangDetailBackButtonContainerComponent>; + + const navigationService = mock(NavigationService); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ + VorgangDetailBackButtonContainerComponent, + MockComponent(VorgangDetailBackButtonComponent) + ], + providers: [ + { + provide: NavigationService, + useValue: navigationService + } + ] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(VorgangDetailBackButtonContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('ngOnInit', () => { + + it('should call navigation service getSelectedItem', () => { + component.ngOnInit(); + + expect(navigationService.getSelectedItem).toHaveBeenCalled(); + }) + }) +}); diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..02b600e148dae268da25eebe5dad6cb7d2d0dd93 --- /dev/null +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; +import { NavigationItem, NavigationService } from '@goofy-client/tech-shared'; +import { Observable } from 'rxjs'; + +@Component({ + selector: 'goofy-client-vorgang-detail-back-button-container', + templateUrl: './vorgang-detail-back-button-container.component.html', + styleUrls: ['./vorgang-detail-back-button-container.component.scss'] +}) +export class VorgangDetailBackButtonContainerComponent implements OnInit { + + selectedNavigationItem$: Observable<NavigationItem>; + + constructor(private navigationService: NavigationService) { } + + ngOnInit(): void { + this.selectedNavigationItem$ = this.navigationService.getSelectedItem(); + } +} \ No newline at end of file diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component.html new file mode 100644 index 0000000000000000000000000000000000000000..ad8a04ed951a19f5a650c116a6f3c7b44d07f92e --- /dev/null +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component.html @@ -0,0 +1,3 @@ +<a [routerLink]="buildRouterLink()" mat-icon-button data-test-id="back-button" class="back-button" aria-label="zurück zur Vorgangsliste" matTooltip="zurück zur Vorgangsliste"> + <mat-icon>arrow_back</mat-icon> +</a> \ No newline at end of file diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component.scss b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..cb4df7e7799d54f675a98b2982a44ff7225e027f --- /dev/null +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component.spec.ts @@ -0,0 +1,51 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatIcon } from '@angular/material/icon'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NavigationItem, NavigationService } from '@goofy-client/tech-shared'; +import { VorgangDetailBackButtonComponent } from './vorgang-detail-back-button.component'; + +describe('VorgangDetailBackButtonComponent', () => { + let component: VorgangDetailBackButtonComponent; + let fixture: ComponentFixture<VorgangDetailBackButtonComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ + MatIcon, + VorgangDetailBackButtonComponent + ], + imports: [ + RouterTestingModule + ], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(VorgangDetailBackButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('buildRouterUrl', () => { + + it('should return on myVorgaenge', () => { + component.selectedItem = NavigationItem.MY_VORGAENGE; + + var routerUrl: String = component.buildRouterLink(); + + expect(routerUrl).toBe(NavigationService.MY_VORGAENGE_PATH); + }) + + it('should return on allVorgaenge', () => { + component.selectedItem = NavigationItem.ALL_VORGAENGE; + + var routerUrl: String = component.buildRouterLink(); + + expect(routerUrl).toBe(NavigationService.ROOT_PATH); + }) + }) +}) \ No newline at end of file diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..8766b9c9f6493746826ed13ad3cc99db82571d13 --- /dev/null +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component.ts @@ -0,0 +1,18 @@ +import { Component, Input } from '@angular/core'; +import { NavigationItem, NavigationService } from '@goofy-client/tech-shared'; + +@Component({ + selector: 'goofy-client-vorgang-detail-back-button', + templateUrl: './vorgang-detail-back-button.component.html', + styleUrls: ['./vorgang-detail-back-button.component.scss'] +}) +export class VorgangDetailBackButtonComponent { + + @Input() selectedItem: NavigationItem; + + buildRouterLink(): string { + return this.selectedItem === NavigationItem.ALL_VORGAENGE + ? NavigationService.ROOT_PATH + : NavigationService.MY_VORGAENGE_PATH; + } +} \ No newline at end of file diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html index ae68650c33c1a8bce8c5f165c787418bf5611164..5e8ecaaa94dbfd9a031161240945412b77654320 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.html @@ -1,9 +1,7 @@ <ng-container *ngIf="vorgangStateResource$ | async as vorgangStateResource"> <goofy-client-subnavigation class="mat-app-background"> - <a routerLink="/" mat-icon-button data-test-id="back-button" class="back-button" aria-label="zurück zur Vorgangsliste" matTooltip="zurück zur Vorgangsliste"> - <mat-icon>arrow_back</mat-icon> - </a> + <goofy-client-vorgang-detail-back-button-container></goofy-client-vorgang-detail-back-button-container> <goofy-client-vorgang-detail-action-buttons [vorgangWithEingang]="vorgangStateResource.resource"></goofy-client-vorgang-detail-action-buttons> </goofy-client-subnavigation> @@ -13,4 +11,4 @@ </ng-container> -<goofy-client-progress-bar data-test-id="progress-bar" [stateResource]="revokeCommandStateResource$ | async"></goofy-client-progress-bar> +<goofy-client-progress-bar data-test-id="progress-bar" [stateResource]="revokeCommandStateResource$ | async"></goofy-client-progress-bar> \ No newline at end of file diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.spec.ts index e30603e0b76d2e47c4f3c66cb52fc200f7198223..61a76f95fab4364a9b6fd6b7174b0c9e067579ad 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-page.component.spec.ts @@ -11,6 +11,7 @@ import { Subject } from 'rxjs'; import { VorgangDetailActionButtonsComponent } from './vorgang-detail-area/vorgang-detail-action-buttons/vorgang-detail-action-buttons.component'; import { VorgangDetailAreaComponent } from './vorgang-detail-area/vorgang-detail-area.component'; import { VorgangDetailFormularButtonsComponent } from './vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component'; +import { VorgangDetailBackButtonContainerComponent } from './vorgang-detail-back-button-container/vorgang-detail-back-button-container.component'; import { VorgangDetailPageComponent } from './vorgang-detail-page.component'; describe('VorgangDetailPageComponent', () => { @@ -34,7 +35,8 @@ describe('VorgangDetailPageComponent', () => { MockComponent(SubnavigationComponent), MockComponent(VorgangDetailAreaComponent), MockComponent(VorgangDetailActionButtonsComponent), - MockComponent(VorgangDetailFormularButtonsComponent) + MockComponent(VorgangDetailFormularButtonsComponent), + MockComponent(VorgangDetailBackButtonContainerComponent) ], providers: [ { diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts index f77e5ae51d158b2da8ef4615f5850860020e2b71..a2f10b7d7e812eaffd71fe1cc75a0bd596eac638 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts @@ -22,14 +22,16 @@ import { WiedereroeffnenButtonComponent } from './buttons/wiedereroeffnen-button import { ZurueckholenButtonComponent } from './buttons/zurueckholen-button/zurueckholen-button.component'; import { ZurueckstellenButtonComponent } from './buttons/zurueckstellen-button/zurueckstellen-button.component'; import { VorgangDetailActionButtonsComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-action-buttons/vorgang-detail-action-buttons.component'; +import { VorgangDetailAntragstellerComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component'; import { VorgangDetailAreaComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component'; import { EingangHeaderComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-body/eingang-header/eingang-header.component'; import { FormDataTableComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-body/form-data-table/form-data-table.component'; import { VorgangDetailBodyComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-body/vorgang-detail-body.component'; import { VorgangDetailFormularButtonsComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component'; import { VorgangDetailHeaderComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-header/vorgang-detail-header.component'; +import { VorgangDetailBackButtonContainerComponent } from './vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button-container.component'; +import { VorgangDetailBackButtonComponent } from './vorgang-detail-page/vorgang-detail-back-button-container/vorgang-detail-back-button/vorgang-detail-back-button.component'; import { VorgangDetailPageComponent } from './vorgang-detail-page/vorgang-detail-page.component'; -import { VorgangDetailAntragstellerComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component'; const routes: Routes = [ { @@ -72,10 +74,12 @@ const routes: Routes = [ AbschliessenButtonComponent, ZurueckstellenButtonComponent, WiedereroeffnenButtonComponent, - VorgangDetailAntragstellerComponent, + VorgangDetailAntragstellerComponent, + VorgangDetailBackButtonComponent, + VorgangDetailBackButtonContainerComponent, ], exports: [ - VorgangDetailAntragstellerComponent + VorgangDetailAntragstellerComponent ] }) export class VorgangDetailModule { } diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.spec.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.spec.ts index 7364b60f4f757dd57d56fb98680d382aa73fdca0..17735820624cd875aaee8ab7d1bd04a525b52789 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.spec.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.spec.ts @@ -1,8 +1,8 @@ -import { CommandListResource, CommandResource, CreateCommand, getPendingCommandByOrder } from '@goofy-client/command-shared'; -import { createCommandListResource, createCommandResource } from 'libs/command-shared/test/command'; -import { createVorgangForwardRequest } from 'libs/vorgang-shared/test/vorgang'; -import { ForwardRequest, VorgangOrder } from './vorgang.model'; -import { createAbschliessenCommand, createAnnehmenCommand, createBearbeitenCommand, createBescheidenCommand, createForwardCommand, createVerwerfenCommand, createZurueckholenCommand, createZurueckstellenCommand } from './vorgang.util'; +import { CreateCommand } from '@goofy-client/command-shared'; +import { createVorgangForwardRequest, createVorgangListResource } from 'libs/vorgang-shared/test/vorgang'; +import { VorgangListLinkRel } from './vorgang.linkrel'; +import { ForwardRequest, VorgangOrder, VorgangResource } from './vorgang.model'; +import { createAbschliessenCommand, createAnnehmenCommand, createBearbeitenCommand, createBescheidenCommand, createForwardCommand, createVerwerfenCommand, createZurueckholenCommand, createZurueckstellenCommand, getVorgaengeFromList } from './vorgang.util'; describe('VorgangUtil', () => { @@ -80,23 +80,18 @@ describe('VorgangUtil', () => { }) }) - describe('getPendingForwardCommand', () => { + describe('getVorgaengeFromList', () => { - it('should return null on non existing pending command', () => { - const listResource: CommandListResource = createCommandListResource(); + it('should return empty array on null', () => { + var result: VorgangResource[] = getVorgaengeFromList(null); - const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, VorgangOrder.FORWARD); - - expect(pendingCommand).toBeNull(); + expect(result.length).toBe(0); }) - it('should return existing pending command', () => { - const pendingForwardCommand: CommandResource = { ...createCommandResource(), order: VorgangOrder.FORWARD }; - const listResource: CommandListResource = createCommandListResource([pendingForwardCommand]); - - const pendingCommand: CommandResource = getPendingCommandByOrder(listResource, VorgangOrder.FORWARD); + it('should return content as array', () => { + var result: VorgangResource[] = getVorgaengeFromList(createVorgangListResource([VorgangListLinkRel.VORGANG_HEADER_LIST])); - expect(pendingCommand).toBe(pendingForwardCommand); + expect(result.length).toBe(10); }) }) }) \ No newline at end of file diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.ts index 828b523c18ce2b4909ac88b4841bc435ee40843a..829c71adfb40446a8008f9aeab711ad82c9c22c9 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.ts @@ -1,6 +1,7 @@ -import { UrlSegment } from '@angular/router'; import { CreateCommand } from '@goofy-client/command-shared'; +import { EMPTY_ARRAY, isNotNil } from '@goofy-client/tech-shared'; import { getEmbeddedResource } from '@ngxp/rest'; +import { isNull } from 'lodash-es'; import { VorgangListLinkRel } from './vorgang.linkrel'; import { CreateForwardCommand, ForwardRequest, VorgangListResource, VorgangOrder, VorgangResource } from './vorgang.model'; @@ -40,14 +41,18 @@ export function createForwardCommand(redirectRequest: ForwardRequest): CreateFor return { order: VorgangOrder.FORWARD, redirectRequest, body: null }; } -export function isNotVorgangDetailPage(urlSegements: UrlSegment[]): boolean { +/* export function isNotVorgangDetailPage(urlSegements: UrlSegment[]): boolean { return (urlSegements.length < 2) || (urlSegements[0].path !== 'vorgang') } export function isNotVorgangListPage(urlSegements: UrlSegment[]): boolean { return urlSegements.length !== 0; -} +} */ export function getVorgaengeFromList(vorgangList: VorgangListResource): VorgangResource[] { - return getEmbeddedResource(vorgangList, VorgangListLinkRel.VORGANG_HEADER_LIST); + if (isNotNil(vorgangList)) { + const embeddedResource: VorgangResource[] = getEmbeddedResource(vorgangList, VorgangListLinkRel.VORGANG_HEADER_LIST); + return isNull(embeddedResource) ? EMPTY_ARRAY : embeddedResource; + } + return EMPTY_ARRAY; } \ No newline at end of file diff --git a/goofy-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts b/goofy-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts index 1aeab7d5c7bc4a5a5cb804a7918148a3ef0aeed1..8995a2c89953e923b80388278afd248d0fcd6be9 100644 --- a/goofy-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts +++ b/goofy-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts @@ -20,7 +20,7 @@ import { WiedervorlageRepository } from './wiedervorlage.repository'; import { WiedervorlageService } from './wiedervorlage.service'; describe('WiedervorlageService', () => { - let service; + let service: WiedervorlageService; let repository: Mock<WiedervorlageRepository>; let navigationService: Mock<NavigationService>; let commandService: Mock<CommandService>; @@ -137,11 +137,11 @@ describe('WiedervorlageService', () => { }) it('should set submit-in-progress on loading', () => { - service.setSubmitInProgressLoading = jest.fn(); + (<any>service).setSubmitInProgressLoading = jest.fn(); - service.saveWiedervorlage(wiedervorlage); + service.saveWiedervorlage(wiedervorlageResource, wiedervorlage); - expect(service.setSubmitInProgressLoading).toHaveBeenCalled(); + expect((<any>service).setSubmitInProgressLoading).toHaveBeenCalled(); }) it('should call proceedAfterRecieveCommand', () => { @@ -169,11 +169,11 @@ describe('WiedervorlageService', () => { }) it('should set submit-in-progress on loading', () => { - service.setSubmitInProgressLoading = jest.fn(); + (<any>service).setSubmitInProgressLoading = jest.fn(); service.createWiedervorlage(wiedervorlage); - expect(service.setSubmitInProgressLoading).toHaveBeenCalled(); + expect((<any>service).setSubmitInProgressLoading).toHaveBeenCalled(); }) it('should call command service', () => { @@ -222,8 +222,8 @@ describe('WiedervorlageService', () => { beforeEach(() => { commandService.createCommand.mockReturnValue(of(createStateResource(commandResourceWithEffectedResourceLink))); - service.reloadWiedervorlageList = jest.fn(); - service.loadAndSetWiedervorlageByUrl = jest.fn(); + (<any>service).reloadWiedervorlageList = jest.fn(); + (<any>service).loadAndSetWiedervorlageByUrl = jest.fn(); service.wiedervorlage$.next(createStateResource(wiedervorlageResource)); }) @@ -239,7 +239,7 @@ describe('WiedervorlageService', () => { it('should reload wiedervorlage', () => { service.erledigen(); - expect(service.loadAndSetWiedervorlageByUrl).toHaveBeenCalled(); + expect((<any>service).loadAndSetWiedervorlageByUrl).toHaveBeenCalled(); }) it('should show snackbar', () => { @@ -260,7 +260,7 @@ describe('WiedervorlageService', () => { it('should reload wiedervorlage', () => { service.wiedereroeffnen(); - expect(service.loadAndSetWiedervorlageByUrl).toHaveBeenCalled(); + expect((<any>service).loadAndSetWiedervorlageByUrl).toHaveBeenCalled(); }); it('should show snackbar', () => { @@ -295,10 +295,10 @@ describe('WiedervorlageService', () => { describe('on navigation', () => { beforeEach(() => { - service.navigateToVorgangDetailPage = jest.fn(); + (<any>service).navigateToVorgangDetailPage = jest.fn(); service.setWiedervorlageListReload = jest.fn(); - service.forceWiedervorlageReload = jest.fn(); + (<any>service).forceWiedervorlageReload = jest.fn(); service.clearAttachmentList = jest.fn(); service.clearWiedervorlagenList = jest.fn(); }) @@ -306,7 +306,7 @@ describe('WiedervorlageService', () => { describe('to vorgang detail', () => { beforeEach(() => { - service.navigateToVorgangDetailPage.mockReturnValue(true); + (<any>service).navigateToVorgangDetailPage.mockReturnValue(true); }) it('should set wiedervorlage list on reload', () => { @@ -318,7 +318,7 @@ describe('WiedervorlageService', () => { it('should set wiedervorlage on reload', () => { service.onNavigation({}); - expect(service.forceWiedervorlageReload).toHaveBeenCalled(); + expect((<any>service).forceWiedervorlageReload).toHaveBeenCalled(); }) it('should clear attachments', () => { diff --git a/goofy-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts b/goofy-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts index d64e63a8bc430e7c20e9ba22234e3e650fbeb643..ed94fba96c93641a06975d01c530df6e370e55e8 100644 --- a/goofy-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts +++ b/goofy-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts @@ -117,7 +117,7 @@ export class WiedervorlageService implements OnDestroy { onNavigation(params: Params): void { if (this.navigateToVorgangDetailPage(params)) { this.setWiedervorlageListReload(); - this.forceWiedervorlageReload();//TODO: lieber clearen!? + this.forceWiedervorlageReload(); this.submitInProgress$.next(createEmptyStateResource()); this.clearAttachmentList(); } @@ -277,7 +277,7 @@ export class WiedervorlageService implements OnDestroy { } public uploadFile(file: File): Observable<StateResource<OzgFileResource>> { - return this.binaryFileService.uploadFile(this.wiedervorlageList$.value.resource, WiedervorlageListLinkRel.UPLOAD_FILE, file).pipe( + return this.binaryFileService.uploadFileLegacy(this.wiedervorlageList$.value.resource, WiedervorlageListLinkRel.UPLOAD_FILE, file).pipe( mergeMap(a => this.ozgFileService.getFile(a)), startWith(createEmptyStateResource<OzgFileResource>(true)) );