import { Directive, EventEmitter, Input, Output, OnInit } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { Observable } from 'rxjs'; import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import {ModalStatus} from "@app/_helpers/modal.states"; export type SaveFunction = (item: T) => Observable; export type UpdateFunction = (id: string | number, item: T) => Observable; export type DeleteFunction = (id: string | number) => Observable; export enum FormMode { Create = 'create', Edit = 'edit' } export interface FormSubmitEvent { status: ModalStatus; data: T | null; } @Directive() export abstract class AbstractDataFormComponent implements OnInit { @Input() data?: T; @Input() mode: FormMode = FormMode.Create; @Input() id?: string | number; @Input() redirectAfterDelete?: string; @Output() submit = new EventEmitter>(); @Output() deleted: EventEmitter = new EventEmitter(); protected form!: FormGroup; constructor( protected formConfig: FormGroup, protected createFn?: SaveFunction, protected updateFn?: UpdateFunction, protected deleteFn?: DeleteFunction, protected translateService?: TranslateService, protected router?: Router ) { this.form = formConfig; } ngOnInit(): void { if (this.data) { this.form.patchValue(this.data); } else if (this.mode === FormMode.Create) { this.data = this.getNewDataSet(); this.form.patchValue(this.data); } } protected getNewDataSet(): T { return {} as T; } onSubmit(): void { if (!this.form.valid) return; const formData = this.form.value as T; const request$ = this.mode === FormMode.Create ? (this.createFn ? this.createFn(formData) : undefined) : (this.updateFn ? this.updateFn(this.id!, formData) : undefined); if (request$ !== undefined) { request$.subscribe({ next: (response) => { this.data = response; this.submit.emit({ status: ModalStatus.Submitted, data: response }); }, error: (error) => { console.error('Error saving data:', error); this.submit.emit({ status: ModalStatus.Cancelled, // Statt Error verwenden wir Cancelled data: null }); } }); } } onDelete(): void { if (!this.isEditMode() || !this.deleteFn || !this.id || !this.translateService) { return; } this.translateService.get('basic.delete_confirm').subscribe((confirmMessage: string) => { if (confirm(confirmMessage)) { this.deleteFn!(this.id!).subscribe({ next: () => { this.deleted.emit(); if (this.redirectAfterDelete && this.router) { this.router.navigate([this.redirectAfterDelete]); } }, error: (error) => { console.error('Error deleting data:', error); } }); } }); } onDateChange(newDate: any, fieldName: string) { if (typeof newDate === 'string' || newDate === null) { this.form.patchValue({ [fieldName]: newDate }); } } isEditMode(): boolean { return this.mode === FormMode.Edit; } }