Merge branch 'develop' of ssh://bitbucket.arbetsformedlingen.se:7999/tea/dafa-web-monorepo into develop

This commit is contained in:
Daniel Appelgren
2021-09-07 15:02:11 +02:00
8 changed files with 92 additions and 81 deletions

View File

@@ -99,7 +99,19 @@
</digi-form-validation-message>
</fieldset>
<div class="edit-employee-form__footer">
<digi-notification-alert
*ngIf="errorWhileUpdating"
af-variation="danger"
af-heading="Kunde inte spara"
af-heading-level="h2"
[afCloseable]="true"
(afOnClose)="emitCloseError()"
>
<p>Personalkontot för {{employee.fullName}} kunde inte redigeras. Vänligen försök igen.</p>
<p class="msfa__small-text" *ngIf="errorWhileUpdating.message">{{errorWhileUpdating.message}}</p>
</digi-notification-alert>
<footer class="edit-employee-form__footer">
<a
class="edit-employee-form__link-btn edit-employee-form__link-btn--secondary"
[routerLink]="['/administration/personal', employee.id]"
@@ -107,7 +119,7 @@
Avbryt
</a>
<digi-button af-type="submit">Spara ändringar</digi-button>
</div>
</footer>
</form>
</digi-typography>

View File

@@ -8,8 +8,8 @@ import { HttpClientTestingModule } from '@angular/common/http/testing';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ReactiveFormsModule } from '@angular/forms';
import { RouterTestingModule } from '@angular/router/testing';
import { TreeNodesSelectorModule } from '@msfa-shared/components/tree-nodes-selector/tree-nodes-selector.module';
import { EditEmployeeFormComponent } from './edit-employee-form.component';
describe('EditEmployeeFormComponent', () => {
@@ -29,6 +29,7 @@ describe('EditEmployeeFormComponent', () => {
DigiNgFormCheckboxModule,
HttpClientTestingModule,
TreeNodesSelectorModule,
RouterTestingModule,
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
}).compileComponents();
@@ -37,6 +38,22 @@ describe('EditEmployeeFormComponent', () => {
beforeEach(() => {
fixture = TestBed.createComponent(EditEmployeeFormComponent);
component = fixture.componentInstance;
component.employee = {
id: 'string',
firstName: 'string',
lastName: 'string',
fullName: 'string',
email: 'string',
ssn: 'string',
roles: [],
tjanster: [],
allaUtforandeVerksamheter: false,
utforandeVerksamheter: [],
tjanstCodes: [],
utforandeVerksamhetIds: [],
utforandeAdressIds: [],
};
fixture.detectChanges();
});

View File

@@ -13,6 +13,7 @@ import {
import { AbstractControl, FormControl, FormGroup } from '@angular/forms';
import { EmployeeEditRequest } from '@msfa-models/api/employee-edit.request.model';
import { Employee } from '@msfa-models/employee.model';
import { CustomError } from '@msfa-models/error/custom-error';
import { Role } from '@msfa-models/role.model';
import { Tjanst } from '@msfa-models/tjanst.model';
import {
@@ -46,8 +47,10 @@ export class EditEmployeeFormComponent implements OnInit, OnChanges {
@Input() availableRoles: Role[];
@Input() availableTjanster: Tjanst[];
@Input() availableUtforandeVerksamheter: UtforandeVerksamhet[];
@Input() errorWhileUpdating: CustomError;
@Output() tjansterSelected = new EventEmitter<Tjanst[]>();
@Output() closeError = new EventEmitter<void>();
@Output() formSubmitted = new EventEmitter<EmployeeEditRequest>();
readonly ButtonVariation = ButtonVariation;
@@ -226,4 +229,8 @@ export class EditEmployeeFormComponent implements OnInit, OnChanges {
Object.fromEntries([[this.toggleAllUtforandeVerksamhetFormControlName, hasSelectedAllLeafNodes]])
);
}
emitCloseError(): void {
this.closeError.emit();
}
}

View File

@@ -1,6 +1,6 @@
<msfa-layout>
<section class="employee-form" *ngIf="employee$ | async as employee">
<digi-typography>
<digi-typography>
<section class="employee-form" *ngIf="employee$ | async as employee">
<header class="employee-form__header">
<h1>Redigera personalkonto</h1>
<msfa-employee-delete [returnToEmployeeList]="true"></msfa-employee-delete>
@@ -13,39 +13,44 @@
Ta bort konto
</digi-button> -->
</header>
</digi-typography>
<div class="employee-form__block">
<digi-typography>
<div class="employee-form__block">
<h2>Personuppgifter</h2>
</digi-typography>
<ng-container class="employee-form__privateInformation">
<digi-typography>
<h4>Förnamn</h4>
<p>{{employee.firstName}}</p>
</digi-typography>
<digi-typography>
<h4>Efternamn</h4>
<p>{{employee.lastName}}</p>
</digi-typography>
<digi-typography>
<h4>Personnummer</h4>
<msfa-hide-text
symbols="********-****"
[changingText]="employee.ssn"
ariaLabelType="personnummer"
></msfa-hide-text>
</digi-typography>
</ng-container>
</div>
<msfa-edit-employee-form
[employee]="employee"
[availableRoles]="availableRoles"
[availableTjanster]="tjanster$ | async"
[availableUtforandeVerksamheter]="availableUtforandeVerksamheter$ | async"
(tjansterSelected)="setupAvailableUtforandeVerksamheter($event)"
(formSubmitted)="updateEmployee($event)"
></msfa-edit-employee-form>
</section>
<dl>
<dt>Förnamn</dt>
<dd>{{employee.firstName}}</dd>
</dl>
<dl>
<dt>Förnamn</dt>
<dd>{{employee.firstName}}</dd>
</dl>
<dl>
<dt>Efternamn</dt>
<dd>{{employee.lastName}}</dd>
</dl>
<dl>
<dt>Personnummer</dt>
<dd>
<msfa-hide-text
symbols="********-****"
[changingText]="employee.ssn"
ariaLabelType="personnummer"
></msfa-hide-text>
</dd>
</dl>
</div>
<div class="employee-form__block">
<msfa-edit-employee-form
[employee]="employee"
[availableRoles]="availableRoles"
[availableTjanster]="tjanster$ | async"
[availableUtforandeVerksamheter]="availableUtforandeVerksamheter$ | async"
[errorWhileUpdating]="errorWhileUpdating$ | async"
(tjansterSelected)="setupAvailableUtforandeVerksamheter($event)"
(formSubmitted)="updateEmployee($event)"
(closeError)="closeError()"
></msfa-edit-employee-form>
</div>
</section>
</digi-typography>
</msfa-layout>

View File

@@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { EmployeeEditRequest } from '@msfa-models/api/employee-edit.request.model';
import { Employee } from '@msfa-models/employee.model';
import { CustomError } from '@msfa-models/error/custom-error';
import { Role } from '@msfa-models/role.model';
import { Tjanst } from '@msfa-models/tjanst.model';
import { EmployeeService } from '@msfa-services/api/employee.service';
@@ -22,6 +23,8 @@ import { filter, switchMap } from 'rxjs/operators';
export class EmployeeFormComponent implements OnInit {
private _employeeId$ = new BehaviorSubject<string>(this.activatedRoute.snapshot.params['employeeId']);
private _selectedTjanstIds$ = new BehaviorSubject<number[]>(null);
private _errorWhileUpdating$ = new BehaviorSubject<CustomError>(null);
errorWhileUpdating$: Observable<CustomError> = this._errorWhileUpdating$.asObservable();
employee$ = this.employeeService.employee$;
tjanster$: Observable<Tjanst[]> = this.tjanstService.tjanster$;
availableUtforandeVerksamheter$: Observable<UtforandeVerksamhet[]> = this._selectedTjanstIds$.pipe(
@@ -54,6 +57,9 @@ export class EmployeeFormComponent implements OnInit {
next: () => {
void this.router.navigateByUrl(`/administration/personal/${this.employeeId}`);
},
error: error => {
this._errorWhileUpdating$.next(error);
},
complete: () => {
updateEmployeeSubscription.unsubscribe();
},
@@ -66,4 +72,8 @@ export class EmployeeFormComponent implements OnInit {
setEmployeeToDelete(employee: Employee): void {
this.employeeService.setEmployeeToDelete(employee);
}
closeError(): void {
this._errorWhileUpdating$.next(null);
}
}

View File

@@ -48,6 +48,7 @@ export interface EmployeesData {
}
function mapResponseToSsn(ssn: string): string {
ssn = ssn.replaceAll('-', '');
if (ssn.length === 10) {
const century = +CURRENT_YEAR - +ssn.slice(0, 2) > 0 ? '20' : '19';
ssn = ssn.padStart(12, century);

View File

@@ -82,29 +82,6 @@ export class EmployeeService extends UnsubscribeDirective {
.subscribe(employee => {
this._employee$.next(employee as Employee);
})
// 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);
// })
);
}
@@ -215,7 +192,7 @@ export class EmployeeService extends UnsubscribeDirective {
map(({ data }) => data),
catchError(error => {
this.errorService.add(errorToCustomError(error));
return of(null);
return throwError(errorToCustomError(error));
})
);
}
@@ -229,8 +206,7 @@ export class EmployeeService extends UnsubscribeDirective {
}),
map(() => true),
catchError(error => {
this.errorService.add(errorToCustomError(error));
return of(false);
return throwError(errorToCustomError(error));
})
);
}

View File

@@ -3,7 +3,6 @@ def appname = "${APP_NAME}"
def utv_project = "${UTV_NAMESPACE}"
def auto_project = "${AUTO_NAMESPACE}"
def sys_project = "${SYS_NAMESPACE}"
def test_project = "${TEST_NAMESPACE}"
def jenkinsslave = "nodejs15-agent"
def dist_path = "dist/apps/mina-sidor-fa"
@@ -149,22 +148,6 @@ pipeline {
echo '### Deployed to "sys"! ###'
}
}
stage('Deploy "test"') {
steps {
echo '### Deploying to "test"... ###'
script {
openshift.withCluster() {
openshift.withProject(test_project) {
openshift.raw("set image dc/${ appname } ${ appname }=docker-registry.default.svc:5000/${utv_project}/${ appname }:${BUILD_TAG} --record=true --source=docker")
openshift.raw("annotate dc ${ appname } version=${BUILD_TAG} --overwrite=true")
openshift.selector("dc", "${ appname }").rollout().status();
}
}
}
echo '### Deployed to "test"! ###'
}
}
}
}