Skip to content
Snippets Groups Projects
Commit 6af04818 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-3625 OZG-3983 Execute deletion (WIP)

parent 6a03566d
Branches
Tags
No related merge requests found
Showing
with 411 additions and 7 deletions
......@@ -74,7 +74,8 @@ export enum CommandOrder {
VORGANG_ZURUECKSTELLEN = 'VORGANG_ZURUECKSTELLEN',
VORGANG_ABSCHLIESSEN = 'VORGANG_ABSCHLIESSEN',
VORGANG_WIEDEREROEFFNEN = 'VORGANG_WIEDEREROEFFNEN',
VORGANG_ZUM_LOESCHEN_MARKIEREN = 'VORGANG_ZUM_LOESCHEN_MARKIEREN'
VORGANG_ZUM_LOESCHEN_MARKIEREN = 'VORGANG_ZUM_LOESCHEN_MARKIEREN',
VORGANG_LOESCHEN = 'VORGANG_LOESCHEN'
}
export enum CommandOrderType {
......
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2632_33815)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.4866 13V3.11101H12.1905L7.49777 8.05811L7.49777 13H5.5V8.05811C5.5 7.49738 5.71112 6.95968 6.0868 6.56365L10.7796 1.61654C11.1541 1.22173 11.6615 1 12.1905 1H17.4866C18.5899 1 19.4844 1.94513 19.4844 3.11101V13H17.4866Z" fill="#202020"/>
<path d="M7.5 20C7.5 19.4477 7.94772 19 8.5 19V19C9.05228 19 9.5 19.4477 9.5 20V20C9.5 20.5523 9.05228 21 8.5 21V21C7.94772 21 7.5 20.5523 7.5 20V20Z" fill="#202020"/>
<path d="M7.5 20C7.5 19.4477 7.94772 19 8.5 19V19C9.05228 19 9.5 19.4477 9.5 20V20C9.5 20.5523 9.05228 21 8.5 21V21C7.94772 21 7.5 20.5523 7.5 20V20Z" fill="#202020"/>
<path d="M11.5 21C11.5 20.4477 11.9477 20 12.5 20V20C13.0523 20 13.5 20.4477 13.5 21V22C13.5 22.5523 13.0523 23 12.5 23V23C11.9477 23 11.5 22.5523 11.5 22V21Z" fill="#202020"/>
<path d="M11.5 21C11.5 20.4477 11.9477 20 12.5 20V20C13.0523 20 13.5 20.4477 13.5 21V22C13.5 22.5523 13.0523 23 12.5 23V23C11.9477 23 11.5 22.5523 11.5 22V21Z" fill="#202020"/>
<path d="M11.5 13C11.5 12.4477 11.9477 12 12.5 12V12C13.0523 12 13.5 12.4477 13.5 13V17C13.5 17.5523 13.0523 18 12.5 18V18C11.9477 18 11.5 17.5523 11.5 17V13Z" fill="#202020"/>
<path d="M11.5 13C11.5 12.4477 11.9477 12 12.5 12V12C13.0523 12 13.5 12.4477 13.5 13V17C13.5 17.5523 13.0523 18 12.5 18V18C11.9477 18 11.5 17.5523 11.5 17V13Z" fill="#202020"/>
<path d="M7.5 15C7.5 14.4477 7.94772 14 8.5 14V14C9.05228 14 9.5 14.4477 9.5 15V16C9.5 16.5523 9.05228 17 8.5 17V17C7.94772 17 7.5 16.5523 7.5 16V15Z" fill="#202020"/>
<path d="M7.5 15C7.5 14.4477 7.94772 14 8.5 14V14C9.05228 14 9.5 14.4477 9.5 15V16C9.5 16.5523 9.05228 17 8.5 17V17C7.94772 17 7.5 16.5523 7.5 16V15Z" fill="#202020"/>
<path d="M15.5 20C15.5 19.4477 15.9477 19 16.5 19V19C17.0523 19 17.5 19.4477 17.5 20V21C17.5 21.5523 17.0523 22 16.5 22V22C15.9477 22 15.5 21.5523 15.5 21V20Z" fill="#202020"/>
<path d="M15.5 20C15.5 19.4477 15.9477 19 16.5 19V19C17.0523 19 17.5 19.4477 17.5 20V21C17.5 21.5523 17.0523 22 16.5 22V22C15.9477 22 15.5 21.5523 15.5 21V20Z" fill="#202020"/>
<path d="M15.5 15C15.5 14.4477 15.9477 14 16.5 14V14C17.0523 14 17.5 14.4477 17.5 15V16C17.5 16.5523 17.0523 17 16.5 17V17C15.9477 17 15.5 16.5523 15.5 16V15Z" fill="#202020"/>
<path d="M15.5 15C15.5 14.4477 15.9477 14 16.5 14V14C17.0523 14 17.5 14.4477 17.5 15V16C17.5 16.5523 17.0523 17 16.5 17V17C15.9477 17 15.5 16.5523 15.5 16V15Z" fill="#202020"/>
</g>
<defs>
<clipPath id="clip0_2632_33815">
<rect width="24" height="24" fill="white" transform="translate(0.5)"/>
</clipPath>
</defs>
</svg>
......@@ -25,6 +25,7 @@ export enum Icons {
ACCOUNT_OUTLINE = 'account_outline',
ASSIGNMENT_IND = 'assignment_ind',
AZ = 'az',
DELETE_FINALLY = 'delete_finally',
DISCARD_DOCUMENT = 'discard_document',
EDIT = 'edit',
INCOMING = 'incoming',
......
export interface BasicDialogData {
title: string;
message: string;
okText: string;
okSvgIcon: string;
}
\ No newline at end of file
<h1 mat-dialog-title data-test-id="dialog-header">{{ data.title }}</h1>
<div mat-dialog-content>
<p>{{ data.message }}</p>
</div>
<div mat-dialog-actions>
<goofy-client-button-with-spinner
[mat-dialog-close]="true"
svgIcon="{{ data.okSvgIcon }}"
text="{{ data.okText }}">
</goofy-client-button-with-spinner>
<button mat-stroked-button (click)="onNoClick()">Abbrechen</button>
</div>
\ No newline at end of file
@use 'sass:map';
@use '@angular/material' as mat;
$primaryPalette: mat.define-palette(mat.$blue-palette, 800, 500, 900);
button, h1 {
color: mat.get-color-from-palette($primaryPalette);
}
button {
margin-left: 1rem;
}
\ No newline at end of file
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatIcon } from '@angular/material/icon';
import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule as MatDialogModule, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
import { MockComponent } from 'ng-mocks';
import { BasicDialogComponent } from './basic-dialog.component';
describe('BasicDialogComponent', () => {
let component: BasicDialogComponent;
let fixture: ComponentFixture<BasicDialogComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [
MatDialogModule
],
declarations: [
BasicDialogComponent,
MatIcon,
MockComponent(ButtonWithSpinnerComponent),
MockComponent(IconButtonWithSpinnerComponent),
],
providers: [
{
provide: MatDialogRef,
useValue: {}
}, {
provide: MAT_DIALOG_DATA,
useValue: { }
}
]
}).compileComponents();
fixture = TestBed.createComponent(BasicDialogComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
describe('onNoClick', () => {
it('should call dialogRef.close', () => {
component.dialogRef.close = jest.fn();
component.onNoClick();
expect(component.dialogRef.close).toHaveBeenCalled();
})
})
});
import { Component, Inject } from '@angular/core';
import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
import { BasicDialogData } from './basic-dialog-data.model';
@Component({
selector: 'goofy-client-basic-dialog',
templateUrl: './basic-dialog.component.html',
styleUrls: ['./basic-dialog.component.scss'],
})
export class BasicDialogComponent {
constructor(
public dialogRef: MatDialogRef<BasicDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: BasicDialogData,
) {}
onNoClick(): void {
this.dialogRef.close();
}
}
......@@ -25,6 +25,7 @@ import { TestBed } from '@angular/core/testing';
import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { ApiError } from '@goofy-client/tech-shared';
import { createApiError } from 'libs/tech-shared/test/error';
import { BasicDialogComponent } from '../basic-dialog/basic-dialog.component';
import { DialogService } from '../dialog/dialog.service';
import { FixedDialogComponent } from '../fixed-dialog/fixed-dialog.component';
import { InternalServerErrorDialogComponent } from '../notification/internal-server-error-dialog/internal-server-error-dialog.component';
......@@ -78,6 +79,17 @@ describe('DialogService', () => {
})
})
describe('openBasic', () => {
const data: any = {};
it('should call dialog open with config', () => {
service.openBasic(data);
expect(dialog.open).toHaveBeenCalledWith(BasicDialogComponent, { ...service.BASIC_DIALOG_CONFIG, data });
})
})
describe('openApiError', () => {
const apiError: ApiError = createApiError();
......
......@@ -27,6 +27,7 @@ import { Injectable } from "@angular/core";
import { MatLegacyDialog as MatDialog, MatLegacyDialogConfig as MatDialogConfig, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
import { ApiError } from "@goofy-client/tech-shared";
import { FixedDialogComponent } from "@goofy-client/ui";
import { BasicDialogComponent } from '../basic-dialog/basic-dialog.component';
import { InternalServerErrorDialogComponent } from "../notification/internal-server-error-dialog/internal-server-error-dialog.component";
import { RetryInTimeDialog } from './retry-in-time.dialog';
......@@ -49,6 +50,13 @@ export class DialogService {
panelClass: 'notification-dialog'
};
readonly BASIC_DIALOG_CONFIG: MatDialogConfig = {
width: 'auto',
hasBackdrop: false,
autoFocus: true,
scrollStrategy: new NoopScrollStrategy()
};
constructor(private dialog: MatDialog) { }
public open<T>(component: ComponentType<T>, config?: MatDialogConfig): MatDialogRef<T> {
......@@ -63,6 +71,10 @@ export class DialogService {
return this.dialog.open(FixedDialogComponent, { ...this.FIXED_DIALOG_CONFIG, data });
}
public openBasic(data: any): MatDialogRef<BasicDialogComponent> {
return this.dialog.open(BasicDialogComponent, { ...this.BASIC_DIALOG_CONFIG, data });
}
public getRetryDialog(): RetryInTimeDialog {
return new RetryInTimeDialog(this);
}
......
......@@ -25,10 +25,17 @@ import { CommonModule } from '@angular/common';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { DateFnsAdapter, MatDateFnsModule } from '@angular/material-date-fns-adapter';
import {
DateFnsAdapter,
MatDateFnsModule,
} from '@angular/material-date-fns-adapter';
import { MatBadgeModule } from '@angular/material/badge';
import { MatButtonToggleModule } from '@angular/material/button-toggle';
import { DateAdapter, MAT_DATE_LOCALE, MatRippleModule } from '@angular/material/core';
import {
DateAdapter,
MAT_DATE_LOCALE,
MatRippleModule,
} from '@angular/material/core';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatExpansionModule } from '@angular/material/expansion';
import { MatIconModule } from '@angular/material/icon';
......@@ -72,7 +79,11 @@ import { FixedDialogComponent } from './fixed-dialog/fixed-dialog.component';
import { ConnectionTimeoutRetryDialogComponent } from './http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component';
import { ConnectionTimeoutRetryFailDialogComponent } from './http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component';
import { IconButtonWithSpinnerComponent } from './icon-button-with-spinner/icon-button-with-spinner.component';
import { MattooltipClassDirective, MattooltipDirective, MattooltipDisabledDirective } from './mattooltip/mattooltip.directive';
import {
MattooltipClassDirective,
MattooltipDirective,
MattooltipDisabledDirective,
} from './mattooltip/mattooltip.directive';
import { InternalServerErrorDialogComponent } from './notification/internal-server-error-dialog/internal-server-error-dialog.component';
import { OzgcloudIconComponent } from './ozgcloud-icon/ozgcloud-icon.component';
import { OzgcloudRoutingButtonComponent } from './ozgcloud-routing-button/ozgcloud-routing-button.component';
......@@ -82,6 +93,7 @@ import { SlideToggleComponent } from './slide-toggle/slide-toggle.component';
import { SpinnerComponent } from './spinner/spinner.component';
import { SubnavigationComponent } from './subnavigation/subnavigation.component';
import { ValidationErrorComponent } from './validation-error/validation-error.component';
import { BasicDialogComponent } from './basic-dialog/basic-dialog.component';
const components = [
SubnavigationComponent,
......@@ -115,7 +127,7 @@ const components = [
ButtonToggleComponent,
OzgcloudIconComponent,
OzgcloudRoutingButtonComponent,
OzgcloudSvgIconComponent
OzgcloudSvgIconComponent,
];
const modules = [
......@@ -143,7 +155,7 @@ const modules = [
CommonModule,
TechSharedModule,
RouterModule,
MatButtonToggleModule
MatButtonToggleModule,
];
@NgModule({
......@@ -154,7 +166,8 @@ const modules = [
ConnectionTimeoutRetryFailDialogComponent,
SnackbarCloseButtonComponent,
BackButtonComponent,
ButtonToggleComponent
ButtonToggleComponent,
BasicDialogComponent,
],
imports: [...modules],
exports: [...modules, ...components],
......
<ng-container *ngIf="vorgang | hasLink: linkRel.LOESCH_ANFORDERUNG">
<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="endgueltig-loeschen-button"
text="Endgültig löschen"
svgIcon="delete_finally"
[stateResource]="commandStateResource$ | async"
(clickEmitter)="openEndgueltigLoeschenDialog()">
</goofy-client-button-with-spinner>
<goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="endgueltig-loeschen-icon-button"
toolTip="Endgültig löschen"
svgIcon="delete_finally"
[stateResource]="commandStateResource$ | async"
(clickEmitter)="openEndgueltigLoeschenDialog()">
</goofy-client-icon-button-with-spinner>
</ng-container>
\ No newline at end of file
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatLegacyDialogModule as MatDialogModule, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared';
import { mock } from '@goofy-client/test-utils';
import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui';
import { VorgangCommandService, VorgangService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared';
import { createCommandResource } from 'libs/command-shared/test/command';
import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
import { MockComponent } from 'ng-mocks';
import { of } from 'rxjs';
import { EndgueltigLoeschenButtonComponent } from './endgueltig-loeschen-button.component';
import * as TechUtil from '@goofy-client/tech-shared';
describe('EndgueltigLoeschenButtonComponent', () => {
let component: EndgueltigLoeschenButtonComponent;
let fixture: ComponentFixture<EndgueltigLoeschenButtonComponent>;
const endgueltigLoeschenButton: string = getDataTestIdOf('endgueltig-loeschen-button');
const endgueltigLoeschenIconButton: string = getDataTestIdOf('endgueltig-loeschen-icon-button');
const vorgangCommandService = { ...mock(VorgangCommandService), getCommandStateResources: () => of(createStateResource(createCommandResource())) };
const vorgangService = mock(VorgangService);
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [
EndgueltigLoeschenButtonComponent,
MockComponent(ButtonWithSpinnerComponent),
MockComponent(IconButtonWithSpinnerComponent),
HasLinkPipe
],
imports: [
MatDialogModule
],
providers: [
{
provide: MatDialogRef,
useValue: {}
},
{
provide: VorgangCommandService,
useValue: vorgangCommandService
},
{
provide: VorgangService,
useValue: vorgangService,
}
]
}).compileComponents();
fixture = TestBed.createComponent(EndgueltigLoeschenButtonComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
describe('ngOnInit', () => {
it('should call vorgangCommandService.getEndgueltigLoeschenCommand', () => {
component.ngOnInit();
expect(vorgangCommandService.getEndgueltigLoeschenCommand).toHaveBeenCalled();
})
it('should call vorgangService.getLoeschAnforderung', () => {
component.ngOnInit();
expect(vorgangService.getLoeschAnforderung).toHaveBeenCalled();
})
})
describe('endgueltig_loeschen button', () => {
beforeEach(() => {
component.showAsIconButton = false;
})
it('should be hidden', () => {
component.vorgang = createVorgangWithEingangResource();
fixture.detectChanges();
const buttonElement = fixture.nativeElement.querySelector(endgueltigLoeschenButton);
expect(buttonElement).not.toBeInstanceOf(HTMLElement);
});
it('should be visible', () => {
component.vorgang = createVorgangWithEingangResource([VorgangWithEingangLinkRel.LOESCH_ANFORDERUNG]);
fixture.detectChanges();
const buttonElement = fixture.nativeElement.querySelector(endgueltigLoeschenButton);
expect(buttonElement).toBeInstanceOf(HTMLElement);
});
})
describe('endgueltig_loeschen button mit icon', () => {
beforeEach(() => {
component.showAsIconButton = true;
})
it('should be hidden', () => {
component.vorgang = createVorgangWithEingangResource();
fixture.detectChanges();
const buttonElement = fixture.nativeElement.querySelector(endgueltigLoeschenIconButton);
expect(buttonElement).not.toBeInstanceOf(HTMLElement);
});
it('should be visible', () => {
component.vorgang = createVorgangWithEingangResource([VorgangWithEingangLinkRel.LOESCH_ANFORDERUNG]);
fixture.detectChanges();
const buttonElement = fixture.nativeElement.querySelector(endgueltigLoeschenIconButton);
expect(buttonElement).toBeInstanceOf(HTMLElement);
});
})
describe('openEndgueltigLoeschenDialog', () => {
it('should call isNotUndefined', () => {
const isNotUndefined = jest.spyOn(TechUtil, 'isNotUndefined').mockReturnValue(false);
component.openEndgueltigLoeschenDialog();
expect(isNotUndefined).toHaveBeenCalled();
})
})
});
import { Component, Input } from '@angular/core';
import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
import { CommandResource } from '@goofy-client/command-shared';
import { StateResource, createEmptyStateResource } from '@goofy-client/tech-shared';
import { DialogService } from '@goofy-client/ui';
import { LoeschAnforderungResource, VorgangCommandService, VorgangService, VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@goofy-client/vorgang-shared';
import { BasicDialogComponent } from 'libs/ui/src/lib/ui/basic-dialog/basic-dialog.component';
import { Observable, of, take } from 'rxjs';
import { EndgueltigLoeschenDialogComponent } from './endgueltig-loeschen-dialog/endgueltig-loeschen-dialog.component';
import * as TechUtil from '@goofy-client/tech-shared';
@Component({
selector: 'goofy-client-endgueltig-loeschen-button',
templateUrl: './endgueltig-loeschen-button.component.html',
styleUrls: ['./endgueltig-loeschen-button.component.scss'],
})
export class EndgueltigLoeschenButtonComponent {
@Input() vorgang: VorgangWithEingangResource;
@Input() showAsIconButton: boolean = false;
commandStateResource$: Observable<StateResource<CommandResource>> = of(createEmptyStateResource<CommandResource>());
loeschAnforderungResource$: Observable<StateResource<LoeschAnforderungResource>> = of(createEmptyStateResource<LoeschAnforderungResource>());
readonly linkRel = VorgangWithEingangLinkRel;
dialogRef: MatDialogRef<BasicDialogComponent>;
constructor(private vorgangCommandService: VorgangCommandService, private dialogService: DialogService, private vorgangService: VorgangService) { }
ngOnInit(): void {
this.commandStateResource$ = this.vorgangCommandService.getEndgueltigLoeschenCommand();
this.loeschAnforderungResource$ = this.vorgangService.getLoeschAnforderung();
}
openEndgueltigLoeschenDialog(): void {
if (TechUtil.isNotUndefined(this.dialogRef)) {
this.dialogService.closeAll();
}
this.dialogRef = this.dialogService.openBasic({
component: EndgueltigLoeschenDialogComponent,
title: 'Möchten Sie den Vorgang endgültig löschen?',
message: 'Diese Aktion kann nicht widerrufen werden.',
okText: 'Endgültig löschen',
okSvgIcon: 'delete_finally'
});
this.dialogRef.afterClosed().pipe(take(1)).subscribe(() => this.endgueltigLoeschen());
}
endgueltigLoeschen(): void {
this.loeschAnforderungResource$.pipe(take(1)).subscribe(loeschAnforderung => {
this.vorgangCommandService.endgueltigLoeschen(loeschAnforderung.resource)
});
}
}
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { EndgueltigLoeschenDialogComponent } from './endgueltig-loeschen-dialog.component';
describe('EndgueltigLoeschenDialogComponent', () => {
let component: EndgueltigLoeschenDialogComponent;
let fixture: ComponentFixture<EndgueltigLoeschenDialogComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [EndgueltigLoeschenDialogComponent],
}).compileComponents();
fixture = TestBed.createComponent(EndgueltigLoeschenDialogComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component } from '@angular/core';
@Component({
selector: 'goofy-client-endgueltig-loeschen-dialog',
templateUrl: './endgueltig-loeschen-dialog.component.html',
styleUrls: ['./endgueltig-loeschen-dialog.component.scss'],
})
export class EndgueltigLoeschenDialogComponent {}
......@@ -32,6 +32,7 @@
<goofy-client-verwerfen-button [showAsIconButton]="showAsIconButton" [vorgang]="vorgangWithEingang"></goofy-client-verwerfen-button>
<goofy-client-wiedereroeffnen-button [showAsIconButton]="showAsIconButton" [vorgang]="vorgangWithEingang"></goofy-client-wiedereroeffnen-button>
<goofy-client-loeschen-anfordern-button [showAsIconButton]="showAsIconButton" [vorgang]="vorgangWithEingang"></goofy-client-loeschen-anfordern-button>
<goofy-client-endgueltig-loeschen-button [showAsIconButton]="showAsIconButton" [vorgang]="vorgangWithEingang"></goofy-client-endgueltig-loeschen-button>
<goofy-client-create-wiedervorlage-button-container [showAsIconButton]="showAsIconButton" [vorgang]="vorgangWithEingang"></goofy-client-create-wiedervorlage-button-container>
<goofy-client-assign-user-profile-button-container [vorgang]="vorgangWithEingang"></goofy-client-assign-user-profile-button-container>
<goofy-client-postfach-mail-button-container [showAsIconButton]="showAsIconButton" [vorgang]="vorgangWithEingang"></goofy-client-postfach-mail-button-container>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment