From 4334fd73640eae99b7fe49df93381ba66e2076a4 Mon Sep 17 00:00:00 2001 From: Erik Tiekstra Date: Thu, 20 May 2021 15:20:29 +0200 Subject: [PATCH] feat(api): Added connection to the dotnet api (TV-189) Squashed commit of the following: commit 6f06bf69b87c77473c21fbe5fcc5669964793b17 Author: Erik Tiekstra Date: Thu May 20 15:01:16 2021 +0200 Fixed issue with including qp insde breadcrumbs commit 579b6105acc7a60864f07b6082329872a2105bd3 Author: Erik Tiekstra Date: Thu May 20 14:46:54 2021 +0200 Added some more data to the mock-api and fixed navigation-bar commit f9b820136017584655fadafaf716155aec85316e Author: Erik Tiekstra Date: Thu May 20 10:11:55 2021 +0200 Updated mock-api commit 5367d2a475b1c0b8807cf5a9c3f8987b3a586de4 Author: Erik Tiekstra Date: Wed May 19 16:00:07 2021 +0200 Added different config for dotnet api commit 47de5b8ad7c0924c82f07568aa2a4386613e3bd6 Merge: 22d5e9a dc40953 Author: Erik Tiekstra Date: Wed May 19 07:54:55 2021 +0200 Merged develop commit 22d5e9a126e3c1237531407ec3e6d47fbfea55e8 Author: Erik Tiekstra Date: Wed May 12 11:48:25 2021 +0200 Added new configuration to talk with local API --- angular.json | 12 +++ apps/dafa-web/src/app/app.component.ts | 7 +- .../navigation/navigation.component.html | 22 +++-- .../navigation/navigation.component.scss | 51 +++-------- .../toast-list/toast/toast.component.html | 8 +- .../toast-list/toast/toast.component.ts | 2 + .../toast-list/toast/toast.module.ts | 2 + .../src/app/data/enums/access-group.enum.ts | 28 ------ .../src/app/data/enums/authorization.enum.ts | 28 ++++++ .../src/app/data/enums/icon-type.enum.ts | 4 + .../src/app/data/models/employee.model.ts | 86 +++++++++++++++---- ...{agency.model.ts => organization.model.ts} | 8 +- .../src/app/data/models/user.model.ts | 60 ++++++++++--- .../employee-card.component.html | 22 ++--- .../employees-list.component.html | 12 +-- .../src/app/services/api/employee.service.ts | 21 +++-- .../app/services/api/participants.service.ts | 2 +- .../src/app/services/api/user.service.ts | 12 +-- .../components/icon/icon.component.html | 7 ++ .../utils/map-paths-to-breadcrumbs.util.ts | 2 +- .../src/environments/environment.dotnet.ts | 7 ++ .../src/environments/environment.prod.ts | 3 +- apps/dafa-web/src/environments/environment.ts | 3 +- config/proxy.conf.dotnet.json | 6 ++ config/proxy.conf.json | 7 +- mock-api/dafa-web/routes.json | 4 +- mock-api/dafa-web/scripts/current-user.js | 28 ++++++ mock-api/dafa-web/scripts/employees.js | 43 +++++----- mock-api/dafa-web/scripts/generate-api.js | 8 +- .../scripts/{agencies.js => organizations.js} | 12 +-- mock-api/dafa-web/scripts/services.js | 24 +++--- package.json | 2 + 32 files changed, 339 insertions(+), 204 deletions(-) delete mode 100644 apps/dafa-web/src/app/data/enums/access-group.enum.ts create mode 100644 apps/dafa-web/src/app/data/enums/authorization.enum.ts rename apps/dafa-web/src/app/data/models/{agency.model.ts => organization.model.ts} (51%) create mode 100644 apps/dafa-web/src/environments/environment.dotnet.ts create mode 100644 config/proxy.conf.dotnet.json create mode 100644 mock-api/dafa-web/scripts/current-user.js rename mock-api/dafa-web/scripts/{agencies.js => organizations.js} (75%) diff --git a/angular.json b/angular.json index 36218e7..797545d 100644 --- a/angular.json +++ b/angular.json @@ -90,6 +90,14 @@ "with": "apps/dafa-web/src/environments/environment.pega.ts" } ] + }, + "dotnet": { + "fileReplacements": [ + { + "replace": "apps/dafa-web/src/environments/environment.ts", + "with": "apps/dafa-web/src/environments/environment.dotnet.ts" + } + ] } } }, @@ -105,6 +113,10 @@ }, "pega": { "browserTarget": "dafa-web:build:pega" + }, + "dotnet": { + "proxyConfig": "./config/proxy.conf.dotnet.json", + "browserTarget": "dafa-web:build:dotnet" } } }, diff --git a/apps/dafa-web/src/app/app.component.ts b/apps/dafa-web/src/app/app.component.ts index cd32f35..33fabaf 100644 --- a/apps/dafa-web/src/app/app.component.ts +++ b/apps/dafa-web/src/app/app.component.ts @@ -30,7 +30,12 @@ export class AppComponent extends UnsubscribeDirective { super(); super.unsubscribeOnDestroy( this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => { - const paths = this.router.url.split('/').filter(path => !!path); + const urlTree = this.router.parseUrl(this.router.url); + urlTree.queryParams = {}; + const paths = urlTree + .toString() + .split('/') + .filter(path => !!path); this._breadcrumbsItems$.next(mapPathsToBreadcrumbs(paths, this.startBreadcrumb)); }) ); diff --git a/apps/dafa-web/src/app/components/navigation/navigation.component.html b/apps/dafa-web/src/app/components/navigation/navigation.component.html index 8b48e1b..2614b2a 100644 --- a/apps/dafa-web/src/app/components/navigation/navigation.component.html +++ b/apps/dafa-web/src/app/components/navigation/navigation.component.html @@ -5,6 +5,22 @@ diff --git a/apps/dafa-web/src/app/components/navigation/navigation.component.scss b/apps/dafa-web/src/app/components/navigation/navigation.component.scss index 1d10f1b..6dce856 100644 --- a/apps/dafa-web/src/app/components/navigation/navigation.component.scss +++ b/apps/dafa-web/src/app/components/navigation/navigation.component.scss @@ -1,6 +1,7 @@ @import 'mixins/list'; @import 'variables/breakpoints'; @import 'variables/colors'; +@import 'variables/gutters'; @import 'variables/navigation'; .navigation { @@ -36,61 +37,35 @@ @include dafa__reset-list; display: flex; height: 100%; + gap: $digi--layout--gutter--l; + color: var(--digi--typography--color--text--light); + margin-right: var(--digi--layout--gutter); } &__item { display: flex; align-items: center; - border-left: 1px solid var(--digi--ui--color--background--off); - &--no-link { - padding: 0 var(--digi--layout--gutter); - flex-direction: column; - } - - &:first-child { - margin-left: 0; - } - - &:last-child { - border-right: 1px solid var(--digi--ui--color--background--off); + &--user { + padding: var(--digi--layout--gutter--s); } } - &__link, - &__no-link { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: --digi--typography--font-size--xs; - color: var(--digi--typography--color--text--light); - width: 7rem; - height: 100%; - font-weight: var(--digi--typography--font-weight); + &__link { text-decoration: none; + display: flex; + color: var(--digi--typography--color--text--light); + padding: var(--digi--layout--gutter--s); } &__link { &:hover { - background-color: $digi--ui--color--primary-light; - } - - &--active { - &::after { - content: ''; - position: absolute; - right: 0; - bottom: 0; - left: 0; - height: 5px; - background-color: $digi--ui--color--secondary; - } } } &__text { - margin-top: var(--digi--layout--gutter--xs); + margin-right: var(--digi--layout--gutter); + font-size: var(--digi--typography--font-size--xs); + // margin-top: var(--digi--layout--gutter--xs); } } diff --git a/apps/dafa-web/src/app/components/toast-list/toast/toast.component.html b/apps/dafa-web/src/app/components/toast-list/toast/toast.component.html index c7dcf17..fec50c4 100644 --- a/apps/dafa-web/src/app/components/toast-list/toast/toast.component.html +++ b/apps/dafa-web/src/app/components/toast-list/toast/toast.component.html @@ -1,12 +1,12 @@
- - - + + +

{{ error.name }}

{{ error.message }}

diff --git a/apps/dafa-web/src/app/components/toast-list/toast/toast.component.ts b/apps/dafa-web/src/app/components/toast-list/toast/toast.component.ts index ab5a78d..320fc70 100644 --- a/apps/dafa-web/src/app/components/toast-list/toast/toast.component.ts +++ b/apps/dafa-web/src/app/components/toast-list/toast/toast.component.ts @@ -1,5 +1,6 @@ import { AfterViewInit, ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { ErrorSeverity } from '@dafa-enums/error-severity.enum'; +import { IconType } from '@dafa-enums/icon-type.enum'; import { CustomError } from '@dafa-models/error/custom-error'; @Component({ @@ -12,6 +13,7 @@ export class ToastComponent implements AfterViewInit { @Input() error: CustomError; @Output() closeToast: EventEmitter = new EventEmitter(); + iconType = IconType; errorSeverity = ErrorSeverity; ngAfterViewInit(): void { diff --git a/apps/dafa-web/src/app/components/toast-list/toast/toast.module.ts b/apps/dafa-web/src/app/components/toast-list/toast/toast.module.ts index b29f33f..64dde9d 100644 --- a/apps/dafa-web/src/app/components/toast-list/toast/toast.module.ts +++ b/apps/dafa-web/src/app/components/toast-list/toast/toast.module.ts @@ -4,6 +4,7 @@ import { DigiNgIconInfoCircleRegModule } from '@af/digi-ng/_icon/icon-info-circl import { DigiNgIconXModule } from '@af/digi-ng/_icon/icon-x'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { IconModule } from '@dafa-shared/components/icon/icon.module'; import { ToastComponent } from './toast.component'; @NgModule({ @@ -15,6 +16,7 @@ import { ToastComponent } from './toast.component'; DigiNgIconExclamationCircleModule, DigiNgIconExclamationTriangleModule, DigiNgIconInfoCircleRegModule, + IconModule, ], exports: [ToastComponent], }) diff --git a/apps/dafa-web/src/app/data/enums/access-group.enum.ts b/apps/dafa-web/src/app/data/enums/access-group.enum.ts deleted file mode 100644 index 3341a23..0000000 --- a/apps/dafa-web/src/app/data/enums/access-group.enum.ts +++ /dev/null @@ -1,28 +0,0 @@ -export enum AccessGroup { - UserManagement = 'UserManagement', - Economy = 'Economy', - Reports = 'Reports', - ParticipantManagement = 'ParticipantManagement', - User = 'User', -} - -export enum PegaAccessGroup { - Users = 'MeetTest:Users', - Administrators = 'MeetTest:Administrators', -} - -export function mapPegaAccessGroupToAccessGroups(pegaAccessGroup: PegaAccessGroup): AccessGroup[] { - const accessGroups: AccessGroup[] = []; - switch (pegaAccessGroup) { - case PegaAccessGroup.Users: - accessGroups.push(AccessGroup.User); - break; - case PegaAccessGroup.Administrators: - accessGroups.push(AccessGroup.UserManagement); - break; - default: - break; - } - - return accessGroups; -} diff --git a/apps/dafa-web/src/app/data/enums/authorization.enum.ts b/apps/dafa-web/src/app/data/enums/authorization.enum.ts new file mode 100644 index 0000000..d57c73d --- /dev/null +++ b/apps/dafa-web/src/app/data/enums/authorization.enum.ts @@ -0,0 +1,28 @@ +export enum Authorization { + UserManagement = 'UserManagement', + Economy = 'Economy', + Reports = 'Reports', + ParticipantManagement = 'ParticipantManagement', + User = 'User', +} + +export enum PegaAuthorization { + Users = 'MeetTest:Users', + Administrators = 'MeetTest:Administrators', +} + +export function mapPegaAuthorizationToAuthorization(pegaAuthorization: PegaAuthorization): Authorization[] { + const authorizations: Authorization[] = []; + switch (pegaAuthorization) { + case PegaAuthorization.Users: + authorizations.push(Authorization.User); + break; + case PegaAuthorization.Administrators: + authorizations.push(Authorization.UserManagement); + break; + default: + break; + } + + return authorizations; +} diff --git a/apps/dafa-web/src/app/data/enums/icon-type.enum.ts b/apps/dafa-web/src/app/data/enums/icon-type.enum.ts index 9e13103..37167f2 100644 --- a/apps/dafa-web/src/app/data/enums/icon-type.enum.ts +++ b/apps/dafa-web/src/app/data/enums/icon-type.enum.ts @@ -9,4 +9,8 @@ export enum IconType { ENVELOPE = 'envelope', SOK_KANDIDAT = 'sok-kandidat', EDIT = 'edit', + INFO = 'info', + WARNING = 'warning', + APPROVED = 'approved', + X = 'x', } diff --git a/apps/dafa-web/src/app/data/models/employee.model.ts b/apps/dafa-web/src/app/data/models/employee.model.ts index 55449e2..0c2d0f2 100644 --- a/apps/dafa-web/src/app/data/models/employee.model.ts +++ b/apps/dafa-web/src/app/data/models/employee.model.ts @@ -1,7 +1,7 @@ -import { mapPegaAccessGroupToAccessGroups, PegaAccessGroup } from '@dafa-enums/access-group.enum'; -import { Agency } from '@dafa-models/agency.model'; +import { mapPegaAuthorizationToAuthorization, PegaAuthorization } from '@dafa-enums/authorization.enum'; +import { Service } from '@dafa-enums/service.enum'; import { Participant } from './participant.model'; -import { User } from './user.model'; +import { User, UserApiResponse } from './user.model'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface Employee extends User { @@ -10,12 +10,19 @@ export interface Employee extends User { start: Date; end: Date; }[]; - ssn: string; - agencies: Agency[]; + participants: Participant[]; + services: Service[]; + active: boolean; +} + +export interface EmployeeApiResponse extends UserApiResponse { + active: boolean; + services: Service[]; + languages: string[]; participants: Participant[]; } -export interface EmployeesApiResponse { +export interface PegaEmployeesApiResponse { pxMore: string; pxObjClass: string; pxPageCount: string; @@ -24,11 +31,11 @@ export interface EmployeesApiResponse { pxTotalResultCount: string; pyMaxRecords: string; pyObjClass: string; - pxResults: EmployeeApiResponse[]; + pxResults: PegaEmployeeApiResponse[]; pzPerformanceSettings: string[]; } -export interface EmployeeApiResponse { +export interface PegaEmployeeApiResponse { pxInsHandle: string; pxObjClass: string; pyAccessGroup: string; @@ -42,13 +49,13 @@ export interface EmployeeApiResponse { pyUserName: string; } -export interface EmployeeApiRequestData { +export interface PegaEmployeeApiRequestData { pyFirstName: string; pyLastName: string; pyTelephone: string; } -export interface EmployeeApiPostResponse { +export interface PegaEmployeeApiPostResponse { pxObjClass: string; pyErrorMessage: string; pyFirstName: string; @@ -58,7 +65,7 @@ export interface EmployeeApiPostResponse { pyUserIdentifier: string; } -export function mapEmployeeToEmployeeApiRequestData(data: Employee): EmployeeApiRequestData { +export function mapEmployeeToEmployeeApiRequestData(data: Employee): PegaEmployeeApiRequestData { return { pyFirstName: data.firstName, pyLastName: data.lastName, @@ -66,24 +73,65 @@ export function mapEmployeeToEmployeeApiRequestData(data: Employee): EmployeeApi }; } -export function mapEmployeeReponseToEmployee(data: EmployeeApiResponse): Employee { +export function mapPegaEmployeeReponseToEmployee(data: PegaEmployeeApiResponse): Employee { return { id: data.pyUserIdentifier, lastName: data.pyLastName, firstName: data.pyFirstName, fullName: `${data.pyFirstName} ${data.pyLastName}`, - organization: data.pyOrganization, - organizationDivision: data.pyOrgDivision, - organizationUnit: data.pyOrgUnit, + organization: { + id: '', + name: data.pyOrganization, + kaNumber: null, + address: { + street: null, + houseNumber: null, + postalCode: null, + city: null, + kommun: null, + }, + }, phone: data.pyTelephone, email: '', - accessGroups: mapPegaAccessGroupToAccessGroups(data.pyAccessGroup as PegaAccessGroup), - utforandeverksamhet: '', - service: '', + authorizations: mapPegaAuthorizationToAuthorization(data.pyAccessGroup as PegaAuthorization), + services: [], languages: [], outOfOffice: null, ssn: '', - agencies: [], participants: [], + active: true, + }; +} + +export function mapEmployeeReponseToEmployee(data: EmployeeApiResponse): Employee { + const { + id, + firstName, + lastName, + phone, + email, + ssn, + active, + services, + languages, + organization, + authorizations, + participants, + } = data; + return { + id, + firstName, + lastName, + fullName: `${firstName} ${lastName}`, + organization, + phone, + email, + authorizations, + services, + languages, + outOfOffice: null, + ssn, + participants, + active, }; } diff --git a/apps/dafa-web/src/app/data/models/agency.model.ts b/apps/dafa-web/src/app/data/models/organization.model.ts similarity index 51% rename from apps/dafa-web/src/app/data/models/agency.model.ts rename to apps/dafa-web/src/app/data/models/organization.model.ts index da464b6..62f8e2b 100644 --- a/apps/dafa-web/src/app/data/models/agency.model.ts +++ b/apps/dafa-web/src/app/data/models/organization.model.ts @@ -1,11 +1,11 @@ -export interface Agency { +export interface Organization { id: string; name: string; - kaNumber: number; + kaNumber: string; address: { street: string; - houseNumber: number; - postalCode: number; + houseNumber: string; + postalCode: string; city: string; kommun: string; }; diff --git a/apps/dafa-web/src/app/data/models/user.model.ts b/apps/dafa-web/src/app/data/models/user.model.ts index 57903c7..07ed5ed 100644 --- a/apps/dafa-web/src/app/data/models/user.model.ts +++ b/apps/dafa-web/src/app/data/models/user.model.ts @@ -1,21 +1,30 @@ -import { AccessGroup, mapPegaAccessGroupToAccessGroups, PegaAccessGroup } from '@dafa-enums/access-group.enum'; +import { Authorization, mapPegaAuthorizationToAuthorization, PegaAuthorization } from '@dafa-enums/authorization.enum'; +import { Organization } from './organization.model'; export interface User { id: string; firstName: string; lastName: string; fullName: string; - organization: string; - organizationDivision: string; - organizationUnit: string; + ssn: string; phone: string; email: string; - accessGroups: AccessGroup[]; - utforandeverksamhet: string; - service: string; + organization: Organization; + authorizations: Authorization[]; } export interface UserApiResponse { + id: string; + firstName: string; + lastName: string; + ssn: string; + phone: string; + email: string; + organization: Organization; + authorizations: Authorization[]; +} + +export interface PegaUserApiResponse { pxInsName: string; pxLimitedAccess: string; pxObjClass: string; @@ -39,19 +48,42 @@ export interface UserApiResponse { }; } -export function mapUserApiReponseToUser(data: UserApiResponse): User { +export function mapUserApiResponseToUser(data: UserApiResponse): User { + const { id, firstName, lastName, ssn, organization, phone, email, authorizations } = data; + return { + id, + firstName, + lastName, + fullName: `${firstName} ${lastName}`, + ssn, + organization, + phone, + email, + authorizations, + }; +} + +export function mapPegaUserApiReponseToUser(data: PegaUserApiResponse): User { return { id: data.pyUserIdentifier, lastName: data.pyLastName, firstName: data.pyFirstName, fullName: `${data.pyFirstName} ${data.pyLastName}`, - organization: data.pyOrganization, - organizationDivision: data.pyOrgDivision, - organizationUnit: data.pyOrgUnit, + ssn: null, + organization: { + id: '', + name: data.pyOrganization, + kaNumber: null, + address: { + street: null, + houseNumber: null, + postalCode: null, + city: null, + kommun: null, + }, + }, phone: data.pyTelephone, email: data.pyAddresses.Email.pyEmailAddress, - accessGroups: mapPegaAccessGroupToAccessGroups(data.pyAccessGroup as PegaAccessGroup), - utforandeverksamhet: '', - service: '', + authorizations: mapPegaAuthorizationToAuthorization(data.pyAccessGroup as PegaAuthorization), }; } diff --git a/apps/dafa-web/src/app/pages/administration/pages/employee-card/employee-card.component.html b/apps/dafa-web/src/app/pages/administration/pages/employee-card/employee-card.component.html index 2642210..004fe7d 100644 --- a/apps/dafa-web/src/app/pages/administration/pages/employee-card/employee-card.component.html +++ b/apps/dafa-web/src/app/pages/administration/pages/employee-card/employee-card.component.html @@ -29,22 +29,14 @@

Uppgifter om arbete

-
Organisation
-
{{ detailedEmployeeData.organization }}
-
Avdelning
-
- {{ detailedEmployeeData.organizationDivision }} +
Utförandeverksamhet
+
+ {{ detailedEmployeeData.organization.address.city }}
Behörigheter
-
- {{ detailedEmployeeData.accessGroups.join(', ') }} +
+ {{ detailedEmployeeData.authorizations.join(', ') }}
-
Behörighet
- -
- {{ item }} -
-
Frånvaroperiod
@@ -52,7 +44,9 @@
Tjänst
-
{{ detailedEmployeeData.service }}
+
+ {{ detailedEmployeeData.services.join(', ') }} +
Språk
{{ detailedEmployeeData.languages?.join(', ') }}
diff --git a/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html b/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html index 7a1fc4d..92651ab 100644 --- a/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html +++ b/apps/dafa-web/src/app/pages/administration/pages/employees/components/employees-list/employees-list.component.html @@ -13,18 +13,18 @@ - -