Merge pull request #40 in TEA/dafa-web-monorepo from feature/TV-280 to develop

Squashed commit of the following:

commit d81856c59c267c8a8fe783b74ce1a6fdda36426d
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Wed Aug 11 09:21:27 2021 +0200

    TV-280 package-lock fix.

commit 62ea965118c8a423c506663b73e3f6961cef8cc2
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Tue Aug 10 11:50:22 2021 +0200

    TV-280 bytte ut DeltagareAvrop mot Avrop och fixade lite kompileringsfel när man byggde till prod.

commit b12d1f25118de2315475a6a944915b8a2eaf6cdf
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Tue Aug 10 10:52:59 2021 +0200

    TV-280 fixat lite mergningsproblem från develop-branchen..

commit ab26ceaf60c4508ad9fa66aba4e48e85de81d1d8
Merge: 6dec798 8c5bbe2
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Tue Aug 10 09:30:30 2021 +0200

    Merge branch 'develop' into feature/TV-280

commit 8c5bbe2b0c728941566da5e4e290b6b0f66d3149
Merge: ce2dcb0 9a49f9a
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Tue Aug 10 09:27:11 2021 +0200

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

commit 6dec7980eb2c3eb845643e7358905d2b85fd3cad
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Mon Aug 9 12:54:45 2021 +0200

    TV-280 anpassade egenskaper till namn i API:et

commit ce2dcb0aaf0604891cf41f4cb56c812b4f985f95
Merge: 06cf023 f7207ae
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Mon Aug 9 10:56:10 2021 +0200

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

commit 0c83b68114b43c6263c4fac186f987f17697f8c8
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Mon Aug 9 09:25:06 2021 +0200

    TV-280 ändrade efter feedback i PR..

commit 10724872b3bb19b21c023173c0dd884e47de09ef
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Fri Aug 6 21:45:43 2021 +0200

    TV-280 lade till information om handledare om det finns sådan.

commit e8072207c5d634a244bd9549efdc58de1ea4d69e
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Fri Aug 6 21:41:53 2021 +0200

    TV-280 glömde att kryssrutan för att ta bort deltagaren bara ska visas när handledareConfirmed är true, lade till det nu.

commit 248bc391c0943eb9427e803a0694dc0502f55cdf
Merge: b43af52 06cf023
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Fri Aug 6 17:33:25 2021 +0200

    Merge branch 'develop' into feature/TV-280

commit 06cf023e0685574b2dd43d1cd3b5227bb72f58c2
Merge: 0b53b3e 229fb83
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Fri Aug 6 17:32:54 2021 +0200

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

commit b43af528b23371a1da7359e0153a4517a890b165
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Fri Aug 6 17:32:42 2021 +0200

    TV-280 första utkast på rad. Model är rena tramset tills vidare..

commit 0b53b3eee95caa759364e627eea7c1118a8702a2
Merge: c2466f1 5d1e357
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Wed Aug 4 10:28:22 2021 +0200

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

commit 7fbff2fa570d64da87192b914dfbb2c7e49b1147
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Wed Aug 4 09:57:21 2021 +0200

    TV-280 wip

commit c2466f11190e10666e463b4c85acf1fd94bd0c3a
Merge: 0c0c045 76fbab9
Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se>
Date:   Tue Aug 3 16:31:44 2021 +0200

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

commit 0c0c045f341d70dd21f246eebf85d5ed71393796
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Mon Aug 2 09:20:41 2021 +0200

    Added open-shift configuration for api-route
This commit is contained in:
Christian Gårdebrink
2021-08-11 09:35:53 +02:00
parent 9a49f9af2d
commit 1e41ab069f
14 changed files with 379 additions and 33906 deletions

View File

@@ -2,8 +2,8 @@ import { ChangeDetectionStrategy, Component } from '@angular/core';
import { AvropService } from './avrop.service';
import { Observable } from 'rxjs';
import { MultiselectFilterOption } from '@dafa-models/multiselect-filter-option';
import { DeltagareAvrop } from './models/deltagare-avrop';
import { HandledareAvrop } from './models/handledare-avrop';
import { Avrop } from '@dafa-models/avrop.model';
@Component({
selector: 'dafa-avrop',
@@ -18,8 +18,8 @@ export class AvropComponent {
selectedUtforandeVerksamheter$: Observable<MultiselectFilterOption[]> = this.avropService
.selectedUtforandeVerksamheter$;
selectableDeltagareList$: Observable<DeltagareAvrop[]> = this.avropService.selectableDeltagareList$;
selectedDeltagareList$: Observable<DeltagareAvrop[]> = this.avropService.selectedDeltagareList$;
selectableDeltagareList$: Observable<Avrop[]> = this.avropService.selectableDeltagareList$;
selectedDeltagareList$: Observable<Avrop[]> = this.avropService.selectedDeltagareList$;
selectableHandledareList$: Observable<HandledareAvrop[]> = this.avropService.selectableHandledareList$;
selectedHandledare$: Observable<HandledareAvrop> = this.avropService.selectedHandledare$;
deltagareListIsLocked$: Observable<boolean> = this.avropService.deltagareListIsLocked$;
@@ -27,7 +27,7 @@ export class AvropComponent {
constructor(private avropService: AvropService) {}
updateSelectedDeltagareList(deltagareList: DeltagareAvrop[]): void {
updateSelectedDeltagareList(deltagareList: Avrop[]): void {
this.avropService.setSelectedDeltagare(deltagareList);
}
@@ -57,7 +57,6 @@ export class AvropComponent {
this.avropService.setHandledareState(handledareId);
}
goToStep1(): void {
this.avropService.goToStep1();
}

View File

@@ -1,10 +1,10 @@
import { Injectable } from '@angular/core';
import { BehaviorSubject, combineLatest, Observable } from 'rxjs';
import { DeltagareAvrop } from './models/deltagare-avrop';
import { HandledareAvrop } from './models/handledare-avrop';
import { first, map, switchMap } from 'rxjs/operators';
import { AvropApiService } from '@dafa-services/api/avrop-api.service';
import { MultiselectFilterOption } from '@dafa-models/multiselect-filter-option';
import { Avrop } from '@dafa-models/avrop.model';
type Step = 1 | 2 | 3 | 4;
@@ -15,7 +15,7 @@ export class AvropService {
private _selectedTjanster$ = new BehaviorSubject<MultiselectFilterOption[]>(null);
private _selectedUtforandeVerksamheter$ = new BehaviorSubject<MultiselectFilterOption[]>(null);
private _selectedKommuner$ = new BehaviorSubject<MultiselectFilterOption[]>(null);
private _selectedDeltagareList$ = new BehaviorSubject<DeltagareAvrop[]>([]);
private _selectedDeltagareList$ = new BehaviorSubject<Avrop[]>([]);
private _deltagareListIsLocked$ = new BehaviorSubject<boolean>(null);
private _selectedHandledare$ = new BehaviorSubject<HandledareAvrop>(null);
private _handledareIsConfirmed$ = new BehaviorSubject<boolean>(false);
@@ -27,7 +27,7 @@ export class AvropService {
> = this._selectedUtforandeVerksamheter$.asObservable();
selectedKommuner$: Observable<MultiselectFilterOption[]> = this._selectedKommuner$.asObservable();
selectableDeltagareList$: Observable<DeltagareAvrop[]> = combineLatest([
selectableDeltagareList$: Observable<Avrop[]> = combineLatest([
this.selectedTjanster$,
this.selectedUtforandeVerksamheter$,
this.selectedKommuner$,
@@ -62,10 +62,10 @@ export class AvropService {
)
);
selectedDeltagareList$: Observable<DeltagareAvrop[]> = this._selectedDeltagareList$.asObservable();
selectedDeltagareList$: Observable<Avrop[]> = this._selectedDeltagareList$.asObservable();
deltagareListIsLocked$: Observable<boolean> = this._deltagareListIsLocked$.asObservable();
lockedDeltagareList$: Observable<DeltagareAvrop[]> = combineLatest([
lockedDeltagareList$: Observable<Avrop[]> = combineLatest([
this.selectedDeltagareList$,
this.deltagareListIsLocked$,
]).pipe(map(([selectedDeltagareList, isLocked]) => (isLocked ? selectedDeltagareList : null)));
@@ -109,7 +109,7 @@ export class AvropService {
return 1;
}
setSelectedDeltagare(deltagare: DeltagareAvrop[]): void {
setSelectedDeltagare(deltagare: Avrop[]): void {
this._selectedDeltagareList$.next(deltagare);
}

View File

@@ -1,12 +1,81 @@
<div>
Deltagare: {{deltagare?.fullName}} <br>
<ng-container *ngIf="handledare">handledare: {{handledare?.fullName}}</ng-container>
<digi-form-checkbox
*ngIf="!isLocked"
[afLabel]="'Markera'"
[afChecked]="isSelected"
(change)="emitSelectionChange($event.target.checked)">
</digi-form-checkbox>
<div class="avrop-table-row">
<div class="avrop-table-row__data-row">
<div class="avrop-table-row__data-column">
<digi-form-checkbox
*ngIf="!isLocked"
class="avrop-table-row__checkbox"
[afLabel]="'Välj sökande'"
[afChecked]="isSelected"
(change)="emitSelectionChange($event.target.checked)"
>
</digi-form-checkbox>
</div>
<div class="avrop-table-row__data-column">
<div class="avrop-table__cell">
<digi-typography>
<strong class="avrop-table__label">Namn:</strong>
<span>{{deltagare?.name}}</span>
</digi-typography>
</div>
<div class="avrop-table__cell">
<digi-typography>
<strong class="avrop-table__label">Tjänst:</strong>
<span>{{deltagare?.tjanst}}</span>
</digi-typography>
</div>
</div>
<div class="avrop-table-row__data-column">
<div class="avrop-table__cell">
<digi-typography>
<strong class="avrop-table__label">Startdatum:</strong>
<span>{{deltagare?.startDate | date: 'yyyy-MM-dd'}}</span>
</digi-typography>
</div>
<div class="avrop-table__cell">
<digi-typography>
<strong class="avrop-table__label">Slutdatum:</strong>
<span>{{deltagare?.endDate | date: 'yyyy-MM-dd'}}</span>
</digi-typography>
</div>
</div>
<div class="avrop-table-row__data-column">
<div class="avrop-table__cell">
<digi-typography>
<strong class="avrop-table__label">Språkstöd/Tolk:</strong>
<span>{{deltagare?.translator}}</span>
</digi-typography>
</div>
<div class="avrop-table__cell">
<digi-typography>
<strong class="avrop-table__label">Utförande adress:</strong>
<span>{{deltagare?.utforandeAdress}}</span>
</digi-typography>
</div>
</div>
<div class="avrop-table-row__data-column avrop-table-row__data-column--bottom-align">
<div class="avrop-table__cell">
<digi-typography>
<strong class="avrop-table__label">Spår/nivå:</strong>
<span>{{deltagare?.trackCode}}</span>
</digi-typography>
</div>
</div>
<div *ngIf="handledare" class="avrop-table-row__data-column avrop-table-row__data-column--bottom-align">
<div class="avrop-table__cell">
<digi-typography>
<strong class="avrop-table__label">Vald handledare:</strong>
<span>{{handledare?.fullName}}</span>
</digi-typography>
</div>
</div>
</div>
<digi-button
class="avrop-table-row__close-btn"
*ngIf="handledareConfirmed"
[attr.af-variation]="ButtonVariation.TERTIARY"
(afOnClick)="emitDeltagareDeleted()"
>
Ta bort
<digi-icon-x slot="icon"></digi-icon-x>
</digi-button>
</div>
<hr>

View File

@@ -0,0 +1,47 @@
@import 'variables/gutters';
.avrop-table-row {
position: relative;
display: flex;
flex-direction: row;
padding: var(--digi--layout--gutter) var(--digi--layout--gutter);
background-color: var(--digi--ui--color--background--secondary);
}
.avrop-table-row__close-btn {
position: absolute;
top: 0;
right: 0;
::ng-deep {
button {
padding: 0.5rem 0.75rem !important;
}
}
}
.avrop-table-row__checkbox {
margin-top: 1.5rem;
}
.avrop-table-row__data-row {
display: flex;
flex-direction: row;
gap: $digi--layout--gutter--xl $digi--layout--gutter--l;
flex-grow: 1;
}
.avrop-table-row__data-column {
display: flex;
flex-direction: column;
gap: $digi--layout--gutter--l 0;
flex-grow: 1;
}
.avrop-table-row__data-column--bottom-align {
justify-content: flex-end;
}
.avrop-table__label {
display: block;
}

View File

@@ -1,6 +1,7 @@
import { EventEmitter } from '@angular/core';
import { Component, ChangeDetectionStrategy, Input, Output } from '@angular/core';
import { DeltagareAvrop } from '../../../models/deltagare-avrop';
import { Avrop } from '@dafa-models/avrop.model';
import { ButtonVariation } from '../../../enums/button-vatiation.enum';
import { HandledareAvrop } from '../../../models/handledare-avrop';
@Component({
@@ -10,14 +11,21 @@ import { HandledareAvrop } from '../../../models/handledare-avrop';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AvropTableRowComponent {
@Input() deltagare: DeltagareAvrop;
@Input() deltagare: Avrop;
@Input() isSelected: boolean;
@Input() isLocked: boolean;
@Output() isSelectedChange = new EventEmitter<boolean>();
@Input() handledare: HandledareAvrop;
@Input() handledareConfirmed: boolean;
@Output() isSelectedChange = new EventEmitter<boolean>();
@Output() deleteDeltagareClicked = new EventEmitter<void>();
ButtonVariation = ButtonVariation;
emitSelectionChange(isSelected: boolean): void {
this.isSelectedChange.emit(isSelected);
}
emitDeltagareDeleted(): void {
this.deleteDeltagareClicked.emit();
}
}

View File

@@ -1,9 +1,11 @@
<dafa-avrop-table-row
*ngFor="let deltagare of deltagareRows"
[deltagare]="deltagare"
[isSelected]="isSelected(deltagare)"
[isLocked]="isLocked"
(isSelectedChange)="isSelectedChange(deltagare, $event)"
[handledare]="handledare"
[handledareConfirmed]="handledareConfirmed"
></dafa-avrop-table-row>
<div class="avrop-table">
<dafa-avrop-table-row
*ngFor="let deltagare of deltagareRows"
[deltagare]="deltagare"
[isSelected]="isSelected(deltagare)"
[isLocked]="isLocked"
(isSelectedChange)="isSelectedChange(deltagare, $event)"
[handledare]="handledare"
[handledareConfirmed]="handledareConfirmed"
></dafa-avrop-table-row>
</div>

View File

@@ -0,0 +1,5 @@
.avrop-table {
display: flex;
flex-direction: column;
gap: 1rem;
}

View File

@@ -1,5 +1,5 @@
import { Component, OnInit, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';
import { DeltagareAvrop } from '../../models/deltagare-avrop';
import { Avrop } from '@dafa-models/avrop.model';
import { BehaviorSubject, Observable } from 'rxjs';
import { filter } from 'rxjs/operators';
import { HandledareAvrop } from '../../models/handledare-avrop';
@@ -11,17 +11,17 @@ import { HandledareAvrop } from '../../models/handledare-avrop';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AvropTableComponent implements OnInit {
private _selectedDeltagare$ = new BehaviorSubject<DeltagareAvrop[]>(null);
selectedDeltagareState$: Observable<DeltagareAvrop[]> = this._selectedDeltagare$.asObservable();
private _selectedDeltagare$ = new BehaviorSubject<Avrop[]>(null);
selectedDeltagareState$: Observable<Avrop[]> = this._selectedDeltagare$.asObservable();
@Input() selectableDeltagareList: DeltagareAvrop[];
@Input() selectedDeltagareListInput: DeltagareAvrop[];
@Input() selectableDeltagareList: Avrop[];
@Input() selectedDeltagareListInput: Avrop[];
@Input() handledare: HandledareAvrop;
@Input() isLocked: boolean;
@Input() handledareConfirmed: boolean;
@Output() changedSelectedDeltagareList = new EventEmitter<DeltagareAvrop[]>();
@Output() changedSelectedDeltagareList = new EventEmitter<Avrop[]>();
get deltagareRows(): DeltagareAvrop[] {
get deltagareRows(): Avrop[] {
return this.isLocked ? this.selectedDeltagareListInput : this.selectableDeltagareList;
}
@@ -32,11 +32,11 @@ export class AvropTableComponent implements OnInit {
// TODO lägg till unusubscribeOnDestroy
}
isSelected(deltagare: DeltagareAvrop): boolean {
isSelected(deltagare: Avrop): boolean {
return this.selectedDeltagareListInput?.includes(deltagare) ?? false;
}
isSelectedChange(deltagare: DeltagareAvrop, isSelected: boolean): void {
isSelectedChange(deltagare: Avrop, isSelected: boolean): void {
if (isSelected) {
return this._selectedDeltagare$.next([
...(this._selectedDeltagare$.value?.filter(deltagareInList => deltagareInList != deltagare) ?? []),

View File

@@ -0,0 +1,5 @@
export enum ButtonVariation {
PRIMARY = 'primary',
SECONDARY = 'secondary',
TERTIARY = 'tertiary',
}

View File

@@ -1,3 +0,0 @@
export interface DeltagareAvrop {
fullName: string;
}

View File

@@ -6,7 +6,6 @@ import { Avrop, mapAvropResponseToAvrop } from '@dafa-models/avrop.model';
import { MultiselectFilterOption } from '@dafa-models/multiselect-filter-option';
import { Observable, of } from 'rxjs';
import { delay, map } from 'rxjs/operators';
import { DeltagareAvrop } from '../../../pages/avrop/models/deltagare-avrop';
import { HandledareAvrop } from '../../../pages/avrop/models/handledare-avrop';
const tempHandledareMock: HandledareAvrop[] = [
@@ -14,7 +13,38 @@ const tempHandledareMock: HandledareAvrop[] = [
{ id: '2', fullName: 'Stefan Löfven' },
];
const tempDeltagareMock: DeltagareAvrop[] = [{ fullName: 'Daniel' }, { fullName: 'Chingiz' }];
const tempDeltagareMock: Avrop[] = [
{
id: 'id',
sokandeId: 1,
name: 'Daniel',
tjanst: 'Kundval rusta och matcha',
startDate: new Date('2021-03-04'),
endDate: new Date('2022-06-04'),
translator: 'Ja',
languageSupport: 'Ja',
utforandeAdress: 'Xgatan 3, Ystad',
trackCode: 'A',
genomforandeReferens: 1,
participationFrequency: 25,
utforandeVerksamhet: 'utf',
},
{
id: 'id',
sokandeId: 1,
name: 'Nisse',
tjanst: 'STOM',
startDate: new Date('2020-12-22'),
endDate: new Date('2023-08-15'),
translator: '-',
languageSupport: '-',
utforandeAdress: 'Zgatan 4, Qstad',
trackCode: 'B',
genomforandeReferens: 2,
participationFrequency: 75,
utforandeVerksamhet: 'utf',
},
];
const tempKommunerMock: MultiselectFilterOption[] = [
{ id: '124', count: 12, label: 'Stockholm' },
@@ -56,7 +86,7 @@ export class AvropApiService {
utforandeVerksamhetIds: MultiselectFilterOption[],
offset = 0,
limit = 20
): Observable<DeltagareAvrop[]> {
): Observable<Avrop[]> {
// TODO replace with API-call using tjanstIds, kommunIds, utforandeVerksamhetIds
console.log(
'[API call] getNyaDeltagare$. Inputs: tjanstIds, kommunIds, utforandeVerksamhetIds',
@@ -67,7 +97,7 @@ export class AvropApiService {
return of(tempDeltagareMock).pipe(delay(tempMockDelay));
}
getSelectableHandledare$(deltagare: DeltagareAvrop[]): Observable<HandledareAvrop[]> {
getSelectableHandledare$(deltagare: Avrop[]): Observable<HandledareAvrop[]> {
// TODO replace with API-call
console.log('[API call] getSelectableHandledare$. Inputs: deltagare', deltagare);
return of(tempHandledareMock).pipe(delay(tempMockDelay));
@@ -112,7 +142,7 @@ export class AvropApiService {
return of(tempKommunerMock).pipe(delay(tempMockDelay));
}
async tilldelaHandledare(deltagare: DeltagareAvrop[], handledare: HandledareAvrop): Promise<void> {
async tilldelaHandledare(deltagare: Avrop[], handledare: HandledareAvrop): Promise<void> {
console.log('[API call] SAVE avrop. Inputs: deltagare, handledare', deltagare, handledare);
await of(null).pipe(delay(200)).toPromise();
// TODO anropa API

View File

@@ -1,4 +1,4 @@
export const environment = {
export const environment: any = {
loginUrl: 'https://ciam.arbetsformedlingen.se/',
production: true,
api: {

View File

@@ -1,4 +1,4 @@
export const environment = {
export const environment: any = {
environment: 'local',
clientId: '',
loginUrl: '/mock-login',

34017
package-lock.json generated

File diff suppressed because it is too large Load Diff