diff --git a/goofy-client/apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-attachment-list.component.ts b/goofy-client/apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-attachment-list.component.ts index 89f480fe52f16dead5a2fd290fd1945e4cde04e7..9644c2b42de7a0825645c272e17401734df583fd 100644 --- a/goofy-client/apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-attachment-list.component.ts +++ b/goofy-client/apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-attachment-list.component.ts @@ -18,6 +18,7 @@ export class WiedervorlageAttachmentListE2EComponent { class AttachmentE2EItem { private deleteButton$: string = 'icon-button'; + private downloadButton$: string = 'file-download-button'; constructor(private fileName: string) { } @@ -26,13 +27,10 @@ class AttachmentE2EItem { } public delete(): void { - this.getRoot().findTestElementWithClass(this.deleteButton$).then(button => { - button[0].click(); - cy.wait(1000); - }) + this.getRoot().findTestElementWithClass(this.deleteButton$).click(); } public download(): void { - this.getRoot().findTestElementWithClass('file-download-button').click(); + this.getRoot().findTestElementWithClass(this.downloadButton$).click(); } } \ No newline at end of file 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 e1459bc0236add31f6a55be3f8de263850ebd4db..402567e7f7aec06785c1ad7363c0c3dd89e5aa0b 100644 --- a/goofy-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts +++ b/goofy-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts @@ -251,7 +251,7 @@ export class WiedervorlageService implements OnDestroy { if (isNil(this.attachmentListByWiedervorlage[uri])) { this.attachmentListByWiedervorlage[uri] = new BehaviorSubject(createEmptyStateResource()); } else { - this.attachmentListByWiedervorlage[uri].next({ ...this.attachmentListByWiedervorlage[uri].value, reload: true }); + this.attachmentListByWiedervorlage[uri].next(createEmptyStateResource()); } doIfLoadingRequired(this.attachmentListByWiedervorlage[uri].value, () => this.loadAttachments(wiedervorlage)); diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-attachments/wiedervorlage-attachments.component.html b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-attachments/wiedervorlage-attachments.component.html index 1efc5f41b0256c02d65171e12ffde1b9e355020d..25bdd7df198d7005440daef8cadfe16e6f710544 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-attachments/wiedervorlage-attachments.component.html +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-attachments/wiedervorlage-attachments.component.html @@ -1,7 +1,13 @@ -<goofy-client-anhang-list-in-wiedervorlage data-test-id="wiedervorlage-attachment-list" - [attachments]="attachments$ | async" [deletable]="true" - (deleteAttachment)="deleteAttachment($event)"> -</goofy-client-anhang-list-in-wiedervorlage> +<ng-container *ngIf="attachments$ | async as attachmentStateResource"> + <goofy-client-spinner [stateResource]="attachmentStateResource"> + + <goofy-client-anhang-list-in-wiedervorlage data-test-id="wiedervorlage-attachment-list" + [attachments]="attachmentStateResource.resource" [deletable]="true" + (deleteAttachment)="deleteAttachment($event)"> + </goofy-client-anhang-list-in-wiedervorlage> + + </goofy-client-spinner> +</ng-container> <goofy-client-spinner [stateResource]="uploadInProgress$ | async"> <goofy-client-file-upload (fileChanged)="uploadFile($event)" data-test-id="wiedervorlage-file-upload"></goofy-client-file-upload> diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-attachments/wiedervorlage-attachments.component.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-attachments/wiedervorlage-attachments.component.ts index e9b4ac9d85cbb23fa9527f9c4b3daf5fa611298b..1eb957001bd3424b96326b69fd7a98cdb25f6638 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-attachments/wiedervorlage-attachments.component.ts +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-attachments/wiedervorlage-attachments.component.ts @@ -20,7 +20,7 @@ export class WiedervorlageAttachmentsComponent { readonly linkRel = WiedervorlageLinkRel; - attachments$: Observable<OzgFileResource[]> = of([]); + attachments$: Observable<StateResource<OzgFileResource[]>> = of(createEmptyStateResource()); uploadInProgress$: Observable<StateResource<any>> = of(createEmptyStateResource()); constructor(public formService: WiedervorlageFormService, private wiedervorlageService: WiedervorlageService) { diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.html b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.html index 94a8125649a08f90e1108998fae60d5146425485..0cf1bbe2b2d5c74210eeb88490124fc3bb52340e 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.html +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.html @@ -1 +1,7 @@ -<goofy-client-anhang-list-in-wiedervorlage [attachments]="attachments$ | async" [deletable]="false"></goofy-client-anhang-list-in-wiedervorlage> \ No newline at end of file +<ng-container *ngIf="attachments$ | async as attachmentStateResource"> + + <goofy-client-spinner [stateResource]="attachmentStateResource"> + <goofy-client-anhang-list-in-wiedervorlage [attachments]="attachmentStateResource.resource" [deletable]="false"></goofy-client-anhang-list-in-wiedervorlage> + </goofy-client-spinner> + +</ng-container> \ No newline at end of file diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.spec.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.spec.ts index 229f3daf29a5b36a7e989df96d28d04130fdccb5..3dd1a1d79f7ae82e6593d6947102ed8aa507c321 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.spec.ts +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.spec.ts @@ -1,6 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { AnhangListInWiedervorlageComponent } from '@goofy-client/ozg-file'; import { mock } from '@goofy-client/test-utils'; +import { SpinnerComponent } from '@goofy-client/ui'; import { WiedervorlageService } from '@goofy-client/wiedervorlage-shared'; import { configureTestSuite } from 'ng-bullet'; import { MockComponent } from 'ng-mocks'; @@ -16,7 +17,8 @@ describe('WiedervorlageAttachmentListInVorgangComponent', () => { TestBed.configureTestingModule({ declarations: [ WiedervorlageAttachmentListInVorgangComponent, - MockComponent(AnhangListInWiedervorlageComponent) + MockComponent(AnhangListInWiedervorlageComponent), + MockComponent(SpinnerComponent) ], providers: [ { diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.ts index 6409871fbb8dff8b8f53fb102e31f8b2938805e1..ddd5a0d860efef649747f6647fd59f5ca4c9e97c 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.ts +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-in-vorgang/wiedervorlage-attachment-list-in-vorgang.component.ts @@ -1,5 +1,6 @@ import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; import { OzgFileListLinkRel, OzgFileListResource, OzgFileResource } from '@goofy-client/ozg-file-shared'; +import { createEmptyStateResource, createStateResource, StateResource } from '@goofy-client/tech-shared'; import { WiedervorlageResource, WiedervorlageService } from '@goofy-client/wiedervorlage-shared'; import { getEmbeddedResource } from '@ngxp/rest'; import { Observable, of } from 'rxjs'; @@ -16,21 +17,21 @@ export class WiedervorlageAttachmentListInVorgangComponent implements OnChanges readonly fileListRel = OzgFileListLinkRel; - attachments$: Observable<OzgFileResource[]> = of([]); + attachments$: Observable<StateResource<OzgFileResource[]>> = of(createEmptyStateResource()); constructor(public wiedervorlageService: WiedervorlageService) { } ngOnChanges(changes: SimpleChanges): void { if (changes.wiedervorlage) { this.attachments$ = this.wiedervorlageService.getAttachmentList(this.wiedervorlage).pipe( - map(attachmentList => this.mapAttachments(attachmentList.resource)) + map(attachmentList => this.mapAttachments(attachmentList)) ); } } - private mapAttachments(attachmentList: OzgFileListResource): OzgFileResource[] { - return attachmentList - ? getEmbeddedResource<OzgFileResource[]>(attachmentList, OzgFileListLinkRel.FILE_LIST) - : []; + private mapAttachments(attachmentListStateResource: StateResource<OzgFileListResource>): StateResource<OzgFileResource[]> { + return attachmentListStateResource.resource + ? createStateResource(getEmbeddedResource<OzgFileResource[]>(attachmentListStateResource.resource, OzgFileListLinkRel.FILE_LIST)) + : { ...attachmentListStateResource, resource: [] }; } } \ No newline at end of file diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage.formservice.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage.formservice.ts index c6796e4a815e2932661ea9c91c11a44a804e8c1c..7850da47adfe5abd3da9819c73e4545c48d6c497 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage.formservice.ts +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage.formservice.ts @@ -1,12 +1,11 @@ import { Injectable, OnDestroy } from '@angular/core'; import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; import { OzgFileListLinkRel, OzgFileListResource, OzgFileResource } from '@goofy-client/ozg-file-shared'; -import { AbstractFormService, createFutureDate, format, StateResource } from '@goofy-client/tech-shared'; +import { AbstractFormService, createFutureDate, createStateResource, format, StateResource } from '@goofy-client/tech-shared'; import { Wiedervorlage, WiedervorlageLinkRel, WiedervorlageResource, WiedervorlageService } from '@goofy-client/wiedervorlage-shared'; import { getEmbeddedResource, getUrl, hasLink } from '@ngxp/rest'; import { isNil, isNull } from 'lodash-es'; import { BehaviorSubject, Observable, Subscription } from 'rxjs'; -import { tap } from 'rxjs/operators'; @Injectable() export class WiedervorlageFormService extends AbstractFormService implements OnDestroy { @@ -17,7 +16,7 @@ export class WiedervorlageFormService extends AbstractFormService implements OnD static readonly FIELD_PATH_PREFIX = 'command.wiedervorlage'; - private attachments: BehaviorSubject<OzgFileResource[]>; + private attachments: BehaviorSubject<StateResource<OzgFileResource[]>>; private attachmentSubscription: Subscription; constructor( @@ -26,18 +25,17 @@ export class WiedervorlageFormService extends AbstractFormService implements OnD ) { super(formBuilder); - this.attachments = new BehaviorSubject([]); + this.attachments = new BehaviorSubject(createStateResource([])); } doAfterPatch(wiedervorlage: WiedervorlageResource): void { if (!isNil(this.attachmentSubscription)) this.attachmentSubscription.unsubscribe(); - console.info('do after patch'); if (this.hasAttachments(wiedervorlage)) { + this.attachments.next({ ...this.attachments.value, reload: true }); this.subscribeToAttachments(wiedervorlage); } else { - console.info('update attachments to []'); - this.attachments.next([]); + this.attachments.next(createStateResource([])); } } @@ -51,8 +49,7 @@ export class WiedervorlageFormService extends AbstractFormService implements OnD handleAttachmentList(attachmentsList: StateResource<OzgFileListResource>): void { if (attachmentsList.resource) { - console.info('update attachments to existing'); - this.attachments.next(getEmbeddedResource<OzgFileResource[]>(attachmentsList.resource, OzgFileListLinkRel.FILE_LIST)); + this.attachments.next(createStateResource(getEmbeddedResource<OzgFileResource[]>(attachmentsList.resource, OzgFileListLinkRel.FILE_LIST))); } } @@ -78,25 +75,29 @@ export class WiedervorlageFormService extends AbstractFormService implements OnD getValue(): Wiedervorlage { const formValue = super.getFormValue(); - return { ...formValue, frist: format(formValue.frist), attachments: this.attachments.value.map(ozgFile => getUrl(ozgFile)) }; + return { ...formValue, frist: format(formValue.frist), attachments: this.attachments.value.resource.map(ozgFile => getUrl(ozgFile)) }; } - public getAttachments(): Observable<OzgFileResource[]> { - return this.attachments.asObservable().pipe(tap(attachments => console.info('fire with: ', attachments))); + public getAttachments(): Observable<StateResource<OzgFileResource[]>> { + return this.attachments.asObservable(); } public addAttachment(attachment: OzgFileResource): void { + /* this.attachments.next({ ...this.attachments.value, loading: true }); + setTimeout(() => { */ let attachments = this.attachments.value; - attachments.push(attachment); - console.info('update attachment: add: ', attachment); - this.attachments.next(attachments); + attachments.resource.push(attachment); + this.attachments.next(createStateResource(attachments.resource)); + //}, 200); } public deleteAttachment(attachment: OzgFileResource): void { + /* this.attachments.next({ ...this.attachments.value, loading: true }); + setTimeout(() => { */ let attachments = this.attachments.value; - attachments.splice(attachments.indexOf(attachment), 1); - console.info('update attachment: delete: ', attachment); - this.attachments.next(attachments); + attachments.resource.splice(attachments.resource.indexOf(attachment), 1); + this.attachments.next(createStateResource(attachments.resource)); + //}, 200); } ngOnDestroy(): void {