Merge pull request #76 in TEA/mina-sidor-fa-web from bugs/TV-520 to develop
Squashed commit of the following: commit 0b09c15d23fb2bfeb54cbf9e9508a65c782ba230 Merge: 32383b69a73ffeAuthor: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Tue Sep 7 10:09:02 2021 +0200 Merge branch 'develop-remote' into bugs/TV-520 commit 32383b6d1f2b3611cb99c7b05c66b46b561175fe Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Mon Sep 6 12:57:24 2021 +0200 TV-520 fixed failing test after merge from develop commit 29fff4e9dd055dd0da2ba21e8b95a9c4ae9714b4 Merge: b28ef1cdb03d97Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Mon Sep 6 12:46:50 2021 +0200 Merge branch 'develop-remote' into bugs/TV-520 commit b28ef1c1e8645452ab43f1dce8732f69ca73781c Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Mon Sep 6 10:30:13 2021 +0200 TV-520 removed unnecessary reference commit 17d39ec2d396aa4eb60d739a2a04b6e64d2fb5df Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Mon Sep 6 09:55:23 2021 +0200 TV-520 varied fixes for template errors.. commit 8196d0305b224475786843bd149d4e13cc3039aa Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Mon Sep 6 09:06:56 2021 +0200 Merge branch 'develop-remote' into bugs/TV-520 # Conflicts: # apps/mina-sidor-fa/src/app/pages/administration/administration-routing.module.ts commit 8911fdd694d227b901ad492679ed2ed0d044beeb Merge: 31cd47fec7b4fcAuthor: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Mon Sep 6 08:56:53 2021 +0200 Merge branch 'develop-remote' into bugs/TV-520 commit 31cd47ff2e13d090dd3489e21f18fcf292600cbd Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Mon Sep 6 08:52:06 2021 +0200 TV-520 lade in en funktion i layout komponenten som i stort sett alla sidor verkar använda sig av där title sätts till vad man lagt in för info i data objektet för den aktuella routen.
This commit is contained in:
@@ -60,6 +60,7 @@ const routes: Routes = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'organization-picker',
|
path: 'organization-picker',
|
||||||
|
data: { title: 'Välj organisation' },
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/organization-picker/organization-picker.module').then(m => m.OrganizationPickerModule),
|
import('./pages/organization-picker/organization-picker.module').then(m => m.OrganizationPickerModule),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -9,18 +9,22 @@ const routes: Routes = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'personal',
|
path: 'personal',
|
||||||
|
data: { title: 'Personalinformation' },
|
||||||
loadChildren: () => import('./pages/employees/employees.module').then(m => m.EmployeesModule),
|
loadChildren: () => import('./pages/employees/employees.module').then(m => m.EmployeesModule),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'personal/:employeeId',
|
path: 'personal/:employeeId',
|
||||||
|
data: { title: 'Personalinformation' },
|
||||||
loadChildren: () => import('./pages/employee-card/employee-card.module').then(m => m.EmployeeCardModule),
|
loadChildren: () => import('./pages/employee-card/employee-card.module').then(m => m.EmployeeCardModule),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'skapa-personalkonto',
|
path: 'skapa-personalkonto',
|
||||||
|
data: { title: 'Skapa personalkonto' },
|
||||||
loadChildren: () => import('./pages/employee-invite/employee-invite.module').then(m => m.EmployeeInviteModule),
|
loadChildren: () => import('./pages/employee-invite/employee-invite.module').then(m => m.EmployeeInviteModule),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'redigera-personalkonto/:employeeId',
|
path: 'redigera-personalkonto/:employeeId',
|
||||||
|
data: { title: 'Redigera personalkonto' },
|
||||||
loadChildren: () => import('./pages/employee-form/employee-form.module').then(m => m.EmployeeFormModule),
|
loadChildren: () => import('./pages/employee-form/employee-form.module').then(m => m.EmployeeFormModule),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -59,7 +59,7 @@
|
|||||||
>
|
>
|
||||||
<digi-ng-layout-expansion-panel *ngIf="utforandeverksamhet.adresser.length > 0">
|
<digi-ng-layout-expansion-panel *ngIf="utforandeverksamhet.adresser.length > 0">
|
||||||
<span data-slot-trigger>
|
<span data-slot-trigger>
|
||||||
{{ accordionExpanded ? 'Dölj' : 'Visa' }} {{utforandeverksamhet.adresser.length}}
|
<!-- vad refererar accordionExpanded till här?? Templaten bygger inte om det inte finns en definition av variabeln.. {{ accordionExpanded ? 'Dölj' : 'Visa' }} {{utforandeverksamhet.adresser.length}} -->
|
||||||
{{utforandeverksamhet.adresser.length === 1 ? 'adress' : 'adresser'}}
|
{{utforandeverksamhet.adresser.length === 1 ? 'adress' : 'adresser'}}
|
||||||
</span>
|
</span>
|
||||||
<ul class="employee-card__utforandeverksamheter-address-list">
|
<ul class="employee-card__utforandeverksamheter-address-list">
|
||||||
|
|||||||
@@ -90,6 +90,12 @@
|
|||||||
></digi-ng-form-checkbox>
|
></digi-ng-form-checkbox>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<digi-form-validation-message
|
||||||
|
*ngIf="rolesFormGroup.invalid && rolesFormGroup.errors.noRoleSelected && rolesFormGroup.touched"
|
||||||
|
af-variation="error"
|
||||||
|
>
|
||||||
|
Du måste välja minst en behörighet
|
||||||
|
</digi-form-validation-message>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<div class="edit-employee-form__footer">
|
<div class="edit-employee-form__footer">
|
||||||
|
|||||||
@@ -198,6 +198,8 @@ export class EditEmployeeFormComponent implements OnInit, OnChanges {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.editEmployeeFormGroup.markAllAsTouched();
|
||||||
|
|
||||||
if (this.editEmployeeFormGroup.invalid || this.editEmployeeFormGroup.pristine) {
|
if (this.editEmployeeFormGroup.invalid || this.editEmployeeFormGroup.pristine) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,6 @@
|
|||||||
[currentEmployeeRoles]="currentEmployeeRoles$ | async"
|
[currentEmployeeRoles]="currentEmployeeRoles$ | async"
|
||||||
[availableTjanster]="tjanster$ | async"
|
[availableTjanster]="tjanster$ | async"
|
||||||
[currentEmployeeTjanster]="employee.tjanster"
|
[currentEmployeeTjanster]="employee.tjanster"
|
||||||
[selectedTjanster]="selectedServices$ | async"
|
|
||||||
[availableUtforandeVerksamheter]="availableUtforandeVerksamheter$ | async"
|
[availableUtforandeVerksamheter]="availableUtforandeVerksamheter$ | async"
|
||||||
(tjansterSelected)="setupAvailableUtforandeVerksamheter($event)"
|
(tjansterSelected)="setupAvailableUtforandeVerksamheter($event)"
|
||||||
(formSubmitted)="updateEmployee($event)"
|
(formSubmitted)="updateEmployee($event)"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import { EditEmployeeFormData } from './edit-employee-form/edit-employee-form.co
|
|||||||
export class EmployeeFormComponent implements OnInit {
|
export class EmployeeFormComponent implements OnInit {
|
||||||
employee$ = this.employeeService.employee$;
|
employee$ = this.employeeService.employee$;
|
||||||
tjanster$: Observable<Tjanst[]> = this.tjanstService.tjanster$;
|
tjanster$: Observable<Tjanst[]> = this.tjanstService.tjanster$;
|
||||||
currentEmployeeRoles$: Observable<Role[] | undefined | null> = null;
|
currentEmployeeRoles$: Observable<string[] | undefined | null> = null;
|
||||||
availableUtforandeVerksamheter$: Observable<Array<UtforandeVerksamhet>> | null = null;
|
availableUtforandeVerksamheter$: Observable<Array<UtforandeVerksamhet>> | null = null;
|
||||||
|
|
||||||
selectableRoles: Role[] = this.employeeService.allRoles;
|
selectableRoles: Role[] = this.employeeService.allRoles;
|
||||||
@@ -38,7 +38,7 @@ export class EmployeeFormComponent implements OnInit {
|
|||||||
this.employeeService.setCurrentEmployeeId(this.activatedRoute.snapshot.params['employeeId']);
|
this.employeeService.setCurrentEmployeeId(this.activatedRoute.snapshot.params['employeeId']);
|
||||||
|
|
||||||
this.currentEmployeeRoles$ = this.employee$.pipe(
|
this.currentEmployeeRoles$ = this.employee$.pipe(
|
||||||
map(employee => employee?.roles?.map(role => mapRoleResponseToRoleObject(role)))
|
map(employee => employee?.roles?.map(role => mapRoleResponseToRoleObject(role)?.type))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { FormControl, FormGroup } from '@angular/forms';
|
|||||||
import { RoleEnum } from '@msfa-enums/role.enum';
|
import { RoleEnum } from '@msfa-enums/role.enum';
|
||||||
import { Role } from '@msfa-models/role.model';
|
import { Role } from '@msfa-models/role.model';
|
||||||
import { Tjanst } from '@msfa-models/tjanst.model';
|
import { Tjanst } from '@msfa-models/tjanst.model';
|
||||||
|
import { EmployeeValidator } from '@msfa-utils/validators/employee.validator';
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root',
|
providedIn: 'root',
|
||||||
@@ -47,7 +48,10 @@ export class EmployeeFormService {
|
|||||||
this.getFormControlName(role),
|
this.getFormControlName(role),
|
||||||
new FormControl(this.isSelectedRole(role, selectedRoles), []),
|
new FormControl(this.isSelectedRole(role, selectedRoles), []),
|
||||||
])
|
])
|
||||||
)
|
),
|
||||||
|
{
|
||||||
|
validators: [EmployeeValidator.HasSelectedAtLeastOneRole(roles.map(role => this.getFormControlName(role)))],
|
||||||
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { DigiNgFormInputModule } from '@af/digi-ng/_form/form-input';
|
import { DigiNgFormInputModule } from '@af/digi-ng/_form/form-input';
|
||||||
|
import { DigiNgFormTextareaModule } from '@af/digi-ng/_form/form-textarea';
|
||||||
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
||||||
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
@@ -14,7 +15,7 @@ describe('EmployeeInviteComponent', () => {
|
|||||||
await TestBed.configureTestingModule({
|
await TestBed.configureTestingModule({
|
||||||
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
||||||
declarations: [EmployeeInviteComponent],
|
declarations: [EmployeeInviteComponent],
|
||||||
imports: [ReactiveFormsModule, DigiNgFormInputModule, HttpClientTestingModule],
|
imports: [ReactiveFormsModule, DigiNgFormInputModule, DigiNgFormTextareaModule, HttpClientTestingModule],
|
||||||
}).compileComponents();
|
}).compileComponents();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,6 @@
|
|||||||
[employees]="employeesData.data"
|
[employees]="employeesData.data"
|
||||||
[paginationMeta]="employeesData.meta"
|
[paginationMeta]="employeesData.meta"
|
||||||
[sort]="sort$ | async"
|
[sort]="sort$ | async"
|
||||||
[order]="order$ | async"
|
|
||||||
(sorted)="handleEmployeesSort($event)"
|
(sorted)="handleEmployeesSort($event)"
|
||||||
(paginated)="setNewPage($event)"
|
(paginated)="setNewPage($event)"
|
||||||
(deleteEmployee)="setEmployeeToDelete($event)"
|
(deleteEmployee)="setEmployeeToDelete($event)"
|
||||||
|
|||||||
@@ -117,4 +117,7 @@
|
|||||||
<ng-template #loadingRef>
|
<ng-template #loadingRef>
|
||||||
<digi-icon-spinner class="msfa__spinner" af-title="Laddar innehåll"></digi-icon-spinner>
|
<digi-icon-spinner class="msfa__spinner" af-title="Laddar innehåll"></digi-icon-spinner>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
<ng-template #noAvailabeHandledare>
|
||||||
|
<!-- lägg in lämpligt innehåll -->
|
||||||
|
</ng-template>
|
||||||
</msfa-layout>
|
</msfa-layout>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
import { Title } from '@angular/platform-browser';
|
||||||
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
import { UnsubscribeDirective } from '@msfa-directives/unsubscribe.directive';
|
import { UnsubscribeDirective } from '@msfa-directives/unsubscribe.directive';
|
||||||
import { Organization } from '@msfa-models/organization.model';
|
import { Organization } from '@msfa-models/organization.model';
|
||||||
import { UserService } from '@msfa-services/api/user.service';
|
import { UserService } from '@msfa-services/api/user.service';
|
||||||
@@ -18,7 +19,12 @@ export class OrganizationPickerComponent extends UnsubscribeDirective {
|
|||||||
map(({ organizations }) => organizations)
|
map(({ organizations }) => organizations)
|
||||||
);
|
);
|
||||||
|
|
||||||
constructor(private userService: UserService, private router: Router) {
|
constructor(
|
||||||
|
private userService: UserService,
|
||||||
|
private router: Router,
|
||||||
|
private titleService: Title,
|
||||||
|
private activatedRoute: ActivatedRoute
|
||||||
|
) {
|
||||||
super();
|
super();
|
||||||
super.unsubscribeOnDestroy(
|
super.unsubscribeOnDestroy(
|
||||||
this.organizations$.subscribe(organizations => {
|
this.organizations$.subscribe(organizations => {
|
||||||
@@ -27,6 +33,10 @@ export class OrganizationPickerComponent extends UnsubscribeDirective {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const pageTitle = this.activatedRoute?.snapshot?.data?.title as string;
|
||||||
|
|
||||||
|
this.titleService.setTitle(`Mina sidor FA${pageTitle ? ` - ${pageTitle}` : ''}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
loginWithOrganization(organization: Organization): void {
|
loginWithOrganization(organization: Organization): void {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { NavigationBreadcrumbsItem } from '@af/digi-ng/_navigation/navigation-breadcrumbs';
|
import { NavigationBreadcrumbsItem } from '@af/digi-ng/_navigation/navigation-breadcrumbs';
|
||||||
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
||||||
|
import { Title } from '@angular/platform-browser';
|
||||||
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
|
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
|
||||||
import { UnsubscribeDirective } from '@msfa-directives/unsubscribe.directive';
|
import { UnsubscribeDirective } from '@msfa-directives/unsubscribe.directive';
|
||||||
import { User } from '@msfa-models/user.model';
|
import { User } from '@msfa-models/user.model';
|
||||||
@@ -35,12 +36,17 @@ export class LayoutComponent extends UnsubscribeDirective {
|
|||||||
private router: Router,
|
private router: Router,
|
||||||
private activatedRoute: ActivatedRoute,
|
private activatedRoute: ActivatedRoute,
|
||||||
private authenticationService: AuthenticationService,
|
private authenticationService: AuthenticationService,
|
||||||
private userService: UserService
|
private userService: UserService,
|
||||||
|
private titleService: Title
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
super.unsubscribeOnDestroy(
|
super.unsubscribeOnDestroy(
|
||||||
this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => {
|
this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => {
|
||||||
|
const pageTitle = this.activatedRoute?.snapshot?.data?.title as string;
|
||||||
const urlTree = this.router.parseUrl(this.router.url);
|
const urlTree = this.router.parseUrl(this.router.url);
|
||||||
|
|
||||||
|
this.titleService.setTitle(`Mina sidor FA${pageTitle ? ` - ${pageTitle}` : ''}`);
|
||||||
|
|
||||||
if (urlTree.queryParams.code) {
|
if (urlTree.queryParams.code) {
|
||||||
void this.router.navigate([], {
|
void this.router.navigate([], {
|
||||||
relativeTo: this.activatedRoute,
|
relativeTo: this.activatedRoute,
|
||||||
@@ -49,7 +55,9 @@ export class LayoutComponent extends UnsubscribeDirective {
|
|||||||
replaceUrl: true,
|
replaceUrl: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
urlTree.queryParams = {};
|
urlTree.queryParams = {};
|
||||||
|
|
||||||
const paths = urlTree
|
const paths = urlTree
|
||||||
.toString()
|
.toString()
|
||||||
.split('/')
|
.split('/')
|
||||||
|
|||||||
@@ -13,10 +13,10 @@
|
|||||||
>
|
>
|
||||||
<digi-form-input-search
|
<digi-form-input-search
|
||||||
[attr.af-variation]="FormInputSearchVariation.S"
|
[attr.af-variation]="FormInputSearchVariation.S"
|
||||||
[attr.af-button-text]="getFilterButtonAriaLabelText()"
|
[attr.af-button-text]="getFilterButtonAriaLabelText(treeNodeModel)"
|
||||||
[attr.af-button-type]="ButtonType.BUTTON"
|
[attr.af-button-type]="ButtonType.BUTTON"
|
||||||
[attr.af-label]="' '"
|
[attr.af-label]="' '"
|
||||||
[attr.af-aria-labelledby]="filterDescriptionId"
|
[attr.af-aria-labelledby]="getFilterDescriptionId(treeNodeModel)"
|
||||||
(afOnFocusOutside)="onFocusOutsideFilter($event)"
|
(afOnFocusOutside)="onFocusOutsideFilter($event)"
|
||||||
(afOnChange)="onFilterTextChanged($event, treeNodeModel)"
|
(afOnChange)="onFilterTextChanged($event, treeNodeModel)"
|
||||||
(afOnKeyup)="onFilterTextChanged($event, treeNodeModel)"
|
(afOnKeyup)="onFilterTextChanged($event, treeNodeModel)"
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import { FormGroup, ValidatorFn } from '@angular/forms';
|
||||||
|
|
||||||
|
export class EmployeeValidator {
|
||||||
|
static HasSelectedAtLeastOneRole(roleFormControlNames: Array<string>): ValidatorFn {
|
||||||
|
return (fg: FormGroup): { [key: string]: unknown } => {
|
||||||
|
if (!roleFormControlNames || roleFormControlNames.length === 0) {
|
||||||
|
return { noRoleSelected: true };
|
||||||
|
}
|
||||||
|
|
||||||
|
return roleFormControlNames.some(roleFormControlName => fg?.controls[roleFormControlName]?.value)
|
||||||
|
? null
|
||||||
|
: { noRoleSelected: true };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29,5 +29,9 @@
|
|||||||
"@msfa-shared/*": ["apps/mina-sidor-fa/src/app/shared/*"]
|
"@msfa-shared/*": ["apps/mina-sidor-fa/src/app/shared/*"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"angularCompilerOptions": {
|
||||||
|
"fullTemplateTypeCheck": true,
|
||||||
|
"strictInjectionParameters": true
|
||||||
|
},
|
||||||
"exclude": ["node_modules", "tmp"]
|
"exclude": ["node_modules", "tmp"]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user