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

OZG-531 OZG-539

parent c6862de9
No related branches found
No related tags found
No related merge requests found
Showing
with 260 additions and 74 deletions
......@@ -10,10 +10,6 @@ export interface Command extends CreateCommand {
status: CommandStatus,
}
export interface CommandResource extends Command, Resource { }
export enum CommandStatus {
......@@ -21,4 +17,3 @@ export enum CommandStatus {
PENDING = 'PENDING',
REVOKED = 'REVOKED'
}
\ No newline at end of file
......@@ -18,7 +18,7 @@ export function getControlForIssue(form: FormGroup, issue: Issue, pathPrefix?: S
const fieldPath = pathPrefix ? issue.field.substr(pathPrefix.length + 1) : issue.field;
let curControl: AbstractControl = form;
fieldPath.split(".").forEach(
fieldPath.split('.').forEach(
field => curControl = (<FormGroup>curControl).controls[field]);
return curControl;
......
<goofy-client-spinner [stateResource]="vorgangStateResource" class="header-spinner"></goofy-client-spinner>
<goofy-client-vorgang-detail-header
*ngIf="vorgangStateResource.resource"
[vorgangWithEingang]="vorgangStateResource.resource"
data-test-id="vorgang-detail-header">
<ng-container *ngIf="vorgangStateResource.resource">
<goofy-client-vorgang-detail-header data-test-id="vorgang-detail-header"
[vorgangWithEingang]="vorgangStateResource.resource">
</goofy-client-vorgang-detail-header>
<div class="vorgang-detail-body">
......@@ -19,13 +18,12 @@
</goofy-client-expansion-panel>
<goofy-client-expansion-panel headline="Vorgang Weiterleiten">
<goofy-client-vorgang-weiterleiten></goofy-client-vorgang-weiterleiten>
<goofy-client-vorgang-weiterleiten [vorgang]="vorgangStateResource.resource"></goofy-client-vorgang-weiterleiten>
</goofy-client-expansion-panel>
<goofy-client-wiedervorlage-list-in-vorgang-container
*ngIf="vorgangStateResource.resource"
[vorgang]="vorgangStateResource.resource"
data-test-id="wiedervorlagen-in-vorgang">
<goofy-client-wiedervorlage-list-in-vorgang-container data-test-id="wiedervorlagen-in-vorgang"
[vorgang]="vorgangStateResource.resource">
</goofy-client-wiedervorlage-list-in-vorgang-container>
</div>
</div>
</ng-container>
\ No newline at end of file
......@@ -14,7 +14,7 @@
</goofy-client-expansion-panel>
<goofy-client-expansion-panel
*ngIf="vorgangWithEingang.eingang.antragsteller as antragsteller"
*ngIf="eingang.antragsteller as antragsteller"
headline="Antragsteller"
data-test-id="antragsteller-panel">
......
import { FormGroup } from "@angular/forms";
import { CommandResource } from "@goofy-client/command-shared";
import { ApiError, hasError, setValidationError, StateResource } from "@goofy-client/tech-shared";
export abstract class FormServiceHandleError {
form: FormGroup;
pathPrefix: string;
constructor(pathPrefix: string){
this.pathPrefix = pathPrefix;
}
handleResponse(result: StateResource<CommandResource>): StateResource<CommandResource> {
if (result.loading) return result;
if (hasError(result)) {
this.setError(result.error);
}
return result;
}
setError(apiError: ApiError): void {
apiError.issues.forEach(issue => setValidationError(this.form, issue, this.pathPrefix))
}
}
\ No newline at end of file
<form class="form" [formGroup]="form" (submit)="submit()">
<mat-form-field appearance="fill">
<mat-label>Zuständige Stelle</mat-label>
<input type="email" matInput placeholder="E-Mail Adresse" formControlName="email">
<mat-error></mat-error>
</mat-form-field>
<form class="form" [formGroup]="formService.form" (submit)="submit()">
<goofy-client-text-editor label="Zuständige Stelle" [formControlName]="formServiceClass.FIELD_EMAIL" [maxlength]="40">
</goofy-client-text-editor>
<mat-form-field appearance="fill">
<mat-label>Passwort</mat-label>
<input type="password" matInput placeholder="Passwort für die Verschlüsselung" formControlName="password">
<mat-error></mat-error>
</mat-form-field>
<goofy-client-password-editor label="Password" [formControlName]="formServiceClass.FIELD_PASSWORD" placeholder="Passwort für die Verschlüsselung">
</goofy-client-password-editor>
<goofy-client-button-with-spinner icon="forward" type="submit" text="Weiterleiten"></goofy-client-button-with-spinner>
<goofy-client-button-with-spinner icon="forward" type="submit" text="Weiterleiten" [stateResource]="redirectStateResource$ | async"></goofy-client-button-with-spinner>
</form>
\ No newline at end of file
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { VorgangWeiterleitenComponent } from './vorgang-weiterleiten.component';
import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { mock } from '@goofy-client/test-utils';
import { ButtonWithSpinnerComponent } from '@goofy-client/ui';
import { VorgangRedirectService } from '@goofy-client/vorgang-shared';
import { PasswordEditorComponent } from 'libs/ui/src/lib/ui/password-editor/password-editor.component';
import { TextEditorComponent } from 'libs/ui/src/lib/ui/text-editor/text-editor.component';
import { MockComponent } from 'ng-mocks';
import { ReactiveFormsModule } from '@angular/forms';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatInputModule } from '@angular/material/input';
import { MatIconModule } from '@angular/material/icon';
import { of } from 'rxjs';
import { VorgangWeiterleitenComponent } from './vorgang-weiterleiten.component';
import { VorgangRedirectFormService } from './vorgang-weiterleiten.formservice';
describe('VorgangWeiterleitenComponent', () => {
let component: VorgangWeiterleitenComponent;
let fixture: ComponentFixture<VorgangWeiterleitenComponent>;
const vorgangRedirectFormService = {...mock(VorgangRedirectFormService), submit: () => of({}) };
const vorgangRedirectService = mock(VorgangRedirectService);
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [
VorgangWeiterleitenComponent,
MockComponent(ButtonWithSpinnerComponent)
MockComponent(ButtonWithSpinnerComponent),
MockComponent(TextEditorComponent),
MockComponent(PasswordEditorComponent)
],
imports: [
MatFormFieldModule,
......@@ -25,9 +35,19 @@ describe('VorgangWeiterleitenComponent', () => {
MatIconModule,
ReactiveFormsModule,
BrowserAnimationsModule
],
providers: [
FormBuilder,
{
provide: VorgangRedirectFormService,
useValue: vorgangRedirectFormService
},
{
provide: VorgangRedirectService,
useValue: vorgangRedirectService
}
]
})
.compileComponents();
}).compileComponents();
});
beforeEach(() => {
......
import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import { Component, Input, OnChanges } from '@angular/core';
import { CommandResource } from '@goofy-client/command-shared';
import { createEmptyStateResource, StateResource } from '@goofy-client/tech-shared';
import { VorgangResource } from '@goofy-client/vorgang-shared';
import { isNil } from 'lodash-es';
import { Observable, of } from 'rxjs';
import { VorgangRedirectFormService } from './vorgang-weiterleiten.formservice';
@Component({
selector: 'goofy-client-vorgang-weiterleiten',
templateUrl: './vorgang-weiterleiten.component.html',
styleUrls: ['./vorgang-weiterleiten.component.scss']
styleUrls: ['./vorgang-weiterleiten.component.scss'],
providers: [VorgangRedirectFormService]
})
export class VorgangWeiterleitenComponent implements OnInit {
export class VorgangWeiterleitenComponent implements OnChanges{
form: FormGroup;
@Input() private vorgang: VorgangResource;
constructor() { }
readonly formServiceClass = VorgangRedirectFormService;
ngOnInit(): void {
this.form = new FormGroup({
email: new FormControl(null),
password: new FormControl()
})
redirectStateResource$: Observable<StateResource<CommandResource>> = of(createEmptyStateResource());
constructor(public formService: VorgangRedirectFormService) { }
ngOnChanges(): void {
if(!isNil(this.vorgang)){
this.formService.setVorgang(this.vorgang);
}
}
submit() {
console.log('submit')
submit(): void {
this.redirectStateResource$ = this.formService.submit();
}
}
\ No newline at end of file
import { FormBuilder } from '@angular/forms';
import { mock, useFromMock } from '@goofy-client/test-utils';
import { VorgangRedirectService } from '@goofy-client/vorgang-shared';
import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang';
import { of } from 'rxjs';
import { VorgangRedirectFormService } from '../vorgang-weiterleiten/vorgang-weiterleiten.formservice';
describe('VorgangRedirectFormService', () => {
let formService: VorgangRedirectFormService;
let vorgangRedirectService;
const formBuilder: FormBuilder = new FormBuilder();
beforeEach(() => {
vorgangRedirectService = mock(VorgangRedirectService);
formService = new VorgangRedirectFormService(formBuilder, useFromMock(vorgangRedirectService));
})
it('should create', () => {
expect(formService).toBeTruthy();
});
describe('submit', () => {
const returnValue = {};
beforeEach(() => {
vorgangRedirectService.redirect.mockReturnValue(of(returnValue));
formService.handleResponse = jest.fn();
})
it('should call service', () => {
formService.vorgang = createVorgangResource();
formService.submit();
expect(vorgangRedirectService.redirect).toHaveBeenCalledWith(formService.vorgang, formService.form.value);
})
it('should call parent handleResponse', () => {
formService.vorgang = createVorgangResource();
formService.submit().subscribe();
expect(formService.handleResponse).toHaveBeenCalled();
})
})
})
\ No newline at end of file
import { Injectable } from '@angular/core';
import { FormBuilder, FormControl } from '@angular/forms';
import { CommandResource } from '@goofy-client/command-shared';
import { StateResource } from '@goofy-client/tech-shared';
import { VorgangRedirectService, VorgangResource } from '@goofy-client/vorgang-shared';
import { RedirectRequest } from 'libs/vorgang-shared/src/lib/redirect/vorgang-redirect.model';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { FormServiceHandleError } from './formservice-abstract';
@Injectable()
export class VorgangRedirectFormService extends FormServiceHandleError {
static readonly FIELD_PATH_PREFIX = 'command.vorgang';
static readonly FIELD_EMAIL = 'email';
static readonly FIELD_PASSWORD = 'password';
vorgang: VorgangResource;
constructor(private formBuilder: FormBuilder, private vorgangRedirectService: VorgangRedirectService){
super(VorgangRedirectFormService.FIELD_PATH_PREFIX);
this.initForm();
}
private initForm(): void {
this.form = this.formBuilder.group({
[VorgangRedirectFormService.FIELD_EMAIL]: new FormControl(),
[VorgangRedirectFormService.FIELD_PASSWORD]: new FormControl()
})
}
public setVorgang(vorgang: VorgangResource): void {
this.vorgang = vorgang;
}
public submit(): Observable<StateResource<CommandResource>> {
return this.vorgangRedirectService.redirect(this.vorgang, this.buildRedirectRequest()).pipe(
map(result => this.handleResponse(result)));
}
private buildRedirectRequest(): RedirectRequest{
return this.form.value;
}
}
\ No newline at end of file
......@@ -5,6 +5,7 @@ import { TechSharedModule } from '@goofy-client/tech-shared';
import { UiModule } from '@goofy-client/ui';
import { VorgangSharedModule } from '@goofy-client/vorgang-shared';
import { WiedervorlageModule } from '@goofy-client/wiedervorlage';
import { AnhaengeComponent } from './vorgang-detail-page/vorgang-detail-area/anhaenge/anhaenge.component';
import { VorgangDetailActionButtonsComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-action-buttons/vorgang-detail-action-buttons.component';
import { VorgangDetailAreaComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component';
import { AntragstellerComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-body/antragsteller/antragsteller.component';
......@@ -13,9 +14,8 @@ import { FormDataTableComponent } from './vorgang-detail-page/vorgang-detail-are
import { VorgangDetailBodyComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-body/vorgang-detail-body.component';
import { VorgangDetailFormularButtonsComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component';
import { VorgangDetailHeaderComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-detail-header/vorgang-detail-header.component';
import { VorgangDetailPageComponent } from './vorgang-detail-page/vorgang-detail-page.component';
import { VorgangWeiterleitenComponent } from './vorgang-detail-page/vorgang-detail-area/vorgang-weiterleiten/vorgang-weiterleiten.component';
import { AnhaengeComponent } from './vorgang-detail-page/vorgang-detail-area/anhaenge/anhaenge.component';
import { VorgangDetailPageComponent } from './vorgang-detail-page/vorgang-detail-page.component';
const routes: Routes = [
{
......
export * from './lib/aktenzeichen/aktenzeichen.component';
export * from './lib/redirect/vorgang-redirect.service';
export * from './lib/status-dot/status-dot.component';
export * from './lib/vorgang-shared.module';
export * from './lib/vorgang.linkrels';
......
export interface RedirectRequest {
email: string,
password: string
}
\ No newline at end of file
import { CommandService } from "@goofy-client/command-shared";
import { Mock, mock, useFromMock } from '@goofy-client/test-utils';
import { VorgangRedirectService } from './vorgang-redirect.service';
describe('VorgangRedirectService', () => {
let service: VorgangRedirectService;
let commandService: Mock<CommandService>;
beforeEach(() => {
commandService = mock(CommandService);
service = new VorgangRedirectService(useFromMock(commandService));
})
it('should create', () => {
expect(service).toBeTruthy();
});
})
\ No newline at end of file
import { Injectable } from '@angular/core';
import { CommandResource, CommandService } from '@goofy-client/command-shared';
import { createEmptyStateResource, createStateResource, StateResource } from '@goofy-client/tech-shared';
import { Vorgang } from '@goofy-client/vorgang-shared';
import { Observable, of } from 'rxjs';
import { startWith } from 'rxjs/operators';
import { RedirectRequest } from './vorgang-redirect.model';
@Injectable({ providedIn: 'root' })
export class VorgangRedirectService {
constructor(private commandService: CommandService) { }
redirect(vorgang: Vorgang, request: RedirectRequest): Observable<StateResource<CommandResource>> {
// TODO: OZG-540
console.info('vorgang redirect: ' + vorgang.name + ' with data: ' + JSON.stringify(request));
return of(createStateResource(<CommandResource>{ })).pipe(
startWith(createEmptyStateResource<CommandResource>(true))
);
}
}
\ No newline at end of file
import * as faker from 'faker';
import { RedirectRequest } from '../src/lib/redirect/vorgang-redirect.model';
export function createRedirectRequest(): RedirectRequest{
return {
email: faker.internet.email(),
password: faker.internet.password()
}
}
\ No newline at end of file
......@@ -50,10 +50,6 @@ describe('WiedervorlagePageContainerComponent', () => {
provide: VorgangService,
useValue: vorgangService
},
{
provide: WiedervorlageService,
useValue: wiedervorlageService
},
{
provide: WiedervorlageFormService,
useValue: wiedervorlageFormservice
......
......@@ -13,7 +13,7 @@ export class WiedervorlageFormService {
static readonly FIELD_BETREFF = 'betreff';
static readonly FIELD_BESCHREIBUNG = 'beschreibung';
static readonly FIELD_FRIST = 'frist';
static readonly FIELD_PATH_PREFIX = "command.wiedervorlage";
static readonly FIELD_PATH_PREFIX = 'command.wiedervorlage';
form: FormGroup;
wiedervorlageResource: WiedervorlageResource = undefined
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment