diff --git a/api/src/model/entitites/cylinder.entity.ts b/api/src/model/entitites/cylinder.entity.ts index e65d91b..2b8792e 100644 --- a/api/src/model/entitites/cylinder.entity.ts +++ b/api/src/model/entitites/cylinder.entity.ts @@ -21,7 +21,7 @@ export class Cylinder { @Column({ nullable: false, unique: true }) name: string; - @ManyToMany(() => Key, (key) => key.cylinder) + @ManyToMany(() => Key, (key) => key.cylinder, { onDelete: 'NO ACTION'}) keys: Key[]; @ManyToOne(() => KeySystem, (sys) => sys.cylinders) diff --git a/api/src/model/entitites/index.ts b/api/src/model/entitites/index.ts index abea36b..28c4a56 100644 --- a/api/src/model/entitites/index.ts +++ b/api/src/model/entitites/index.ts @@ -3,7 +3,6 @@ export * from './user.entity'; export * from './role.entity'; export * from './cylinder.entity'; export * from './key.entity'; -export * from './key_activity.entity'; export * from './customer.entity'; export * from './key-handout.entity'; export * from './activity.entity'; diff --git a/api/src/model/entitites/key_activity.entity.ts b/api/src/model/entitites/key_activity.entity.ts deleted file mode 100644 index 71ace39..0000000 --- a/api/src/model/entitites/key_activity.entity.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - Column, - CreateDateColumn, - Entity, - ManyToMany, - ManyToOne, - PrimaryGeneratedColumn, -} from 'typeorm'; -import { User } from './user.entity'; -import { IKey } from '../interface/key.interface'; -import { Cylinder } from './cylinder.entity'; -import { Customer } from './customer.entity'; - -@Entity() -export class KeyActivity implements IKey { - @PrimaryGeneratedColumn() - primaryId: number; - - @Column() - id: string; - - @Column({ nullable: true }) - name: string; - - @Column({ name: 'key_number' }) - nr: string; - - @Column({ name: 'handed_out', default: false }) - handedOut: boolean; - - @ManyToMany(() => Cylinder) - cylinder: Cylinder[]; - - @ManyToOne(() => Customer) - customer: Customer; - - @CreateDateColumn({ name: 'created_at' }) - createdAt: Date; - - @ManyToOne(() => User) - user: User; -} diff --git a/api/src/model/repositories/index.ts b/api/src/model/repositories/index.ts index d581d63..9629f28 100644 --- a/api/src/model/repositories/index.ts +++ b/api/src/model/repositories/index.ts @@ -4,6 +4,5 @@ export * from './role.repository'; export * from './system.repository'; export * from './cylinder.repository'; export * from './key.repository'; -export * from './key_activity.repository'; export * from './customer.repository'; export * from './activity.repository'; diff --git a/api/src/model/repositories/key_activity.repository.ts b/api/src/model/repositories/key_activity.repository.ts deleted file mode 100644 index 1e23e4a..0000000 --- a/api/src/model/repositories/key_activity.repository.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { Repository, DataSource } from 'typeorm'; -import { KeyActivity } from '../entitites'; - -@Injectable() -export class KeyActivityRepository extends Repository { - constructor(dataSource: DataSource) { - super(KeyActivity, dataSource.createEntityManager()); - } -} diff --git a/api/src/modules/customer/customer.service.ts b/api/src/modules/customer/customer.service.ts index 618e2eb..3a69f89 100644 --- a/api/src/modules/customer/customer.service.ts +++ b/api/src/modules/customer/customer.service.ts @@ -8,9 +8,16 @@ export class CustomerService { constructor(private customerRepository: CustomerRepository) {} createCustomer(user: IUser, data: any) { - if (!user || !data.name || data.name.length == 0 || !data.system) { - throw new HttpException('invalid', HttpStatus.UNPROCESSABLE_ENTITY); + if (!user) { + throw new HttpException({ message: 'Der Benutzer ist nicht verfügbar.', field: 'user' }, HttpStatus.UNPROCESSABLE_ENTITY); } + if (!data.name || data.name.length === 0) { + throw new HttpException({ message: 'Der Name des Kunden ist erforderlich.', field: 'name' }, HttpStatus.UNPROCESSABLE_ENTITY); + } + if (!data.system) { + throw new HttpException({ message: 'Die Schließanlage ist nicht gefüllt.', field: 'system' }, HttpStatus.UNPROCESSABLE_ENTITY); + } + return this.customerRepository.save(this.customerRepository.create(data)); } diff --git a/api/src/modules/cylinder/cylinder.module.ts b/api/src/modules/cylinder/cylinder.module.ts index 7883dc8..b9eef54 100644 --- a/api/src/modules/cylinder/cylinder.module.ts +++ b/api/src/modules/cylinder/cylinder.module.ts @@ -3,10 +3,11 @@ import { CylinderController } from './cylinder.controller'; import { CylinderService } from './cylinder.service'; import { AuthModule } from '../auth/auth.module'; import { DatabaseModule } from 'src/shared/database/database.module'; +import { SharedServiceModule } from 'src/shared/service/shared.service.module'; @Module({ controllers: [CylinderController], providers: [CylinderService], - imports: [AuthModule, DatabaseModule], + imports: [AuthModule, DatabaseModule, SharedServiceModule], }) export class CylinderModule {} diff --git a/api/src/modules/cylinder/cylinder.service.ts b/api/src/modules/cylinder/cylinder.service.ts index 6d13572..398f305 100644 --- a/api/src/modules/cylinder/cylinder.service.ts +++ b/api/src/modules/cylinder/cylinder.service.ts @@ -1,6 +1,7 @@ -import { Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { Cylinder, User } from 'src/model/entitites'; import { ActivityRepository, CylinderRepository, KeyRepository } from 'src/model/repositories'; +import { ManageHelperService } from 'src/shared/service/system.helper.service'; @Injectable() export class CylinderService { @@ -8,6 +9,7 @@ export class CylinderService { private readonly cylinderRepo: CylinderRepository, private readonly keyRepo: KeyRepository, private systemActivityRepo: ActivityRepository, + private readonly helper: ManageHelperService ) {} async getCylinders(user: User): Promise { @@ -16,24 +18,26 @@ export class CylinderService { order: { name: { direction: 'ASC' } }, relations: ['system', 'keys'], }); - c.map((cc) => (cc.keys = [])); return c; } async deleteCylinder(user: User, cylinderid: string) { - const cylinder = await this.cylinderRepo.findOneOrFail({ - where: { id: cylinderid, system: { managers: { id: user.id } } }, - relations: ['keys'], - }); - await this.keyRepo.softRemove(cylinder.keys); - return this.cylinderRepo.softRemove(cylinder); + const cylinder = await this.helper.getCylinderIfUserCanManage(user, cylinderid, ['keys', 'system', 'keys.cylinder']); + if (!cylinder) { + throw new HttpException('Zylinder nicht gefunden', HttpStatus.BAD_REQUEST) + } + + const keysToDelete = cylinder.keys.filter(k => k.cylinder.length == 1); + await this.keyRepo.softRemove(keysToDelete); + await this.cylinderRepo.softDelete({id: cylinder.id}) + return; } async updateCylinder(user: User, cylinder: Partial) { - const original = await this.cylinderRepo.findOneOrFail({ - where: { id: cylinder.id, system: { managers: { id: user.id } } }, - relations: ['keys', 'system'], - }); + const original = await this.helper.getCylinderIfUserCanManage(user, cylinder.id); + if (!original) { + throw new HttpException('Zylinder nicht gefunden', HttpStatus.BAD_REQUEST) + } Object.keys(cylinder).forEach((k: string) => { original[k] = cylinder[k]; diff --git a/api/src/modules/key/key.module.ts b/api/src/modules/key/key.module.ts index 17b8783..cd87c38 100644 --- a/api/src/modules/key/key.module.ts +++ b/api/src/modules/key/key.module.ts @@ -3,10 +3,11 @@ import { KeyController } from './key.controller'; import { KeyService } from './key.service'; import { DatabaseModule } from 'src/shared/database/database.module'; import { AuthModule } from '../auth/auth.module'; +import { SharedServiceModule } from 'src/shared/service/shared.service.module'; @Module({ controllers: [KeyController], providers: [KeyService], - imports: [DatabaseModule, AuthModule], + imports: [DatabaseModule, AuthModule, SharedServiceModule], }) export class KeyModule {} diff --git a/api/src/modules/key/key.service.ts b/api/src/modules/key/key.service.ts index 31ea8a0..ebe7aaf 100644 --- a/api/src/modules/key/key.service.ts +++ b/api/src/modules/key/key.service.ts @@ -4,11 +4,11 @@ import { IUser } from 'src/model/interface'; import { ActivityRepository, CylinderRepository, - KeyActivityRepository, KeyRepository, KeySystemRepository, } from 'src/model/repositories'; import { KeyHandoutRepository } from 'src/model/repositories/key-handout.repository'; +import { ActivityHelperService } from 'src/shared/service/activity.logger.service'; import { IsNull, Not } from 'typeorm'; @Injectable() @@ -17,9 +17,8 @@ export class KeyService { private readonly keyrepository: KeyRepository, private readonly cylinderRepository: CylinderRepository, private readonly systemRepo: KeySystemRepository, - private activityRepo: KeyActivityRepository, private handoverRepo: KeyHandoutRepository, - private systemActivityRepo: ActivityRepository, + private readonly activityService: ActivityHelperService ) {} async getUsersKeys(user: User): Promise { @@ -41,25 +40,9 @@ export class KeyService { where: { cylinder: { system: { managers: { id: user.id } } } }, }); - const original = await this.keyrepository.findOne({ - where: { id: key.id }, - relations: ['cylinder'], - }); - this.saveLog(original, user); return this.keyrepository.save(this.keyrepository.create(key)); } - private saveLog(key: Key, user: User) { - const l = this.activityRepo.create({ - cylinder: key.cylinder, - handedOut: key.handedOut, - name: key.name, - id: key.id, - nr: key.nr, - user: user, - }); - this.activityRepo.save(l); - } async getUsersCylinders(user: User): Promise { if (!user || !user.id) { @@ -73,7 +56,7 @@ export class KeyService { }); } - async handoverKey(user: IUser, data: any, keyID: string) { + async handoverKey(user: User, data: any, keyID: string) { const key: Key = await this.keyrepository.findOneOrFail({ where: { id: keyID, cylinder: { system: { managers: { id: user.id } } } }, relations: [ 'cylinder', 'cylinder.system' ] @@ -92,13 +75,7 @@ export class KeyService { }), ); - const msg = `Schlüssel ${key.nr} ${res.direction == 'out' ? 'ausgegeben an ' : 'zurückgegeben von '}${res.customer.name}` - this.systemActivityRepo.save( - this.systemActivityRepo.create({ - system: key.cylinder[0].system, - user: user as any, - message: msg, - })) + this.activityService.logKeyHandover(user, key, key.cylinder[0].system, res); return res; } @@ -136,11 +113,7 @@ export class KeyService { async createKey(user: User, key: any) { const k = await this.keyrepository.save(this.keyrepository.create(key)); - this.systemActivityRepo.save({ - message: `Schlüssel ${(k as any).nr} angelegt`, - user: user, - system: (k as any).cylinder[0].system - }); + this.activityService.logKeyCreated(user, key, key.cylinder[0].system); return k; } diff --git a/api/src/modules/system/system.service.ts b/api/src/modules/system/system.service.ts index 50d937a..08a64f0 100644 --- a/api/src/modules/system/system.service.ts +++ b/api/src/modules/system/system.service.ts @@ -10,7 +10,7 @@ export class SystemService { constructor( private systemRepo: KeySystemRepository, private userRepo: UserRepository, - private systemActivityRepo: ActivityRepository, + private systemActivityRepo: ActivityRepository, ) {} async create(user: User, createSystemDto: CreateSystemDto) { diff --git a/api/src/modules/user/user.module.ts b/api/src/modules/user/user.module.ts index 2b60631..cf69949 100644 --- a/api/src/modules/user/user.module.ts +++ b/api/src/modules/user/user.module.ts @@ -3,10 +3,11 @@ import { UserController } from './user.controller'; import { UserService } from './user.service'; import { AuthModule } from '../auth/auth.module'; import { DatabaseModule } from 'src/shared/database/database.module'; +import { SharedServiceModule } from 'src/shared/service/shared.service.module'; @Module({ controllers: [UserController], providers: [UserService], - imports: [AuthModule, DatabaseModule], + imports: [AuthModule, DatabaseModule, SharedServiceModule], }) export class UserModule {} diff --git a/api/src/modules/user/user.service.ts b/api/src/modules/user/user.service.ts index 7d39f38..d60859d 100644 --- a/api/src/modules/user/user.service.ts +++ b/api/src/modules/user/user.service.ts @@ -1,16 +1,16 @@ import { Injectable } from '@nestjs/common'; import { User } from 'src/model/entitites'; import { IUser } from 'src/model/interface'; -import { ActivityRepository, KeyActivityRepository, KeySystemRepository, RoleRepository, UserRepository } from 'src/model/repositories'; -import { FindOperator, FindOperators } from 'typeorm'; - +import { ActivityRepository, KeySystemRepository, RoleRepository, UserRepository } from 'src/model/repositories'; +import { ManageHelperService } from 'src/shared/service/system.helper.service'; @Injectable() export class UserService { constructor( private readonly userRepo: UserRepository, private readonly roleRepo: RoleRepository, private readonly systemRepo: KeySystemRepository, - private readonly systemActivityRepo: ActivityRepository + private readonly systemActivityRepo: ActivityRepository, + private readonly helper: ManageHelperService, ) {} getAllUsers(): Promise { @@ -31,7 +31,7 @@ export class UserService { return this.userRepo.deleteUserById(id); } - async getUserStats(user: IUser) { + async getUserStats(user: User) { const systems = await this.systemRepo.find({ where: { managers: { id: user.id }}, relations: ['cylinders', 'cylinders.keys'], @@ -42,10 +42,12 @@ export class UserService { const keys = cylinders.map(c => c.keys).flat().map(k => k.id); const keycount = [...new Set(keys)] + const handedOut = (await this.helper.getUsersKeys(user)).filter(k => k.handedOut).length; return { keys: keycount.length, cylinders: cylinders.length, - systems: systems.length + systems: systems.length, + handedOut: handedOut } } diff --git a/api/src/shared/database/database.module.ts b/api/src/shared/database/database.module.ts index 019acf7..8231519 100644 --- a/api/src/shared/database/database.module.ts +++ b/api/src/shared/database/database.module.ts @@ -5,7 +5,6 @@ import { Customer, Cylinder, Key, - KeyActivity, KeyHandout, Role, SSOUser, @@ -16,7 +15,6 @@ import { ActivityRepository, CustomerRepository, CylinderRepository, - KeyActivityRepository, KeyRepository, KeySystemRepository, RoleRepository, @@ -32,7 +30,6 @@ const ENTITIES = [ KeySystem, Key, Cylinder, - KeyActivity, Customer, KeyHandout, Activity, @@ -44,7 +41,6 @@ const REPOSITORIES = [ KeySystemRepository, KeyRepository, CylinderRepository, - KeyActivityRepository, CustomerRepository, KeyHandoutRepository, ActivityRepository, diff --git a/api/src/shared/service/activity.logger.service.ts b/api/src/shared/service/activity.logger.service.ts new file mode 100644 index 0000000..2aa0c19 --- /dev/null +++ b/api/src/shared/service/activity.logger.service.ts @@ -0,0 +1,78 @@ +import { Injectable } from "@nestjs/common"; +import { Key, KeyHandout, User } from "src/model/entitites"; +import { KeySystem } from "src/model/entitites/system.entity"; +import { ActivityRepository, CylinderRepository, KeyRepository } from "src/model/repositories"; + +@Injectable() +export class ActivityHelperService { + + constructor( + private readonly activityRepo: ActivityRepository, + private readonly keyRepository: KeyRepository, + private readonly cylinderRepo: CylinderRepository, + ) {} + + + async logDeleteKey(user: User, key: Key, system?: KeySystem) { + if (!key || !user) { return; } + + + if (!system && !key.cylinder) { + key = await this.keyRepository.findOne({ + where: { id: key.id }, + relations: ['cylinder', 'cylinder.system'] + }) + system = key.cylinder[0].system; + } else if (!system && !key.cylinder[0].system) { + const c = await this.cylinderRepo.findOne({ + where: { id: key.cylinder[0].id }, + relations: ['system'] + }); + if (!c) { return; } + system = c.system; + } + + if (!system) { return; } + + let msg = `Schlüssel ${key.nr} entfernt`; + + this.activityRepo.save( + this.activityRepo.create({ + system, + user, + message: msg, + })) + } + + async logKeyCreated(user: User, key: Key, system: KeySystem) { + let msg = `Schlüssel ${key.nr} angelegt`; + this.activityRepo.save( + this.activityRepo.create({ + system, + user, + message: msg, + })) + } + + async logKeyRenamed(user: User, key: Key, system: KeySystem) { + let msg = `Schlüssel ${key.nr} in ${key.name} umbenannt`; + this.activityRepo.save( + this.activityRepo.create({ + system, + user, + message: msg, + })) + } + + logKeyHandover(user: User, key: Key, system: KeySystem, handover: KeyHandout) { + + const msg = `Schlüssel ${key.nr} ${handover.direction == 'out' ? 'ausgegeben an ' : 'zurückgegeben von '}${handover.customer.name}` + this.activityRepo.save( + this.activityRepo.create({ + system, + user, + message: msg, + })) + + } +} \ No newline at end of file diff --git a/api/src/shared/service/shared.service.module.ts b/api/src/shared/service/shared.service.module.ts new file mode 100644 index 0000000..dac53c3 --- /dev/null +++ b/api/src/shared/service/shared.service.module.ts @@ -0,0 +1,18 @@ +import { Module } from "@nestjs/common"; +import { DatabaseModule } from "../database/database.module"; +import { ManageHelperService } from "./system.helper.service"; +import { CylinderRepository, KeySystemRepository } from "src/model/repositories"; +import { Cylinder, User } from "src/model/entitites"; +import { ActivityHelperService } from "./activity.logger.service"; + +@Module({ + imports: [ DatabaseModule ], + providers: [ ManageHelperService, ActivityHelperService ], + exports: [ ManageHelperService, ActivityHelperService ], +}) + +export class SharedServiceModule { + + + +} \ No newline at end of file diff --git a/api/src/shared/service/system.helper.service.ts b/api/src/shared/service/system.helper.service.ts new file mode 100644 index 0000000..b1b8785 --- /dev/null +++ b/api/src/shared/service/system.helper.service.ts @@ -0,0 +1,38 @@ +import { Injectable } from "@nestjs/common"; +import { User, Cylinder, Key } from "src/model/entitites"; +import { KeySystemRepository, CylinderRepository, KeyRepository } from "src/model/repositories"; + +@Injectable() +export class ManageHelperService { + + constructor( + private readonly systemRepository: KeySystemRepository, + private readonly cylinderRepository: CylinderRepository, + private readonly keyRepo: KeyRepository, + ) {} + + + /** + * Gibt den Cylinder zurück wenn der user ein Manager ist. Gibt null zurück wenn er nicht existiert oder der + * User den Cylinder nicht managen darf. + * @param user User + * @param id ID vom Cylinder + * @returns Cylinder | null + */ + async getCylinderIfUserCanManage(user: User, id: string, relations: string[] = ['keys', 'system']): Promise { + const cylinder = await this.cylinderRepository.findOne({ + where: { id: id, system: { managers: { id: user.id } } }, + relations: relations, + }); + return cylinder; + } + + + async getUsersKeys(user: User): Promise { + const keys = await this.keyRepo.find({ + where: { cylinder: { system: { managers: { id: user.id } } } }, + relations: ['cylinder', 'cylinder.system', 'customer'], + }); + return keys; + } +} \ No newline at end of file diff --git a/client/src/app/core/layout/layout.component.html b/client/src/app/core/layout/layout.component.html index 9d76345..17f75fc 100644 --- a/client/src/app/core/layout/layout.component.html +++ b/client/src/app/core/layout/layout.component.html @@ -15,7 +15,7 @@ - + @if (isAdmin) { } diff --git a/client/src/app/model/interface/key.interface.ts b/client/src/app/model/interface/key.interface.ts index 679c980..b3a9a4c 100644 --- a/client/src/app/model/interface/key.interface.ts +++ b/client/src/app/model/interface/key.interface.ts @@ -6,7 +6,7 @@ export interface IKey { createdAt: string; updatedAt: string; handedOut: boolean; - cylinder: ICylinder; + cylinder: ICylinder[]; nr: number; deletedAt?: string; } \ No newline at end of file diff --git a/client/src/app/modules/cylinder/components/delete-cylinder/delete-cylinder.component.html b/client/src/app/modules/cylinder/components/delete-cylinder/delete-cylinder.component.html index f55412d..c1e6974 100644 --- a/client/src/app/modules/cylinder/components/delete-cylinder/delete-cylinder.component.html +++ b/client/src/app/modules/cylinder/components/delete-cylinder/delete-cylinder.component.html @@ -1,9 +1,21 @@ -

Zylinder {{key.name}} löschen?

+

Zylinder {{cylinder.name}} löschen?

-

Soll der Zylinder wirklich gelöscht werden? Alle {{ key.keyCount | number:'0.0-0'}} enthaltenen Schlüssel werden mit entfernt!

- +
+ warning +

+ {{cylinder.name}} wirklich entfernen? + Alle Schlüssel die nur diesen Zylinder haben werden ebenfalls entfernt. +

+

+ + Diese Aktion kann nicht rückgängig gemacht werden. +

+
- - - + + + \ No newline at end of file diff --git a/client/src/app/modules/cylinder/components/delete-cylinder/delete-cylinder.component.ts b/client/src/app/modules/cylinder/components/delete-cylinder/delete-cylinder.component.ts index d997ffe..6ef5d98 100644 --- a/client/src/app/modules/cylinder/components/delete-cylinder/delete-cylinder.component.ts +++ b/client/src/app/modules/cylinder/components/delete-cylinder/delete-cylinder.component.ts @@ -2,17 +2,19 @@ import { CommonModule } from '@angular/common'; import { Component, inject, LOCALE_ID } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; +import { ICylinder } from '../../../../model/interface/cylinder.interface'; @Component({ selector: 'app-delete-cylinder', standalone: true, - imports: [MatDialogModule, MatButtonModule, CommonModule], + imports: [MatDialogModule, MatButtonModule, CommonModule, MatIconModule], providers: [{ provide: LOCALE_ID, useValue: 'de-DE' },], templateUrl: './delete-cylinder.component.html', styleUrl: './delete-cylinder.component.scss' }) export class DeleteCylinderComponent { readonly dialogRef = inject(MatDialogRef); - readonly key = inject(MAT_DIALOG_DATA); + readonly cylinder = inject(MAT_DIALOG_DATA); } diff --git a/client/src/app/modules/dashboard/dashboard.component.html b/client/src/app/modules/dashboard/dashboard.component.html index a13a259..71b6458 100644 --- a/client/src/app/modules/dashboard/dashboard.component.html +++ b/client/src/app/modules/dashboard/dashboard.component.html @@ -1,9 +1,9 @@
-
+
@@ -38,22 +38,36 @@ admin_panel_settings - Systeme + Schließanlagen {{ systemCount }} -

Aktive Systeme

+

Aktive Schließanlagen

+ + + + passkey + Ausgegebene Schlüssel + + + {{ handedOut }} +

Derzeit ausgegebene Schlüssel

+
+ + + +

Letzte Aktivitäten

- + Schlüssel {{key.name}} löschen? +

Schlüssel {{key.name}} löschen?

-

Soll der Schlüssel wirklich gelöscht werden?

- +
+ warning +

+ {{key.name}} wirklich entfernen? +

+

+ + Gelöschte Schlüssel können über das Archiv wiederhergestellt werden. +

+
- - - + + + \ No newline at end of file diff --git a/client/src/app/modules/keys/components/delete-key/delete-key.component.ts b/client/src/app/modules/keys/components/delete-key/delete-key.component.ts index 95af08e..d99096b 100644 --- a/client/src/app/modules/keys/components/delete-key/delete-key.component.ts +++ b/client/src/app/modules/keys/components/delete-key/delete-key.component.ts @@ -2,11 +2,12 @@ import { Component, inject } from '@angular/core'; import { IKey } from '../../../../model/interface/key.interface'; import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; @Component({ selector: 'app-delete-key', standalone: true, - imports: [MatDialogModule, MatButtonModule], + imports: [MatDialogModule, MatButtonModule, MatIconModule], templateUrl: './delete-key.component.html', styleUrl: './delete-key.component.scss' }) diff --git a/client/src/app/modules/keys/components/handover-dialog/handover-dialog.component.html b/client/src/app/modules/keys/components/handover-dialog/handover-dialog.component.html index 00a338f..2ce6c44 100644 --- a/client/src/app/modules/keys/components/handover-dialog/handover-dialog.component.html +++ b/client/src/app/modules/keys/components/handover-dialog/handover-dialog.component.html @@ -43,8 +43,8 @@ - + diff --git a/client/src/app/modules/keys/components/handover-dialog/handover-dialog.component.ts b/client/src/app/modules/keys/components/handover-dialog/handover-dialog.component.ts index 81516cb..509e27f 100644 --- a/client/src/app/modules/keys/components/handover-dialog/handover-dialog.component.ts +++ b/client/src/app/modules/keys/components/handover-dialog/handover-dialog.component.ts @@ -187,10 +187,17 @@ export class HandoverDialogComponent { createCustomer(name: string): Promise { this.isLoading = true; return new Promise((resolve, reject) => { - this.api.createCustomer({ name, system: this.data.cylinder.system}).subscribe({ + this.api.createCustomer({ name, system: this.data.cylinder[0].system}).subscribe({ next: n => { this.isLoading = false; resolve(n); + }, + error: e => { + this.isLoading = false; + const field = e.error.field; + const message = field ? e.error.message : 'Ein Fehler ist aufgetreten. Bitte versuche es später erneut'; + this.toast.error(message); + reject(e); } }) }) diff --git a/client/src/app/modules/system/components/remove-manager-popup/remove-manager-popup.component.html b/client/src/app/modules/system/components/remove-manager-popup/remove-manager-popup.component.html index 57bd3b6..f696395 100644 --- a/client/src/app/modules/system/components/remove-manager-popup/remove-manager-popup.component.html +++ b/client/src/app/modules/system/components/remove-manager-popup/remove-manager-popup.component.html @@ -5,7 +5,7 @@ warning

{{ manager.firstName }} {{ manager.lastName }} wirklich entfernen? - Der Benutzer hat dann keinen Zugriff mehr auf das System mit allen seinen Daten. + Der Benutzer hat dann keinen Zugriff mehr auf diese Schließanlage mit allen ihren Daten.

diff --git a/client/src/app/modules/system/components/remove-manager-popup/remove-manager-popup.component.scss b/client/src/app/modules/system/components/remove-manager-popup/remove-manager-popup.component.scss index aa03e62..e69de29 100644 --- a/client/src/app/modules/system/components/remove-manager-popup/remove-manager-popup.component.scss +++ b/client/src/app/modules/system/components/remove-manager-popup/remove-manager-popup.component.scss @@ -1,19 +0,0 @@ -.warning-message { - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - padding: 1rem; - - mat-icon { - font-size: 48px; - height: 48px; - width: 48px; - margin-bottom: 1rem; - } - - .additional-info { - margin-top: 1rem; - color: rgba(0, 0, 0, 0.6); - } -} \ No newline at end of file diff --git a/client/src/app/modules/system/create/create.component.html b/client/src/app/modules/system/create/create.component.html index 73b0df1..bb979b4 100644 --- a/client/src/app/modules/system/create/create.component.html +++ b/client/src/app/modules/system/create/create.component.html @@ -1,4 +1,4 @@ -

Neuen Schlüssel anlegen

+

Neue Schließanlage anlegen

@@ -8,7 +8,7 @@ @if ((createForm.controls.name.value || '').length > 20) { {{ (createForm.controls.name.value || '').length }} / 100 Zeichen } @else { - Wie soll der Schlüssel heißen? + Wie soll die Anlage heißen? }
diff --git a/client/src/app/modules/system/system.component.html b/client/src/app/modules/system/system.component.html index 83a4783..819d61f 100644 --- a/client/src/app/modules/system/system.component.html +++ b/client/src/app/modules/system/system.component.html @@ -5,5 +5,5 @@ />
- +
\ No newline at end of file diff --git a/client/src/app/shared/ag-grid/components/ag-delete-key/ag-delete-key.component.ts b/client/src/app/shared/ag-grid/components/ag-delete-key/ag-delete-key.component.ts index 1cdb072..c34502b 100644 --- a/client/src/app/shared/ag-grid/components/ag-delete-key/ag-delete-key.component.ts +++ b/client/src/app/shared/ag-grid/components/ag-delete-key/ag-delete-key.component.ts @@ -35,7 +35,9 @@ export class AgDeleteKeyComponent implements ICellRendererAngularComp { delete() { const ref = this.dialog.open(DeleteKeyComponent, { data: this.key, - autoFocus: false + autoFocus: false, + width: '500px', + maxWidth: 'calc(100vw - 24px)', }) ref.afterClosed().subscribe({ diff --git a/client/src/app/shared/api.service.ts b/client/src/app/shared/api.service.ts index d04eb88..b76e2d4 100644 --- a/client/src/app/shared/api.service.ts +++ b/client/src/app/shared/api.service.ts @@ -104,8 +104,8 @@ export class ApiService { }); } - getStats(): Observable<{ keys: number, cylinders: number, systems: number }> { - return this.http.get<{ keys: number, cylinders: number, systems: number }>('api/user/stats'); + getStats(): Observable<{ keys: number, cylinders: number, systems: number, handedOut: number }> { + return this.http.get<{ keys: number, cylinders: number, systems: number, handedOut: number }>('api/user/stats'); } getActivities(): Observable { diff --git a/client/src/styles.scss b/client/src/styles.scss index 2666289..3877e25 100644 --- a/client/src/styles.scss +++ b/client/src/styles.scss @@ -111,4 +111,24 @@ div.ag-row { right: 24px; display: flex; gap: 12px; +} + +.warning-message { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding: 1rem; + + mat-icon { + font-size: 48px; + height: 48px; + width: 48px; + margin-bottom: 1rem; + } + + .additional-info { + margin-top: 1rem; + color: rgba(0, 0, 0, 0.6); + } } \ No newline at end of file