From b7ff429db342a9fc8e6e7b2c8fc8db57ee791e01 Mon Sep 17 00:00:00 2001 From: Erik Tiekstra Date: Thu, 2 Sep 2021 15:42:03 +0200 Subject: [PATCH] feat(employee): Added functionality to delete employees. (TV-352) Squashed commit of the following: commit 2602b9205ef86307fa7c85ecb6ce87cb51b71150 Author: Erik Tiekstra Date: Thu Sep 2 15:40:49 2021 +0200 Added error-handling commit 4a3f79948b992e5ad7278328957380215ad21ed7 Author: Erik Tiekstra Date: Thu Sep 2 14:48:54 2021 +0200 Removed some unused variables commit f8e69dce84fee2b1fe2a06d6f0960511c286e2b5 Merge: b155865 b80bf22 Author: Erik Tiekstra Date: Thu Sep 2 14:39:44 2021 +0200 Merged develop and fixed conflicts commit b15586559dab669d652d3a44625bacae4620ed40 Author: Erik Tiekstra Date: Thu Sep 2 14:34:58 2021 +0200 Added separate component for employee deletion commit 1720b4954ebbc2868db6f0304fc57b0f3ff07216 Author: Aden Hassan Date: Tue Aug 31 07:50:56 2021 +0200 added the showing of errror- and succsess messages when employee is deleted (TV-352) commit 2556d53802249fff545a2d256a178479103108e7 Author: Aden Hassan Date: Mon Aug 30 13:33:22 2021 +0200 minor change (TV-352) commit 035dbbe67486392a7a9c656ac73103e938953b24 Author: Aden Hassan Date: Mon Aug 30 12:38:07 2021 +0200 added close and open methods for better handling of modal (TV-352) commit abc9ce0f8580ae1b9d784bc7591f095faeddcc33 Author: Aden Hassan Date: Mon Aug 30 12:27:07 2021 +0200 feat(edit-employee): added functionality to delete employee, and catch error if such exists commit 23603dd2d84b0e694a19c2131c9c842cf730d97b Merge: 56a4a6a 02cf0f6 Author: Aden Hassan Date: Mon Aug 30 11:19:18 2021 +0200 Merge branch 'develop' into feature/TV-352-add-delete-employee-button commit 56a4a6a9c9195542f51578bd4ee937086ace8df8 Author: Aden Hassan Date: Fri Aug 27 12:58:23 2021 +0200 added the basic http-delete request method commit 2f61ff7d6ac2c42a7972fc88548d3d59172cbcc1 Author: Aden Hassan Date: Fri Aug 27 09:18:13 2021 +0200 added the basic html/css and functionality for deleting an employee from edit-page --- .../employee-delete.component.html | 32 +++++++++ .../employee-delete.component.scss | 0 .../employee-delete.component.spec.ts | 24 +++++++ .../employee-delete.component.ts | 71 +++++++++++++++++++ .../employee-delete/employee-delete.module.ts | 13 ++++ .../employee-form.component.html | 24 +++---- .../employee-form.component.scss | 6 ++ .../employee-form/employee-form.component.ts | 5 +- .../employee-form/employee-form.module.ts | 10 +-- .../employees-list.component.html | 18 +---- .../employees-list.component.ts | 50 ++----------- .../employees-list/employees-list.module.ts | 3 +- .../pages/employees/employees.component.html | 23 ++---- .../pages/employees/employees.component.ts | 23 ++---- .../pages/employees/employees.module.ts | 2 + .../shared/services/api/employee.service.ts | 40 ++++++----- apps/mina-sidor-fa/src/styles/styles.scss | 4 ++ mock-api/mina-sidor-fa/scripts/employees.js | 4 +- mock-api/mina-sidor-fa/server.js | 5 -- 19 files changed, 218 insertions(+), 139 deletions(-) create mode 100644 apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.html create mode 100644 apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.scss create mode 100644 apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.spec.ts create mode 100644 apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.ts create mode 100644 apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.module.ts diff --git a/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.html b/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.html new file mode 100644 index 0000000..2d42c3e --- /dev/null +++ b/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.html @@ -0,0 +1,32 @@ + + + + +

Personalkonto för {{deleteEmployeeData.lastDeleted.fullName}} är borttaget.

+
+
+ +

Är du säker på att du vill ta bort personalkontot för {{deleteEmployeeData.toDelete.fullName}}?

+
+ + + +

+ Vi kunde inte radera personalkontot för {{deleteEmployeeData.toDelete.fullName}}. Ladda om sidan och försök + igen. +

+

{{error.message}}

+
+
+
+
diff --git a/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.scss b/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.spec.ts b/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.spec.ts new file mode 100644 index 0000000..4bd9592 --- /dev/null +++ b/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.spec.ts @@ -0,0 +1,24 @@ +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { EmployeeDeleteComponent } from './employee-delete.component'; + +describe('EmployeeDeleteComponent', () => { + let component: EmployeeDeleteComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + declarations: [EmployeeDeleteComponent], + imports: [RouterTestingModule], + }).compileComponents(); + + fixture = TestBed.createComponent(EmployeeDeleteComponent); + component = fixture.componentInstance; + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.ts b/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.ts new file mode 100644 index 0000000..bad7e22 --- /dev/null +++ b/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.component.ts @@ -0,0 +1,71 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { Router } from '@angular/router'; +import { Employee } from '@msfa-models/employee.model'; +import { CustomError } from '@msfa-models/error/custom-error'; +import { EmployeeService } from '@msfa-services/api/employee.service'; +import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +interface DeleteEmployeeData { + toDelete: Employee; + lastDeleted: Employee; +} + +@Component({ + selector: 'msfa-employee-delete', + templateUrl: './employee-delete.component.html', + styleUrls: ['./employee-delete.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class EmployeeDeleteComponent { + @Input() returnToEmployeeList = false; + + deleteEmployeeData$: Observable = combineLatest([ + this.employeeService.employeeToDelete$, + this.employeeService.lastDeletedEmployee$, + ]).pipe( + map(([employeeToDelete, lastDeletedEmployee]) => { + return { + toDelete: employeeToDelete, + lastDeleted: lastDeletedEmployee?.id === employeeToDelete?.id ? lastDeletedEmployee : null, + }; + }) + ); + private _errorDuringDeletion$ = new BehaviorSubject(null); + errorDuringDeletion$: Observable = this._errorDuringDeletion$.asObservable(); + + getPrimaryButtonText(lastDeleted: Employee): string { + return lastDeleted ? 'Stäng' : 'Ta bort'; + } + + getSecondaryButtonText(lastDeleted: Employee): string { + return lastDeleted ? null : 'Avbryt'; + } + + constructor(private employeeService: EmployeeService, private router: Router) {} + + deleteEmployeeModelPrimaryClick(deleteEmployeeData: DeleteEmployeeData): void { + const { lastDeleted, toDelete } = deleteEmployeeData; + if (lastDeleted) { + this.closeDeleteEmployeeModal(); + if (this.returnToEmployeeList) { + void this.router.navigateByUrl('/administration/personal'); + } + return; + } + + const deleteEmployeeSubscription = this.employeeService.deleteEmployee(toDelete).subscribe({ + error: (error: CustomError) => { + this._errorDuringDeletion$.next(error); + }, + complete: () => { + deleteEmployeeSubscription.unsubscribe(); + }, + }); + } + + closeDeleteEmployeeModal(): void { + this.employeeService.setEmployeeToDelete(null); + this._errorDuringDeletion$.next(null); + } +} diff --git a/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.module.ts b/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.module.ts new file mode 100644 index 0000000..04e7406 --- /dev/null +++ b/apps/mina-sidor-fa/src/app/pages/administration/components/employee-delete/employee-delete.module.ts @@ -0,0 +1,13 @@ +import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog'; +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { EmployeeDeleteComponent } from './employee-delete.component'; + +@NgModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + declarations: [EmployeeDeleteComponent], + imports: [CommonModule, RouterModule, DigiNgDialogModule], + exports: [EmployeeDeleteComponent], +}) +export class EmployeeDeleteModule {} diff --git a/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.html b/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.html index bcaeebc..e9d2596 100644 --- a/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.html +++ b/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.html @@ -1,18 +1,18 @@
- - - -

{{ employee.fullName }}

+
+

{{ employee.fullName }}

+ + +
diff --git a/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.scss b/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.scss index 178bfa5..a4fda94 100644 --- a/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.scss +++ b/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.scss @@ -2,6 +2,12 @@ @import 'variables/gutters'; .employee-form { + &__header { + display: flex; + justify-content: space-between; + align-items: center; + } + &__block { max-width: var(--digi--typography--text--max-width); margin-bottom: $digi--layout--gutter--xl; diff --git a/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.ts b/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.ts index 720867d..48202ec 100644 --- a/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.ts +++ b/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unsafe-call */ import { FormSelectItem } from '@af/digi-ng/_form/form-select'; import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; @@ -58,4 +57,8 @@ export class EmployeeFormComponent extends UnsubscribeDirective implements OnIni updateEmployee(editEmployeeFormData: EditEmployeeFormData): void { console.log(editEmployeeFormData); } + + setEmployeeToDelete(employee: Employee): void { + this.employeeService.setEmployeeToDelete(employee); + } } diff --git a/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.module.ts b/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.module.ts index 46635fd..9c5fb48 100644 --- a/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.module.ts +++ b/apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.module.ts @@ -1,20 +1,20 @@ -import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog'; +import { DigiNgButtonModule } from '@af/digi-ng/_button/button'; import { DigiNgFormCheckboxModule } from '@af/digi-ng/_form/form-checkbox'; import { DigiNgFormDatepickerModule } from '@af/digi-ng/_form/form-datepicker'; import { DigiNgFormInputModule } from '@af/digi-ng/_form/form-input'; import { DigiNgFormRadiobuttonGroupModule } from '@af/digi-ng/_form/form-radiobutton-group'; import { DigiNgFormSelectModule } from '@af/digi-ng/_form/form-select'; import { DigiNgPopoverModule } from '@af/digi-ng/_popover/popover'; -import { DigiNgButtonModule } from '@af/digi-ng/_button/button'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; +import { HideTextModule } from '@msfa-shared/components/hide-text/hide-text.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LocalDatePipeModule } from '@msfa-shared/pipes/local-date/local-date.module'; -import { EmployeeFormComponent } from './employee-form.component'; +import { EmployeeDeleteModule } from '../../components/employee-delete/employee-delete.module'; import { EditEmployeeFormComponent } from './edit-employee-form/edit-employee-form.component'; -import { HideTextModule } from '@msfa-shared/components/hide-text/hide-text.module'; +import { EmployeeFormComponent } from './employee-form.component'; @NgModule({ schemas: [CUSTOM_ELEMENTS_SCHEMA], @@ -30,9 +30,9 @@ import { HideTextModule } from '@msfa-shared/components/hide-text/hide-text.modu DigiNgFormSelectModule, DigiNgPopoverModule, DigiNgFormCheckboxModule, - DigiNgDialogModule, DigiNgButtonModule, LayoutModule, + EmployeeDeleteModule, HideTextModule, ], }) diff --git a/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html b/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html index f6fd359..9c1211f 100644 --- a/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html +++ b/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html @@ -48,7 +48,7 @@ @@ -57,22 +57,6 @@ - - - -

Är du säker på att du vill ta bort personalkontot för {{employee?.fullName}}?

-
- ; @Output() sorted = new EventEmitter(); @Output() paginated = new EventEmitter(); - @Output() deletedEmployee = new EventEmitter(null); - private componentDestroyed$ = new Subject(); - private _employeeSelected$ = new BehaviorSubject(null); - employeeSelected$: Observable = this._employeeSelected$.asObservable(); - showDialog: boolean; - - constructor(private employeeService: EmployeeService) {} + @Output() deleteEmployee = new EventEmitter(); columnHeaders: { label: string; key: keyof EmployeeCompactResponse }[] = [ { label: 'Namn', key: 'name' }, @@ -72,37 +62,7 @@ export class EmployeesListComponent implements OnDestroy { this.paginated.emit(page); } - onDeleteEmployee(employee: EmployeeCompact): void { - this.employeeService - .deleteEmployee(employee.id) - .pipe(takeUntil(this.componentDestroyed$)) - .subscribe({ - next: (res: DeleteEmployeeMockApiResponse) => { - if (res.status === 200) { - this.employees = this.employees ? this.employees.filter(e => e.id !== employee.id) : []; - this.deletedEmployee.emit(employee); - } - }, - complete: () => { - this.showDialog = false; - }, - error: err => { - console.log(err); - }, - }); - } - - openDialog(val: boolean, employee: EmployeeCompact): void { - if (!val) { - this.showDialog = false; - return; - } - this.showDialog = val; - this._employeeSelected$.next(employee); - } - - ngOnDestroy(): void { - this.componentDestroyed$.next(); - this.componentDestroyed$.complete(); + emitDeleteEmployee(employee: EmployeeCompact): void { + this.deleteEmployee.emit(employee); } } diff --git a/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/components/employees-list/employees-list.module.ts b/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/components/employees-list/employees-list.module.ts index 88b9fff..40d0470 100644 --- a/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/components/employees-list/employees-list.module.ts +++ b/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/components/employees-list/employees-list.module.ts @@ -1,4 +1,3 @@ -import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; @@ -7,7 +6,7 @@ import { EmployeesListComponent } from './employees-list.component'; @NgModule({ schemas: [CUSTOM_ELEMENTS_SCHEMA], declarations: [EmployeesListComponent], - imports: [CommonModule, RouterModule, DigiNgDialogModule], + imports: [CommonModule, RouterModule], exports: [EmployeesListComponent], }) export class EmployeesListModule {} diff --git a/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.component.html b/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.component.html index b886c56..1e53a82 100644 --- a/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.component.html +++ b/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.component.html @@ -12,22 +12,6 @@ -
- -

- {{deletedEmployee?.fullName + (deletedEmployee?.fullName[deletedEmployee?.fullName.length -1] === 's' ? '' : - 's') }} personalkonto är borttaget. -

-
-
-

Personallista

@@ -39,10 +23,13 @@
+ + diff --git a/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.component.ts b/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.component.ts index cae6c8c..7ab1db0 100644 --- a/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.component.ts +++ b/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.component.ts @@ -14,14 +14,12 @@ import { BehaviorSubject, Observable } from 'rxjs'; }) export class EmployeesComponent { private _searchValue$ = new BehaviorSubject(''); - private _onlyEmployeesWithoutAuthorization$ = new BehaviorSubject(false); + onlyEmployeesWithoutAuthorization$: Observable = this.employeeService.onlyEmployeesWithoutAuthorization$; employeesData$: Observable = this.employeeService.employeesData$; sort$: Observable> = this.employeeService.sort$; - private _deletedEmployee$ = new BehaviorSubject(null); - deletedEmployee$: Observable = this._deletedEmployee$.asObservable(); iconType = IconType; - constructor(private employeeService: EmployeeService) { } + constructor(private employeeService: EmployeeService) {} get searchValue(): string { return this._searchValue$.getValue(); @@ -43,20 +41,11 @@ export class EmployeesComponent { this.employeeService.setPage(page); } - get onlyEmployeesWithoutAuthorization(): boolean { - return this._onlyEmployeesWithoutAuthorization$.getValue(); + setOnlyEmployeesWithoutAuthorization(checked: boolean): void { + this.employeeService.setOnlyEmployeesWithoutAuthorization(checked); } - setOnlyEmployeesWithoutAuthorization(event: CustomEvent<{ target: { checked: boolean } }>): void { - this._onlyEmployeesWithoutAuthorization$.next(event.detail.target.checked); - this.employeeService.setOnlyEmployeesWithoutAuthorization(this.onlyEmployeesWithoutAuthorization); - } - - handleDeletedEmployee(employee: Employee): void { - this._deletedEmployee$.next(employee); - } - - onCloseAlert(): void { - this._deletedEmployee$.next(null); + setEmployeeToDelete(employee: Employee): void { + this.employeeService.setEmployeeToDelete(employee); } } diff --git a/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.module.ts b/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.module.ts index 606485b..f9f168a 100644 --- a/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.module.ts +++ b/apps/mina-sidor-fa/src/app/pages/administration/pages/employees/employees.module.ts @@ -6,6 +6,7 @@ import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; +import { EmployeeDeleteModule } from '../../components/employee-delete/employee-delete.module'; import { EmployeesListModule } from './components/employees-list/employees-list.module'; import { EmployeesComponent } from './employees.component'; @@ -19,6 +20,7 @@ import { EmployeesComponent } from './employees.component'; DigiNgLinkInternalModule, DigiNgSkeletonBaseModule, EmployeesListModule, + EmployeeDeleteModule, DigiNgLinkButtonModule, FormsModule, ], diff --git a/apps/mina-sidor-fa/src/app/shared/services/api/employee.service.ts b/apps/mina-sidor-fa/src/app/shared/services/api/employee.service.ts index 0021f5b..b8fa791 100644 --- a/apps/mina-sidor-fa/src/app/shared/services/api/employee.service.ts +++ b/apps/mina-sidor-fa/src/app/shared/services/api/employee.service.ts @@ -5,7 +5,6 @@ import { ErrorType } from '@msfa-enums/error-type.enum'; import { RoleEnum } from '@msfa-enums/role.enum'; import { SortOrder } from '@msfa-enums/sort-order.enum'; import { environment } from '@msfa-environment'; -import { DeleteEmployeeMockApiResponse } from '@msfa-models/api/delete-employee.response.model'; import { EmployeeInviteResponse } from '@msfa-models/api/employee-invite.response.model'; import { EmployeeCompactResponse, @@ -25,7 +24,7 @@ import { mapRoleResponseToRoleObject, Role } from '@msfa-models/role.model'; import { Sort } from '@msfa-models/sort.model'; import { ErrorService } from '@msfa-services/error.service'; import { BehaviorSubject, combineLatest, Observable, of, throwError } from 'rxjs'; -import { catchError, filter, map, switchMap, take } from 'rxjs/operators'; +import { catchError, filter, map, switchMap, take, tap } from 'rxjs/operators'; import { TjanstService } from './tjanst.service'; @Injectable({ @@ -40,9 +39,14 @@ export class EmployeeService extends UnsubscribeDirective { public sort$: Observable> = this._sort$.asObservable(); private _searchFilter$ = new BehaviorSubject(''); private _onlyEmployeesWithoutAuthorization$ = new BehaviorSubject(false); + public onlyEmployeesWithoutAuthorization$: Observable = this._onlyEmployeesWithoutAuthorization$.asObservable(); private _employee$ = new BehaviorSubject(null); - public employee$: Observable = this._employee$.asObservable(); + private _lastDeletedEmployee$ = new BehaviorSubject(null); + public lastDeletedEmployee$: Observable = this._lastDeletedEmployee$.asObservable(); + private _employeeToDelete$ = new BehaviorSubject(null); + public employeeToDelete$: Observable = this._employeeToDelete$.asObservable(); + constructor( private httpClient: HttpClient, private errorService: ErrorService, @@ -58,7 +62,7 @@ export class EmployeeService extends UnsubscribeDirective { filter(([employee, allTjanster]) => !!(employee && allTjanster?.length)), map(([employee, allTjanster]) => { const tjanster = []; - employee.tjanstCodes.forEach(code => { + employee.tjanstCodes?.forEach(code => { const currentTjanst = allTjanster.find(tjanst => tjanst.code === code); if (currentTjanst) { @@ -82,6 +86,7 @@ export class EmployeeService extends UnsubscribeDirective { this._sort$, this._searchFilter$, this._onlyEmployeesWithoutAuthorization$, + this._lastDeletedEmployee$, ]).pipe( switchMap(([limit, page, sort, searchFilter, onlyEmployeesWithoutAuthorization]) => this._fetchEmployees$(limit, page, sort, searchFilter, onlyEmployeesWithoutAuthorization) @@ -144,17 +149,17 @@ export class EmployeeService extends UnsubscribeDirective { this._onlyEmployeesWithoutAuthorization$.next(value); } - // Not done, waiting for delete api http response - public deleteEmployee(id: string): Observable { - return this.httpClient.delete(`${this._apiBaseUrl}/${id}`).pipe( - take(1), - map(response => { - return { - status: response.status || 200, // mockresponse - message: response.message || 'deleted succeeded', // mockresponse - }; + public setEmployeeToDelete(employee: Employee): void { + this._employeeToDelete$.next(employee); + } + + public deleteEmployee(employee: Employee): Observable> { + return this.httpClient.delete(`${this._apiBaseUrl}/hubba`).pipe( + tap(() => { + this._lastDeletedEmployee$.next(employee); }), - catchError(error => throwError({ message: error as string, type: ErrorType.API })) + map(() => employee), + catchError(error => throwError(errorToCustomError(error))) ); } @@ -184,8 +189,11 @@ export class EmployeeService extends UnsubscribeDirective { }) .pipe( take(1), - map(res => res.data), - catchError(error => throwError({ message: error as string, type: ErrorType.API })) + map(({ data }) => data), + catchError(error => { + this.errorService.add(errorToCustomError(error)); + return of(null); + }) ); } diff --git a/apps/mina-sidor-fa/src/styles/styles.scss b/apps/mina-sidor-fa/src/styles/styles.scss index c2b5762..f3c7da1 100644 --- a/apps/mina-sidor-fa/src/styles/styles.scss +++ b/apps/mina-sidor-fa/src/styles/styles.scss @@ -68,6 +68,10 @@ dl { @include msfa__a11y-sr-only; } + &__small-text { + font-size: 0.875rem !important; + } + &__spinner { display: inline-flex; animation: spinning infinite 0.6s linear; diff --git a/mock-api/mina-sidor-fa/scripts/employees.js b/mock-api/mina-sidor-fa/scripts/employees.js index e7fc975..f270dc6 100644 --- a/mock-api/mina-sidor-fa/scripts/employees.js +++ b/mock-api/mina-sidor-fa/scripts/employees.js @@ -18,9 +18,11 @@ function generateEmployees(amount = 10) { const currentTjanster = chooseRandom(TJANSTER, faker.datatype.number({ min: 1, max: TJANSTER.length })); const currentUtforandeVerksamheter = chooseRandom(UTFORANDEVERKSAMHETER, faker.datatype.number({ min: 1, max: 5 })); const hasBehorigheter = Math.random() > 0.1; + const id = faker.datatype.uuid(); const employee = { - ciamUserId: faker.datatype.uuid(), + id, + ciamUserId: id, firstName, lastName, name: `${firstName} ${lastName}`, diff --git a/mock-api/mina-sidor-fa/server.js b/mock-api/mina-sidor-fa/server.js index de7d9fb..53fc529 100644 --- a/mock-api/mina-sidor-fa/server.js +++ b/mock-api/mina-sidor-fa/server.js @@ -12,7 +12,6 @@ server.use( '*sort=utforandeVerksamhet*': '$1sort=utforandeVerksamhet[0]$2', '*sort=tjanst*': '$1sort=tjanst[0]$2', '/users/invite*': '/invites$1', - '/users/:id': '/employees?ciamUserId=:id', '/users*': '/employees$1', '/employees*search=*': '/employees$1fullName_like=$2', '/employees*onlyEmployeesWithoutAuthorization=*': '/employees$1roles.length_lte=1', @@ -88,10 +87,6 @@ router.render = (req, res) => { const authRegex = /(?:\/auth\/)(userinfo|organizations)/g; const isAuthPath = authRegex.exec(pathname); - if (isEmployeePath) { - data = data[0]; - } - if (isAuthPath) { const authSubPath = isAuthPath[1];