Merge pull request #74 in TEA/mina-sidor-fa-web from feature/TV-389 to develop
Squashed commit of the following: commit a865f5452ae9cb5eab0b55080dd7e7ec43d9ed61 Merge: b4e5a9ed9938ccAuthor: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Fri Sep 3 10:25:38 2021 +0200 Merge branch 'develop-remote' into feature/TV-389 # Conflicts: # apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.ts # apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.module.ts commit b4e5a9ef26f99d0e0e8b2f8104f5e432da4bc82e Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Fri Sep 3 02:43:51 2021 +0200 TV-389 removed some references to inputs that are no longer existing. commit 04c1527a994d9c5479ebcd523261dd331beb093e Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Thu Sep 2 15:17:24 2021 +0200 TV-389 adjusted spelling error commit 3ea3faf1b13fafc16d4a97a6fc748dc790d1bc41 Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Thu Sep 2 15:13:57 2021 +0200 TV-389 have adjusted a bunch of issues after feedback in PR commit 9ced585dd830c19006ead3bfe5a52ae1467189ef Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Thu Sep 2 10:55:55 2021 +0200 Merge branch 'develop-remote' into feature/TV-389 # Conflicts: # apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/edit-employee-form/edit-employee-form.component.html # apps/mina-sidor-fa/src/app/pages/administration/pages/employee-form/employee-form.component.ts commit eb873ecb2125574c624523818f0441acd0a1bb61 Merge: 8f896cbb80bf22Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Thu Sep 2 10:35:44 2021 +0200 Merge branch 'develop-remote' into feature/TV-389 commit 8f896cbf156ea65fed95a19d17ef485d06046ed0 Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Wed Sep 1 18:19:16 2021 +0200 TV-389 making sure we're getting data of the right format commit 801e0298781815c9b4ca78f900cda17fbf33ffb5 Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Wed Sep 1 09:09:51 2021 +0200 TV-389 fixed old function name commit 145e312d68e9a067377b228a718386dcf419ef49 Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Wed Sep 1 08:52:54 2021 +0200 TV-389 restored file commit b1cf3b44bae548979fd090fca4e2194ae9c586c1 Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Wed Sep 1 08:47:30 2021 +0200 TV-389 cleaned up some console logs for testing and renamed a function commit e9d79205902771eafeaf0fbe3bdb63e7cceeb0d5 Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Wed Sep 1 08:30:08 2021 +0200 TV-389 have added a bunch of tests and refactored some stuff on the edit employee forms into a service. commit 185b4597c303ff20ae079efdf9247a53615b627e Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Tue Aug 31 15:00:50 2021 +0200 TV-389 made a first working version of the tree node selector commit ddff1ed3a05434a42a81d4dabfd8b2f2ff3c468e Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Tue Aug 31 13:01:49 2021 +0200 TV-389 adjustments after checking out integration against API. commit 92117d54b248f00a8b0619c3200d20a06510d9ba Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Tue Aug 31 12:21:05 2021 +0200 TV-389 made various changes in prepertion for integration against the api.. commit 2f15741eb47335cfe4e8c47dc779642a8ab9893b Merge: 062f42b02cf0f6Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Tue Aug 31 08:13:21 2021 +0200 Merge branch 'develop-remote' into feature/TV-389 commit 062f42b4d89976685fce463eec4f8deff399fd75 Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Tue Aug 31 08:12:37 2021 +0200 TV-389 preparing for integration with api.. commit 674b636e4b32aa391e1e14763c5781fa25bc31fb Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Tue Aug 31 07:51:12 2021 +0200 TV-389 fixed some custom validators for utforandeverksamheter.. commit 07256654273e499b41cbb6b06e26b9ca4f7627c5 Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Tue Aug 31 05:39:27 2021 +0200 TV-389 removed useless z-index commit 36b6ac2f6f846f5e88b393650c6d66821b600933 Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Tue Aug 31 05:32:16 2021 +0200 TV-389 added styling to button for opening the panel. commit 75ea6b7196e6ab69b0ec4ce103214dc742ea5252 Author: arbetsformedlingen_garcn <christian.gardebrink@arbetsformedlingen.se> Date: Tue Aug 31 03:23:10 2021 +0200 TV-389 minor adjustments of panel. ... and 13 more commits
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
||||
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { RouterTestingModule } from '@angular/router/testing';
|
||||
@@ -11,7 +12,7 @@ describe('EmployeeDeleteComponent', () => {
|
||||
await TestBed.configureTestingModule({
|
||||
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
||||
declarations: [EmployeeDeleteComponent],
|
||||
imports: [RouterTestingModule],
|
||||
imports: [RouterTestingModule, HttpClientTestingModule],
|
||||
}).compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(EmployeeDeleteComponent);
|
||||
|
||||
@@ -16,54 +16,50 @@
|
||||
[afInvalid]="emailFormControl.invalid && emailFormControl.touched"
|
||||
></digi-ng-form-input>
|
||||
|
||||
<fieldset *ngIf="rolesFormGroup && availableRoles" [formGroup]="rolesFormGroup">
|
||||
<fieldset>
|
||||
<legend>Tjänster</legend>
|
||||
<p>Välj de tjänster du vill ge personalen tillgång till.</p>
|
||||
<digi-ng-form-select
|
||||
[formControl]="tjansterFormControl"
|
||||
afLabel="Välj tjänster"
|
||||
[afPlaceholder]="'Välj tjänst'"
|
||||
[afSelectItems]="availableTjanster"
|
||||
[afDescription]="description"
|
||||
[afSelectItems]="selectableTjansterFormItems"
|
||||
[afDisableValidStyle]="true"
|
||||
[afDisableValidation]="disableValidation"
|
||||
[afValidMessage]="validMessage"
|
||||
[afDisabled]="disabled"
|
||||
[afInvalidMessage]="invalidMessage"
|
||||
[afInvalid]="invalid"
|
||||
[afInvalid]="tjansterFormControl.invalid && tjansterFormControl.touched"
|
||||
(afOnChange)="toggleTjanst()"
|
||||
></digi-ng-form-select>
|
||||
<div class="edit-employee-form__service-tag">
|
||||
<ng-container *ngFor="let employeeTjanst of selectedTjanster">
|
||||
<digi-tag
|
||||
class="edit-employee-form__service-tag--item"
|
||||
[attr.af-text]="employeeTjanst?.name"
|
||||
af-no-icon="false"
|
||||
af-size="s"
|
||||
(click)="unselectTjanstTag(employeeTjanst)"
|
||||
>
|
||||
</digi-tag>
|
||||
</ng-container>
|
||||
</div>
|
||||
<digi-form-validation-message
|
||||
*ngIf="tjansterFormControl.invalid && tjansterFormControl.touched"
|
||||
af-variation="error"
|
||||
>
|
||||
Du måste välja minst en tjänst
|
||||
</digi-form-validation-message>
|
||||
<!-- Vi får se till att bygga en kontrol för att kunna välja flera tjänster här istället, en digi-ng-select får vara en temporär lösning.. -->
|
||||
</fieldset>
|
||||
|
||||
<fieldset *ngIf="rolesFormGroup && availableRoles" [formGroup]="rolesFormGroup">
|
||||
<fieldset>
|
||||
<legend>Utförande verksamheter och adresser</legend>
|
||||
<p>Välj de utförandeverksamheter och utförande adresser du vill ge personalen behörighet till.</p>
|
||||
<p *ngIf="!availableUtforandeVerksamheter || availableUtforandeVerksamheter.length === 0">
|
||||
<strong>Du måste välja en eller flera tjänster för att kunna välja utförande verksamheter.</strong>
|
||||
</p>
|
||||
<div class="edit-employee-form__choose_all-utforande-verksamh">
|
||||
<digi-form-checkbox
|
||||
af-variation="primary"
|
||||
<digi-ng-form-checkbox
|
||||
[formControlName]="toggleAllUtforandeVerksamhetFormControlName"
|
||||
[afLabel]="'Välj alla utförade verksamheter och alla utförande adresser'"
|
||||
[afValue]=""
|
||||
(afOnChange)="selectAllUtforandeVerksamheter($event.detail.target.checked)"
|
||||
></digi-form-checkbox>
|
||||
(afOnChange)="toggleAllUtforandeVerksamheter($event)"
|
||||
>
|
||||
</digi-ng-form-checkbox>
|
||||
</div>
|
||||
<div
|
||||
style="display: flex; border: 1px solid; background-color: #eee; padding: 5px; justify-content: space-between"
|
||||
<msfa-tree-nodes-selector
|
||||
[headingText]="'Välj utförande verksamheter och adresser'"
|
||||
[formControlName]="utforandeVerksamhetFormControlName"
|
||||
[isInvalid]="utforandeVerksamhetFormControl?.invalid"
|
||||
[showValidation]="utforandeVerksamhetFormControl?.touched"
|
||||
[validationMessages]="utforandeVerksamhetFormControl.errors?.required ? ['Välj minst en utförande verksamhet'] : []"
|
||||
(selectedTreeNodesChanged)="updateToggleAllUtforandeVerksamheter()"
|
||||
>
|
||||
Plats för digi-select-form-item för utförande verksamheter
|
||||
<digi-icon-arrow-down></digi-icon-arrow-down>
|
||||
</div>
|
||||
</msfa-tree-nodes-selector>
|
||||
</fieldset>
|
||||
|
||||
<fieldset *ngIf="rolesFormGroup && availableRoles" [formGroup]="rolesFormGroup">
|
||||
|
||||
@@ -4,9 +4,11 @@ import { DigiNgFormInputModule } from '@af/digi-ng/_form/form-input';
|
||||
import { DigiNgFormRadiobuttonGroupModule } from '@af/digi-ng/_form/form-radiobutton-group';
|
||||
import { DigiNgFormSelectModule } from '@af/digi-ng/_form/form-select';
|
||||
import { DigiNgPopoverModule } from '@af/digi-ng/_popover/popover';
|
||||
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 { TreeNodesSelectorModule } from '@msfa-shared/components/tree-nodes-selector/tree-nodes-selector.module';
|
||||
|
||||
import { EditEmployeeFormComponent } from './edit-employee-form.component';
|
||||
|
||||
@@ -25,6 +27,8 @@ describe('EditEmployeeFormComponent', () => {
|
||||
DigiNgFormSelectModule,
|
||||
DigiNgPopoverModule,
|
||||
DigiNgFormCheckboxModule,
|
||||
HttpClientTestingModule,
|
||||
TreeNodesSelectorModule,
|
||||
],
|
||||
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
||||
}).compileComponents();
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { ButtonSize, ButtonType, ButtonVariation } from '@af/digi-ng/_button/button';
|
||||
import { FormSelectItem } from '@af/digi-ng/_form/form-select';
|
||||
import {
|
||||
Component,
|
||||
OnInit,
|
||||
@@ -12,14 +11,24 @@ import {
|
||||
} from '@angular/core';
|
||||
import { AbstractControl, FormControl, FormGroup, Validators } from '@angular/forms';
|
||||
import { Role } from '@msfa-models/role.model';
|
||||
import { RoleEnum } from '@msfa-enums/role.enum';
|
||||
import { Tjanst } from '@msfa-models/tjanst.model';
|
||||
import { FormTagData } from '@msfa-models/form-tag.model';
|
||||
import { FormSelectItem } from '@af/digi-ng/_form/form-select';
|
||||
import { TreeNodeValidator } from '@msfa-utils/validators/tree-node.validator';
|
||||
import {
|
||||
UtforandeVerksamhet,
|
||||
UtforandeVerksamheterService,
|
||||
} from '@msfa-services/utforande-verksamheter/utforande-verksamheter.service';
|
||||
import {
|
||||
TreeNode,
|
||||
TreeNodesSelectorService,
|
||||
} from '@msfa-shared/components/tree-nodes-selector/services/tree-nodes-selector.service';
|
||||
import { EmployeeFormService } from '../services/employee-form.service';
|
||||
|
||||
export interface EditEmployeeFormData {
|
||||
email: string;
|
||||
tjanster: FormTagData[],
|
||||
roles: Array<Role>;
|
||||
tjanster: Tjanst[];
|
||||
roles: Role[];
|
||||
utforandeVerksamheter: UtforandeVerksamhet[];
|
||||
}
|
||||
|
||||
@Component({
|
||||
@@ -29,14 +38,14 @@ export interface EditEmployeeFormData {
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class EditEmployeeFormComponent implements OnInit, OnChanges {
|
||||
@Input() currentEmail: string | null = null;
|
||||
@Input() availableRoles: Array<Role> | null = null;
|
||||
@Input() currentEmployeeRoles: Array<string> | null = null;
|
||||
|
||||
@Input() availableTjanster: Array<FormSelectItem> | null = null;
|
||||
@Input() currentEmployeeTjanster: Array<Tjanst> | null = null;
|
||||
selectedTjanster: Array<FormTagData> | null = null;
|
||||
@Input() currentEmail: string;
|
||||
@Input() availableRoles: Role[];
|
||||
@Input() currentEmployeeRoles: string[];
|
||||
@Input() availableTjanster: Tjanst[];
|
||||
@Input() currentEmployeeTjanster: Tjanst[];
|
||||
@Input() availableUtforandeVerksamheter: UtforandeVerksamhet[];
|
||||
|
||||
@Output() tjansterSelected = new EventEmitter<Tjanst[]>();
|
||||
@Output() formSubmitted = new EventEmitter<EditEmployeeFormData>();
|
||||
|
||||
readonly ButtonVariation = ButtonVariation;
|
||||
@@ -45,28 +54,55 @@ export class EditEmployeeFormComponent implements OnInit, OnChanges {
|
||||
|
||||
readonly emailFormControlName = 'email';
|
||||
readonly tjansterFormControlName = 'tjanster';
|
||||
readonly utforandeVerksamhetFormControlName = 'utforandeVerksamheter';
|
||||
readonly toggleAllUtforandeVerksamhetFormControlName = 'toggleAllUtforandeVerksamhet';
|
||||
|
||||
editEmployeeFormGroup: FormGroup | null = null;
|
||||
rolesFormGroup: FormGroup | null = null;
|
||||
|
||||
displayRolesDialog = false;
|
||||
|
||||
constructor() {}
|
||||
selectableTjansterFormItems: Array<FormSelectItem> | null = null;
|
||||
|
||||
constructor(
|
||||
private employeeFormService: EmployeeFormService,
|
||||
private utforandeVerksamheterService: UtforandeVerksamheterService,
|
||||
private treeNodesSelectorService: TreeNodesSelectorService
|
||||
) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.initializeEditEmployeeFormGroup();
|
||||
|
||||
if(this.currentEmployeeTjanster) {
|
||||
this.selectedTjanster = this.currentEmployeeTjanster
|
||||
.map(tjanst => ({tjanstekod: tjanst.code, name: tjanst.name} as FormTagData));
|
||||
}
|
||||
this.updateSelectableTjansterFormItems();
|
||||
}
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
if (changes.availableRoles || changes.availableTjanster) {
|
||||
if (changes.availableRoles) {
|
||||
this.initializeEditEmployeeFormGroup();
|
||||
}
|
||||
|
||||
if (changes.availableTjanster) {
|
||||
this.updateSelectableTjansterFormItems();
|
||||
}
|
||||
|
||||
if (changes.availableUtforandeVerksamheter) {
|
||||
this.editEmployeeFormGroup.patchValue(
|
||||
Object.fromEntries([
|
||||
[
|
||||
this.utforandeVerksamhetFormControlName,
|
||||
this.utforandeVerksamheterService.getTreeNodeDataFromUtforandeVerksamheter(
|
||||
this.availableUtforandeVerksamheter
|
||||
),
|
||||
],
|
||||
])
|
||||
);
|
||||
|
||||
this.editEmployeeFormGroup.patchValue(
|
||||
Object.fromEntries([[this.toggleAllUtforandeVerksamhetFormControlName, false]])
|
||||
);
|
||||
|
||||
this.updateUtforandeVerksamhetStatus();
|
||||
}
|
||||
|
||||
if (changes.currentEmployeeRoles) {
|
||||
this.updateRolesFormGroup();
|
||||
}
|
||||
@@ -75,19 +111,88 @@ export class EditEmployeeFormComponent implements OnInit, OnChanges {
|
||||
this.editEmployeeFormGroup.patchValue(Object.fromEntries([[this.emailFormControlName, this.currentEmail]]));
|
||||
}
|
||||
|
||||
if(changes.currentEmployeeTjanster) {
|
||||
if (changes.currentEmployeeTjanster) {
|
||||
this.editEmployeeFormGroup.patchValue(Object.fromEntries([[this.tjansterFormControlName, '']]));
|
||||
}
|
||||
}
|
||||
|
||||
get emailFormControl(): AbstractControl | null {
|
||||
get emailFormControl(): AbstractControl | undefined {
|
||||
return this.editEmployeeFormGroup?.get(this.emailFormControlName);
|
||||
}
|
||||
|
||||
get tjansterFormControl(): AbstractControl | null {
|
||||
get tjansterFormControl(): AbstractControl | undefined {
|
||||
return this.editEmployeeFormGroup?.get(this.tjansterFormControlName);
|
||||
}
|
||||
|
||||
get utforandeVerksamhetFormControl(): AbstractControl | undefined {
|
||||
return this.editEmployeeFormGroup?.get(this.utforandeVerksamhetFormControlName);
|
||||
}
|
||||
|
||||
get toggleAllUtforandeVerksamhetFormControl(): AbstractControl | undefined {
|
||||
return this.editEmployeeFormGroup?.get(this.toggleAllUtforandeVerksamhetFormControlName);
|
||||
}
|
||||
|
||||
private updateUtforandeVerksamhetStatus(): void {
|
||||
if (this.availableUtforandeVerksamheter && this.availableUtforandeVerksamheter.length > 0) {
|
||||
this.utforandeVerksamhetFormControl.enable();
|
||||
this.toggleAllUtforandeVerksamhetFormControl.enable();
|
||||
return;
|
||||
}
|
||||
|
||||
this.utforandeVerksamhetFormControl.disable();
|
||||
this.toggleAllUtforandeVerksamhetFormControl.disable();
|
||||
}
|
||||
|
||||
private updateSelectableTjansterFormItems(): void {
|
||||
this.selectableTjansterFormItems = this.availableTjanster?.map(tjanst => {
|
||||
return { name: tjanst.name, value: `${tjanst.tjanstId}` };
|
||||
});
|
||||
}
|
||||
|
||||
private initializeEditEmployeeFormGroup(): void {
|
||||
this.rolesFormGroup = this.employeeFormService.getRolesFormGroup(this.availableRoles, this.currentEmployeeRoles);
|
||||
|
||||
this.editEmployeeFormGroup = new FormGroup({
|
||||
// eslint-disable-next-line
|
||||
email: new FormControl(this.currentEmail, [Validators.required, Validators.email]),
|
||||
// eslint-disable-next-line
|
||||
tjanster: new FormControl('', [Validators.required]),
|
||||
roles: this.rolesFormGroup,
|
||||
utforandeVerksamheter: new FormControl(
|
||||
this.utforandeVerksamheterService.getTreeNodeDataFromUtforandeVerksamheter(this.availableUtforandeVerksamheter),
|
||||
[
|
||||
// eslint-disable-next-line
|
||||
TreeNodeValidator.IsValidTreeNode(
|
||||
this.utforandeVerksamheterService.hasSelectedUtforandeVerksamhet,
|
||||
'required'
|
||||
),
|
||||
]
|
||||
),
|
||||
toggleAllUtforandeVerksamhet: new FormControl(false, []),
|
||||
});
|
||||
|
||||
this.updateUtforandeVerksamhetStatus();
|
||||
}
|
||||
|
||||
private updateRolesFormGroup(): void {
|
||||
if (!this.rolesFormGroup || !this.availableRoles) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.rolesFormGroup.patchValue(
|
||||
Object.fromEntries(
|
||||
this.availableRoles.map(role => [
|
||||
this.employeeFormService.getFormControlName(role),
|
||||
this.employeeFormService.isSelectedRole(role, this.currentEmployeeRoles),
|
||||
])
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
getFormControlName(role: Role): string {
|
||||
return this.employeeFormService.getFormControlName(role);
|
||||
}
|
||||
|
||||
onFormSubmitted(): void {
|
||||
if (!this.editEmployeeFormGroup) {
|
||||
return;
|
||||
@@ -98,14 +203,22 @@ export class EditEmployeeFormComponent implements OnInit, OnChanges {
|
||||
}
|
||||
|
||||
this.formSubmitted.emit({
|
||||
email: this.emailFormControl?.value,
|
||||
tjanster: this.selectedTjanster,
|
||||
roles: this.getRolesFromFormGroup(this.rolesFormGroup, this.availableRoles),
|
||||
email: this.emailFormControl?.value as string,
|
||||
tjanster: this.employeeFormService.getSelectedTjanster(
|
||||
this.availableTjanster,
|
||||
parseInt(this.tjansterFormControl?.value, 10)
|
||||
),
|
||||
roles: this.employeeFormService.getRolesFromFormGroup(this.rolesFormGroup, this.availableRoles),
|
||||
utforandeVerksamheter: this.utforandeVerksamheterService.getSelectedUtforandeVerksamheterFromTreeNode(
|
||||
this.utforandeVerksamhetFormControl?.value
|
||||
),
|
||||
});
|
||||
}
|
||||
|
||||
getFormControlName(role: Role): string {
|
||||
return RoleEnum[role?.type];
|
||||
toggleTjanst(): void {
|
||||
this.tjansterSelected.emit(
|
||||
this.employeeFormService.getSelectedTjanster(this.availableTjanster, parseInt(this.tjansterFormControl.value, 10))
|
||||
);
|
||||
}
|
||||
|
||||
openRolesDialog(): void {
|
||||
@@ -116,99 +229,23 @@ export class EditEmployeeFormComponent implements OnInit, OnChanges {
|
||||
this.displayRolesDialog = false;
|
||||
}
|
||||
|
||||
private initializeEditEmployeeFormGroup(): void {
|
||||
this.rolesFormGroup = this.getRolesFormGroup(
|
||||
this.availableRoles,
|
||||
this.currentEmployeeRoles
|
||||
toggleAllUtforandeVerksamheter(selectAll: boolean): void {
|
||||
let treeNode: TreeNode = this.utforandeVerksamhetFormControl.value as TreeNode;
|
||||
|
||||
treeNode = selectAll
|
||||
? this.treeNodesSelectorService.getTreeNodeWithAllNodesSelected(treeNode)
|
||||
: this.treeNodesSelectorService.getTreeNodeWithNoNodesSelected(treeNode);
|
||||
|
||||
this.editEmployeeFormGroup.patchValue(Object.fromEntries([[this.utforandeVerksamhetFormControlName, treeNode]]));
|
||||
}
|
||||
|
||||
updateToggleAllUtforandeVerksamheter(): void {
|
||||
const hasSelectedAllLeafNodes = this.treeNodesSelectorService.hasSelectedAllLeafNodes(
|
||||
this.utforandeVerksamhetFormControl.value
|
||||
);
|
||||
|
||||
this.editEmployeeFormGroup = new FormGroup({
|
||||
email: new FormControl(this.currentEmail, [Validators.required, Validators.email]),
|
||||
tjanster: new FormControl('', []),
|
||||
roles: this.rolesFormGroup,
|
||||
});
|
||||
}
|
||||
|
||||
private updateRolesFormGroup(): void {
|
||||
if (!this.rolesFormGroup || !this.availableRoles) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.rolesFormGroup.patchValue(
|
||||
Object.fromEntries(
|
||||
this.availableRoles.map(role => [
|
||||
this.getFormControlName(role),
|
||||
this.isSelectedRole(role, this.currentEmployeeRoles),
|
||||
])
|
||||
)
|
||||
this.editEmployeeFormGroup.patchValue(
|
||||
Object.fromEntries([[this.toggleAllUtforandeVerksamhetFormControlName, hasSelectedAllLeafNodes]])
|
||||
);
|
||||
}
|
||||
|
||||
private getRolesFromFormGroup(
|
||||
formGroup: FormGroup | null,
|
||||
roles: Array<Role> | null
|
||||
): Array<Role> {
|
||||
if (!formGroup || !roles) {
|
||||
return;
|
||||
}
|
||||
|
||||
return roles.filter(
|
||||
role => formGroup.get(this.getFormControlName(role))?.value === true
|
||||
);
|
||||
}
|
||||
|
||||
private getRolesFormGroup(
|
||||
roles: Array<Role> | null,
|
||||
selectedRoles: Array<string> | null
|
||||
): FormGroup {
|
||||
if (!roles) {
|
||||
return new FormGroup({});
|
||||
}
|
||||
|
||||
return new FormGroup(
|
||||
Object.fromEntries(
|
||||
roles.map(role => [
|
||||
this.getFormControlName(role),
|
||||
new FormControl(this.isSelectedRole(role, selectedRoles), []),
|
||||
])
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private isSelectedRole(
|
||||
role: Role,
|
||||
selectedRoles: Array<string> | null
|
||||
): boolean {
|
||||
if (!selectedRoles || !role) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return selectedRoles.some(selectedRole => selectedRole === role.type);
|
||||
}
|
||||
|
||||
// Tjanster helper methods
|
||||
toggleTjanst(): void {
|
||||
const tjanstExistsInList: boolean = this.selectedTjanster
|
||||
.some(tag => tag.tjanstekod === this.tjansterFormControl.value);
|
||||
|
||||
const selectedTjanst: FormTagData[] = this.availableTjanster
|
||||
.filter(tjanst => tjanst.value === this.tjansterFormControl.value)
|
||||
.map(tjanst => ({tjanstekod: tjanst.value, name: tjanst.name}));
|
||||
if(this.tjansterFormControl.value && !tjanstExistsInList) {
|
||||
this.selectedTjanster.push(...selectedTjanst);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
unselectTjanstTag(tjanst: FormTagData): void {
|
||||
const tagExistsInList = this.selectedTjanster.some(tag => tag.tjanstekod === tjanst.tjanstekod);
|
||||
if(tjanst.tjanstekod && tagExistsInList) {
|
||||
this.selectedTjanster.splice(this.selectedTjanster.indexOf(tjanst), 1);
|
||||
}
|
||||
this.tjansterFormControl.setValue('');
|
||||
}
|
||||
|
||||
selectAllUtforandeVerksamheter(checked: boolean):void {
|
||||
console.log('selectAllUtforandeVerksamheter', checked);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,14 +41,18 @@
|
||||
</ng-container>
|
||||
</div>
|
||||
<!-- Component för att hantera formuläret -->
|
||||
<msfa-edit-employee-form
|
||||
[currentEmail]="employee?.email"
|
||||
[availableRoles]="selectableRoles"
|
||||
[currentEmployeeRoles]="employee?.roles"
|
||||
[availableTjanster]="availableTjanster"
|
||||
[currentEmployeeTjanster]="employee.tjanster"
|
||||
[selectedTjanster]="selectedServices$ | async"
|
||||
(formSubmitted)="updateEmployee($event)"
|
||||
></msfa-edit-employee-form>
|
||||
<ng-container>
|
||||
<msfa-edit-employee-form
|
||||
[currentEmail]="employee?.email"
|
||||
[availableRoles]="selectableRoles"
|
||||
[currentEmployeeRoles]="currentEmployeeRoles$ | async"
|
||||
[availableTjanster]="tjanster$ | async"
|
||||
[currentEmployeeTjanster]="employee.tjanster"
|
||||
[selectedTjanster]="selectedServices$ | async"
|
||||
[availableUtforandeVerksamheter]="availableUtforandeVerksamheter$ | async"
|
||||
(tjansterSelected)="setupAvailableUtforandeVerksamheter($event)"
|
||||
(formSubmitted)="updateEmployee($event)"
|
||||
></msfa-edit-employee-form>
|
||||
</ng-container>
|
||||
</section>
|
||||
</msfa-layout>
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
import { FormSelectItem } from '@af/digi-ng/_form/form-select';
|
||||
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { UnsubscribeDirective } from '@msfa-directives/unsubscribe.directive';
|
||||
import { Employee } from '@msfa-models/employee.model';
|
||||
import { mapRoleResponseToRoleObject, Role } from '@msfa-models/role.model';
|
||||
import { Tjanst } from '@msfa-models/tjanst.model';
|
||||
import { EmployeeService } from '@msfa-services/api/employee.service';
|
||||
import { TjanstService } from '@msfa-services/api/tjanst.service';
|
||||
import {
|
||||
UtforandeVerksamhet,
|
||||
UtforandeVerksamheterService,
|
||||
} from '@msfa-services/utforande-verksamheter/utforande-verksamheter.service';
|
||||
import { Observable } from 'rxjs';
|
||||
import { map } from 'rxjs/operators';
|
||||
import { EditEmployeeFormData } from './edit-employee-form/edit-employee-form.component';
|
||||
|
||||
@Component({
|
||||
@@ -16,48 +19,42 @@ import { EditEmployeeFormData } from './edit-employee-form/edit-employee-form.co
|
||||
styleUrls: ['./employee-form.component.scss'],
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class EmployeeFormComponent extends UnsubscribeDirective implements OnInit {
|
||||
subscriptionsList = [];
|
||||
export class EmployeeFormComponent implements OnInit {
|
||||
employee$ = this.employeeService.employee$;
|
||||
employee: Employee;
|
||||
|
||||
tjanster$: Observable<Tjanst[]> = this.tjanstService.tjanster$;
|
||||
availableTjanster: FormSelectItem[] | null = null;
|
||||
currentEmployeeRoles$: Observable<Role[] | undefined | null> = null;
|
||||
availableUtforandeVerksamheter$: Observable<Array<UtforandeVerksamhet>> | null = null;
|
||||
|
||||
selectableRoles: Role[] = this.employeeService.allRoles;
|
||||
currentEmployeeRoles: Role[] | undefined | null = null;
|
||||
|
||||
constructor(
|
||||
private employeeService: EmployeeService,
|
||||
private tjanstService: TjanstService,
|
||||
private utforandeVerksamheterService: UtforandeVerksamheterService,
|
||||
private activatedRoute: ActivatedRoute
|
||||
) {
|
||||
super();
|
||||
super.unsubscribeOnDestroy(...this.subscriptionsList);
|
||||
}
|
||||
) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.employeeService.setCurrentEmployeeId(this.activatedRoute.snapshot.params['employeeId']);
|
||||
const employeeDataSub = this.employee$.subscribe(employee => {
|
||||
this.employee = employee;
|
||||
this.currentEmployeeRoles = employee?.roles.map(role => mapRoleResponseToRoleObject(role));
|
||||
});
|
||||
|
||||
const tjanstRelatedDataSub = this.tjanster$.subscribe(tjanster => {
|
||||
const tjanstOptions: FormSelectItem[] = [];
|
||||
tjanster?.forEach(tjanst => {
|
||||
tjanstOptions.push({ name: tjanst?.name, value: tjanst?.code });
|
||||
});
|
||||
this.availableTjanster = tjanstOptions;
|
||||
});
|
||||
|
||||
this.subscriptionsList.push(employeeDataSub, tjanstRelatedDataSub);
|
||||
this.currentEmployeeRoles$ = this.employee$.pipe(
|
||||
map(employee => employee?.roles?.map(role => mapRoleResponseToRoleObject(role)))
|
||||
);
|
||||
}
|
||||
|
||||
updateEmployee(editEmployeeFormData: EditEmployeeFormData): void {
|
||||
console.log(editEmployeeFormData);
|
||||
}
|
||||
|
||||
setupAvailableUtforandeVerksamheter(selectedTjanster: Array<Tjanst>): void {
|
||||
if (!selectedTjanster) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.availableUtforandeVerksamheter$ = this.utforandeVerksamheterService.getUtforandeVerksamheter(
|
||||
selectedTjanster.map(tjanst => tjanst.tjanstId)
|
||||
);
|
||||
}
|
||||
setEmployeeToDelete(employee: Employee): void {
|
||||
this.employeeService.setEmployeeToDelete(employee);
|
||||
}
|
||||
|
||||
@@ -9,12 +9,13 @@ import { CommonModule } from '@angular/common';
|
||||
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
|
||||
import { ReactiveFormsModule } from '@angular/forms';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { HideTextModule } from '@msfa-shared/components/hide-text/hide-text.module';
|
||||
import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
|
||||
import { LocalDatePipeModule } from '@msfa-shared/pipes/local-date/local-date.module';
|
||||
import { EmployeeDeleteModule } from '../../components/employee-delete/employee-delete.module';
|
||||
import { EditEmployeeFormComponent } from './edit-employee-form/edit-employee-form.component';
|
||||
import { HideTextModule } from '@msfa-shared/components/hide-text/hide-text.module';
|
||||
import { EmployeeFormComponent } from './employee-form.component';
|
||||
import { TreeNodesSelectorModule } from '@msfa-shared/components/tree-nodes-selector/tree-nodes-selector.module';
|
||||
|
||||
@NgModule({
|
||||
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
||||
@@ -34,6 +35,7 @@ import { EmployeeFormComponent } from './employee-form.component';
|
||||
LayoutModule,
|
||||
EmployeeDeleteModule,
|
||||
HideTextModule,
|
||||
TreeNodesSelectorModule,
|
||||
],
|
||||
})
|
||||
export class EmployeeFormModule {}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
|
||||
import { EmployeeFormService } from './employee-form.service';
|
||||
|
||||
describe('EmployeeFormService', () => {
|
||||
let service: EmployeeFormService;
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({});
|
||||
service = TestBed.inject(EmployeeFormService);
|
||||
});
|
||||
|
||||
it('should be created', () => {
|
||||
expect(service).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,57 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { FormControl, FormGroup } from '@angular/forms';
|
||||
import { RoleEnum } from '@msfa-enums/role.enum';
|
||||
import { Role } from '@msfa-models/role.model';
|
||||
import { Tjanst } from '@msfa-models/tjanst.model';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class EmployeeFormService {
|
||||
isSelectedRole(role: Role, selectedRoles: Array<string> | null): boolean {
|
||||
if (!selectedRoles || !role) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return selectedRoles.some(selectedRole => selectedRole === role.type);
|
||||
}
|
||||
|
||||
getSelectedTjanster(tjanster: Array<Tjanst>, tjanstId: number): Array<Tjanst> {
|
||||
let selectedTjanst: Tjanst | null = null;
|
||||
|
||||
if (!tjanster) {
|
||||
return [];
|
||||
}
|
||||
|
||||
selectedTjanst = tjanster.find(tjanst => tjanst.tjanstId === tjanstId);
|
||||
|
||||
return selectedTjanst ? [selectedTjanst] : [];
|
||||
}
|
||||
|
||||
getRolesFromFormGroup(formGroup: FormGroup | null, roles: Array<Role> | null): Array<Role> {
|
||||
if (!formGroup || !roles) {
|
||||
return;
|
||||
}
|
||||
|
||||
return roles.filter(role => formGroup.get(this.getFormControlName(role))?.value === true);
|
||||
}
|
||||
|
||||
getRolesFormGroup(roles: Array<Role> | null, selectedRoles: Array<string> | null): FormGroup {
|
||||
if (!roles) {
|
||||
return new FormGroup({});
|
||||
}
|
||||
|
||||
return new FormGroup(
|
||||
Object.fromEntries(
|
||||
roles.map(role => [
|
||||
this.getFormControlName(role),
|
||||
new FormControl(this.isSelectedRole(role, selectedRoles), []),
|
||||
])
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
getFormControlName(role: Role): string {
|
||||
return RoleEnum[role?.type];
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import { DigiNgSkeletonBaseModule } from '@af/digi-ng/_skeleton/skeleton-base';
|
||||
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
||||
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { By } from '@angular/platform-browser';
|
||||
@@ -18,7 +19,7 @@ describe('EmployeesListComponent', () => {
|
||||
await TestBed.configureTestingModule({
|
||||
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
||||
declarations: [EmployeesListComponent, LayoutComponent],
|
||||
imports: [RouterTestingModule, DigiNgSkeletonBaseModule],
|
||||
imports: [RouterTestingModule, DigiNgSkeletonBaseModule, HttpClientTestingModule],
|
||||
}).compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(EmployeesListComponent);
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { Service } from '@msfa-enums/service.enum';
|
||||
import { EmployeeCompact } from '@msfa-models/employee.model';
|
||||
|
||||
export const employeesMock: EmployeeCompact[] = [
|
||||
@@ -7,5 +6,6 @@ export const employeesMock: EmployeeCompact[] = [
|
||||
fullName: 'Jayson Karlsson',
|
||||
tjanster: ['KROM'],
|
||||
utforandeVerksamheter: [],
|
||||
allaUtforandeVerksamheter: true,
|
||||
},
|
||||
];
|
||||
|
||||
@@ -2,10 +2,10 @@ import { HttpClientTestingModule } from '@angular/common/http/testing';
|
||||
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
||||
import { ComponentFixture, discardPeriodicTasks, fakeAsync, TestBed, tick } from '@angular/core/testing';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { AvropService } from '@msfa-services/avrop.service';
|
||||
import { of } from 'rxjs';
|
||||
import { AvropService } from '../../avrop.service';
|
||||
import { TemporaryFilterComponent } from '../temporary-filter/temporary-filter.component';
|
||||
import { AvropFiltersComponent } from './avrop-filters.component';
|
||||
import { TemporaryFilterComponent } from './temporary-filter/temporary-filter.component';
|
||||
|
||||
describe('AvropFiltersComponent', () => {
|
||||
let component: AvropFiltersComponent;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { AvropListComponent } from './avrop-list.component';
|
||||
|
||||
@@ -8,6 +9,7 @@ describe('AvropListComponent', () => {
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [AvropListComponent],
|
||||
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
||||
}).compileComponents();
|
||||
});
|
||||
|
||||
|
||||
@@ -12,42 +12,45 @@
|
||||
</div>
|
||||
<dl class="avrop-row__name">
|
||||
<dt class="avrop-table__label">Namn:</dt>
|
||||
<dd *ngIf="avrop.fullName; else emptyText">{{avrop.fullName}}</dd>
|
||||
<dd *ngIf="avrop?.fullName; else emptyText">{{avrop?.fullName}}</dd>
|
||||
</dl>
|
||||
<dl class="avrop-row__tjanst">
|
||||
<dt class="avrop-table__label">Tjänst:</dt>
|
||||
<dd *ngIf="avrop.tjanst; else emptyText">{{avrop.tjanst}}</dd>
|
||||
<dd *ngIf="avrop?.tjanst; else emptyText">{{avrop?.tjanst}}</dd>
|
||||
</dl>
|
||||
<dl class="avrop-row__start">
|
||||
<dt class="avrop-table__label">Startdatum:</dt>
|
||||
<dd>
|
||||
<digi-typography-time
|
||||
*ngIf="avrop.startDate; else emptyText"
|
||||
[afDateTime]="avrop.startDate"
|
||||
*ngIf="avrop?.startDate; else emptyText"
|
||||
[afDateTime]="avrop?.startDate"
|
||||
></digi-typography-time>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="avrop-row__end">
|
||||
<dt class="avrop-table__label">Slutdatum:</dt>
|
||||
<dd>
|
||||
<digi-typography-time *ngIf="avrop.endDate; else emptyText" [afDateTime]="avrop.endDate"></digi-typography-time>
|
||||
<digi-typography-time
|
||||
*ngIf="avrop?.endDate; else emptyText"
|
||||
[afDateTime]="avrop?.endDate"
|
||||
></digi-typography-time>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="avrop-row__translator">
|
||||
<dt class="avrop-table__label">Språkstöd/Tolk:</dt>
|
||||
<dd>{{avrop.sprakstod || '- '}}/{{avrop.tolkbehov || ' -'}}</dd>
|
||||
<dd>{{avrop?.sprakstod || '- '}}/{{avrop?.tolkbehov || ' -'}}</dd>
|
||||
</dl>
|
||||
<dl class="avrop-row__address">
|
||||
<dt class="avrop-table__label">Utförande adress:</dt>
|
||||
<dd *ngIf="avrop.utforandeAdress; else emptyText">{{avrop.utforandeAdress}}</dd>
|
||||
<dd *ngIf="avrop?.utforandeAdress; else emptyText">{{avrop?.utforandeAdress}}</dd>
|
||||
</dl>
|
||||
<dl class="avrop-row__level">
|
||||
<dt class="avrop-table__label">Spår/nivå:</dt>
|
||||
<dd *ngIf="avrop.trackCode; else emptyText">{{avrop.trackCode}}</dd>
|
||||
<dd *ngIf="avrop?.trackCode; else emptyText">{{avrop?.trackCode}}</dd>
|
||||
</dl>
|
||||
<dl class="avrop-row__handledare" *ngIf="isLocked">
|
||||
<dt class="avrop-table__label">Vald handledare:</dt>
|
||||
<dd *ngIf="handledare?.fullName; else emptyText">{{handledare.fullName}}</dd>
|
||||
<dd *ngIf="handledare?.fullName; else emptyText">{{handledare?.fullName}}</dd>
|
||||
</dl>
|
||||
<div *ngIf="isLocked" class="avrop-row__delete">
|
||||
<digi-button
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
export enum ButtonType {
|
||||
BUTTON = 'button',
|
||||
SUBMIT = 'submit',
|
||||
RESET = 'reset',
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
export enum FormInputSearchVariation {
|
||||
S = 's',
|
||||
M = 'm',
|
||||
L = 'l',
|
||||
}
|
||||
@@ -27,15 +27,15 @@ export class OrganizationPickerFormComponent implements OnInit, OnChanges {
|
||||
organizationPickerFormGroup: FormGroup | null = null;
|
||||
selectableOrganizations: Array<FormSelectItem> = [];
|
||||
|
||||
constructor() {}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.setupOrganizationPickerFormGroup();
|
||||
this.setupSelectableOrganizations(this.organizations);
|
||||
}
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
this.setupSelectableOrganizations(this.organizations);
|
||||
if (changes.organizations) {
|
||||
this.setupSelectableOrganizations(this.organizations);
|
||||
}
|
||||
}
|
||||
|
||||
get organizationFormControl(): AbstractControl | null {
|
||||
@@ -44,6 +44,7 @@ export class OrganizationPickerFormComponent implements OnInit, OnChanges {
|
||||
|
||||
private setupOrganizationPickerFormGroup(): void {
|
||||
this.organizationPickerFormGroup = new FormGroup({
|
||||
// eslint-disable-next-line
|
||||
organization: new FormControl(null, [Validators.required]),
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user