Merge pull request #137 in TEA/mina-sidor-fa-web from bugfix/TV-695-felmeddelande-roller to next

Squashed commit of the following:

commit 0a77df6c5cfaff5c2615bd1525485f1f7270a565
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Mon Sep 27 15:05:29 2021 +0200

    Updated changelog

commit a8c356c2fb8079ce0cf3aae07008285aced778d0
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Mon Sep 27 15:02:42 2021 +0200

    Removed unused variable

commit daf114fedb3a7a43c2d3e4f6ca588ddf145ef6c3
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Mon Sep 27 14:59:05 2021 +0200

    Added unauthorized-alert component and implemented unauthorized warning inside deltagare

commit c781f485e12e6db61f470ec13c96d40cce3113fe
Merge: 86e224b 62e538e
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Mon Sep 27 14:15:41 2021 +0200

    Merge branch 'next' into bugfix/TV-695-felmeddelande-roller

commit 86e224b06199210662d890179aa50e87793b126a
Author: Daniel Appelgren <daniel.appelgren@arbetsformedlingen.se>
Date:   Mon Sep 27 12:08:51 2021 +0200

    show role errors
This commit is contained in:
Erik Tiekstra
2021-09-27 15:07:26 +02:00
parent 62e538e289
commit 99731746d4
17 changed files with 262 additions and 157 deletions

View File

@@ -3,6 +3,7 @@
### Bug Fixes ### Bug Fixes
- **deltagare:** Now fetching data using "genomforandeReferens" instead of "sokandeId" to avoid wrong data. [TV-692](https://jira.arbetsformedlingen.se/browse/TV-692) - **deltagare:** Now fetching data using "genomforandeReferens" instead of "sokandeId" to avoid wrong data. [TV-692](https://jira.arbetsformedlingen.se/browse/TV-692)
- **authorization:** Whenever the API throws a "403 Forbidden" error we now show an unauthorized message. [TV-695](https://jira.arbetsformedlingen.se/browse/TV-695)
## [2.0.0](https://bitbucket.arbetsformedlingen.se/projects/tea/repos/mina-sidor-fa-web/compare/diff?targetBranch=refs%2Ftags%2Fv1.5.0&sourceBranch=refs%2Ftags%2Fv2.0.0) (2021-09-24) ## [2.0.0](https://bitbucket.arbetsformedlingen.se/projects/tea/repos/mina-sidor-fa-web/compare/diff?targetBranch=refs%2Ftags%2Fv1.5.0&sourceBranch=refs%2Ftags%2Fv2.0.0) (2021-09-24)

View File

@@ -1,12 +1,14 @@
<msfa-layout> <msfa-layout>
<section class="avrop" *ngIf="currentStep$ | async as currentStep">
<digi-typography> <digi-typography>
<ng-container *ngIf="(showUnauthorizedError$ | async) === false; else roleError">
<ng-container *ngIf="avropData$ | async as avropData; else skeletonRef">
<section class="avrop" *ngIf="currentStep$ | async as currentStep">
<header class="avrop__header"> <header class="avrop__header">
<h1>Nya deltagare</h1> <h1>Nya deltagare</h1>
<p> <p>
Här ser du alla nya deltagare. Deltagarna ska tilldelas en handledare innan tjänstens start. Kryssa för de Här ser du alla nya deltagare. Deltagarna ska tilldelas en handledare innan tjänstens start. Kryssa för de
deltagare du vill tilldela en handledare. Du kan välja en, eller flera personer samtidigt, genom att kryssa i deltagare du vill tilldela en handledare. Du kan välja en, eller flera personer samtidigt, genom att
boxarna nedan. kryssa i boxarna nedan.
</p> </p>
<digi-notification-alert <digi-notification-alert
@@ -37,7 +39,6 @@
></digi-ng-progress-progressbar> ></digi-ng-progress-progressbar>
</div> </div>
</div> </div>
<ng-container *ngIf="avropData$ | async as avropData">
<div class="avrop__content" *ngIf="avropData.data.length; else noAvrop"> <div class="avrop__content" *ngIf="avropData.data.length; else noAvrop">
<div class="avrop__filter" *ngIf="currentStep === 1"> <div class="avrop__filter" *ngIf="currentStep === 1">
<h3>Filter</h3> <h3>Filter</h3>
@@ -99,14 +100,14 @@
</ng-container> </ng-container>
<ng-container *ngSwitchCase="2"> <ng-container *ngSwitchCase="2">
<digi-button af-variation="secondary" af-size="m" (afOnClick)="unlockSelectedAvrop()" <digi-button af-variation="secondary" af-size="m" (afOnClick)="unlockSelectedAvrop()"
>Tillbaka</digi-button >Tillbaka
> </digi-button>
<digi-button af-size="m" (afOnClick)="confirmHandledare()">Tilldela</digi-button> <digi-button af-size="m" (afOnClick)="confirmHandledare()">Tilldela</digi-button>
</ng-container> </ng-container>
<ng-container *ngSwitchCase="3"> <ng-container *ngSwitchCase="3">
<digi-button af-variation="secondary" af-size="m" (afOnClick)="unconfirmHandledare()" <digi-button af-variation="secondary" af-size="m" (afOnClick)="unconfirmHandledare()"
>Tillbaka</digi-button >Tillbaka
> </digi-button>
<digi-button af-size="m" (afOnClick)="save()">Bekräfta tilldelning</digi-button> <digi-button af-size="m" (afOnClick)="save()">Bekräfta tilldelning</digi-button>
</ng-container> </ng-container>
<ng-container *ngSwitchCase="4"> <ng-container *ngSwitchCase="4">
@@ -114,18 +115,29 @@
</ng-container> </ng-container>
</div> </div>
</div> </div>
</ng-container>
</main> </main>
</digi-typography>
</section> </section>
</ng-container>
<ng-template #loadingRef> </ng-container>
<msfa-loader></msfa-loader> </digi-typography>
</ng-template>
<ng-template #noAvailabeHandledare>
<!-- lägg in lämpligt innehåll -->
</ng-template>
<ng-template #noAvrop>
<p>Det finns för tillfället inga nya deltagare att tilldela.</p>
</ng-template>
</msfa-layout> </msfa-layout>
<ng-template #loadingRef>
<msfa-loader></msfa-loader>
</ng-template>
<ng-template #skeletonRef>
<digi-ng-skeleton-base [afCount]="3" afText="Laddar nya deltagare"></digi-ng-skeleton-base>
</ng-template>
<ng-template #noAvailabeHandledare>
<!-- lägg in lämpligt innehåll -->
</ng-template>
<ng-template #noAvrop>
<p>Det finns för tillfället inga nya deltagare att tilldela.</p>
</ng-template>
<ng-template #roleError>
<msfa-unauthorized-alert></msfa-unauthorized-alert>
</ng-template>

View File

@@ -13,7 +13,6 @@ import { Observable } from 'rxjs';
export class AvropComponent { export class AvropComponent {
readonly totalAmountOfSteps = 3; readonly totalAmountOfSteps = 3;
currentStep$: Observable<number> = this.avropService.currentStep$; currentStep$: Observable<number> = this.avropService.currentStep$;
error$: Observable<string> = this.avropService.error$; error$: Observable<string> = this.avropService.error$;
avropData$: Observable<AvropCompactData> = this.avropService.avropData$; avropData$: Observable<AvropCompactData> = this.avropService.avropData$;
selectedAvrop$: Observable<AvropCompact[]> = this.avropService.selectedAvrop$; selectedAvrop$: Observable<AvropCompact[]> = this.avropService.selectedAvrop$;
@@ -23,6 +22,7 @@ export class AvropComponent {
handledareConfirmed$: Observable<boolean> = this.avropService.handledareIsConfirmed$; handledareConfirmed$: Observable<boolean> = this.avropService.handledareIsConfirmed$;
avropIsSubmitted$: Observable<boolean> = this.avropService.avropIsSubmitted$; avropIsSubmitted$: Observable<boolean> = this.avropService.avropIsSubmitted$;
avropLoading$: Observable<boolean> = this.avropService.avropLoading$; avropLoading$: Observable<boolean> = this.avropService.avropLoading$;
showUnauthorizedError$: Observable<boolean> = this.avropService.showUnauthorizedError$;
constructor(private avropService: AvropService) {} constructor(private avropService: AvropService) {}

View File

@@ -4,10 +4,11 @@ import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { LoaderModule } from '@msfa-shared/components/loader/loader.module';
import { UnauthorizedAlertModule } from '@msfa-shared/components/unauthorized-alert/unauthorized-alert.module';
import { AvropComponent } from './avrop.component'; import { AvropComponent } from './avrop.component';
import { AvropFiltersModule } from './components/avrop-filters/avrop-filters.module'; import { AvropFiltersModule } from './components/avrop-filters/avrop-filters.module';
import { AvropListModule } from './components/avrop-list/avrop-list.module'; import { AvropListModule } from './components/avrop-list/avrop-list.module';
import { LoaderModule } from '@msfa-shared/components/loader/loader.module';
@NgModule({ @NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
@@ -21,6 +22,7 @@ import { LoaderModule } from '@msfa-shared/components/loader/loader.module';
DigiNgProgressProgressbarModule, DigiNgProgressProgressbarModule,
DigiNgSkeletonBaseModule, DigiNgSkeletonBaseModule,
LoaderModule, LoaderModule,
UnauthorizedAlertModule,
], ],
}) })
export class AvropModule {} export class AvropModule {}

View File

@@ -1,11 +1,12 @@
<msfa-layout> <msfa-layout>
<digi-typography> <digi-typography>
<section class="deltagare"> <ng-container *ngIf="(showUnauthorizedError$ | async) === false; else roleError">
<section class="deltagare" *ngIf="allDeltagareData$ | async as allDeltagareData; else loadingRef">
<header class="deltagare__header"> <header class="deltagare__header">
<h1>Deltagarlista</h1> <h1>Deltagarlista</h1>
<p> <p>
Här ser du en lista på de deltagare som tillhör din organisation. Klicka på deltagarens namn för att öppna och Här ser du en lista på de deltagare som tillhör din organisation. Klicka på deltagarens namn för att öppna
se mer information om deltagarna. och se mer information om deltagarna.
</p> </p>
</header> </header>
<div class="deltagare__filter"> <div class="deltagare__filter">
@@ -16,8 +17,7 @@
(afOnChange)="setOnlyMyDeltagare($event.detail.target.checked)" (afOnChange)="setOnlyMyDeltagare($event.detail.target.checked)"
></digi-form-checkbox> ></digi-form-checkbox>
</div> </div>
{{showUnauthorizedError$ | async}}
<ng-container *ngIf="allDeltagareData$ | async as allDeltagareData; else loadingRef">
<ng-container *ngIf="(deltagareLoading$ | async) === false; else loadingRef"> <ng-container *ngIf="(deltagareLoading$ | async) === false; else loadingRef">
<msfa-deltagare-list <msfa-deltagare-list
*ngIf="allDeltagareData.data.length; else noDeltagare" *ngIf="allDeltagareData.data.length; else noDeltagare"
@@ -28,18 +28,22 @@
(paginated)="setNewPage($event)" (paginated)="setNewPage($event)"
></msfa-deltagare-list> ></msfa-deltagare-list>
</ng-container> </ng-container>
</ng-container>
<ng-template #loadingRef>
<digi-ng-skeleton-base [afCount]="3" afText="Laddar deltagare"></digi-ng-skeleton-base>
</ng-template>
</section> </section>
</ng-container>
</digi-typography> </digi-typography>
</msfa-layout> </msfa-layout>
<ng-template #loadingRef>
<digi-ng-skeleton-base [afCount]="3" afText="Laddar deltagare"></digi-ng-skeleton-base>
</ng-template>
<ng-template #noDeltagare> <ng-template #noDeltagare>
<p> <p>
Inga deltagare hittades{{(onlyMyDeltagare$ | async) ? '. Bocka ur "Visa endast mina tilldelade deltagare" för att se Inga deltagare hittades{{(onlyMyDeltagare$ | async) ? '. Bocka ur "Visa endast mina tilldelade deltagare" för att se
deltagare som tillhör din organisation.' : ' som tillhör din organisation.' }} deltagare som tillhör din organisation.' : ' som tillhör din organisation.' }}
</p> </p>
</ng-template> </ng-template>
<ng-template #roleError>
<msfa-unauthorized-alert></msfa-unauthorized-alert>
</ng-template>

View File

@@ -15,6 +15,7 @@ export class DeltagareComponent {
sort$: Observable<Sort<keyof DeltagareCompact>> = this.deltagareService.sort$; sort$: Observable<Sort<keyof DeltagareCompact>> = this.deltagareService.sort$;
onlyMyDeltagare$: Observable<boolean> = this.deltagareService.onlyMyDeltagare$; onlyMyDeltagare$: Observable<boolean> = this.deltagareService.onlyMyDeltagare$;
deltagareLoading$: Observable<boolean> = this.deltagareService.deltagareLoading$; deltagareLoading$: Observable<boolean> = this.deltagareService.deltagareLoading$;
showUnauthorizedError$: Observable<boolean> = this.deltagareService.showUnauthorizedError$;
constructor(private deltagareService: DeltagareService) {} constructor(private deltagareService: DeltagareService) {}

View File

@@ -1,14 +1,22 @@
import { DigiNgSkeletonBaseModule } from '@af/digi-ng/_skeleton/skeleton-base';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UnauthorizedAlertModule } from '@msfa-shared/components/unauthorized-alert/unauthorized-alert.module';
import { DeltagareListModule } from './components/deltagare-list/deltagare-list.module'; import { DeltagareListModule } from './components/deltagare-list/deltagare-list.module';
import { DeltagareRoutingModule } from './deltagare-routing.module'; import { DeltagareRoutingModule } from './deltagare-routing.module';
import { DeltagareComponent } from './deltagare.component'; import { DeltagareComponent } from './deltagare.component';
import { DigiNgSkeletonBaseModule } from '@af/digi-ng/_skeleton/skeleton-base';
@NgModule({ @NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
declarations: [DeltagareComponent], declarations: [DeltagareComponent],
imports: [CommonModule, DeltagareRoutingModule, LayoutModule, DeltagareListModule, DigiNgSkeletonBaseModule], imports: [
CommonModule,
DeltagareRoutingModule,
LayoutModule,
DeltagareListModule,
UnauthorizedAlertModule,
DigiNgSkeletonBaseModule,
],
}) })
export class DeltagareModule {} export class DeltagareModule {}

View File

@@ -0,0 +1,7 @@
<digi-notification-alert af-heading="Personalkontot saknar behörigheter!" af-variation="danger">
<p>
Ditt personalkonto behöver tilldelas en tjänst och utförande verksamheter för att det ska fungera korrekt. Ändra
ditt personalkonto via personallistan eller kontakta din behörighetsadministratör om du inte kan ändra dina egna
behörigheter.
</p>
</digi-notification-alert>

View File

@@ -0,0 +1,26 @@
/* tslint:disable:no-unused-variable */
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { UnauthorizedAlertComponent } from './unauthorized-alert.component';
describe('UnauthorizedAlertComponent', () => {
let component: UnauthorizedAlertComponent;
let fixture: ComponentFixture<UnauthorizedAlertComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [UnauthorizedAlertComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(UnauthorizedAlertComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,9 @@
import { ChangeDetectionStrategy, Component } from '@angular/core';
@Component({
selector: 'msfa-unauthorized-alert',
templateUrl: './unauthorized-alert.component.html',
styleUrls: ['./unauthorized-alert.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class UnauthorizedAlertComponent {}

View File

@@ -0,0 +1,11 @@
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { UnauthorizedAlertComponent } from './unauthorized-alert.component';
@NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA],
declarations: [UnauthorizedAlertComponent],
imports: [CommonModule],
exports: [UnauthorizedAlertComponent],
})
export class UnauthorizedAlertModule {}

View File

@@ -7,9 +7,10 @@ import { HandledareResponse } from '@msfa-models/api/handledare.response.model';
import { Params } from '@msfa-models/api/params.model'; import { Params } from '@msfa-models/api/params.model';
import { AvropFilter, mapResponseToAvropFilter } from '@msfa-models/avrop-filter.model'; import { AvropFilter, mapResponseToAvropFilter } from '@msfa-models/avrop-filter.model';
import { AvropCompact, AvropCompactData, mapAvropResponseToAvrop } from '@msfa-models/avrop.model'; import { AvropCompact, AvropCompactData, mapAvropResponseToAvrop } from '@msfa-models/avrop.model';
import { CustomError, errorToCustomError } from '@msfa-models/error/custom-error';
import { Handledare, mapHandledareResponseToHandledare } from '@msfa-models/handledare.model'; import { Handledare, mapHandledareResponseToHandledare } from '@msfa-models/handledare.model';
import { BehaviorSubject, Observable, of } from 'rxjs'; import { BehaviorSubject, Observable, of } from 'rxjs';
import { filter, map, tap } from 'rxjs/operators'; import { catchError, filter, map, tap } from 'rxjs/operators';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
@@ -18,6 +19,8 @@ export class AvropApiService {
private _apiBaseUrl = `${environment.api.url}/avrop`; private _apiBaseUrl = `${environment.api.url}/avrop`;
private _lockedAvropSnapshot$ = new BehaviorSubject<AvropCompact[]>(null); private _lockedAvropSnapshot$ = new BehaviorSubject<AvropCompact[]>(null);
private _availableHandledareSnapshot$ = new BehaviorSubject<Handledare[]>(null); private _availableHandledareSnapshot$ = new BehaviorSubject<Handledare[]>(null);
private _showUnauthorizedError$ = new BehaviorSubject<boolean>(false);
public showUnauthorizedError$: Observable<boolean> = this._showUnauthorizedError$.asObservable();
constructor(private httpClient: HttpClient) {} constructor(private httpClient: HttpClient) {}
@@ -28,7 +31,19 @@ export class AvropApiService {
fetchAvrop$(params: Params): Observable<AvropCompactData> { fetchAvrop$(params: Params): Observable<AvropCompactData> {
return this.httpClient return this.httpClient
.get<AvropApiResponse>(`${this._apiBaseUrl}`, { params }) .get<AvropApiResponse>(`${this._apiBaseUrl}`, { params })
.pipe(map(({ data, meta }) => ({ data: data.map(avrop => mapAvropResponseToAvrop(avrop)), meta }))); .pipe(
map(({ data, meta }) => ({ data: data.map(avrop => mapAvropResponseToAvrop(avrop)), meta })),
catchError((error: Error & { status: number }) => {
if (error.status === 403) {
this._showUnauthorizedError$.next(true);
return of(null);
} else {
throw new CustomError(
errorToCustomError({ ...error, message: `Kunde inte hämta deltagare.\n\n${error.message}` })
);
}
})
);
} }
fetchAvailableHandledare$(avrop: AvropCompact[]): Observable<Handledare[]> { fetchAvailableHandledare$(avrop: AvropCompact[]): Observable<Handledare[]> {

View File

@@ -34,6 +34,8 @@ export class DeltagareApiService {
private _apiBaseUrl = `${environment.api.url}/deltagare`; private _apiBaseUrl = `${environment.api.url}/deltagare`;
private _deltagareLoading$ = new BehaviorSubject<boolean>(false); private _deltagareLoading$ = new BehaviorSubject<boolean>(false);
public deltagareLoading$: Observable<boolean> = this._deltagareLoading$.asObservable(); public deltagareLoading$: Observable<boolean> = this._deltagareLoading$.asObservable();
private _showUnauthorizedError$ = new BehaviorSubject<boolean>(false);
public showUnauthorizedError$: Observable<boolean> = this._showUnauthorizedError$.asObservable();
constructor(private httpClient: HttpClient) {} constructor(private httpClient: HttpClient) {}
@@ -65,10 +67,15 @@ export class DeltagareApiService {
this._deltagareLoading$.next(false); this._deltagareLoading$.next(false);
return { data: data.map(deltagare => mapResponseToDeltagareCompact(deltagare)), meta }; return { data: data.map(deltagare => mapResponseToDeltagareCompact(deltagare)), meta };
}), }),
catchError((error: Error) => { catchError((error: Error & { status: number }) => {
if (error.status === 403) {
this._showUnauthorizedError$.next(true);
return of(null);
} else {
throw new CustomError( throw new CustomError(
errorToCustomError({ ...error, message: `Kunde inte hämta deltagare.\n\n${error.message}` }) errorToCustomError({ ...error, message: `Kunde inte hämta deltagare.\n\n${error.message}` })
); );
}
}) })
); );
} }

View File

@@ -45,7 +45,7 @@ export class AvropService {
public handledareIsConfirmed$: Observable<boolean> = this._handledareIsConfirmed$.asObservable(); public handledareIsConfirmed$: Observable<boolean> = this._handledareIsConfirmed$.asObservable();
public avropIsSubmitted$: Observable<boolean> = this._avropIsSubmitted$.asObservable(); public avropIsSubmitted$: Observable<boolean> = this._avropIsSubmitted$.asObservable();
public error$: Observable<string> = this._error$.asObservable(); public error$: Observable<string> = this._error$.asObservable();
public showUnauthorizedError$: Observable<boolean> = this.avropApiService.showUnauthorizedError$;
public avropData$: Observable<AvropCompactData> = combineLatest([ public avropData$: Observable<AvropCompactData> = combineLatest([
this._filteredTjanster$, this._filteredTjanster$,
this._filteredUtforandeVerksamheter$, this._filteredUtforandeVerksamheter$,

View File

@@ -16,6 +16,7 @@ export class DeltagareService {
public sort$: Observable<Sort<keyof DeltagareCompact>> = this._sort$.asObservable(); public sort$: Observable<Sort<keyof DeltagareCompact>> = this._sort$.asObservable();
private _onlyMyDeltagare$ = new BehaviorSubject<boolean>(false); private _onlyMyDeltagare$ = new BehaviorSubject<boolean>(false);
public onlyMyDeltagare$: Observable<boolean> = this._onlyMyDeltagare$.asObservable(); public onlyMyDeltagare$: Observable<boolean> = this._onlyMyDeltagare$.asObservable();
public showUnauthorizedError$: Observable<boolean> = this.deltagareApiService.showUnauthorizedError$;
public deltagareLoading$: Observable<boolean> = this.deltagareApiService.deltagareLoading$; public deltagareLoading$: Observable<boolean> = this.deltagareApiService.deltagareLoading$;
public allDeltagareData$: Observable<DeltagareCompactData> = combineLatest([ public allDeltagareData$: Observable<DeltagareCompactData> = combineLatest([
this._limit$, this._limit$,

View File

@@ -3,6 +3,7 @@
### Bug Fixes ### Bug Fixes
- **deltagare:** Now fetching data using "genomforandeReferens" instead of "sokandeId" to avoid wrong data. [TV-692](https://jira.arbetsformedlingen.se/browse/TV-692) - **deltagare:** Now fetching data using "genomforandeReferens" instead of "sokandeId" to avoid wrong data. [TV-692](https://jira.arbetsformedlingen.se/browse/TV-692)
- **authorization:** Whenever the API throws a "403 Forbidden" error we now show an unauthorized message. [TV-695](https://jira.arbetsformedlingen.se/browse/TV-695)
## [2.0.0](https://bitbucket.arbetsformedlingen.se/projects/tea/repos/mina-sidor-fa-web/compare/diff?targetBranch=refs%2Ftags%2Fv1.5.0&sourceBranch=refs%2Ftags%2Fv2.0.0) (2021-09-24) ## [2.0.0](https://bitbucket.arbetsformedlingen.se/projects/tea/repos/mina-sidor-fa-web/compare/diff?targetBranch=refs%2Ftags%2Fv1.5.0&sourceBranch=refs%2Ftags%2Fv2.0.0) (2021-09-24)