Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 

115 строки
3.7 KiB

  1. import { Directive, EventEmitter, Input, Output, OnInit } from '@angular/core';
  2. import { FormGroup } from '@angular/forms';
  3. import { Observable } from 'rxjs';
  4. import { Router } from '@angular/router';
  5. import { TranslateService } from '@ngx-translate/core';
  6. import {ModalStatus} from "@app/_helpers/modal.states";
  7. export type SaveFunction<T> = (item: T) => Observable<T>;
  8. export type UpdateFunction<T> = (id: string | number, item: T) => Observable<T>;
  9. export type DeleteFunction = (id: string | number) => Observable<any>;
  10. export enum FormMode {
  11. Create = 'create',
  12. Edit = 'edit'
  13. }
  14. export interface FormSubmitEvent<T> {
  15. status: ModalStatus;
  16. data: T | null;
  17. }
  18. @Directive()
  19. export abstract class AbstractDataFormComponent<T extends { [key: string]: any }> implements OnInit {
  20. @Input() data?: T;
  21. @Input() mode: FormMode = FormMode.Create;
  22. @Input() id?: string | number;
  23. @Input() redirectAfterDelete?: string;
  24. @Output() submit = new EventEmitter<FormSubmitEvent<T>>();
  25. @Output() deleted: EventEmitter<void> = new EventEmitter<void>();
  26. protected form!: FormGroup;
  27. constructor(
  28. protected formConfig: FormGroup,
  29. protected createFn?: SaveFunction<T>,
  30. protected updateFn?: UpdateFunction<T>,
  31. protected deleteFn?: DeleteFunction,
  32. protected translateService?: TranslateService,
  33. protected router?: Router
  34. ) {
  35. this.form = formConfig;
  36. }
  37. ngOnInit(): void {
  38. if (this.data) {
  39. this.form.patchValue(this.data);
  40. } else if (this.mode === FormMode.Create) {
  41. this.data = this.getNewDataSet();
  42. this.form.patchValue(this.data);
  43. }
  44. }
  45. protected getNewDataSet(): T {
  46. return {} as T;
  47. }
  48. onSubmit(): void {
  49. if (!this.form.valid) return;
  50. const formData = this.form.value as T;
  51. const request$ = this.mode === FormMode.Create
  52. ? (this.createFn ? this.createFn(formData) : undefined)
  53. : (this.updateFn ? this.updateFn(this.id!, formData) : undefined);
  54. if (request$ !== undefined) {
  55. request$.subscribe({
  56. next: (response) => {
  57. this.data = response;
  58. this.submit.emit({
  59. status: ModalStatus.Submitted,
  60. data: response
  61. });
  62. },
  63. error: (error) => {
  64. console.error('Error saving data:', error);
  65. this.submit.emit({
  66. status: ModalStatus.Cancelled, // Statt Error verwenden wir Cancelled
  67. data: null
  68. });
  69. }
  70. });
  71. }
  72. }
  73. onDelete(): void {
  74. if (!this.isEditMode() || !this.deleteFn || !this.id || !this.translateService) {
  75. return;
  76. }
  77. this.translateService.get('basic.delete_confirm').subscribe((confirmMessage: string) => {
  78. if (confirm(confirmMessage)) {
  79. this.deleteFn!(this.id!).subscribe({
  80. next: () => {
  81. this.deleted.emit();
  82. if (this.redirectAfterDelete && this.router) {
  83. this.router.navigate([this.redirectAfterDelete]);
  84. }
  85. },
  86. error: (error) => {
  87. console.error('Error deleting data:', error);
  88. }
  89. });
  90. }
  91. });
  92. }
  93. onDateChange(newDate: any, fieldName: string) {
  94. if (typeof newDate === 'string' || newDate === null) {
  95. this.form.patchValue({ [fieldName]: newDate });
  96. }
  97. }
  98. isEditMode(): boolean {
  99. return this.mode === FormMode.Edit;
  100. }
  101. }