feat(employee): Showing employee-data inside employee-card page. (TV-341)
Squashed commit of the following: commit 4fd71e0d0655a0d75dda59151ac74e2361f187bc Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se> Date: Fri Aug 20 10:59:46 2021 +0200 Updated RoleEnum and mock-data för roles commit f05a93239727ce1245650ece3b48cf75dc7091ca Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se> Date: Fri Aug 20 08:34:20 2021 +0200 Fixed issue with mock-api commit c31e94da6b90e442fd84c5113789db245be81c6d Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se> Date: Fri Aug 20 08:26:14 2021 +0200 Fixed issue with tjanster commit a183a08f0446cdaea7d01c8935d88ac436b0438f Merge: eb310c11e2d925Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se> Date: Fri Aug 20 07:59:06 2021 +0200 Merge branch 'develop' into feature/TV-341-erik commit eb310c10bdf0f4b60032bdda97df75c19bdbf447 Merge: 877b68bfae7d9aAuthor: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se> Date: Fri Aug 20 07:21:39 2021 +0200 Merged develop and fixed conflicts commit 877b68b8827e89cfd230856c9d8247f1cd8db264 Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se> Date: Thu Aug 19 15:01:55 2021 +0200 Now fetching tjanster from mock-api commit 1ecd26595b21ea46ce6fb0c193c6642f66250ae3 Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se> Date: Thu Aug 19 14:24:11 2021 +0200 Some more changes to employee-card commit e42ae254e7aa7b994627fdccb7037493b116d6a2 Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se> Date: Thu Aug 19 13:44:23 2021 +0200 Added new enum Role and fixed some issues mapping roles inside employee-card commit 7801831d83feae5ef5e5b92e6421b18863b2a1db Merge: c78f3f8d6e4666Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se> Date: Thu Aug 19 12:37:56 2021 +0200 Merge branch 'develop' into feature/TV-341-fe-anpassa-personal-kortet-sa-att-den-ar-enligt-skiss commit c78f3f886752477d2dbc4af20356252af4128440 Author: WP\holno <nikola.holst-nikolic@arbetsformedlingen.se> Date: Thu Aug 19 11:19:56 2021 +0200 Authorization commit 9c043720a9cfa5fd6943013f643d948a50c8f135 Merge: 77d6a9cffeb372Author: WP\holno <nikola.holst-nikolic@arbetsformedlingen.se> Date: Thu Aug 19 11:19:43 2021 +0200 Merge branch 'develop' into feature/TV-341-fe-anpassa-personal-kortet-sa-att-den-ar-enligt-skiss # Conflicts: # apps/mina-sidor-fa/src/app/pages/administration/pages/employee-card/employee-card.component.scss # apps/mina-sidor-fa/src/app/pages/administration/pages/employee-card/employee-card.module.ts # apps/mina-sidor-fa/src/app/shared/enums/employee-authorization.enum.ts commit 77d6a9c600e6b42e97fa5431ed37ad430c5febd3 Author: WP\holno <nikola.holst-nikolic@arbetsformedlingen.se> Date: Wed Aug 18 10:22:45 2021 +0200 Moved subscription, added icons, refactured markup commit b43c18e28b5aabb8115fa659a98b4ae8c0a7bf40 Author: WP\holno <nikola.holst-nikolic@arbetsformedlingen.se> Date: Tue Aug 17 10:50:02 2021 +0200 unsubscribed commit 9f48cddc75872fc3f740c53de998cd54666b0b1d Author: WP\holno <nikola.holst-nikolic@arbetsformedlingen.se> Date: Mon Aug 16 16:40:08 2021 +0200 Unsubscription behöver läggas till efter genomgång av hur unsubscribeOnDestroy fungerar commit b2cef346f18482e72c11c09d0a6e629370d01bd5 Author: WP\holno <nikola.holst-nikolic@arbetsformedlingen.se> Date: Mon Aug 16 16:37:13 2021 +0200 Authorization commit 5fe0b5d5fc725551f9e794cbaa70dc0f077f8717 Author: WP\holno <nikola.holst-nikolic@arbetsformedlingen.se> Date: Fri Aug 13 15:46:50 2021 +0200 - Changed first h2 to h3 - Changed link to routerLink commit fd1cb3c6249535ce84e61df035cae63352b1b00b Author: WP\holno <nikola.holst-nikolic@arbetsformedlingen.se> Date: Fri Aug 13 11:53:36 2021 +0200 Amends after PR commit 13e9881e3680bd829736205b3fef57b2228638d5 Author: WP\holno <nikola.holst-nikolic@arbetsformedlingen.se> Date: Wed Aug 11 16:19:36 2021 +0200 Employee-card amends to look more like the sketch.
This commit is contained in:
7
apps/mina-sidor-fa/src/app/shared/enums/role.enum.ts
Normal file
7
apps/mina-sidor-fa/src/app/shared/enums/role.enum.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export enum RoleEnum {
|
||||
OrganizationUser = 'OrganizationUser', // Default role
|
||||
ReportAndPlanning = 'ReportAndPlanning',
|
||||
ReceiveDeltagare = 'ReceiveDeltagare',
|
||||
AuthAdmin = 'AuthAdmin',
|
||||
ContactPerson = 'ContactPerson',
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
export interface AvropTjanstResponse {
|
||||
code: string;
|
||||
name: string;
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
import { RoleEnum } from '@msfa-enums/role.enum';
|
||||
import { PaginationMeta } from '@msfa-models/pagination-meta.model';
|
||||
|
||||
export interface EmployeeCompactResponse {
|
||||
@@ -13,10 +14,10 @@ export interface EmployeeResponse {
|
||||
lastName: string;
|
||||
email: string;
|
||||
personnummer: string;
|
||||
roles: string[];
|
||||
roles: RoleEnum[];
|
||||
tjansteKoder: string[];
|
||||
utforandeVerksamhetIds: string[];
|
||||
adressIds: string[];
|
||||
utforandeVerksamhetIds: number[];
|
||||
adressIds: number[];
|
||||
}
|
||||
|
||||
export interface EmployeesApiResponse {
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
export interface TjanstResponse {
|
||||
code: string;
|
||||
id: string;
|
||||
name: string;
|
||||
tjanstekod: string;
|
||||
tjanstId: number;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
import { AvropTjanstResponse } from './api/avrop-tjanst.response.model';
|
||||
|
||||
export interface AvropTjanst {
|
||||
code: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export function mapResponseToAvropTjanst(data: AvropTjanstResponse): AvropTjanst {
|
||||
const { code, name } = data;
|
||||
|
||||
return {
|
||||
code,
|
||||
name,
|
||||
};
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
import { RoleEnum } from '@msfa-enums/role.enum';
|
||||
import { EmployeeCompactResponse, EmployeeResponse } from './api/employee.response.model';
|
||||
import { PaginationMeta } from './pagination-meta.model';
|
||||
import { Tjanst } from './tjanst.model';
|
||||
|
||||
export interface EmployeeCompact {
|
||||
id: string;
|
||||
@@ -12,12 +14,14 @@ export interface Employee {
|
||||
id: string;
|
||||
firstName: string;
|
||||
lastName: string;
|
||||
fullName: string;
|
||||
email: string;
|
||||
ssn: string;
|
||||
roles: string[];
|
||||
roles: RoleEnum[];
|
||||
tjanstCodes: string[];
|
||||
utforandeVerksamhetIds: string[];
|
||||
utforandeAdressIds: string[];
|
||||
tjanster?: Tjanst[];
|
||||
utforandeVerksamhetIds: number[];
|
||||
utforandeAdressIds: number[];
|
||||
}
|
||||
|
||||
export interface EmployeesData {
|
||||
@@ -29,8 +33,8 @@ export interface EmployeeRequestData {
|
||||
email: string;
|
||||
roles: string[];
|
||||
tjansteKoder: string[];
|
||||
utforandeVerksamhetIds: string[];
|
||||
adressIds: string[];
|
||||
utforandeVerksamhetIds: number[];
|
||||
adressIds: number[];
|
||||
}
|
||||
|
||||
export function mapEmployeeToRequestData(data: Employee): EmployeeRequestData {
|
||||
@@ -71,11 +75,12 @@ export function mapResponseToEmployee(data: EmployeeResponse): Employee {
|
||||
id: ciamUserId,
|
||||
firstName,
|
||||
lastName,
|
||||
fullName: `${firstName} ${lastName}`,
|
||||
email,
|
||||
ssn: personnummer,
|
||||
roles,
|
||||
tjanstCodes: tjansteKoder,
|
||||
utforandeVerksamhetIds,
|
||||
utforandeAdressIds: adressIds,
|
||||
roles: roles || [],
|
||||
tjanstCodes: tjansteKoder || [],
|
||||
utforandeVerksamhetIds: utforandeVerksamhetIds || [],
|
||||
utforandeAdressIds: adressIds || [],
|
||||
};
|
||||
}
|
||||
|
||||
6
apps/mina-sidor-fa/src/app/shared/models/role.model.ts
Normal file
6
apps/mina-sidor-fa/src/app/shared/models/role.model.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import { RoleEnum } from '@msfa-enums/role.enum';
|
||||
|
||||
export interface Role {
|
||||
name: string;
|
||||
type: RoleEnum;
|
||||
}
|
||||
@@ -1,15 +1,19 @@
|
||||
import { TjanstResponse } from './api/tjanst.response.model';
|
||||
|
||||
export interface Tjanst {
|
||||
code: string;
|
||||
id: string;
|
||||
name: string;
|
||||
code: string;
|
||||
tjanstId: number;
|
||||
}
|
||||
|
||||
export function mapTjanstResponseToTjanst(data: TjanstResponse): Tjanst {
|
||||
const { code, name } = data;
|
||||
export function mapResponseToTjanst(data: TjanstResponse): Tjanst {
|
||||
const { id, name, tjanstekod, tjanstId } = data;
|
||||
|
||||
return {
|
||||
code,
|
||||
id,
|
||||
name,
|
||||
code: tjanstekod,
|
||||
tjanstId,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { environment } from '@msfa-environment';
|
||||
import { AvropTjanstResponse } from '@msfa-models/api/avrop-tjanst.response.model';
|
||||
import { AvropResponse } from '@msfa-models/api/avrop.response.model';
|
||||
import { KommunResponse } from '@msfa-models/api/kommun.response.model';
|
||||
import { TjanstResponse } from '@msfa-models/api/tjanst.response.model';
|
||||
import { UtforandeVerksamhetResponse } from '@msfa-models/api/utforande-verksamhet.response.model';
|
||||
import { mapResponseToAvropTjanst } from '@msfa-models/avrop-tjanst.model';
|
||||
import { Avrop, mapAvropResponseToAvrop } from '@msfa-models/avrop.model';
|
||||
import { mapKommunResponseToKommun } from '@msfa-models/kommun.model';
|
||||
import { MultiselectFilterOption } from '@msfa-models/multiselect-filter-option';
|
||||
import { mapTjanstResponseToTjanst } from '@msfa-models/tjanst.model';
|
||||
import { mapUtforandeVerksamhetResponseToUtforandeVerksamhet } from '@msfa-models/utforande-verksamhet.model';
|
||||
import { Observable, of } from 'rxjs';
|
||||
import { delay, filter, map } from 'rxjs/operators';
|
||||
@@ -56,9 +56,9 @@ export class AvropApiService {
|
||||
selectedKommuner: MultiselectFilterOption[],
|
||||
selectedUtforandeVerksamheter: MultiselectFilterOption[]
|
||||
): Observable<MultiselectFilterOption[]> {
|
||||
return this.httpClient.get<{ data: TjanstResponse[] }>(`${this._apiBaseUrl}/tjanster`).pipe(
|
||||
return this.httpClient.get<{ data: AvropTjanstResponse[] }>(`${this._apiBaseUrl}/tjanster`).pipe(
|
||||
filter(response => !!response?.data),
|
||||
map(({ data }) => data.map(tjanster => ({ label: mapTjanstResponseToTjanst(tjanster).name })))
|
||||
map(({ data }) => data.map(tjanster => ({ label: mapResponseToAvropTjanst(tjanster).name })))
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { UnsubscribeDirective } from '@msfa-directives/unsubscribe.directive';
|
||||
import { ErrorType } from '@msfa-enums/error-type.enum';
|
||||
import { SortOrder } from '@msfa-enums/sort-order.enum';
|
||||
import { environment } from '@msfa-environment';
|
||||
import { EmployeeInviteMockApiResponse } from '@msfa-models/api/employee-invite.response.model';
|
||||
import { DeleteEmployeeMockApiResponse } from '@msfa-models/api/delete-employee.response.model';
|
||||
import { EmployeeInviteMockApiResponse } from '@msfa-models/api/employee-invite.response.model';
|
||||
import {
|
||||
EmployeeCompactResponse,
|
||||
EmployeeResponse,
|
||||
@@ -18,23 +19,62 @@ import {
|
||||
mapResponseToEmployee,
|
||||
mapResponseToEmployeeCompact,
|
||||
} from '@msfa-models/employee.model';
|
||||
import { errorToCustomError } from '@msfa-models/error/custom-error';
|
||||
import { Sort } from '@msfa-models/sort.model';
|
||||
import { BehaviorSubject, combineLatest, Observable, throwError } from 'rxjs';
|
||||
import { catchError, map, switchMap, take } from 'rxjs/operators';
|
||||
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 { TjanstService } from './tjanst.service';
|
||||
|
||||
const API_HEADERS = { headers: environment.api.headers };
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class EmployeeService {
|
||||
export class EmployeeService extends UnsubscribeDirective {
|
||||
private _apiUrl = `${environment.api.url}/users`;
|
||||
private _currentEmployeeId$ = new BehaviorSubject<string>(null);
|
||||
private _limit$ = new BehaviorSubject<number>(20);
|
||||
private _page$ = new BehaviorSubject<number>(1);
|
||||
private _sort$ = new BehaviorSubject<Sort<keyof EmployeeCompactResponse>>({ key: 'name', order: SortOrder.ASC });
|
||||
public sort$: Observable<Sort<keyof EmployeeCompactResponse>> = this._sort$.asObservable();
|
||||
private _searchFilter$ = new BehaviorSubject<string>('');
|
||||
private _onlyEmployeesWithoutAuthorization$ = new BehaviorSubject<boolean>(false);
|
||||
private _employee$ = new BehaviorSubject<Employee>(null);
|
||||
|
||||
public employee$: Observable<Employee> = this._employee$.asObservable();
|
||||
constructor(
|
||||
private httpClient: HttpClient,
|
||||
private errorService: ErrorService,
|
||||
private tjanstService: TjanstService
|
||||
) {
|
||||
super();
|
||||
super.unsubscribeOnDestroy(
|
||||
this._currentEmployeeId$
|
||||
.pipe(
|
||||
filter(currentEmployeeId => !!currentEmployeeId),
|
||||
switchMap(currentEmployeeId =>
|
||||
combineLatest([this._fetchEmployee$(currentEmployeeId), this.tjanstService.tjanster$]).pipe(
|
||||
filter(([employee, allTjanster]) => !!(employee && allTjanster?.length)),
|
||||
map(([employee, allTjanster]) => {
|
||||
const tjanster = [];
|
||||
employee.tjanstCodes.forEach(code => {
|
||||
const currentTjanst = allTjanster.find(tjanst => tjanst.code === code);
|
||||
|
||||
if (currentTjanst) {
|
||||
tjanster.push(currentTjanst);
|
||||
}
|
||||
});
|
||||
return { ...employee, tjanster };
|
||||
})
|
||||
)
|
||||
)
|
||||
)
|
||||
.subscribe(employee => {
|
||||
this._employee$.next(employee as Employee);
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
public employeesData$: Observable<EmployeesData> = combineLatest([
|
||||
this._limit$,
|
||||
@@ -48,6 +88,13 @@ export class EmployeeService {
|
||||
)
|
||||
);
|
||||
|
||||
public setCurrentEmployeeId(currentEmployeeId: string): void {
|
||||
if (this._currentEmployeeId$.getValue() !== currentEmployeeId) {
|
||||
this._employee$.next(null);
|
||||
this._currentEmployeeId$.next(currentEmployeeId);
|
||||
}
|
||||
}
|
||||
|
||||
private _fetchEmployees$(
|
||||
limit: number,
|
||||
page: number,
|
||||
@@ -82,14 +129,18 @@ export class EmployeeService {
|
||||
);
|
||||
}
|
||||
|
||||
public fetchDetailedEmployeeData$(id: string): Observable<Employee> {
|
||||
private _fetchEmployee$(id: string): Observable<Employee | Partial<Employee>> {
|
||||
return this.httpClient
|
||||
.get<{ data: EmployeeResponse }>(`${this._apiUrl}/${id}`, { ...API_HEADERS })
|
||||
.pipe(map(result => mapResponseToEmployee(result.data)));
|
||||
.pipe(
|
||||
map(({ data }) => mapResponseToEmployee(data)),
|
||||
catchError(error => {
|
||||
this.errorService.add(errorToCustomError(error));
|
||||
return of({});
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
constructor(private httpClient: HttpClient) {}
|
||||
|
||||
public setSearchFilter(value: string): void {
|
||||
this._searchFilter$.next(value);
|
||||
}
|
||||
@@ -107,8 +158,8 @@ export class EmployeeService {
|
||||
map(response => {
|
||||
return {
|
||||
status: response.status || 200, // mockresponse
|
||||
message: response.message || 'deleted succeeded' // mockresponse
|
||||
}
|
||||
message: response.message || 'deleted succeeded', // mockresponse
|
||||
};
|
||||
}),
|
||||
catchError(error => throwError({ message: error as string, type: ErrorType.API }))
|
||||
);
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { UnsubscribeDirective } from '@msfa-directives/unsubscribe.directive';
|
||||
import { environment } from '@msfa-environment';
|
||||
import { TjanstResponse } from '@msfa-models/api/tjanst.response.model';
|
||||
import { mapResponseToTjanst, Tjanst } from '@msfa-models/tjanst.model';
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
import { filter, map, switchMap } from 'rxjs/operators';
|
||||
|
||||
const API_HEADERS = { headers: environment.api.headers };
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class TjanstService extends UnsubscribeDirective {
|
||||
private _apiUrl = `${environment.api.url}/tjanster`;
|
||||
private _tjanster$ = new BehaviorSubject<Tjanst[]>(null);
|
||||
|
||||
public tjanster$: Observable<Tjanst[]> = this._tjanster$.asObservable();
|
||||
|
||||
private _fetchTjanster$: Observable<Tjanst[]> = this.tjanster$.pipe(
|
||||
filter(tjanster => !tjanster?.length),
|
||||
switchMap(() =>
|
||||
this.httpClient
|
||||
.get<{ data: TjanstResponse[] }>(this._apiUrl, API_HEADERS)
|
||||
.pipe(map(({ data }) => data.map(tjanst => mapResponseToTjanst(tjanst))))
|
||||
)
|
||||
);
|
||||
|
||||
constructor(private httpClient: HttpClient) {
|
||||
super();
|
||||
super.unsubscribeOnDestroy(
|
||||
this._fetchTjanster$.subscribe(tjanster => {
|
||||
this._tjanster$.next(tjanster);
|
||||
})
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user