a dialog component for Crud methods

a dialog component

Posted by bolatah on 7/11/2024, 9:00:09 AM

import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';

import {

  MAT_DIALOG_DATA,

  MatDialogModule,

  MatDialogRef,

} from '@angular/material/dialog';

import { Todo } from '../store/models/todos.models';

import { MatFormField, MatFormFieldModule } from '@angular/material/form-field';

import {

  FormBuilder,

  FormGroup,

  ReactiveFormsModule,

  Validators,

} from '@angular/forms';

import { TodosService } from '../services/todos.service';

import { MatInputModule } from '@angular/material/input';

@Component({

  selector: 'app-add-edit-todo-dialog',

  standalone: true,

  imports: [

    MatDialogModule,

    MatInputModule,

    MatFormFieldModule,

    MatFormField,

    ReactiveFormsModule,

  ],

  changeDetection: ChangeDetectionStrategy.OnPush,

  templateUrl: './todo-action.component.html',

  styleUrl: './todo-action.component.scss',

})

export class TodoActionDialogComponent {

  form: FormGroup = this.formBuilder.group({

    beschreibung: ['', [Validators.required]],

    faellig: ['', this.data.action !== 'Complete' ? [Validators.required] : []],

    prioritaet: [

      1,

      this.data.action !== 'Complete'

        ? [Validators.required, Validators.min(1), Validators.max(4)]

        : [],

    ],

    erledigt: false,

  });

  constructor(

    private formBuilder: FormBuilder,

    private todosService: TodosService,

    public dialogRef: MatDialogRef<TodoActionDialogComponent>,

    @Inject(MAT_DIALOG_DATA) public data: { action: string; todo?: Todo }

  ) {}

  ngOnInit(): void {

    if (this.data.action === 'Edit' && this.data.todo) {

      const faelligDate = new Date(Number(this.data.todo.faellig) * 1000);

      const faelligString = faelligDate.toISOString().substring(0, 10);

      this.form.patchValue({

        beschreibung: this.data.todo.beschreibung,

        faellig: faelligString,

        prioritaet: this.data.todo.prioritaet,

        erledigt: this.data.todo.erledigt,

      });

    } else if (this.data.action === 'Complete' && this.data.todo) {

      const faelligDate = new Date(Number(this.data.todo.faellig) * 1000);

      const faelligString = faelligDate.toISOString().substring(0, 10);

      this.form.patchValue({

        beschreibung: this.data.todo.beschreibung,

        faellig: faelligString,

        prioritaet: this.data.todo.prioritaet,

      });

    } else if (this.data.action === 'Incomplete' && this.data.todo) {

      const faelligDate = new Date(Number(this.data.todo.faellig) * 1000);

      const faelligString = faelligDate.toISOString().substring(0, 10);

      this.form.patchValue({

        beschreibung: this.data.todo.beschreibung,

        faellig: faelligString,

        prioritaet: this.data.todo.prioritaet,

      });

    }

  }

  onSubmit() {

    if (this.form.valid) {

      const todo: Todo = this.form.value;

      if (this.data.action === 'Add') {

        this.todosService.addTodo(todo).subscribe(() => {

          this.dialogRef.close(todo);

        });

      } else if (this.data.action === 'Edit') {

        const id = this.data?.todo?.id;

        if (id) {

          this.todosService.updateTodo(todo, id).subscribe(() => {

            this.dialogRef.close(todo);

          });

        }

      } else if (this.data.action === 'Complete' && this.data.todo) {

        const id = this.data.todo.id;

        this.todosService.markAsCompleted(todo, id).subscribe(() => {

          this.dialogRef.close(todo);

        });

      } else if (this.data.action === 'Incomplete' && this.data.todo) {

        const id = this.data.todo.id;

        this.todosService.markAsIncomplete(todo, id).subscribe(() => {

          this.dialogRef.close(todo);

        });

      }

    } else {

      console.log('Form is not valid');

    }

  }

  onCancel(): void {

    this.dialogRef.close();

  }

}