IDK
Some checks failed
Playwright Tests / test (pull_request) Failing after 3m29s

This commit is contained in:
Dorian Nemec 2025-01-22 11:41:43 +01:00
parent 2a337f3586
commit d94d6cd1bc
8 changed files with 79 additions and 31 deletions

View file

@ -40,8 +40,9 @@ export const routes: Routes = [
canActivate: [AuthGuard], canActivate: [AuthGuard],
}, },
{ {
path: "mitarbeiterdetails", path: "mitarbeiterdetails/:id",
component: EmployeeDetailComponent, component: EmployeeDetailComponent,
canActivate: [AuthGuard],
}, },
{ {
path: "qualifikationbearbeiten/:id", path: "qualifikationbearbeiten/:id",

View file

@ -1,25 +1,25 @@
<div class="d-flex flex-col" style="height: 100%;"> <div class="d-flex flex-col" style="height: 100%;">
<app-navigation-bar></app-navigation-bar> <app-navigation-bar></app-navigation-bar>
<div class="p-3" style="width: 100%;"> <div class="p-3" style="width: 100%;">
<a href="" class="btn btn-primary">Zurück</a> <button class="btn btn-primary" (click)="goToEmployeePage()">Zurück</button>
<div class="row align-items-start pt-3"> <div class="row align-items-start pt-3">
<div class="col"> <div class="col">
<h1>Name des Mitarbeiters</h1> <h1>{{ employee.firstName }} {{ employee.lastName }} </h1>
<p><strong>Straße: </strong>Straße des Benutzers</p> <p><strong>Straße: </strong>{{ employee.street }}</p>
<p><strong>Postleitzahl: </strong>Postleitzahl des Benutzers</p> <p><strong>Postleitzahl: </strong>{{ employee.postcode }}</p>
<p><strong>Stadt: </strong>Stadt des Benutzers</p> <p><strong>Stadt: </strong>{{ employee.city }}</p>
<p><strong>Telefonnummer: </strong>Telefonnummer des Benutzers</p> <p><strong>Telefonnummer: </strong>{{ employee.phone }}s</p>
<button class="btn btn-danger">Löschen</button> <button class="btn btn-danger" (click)="deleteEmployee(currentId)">Löschen</button>
<button class="ms-3 btn btn-primary">Bearbeiten</button> <button class="ms-3 btn btn-primary" (click)="editEmployee(currentId)">Bearbeiten</button>
</div> </div>
<div class="col"> <div class="col">
<h2>Qualifikationen</h2> <h2>Qualifikationen</h2>
<ul class="list-group" style="width: fit-content;"> <ul class="list-group" style="width: fit-content;">
<li class="list-group-item">Qualifikation 1</li> @for(skill of skillSet; track skill) {
<li class="list-group-item">Qualifikation 2</li> <li class="list-group-item">{{ skill }}</li>
<li class="list-group-item">Qualifikation 3</li> }
<li class="list-group-item">Qualifikation 4</li>
<li class="list-group-item">Qualifikation 5</li>
</ul> </ul>
</div> </div>
</div> </div>

View file

@ -1,5 +1,11 @@
import { Component } from '@angular/core'; import {Component} from '@angular/core';
import { NavigationBarComponent } from '../navigation-bar/navigation-bar.component'; import {NavigationBarComponent} from '../navigation-bar/navigation-bar.component';
import {EmployeeNameAndSkillDataDTO, EmployeeResponseDTO} from "../../models/mitarbeiter";
import {EmployeeService} from "../../service/employee.service";
import {ActivatedRoute, Router} from "@angular/router";
import {Observable} from "rxjs";
import {QualificationGetDTO} from "../../models/skill";
import {SkillService} from "../../service/skill.service";
@Component({ @Component({
selector: 'app-employee-detail', selector: 'app-employee-detail',
@ -9,5 +15,31 @@ import { NavigationBarComponent } from '../navigation-bar/navigation-bar.compone
styleUrl: './employee-detail.component.css' styleUrl: './employee-detail.component.css'
}) })
export class EmployeeDetailComponent { export class EmployeeDetailComponent {
employee!: EmployeeResponseDTO;
skillSet: string[] = [];
currentId: number = 0;
constructor(private employeeService: EmployeeService, private router: Router, private route: ActivatedRoute, private skillService: SkillService) {
this.currentId = this.route.snapshot.params['id'];
this.employeeService.getEmployeeById(this.route.snapshot.params['id']).subscribe(employee => {
this.employee = employee;
this.skillSet = this.employee.skillSet?.map(skill => skill.skill) || [];
});
}
editEmployee(id: number) {
this.router.navigate([`/mitarbeiterbearbeiten/${id}`]);
}
goToEmployeePage(){
this.router.navigate(['mitarbeiter']);
}
deleteEmployee(id: number) {
this.employeeService.deleteEmployee(id);
this.router.navigate([`mitarbeiter`]);
}
protected readonly EmployeeService = EmployeeService;
} }

View file

@ -17,6 +17,7 @@ export class MitarbeiterErstellenComponent {
constructor(private employeeService: EmployeeService, private route: ActivatedRoute, private router: Router) { } constructor(private employeeService: EmployeeService, private route: ActivatedRoute, private router: Router) { }
submitted(mitarbeiter: EmployeeResponseDTO) { submitted(mitarbeiter: EmployeeResponseDTO) {
console.log(mitarbeiter)
this.employeeService.createEmployee(mitarbeiter); this.employeeService.createEmployee(mitarbeiter);
this.returnToEmployeeOverview(); this.returnToEmployeeOverview();
} }

View file

@ -11,7 +11,7 @@ import { Observable, of } from 'rxjs';
@Component({ @Component({
selector: 'app-mitarbeiter-form', selector: 'app-mitarbeiter-form',
standalone: true, standalone: true,
imports: [MitarbeiterFormComponent, ReactiveFormsModule, NgFor, AsyncPipe], imports: [ReactiveFormsModule, NgFor, AsyncPipe],
templateUrl: './mitarbeiter-form.component.html', templateUrl: './mitarbeiter-form.component.html',
styleUrl: './mitarbeiter-form.component.css' styleUrl: './mitarbeiter-form.component.css'
}) })
@ -24,9 +24,7 @@ export class MitarbeiterFormComponent {
public hasAllSkills: boolean = false; public hasAllSkills: boolean = false;
errorMessages: Record<string, string> = {}; errorMessages: Record<string, string> = {};
constructor(public http: HttpClient, public router: Router, private skillService: SkillService) { constructor(public http: HttpClient, public router: Router, private skillService: SkillService) {}
}
returnToEmployeeOverview() { returnToEmployeeOverview() {
this.router.navigate(["mitarbeiter"]); this.router.navigate(["mitarbeiter"]);
@ -40,7 +38,7 @@ export class MitarbeiterFormComponent {
postcode: new FormControl(this.mitarbeiter.postcode, [Validators.required, Validators.minLength(5), Validators.maxLength(5)]), postcode: new FormControl(this.mitarbeiter.postcode, [Validators.required, Validators.minLength(5), Validators.maxLength(5)]),
city: new FormControl(this.mitarbeiter.city, Validators.required), city: new FormControl(this.mitarbeiter.city, Validators.required),
phone: new FormControl(this.mitarbeiter.phone, [Validators.required, Validators.pattern('^[- +()0-9]+$')]), phone: new FormControl(this.mitarbeiter.phone, [Validators.required, Validators.pattern('^[- +()0-9]+$')]),
newSkill: new FormControl(), newSkill: new FormControl(null, Validators.required) // Added
}); });
} }
@ -88,6 +86,7 @@ export class MitarbeiterFormComponent {
const newSkill = skills.filter(skill => skill.id == id)[0]; const newSkill = skills.filter(skill => skill.id == id)[0];
this.mitarbeiter.skillSet?.push(newSkill); this.mitarbeiter.skillSet?.push(newSkill);
this.skillsChanged(); this.skillsChanged();
this.mitarbeiterForm.get("newSkill")?.reset(null); // Added
}); });
} }

View file

@ -46,7 +46,7 @@
<td>{{ employee.city }}</td> <td>{{ employee.city }}</td>
<td>{{ employee.phone }}</td> <td>{{ employee.phone }}</td>
<td> <td>
<button class="btn btn-primary me-2" (click)="editEmployee(employee.id)">Edit</button> <button class="btn btn-primary me-2" (click)="goToEmployeeDetailPage(employee.id)">Details</button>
<button class="btn btn-danger" (click)="deleteEmployee(employee.id)">Delete</button> <button class="btn btn-danger" (click)="deleteEmployee(employee.id)">Delete</button>
</td> </td>
</tr> </tr>

View file

@ -17,7 +17,9 @@ export class MitarbeiterverwaltungViewComponent implements OnInit {
employees: Array<EmployeeResponseDTO> = []; employees: Array<EmployeeResponseDTO> = [];
searchForm!: FormGroup; searchForm!: FormGroup;
constructor(private employeeService: EmployeeService, private router: Router) {} constructor(private employeeService: EmployeeService, private router: Router) {
this.updateEmployees();
}
submit() { submit() {
const searchTerm = this.searchForm.get("search")?.value || ''; const searchTerm = this.searchForm.get("search")?.value || '';
@ -55,10 +57,18 @@ export class MitarbeiterverwaltungViewComponent implements OnInit {
this.employees = this.employees.filter(employee => employee.id != id); this.employees = this.employees.filter(employee => employee.id != id);
} }
goToEmployeeDetailPage(id: number){
this.router.navigate([`/mitarbeiterdetails/${id}`]);
}
updateEmployees() {
this.employeeService.getAllEmployees().subscribe(employees => this.employees = employees);
}
ngOnInit(): void { ngOnInit(): void {
this.searchForm = new FormGroup({ this.searchForm = new FormGroup({
search: new FormControl(''), search: new FormControl(''),
}); });
this.employeeService.getAllEmployees().subscribe(employees => this.employees = employees); this.updateEmployees();
} }
} }

View file

@ -1,10 +1,10 @@
import { HttpClient } from "@angular/common/http"; import {HttpClient} from "@angular/common/http";
import { Injectable } from "@angular/core"; import {Injectable} from "@angular/core";
import { EmployeesForAQualificationDTO, QualificationGetDTO, QualificationPostDTO } from "../models/skill"; import {EmployeesForAQualificationDTO, QualificationGetDTO, QualificationPostDTO} from "../models/skill";
import { Observable } from "rxjs"; import {Observable} from "rxjs";
import { EmployeeNameDataDTO } from "../models/mitarbeiter"; import {EmployeeNameAndSkillDataDTO, EmployeeNameDataDTO} from "../models/mitarbeiter";
import { EmployeeService } from "./employee.service"; import {EmployeeService} from "./employee.service";
import { Environment } from "../environments/environment"; import {Environment} from "../environments/environment";
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -47,4 +47,9 @@ export class SkillService {
getEmployeesBySkill(id: number): Observable<EmployeesForAQualificationDTO> { getEmployeesBySkill(id: number): Observable<EmployeesForAQualificationDTO> {
return this.http.get<EmployeesForAQualificationDTO>(`${SkillService.BASE_URL}/qualifications/${id}/employees`); return this.http.get<EmployeesForAQualificationDTO>(`${SkillService.BASE_URL}/qualifications/${id}/employees`);
} }
getSkillsOfEmployee(id: number): Observable<EmployeeNameAndSkillDataDTO> {
return this.http.get<EmployeeNameAndSkillDataDTO>(`${SkillService.BASE_URL}/employees/${id}/qualifications`);
}
} }