add form to edit employee

Reviewed-on: #23
Reviewed-by: Get in my car i have candy <huydw@proton.me>
This commit is contained in:
Constantin Simonis 2025-01-09 11:10:51 +00:00
parent 5829876444
commit cd36904d45
9 changed files with 139 additions and 10 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>Edit 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>
</mat-form-field>
<mat-form-field class="!w-full">
<mat-label>Last Name</mat-label>
<input matInput formControlName="lastName" required>
</mat-form-field>
</div>
<mat-form-field class="!w-full">
<mat-label>Street</mat-label>
<input matInput formControlName="street" required>
</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>
</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>
</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,68 @@
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;
}
if (this.employee.id === undefined) {
console.error('Employee ID is undefined');
return;
}
this.employeeService.update(this.employeeForm.value as Employee, this.employee.id).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,7 +73,7 @@ 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})
.afterClosed() .afterClosed()
.subscribe(() => { .subscribe(() => {
this.employees$ = this.fetchEmployees(); this.employees$ = this.fetchEmployees();
@ -81,7 +81,15 @@ export class TableComponent implements OnInit{
} }
protected showCreateEmployeeModal() { protected showCreateEmployeeModal() {
this.createEmployeeDialogue.open(CreateComponent) this.matDialog.open(CreateComponent)
.afterClosed()
.subscribe(() => {
this.employees$ = this.fetchEmployees();
});
}
protected showEditEmployeeModal(employee: Employee) {
this.matDialog.open(EditComponent, {data: employee})
.afterClosed() .afterClosed()
.subscribe(() => { .subscribe(() => {
this.employees$ = this.fetchEmployees(); this.employees$ = this.fetchEmployees();

View File

@ -8,7 +8,6 @@ import {
} from "@angular/material/dialog"; } from "@angular/material/dialog";
import {FormsModule, ReactiveFormsModule} from "@angular/forms"; import {FormsModule, ReactiveFormsModule} from "@angular/forms";
import QualificationService from "../../services/qualification.service"; import QualificationService from "../../services/qualification.service";
import {MatError} from "@angular/material/form-field";
import {MatButton} from "@angular/material/button"; import {MatButton} from "@angular/material/button";
@Component({ @Component({
@ -18,11 +17,11 @@ import {MatButton} from "@angular/material/button";
MatDialogContent, MatDialogContent,
MatDialogTitle, MatDialogTitle,
ReactiveFormsModule, ReactiveFormsModule,
MatError,
MatDialogActions, MatDialogActions,
MatButton MatButton
], ],
templateUrl: './delete.component.html', templateUrl: './delete.component.html',
standalone: true,
styleUrl: './delete.component.css' styleUrl: './delete.component.css'
}) })
export class DeleteComponent { export class DeleteComponent {

View File

@ -1,12 +1,12 @@
import {Component, inject, OnInit} from '@angular/core'; import {Component, inject, OnInit} from '@angular/core';
import {Observable} from "rxjs"; import {Observable} from "rxjs";
import {Qualification} from "../Qualification"; import {Qualification} from "../Qualification";
import {AsyncPipe} from "@angular/common";
import {MatDialog} from "@angular/material/dialog"; import {MatDialog} from "@angular/material/dialog";
import QualificationService from "../../services/qualification.service"; import QualificationService from "../../services/qualification.service";
import {CreateComponent} from "../create/create.component"; import {CreateComponent} from "../create/create.component";
import {EditComponent} from "../edit/edit.component"; import {EditComponent} from "../edit/edit.component";
import {DeleteComponent} from "../delete/delete.component"; import {DeleteComponent} from "../delete/delete.component";
import {AsyncPipe} from "@angular/common";
import {MatButton, MatIconButton} from "@angular/material/button"; import {MatButton, MatIconButton} from "@angular/material/button";
import { import {
MatCell, MatCell,
@ -14,7 +14,10 @@ import {
MatColumnDef, MatColumnDef,
MatHeaderCell, MatHeaderCell,
MatHeaderCellDef, MatHeaderCellDef,
MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatHeaderRow,
MatHeaderRowDef,
MatRow,
MatRowDef,
MatTable MatTable
} from "@angular/material/table"; } from "@angular/material/table";
import {MatIcon} from "@angular/material/icon"; import {MatIcon} from "@angular/material/icon";
@ -45,6 +48,7 @@ import {MatProgressSpinner} from "@angular/material/progress-spinner";
MatProgressSpinner MatProgressSpinner
], ],
templateUrl: './table.component.html', templateUrl: './table.component.html',
standalone: true,
styleUrl: './table.component.css' styleUrl: './table.component.css'
}) })
export class QualificationsComponent implements OnInit { export class QualificationsComponent implements OnInit {

View File

@ -23,4 +23,8 @@ export default class EmployeeApiService {
public create(employee: Employee) { public create(employee: Employee) {
return this.http.post<Employee>(`${EmployeeApiService.BASE_URL}/employees`, employee) return this.http.post<Employee>(`${EmployeeApiService.BASE_URL}/employees`, employee)
} }
public update(employee: Employee, id: number) {
return this.http.patch(`${EmployeeApiService.BASE_URL}/employees/${id}`, employee)
}
} }