diff --git a/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts index c7988c3ce98a476aa50c0a28b1341331a790d4e4..7e7207e39038dfd923b4b1560bdda6864496a0f2 100644 --- a/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts +++ b/alfa-client/apps/alfa-e2e/src/components/attachment/attachment.e2e.component.ts @@ -48,6 +48,10 @@ export class AttachmentListE2EComponent { return new AttachmentE2EItem(fileName); } + public getLoadingOrErrorItem(fileName: string): LoadingErrorAttachmentE2EItem { + return new LoadingErrorAttachmentE2EItem(fileName); + } + public getDownloadAttachmentsButton(): Cypress.Chainable<JQuery<HTMLElement>> { return this.getRoot().findTestElementWithClass(this.downloadAttachmentsButton); } @@ -79,3 +83,16 @@ class AttachmentE2EItem { return this.getRoot().findTestElementWithClass(this.locatorDownloadButton); } } + +class LoadingErrorAttachmentE2EItem { + private readonly root: string; + private readonly attachmentSuffix: string = '-file-upload-list-item-attachment-upload'; + + constructor(private fileName: string) { + this.root = convertToDataTestId(this.fileName) + this.attachmentSuffix; + } + + public getRoot() { + return cy.getTestElement(this.root); + } +} diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts index 753c03ac4bec195c51eef3dffe2de7058e58ccb1..a32737f51ba4be5eb46a092f211db36236f239cf 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts @@ -21,47 +21,26 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { - AttachmentContainerE2EComponent, - AttachmentListE2EComponent, -} from 'apps/alfa-e2e/src/components/attachment/attachment.e2e.component'; +import { AttachmentContainerE2EComponent, AttachmentListE2EComponent, } from 'apps/alfa-e2e/src/components/attachment/attachment.e2e.component'; import { WiedervorlageSubnavigationE2EComponent } from 'apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-subnavigation'; -import { BinaryFileSnackbarMessageE2E } from 'apps/alfa-e2e/src/model/binary-file'; import { WiedervorlageE2E } from 'apps/alfa-e2e/src/model/wiedervorlage'; -import { - dropCollections, - readFileFromDownloads, - wait, -} from 'apps/alfa-e2e/src/support/cypress-helper'; +import { dropCollections, readFileFromDownloads, wait } from 'apps/alfa-e2e/src/support/cypress-helper'; import { initVorgangAttachedItem } from 'apps/alfa-e2e/src/support/vorgang-attached-item-util'; import { SnackBarE2EComponent } from '../../../components/ui/snackbar.e2e.component'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { WiedervorlageInVorgangE2EComponent } from '../../../components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component'; import { WiedervorlageE2EComponent } from '../../../components/wiedervorlage/wiedervorlage-page.e2e.component'; +import { BinaryFileSnackbarMessageE2E } from '../../../model/binary-file'; import { VorgangE2E } from '../../../model/vorgang'; import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { WiedervorlagePage } from '../../../page-objects/wiedervorlage.po'; -import { - containClass, - contains, - exist, - haveLength, - notContainClass, - notExist, -} from '../../../support/cypress.util'; -import { - TEST_FILE_WITHOUT_CONTENT, - TEST_FILE_WITH_CONTENT, - TEST_FILE_WITH_CONTENT_46MB, -} from '../../../support/data.util'; +import { containClass, contains, exist, haveLength, notContainClass, notExist } from '../../../support/cypress.util'; +import { TEST_FILE_WITH_CONTENT, TEST_FILE_WITH_CONTENT_46MB, TEST_FILE_WITHOUT_CONTENT } from '../../../support/data.util'; import { uploadEmptyFile, uploadFile } from '../../../support/file-upload'; import { loginAsSabine } from '../../../support/user-util'; import { createVorgang, initVorgang, objectIds } from '../../../support/vorgang-util'; -import { - createWiedervorlageAttachedItem, - createWiedervorlageItem, -} from '../../../support/wiedervorlage-util'; +import { createWiedervorlageAttachedItem, createWiedervorlageItem } from '../../../support/wiedervorlage-util'; describe('Wiedervorlage attachments', () => { const mainPage: MainPage = new MainPage(); @@ -74,13 +53,10 @@ describe('Wiedervorlage attachments', () => { const wiedervorlageContainerInVorgang = vorgangPage.getWiedervorlagenContainer(); const wiedervorlagePage: WiedervorlagePage = new WiedervorlagePage(); - const wiedervorlageContainer: WiedervorlageE2EComponent = - wiedervorlagePage.getWiedervorlageContainer(); - const attachmentContainer: AttachmentContainerE2EComponent = - wiedervorlageContainer.getAttachmentContainer(); + const wiedervorlageContainer: WiedervorlageE2EComponent = wiedervorlagePage.getWiedervorlageContainer(); + const attachmentContainer: AttachmentContainerE2EComponent = wiedervorlageContainer.getAttachmentContainer(); const attachmentList: AttachmentListE2EComponent = attachmentContainer.getList(); - const subnavigation: WiedervorlageSubnavigationE2EComponent = - wiedervorlagePage.getSubnavigation(); + const subnavigation: WiedervorlageSubnavigationE2EComponent = wiedervorlagePage.getSubnavigation(); const snackbar: SnackBarE2EComponent = mainPage.getSnackBar(); @@ -140,23 +116,17 @@ describe('Wiedervorlage attachments', () => { exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot()); }); - it('should error snackbar after upload to large file', { defaultCommandTimeout: 30000 }, () => { + it('should show failed upload', { defaultCommandTimeout: 30000 }, () => { uploadFile(attachmentContainer.getUploadInput(), TEST_FILE_WITH_CONTENT_46MB); waitForSpinnerToDisappear(); - exist(snackbar.getMessage()); + exist(attachmentList.getLoadingOrErrorItem(TEST_FILE_WITH_CONTENT_46MB).getRoot()); contains( - snackbar.getMessage(), + attachmentList.getLoadingOrErrorItem(TEST_FILE_WITH_CONTENT_46MB).getRoot(), BinaryFileSnackbarMessageE2E.ATTACHMENT_NOT_ADDED.replace('{size}', '40MB'), ); }); - it('should close snackbar on close button', () => { - snackbar.getCloseButton().click(); - - notExist(snackbar.getMessage()); - }); - it('should download attachment on click', () => { attachmentList.getItem(TEST_FILE_WITH_CONTENT).getDownloadButton().click(); waitForSpinnerToDisappear(); @@ -169,10 +139,7 @@ describe('Wiedervorlage attachments', () => { wiedervorlageContainer.getSpeichernButton().click(); exist(snackbar.getMessage()); - contains( - snackbar.getMessage(), - 'Die Wiedervorlage "' + WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF + '" wurde angelegt', - ); + contains(snackbar.getMessage(), 'Die Wiedervorlage "' + WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF + '" wurde angelegt'); exist(snackbar.getCloseButton()); }); @@ -183,9 +150,7 @@ describe('Wiedervorlage attachments', () => { }); it('should show attachments on wiedervorlage in vorgang-detail after save ', () => { - wiedervorlageContainerInVorgang - .getWiedervorlage(WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF) - .expandItem(); + wiedervorlageContainerInVorgang.getWiedervorlage(WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF).expandItem(); exist( wiedervorlageContainerInVorgang @@ -203,6 +168,14 @@ describe('Wiedervorlage attachments', () => { .getItem(TEST_FILE_WITH_CONTENT) .getRoot(), ); + notExist( + wiedervorlageContainerInVorgang + .getWiedervorlage(WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF) + .getAttachmentContainer() + .getList() + .getLoadingOrErrorItem(TEST_FILE_WITH_CONTENT_46MB) + .getRoot(), + ); }); it('should download empty attachment on click in list', () => { @@ -233,8 +206,9 @@ describe('Wiedervorlage attachments', () => { }); describe('Delete attachment', () => { - const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = - wiedervorlageContainerInVorgang.getWiedervorlage(WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF); + const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage( + WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF, + ); it('should open wiedervorlage page', () => { wiedervorlageComp.getLink().click(); @@ -256,66 +230,41 @@ describe('Wiedervorlage attachments', () => { wiedervorlageContainer.getSpeichernButton().click(); exist(snackbar.getMessage()); - contains( - snackbar.getMessage(), - `Die Wiedervorlage "${WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF}" wurde gespeichert`, - ); + contains(snackbar.getMessage(), `Die Wiedervorlage "${WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF}" wurde gespeichert`); snackbar.getCloseButton().click(); }); - it('(Skip reason in OZG-4658) check attachments in wiedervorlage list', () => { + it('check attachments in wiedervorlage list', () => { waitForSpinnerToDisappear(); wiedervorlageComp.getExpandButton(); wiedervorlageComp.expandItem(); - notExist( - wiedervorlageComp - .getAttachmentContainer() - .getList() - .getItem(TEST_FILE_WITHOUT_CONTENT) - .getRoot(), - ); - exist( - wiedervorlageComp - .getAttachmentContainer() - .getList() - .getItem(TEST_FILE_WITH_CONTENT) - .getRoot(), - ); + notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITHOUT_CONTENT).getRoot()); + exist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getRoot()); }); }); describe('switch to wiedervorlage without attachments', () => { - const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = - wiedervorlageContainerInVorgang.getWiedervorlage(wiedervorlage.betreff); + const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage( + wiedervorlage.betreff, + ); it('should not show any attachments', () => { wiedervorlageComp.getLink().click(); waitForSpinnerToDisappear(); - notExist( - wiedervorlageComp - .getAttachmentContainer() - .getList() - .getItem(TEST_FILE_WITHOUT_CONTENT) - .getRoot(), - ); - notExist( - wiedervorlageComp - .getAttachmentContainer() - .getList() - .getItem(TEST_FILE_WITH_CONTENT) - .getRoot(), - ); + notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITHOUT_CONTENT).getRoot()); + notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getRoot()); wiedervorlagePage.getSubnavigation().navigateBack(); }); }); describe('Same number of attachments after status change', () => { - const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = - wiedervorlageContainerInVorgang.getWiedervorlage(WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF); + const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage( + WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF, + ); it('should open wiedervorlage page', () => { wait(500); @@ -332,10 +281,7 @@ describe('Wiedervorlage attachments', () => { waitForSpinnerToDisappear(); containClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); - contains( - snackBar.getMessage(), - `Die Wiedervorlage ${WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF} wurde erledigt`, - ); + contains(snackBar.getMessage(), `Die Wiedervorlage ${WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF} wurde erledigt`); }); it('should close snackBar on close', () => { @@ -350,10 +296,7 @@ describe('Wiedervorlage attachments', () => { waitForSpinnerToDisappear(); notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); - contains( - snackBar.getMessage(), - `Die Wiedervorlage ${WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF} wurde wiedereröffnet`, - ); + contains(snackBar.getMessage(), `Die Wiedervorlage ${WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF} wurde wiedereröffnet`); }); it('should close snackBar on close', () => { @@ -385,10 +328,7 @@ describe('Wiedervorlage attachments', () => { waitForSpinnerToDisappear(); exist(snackbar.getMessage()); - contains( - snackbar.getMessage(), - `Die Wiedervorlage "${WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF}" wurde gespeichert`, - ); + contains(snackbar.getMessage(), `Die Wiedervorlage "${WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF}" wurde gespeichert`); }); it('should close snackBar on close', () => { @@ -398,26 +338,15 @@ describe('Wiedervorlage attachments', () => { }); it('(Skip reason in OZG-4658) should have no attachments after save', () => { - const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = - wiedervorlageContainerInVorgang.getWiedervorlage(WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF); + const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage( + WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF, + ); wiedervorlageComp.getExpandButton(); wiedervorlageComp.expandItem(); - notExist( - wiedervorlageComp - .getAttachmentContainer() - .getList() - .getItem(TEST_FILE_WITHOUT_CONTENT) - .getRoot(), - ); - notExist( - wiedervorlageComp - .getAttachmentContainer() - .getList() - .getItem(TEST_FILE_WITH_CONTENT) - .getRoot(), - ); + notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITHOUT_CONTENT).getRoot()); + notExist(wiedervorlageComp.getAttachmentContainer().getList().getItem(TEST_FILE_WITH_CONTENT).getRoot()); }); }); }); diff --git a/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-container.component.spec.ts b/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-container.component.spec.ts index 379778effd26148200f2700038bb76a38fa23bb7..ccf5fe67622d5cfa056b44b26d29ceed6f4f09ef 100644 --- a/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-container.component.spec.ts +++ b/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-container.component.spec.ts @@ -4,6 +4,7 @@ import { mock, Mock } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { faker } from '@faker-js/faker'; import { expect } from '@jest/globals'; +import { Resource } from '@ngxp/rest'; import { cold } from 'jest-marbles'; import { MockComponent } from 'ng-mocks'; import { EMPTY, of } from 'rxjs'; @@ -37,41 +38,64 @@ describe('FileUploadListContainerComponent', () => { fixture.detectChanges(); }); - describe('component', () => { - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); + describe('component', () => { it('should have default value', () => { expect(component.listOrientation).toEqual(BinaryFileListOrientation.HORIZONTAL); }); - describe('ngOnInit', () => { + describe('set files resource', () => { + beforeEach(() => { + component._initFileList = jest.fn(); + }); + + it('should set value', () => { + const resource: Resource = createDummyResource(); + + component.filesResource = resource; + + expect(component._filesResource).toEqual(resource); + }); + + it('should init file list', () => { + component.filesResource = createDummyResource(); + + expect(component._initFileList).toHaveBeenCalled(); + }); + }); + + describe('_initFileList', () => { beforeEach(() => { binaryFileService.getFiles.mockReturnValue(EMPTY); }); describe('on existing files', () => { + const filesLinkRel = DummyLinkRel.DUMMY; + const filesResource: Resource = createDummyResource([filesLinkRel]); + beforeEach(() => { - component.filesResource = createDummyResource([DummyLinkRel.DUMMY]); - component.filesLinkRel = DummyLinkRel.DUMMY; + component.filesResource = filesResource; + component.filesLinkRel = filesLinkRel; component.fileUploadType = faker.word.noun(); }); it('should load existing files', () => { - component.filesResource = createDummyResource([DummyLinkRel.DUMMY]); - component.filesLinkRel = DummyLinkRel.DUMMY; + component.filesResource = filesResource; + component.filesLinkRel = filesLinkRel; - component.ngOnInit(); + component._initFileList(); - expect(binaryFileService.getFiles).toHaveBeenCalledWith(component.filesResource, component.filesLinkRel); + expect(binaryFileService.getFiles).toHaveBeenCalledWith(filesResource, filesLinkRel); }); it('should add loaded files', () => { const stateResource: StateResource<BinaryFileListResource> = createStateResource(createBinaryFileListResource()); binaryFileService.getFiles.mockReturnValue(of(stateResource)); - component.ngOnInit(); + component._initFileList(); component.uploadedFiles$.subscribe(); expect(binaryFileService.addFiles).toHaveBeenCalledWith( @@ -84,7 +108,7 @@ describe('FileUploadListContainerComponent', () => { const stateResource: StateResource<BinaryFileListResource> = createStateResource(createBinaryFileListResource()); binaryFileService.getFiles.mockReturnValue(of(stateResource)); - component.ngOnInit(); + component._initFileList(); component.uploadedFiles$.subscribe(); expect(binaryFileService.getUploadedFiles).toHaveBeenCalledWith(component.fileUploadType); @@ -96,26 +120,28 @@ describe('FileUploadListContainerComponent', () => { const uploadedFiles: UploadFile[] = [createUploadFile()]; binaryFileService.getUploadedFiles.mockReturnValue(cold('-a', { a: uploadedFiles })); - component.ngOnInit(); + component._initFileList(); expect(component.uploadedFiles$).toBeObservable(cold('a-b', { a: {}, b: uploadedFiles })); }); }); describe('on none existing files', () => { + const filesResource: Resource = createDummyResource(); + beforeEach(() => { - component.filesResource = createDummyResource(); + component.filesResource = filesResource; component.filesLinkRel = DummyLinkRel.DUMMY; }); it('should NOT load existing files', () => { - component.ngOnInit(); + component._initFileList(); expect(binaryFileService.getFiles).not.toHaveBeenCalled(); }); it('should get uploaded files', () => { - component.ngOnInit(); + component._initFileList(); expect(binaryFileService.getUploadedFiles).toHaveBeenCalledWith(component.fileUploadType); }); @@ -124,7 +150,7 @@ describe('FileUploadListContainerComponent', () => { const uploadFile: UploadFile = createUploadFile(); binaryFileService.getUploadedFiles = jest.fn().mockReturnValue(singleColdCompleted(uploadFile)); - component.ngOnInit(); + component._initFileList(); expect(component.uploadedFiles$).toBeObservable(singleColdCompleted(uploadFile)); }); diff --git a/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-container.component.ts b/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-container.component.ts index b469cf13efa570da4d4e4ca4374d4a75043592fb..406726ee4de247d678fe64489969016d1f1ed878 100644 --- a/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-container.component.ts +++ b/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-container.component.ts @@ -7,7 +7,7 @@ import { } from '@alfa-client/binary-file-shared'; import { getEmbeddedResources, isLoaded, StateResource } from '@alfa-client/tech-shared'; import { AsyncPipe } from '@angular/common'; -import { Component, inject, Input, OnInit } from '@angular/core'; +import { Component, inject, Input } from '@angular/core'; import { hasLink, Resource } from '@ngxp/rest'; import { filter, map, Observable, startWith, switchMap } from 'rxjs'; import { tap } from 'rxjs/operators'; @@ -20,19 +20,30 @@ import { FileUploadListComponent } from './file-upload-list/file-upload-list.com templateUrl: './file-upload-list-container.component.html', imports: [FileUploadListComponent, AsyncPipe], }) -export class FileUploadListContainerComponent implements OnInit { +export class FileUploadListContainerComponent { @Input() fileUploadType: string; @Input() parentFormArrayName: string; @Input() listOrientation: BinaryFileListOrientation = BinaryFileListOrientation.HORIZONTAL; - @Input() filesResource: Resource; - @Input() filesLinkRel: string; + + @Input() set filesResource(value: Resource) { + this._filesResource = value; + this._initFileList(); + } + + @Input() set filesLinkRel(value: string) { + this._filesLinkRel = value; + this._initFileList(); + } + private readonly binaryFileService: BinaryFileService = inject(BinaryFileService); public uploadedFiles$: Observable<UploadFileByIdentifier>; + _filesResource: Resource; + _filesLinkRel: string; - ngOnInit(): void { - if (hasLink(this.filesResource, this.filesLinkRel)) { - this.uploadedFiles$ = this.binaryFileService.getFiles(this.filesResource, this.filesLinkRel).pipe( + _initFileList(): void { + if (hasLink(this._filesResource, this._filesLinkRel)) { + this.uploadedFiles$ = this.binaryFileService.getFiles(this._filesResource, this._filesLinkRel).pipe( filter(isLoaded), map((files: StateResource<BinaryFileListResource>) => getEmbeddedResources(files, BinaryFileListLinkRel.FILE_LIST)), tap((binaryFileResources: BinaryFileResource[]) => diff --git a/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.html b/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.html index edb77f9c7dc133422248b79b4f99f1204900a46c..c6e0aa4b1713a6ba70cd5fa9ae98d8d5265c1f5d 100644 --- a/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.html +++ b/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.html @@ -5,7 +5,7 @@ [errorMessages]="uploadFile.uploadedFile.error | convertProblemDetailToErrorMessages" description="Anhang wird hochgeladen" [isLoading]="uploadFile.uploadedFile.loading" - data-test-id="file-upload-list-item-attachment-upload" + [attr.data-test-id]="(uploadFile.fileToUpload.name | convertForDataTest) + '-file-upload-list-item-attachment-upload'" ></ods-attachment> } @else if (uploadFile.uploadedFile.resource) { <ods-attachment-wrapper> @@ -13,7 +13,7 @@ [file]="uploadFile.uploadedFile.resource" [deletable]="true" (startDelete)="delete.emit({ key, binaryFileResource: $event })" - data-test-id="file-upload-list-item-uploaded" + [attr.data-test-id]="(uploadFile.uploadedFile.resource.name | convertForDataTest) + '-file-upload-list-item-uploaded'" > </alfa-binary-file2-container> </ods-attachment-wrapper> diff --git a/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.spec.ts b/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.spec.ts index f60c72fda9d26b37343f543116eee01113fc394b..8b1321620c75ccdb5cfeba566b46abdaead8fb95 100644 --- a/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.spec.ts +++ b/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.spec.ts @@ -1,6 +1,8 @@ import { BinaryFile2ContainerComponent, BinaryFileModule } from '@alfa-client/binary-file'; import { BinaryFileResource } from '@alfa-client/binary-file-shared'; import { + convertForDataTest, + ConvertForDataTestPipe, ConvertProblemDetailToErrorMessagesPipe, createEmptyStateResource, createErrorStateResource, @@ -29,12 +31,16 @@ describe('FileUploadListItemComponent', () => { let component: FileUploadListItemComponent; let fixture: ComponentFixture<FileUploadListItemComponent>; - const attachmentTestId: string = getDataTestIdOf('file-upload-list-item-attachment-upload'); - const binaryFileContainerTestId: string = getDataTestIdOf('file-upload-list-item-uploaded'); + const file: File = createFile(); + const binaryFileResource: BinaryFileResource = createBinaryFileResource(); + const attachmentTestId: string = getDataTestIdOf(convertForDataTest(file.name) + '-file-upload-list-item-attachment-upload'); + const binaryFileContainerTestId: string = getDataTestIdOf( + convertForDataTest(binaryFileResource.name) + '-file-upload-list-item-uploaded', + ); beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [FileUploadListItemComponent, ConvertProblemDetailToErrorMessagesPipe], + imports: [FileUploadListItemComponent, ConvertProblemDetailToErrorMessagesPipe, ConvertForDataTestPipe], declarations: [MockModule(BinaryFileModule), MockComponent(BinaryFile2ContainerComponent)], }).compileComponents(); @@ -50,8 +56,6 @@ describe('FileUploadListItemComponent', () => { }); describe('template', () => { - const file: File = createFile(); - beforeEach(() => { component.uploadFile.fileToUpload = file; }); @@ -74,7 +78,7 @@ describe('FileUploadListItemComponent', () => { }); it('should NOT exists on loaded', () => { - component.uploadFile.uploadedFile = createStateResource(createBinaryFileResource()); + component.uploadFile.uploadedFile = createStateResource(binaryFileResource); fixture.detectChanges(); @@ -82,7 +86,7 @@ describe('FileUploadListItemComponent', () => { }); it('should have inputs', () => { - component.uploadFile.fileToUpload = createFile(); + component.uploadFile.fileToUpload = file; component.uploadFile.uploadedFile = createEmptyStateResource(true); fixture.detectChanges(); @@ -97,7 +101,7 @@ describe('FileUploadListItemComponent', () => { describe('uploaded file', () => { it('should exists', () => { - component.uploadFile.uploadedFile = createStateResource(createBinaryFileResource()); + component.uploadFile.uploadedFile = createStateResource(binaryFileResource); fixture.detectChanges(); @@ -113,7 +117,7 @@ describe('FileUploadListItemComponent', () => { }); it('should have inputs', () => { - component.uploadFile.uploadedFile = createStateResource(createBinaryFileResource()); + component.uploadFile.uploadedFile = createStateResource(binaryFileResource); fixture.detectChanges(); @@ -131,7 +135,6 @@ describe('FileUploadListItemComponent', () => { it('should emit', () => { component.delete.emit = jest.fn(); component.key = 'test'; - const binaryFileResource: BinaryFileResource = createBinaryFileResource(); component.uploadFile.uploadedFile = createStateResource(binaryFileResource); fixture.detectChanges(); diff --git a/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.ts b/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.ts index 25527119bdaa6e87a88335557e8bf8e13054127d..854f6f0466ac5d5f8589c244f751ce2493e82f76 100644 --- a/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.ts +++ b/alfa-client/libs/binary-file/src/lib/file-upload-list-container/file-upload-list-item/file-upload-list-item.component.ts @@ -1,6 +1,6 @@ import { BinaryFileModule } from '@alfa-client/binary-file'; import { FileToDelete, UploadFile } from '@alfa-client/binary-file-shared'; -import { ConvertProblemDetailToErrorMessagesPipe } from '@alfa-client/tech-shared'; +import { ConvertForDataTestPipe, ConvertProblemDetailToErrorMessagesPipe } from '@alfa-client/tech-shared'; import { Component, EventEmitter, Input, Output } from '@angular/core'; import { AttachmentComponent, AttachmentWrapperComponent } from '@ods/system'; @@ -8,7 +8,13 @@ import { AttachmentComponent, AttachmentWrapperComponent } from '@ods/system'; selector: 'ods-file-upload-list-item', standalone: true, templateUrl: './file-upload-list-item.component.html', - imports: [AttachmentComponent, AttachmentWrapperComponent, BinaryFileModule, ConvertProblemDetailToErrorMessagesPipe], + imports: [ + AttachmentComponent, + AttachmentWrapperComponent, + BinaryFileModule, + ConvertProblemDetailToErrorMessagesPipe, + ConvertForDataTestPipe, + ], }) export class FileUploadListItemComponent { @Input() key: string; diff --git a/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.spec.ts b/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.spec.ts index 0620a5f50612f4eeb3243f599d57fc9e1d1e3353..dc42e69a0f52518ba01f5f3ddf2009ef04e344e9 100644 --- a/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.spec.ts +++ b/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.spec.ts @@ -1,7 +1,8 @@ -import { BinaryFileService, ToUploadFile } from '@alfa-client/binary-file-shared'; +import { BinaryFileService, FileUploadType, ToUploadFile } from '@alfa-client/binary-file-shared'; import { ConvertForDataTestPipe } from '@alfa-client/tech-shared'; import { existsAsHtmlElement, getElementComponentFromFixtureByCss, mock, Mock } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { faker } from '@faker-js/faker/.'; import { expect } from '@jest/globals'; import { getUrl, Resource } from '@ngxp/rest'; import { FileUploadButtonComponent, SpinnerIconComponent } from '@ods/system'; @@ -17,7 +18,8 @@ describe('MultiFileUploadEditorComponent', () => { let component: MultiFileUploadEditorComponent; let fixture: ComponentFixture<MultiFileUploadEditorComponent>; - const uploadLinkRel: string = 'upload'; + const fileUploadType: FileUploadType = faker.word.noun(); + const uploadLinkRel: string = faker.word.noun(); const uploadResource: Resource = createDummyResource([uploadLinkRel]); const buttonTestId: string = getDataTestIdOf('Ein_Label-file-upload-button'); @@ -58,6 +60,14 @@ describe('MultiFileUploadEditorComponent', () => { describe('component', () => { describe('ngOnInit', () => { + it('should get upload in progress', () => { + component.fileUploadType = fileUploadType; + + component.ngOnInit(); + + expect(binaryFileService.isUploadInProgress).toHaveBeenCalledWith(fileUploadType); + }); + it('should set upload in progress', () => { binaryFileService.isUploadInProgress = jest.fn().mockReturnValue(of(true)); diff --git a/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.ts b/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.ts index f69f78656a70336abe6b7a9cd72d8c12051177f4..4c057b3f3d7b52b25dc63164e62f06bb054b83c8 100644 --- a/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.ts +++ b/alfa-client/libs/binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component.ts @@ -1,6 +1,5 @@ import { BinaryFileModule } from '@alfa-client/binary-file'; import { BinaryFileService, FileUploadType } from '@alfa-client/binary-file-shared'; -import { KOMMENTAR_UPLOADED_ATTACHMENTS } from '@alfa-client/kommentar-shared'; import { ConvertForDataTestPipe } from '@alfa-client/tech-shared'; import { AsyncPipe } from '@angular/common'; import { Component, HostListener, inject, Input, OnInit } from '@angular/core'; @@ -39,7 +38,7 @@ export class MultiFileUploadEditorComponent implements OnInit { public readonly uploadButtonId: string = uniqueId(); ngOnInit(): void { - this.isUploadInProgress$ = this.binaryFileService.isUploadInProgress(KOMMENTAR_UPLOADED_ATTACHMENTS); + this.isUploadInProgress$ = this.binaryFileService.isUploadInProgress(this.fileUploadType); } @HostListener('change', ['$event.target.files']) diff --git a/alfa-client/libs/binary-file/src/lib/multi-file-upload/multi-file-upload.component.html b/alfa-client/libs/binary-file/src/lib/multi-file-upload/multi-file-upload.component.html new file mode 100644 index 0000000000000000000000000000000000000000..184ac868f9f594da443f6f89b969ce1cc85b1dfc --- /dev/null +++ b/alfa-client/libs/binary-file/src/lib/multi-file-upload/multi-file-upload.component.html @@ -0,0 +1,13 @@ +<ods-file-upload-list-container + [parentFormArrayName]="filesFormFieldName" + [fileUploadType]="fileUploadType" + [filesResource]="filesResource" + [filesLinkRel]="filesLinkRelation" + data-test-id="file-list" +></ods-file-upload-list-container> +<ods-multi-file-upload-editor + [fileUploadType]="fileUploadType" + [uploadResource]="uploadResource" + [uploadLinkRelation]="uploadLinkRelation" + data-test-id="multi-file-upload-editor" +></ods-multi-file-upload-editor> \ No newline at end of file diff --git a/alfa-client/libs/binary-file/src/lib/multi-file-upload/multi-file-upload.component.spec.ts b/alfa-client/libs/binary-file/src/lib/multi-file-upload/multi-file-upload.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..70679e7411aabf14b7d08d7bf855a40edc41242b --- /dev/null +++ b/alfa-client/libs/binary-file/src/lib/multi-file-upload/multi-file-upload.component.spec.ts @@ -0,0 +1,92 @@ +import { FileUploadListContainerComponent, MultiFileUploadEditorComponent } from '@alfa-client/binary-file'; +import { FileUploadType } from '@alfa-client/binary-file-shared'; +import { existsAsHtmlElement, getElementComponentFromFixtureByCss } from '@alfa-client/test-utils'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { faker } from '@faker-js/faker/.'; +import { expect } from '@jest/globals'; +import { Resource } from '@ngxp/rest'; +import { MockComponent } from 'ng-mocks'; +import { getDataTestIdOf } from '../../../../tech-shared/test/data-test'; +import { DummyLinkRel } from '../../../../tech-shared/test/dummy'; +import { createDummyResource } from '../../../../tech-shared/test/resource'; +import { MultiFileUploadComponent } from './multi-file-upload.component'; + +describe('MultiFileUploadComponent', () => { + let component: MultiFileUploadComponent; + let fixture: ComponentFixture<MultiFileUploadComponent>; + + const fileUploadListTestId: string = getDataTestIdOf('file-list'); + const fileUploadEditorTestId: string = getDataTestIdOf('multi-file-upload-editor'); + + const fileUploadType: FileUploadType = faker.word.noun(); + const uploadLinkRel: string = DummyLinkRel.DUMMY; + const uploadResource: Resource = createDummyResource(); + const filesLinkRel: string = DummyLinkRel.DUMMY; + const filesResource: Resource = createDummyResource(); + const formFieldsName: string = faker.word.noun(); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MultiFileUploadComponent], + declarations: [MockComponent(MultiFileUploadEditorComponent), MockComponent(FileUploadListContainerComponent)], + }).compileComponents(); + + fixture = TestBed.createComponent(MultiFileUploadComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('template', () => { + beforeEach(() => { + component.filesFormFieldName = formFieldsName; + component.fileUploadType = fileUploadType; + component.uploadResource = uploadResource; + component.uploadLinkRelation = uploadLinkRel; + component.filesResource = filesResource; + component.filesLinkRelation = filesLinkRel; + }); + + describe('file upload list', () => { + it('should exists', () => { + existsAsHtmlElement(fixture, fileUploadListTestId); + }); + + it('should have inputs', () => { + fixture.detectChanges(); + + const fileUploadListComponent: FileUploadListContainerComponent = getElementComponentFromFixtureByCss( + fixture, + fileUploadListTestId, + ); + + expect(fileUploadListComponent.parentFormArrayName).toEqual(formFieldsName); + expect(fileUploadListComponent.fileUploadType).toEqual(fileUploadType); + expect(fileUploadListComponent.filesResource).toEqual(filesResource); + expect(fileUploadListComponent.filesLinkRel).toEqual(filesLinkRel); + }); + }); + + describe('file upload editor', () => { + it('should exists', () => { + existsAsHtmlElement(fixture, fileUploadEditorTestId); + }); + + it('should have inputs', () => { + fixture.detectChanges(); + + const fileUploadEditorComponent: MultiFileUploadEditorComponent = getElementComponentFromFixtureByCss( + fixture, + fileUploadEditorTestId, + ); + + expect(fileUploadEditorComponent.fileUploadType).toEqual(fileUploadType); + expect(fileUploadEditorComponent.uploadResource).toEqual(uploadResource); + expect(fileUploadEditorComponent.uploadLinkRelation).toEqual(uploadLinkRel); + }); + }); + }); +}); diff --git a/alfa-client/libs/binary-file/src/lib/multi-file-upload/multi-file-upload.component.ts b/alfa-client/libs/binary-file/src/lib/multi-file-upload/multi-file-upload.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..56234cb550a4fdcaf31529f5a0af54457eb94623 --- /dev/null +++ b/alfa-client/libs/binary-file/src/lib/multi-file-upload/multi-file-upload.component.ts @@ -0,0 +1,22 @@ +import { FileUploadType } from '@alfa-client/binary-file-shared'; +import { Component, Input } from '@angular/core'; +import { Resource } from '@ngxp/rest'; +import { BinaryFileListOrientation } from '../directive/binary-file-list-orientation/binary-file-list-orientation.directive'; +import { FileUploadListContainerComponent } from '../file-upload-list-container/file-upload-list-container.component'; +import { MultiFileUploadEditorComponent } from '../multi-file-upload-editor/multi-file-upload-editor.component'; + +@Component({ + selector: 'ods-multi-file-upload', + standalone: true, + templateUrl: './multi-file-upload.component.html', + imports: [FileUploadListContainerComponent, MultiFileUploadEditorComponent], +}) +export class MultiFileUploadComponent { + @Input({ required: true }) filesFormFieldName: string; + @Input({ required: true }) fileUploadType: FileUploadType; + @Input({ required: true }) uploadResource: Resource; + @Input({ required: true }) uploadLinkRelation: string; + @Input({ required: true }) filesResource: Resource; + @Input({ required: true }) filesLinkRelation: string; + @Input() listOrientation: BinaryFileListOrientation = BinaryFileListOrientation.HORIZONTAL; +} diff --git a/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html b/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html index 8a5168bf1dc59de260e7e7a5ece9c9a6167153c1..ccb901c94fa17fc98518b6abfdd9e202058c2e8a 100644 --- a/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html +++ b/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html @@ -27,19 +27,14 @@ <ozgcloud-textarea-editor [formControlName]="formServiceClass.TEXT" label="Kommentar" [required]="true"> </ozgcloud-textarea-editor> - <ods-file-upload-list-container - [parentFormArrayName]="formServiceClass.FIELD_ATTACHMENTS" - [fileUploadType]="KOMMENTAR_UPLOADED_ATTACHMENTS" - [filesResource]="kommentar" - [filesLinkRel]="KommentarLinkRel.ATTACHMENTS" - data-test-id="kommentar-multi-file-upload-list" - ></ods-file-upload-list-container> - <ods-multi-file-upload-editor - [fileUploadType]="KOMMENTAR_UPLOADED_ATTACHMENTS" - [uploadResource]="kommentarListStateResource.resource" - [uploadLinkRelation]="kommentarListLinkRel.UPLOAD_FILE" - data-test-id="kommentar-multi-file-upload-editor" - ></ods-multi-file-upload-editor> + <ods-multi-file-upload + [filesFormFieldName]="formServiceClass.FIELD_ATTACHMENTS" + [fileUploadType]="KOMMENTAR_UPLOADED_ATTACHMENTS" + [uploadResource]="kommentarListStateResource.resource" + [uploadLinkRelation]="kommentarListLinkRel.UPLOAD_FILE" + [filesResource]="kommentar" + [filesLinkRelation]="KommentarLinkRel.ATTACHMENTS" + ></ods-multi-file-upload> <div class="buttons"> <ozgcloud-stroked-button-with-spinner diff --git a/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts b/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts index 15d300ef0ad665960ee7349b31d2678d60ac7c30..9753cc7fa2dafde144f13618d84c55a24b1bc1a3 100644 --- a/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts +++ b/alfa-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts @@ -21,11 +21,11 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { BinaryFileAttachmentContainerComponent, FileUploadListContainerComponent, MultiFileUploadEditorComponent, } from '@alfa-client/binary-file'; +import { BinaryFileAttachmentContainerComponent } from '@alfa-client/binary-file'; import { CommandResource } from '@alfa-client/command-shared'; -import { KOMMENTAR_UPLOADED_ATTACHMENTS, KommentarLinkRel, KommentarListLinkRel, KommentarListResource, KommentarService, } from '@alfa-client/kommentar-shared'; +import { KommentarLinkRel, KommentarListResource, KommentarService } from '@alfa-client/kommentar-shared'; import { createEmptyStateResource, createErrorStateResource, createStateResource, StateResource } from '@alfa-client/tech-shared'; -import { existsAsHtmlElement, getElementComponentFromFixtureByCss, Mock, mock, triggerEvent, useFromMock, } from '@alfa-client/test-utils'; +import { existsAsHtmlElement, Mock, mock, triggerEvent, useFromMock } from '@alfa-client/test-utils'; import { OzgcloudStrokedButtonWithSpinnerComponent, TextAreaEditorComponent } from '@alfa-client/ui'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; @@ -34,6 +34,7 @@ import { expect } from '@jest/globals'; import { MockComponent } from 'ng-mocks'; import { EMPTY, of } from 'rxjs'; import { createBinaryFileListResource } from '../../../../../binary-file-shared/test/binary-file'; +import { MultiFileUploadComponent } from '../../../../../binary-file/src/lib/multi-file-upload/multi-file-upload.component'; import { createSuccessfullyDoneCommandStateResource } from '../../../../../command-shared/test/command'; import { createKommentarListResource, createKommentarResource } from '../../../../../kommentar-shared/test/kommentar'; import { getDataTestIdOf } from '../../../../../tech-shared/test/data-test'; @@ -47,8 +48,6 @@ describe('KommentarFormComponent', () => { let fixture: ComponentFixture<KommentarFormComponent>; const cancelButtonTestId: string = getDataTestIdOf('cancel-button'); - const fileUploadListTestId: string = getDataTestIdOf('kommentar-multi-file-upload-list'); - const fileUploadEditorTestId: string = getDataTestIdOf('kommentar-multi-file-upload-editor'); const kommentarListStateResource: StateResource<KommentarListResource> = createStateResource(createKommentarListResource()); @@ -67,8 +66,7 @@ describe('KommentarFormComponent', () => { MockComponent(TextAreaEditorComponent), MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(BinaryFileAttachmentContainerComponent), - MockComponent(FileUploadListContainerComponent), - MockComponent(MultiFileUploadEditorComponent), + MockComponent(MultiFileUploadComponent), ], imports: [MatFormFieldModule, ReactiveFormsModule], providers: [ @@ -198,43 +196,6 @@ describe('KommentarFormComponent', () => { }); describe('template', () => { - describe('file upload list', () => { - it('should exists', () => { - existsAsHtmlElement(fixture, fileUploadListTestId); - }); - - it('should have inputs', () => { - fixture.detectChanges(); - - const fileUploadListComponent: FileUploadListContainerComponent = getElementComponentFromFixtureByCss( - fixture, - fileUploadListTestId, - ); - - expect(fileUploadListComponent.parentFormArrayName).toEqual(KommentarFormService.FIELD_ATTACHMENTS); - expect(fileUploadListComponent.fileUploadType).toEqual(KOMMENTAR_UPLOADED_ATTACHMENTS); - }); - }); - - describe('file upload editor', () => { - it('should exists', () => { - existsAsHtmlElement(fixture, fileUploadEditorTestId); - }); - - it('should have inputs', () => { - fixture.detectChanges(); - - const fileUploadEditorComponent: MultiFileUploadEditorComponent = getElementComponentFromFixtureByCss( - fixture, - fileUploadEditorTestId, - ); - - expect(fileUploadEditorComponent.fileUploadType).toEqual(KOMMENTAR_UPLOADED_ATTACHMENTS); - expect(fileUploadEditorComponent.uploadResource).toEqual(component.kommentarListStateResource.resource); - expect(fileUploadEditorComponent.uploadLinkRelation).toEqual(KommentarListLinkRel.UPLOAD_FILE); - }); - }); - describe('cancel button', () => { it('should exists', () => { existsAsHtmlElement(fixture, cancelButtonTestId); diff --git a/alfa-client/libs/kommentar/src/lib/kommentar.module.ts b/alfa-client/libs/kommentar/src/lib/kommentar.module.ts index 3a8e4dd40a4a53552567b81b69fad3af2c230312..70d991da2a329dee09ccc3758fe80305d0347434 100644 --- a/alfa-client/libs/kommentar/src/lib/kommentar.module.ts +++ b/alfa-client/libs/kommentar/src/lib/kommentar.module.ts @@ -32,6 +32,7 @@ import { NgModule } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; import { FileUploadListContainerComponent } from '../../../binary-file/src/lib/file-upload-list-container/file-upload-list-container.component'; import { MultiFileUploadEditorComponent } from '../../../binary-file/src/lib/multi-file-upload-editor/multi-file-upload-editor.component'; +import { MultiFileUploadComponent } from '../../../binary-file/src/lib/multi-file-upload/multi-file-upload.component'; import { KommentarFormComponent } from './kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component'; import { KommentarListInVorgangContainerComponent } from './kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component'; import { KommentarListInVorgangComponent } from './kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-in-vorgang.component'; @@ -46,6 +47,7 @@ import { KommentarListItemInVorgangComponent } from './kommentar-list-in-vorgang BinaryFileModule, MultiFileUploadEditorComponent, FileUploadListContainerComponent, + MultiFileUploadComponent, ReactiveFormsModule, TextAreaEditorComponent, OzgcloudStrokedButtonWithSpinnerComponent, diff --git a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.model.ts b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.model.ts index 2da311b309c80898da51eca6ee5aa04714b8bfff..a9fbef74f589c2a26460d6e0b600a09d01f9f8d7 100644 --- a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.model.ts +++ b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.model.ts @@ -36,8 +36,11 @@ export interface Wiedervorlage { } export interface WiedervorlageResource extends Wiedervorlage, Resource {} + export interface WiedervorlageListResource extends ListResource {} export interface BinaryFileListByWiedervorlageUri { [uri: ResourceUri]: BehaviorSubject<StateResource<BinaryFileListResource>>; } + +export const WIEDERVORLAGE_UPLOADED_ATTACHMENTS = 'wiedervorlage_uploaded_attachments'; diff --git a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts index b9cc7466f7eeb8425289ce68dc5e5fa0745a74bb..3b37f2ba12ba7a1fe70501e190a918d95d8d1430 100644 --- a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts +++ b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts @@ -21,49 +21,28 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { BinaryFileListResource, BinaryFileService } from '@alfa-client/binary-file-shared'; +import { BinaryFileService } from '@alfa-client/binary-file-shared'; import { CommandOrder, CommandResource, CommandService } from '@alfa-client/command-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; -import { - StateResource, - createEmptyStateResource, - createStateResource, - decodeUrlFromEmbedding, -} from '@alfa-client/tech-shared'; +import * as TechShared from '@alfa-client/tech-shared'; +import { createEmptyStateResource, createStateResource, decodeUrlFromEmbedding, StateResource } from '@alfa-client/tech-shared'; import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { SnackBarService } from '@alfa-client/ui'; -import { - VorgangResource, - VorgangService, - VorgangWithEingangResource, -} from '@alfa-client/vorgang-shared'; +import { VorgangResource, VorgangService, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { expect } from '@jest/globals'; import { getUrl } from '@ngxp/rest'; import { cold, hot } from 'jest-marbles'; -import { createBinaryFileListResource } from 'libs/binary-file-shared/test/binary-file'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; import { createCommandResource } from 'libs/command-shared/test/command'; -import { - createVorgangResource, - createVorgangWithEingangResource, -} from 'libs/vorgang-shared/test/vorgang'; -import { - createWiedervorlage, - createWiedervorlageListResource, - createWiedervorlageResource, -} from 'libs/wiedervorlage-shared/test/wiedervorlage'; +import { createVorgangResource, createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; +import { createWiedervorlage, createWiedervorlageListResource, createWiedervorlageResource, } from 'libs/wiedervorlage-shared/test/wiedervorlage'; import { of } from 'rxjs'; import { WiedervorlageLinkRel, WiedervorlageListLinkRel } from './wiedervorlage.linkrel'; import { WiedervorlageMessages } from './wiedervorlage.message'; -import { - Wiedervorlage, - WiedervorlageListResource, - WiedervorlageResource, -} from './wiedervorlage.model'; +import { Wiedervorlage, WIEDERVORLAGE_UPLOADED_ATTACHMENTS, WiedervorlageListResource, WiedervorlageResource, } from './wiedervorlage.model'; import { WiedervorlageRepository } from './wiedervorlage.repository'; import { WiedervorlageService } from './wiedervorlage.service'; -import * as TechShared from '@alfa-client/tech-shared'; - jest.mock('@alfa-client/tech-shared', () => mockAsEsModule('@alfa-client/tech-shared')); function mockAsEsModule(module: string) { @@ -86,9 +65,7 @@ describe('WiedervorlageService', () => { const wiedervorlageResource: WiedervorlageResource = createWiedervorlageResource(); const wiedervorlage: Wiedervorlage = createWiedervorlage(); const commandResource: CommandResource = createCommandResource(); - const commandResourceWithEffectedResourceLink: CommandResource = createCommandResource([ - CommandLinkRel.EFFECTED_RESOURCE, - ]); + const commandResourceWithEffectedResourceLink: CommandResource = createCommandResource([CommandLinkRel.EFFECTED_RESOURCE]); beforeEach(() => { repository = mock(WiedervorlageRepository); @@ -112,11 +89,9 @@ describe('WiedervorlageService', () => { describe('getWiedervorlageList', () => { const wiedervorlageList: WiedervorlageListResource = createWiedervorlageListResource(); - const wiedervorlageListStateResource: StateResource<WiedervorlageListResource> = - createStateResource(wiedervorlageList); + const wiedervorlageListStateResource: StateResource<WiedervorlageListResource> = createStateResource(wiedervorlageList); - const vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource> = - createStateResource(vorgangResource); + const vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource> = createStateResource(vorgangResource); beforeEach(() => { vorgangService.getVorgangWithEingang.mockReturnValue(of(vorgangWithEingangStateResource)); @@ -129,18 +104,12 @@ describe('WiedervorlageService', () => { }); it('should return values', () => { - vorgangService.getVorgangWithEingang.mockReturnValue( - hot('-a', { a: vorgangWithEingangStateResource }), - ); - service.wiedervorlageList$.asObservable = jest - .fn() - .mockReturnValue(hot('-a', { a: wiedervorlageListStateResource })); + vorgangService.getVorgangWithEingang.mockReturnValue(hot('-a', { a: vorgangWithEingangStateResource })); + service.wiedervorlageList$.asObservable = jest.fn().mockReturnValue(hot('-a', { a: wiedervorlageListStateResource })); const result = service.getWiedervorlageList(); - expect(result).toBeObservable( - cold('ab', { a: createEmptyStateResource(true), b: wiedervorlageListStateResource }), - ); + expect(result).toBeObservable(cold('ab', { a: createEmptyStateResource(true), b: wiedervorlageListStateResource })); }); it.skip('should call loadWiedervorlagenByVorgang if required', (done) => { @@ -159,9 +128,7 @@ describe('WiedervorlageService', () => { it('should NOT call loadWiedervorlagenByVorgang if already loaded', () => { service.loadWiedervorlagenByVorgang = jest.fn(); - service.wiedervorlageList$.asObservable = jest - .fn() - .mockReturnValue(of(wiedervorlageListStateResource)); + service.wiedervorlageList$.asObservable = jest.fn().mockReturnValue(of(wiedervorlageListStateResource)); service.getWiedervorlageList(); @@ -176,9 +143,7 @@ describe('WiedervorlageService', () => { createStateResource(wiedervorlageListResource); it('should return initial value', () => { - service.wiedervorlageList$.asObservable = jest - .fn() - .mockReturnValue(hot('-a', { a: wiedervorlageListResource })); + service.wiedervorlageList$.asObservable = jest.fn().mockReturnValue(hot('-a', { a: wiedervorlageListResource })); const result = service.getWiedervorlageListByGivenVorgang(vorgang); @@ -206,8 +171,7 @@ describe('WiedervorlageService', () => { describe('getWiedervorlage', () => { const wiedervorlage: WiedervorlageResource = createWiedervorlageResource(); - const wiedervorlageStateResource: StateResource<WiedervorlageResource> = - createStateResource(wiedervorlage); + const wiedervorlageStateResource: StateResource<WiedervorlageResource> = createStateResource(wiedervorlage); beforeEach(() => { navigationService.getDecodedParam.mockReturnValue(getUrl(wiedervorlageResource)); @@ -215,15 +179,11 @@ describe('WiedervorlageService', () => { }); it('should return initial values', () => { - service.wiedervorlage$.asObservable = jest - .fn() - .mockReturnValue(hot('-a', { a: wiedervorlageStateResource })); + service.wiedervorlage$.asObservable = jest.fn().mockReturnValue(hot('-a', { a: wiedervorlageStateResource })); const result = service.getWiedervorlage(); - expect(result).toBeObservable( - cold('ab', { a: createEmptyStateResource(true), b: wiedervorlageStateResource }), - ); + expect(result).toBeObservable(cold('ab', { a: createEmptyStateResource(true), b: wiedervorlageStateResource })); }); it('should set loading to true', () => { @@ -237,9 +197,7 @@ describe('WiedervorlageService', () => { it('should call navigationService', () => { service.getWiedervorlage().subscribe(); - expect(navigationService.getDecodedParam).toHaveBeenCalledWith( - WiedervorlageService.encodedWiedervorlageUriParam, - ); + expect(navigationService.getDecodedParam).toHaveBeenCalledWith(WiedervorlageService.encodedWiedervorlageUriParam); }); it('should call repository', () => { @@ -257,9 +215,7 @@ describe('WiedervorlageService', () => { describe('saveWiedervorlage', () => { beforeEach(() => { - commandService.createCommand.mockReturnValue( - of(createStateResource(commandResourceWithEffectedResourceLink)), - ); + commandService.createCommand.mockReturnValue(of(createStateResource(commandResourceWithEffectedResourceLink))); }); it('should return initial value and mapped value', () => { @@ -280,11 +236,10 @@ describe('WiedervorlageService', () => { it('should call command service', () => { service.saveWiedervorlage(wiedervorlageResource, wiedervorlage).subscribe(); - expect(commandService.createCommand).toHaveBeenCalledWith( - wiedervorlageResource, - WiedervorlageLinkRel.EDIT, - { order: CommandOrder.EDIT_WIEDERVORLAGE, body: wiedervorlage }, - ); + expect(commandService.createCommand).toHaveBeenCalledWith(wiedervorlageResource, WiedervorlageLinkRel.EDIT, { + order: CommandOrder.EDIT_WIEDERVORLAGE, + body: wiedervorlage, + }); }); it('should set submit-in-progress on loading', () => { @@ -300,10 +255,7 @@ describe('WiedervorlageService', () => { service.saveWiedervorlage(wiedervorlageResource, wiedervorlage).subscribe(); - const expectedMessage = WiedervorlageMessages.SAVED.replace( - '{betreff}', - wiedervorlage.betreff, - ); + const expectedMessage = WiedervorlageMessages.SAVED.replace('{betreff}', wiedervorlage.betreff); expect(service.proceedAfterReceiveCommand).toHaveBeenCalledWith( createStateResource(commandResourceWithEffectedResourceLink), expectedMessage, @@ -317,15 +269,11 @@ describe('WiedervorlageService', () => { }); it('should return intitial value and mapped value', () => { - commandService.createCommand.mockReturnValue( - hot('-a', { a: createStateResource(commandResource) }), - ); + commandService.createCommand.mockReturnValue(hot('-a', { a: createStateResource(commandResource) })); const result = service.createWiedervorlage(wiedervorlage); - expect(result).toBeObservable( - cold('ab', { a: createEmptyStateResource(true), b: createStateResource(commandResource) }), - ); + expect(result).toBeObservable(cold('ab', { a: createEmptyStateResource(true), b: createStateResource(commandResource) })); }); it('should set submit-in-progress on loading', () => { @@ -352,23 +300,18 @@ describe('WiedervorlageService', () => { service.createWiedervorlage(wiedervorlage).subscribe(); - const expectedMessage = WiedervorlageMessages.CREATED.replace( - '{betreff}', - wiedervorlage.betreff, - ); - expect(service.proceedAfterReceiveCommand).toHaveBeenCalledWith( - createStateResource(commandResource), - expectedMessage, - ); + const expectedMessage = WiedervorlageMessages.CREATED.replace('{betreff}', wiedervorlage.betreff); + expect(service.proceedAfterReceiveCommand).toHaveBeenCalledWith(createStateResource(commandResource), expectedMessage); }); }); describe('proceedAfterRecieveCommand', () => { + beforeEach(() => { + service.clearUploadedFiles = jest.fn(); + }); + it('should set reload on wiedervorlageList', () => { - service.proceedAfterReceiveCommand( - createStateResource(commandResourceWithEffectedResourceLink), - null, - ); + service.proceedAfterReceiveCommand(createStateResource(commandResourceWithEffectedResourceLink), null); expect(service.wiedervorlageList$.value.reload).toBe(true); }); @@ -383,15 +326,15 @@ describe('WiedervorlageService', () => { snackbarService.show = jest.fn(); const snackbarMessage: string = 'XX wurde XX'; - service.proceedAfterReceiveCommand( - createStateResource(commandResourceWithEffectedResourceLink), - snackbarMessage, - ); + service.proceedAfterReceiveCommand(createStateResource(commandResourceWithEffectedResourceLink), snackbarMessage); - expect(snackbarService.show).toHaveBeenCalledWith( - commandResourceWithEffectedResourceLink, - snackbarMessage, - ); + expect(snackbarService.show).toHaveBeenCalledWith(commandResourceWithEffectedResourceLink, snackbarMessage); + }); + + it('should clear uploaded files', () => { + service.proceedAfterReceiveCommand(createStateResource(commandResourceWithEffectedResourceLink), null); + + expect(service.clearUploadedFiles).toHaveBeenCalled(); }); }); @@ -399,24 +342,22 @@ describe('WiedervorlageService', () => { const wiedervorlageResource: WiedervorlageResource = createWiedervorlageResource(); beforeEach(() => { - commandService.createCommand.mockReturnValue( - of(createStateResource(commandResourceWithEffectedResourceLink)), - ); + commandService.createCommand.mockReturnValue(of(createStateResource(commandResourceWithEffectedResourceLink))); (<any>service).reloadWiedervorlageList = jest.fn(); (<any>service).loadAndSetWiedervorlageByUrl = jest.fn(); service.wiedervorlage$.next(createStateResource(wiedervorlageResource)); + service.clearUploadedFiles = jest.fn(); }); describe('wiedervorlage erledigen', () => { it('should call commandService', () => { service.erledigen(); - expect(commandService.createCommand).toHaveBeenCalledWith( - wiedervorlageResource, - WiedervorlageLinkRel.ERLEDIGEN, - { order: CommandOrder.WIEDERVORLAGE_ERLEDIGEN, body: null }, - ); + expect(commandService.createCommand).toHaveBeenCalledWith(wiedervorlageResource, WiedervorlageLinkRel.ERLEDIGEN, { + order: CommandOrder.WIEDERVORLAGE_ERLEDIGEN, + body: null, + }); }); it('should reload wiedervorlage', () => { @@ -433,17 +374,22 @@ describe('WiedervorlageService', () => { `Die Wiedervorlage ${wiedervorlageResource.betreff} wurde erledigt`, ); }); + + it('should clear uploaded files', () => { + service.erledigen(); + + expect(service.clearUploadedFiles).toHaveBeenCalled(); + }); }); describe('wiedervorlage wiedereroeffnen', () => { it('should call commandService', () => { service.wiedereroeffnen(); - expect(commandService.createCommand).toHaveBeenCalledWith( - wiedervorlageResource, - WiedervorlageLinkRel.WIEDEREROEFFNEN, - { order: CommandOrder.WIEDERVORLAGE_WIEDEREROEFFNEN, body: null }, - ); + expect(commandService.createCommand).toHaveBeenCalledWith(wiedervorlageResource, WiedervorlageLinkRel.WIEDEREROEFFNEN, { + order: CommandOrder.WIEDERVORLAGE_WIEDEREROEFFNEN, + body: null, + }); }); it('should reload wiedervorlage', () => { @@ -460,6 +406,12 @@ describe('WiedervorlageService', () => { `Die Wiedervorlage ${wiedervorlageResource.betreff} wurde wiedereröffnet`, ); }); + + it('should clear uploaded files', () => { + service.wiedereroeffnen(); + + expect(service.clearUploadedFiles).toHaveBeenCalled(); + }); }); }); @@ -467,9 +419,7 @@ describe('WiedervorlageService', () => { const message: string = 'SnackbarMessage'; it('should call service if command is done', () => { - const commandResource: CommandResource = createCommandResource([ - CommandLinkRel.EFFECTED_RESOURCE, - ]); + const commandResource: CommandResource = createCommandResource([CommandLinkRel.EFFECTED_RESOURCE]); service.showSnackBar(commandResource, message); @@ -491,7 +441,6 @@ describe('WiedervorlageService', () => { service.setWiedervorlageListReload = jest.fn(); (<any>service).forceWiedervorlageReload = jest.fn(); - service.clearAttachmentList = jest.fn(); service.clearWiedervorlagenList = jest.fn(); }); @@ -511,12 +460,6 @@ describe('WiedervorlageService', () => { expect((<any>service).forceWiedervorlageReload).toHaveBeenCalled(); }); - - it('should clear attachments', () => { - service.onNavigation({}); - - expect(service.clearAttachmentList).toHaveBeenCalled(); - }); }); describe('to vorgang list', () => { @@ -525,48 +468,6 @@ describe('WiedervorlageService', () => { expect(service.clearWiedervorlagenList).toHaveBeenCalled(); }); - - it('should clear attachments', () => { - service.onNavigation({}); - - expect(service.clearAttachmentList).toHaveBeenCalled(); - }); - }); - }); - - describe('load attachments', () => { - const binaryFileListResource: BinaryFileListResource = createBinaryFileListResource(); - const binaryFileStateResource: StateResource<BinaryFileListResource> = - createStateResource(binaryFileListResource); - - beforeEach(() => { - binaryFileService.getFiles.mockReturnValue(of(binaryFileStateResource)); - service.setAttachmentLoading = jest.fn(); - }); - - it('should set attachment state resource on loading', () => { - service.loadAttachments(wiedervorlageResource); - - expect(service.setAttachmentLoading).toHaveBeenCalledWith(wiedervorlageResource); - }); - - it('should call file service', () => { - service.loadAttachments(wiedervorlageResource); - - expect(binaryFileService.getFiles).toHaveBeenCalledWith( - wiedervorlageResource, - WiedervorlageLinkRel.ATTACHMENTS, - ); - }); - - it('should set loaded resource into state resource', () => { - service.loadAttachments(wiedervorlageResource); - - service.getAttachmentList(wiedervorlageResource); - const result: StateResource<BinaryFileListResource> = - service.attachmentListByWiedervorlage[getUrl(wiedervorlageResource)].value; - - expect(result).toEqual(binaryFileStateResource); }); }); @@ -618,4 +519,12 @@ describe('WiedervorlageService', () => { expect(repository.getWiedervorlage).toHaveBeenCalledWith(decodedUrl); }); }); + + describe('clearUploadedFiles', () => { + it('should call binary file service', () => { + service.clearUploadedFiles(); + + expect(binaryFileService.clearUploadedFiles).toHaveBeenCalledWith(WIEDERVORLAGE_UPLOADED_ATTACHMENTS); + }); + }); }); diff --git a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts index 691da275eaed51ea51269561b8c979daa388153a..38a7b041ad76c71ef06a78f5f7184a0260fd31f0 100644 --- a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts +++ b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts @@ -21,42 +21,21 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { BinaryFileListResource, BinaryFileService } from '@alfa-client/binary-file-shared'; -import { - CommandOrder, - CommandResource, - CommandService, - CreateCommand, - isDone, -} from '@alfa-client/command-shared'; +import { BinaryFileService } from '@alfa-client/binary-file-shared'; +import { CommandOrder, CommandResource, CommandService, CreateCommand, isDone } from '@alfa-client/command-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; -import { - StateResource, - createEmptyStateResource, - createStateResource, - decodeUrlFromEmbedding, - doIfLoadingRequired, - hasStateResourceError, - isNotNull, - isNotUndefined, - replacePlaceholder, -} from '@alfa-client/tech-shared'; +import { createEmptyStateResource, createStateResource, decodeUrlFromEmbedding, doIfLoadingRequired, hasStateResourceError, isNotNull, isNotUndefined, replacePlaceholder, StateResource, } from '@alfa-client/tech-shared'; import { SnackBarService } from '@alfa-client/ui'; import { VorgangHeaderLinkRel, VorgangResource, VorgangService } from '@alfa-client/vorgang-shared'; import { Injectable, OnDestroy } from '@angular/core'; import { Params } from '@angular/router'; -import { ResourceUri, getUrl, hasLink } from '@ngxp/rest'; +import { hasLink, ResourceUri } from '@ngxp/rest'; import { isEqual, isNil, isNull, isUndefined } from 'lodash-es'; -import { BehaviorSubject, Observable, Subscription, combineLatest } from 'rxjs'; +import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; import { filter, map, startWith, tap } from 'rxjs/operators'; import { WiedervorlageLinkRel, WiedervorlageListLinkRel } from './wiedervorlage.linkrel'; import { WiedervorlageMessages } from './wiedervorlage.message'; -import { - BinaryFileListByWiedervorlageUri, - Wiedervorlage, - WiedervorlageListResource, - WiedervorlageResource, -} from './wiedervorlage.model'; +import { Wiedervorlage, WIEDERVORLAGE_UPLOADED_ATTACHMENTS, WiedervorlageListResource, WiedervorlageResource, } from './wiedervorlage.model'; import { WiedervorlageRepository } from './wiedervorlage.repository'; import { WiedervorlageRoutes } from './wiedervorlage.route'; import { createErledigenCommand, createWiedereroeffnenCommand } from './wiedervorlage.util'; @@ -65,14 +44,12 @@ import { createErledigenCommand, createWiedereroeffnenCommand } from './wiedervo export class WiedervorlageService implements OnDestroy { static encodedWiedervorlageUriParam: string = 'wiedervorlageUrl'; - readonly wiedervorlageList$: BehaviorSubject<StateResource<WiedervorlageListResource>> = - new BehaviorSubject<StateResource<WiedervorlageListResource>>( - createEmptyStateResource<WiedervorlageListResource>(), - ); - readonly wiedervorlage$: BehaviorSubject<StateResource<WiedervorlageResource>> = - new BehaviorSubject<StateResource<WiedervorlageResource>>( - createEmptyStateResource<WiedervorlageResource>(), - ); + readonly wiedervorlageList$: BehaviorSubject<StateResource<WiedervorlageListResource>> = new BehaviorSubject< + StateResource<WiedervorlageListResource> + >(createEmptyStateResource<WiedervorlageListResource>()); + readonly wiedervorlage$: BehaviorSubject<StateResource<WiedervorlageResource>> = new BehaviorSubject< + StateResource<WiedervorlageResource> + >(createEmptyStateResource<WiedervorlageResource>()); readonly submitInProgress$: BehaviorSubject<StateResource<CommandResource>> = new BehaviorSubject< StateResource<CommandResource> @@ -81,15 +58,11 @@ export class WiedervorlageService implements OnDestroy { readonly erledigenCommand$: BehaviorSubject<StateResource<CommandResource>> = new BehaviorSubject< StateResource<CommandResource> >(createEmptyStateResource<CommandResource>()); - readonly wiedereroeffnenCommand$: BehaviorSubject<StateResource<CommandResource>> = - new BehaviorSubject<StateResource<CommandResource>>( - createEmptyStateResource<CommandResource>(), - ); - - attachmentListByWiedervorlage = <BinaryFileListByWiedervorlageUri>{}; + readonly wiedereroeffnenCommand$: BehaviorSubject<StateResource<CommandResource>> = new BehaviorSubject< + StateResource<CommandResource> + >(createEmptyStateResource<CommandResource>()); private subscription: Subscription; - private attachmentSubscription: Subscription; constructor( private repository: WiedervorlageRepository, @@ -103,15 +76,10 @@ export class WiedervorlageService implements OnDestroy { } public getWiedervorlageList(): Observable<StateResource<WiedervorlageListResource>> { - return combineLatest([ - this.wiedervorlageList$.asObservable(), - this.vorgangService.getVorgangWithEingang(), - ]).pipe( + return combineLatest([this.wiedervorlageList$.asObservable(), this.vorgangService.getVorgangWithEingang()]).pipe( tap(([wiedervorlageList, vorgangResource]) => { if (isNotNull(vorgangResource.resource)) { - doIfLoadingRequired(wiedervorlageList, () => - this.loadWiedervorlagenByVorgang(vorgangResource.resource), - ); + doIfLoadingRequired(wiedervorlageList, () => this.loadWiedervorlagenByVorgang(vorgangResource.resource)); } }), map(([wiedervorlageList]) => wiedervorlageList), @@ -122,22 +90,18 @@ export class WiedervorlageService implements OnDestroy { public getWiedervorlageListByGivenVorgang( vorgangResource: VorgangResource, ): Observable<StateResource<WiedervorlageListResource>> { - doIfLoadingRequired(this.wiedervorlageList$.value, () => - this.loadWiedervorlagenByVorgang(vorgangResource), - ); + doIfLoadingRequired(this.wiedervorlageList$.value, () => this.loadWiedervorlagenByVorgang(vorgangResource)); return this.wiedervorlageList$.asObservable(); } loadWiedervorlagenByVorgang(vorgangResource: VorgangResource): void { if (hasLink(vorgangResource, VorgangHeaderLinkRel.WIEDERVORLAGEN)) { - const subscription: Subscription = this.repository - .getWiedervorlageList(vorgangResource) - .subscribe((wiedervorlagenList) => { - if (!isNull(wiedervorlagenList)) { - this.setWiedervorlagenList(wiedervorlagenList); - subscription.unsubscribe(); - } - }); + const subscription: Subscription = this.repository.getWiedervorlageList(vorgangResource).subscribe((wiedervorlagenList) => { + if (!isNull(wiedervorlagenList)) { + this.setWiedervorlagenList(wiedervorlagenList); + subscription.unsubscribe(); + } + }); } else { this.clearWiedervorlagenList(); } @@ -152,10 +116,6 @@ export class WiedervorlageService implements OnDestroy { ); } - setWiedervorlageListLoading(): void { - this.wiedervorlageList$.next({ ...this.wiedervorlageList$.value, loading: true }); - } - setWiedervorlagenList(wiedervorlagenList: WiedervorlageListResource): void { this.wiedervorlageList$.next(createStateResource(wiedervorlagenList)); } @@ -176,26 +136,19 @@ export class WiedervorlageService implements OnDestroy { private loadAndSetWiedervorlageByUrl(url: ResourceUri): void { this.setWiedervorlageLoading(); - const subscription: Subscription = this.repository - .getWiedervorlage(url) - .subscribe((wiedervorlage) => { - this.wiedervorlage$.next(createStateResource(wiedervorlage)); - subscription.unsubscribe(); - }); + const subscription: Subscription = this.repository.getWiedervorlage(url).subscribe((wiedervorlage) => { + this.wiedervorlage$.next(createStateResource(wiedervorlage)); + subscription.unsubscribe(); + }); } public isNewWiedervorlage(): boolean { - return isEqual( - this.navigationService.getParam(WiedervorlageService.encodedWiedervorlageUriParam), - WiedervorlageRoutes.NEW, - ); + return isEqual(this.navigationService.getParam(WiedervorlageService.encodedWiedervorlageUriParam), WiedervorlageRoutes.NEW); } private listenToNavigation(): void { this.unsubscribe(); - this.subscription = this.navigationService - .urlChanged() - .subscribe((params) => this.onNavigation(params)); + this.subscription = this.navigationService.urlChanged().subscribe((params) => this.onNavigation(params)); } onNavigation(params: Params): void { @@ -203,19 +156,13 @@ export class WiedervorlageService implements OnDestroy { this.setWiedervorlageListReload(); this.forceWiedervorlageReload(); this.submitInProgress$.next(createEmptyStateResource<CommandResource>()); - this.clearAttachmentList(); } if (NavigationService.isVorgangListPage(params)) { this.clearWiedervorlagenList(); this.submitInProgress$.next(createEmptyStateResource<CommandResource>()); - this.clearAttachmentList(); } } - clearAttachmentList(): void { - this.attachmentListByWiedervorlage = <BinaryFileListByWiedervorlageUri>{}; - } - clearWiedervorlagenList(): void { this.wiedervorlageList$.next(createEmptyStateResource<WiedervorlageListResource>()); } @@ -232,30 +179,20 @@ export class WiedervorlageService implements OnDestroy { } private getWiedervorlageUri(): ResourceUri { - return this.navigationService.getDecodedParam( - WiedervorlageService.encodedWiedervorlageUriParam, - ); + return this.navigationService.getDecodedParam(WiedervorlageService.encodedWiedervorlageUriParam); } setWiedervorlageLoading(): void { this.wiedervorlage$.next({ ...this.wiedervorlage$.value, loading: true }); } - public createWiedervorlage( - wiedervorlage: Wiedervorlage, - ): Observable<StateResource<CommandResource>> { + public createWiedervorlage(wiedervorlage: Wiedervorlage): Observable<StateResource<CommandResource>> { this.setSubmitInProgressLoading(); - return this.createCreateWiedervorlageCommand( - this.wiedervorlageList$.value.resource, - wiedervorlage, - ).pipe( + return this.createCreateWiedervorlageCommand(this.wiedervorlageList$.value.resource, wiedervorlage).pipe( filter((commandStateResource) => !commandStateResource.loading), tap((commandStateResource) => - this.proceedAfterReceiveCommand( - commandStateResource, - this.buildMessage(WiedervorlageMessages.CREATED, wiedervorlage), - ), + this.proceedAfterReceiveCommand(commandStateResource, this.buildMessage(WiedervorlageMessages.CREATED, wiedervorlage)), ), startWith(createEmptyStateResource<CommandResource>(true)), ); @@ -285,10 +222,7 @@ export class WiedervorlageService implements OnDestroy { return this.createSaveWiedervorlageCommand(wiedervorlageResource, wiedervorlage).pipe( filter((commandStateResource) => !commandStateResource.loading), tap((commandStateResource) => - this.proceedAfterReceiveCommand( - commandStateResource, - this.buildMessage(WiedervorlageMessages.SAVED, wiedervorlage), - ), + this.proceedAfterReceiveCommand(commandStateResource, this.buildMessage(WiedervorlageMessages.SAVED, wiedervorlage)), ), startWith(createEmptyStateResource<CommandResource>(true)), ); @@ -313,10 +247,7 @@ export class WiedervorlageService implements OnDestroy { return { order: CommandOrder.EDIT_WIEDERVORLAGE, body: wiedervorlage }; } - proceedAfterReceiveCommand( - commandStateResource: StateResource<CommandResource>, - message: string, - ): void { + proceedAfterReceiveCommand(commandStateResource: StateResource<CommandResource>, message: string): void { this.submitInProgress$.next({ ...this.submitInProgress$.value, resource: commandStateResource.resource, @@ -325,6 +256,7 @@ export class WiedervorlageService implements OnDestroy { this.submitInProgress$.next(createStateResource(commandStateResource.resource)); this.snackbarService.show(commandStateResource.resource, message); this.setWiedervorlageListReload(); + this.clearUploadedFiles(); } else if (hasStateResourceError(commandStateResource)) { this.submitInProgress$.next(createStateResource(commandStateResource.resource)); } @@ -370,6 +302,7 @@ export class WiedervorlageService implements OnDestroy { this.buildMessage(snackBarMessage, this.wiedervorlage$.value.resource), ); commandStateSubj.next(commandStateResource); + this.clearUploadedFiles(); commandSubscription.unsubscribe(); } }); @@ -393,45 +326,6 @@ export class WiedervorlageService implements OnDestroy { } } - public getAttachmentList( - wiedervorlage: WiedervorlageResource, - ): Observable<StateResource<BinaryFileListResource>> { - const uri: ResourceUri = getUrl(wiedervorlage); - - if (isNil(this.attachmentListByWiedervorlage[uri])) { - this.attachmentListByWiedervorlage[uri] = new BehaviorSubject( - createEmptyStateResource<any>(), - ); - } else { - this.attachmentListByWiedervorlage[uri].next(createEmptyStateResource<any>()); - } - - doIfLoadingRequired(this.attachmentListByWiedervorlage[uri].value, () => - this.loadAttachments(wiedervorlage), - ); - - return this.attachmentListByWiedervorlage[uri].asObservable(); - } - - loadAttachments(wiedervorlage: WiedervorlageResource): void { - this.setAttachmentLoading(wiedervorlage); - if (!isNil(this.attachmentSubscription)) this.attachmentSubscription.unsubscribe(); - this.attachmentSubscription = this.binaryFileService - .getFiles(wiedervorlage, WiedervorlageLinkRel.ATTACHMENTS) - .subscribe((fileList) => { - if (fileList.loaded) { - this.attachmentListByWiedervorlage[getUrl(wiedervorlage)].next(fileList); - } - }); - } - - setAttachmentLoading(wiedervorlage: WiedervorlageResource): void { - this.attachmentListByWiedervorlage[getUrl(wiedervorlage)].next({ - ...this.attachmentListByWiedervorlage[getUrl(wiedervorlage)].value, - loading: true, - }); - } - public getSubmitInProgress(): Observable<StateResource<CommandResource>> { return this.submitInProgress$.asObservable(); } @@ -451,4 +345,8 @@ export class WiedervorlageService implements OnDestroy { .getWiedervorlage(decodedUrl) .pipe(map((wiedervorlage) => hasLink(wiedervorlage, WiedervorlageLinkRel.EDIT))); } + + public clearUploadedFiles(): void { + this.binaryFileService.clearUploadedFiles(WIEDERVORLAGE_UPLOADED_ATTACHMENTS); + } } diff --git a/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts b/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts index 5dfb7fa67a2f94ba32302be9866c2c8c5d0af972..e5090f94ee1d5a9a24dd5e603e10f726e03ef5e0 100644 --- a/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts +++ b/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts @@ -23,7 +23,7 @@ */ import { CommandResource } from '@alfa-client/command-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; -import { StateResource, createStateResource } from '@alfa-client/tech-shared'; +import { createStateResource, StateResource } from '@alfa-client/tech-shared'; import { mock } from '@alfa-client/test-utils'; import { OzgcloudStrokedButtonWithSpinnerComponent } from '@alfa-client/ui'; import { WiedervorlageService } from '@alfa-client/wiedervorlage-shared'; @@ -89,15 +89,15 @@ describe('SubmitWiedervorlageButtonComponent', () => { expect(component).toBeTruthy(); }); - describe('navigateIfCommandIsDone', () => { + describe('navigate if command is done', () => { it('should navigate on success', () => { - component.navigateIfCommandIsDone(commandWithError); + component._navigateIfCommandIsDone(commandWithError); expect(navigationService.navigateRelativeTo).toHaveBeenCalled(); }); it('should NOT navigate on loading', () => { - component.navigateIfCommandIsDone({ ...commandWithError, loading: true }); + component._navigateIfCommandIsDone({ ...commandWithError, loading: true }); expect(navigationService.navigateRelativeTo).toHaveBeenCalledWith('../../', activatedRoute); }); diff --git a/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.ts b/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.ts index 788e3229c23f99a1fe11f4d0b2c257e0bde00350..2aa76ca8705a9c54fc601aea707527e5e1a3f04e 100644 --- a/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.ts +++ b/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.ts @@ -52,11 +52,11 @@ export class SubmitWiedervorlageButtonComponent { submit(): void { this.submitInProgress$ = this.formService.submit().pipe( filter((command) => !command.loading), - tap((commandWithError) => this.navigateIfCommandIsDone(commandWithError)), + tap((commandWithError) => this._navigateIfCommandIsDone(commandWithError)), ); } - navigateIfCommandIsDone(command: StateResource<CommandResource>): void { + _navigateIfCommandIsDone(command: StateResource<CommandResource>): void { if (!command.loading && isDone(command.resource)) { this.navigateToVorgangDetailPage(); } diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.html b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.html deleted file mode 100644 index 8687a058f25e38cf8042c87506b1e181a4f43e76..0000000000000000000000000000000000000000 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.html +++ /dev/null @@ -1,31 +0,0 @@ -<!-- - - Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. - ---> -<alfa-vertical-binary-file-list - [binaryFileListStateResource]="attachments$ | async" - [deletable]="false" - data-test-id="wiedervorlage-attachment-list" -> -</alfa-vertical-binary-file-list> diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.scss b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.scss deleted file mode 100644 index 7648e3a3481646fbc80529a3a7b59e980b88eb1c..0000000000000000000000000000000000000000 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.scss +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -:host { - display: flex; - margin: 0 -4px; -} - -.attachments { - display: flex; - flex-wrap: wrap; -} diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.spec.ts b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.spec.ts deleted file mode 100644 index a462e5aa51ac4cddeebe82a611ece3bc0ae6ef3c..0000000000000000000000000000000000000000 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { ToEmbeddedResourcesPipe } from '@alfa-client/tech-shared'; -import { mock } from '@alfa-client/test-utils'; -import { WiedervorlageService } from '@alfa-client/wiedervorlage-shared'; -import { MockComponent } from 'ng-mocks'; -import { of } from 'rxjs'; -import { WiedervorlageAttachmentListContainerComponent } from './wiedervorlage-attachment-list-container.component'; -import { VerticalBinaryFileListComponent } from '@alfa-client/binary-file'; - -describe('WiedervorlageAttachmentListContainerComponent', () => { - let component: WiedervorlageAttachmentListContainerComponent; - let fixture: ComponentFixture<WiedervorlageAttachmentListContainerComponent>; - - const wiedervorlageService = { ...mock(WiedervorlageService), getAttachmentList: () => of(null) }; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ - WiedervorlageAttachmentListContainerComponent, - ToEmbeddedResourcesPipe, - MockComponent(VerticalBinaryFileListComponent), - ], - providers: [ - { - provide: WiedervorlageService, - useValue: wiedervorlageService, - }, - ], - }); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(WiedervorlageAttachmentListContainerComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.ts b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.ts deleted file mode 100644 index 93f9f0e59fb650f7074b4fe4223cecbf08a86292..0000000000000000000000000000000000000000 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; -import { BinaryFileListResource } from '@alfa-client/binary-file-shared'; -import { StateResource } from '@alfa-client/tech-shared'; -import { WiedervorlageResource, WiedervorlageService } from '@alfa-client/wiedervorlage-shared'; -import { Observable } from 'rxjs'; - -@Component({ - selector: 'alfa-wiedervorlage-attachment-list-container', - templateUrl: './wiedervorlage-attachment-list-container.component.html', - styleUrls: ['./wiedervorlage-attachment-list-container.component.scss'], -}) -export class WiedervorlageAttachmentListContainerComponent implements OnChanges { - @Input() wiedervorlage: WiedervorlageResource; - - attachments$: Observable<StateResource<BinaryFileListResource>>; - - constructor(public service: WiedervorlageService) {} - - ngOnChanges(changes: SimpleChanges): void { - if (changes.wiedervorlage) { - this.loadAttachments(); - } - } - - loadAttachments(): void { - this.attachments$ = this.service.getAttachmentList(this.wiedervorlage); - } -} diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.html b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.html index bdef88d210bb2d4b5e240b70f638a0efeb10c9e3..ee68f8fe3530ede164cfbc82544a053121a95cc8 100644 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.html +++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.html @@ -23,10 +23,7 @@ unter der Lizenz sind dem Lizenztext zu entnehmen. --> -<div - [attr.data-test-id]="wiedervorlageResource.betreff | convertForDataTest" - class="container text-sm" -> +<div [attr.data-test-id]="wiedervorlageResource.betreff | convertForDataTest" class="container text-sm"> <div class="row"> <alfa-wiedervorlage-status data-test-class="status" @@ -36,20 +33,18 @@ </alfa-wiedervorlage-status> <alfa-link-with-user-name-tooltip-container - *ngIf="wiedervorlageResource | hasLink: linkRel.EDIT; else content" + *ngIf="wiedervorlageResource | hasLink: WiedervorlageLinkRel.EDIT; else content" routerLinkString="wiedervorlage/{{ wiedervorlageResource | toResourceUri }}" [tooltipTemplate]="tooltip" [resource]="wiedervorlageResource" - [linkRel]="linkRel.CREATED_BY" + [linkRel]="WiedervorlageLinkRel.CREATED_BY" data-test-class="link" > <ng-container *ngTemplateOutlet="content"></ng-container> </alfa-link-with-user-name-tooltip-container> <ng-template #content> - <span class="date" data-test-class="frist">{{ - wiedervorlageResource.frist | formatToPrettyDate - }}</span> + <span class="date" data-test-class="frist">{{ wiedervorlageResource.frist | formatToPrettyDate }}</span> <span class="name" data-test-class="betreff">{{ wiedervorlageResource.betreff }}</span> </ng-template> @@ -67,16 +62,17 @@ [tooltipTemplate]="tooltip" [text]="wiedervorlageResource.beschreibung" [resource]="wiedervorlageResource" - [linkRel]="linkRel.CREATED_BY" + [linkRel]="WiedervorlageLinkRel.CREATED_BY" > </alfa-text-with-user-name-tooltip-container> - <alfa-wiedervorlage-attachment-list-container - *ngIf="wiedervorlageResource | hasLink: linkRel.ATTACHMENTS" - data-test-id="wiedervorlage-attachment-list-in-vorgang" - [wiedervorlage]="wiedervorlageResource" - class="attachments" - > - </alfa-wiedervorlage-attachment-list-container> + @if (wiedervorlageResource | hasLink: WiedervorlageLinkRel.ATTACHMENTS) { + <alfa-binary-file-list-container + [resource]="wiedervorlageResource" + [linkRel]="WiedervorlageLinkRel.ATTACHMENTS" + [listOrientation]="BinaryFileListOrientation.VERTICAL" + data-test-id="wiedervorlage-attachment-list-in-vorgang" + ></alfa-binary-file-list-container> + } </div> </div> diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts index 6673dc39b36123bb4d9bdd8bbb3e06e1e1dc2dc1..f4be1ef8b0b40d801398a057032c8b44020f97c4 100644 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts +++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts @@ -21,20 +21,10 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { - ConvertForDataTestPipe, - FormatToPrettyDatePipe, - HasLinkPipe, - ToResourceUriPipe, - ToTrafficLightTooltipPipe, - formatFullDate, -} from '@alfa-client/tech-shared'; +import { ConvertForDataTestPipe, formatFullDate, FormatToPrettyDatePipe, HasLinkPipe, ToResourceUriPipe, ToTrafficLightTooltipPipe, } from '@alfa-client/tech-shared'; import { dispatchEventFromFixture } from '@alfa-client/test-utils'; import { ExpansionPanelComponent } from '@alfa-client/ui'; -import { - LinkWithUserNameTooltipContainerComponent, - TextWithUserNameTooltipContainerComponent, -} from '@alfa-client/user-profile'; +import { LinkWithUserNameTooltipContainerComponent, TextWithUserNameTooltipContainerComponent } from '@alfa-client/user-profile'; import { WiedervorlageResource } from '@alfa-client/wiedervorlage-shared'; import { registerLocaleData } from '@angular/common'; import localeDe from '@angular/common/locales/de'; @@ -48,7 +38,6 @@ import { TooltipDirective } from '@ods/system'; import { createWiedervorlageResource } from 'libs/wiedervorlage-shared/test/wiedervorlage'; import { MockComponent, MockDirective } from 'ng-mocks'; import { WiedervorlageStatusComponent } from '../../../wiedervorlage-status/wiedervorlage-status.component'; -import { WiedervorlageAttachmentListContainerComponent } from './wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component'; import { WiedervorlageInVorgangExpandButtonComponent } from './wiedervorlage-in-vorgang-expand-button/wiedervorlage-in-vorgang-expand-button.component'; import { WiedervorlageInVorgangComponent } from './wiedervorlage-in-vorgang.component'; @@ -74,7 +63,6 @@ describe('WiedervorlageInVorgangComponent', () => { HasLinkPipe, MockComponent(ExpansionPanelComponent), MockComponent(WiedervorlageStatusComponent), - MockComponent(WiedervorlageAttachmentListContainerComponent), MockComponent(WiedervorlageInVorgangExpandButtonComponent), MockComponent(LinkWithUserNameTooltipContainerComponent), MockComponent(TextWithUserNameTooltipContainerComponent), diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.ts b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.ts index ee5f2a95c847513473d46821392820ff39650081..727acc5acd01ca8aac2eacb639f4780ecf5db9b3 100644 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.ts +++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.ts @@ -21,13 +21,10 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, Input, OnInit } from '@angular/core'; import { formatFullDate, replacePlaceholders } from '@alfa-client/tech-shared'; -import { - WiedervorlageLinkRel, - WiedervorlageMessages, - WiedervorlageResource, -} from '@alfa-client/wiedervorlage-shared'; +import { WiedervorlageLinkRel, WiedervorlageMessages, WiedervorlageResource } from '@alfa-client/wiedervorlage-shared'; +import { Component, Input, OnInit } from '@angular/core'; +import { BinaryFileListOrientation } from '../../../../../../binary-file/src/lib/directive/binary-file-list-orientation/binary-file-list-orientation.directive'; @Component({ selector: 'alfa-wiedervorlage-in-vorgang', @@ -40,7 +37,8 @@ export class WiedervorlageInVorgangComponent implements OnInit { tooltip: string; expanded: boolean; - readonly linkRel = WiedervorlageLinkRel; + public readonly WiedervorlageLinkRel = WiedervorlageLinkRel; + public readonly BinaryFileListOrientation = BinaryFileListOrientation; ngOnInit(): void { this.tooltip = this.formatTooltip(); diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.html b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.html index 014b5ba17d0289e7b339f6409cf0e32acb7b1194..d7c191e5c0ceca89a1123b107fa04c210d4a4938 100644 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.html +++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.html @@ -45,14 +45,14 @@ > </ozgcloud-date-editor> - <alfa-binary-file-attachment-container - data-test-id="wiedervorlage-attachment-list" - [existFiles]="attachments$ | async" - [formArrayName]="formServiceClass.FIELD_ATTACHMENTS" - [uploadStateResource]="wiedervorlageListStateResource" - [linkRelUploadAttachment]="wiedervorlageListLinkrel.UPLOAD_FILE" - > - </alfa-binary-file-attachment-container> + <ods-multi-file-upload + [filesFormFieldName]="formServiceClass.FIELD_ATTACHMENTS" + [fileUploadType]="WIEDERVORLAGE_UPLOADED_ATTACHMENTS" + [uploadResource]="wiedervorlageListStateResource.resource" + [uploadLinkRelation]="WiedervorlageListLinkRel.UPLOAD_FILE" + [filesResource]="wiedervorlage" + [filesLinkRelation]="WiedervorlageLinkRel.ATTACHMENTS" + ></ods-multi-file-upload> <alfa-submit-wiedervorlage-button class="submit-button"></alfa-submit-wiedervorlage-button> </form> diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.spec.ts b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.spec.ts index f7dfb80e9b4ab4478fc2063574cda7411e15498d..014466c7f15afb5a0ca42498b5f7f4db16f7f36e 100644 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.spec.ts +++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.spec.ts @@ -22,17 +22,16 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { BinaryFileAttachmentContainerComponent } from '@alfa-client/binary-file'; -import { BinaryFileListResource } from '@alfa-client/binary-file-shared'; +import { createStateResource, StateResource } from '@alfa-client/tech-shared'; import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { DateEditorComponent, OzgcloudTextEditorComponent, TextAreaEditorComponent } from '@alfa-client/ui'; -import { WiedervorlageLinkRel, WiedervorlageResource, WiedervorlageService } from '@alfa-client/wiedervorlage-shared'; +import { WiedervorlageListResource, WiedervorlageResource, WiedervorlageService } from '@alfa-client/wiedervorlage-shared'; import { SimpleChanges } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms'; -import { createBinaryFileListResource } from 'libs/binary-file-shared/test/binary-file'; -import { createWiedervorlageResource } from 'libs/wiedervorlage-shared/test/wiedervorlage'; +import { createWiedervorlageListResource, createWiedervorlageResource } from 'libs/wiedervorlage-shared/test/wiedervorlage'; import { MockComponent } from 'ng-mocks'; -import { of } from 'rxjs'; +import { MultiFileUploadComponent } from '../../../../../../binary-file/src/lib/multi-file-upload/multi-file-upload.component'; import { SubmitWiedervorlageButtonComponent } from '../../../submit-wiedervorlage-button/submit-wiedervorlage-button.component'; import { WiedervorlageFormComponent } from './wiedervorlage-form.component'; import { WiedervorlageFormService } from './wiedervorlage.formservice'; @@ -44,6 +43,9 @@ describe('WiedervorlageFormComponent', () => { const formService = new WiedervorlageFormService(new UntypedFormBuilder(), useFromMock(mock(WiedervorlageService))); const wiedervorlageService: Mock<WiedervorlageService> = mock(WiedervorlageService); const wiedervorlage: WiedervorlageResource = createWiedervorlageResource(); + const wiedervorlaeListStateResource: StateResource<WiedervorlageListResource> = createStateResource( + createWiedervorlageListResource(), + ); beforeEach(async () => { await TestBed.configureTestingModule({ @@ -54,6 +56,7 @@ describe('WiedervorlageFormComponent', () => { MockComponent(TextAreaEditorComponent), MockComponent(BinaryFileAttachmentContainerComponent), MockComponent(SubmitWiedervorlageButtonComponent), + MockComponent(MultiFileUploadComponent), ], imports: [ReactiveFormsModule], providers: [ @@ -74,6 +77,7 @@ describe('WiedervorlageFormComponent', () => { fixture = TestBed.createComponent(WiedervorlageFormComponent); component = fixture.componentInstance; + component.wiedervorlageListStateResource = wiedervorlaeListStateResource; fixture.detectChanges(); }); @@ -87,7 +91,6 @@ describe('WiedervorlageFormComponent', () => { beforeEach(() => { component.wiedervorlage = wiedervorlage; component.patchWiedervorlage = jest.fn(); - component.updateAttachments = jest.fn(); }); it('should call patchWiedervorlage', () => { @@ -95,37 +98,6 @@ describe('WiedervorlageFormComponent', () => { expect(component.patchWiedervorlage).toHaveBeenCalled(); }); - - it('should call updateAttachments', () => { - component.ngOnChanges(simpleChanges); - - expect(component.updateAttachments).toHaveBeenCalled(); - }); - }); - - describe('updateAttachments', () => { - const binaryFileListResource: BinaryFileListResource = createBinaryFileListResource(); - - beforeEach(() => { - wiedervorlageService.getAttachmentList.mockReturnValue(of(binaryFileListResource)); - }); - - it('should call wiedervorlage service to get attachments if links exists', () => { - const wiedervorlageWithAttachments: WiedervorlageResource = createWiedervorlageResource([WiedervorlageLinkRel.ATTACHMENTS]); - component.wiedervorlage = wiedervorlageWithAttachments; - - component.updateAttachments(); - - expect(wiedervorlageService.getAttachmentList).toHaveBeenCalledWith(wiedervorlageWithAttachments); - }); - - it('should NOT call wiedervorlage service if link is not present', () => { - component.wiedervorlage = wiedervorlage; - - component.updateAttachments(); - - expect(wiedervorlageService.getAttachmentList).not.toHaveBeenCalledWith(wiedervorlage); - }); }); describe('patch wiedervorlage', () => { diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.ts b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.ts index 06cc5576e632fbde55113894af5e653247ac1780..24f0d1af790e44119b13eb4fd6d5a4d9acb58f0d 100644 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.ts +++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-form/wiedervorlage-form.component.ts @@ -21,20 +21,10 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; -import { BinaryFileListLinkRel, BinaryFileResource } from '@alfa-client/binary-file-shared'; -import { StateResource, getEmbeddedResources, isNotNil } from '@alfa-client/tech-shared'; -import { - WiedervorlageLinkRel, - WiedervorlageListLinkRel, - WiedervorlageListResource, - WiedervorlageResource, - WiedervorlageService, -} from '@alfa-client/wiedervorlage-shared'; -import { hasLink } from '@ngxp/rest'; +import { isNotNil, StateResource } from '@alfa-client/tech-shared'; +import { WIEDERVORLAGE_UPLOADED_ATTACHMENTS, WiedervorlageLinkRel, WiedervorlageListLinkRel, WiedervorlageListResource, WiedervorlageResource, } from '@alfa-client/wiedervorlage-shared'; +import { Component, inject, Input, OnChanges, SimpleChanges } from '@angular/core'; import { isNull } from 'lodash-es'; -import { Observable, of } from 'rxjs'; -import { map } from 'rxjs/operators'; import { WiedervorlageFormService } from './wiedervorlage.formservice'; //TODO Container Component zwischenschalten @@ -47,39 +37,19 @@ export class WiedervorlageFormComponent implements OnChanges { @Input() wiedervorlageListStateResource: StateResource<WiedervorlageListResource>; @Input() wiedervorlage: WiedervorlageResource; - attachments$: Observable<BinaryFileResource[]> = of([]); + public readonly formService = inject(WiedervorlageFormService); - readonly formServiceClass = WiedervorlageFormService; - readonly wiedervorlageListLinkrel = WiedervorlageListLinkRel; - - constructor( - public formService: WiedervorlageFormService, - private wiedervorlageService: WiedervorlageService, - ) {} + public readonly formServiceClass = WiedervorlageFormService; + public readonly WiedervorlageListLinkRel = WiedervorlageListLinkRel; + public readonly WiedervorlageLinkRel = WiedervorlageLinkRel; + public readonly WIEDERVORLAGE_UPLOADED_ATTACHMENTS = WIEDERVORLAGE_UPLOADED_ATTACHMENTS; ngOnChanges(changes: SimpleChanges): void { if (changes.wiedervorlage && isNotNil(this.wiedervorlage)) { - this.updateAttachments(); this.patchWiedervorlage(); } } - updateAttachments(): void { - if (hasLink(this.wiedervorlage, WiedervorlageLinkRel.ATTACHMENTS)) { - this.attachments$ = this.wiedervorlageService - .getAttachmentList(this.wiedervorlage) - .pipe( - map((attachmentList) => - getEmbeddedResources<BinaryFileResource>( - attachmentList, - BinaryFileListLinkRel.FILE_LIST, - ), - ), - ); - } else { - this.attachments$ = of([]); - } - } patchWiedervorlage(): void { if (!isNull(this.wiedervorlage)) { this.formService.patch(this.wiedervorlage); diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage.module.ts b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage.module.ts index 2057849d9d85c3365877c9d58fd022a8137029dc..7fe2f1babb5a64816093254a75dd52cfe1b6fb3e 100644 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage.module.ts +++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage.module.ts @@ -22,26 +22,8 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { BinaryFileModule } from '@alfa-client/binary-file'; -import { - ConvertForDataTestPipe, - FormatToPrettyDatePipe, - HasLinkPipe, - ToEmbeddedResourcesPipe, - ToResourceUriPipe, - ToTrafficLightPipe, - ToTrafficLightTooltipPipe, -} from '@alfa-client/tech-shared'; -import { - BackButtonComponent, - DateEditorComponent, - ExpansionPanelComponent, - IconButtonWithSpinnerComponent, - OzgcloudStrokedButtonWithSpinnerComponent, - OzgcloudTextEditorComponent, - SpinnerComponent, - SubnavigationComponent, - TextAreaEditorComponent, -} from '@alfa-client/ui'; +import { ConvertForDataTestPipe, FormatToPrettyDatePipe, HasLinkPipe, ToEmbeddedResourcesPipe, ToResourceUriPipe, ToTrafficLightPipe, ToTrafficLightTooltipPipe, } from '@alfa-client/tech-shared'; +import { BackButtonComponent, DateEditorComponent, ExpansionPanelComponent, IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent, OzgcloudTextEditorComponent, SpinnerComponent, SubnavigationComponent, TextAreaEditorComponent, } from '@alfa-client/ui'; import { UserProfileModule } from '@alfa-client/user-profile'; import { VorgangSharedModule } from '@alfa-client/vorgang-shared'; import { VorgangSharedUiModule } from '@alfa-client/vorgang-shared-ui'; @@ -52,20 +34,14 @@ import { MatIcon } from '@angular/material/icon'; import { MatTooltip } from '@angular/material/tooltip'; import { RouterModule, Routes } from '@angular/router'; import { ButtonWithSpinnerComponent } from '@ods/component'; -import { - CheckCircleIconComponent, - PlusIconComponent, - SaveIconComponent, - TooltipDirective, - UpdateIconComponent, -} from '@ods/system'; +import { CheckCircleIconComponent, PlusIconComponent, SaveIconComponent, TooltipDirective, UpdateIconComponent, } from '@ods/system'; +import { MultiFileUploadComponent } from '../../../binary-file/src/lib/multi-file-upload/multi-file-upload.component'; import { CreateWiedervorlageButtonContainerComponent } from './create-wiedervorlage-button-container/create-wiedervorlage-button-container.component'; import { ErledigenButtonContainerComponent } from './erledigen-button-container/erledigen-button-container.component'; import { SubmitWiedervorlageButtonComponent } from './submit-wiedervorlage-button/submit-wiedervorlage-button.component'; import { WiedereroeffnenButtonContainerComponent } from './wiedereroeffnen-button-container/wiedereroeffnen-button-container.component'; import { WiedervorlageListInVorgangContainerComponent } from './wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang-container.component'; import { WiedervorlageCreateButtonComponent } from './wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component'; -import { WiedervorlageAttachmentListContainerComponent } from './wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-attachment-list-container/wiedervorlage-attachment-list-container.component'; import { WiedervorlageInVorgangExpandButtonComponent } from './wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang-expand-button/wiedervorlage-in-vorgang-expand-button.component'; import { WiedervorlageInVorgangComponent } from './wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component'; import { WiedervorlageListInVorgangComponent } from './wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-list-in-vorgang.component'; @@ -121,6 +97,7 @@ const routes: Routes = [ PlusIconComponent, CheckCircleIconComponent, SaveIconComponent, + MultiFileUploadComponent, ], declarations: [ WiedervorlagePageComponent, @@ -138,7 +115,6 @@ const routes: Routes = [ WiedereroeffnenButtonContainerComponent, ErledigenButtonContainerComponent, CreateWiedervorlageButtonContainerComponent, - WiedervorlageAttachmentListContainerComponent, WiedervorlageBreadcrumbContainerComponent, WiedervorlageInVorgangExpandButtonComponent, ],