add form to edit employee

This commit is contained in:
Constantin Simonis 2025-01-09 11:36:51 +01:00
parent dc61810632
commit f2e33f294a
Signed by: csimonis
GPG Key ID: 758DD9C506603183
6 changed files with 123 additions and 6 deletions

View File

@ -33,7 +33,7 @@
<mat-form-field class="!w-full"> <mat-form-field class="!w-full">
<mat-label>Phone</mat-label> <mat-label>Phone</mat-label>
<input matInput formControlName="phone" required type="number"> <input matInput formControlName="phone" required>
</mat-form-field> </mat-form-field>
<mat-dialog-actions align="end"> <mat-dialog-actions align="end">

View File

View File

@ -0,0 +1,46 @@
<h2 mat-dialog-title>Create Employee</h2>
<mat-dialog-content>
<form *ngIf="employeeForm" [formGroup]="employeeForm" (ngSubmit)="submit()">
<div class="!space-y-4">
<div class="flex gap-x-4">
<mat-form-field class="!w-full">
<mat-label>First Name</mat-label>
<input matInput formControlName="firstName" required [value]="employee.firstName">
</mat-form-field>
<mat-form-field class="!w-full">
<mat-label>Last Name</mat-label>
<input matInput formControlName="lastName" required [value]="employee.lastName">
</mat-form-field>
</div>
<mat-form-field class="!w-full">
<mat-label>Street</mat-label>
<input matInput formControlName="street" required [value]="employee.street">
</mat-form-field>
<div class="flex gap-x-4">
<mat-form-field class="!w-full">
<mat-label>City</mat-label>
<input matInput formControlName="city" required [value]="employee.city">
</mat-form-field>
<mat-form-field class="!w-1/2">
<mat-label>Postcode</mat-label>
<input matInput formControlName="postcode" minlength="5" maxlength="5" type="number" required [value]="employee.postcode">
</mat-form-field>
</div>
<mat-form-field class="!w-full">
<mat-label>Phone</mat-label>
<input matInput formControlName="phone" required>
</mat-form-field>
<mat-dialog-actions align="end">
<button mat-button mat-dialog-close>Cancel</button>
<button mat-flat-button color="primary" type="submit">Submit</button>
</mat-dialog-actions>
</div>
</form>
</mat-dialog-content>

View File

@ -0,0 +1,63 @@
import {Component, inject, OnInit} from '@angular/core';
import {FormBuilder, FormGroup, ReactiveFormsModule, Validators} from "@angular/forms";
import {
MAT_DIALOG_DATA,
MatDialogActions,
MatDialogClose,
MatDialogContent,
MatDialogRef,
MatDialogTitle
} from "@angular/material/dialog";
import {NgIf} from "@angular/common";
import {MatFormField} from "@angular/material/form-field";
import {MatInput, MatLabel} from "@angular/material/input";
import {MatButton} from "@angular/material/button";
import {Employee} from "../Employee";
import EmployeeApiService from "../../services/employee-api.service";
@Component({
selector: 'app-edit',
imports: [
MatDialogTitle,
MatDialogContent,
NgIf,
ReactiveFormsModule,
MatFormField,
MatInput,
MatDialogActions,
MatButton,
MatDialogClose,
MatLabel
],
templateUrl: './edit.component.html',
standalone: true,
styleUrl: './edit.component.css'
})
export class EditComponent implements OnInit {
employeeForm: FormGroup | null = null;
formBuilder: FormBuilder = inject(FormBuilder);
employeeService: EmployeeApiService = inject(EmployeeApiService);
dialogRef: MatDialogRef<EditComponent> = inject(MatDialogRef);
employee: Employee = inject(MAT_DIALOG_DATA);
ngOnInit(): void {
this.employeeForm = this.formBuilder.group({
firstName: [this.employee.firstName, Validators.required],
lastName: [this.employee.lastName, Validators.required],
street: [this.employee.street, Validators.required],
postcode: [this.employee.postcode, [Validators.required, Validators.minLength(5), Validators.maxLength(5)]],
city: [this.employee.city, Validators.required],
phone: [this.employee.phone, Validators.required],
});
}
submit() {
if (this.employeeForm === null || !this.employeeForm.valid) {
console.error('Form invalid');
return;
}
this.employeeService.create(this.employeeForm.value as Employee).subscribe();
this.dialogRef.close();
}
}

View File

@ -34,7 +34,7 @@
<ng-container matColumnDef="actions"> <ng-container matColumnDef="actions">
<th mat-header-cell *matHeaderCellDef class="!text-right"> Actions </th> <th mat-header-cell *matHeaderCellDef class="!text-right"> Actions </th>
<td mat-cell *matCellDef="let employee" class="!text-right !py-4"> <td mat-cell *matCellDef="let employee" class="!text-right !py-4">
<button mat-icon-button color="primary" [matTooltip]="'Edit employee'" class="!mr-2"> <button mat-icon-button color="primary" [matTooltip]="'Edit employee'" class="!mr-2" (click)="showEditEmployeeModal(employee)">
<mat-icon>edit</mat-icon> <mat-icon>edit</mat-icon>
</button> </button>
<button mat-icon-button color="warn" [matTooltip]="'Delete employee'" (click)="openDeleteDialogue(employee)"> <button mat-icon-button color="warn" [matTooltip]="'Delete employee'" (click)="openDeleteDialogue(employee)">

View File

@ -18,6 +18,7 @@ import {MatDialog} from "@angular/material/dialog";
import {DeleteComponent} from "../delete/delete.component"; import {DeleteComponent} from "../delete/delete.component";
import EmployeeApiService from "../../services/employee-api.service"; import EmployeeApiService from "../../services/employee-api.service";
import {CreateComponent} from "../create/create.component"; import {CreateComponent} from "../create/create.component";
import {EditComponent} from "../edit/edit.component";
@Component({ @Component({
selector: 'app-employee-list', selector: 'app-employee-list',
@ -41,8 +42,7 @@ import {CreateComponent} from "../create/create.component";
export class TableComponent implements OnInit{ export class TableComponent implements OnInit{
private readonly apiService: EmployeeApiService = inject(EmployeeApiService); private readonly apiService: EmployeeApiService = inject(EmployeeApiService);
private readonly snackBar: MatSnackBar = inject(MatSnackBar); private readonly snackBar: MatSnackBar = inject(MatSnackBar);
private readonly deleteDialogue: MatDialog = inject(MatDialog); private readonly matDialog: MatDialog = inject(MatDialog);
private readonly createEmployeeDialogue: MatDialog = inject(MatDialog);
private static readonly MAX_RETRIES = 3; private static readonly MAX_RETRIES = 3;
public employees$: Observable<Employee[]> = of([]); public employees$: Observable<Employee[]> = of([]);
@ -73,14 +73,22 @@ export class TableComponent implements OnInit{
} }
protected openDeleteDialogue(employee: Employee): void { protected openDeleteDialogue(employee: Employee): void {
this.deleteDialogue.open(DeleteComponent, {data: employee}); this.matDialog.open(DeleteComponent, {data: employee});
} }
protected showCreateEmployeeModal() { protected showCreateEmployeeModal() {
this.createEmployeeDialogue.open(CreateComponent) this.matDialog.open(CreateComponent)
.afterClosed() .afterClosed()
.subscribe(() => { .subscribe(() => {
this.employees$ = this.fetchEmployees(); this.employees$ = this.fetchEmployees();
}); });
} }
showEditEmployeeModal(employee: Employee) {
this.matDialog.open(EditComponent, {data: employee})
.afterClosed()
.subscribe(() => {
this.employees$ = this.fetchEmployees();
});
}
} }