feat(ui): Added radiobutton-group to ui-libs. (TV-854)

Squashed commit of the following:

commit 04465cb065382fa481a0b257e5f9190b5dcb1c4d
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Thu Nov 4 15:21:21 2021 +0100

    Updated components to use radiobutton-group from ui-libs

commit 5aa465c04ce01659dfb4f339970ed821c4431f5a
Merge: a2f347bd 28d128c1
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Thu Nov 4 10:10:07 2021 +0100

    Merge branch 'develop' into feature/TV-854-radiobutton-group

commit a2f347bdb03411014819a48a935899c7bcffaca0
Merge: b326e0bb 5c12b2b7
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Thu Nov 4 08:35:44 2021 +0100

    Merge branch 'develop' into feature/TV-854-radiobutton-group

commit b326e0bbd843c43cc18661b53e06a214cb7259c8
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Thu Nov 4 08:01:38 2021 +0100

    WIP
This commit is contained in:
Erik Tiekstra
2021-11-04 16:07:33 +01:00
parent 28d128c1e2
commit b9a14ef3cd
20 changed files with 308 additions and 80 deletions

View File

@@ -127,11 +127,13 @@
af-name="wholeDay" af-name="wholeDay"
af-form="franvaro-report-form" af-form="franvaro-report-form"
> >
<digi-ng-form-radiobutton-group <ui-radiobutton-group
[afRadiobuttons]="wholeDayOrPartOfDayRadiobuttons" formControlName="wholeDay"
[afRequired]="true" [uiRadiobuttons]="wholeDayOrPartOfDayRadiobuttons"
[formControl]="wholeDayFormControl" [uiBooleanValues]="true"
></digi-ng-form-radiobutton-group> [uiRequired]="true"
[uiAnnounceIfOptional]="true"
></ui-radiobutton-group>
</digi-form-fieldset> </digi-form-fieldset>
</div> </div>

View File

@@ -1,4 +1,3 @@
import { RadiobuttonModel } from '@af/digi-ng/_form/form-radiobutton-group';
import { ChangeDetectionStrategy, Component } from '@angular/core'; import { ChangeDetectionStrategy, Component } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms'; import { FormControl, FormGroup } from '@angular/forms';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
@@ -9,6 +8,7 @@ import { CustomError } from '@msfa-models/error/custom-error';
import { FranvaroReason } from '@msfa-models/franvaro-reason.model'; import { FranvaroReason } from '@msfa-models/franvaro-reason.model';
import { Franvaro } from '@msfa-models/franvaro.model'; import { Franvaro } from '@msfa-models/franvaro.model';
import { formatDate } from '@msfa-utils/format-to-date.util'; import { formatDate } from '@msfa-utils/format-to-date.util';
import { Radiobutton } from '@ui/radiobutton-group/radiobutton.model';
import { addDays } from 'date-fns'; import { addDays } from 'date-fns';
import { BehaviorSubject, Observable } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs';
import { map, shareReplay, switchMap, take } from 'rxjs/operators'; import { map, shareReplay, switchMap, take } from 'rxjs/operators';
@@ -52,14 +52,12 @@ export class FranvaroReportFormComponent {
reasons$: Observable<FranvaroReason[]> = this.franvaroReportFormService.reasons$; reasons$: Observable<FranvaroReason[]> = this.franvaroReportFormService.reasons$;
otherKnownReasons$: Observable<FranvaroReason[]> = this.franvaroReportFormService.otherKnownReasons$; otherKnownReasons$: Observable<FranvaroReason[]> = this.franvaroReportFormService.otherKnownReasons$;
wholeDayOrPartOfDayRadiobuttons: RadiobuttonModel[] = [ wholeDayOrPartOfDayRadiobuttons: Radiobutton[] = [
{ label: 'Heldag', value: true }, { label: 'Heldag', value: true },
{ label: 'Del av dag', value: false }, { label: 'Del av dag', value: false },
]; ];
constructor(private franvaroReportFormService: FranvaroReportFormService, private activatedRoute: ActivatedRoute) { constructor(private franvaroReportFormService: FranvaroReportFormService, private activatedRoute: ActivatedRoute) {}
this.dateFormControl.valueChanges.subscribe(value => console.log(value));
}
get showOtherKnownReasonsSelect(): boolean { get showOtherKnownReasonsSelect(): boolean {
return this.reasonFormControl.value === ANNAN_KAND_ORSAK_ID; return this.reasonFormControl.value === ANNAN_KAND_ORSAK_ID;

View File

@@ -1,7 +1,6 @@
import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog'; import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog';
import { DigiNgFormDatepickerModule } from '@af/digi-ng/_form/form-datepicker'; import { DigiNgFormDatepickerModule } from '@af/digi-ng/_form/form-datepicker';
import { DigiNgFormInputModule } from '@af/digi-ng/_form/form-input'; 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 { DigiNgFormSelectModule } from '@af/digi-ng/_form/form-select';
import { DigiNgFormValidationMessageModule } from '@af/digi-ng/_form/form-validation-message'; import { DigiNgFormValidationMessageModule } from '@af/digi-ng/_form/form-validation-message';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
@@ -11,6 +10,7 @@ import { RouterModule } from '@angular/router';
import { BackLinkModule } from '@msfa-shared/components/back-link/back-link.module'; import { BackLinkModule } from '@msfa-shared/components/back-link/back-link.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiLoaderModule } from '@ui/loader/loader.module'; import { UiLoaderModule } from '@ui/loader/loader.module';
import { UiRadiobuttonGroupModule } from '@ui/radiobutton-group/radiobutton-group.module';
import { UiSkeletonModule } from '@ui/skeleton/skeleton.module'; import { UiSkeletonModule } from '@ui/skeleton/skeleton.module';
import { UiTextareaModule } from '@ui/textarea/textarea.module'; import { UiTextareaModule } from '@ui/textarea/textarea.module';
import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module'; import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module';
@@ -32,12 +32,12 @@ import { FranvaroReportFormService } from './franvaro-report-form.service';
ReportDescriptionListModule, ReportDescriptionListModule,
DigiNgFormSelectModule, DigiNgFormSelectModule,
DigiNgFormDatepickerModule, DigiNgFormDatepickerModule,
DigiNgFormRadiobuttonGroupModule,
UiSkeletonModule, UiSkeletonModule,
DigiNgFormInputModule, DigiNgFormInputModule,
DigiNgFormValidationMessageModule, DigiNgFormValidationMessageModule,
DigiNgDialogModule, DigiNgDialogModule,
UiTextareaModule, UiTextareaModule,
UiRadiobuttonGroupModule,
], ],
providers: [FranvaroReportFormService], providers: [FranvaroReportFormService],
exports: [FranvaroReportFormComponent], exports: [FranvaroReportFormComponent],

View File

@@ -46,12 +46,14 @@
af-name="distance" af-name="distance"
af-form="gemensam-planering-form-form" af-form="gemensam-planering-form-form"
> >
<digi-ng-form-radiobutton-group <ui-radiobutton-group
[afRadiobuttons]="distanceRadiobuttons"
formControlName="distance" formControlName="distance"
[afRequired]="true" [uiBooleanValues]="true"
[afRadiobuttonGroupDirection]="RadiobuttonGroupDirection.HORIZONTAL" [uiRequired]="true"
></digi-ng-form-radiobutton-group> [uiAnnounceIfOptional]="true"
[uiRadiobuttons]="distanceRadiobuttons"
uiDirection="horizontal"
></ui-radiobutton-group>
</digi-form-fieldset> </digi-form-fieldset>
<digi-form-fieldset af-legend="Aktiviteter" af-name="aktivitetsIds" af-form="gemensam-planering-form-form"> <digi-form-fieldset af-legend="Aktiviteter" af-name="aktivitetsIds" af-form="gemensam-planering-form-form">
<p> <p>

View File

@@ -1,4 +1,4 @@
import { RadiobuttonGroupDirection, RadiobuttonModel } from '@af/digi-ng/_form/form-radiobutton-group'; import { RadiobuttonGroupDirection } from '@af/digi-ng/_form/form-radiobutton-group';
import { ChangeDetectionStrategy, Component } from '@angular/core'; import { ChangeDetectionStrategy, Component } from '@angular/core';
import { FormArray, FormControl, FormGroup } from '@angular/forms'; import { FormArray, FormControl, FormGroup } from '@angular/forms';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
@@ -9,6 +9,7 @@ import {
GemensamPlanering, GemensamPlanering,
mapGemensamPlaneringToGemensamPlaneringPostRequest, mapGemensamPlaneringToGemensamPlaneringPostRequest,
} from '@msfa-models/gemensam-planering.model'; } from '@msfa-models/gemensam-planering.model';
import { Radiobutton } from '@ui/radiobutton-group/radiobutton.model';
import { addDays } from 'date-fns'; import { addDays } from 'date-fns';
import { BehaviorSubject, Observable } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs';
import { map, shareReplay, switchMap, take } from 'rxjs/operators'; import { map, shareReplay, switchMap, take } from 'rxjs/operators';
@@ -48,7 +49,7 @@ export class GemensamPlaneringFormComponent {
[GemensamPlaneringFormValidator.isGemensamPlaneringValid(this.obligatoryActivityIds)] [GemensamPlaneringFormValidator.isGemensamPlaneringValid(this.obligatoryActivityIds)]
); );
distanceRadiobuttons: RadiobuttonModel[] = [ distanceRadiobuttons: Radiobutton[] = [
{ label: 'Ja', value: true }, { label: 'Ja', value: true },
{ label: 'Nej', value: false }, { label: 'Nej', value: false },
]; ];

View File

@@ -1,6 +1,5 @@
import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog'; import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog';
import { DigiNgFormCheckboxModule } from '@af/digi-ng/_form/form-checkbox'; import { DigiNgFormCheckboxModule } from '@af/digi-ng/_form/form-checkbox';
import { DigiNgFormRadiobuttonGroupModule } from '@af/digi-ng/_form/form-radiobutton-group';
import { DigiNgProgressProgressbarModule } from '@af/digi-ng/_progress/progressbar'; import { DigiNgProgressProgressbarModule } from '@af/digi-ng/_progress/progressbar';
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';
@@ -9,6 +8,7 @@ import { RouterModule } from '@angular/router';
import { BackLinkModule } from '@msfa-shared/components/back-link/back-link.module'; import { BackLinkModule } from '@msfa-shared/components/back-link/back-link.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiLoaderModule } from '@ui/loader/loader.module'; import { UiLoaderModule } from '@ui/loader/loader.module';
import { UiRadiobuttonGroupModule } from '@ui/radiobutton-group/radiobutton-group.module';
import { UiSkeletonModule } from '@ui/skeleton/skeleton.module'; import { UiSkeletonModule } from '@ui/skeleton/skeleton.module';
import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module'; import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module';
import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module'; import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module';
@@ -23,7 +23,7 @@ import { GemensamPlaneringFormService } from './gemensam-planering-form.service'
RouterModule.forChild([{ path: '', component: GemensamPlaneringFormComponent }]), RouterModule.forChild([{ path: '', component: GemensamPlaneringFormComponent }]),
LayoutModule, LayoutModule,
DigiNgProgressProgressbarModule, DigiNgProgressProgressbarModule,
DigiNgFormRadiobuttonGroupModule, UiRadiobuttonGroupModule,
ReactiveFormsModule, ReactiveFormsModule,
ReportLayoutModule, ReportLayoutModule,
BackLinkModule, BackLinkModule,

View File

@@ -51,23 +51,17 @@
af-name="languageSupport" af-name="languageSupport"
af-form="periodisk-redovisning-form" af-form="periodisk-redovisning-form"
> >
<digi-ng-form-radiobutton-group <ui-radiobutton-group
[afRadiobuttonGroupDirection]="radiobuttonGroupDirection.HORIZONTAL" formControlName="hasOfferedLanguageSupport"
[afRadiobuttons]="[{label:'Ja', value: true}, {label:'Nej', value: false}]" [uiBooleanValues]="true"
[formControl]="hasOfferedLanguageSupportFormControl" [uiRequired]="true"
[afRequired]="true" [uiAnnounceIfOptional]="true"
class="periodisk-redovisning-form__radio-buttons" [uiRadiobuttons]="yesNoRadiobuttons"
[ngClass]="{'periodisk-redovisning-form__radio-buttons--invalid': formControlIsInvalid(hasOfferedLanguageSupportFormControl)}" [uiInvalid]="formControlIsInvalid(hasOfferedLanguageSupportFormControl)"
></digi-ng-form-radiobutton-group> uiValidationMessage="Ett val är obligatoriskt"
uiDirection="horizontal"
></ui-radiobutton-group>
</digi-form-fieldset> </digi-form-fieldset>
<div aria-atomic="true" role="alert">
<digi-form-validation-message
*ngIf="formControlIsInvalid(hasOfferedLanguageSupportFormControl)"
af-variation="error"
>
Ett val är obligatoriskt
</digi-form-validation-message>
</div>
</div> </div>
<div> <div>
@@ -76,22 +70,17 @@
af-name="jobOffered" af-name="jobOffered"
af-form="periodisk-redovisning-form" af-form="periodisk-redovisning-form"
> >
<digi-ng-form-radiobutton-group <ui-radiobutton-group
[afRadiobuttonGroupDirection]="radiobuttonGroupDirection.HORIZONTAL" formControlName="hasOfferedJob"
[afRadiobuttons]="[{label:'Ja', value: true}, {label:'Nej', value: false}]" [uiBooleanValues]="true"
[formControl]="hasOfferedJobFormControl" [uiRequired]="true"
class="periodisk-redovisning-form__radio-buttons" [uiAnnounceIfOptional]="true"
[ngClass]="{'periodisk-redovisning-form__radio-buttons--invalid': formControlIsInvalid(hasOfferedJobFormControl)}" [uiRadiobuttons]="yesNoRadiobuttons"
></digi-ng-form-radiobutton-group> [uiInvalid]="formControlIsInvalid(hasOfferedJobFormControl)"
uiValidationMessage="Ett val är obligatoriskt"
uiDirection="horizontal"
></ui-radiobutton-group>
</digi-form-fieldset> </digi-form-fieldset>
<div aria-atomic="true" role="alert">
<digi-form-validation-message
*ngIf="formControlIsInvalid(hasOfferedJobFormControl)"
af-variation="error"
>
Ett val är obligatoriskt
</digi-form-validation-message>
</div>
</div> </div>
<div> <div>

View File

@@ -14,6 +14,7 @@ import { CustomError } from '@msfa-models/error/custom-error';
import { capitalizeWords } from '@msfa-utils/capitalize-words.util'; import { capitalizeWords } from '@msfa-utils/capitalize-words.util';
import { formatDate, formatToDate } from '@msfa-utils/format-to-date.util'; import { formatDate, formatToDate } from '@msfa-utils/format-to-date.util';
import { RequiredValidator } from '@msfa-validators/required.validator'; import { RequiredValidator } from '@msfa-validators/required.validator';
import { Radiobutton } from '@ui/radiobutton-group/radiobutton.model';
import { subMonths } from 'date-fns'; import { subMonths } from 'date-fns';
import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; import { BehaviorSubject, combineLatest, Observable } from 'rxjs';
import { map, shareReplay, switchMap, take } from 'rxjs/operators'; import { map, shareReplay, switchMap, take } from 'rxjs/operators';
@@ -67,6 +68,11 @@ export class PeriodiskRedovisningFormComponent implements OnInit {
shareReplay(1) shareReplay(1)
); );
yesNoRadiobuttons: Radiobutton[] = [
{ label: 'Ja', value: true },
{ label: 'Nej', value: false },
];
periods$: Observable<AvropPeriod[]> = this.avrop$.pipe( periods$: Observable<AvropPeriod[]> = this.avrop$.pipe(
map(avrop => extractAvropPeriods(avrop.startDate, avrop.endDate)) map(avrop => extractAvropPeriods(avrop.startDate, avrop.endDate))
); );

View File

@@ -1,6 +1,5 @@
import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog'; import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog';
import { DigiNgFormCheckboxModule } from '@af/digi-ng/_form/form-checkbox'; import { DigiNgFormCheckboxModule } from '@af/digi-ng/_form/form-checkbox';
import { DigiNgFormRadiobuttonGroupModule } from '@af/digi-ng/_form/form-radiobutton-group';
import { DigiNgFormSelectModule } from '@af/digi-ng/_form/form-select'; import { DigiNgFormSelectModule } from '@af/digi-ng/_form/form-select';
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';
@@ -9,6 +8,7 @@ import { RouterModule } from '@angular/router';
import { BackLinkModule } from '@msfa-shared/components/back-link/back-link.module'; import { BackLinkModule } from '@msfa-shared/components/back-link/back-link.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiLoaderModule } from '@ui/loader/loader.module'; import { UiLoaderModule } from '@ui/loader/loader.module';
import { UiRadiobuttonGroupModule } from '@ui/radiobutton-group/radiobutton-group.module';
import { UiSkeletonModule } from '@ui/skeleton/skeleton.module'; import { UiSkeletonModule } from '@ui/skeleton/skeleton.module';
import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module'; import { ReportDescriptionListModule } from '../../../components/report-description-list/report-description-list.module';
import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module'; import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module';
@@ -30,8 +30,8 @@ import { PeriodiskRedovisningFormService } from './periodisk-redovisning-form.se
UiSkeletonModule, UiSkeletonModule,
DigiNgDialogModule, DigiNgDialogModule,
DigiNgFormSelectModule, DigiNgFormSelectModule,
DigiNgFormRadiobuttonGroupModule,
DigiNgFormCheckboxModule, DigiNgFormCheckboxModule,
UiRadiobuttonGroupModule,
], ],
providers: [PeriodiskRedovisningFormService], providers: [PeriodiskRedovisningFormService],
exports: [PeriodiskRedovisningFormComponent], exports: [PeriodiskRedovisningFormComponent],

View File

@@ -44,11 +44,12 @@
</div> </div>
<div class="signal-form__form-item"> <div class="signal-form__form-item">
<digi-form-fieldset af-legend="Omfattning" af-name="omfattning" af-form="signal-form"> <digi-form-fieldset af-legend="Omfattning" af-name="omfattning" af-form="signal-form">
<digi-ng-form-radiobutton-group <ui-radiobutton-group
[afRadiobuttons]="omfattningRadioButtons" formControlName="omfattning"
[afRequired]="true" [uiRequired]="true"
[formControl]="omfattningFormControl" [uiAnnounceIfOptional]="true"
></digi-ng-form-radiobutton-group> [uiRadiobuttons]="omfattningRadioButtons"
></ui-radiobutton-group>
</digi-form-fieldset> </digi-form-fieldset>
<div aria-atomic="true" role="alert"> <div aria-atomic="true" role="alert">
<digi-ng-form-validation-message <digi-ng-form-validation-message

View File

@@ -1,4 +1,3 @@
import { RadiobuttonModel } from '@af/digi-ng/_form/form-radiobutton-group';
import { FormSelectItem } from '@af/digi-ng/_form/form-select'; import { FormSelectItem } from '@af/digi-ng/_form/form-select';
import { ChangeDetectionStrategy, Component } from '@angular/core'; import { ChangeDetectionStrategy, Component } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms'; import { FormControl, FormGroup } from '@angular/forms';
@@ -8,6 +7,7 @@ import { Avrop } from '@msfa-models/avrop.model';
import { CustomError } from '@msfa-models/error/custom-error'; import { CustomError } from '@msfa-models/error/custom-error';
import { Signal } from '@msfa-models/signal.model'; import { Signal } from '@msfa-models/signal.model';
import { formatDate } from '@msfa-utils/format-to-date.util'; import { formatDate } from '@msfa-utils/format-to-date.util';
import { Radiobutton } from '@ui/radiobutton-group/radiobutton.model';
import { add } from 'date-fns'; import { add } from 'date-fns';
import { BehaviorSubject, Observable } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs';
import { map, shareReplay, switchMap, take } from 'rxjs/operators'; import { map, shareReplay, switchMap, take } from 'rxjs/operators';
@@ -45,25 +45,13 @@ export class SignalFormComponent {
); );
typeSelectItems: FormSelectItem[] = [ typeSelectItems: FormSelectItem[] = [
{ { name: 'Arbete', value: 'arbete' },
name: 'Arbete', { name: 'Utbildning', value: 'utbildning' },
value: 'arbete',
},
{
name: 'Utbildning',
value: 'utbildning',
},
]; ];
omfattningRadioButtons: RadiobuttonModel[] = [ omfattningRadioButtons: Radiobutton[] = [
{ { label: 'Heltid', value: 'heltid' },
label: 'Heltid', { label: 'Deltid', value: 'deltid' },
value: 'heltid',
},
{
label: 'Deltid',
value: 'deltid',
},
]; ];
constructor(private signalFormService: SignalFormService, private activatedRoute: ActivatedRoute) {} constructor(private signalFormService: SignalFormService, private activatedRoute: ActivatedRoute) {}

View File

@@ -1,10 +1,8 @@
import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog'; import { DigiNgDialogModule } from '@af/digi-ng/_dialog/dialog';
import { DigiNgFormDatepickerModule } from '@af/digi-ng/_form/form-datepicker'; import { DigiNgFormDatepickerModule } from '@af/digi-ng/_form/form-datepicker';
import { DigiNgFormRadiobuttonGroupModule } from '@af/digi-ng/_form/form-radiobutton-group';
import { DigiNgFormRangeModule } from '@af/digi-ng/_form/form-range'; import { DigiNgFormRangeModule } from '@af/digi-ng/_form/form-range';
import { DigiNgFormSelectModule } from '@af/digi-ng/_form/form-select'; import { DigiNgFormSelectModule } from '@af/digi-ng/_form/form-select';
import { DigiNgFormValidationMessageModule } from '@af/digi-ng/_form/form-validation-message'; import { DigiNgFormValidationMessageModule } from '@af/digi-ng/_form/form-validation-message';
import { UiSkeletonModule } from '@ui/skeleton/skeleton.module';
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 { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
@@ -12,6 +10,8 @@ import { RouterModule } from '@angular/router';
import { BackLinkModule } from '@msfa-shared/components/back-link/back-link.module'; import { BackLinkModule } from '@msfa-shared/components/back-link/back-link.module';
import { ConfirmDialogModule } from '@msfa-shared/components/confirm-dialog/confirm-dialog.module'; import { ConfirmDialogModule } from '@msfa-shared/components/confirm-dialog/confirm-dialog.module';
import { LayoutModule } from '@msfa-shared/components/layout/layout.module'; import { LayoutModule } from '@msfa-shared/components/layout/layout.module';
import { UiRadiobuttonGroupModule } from '@ui/radiobutton-group/radiobutton-group.module';
import { UiSkeletonModule } from '@ui/skeleton/skeleton.module';
import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module'; import { ReportLayoutModule } from '../../../components/report-layout/report-layout.module';
import { SignalFormComponent } from './signal-form.component'; import { SignalFormComponent } from './signal-form.component';
import { SignalFormService } from './signal-form.service'; import { SignalFormService } from './signal-form.service';
@@ -27,7 +27,7 @@ import { SignalFormService } from './signal-form.service';
ReportLayoutModule, ReportLayoutModule,
ConfirmDialogModule, ConfirmDialogModule,
BackLinkModule, BackLinkModule,
DigiNgFormRadiobuttonGroupModule, UiRadiobuttonGroupModule,
DigiNgFormDatepickerModule, DigiNgFormDatepickerModule,
UiSkeletonModule, UiSkeletonModule,
DigiNgDialogModule, DigiNgDialogModule,

View File

@@ -0,0 +1,4 @@
export enum RadiobuttonGroupDirection {
HORIZONTAL = 'horizontal',
VERTICAL = 'vertical',
}

View File

@@ -0,0 +1,21 @@
<div class="ui-radiobutton-group" [ngClass]="{'ui-radiobutton-group--invalid': uiInvalid}">
<div class="ui-radiobutton-group__radiobuttons" [ngClass]="radiobuttonsModifierClass">
<digi-form-radiobutton
*ngFor="let item of uiRadiobuttons"
class="ui-radiobutton-group__radiobutton"
[afLabel]="getLabelText(item.label)"
[afValue]="item.value"
[afChecked]="currentValue === item.value"
[afName]="name"
[afRequired]="uiRequired"
[afValidation]="uiInvalid ? 'error' : 'neutral'"
[afVariation]="uiSecondary ? 'secondary' : 'primary'"
(afOnChange)="checkForChange($event.detail.target.value)"
></digi-form-radiobutton>
</div>
<div aria-atomic="true" role="alert">
<digi-form-validation-message *ngIf="uiInvalid && uiValidationMessage" af-variation="error"
>{{uiValidationMessage}}</digi-form-validation-message
>
</div>
</div>

View File

@@ -0,0 +1,37 @@
@import 'variables/gutters';
.ui-radiobutton-group {
display: flex;
flex-direction: column;
&--invalid {
gap: var(--digi--layout--gutter--xs);
}
&__radiobuttons {
display: flex;
gap: var(--digi--layout--gutter--s);
flex-direction: column;
&--horizontal {
flex-direction: row;
align-items: center;
gap: $digi--layout--gutter--l;
}
}
&__radiobutton {
::ng-deep .digi-form-radiobutton__circle {
top: 50% !important;
transform: translateY(-50%);
&::after {
top: 50% !important;
left: 50% !important;
}
}
::ng-deep .digi-form-radiobutton__input:focus ~ .digi-form-radiobutton__circle {
box-shadow: var(--digi--ui--box-shadow--focus) !important;
}
}
}

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 { RadiobuttonGroupComponent } from './radiobutton-group.component';
describe('RadiobuttonGroupComponent', () => {
let component: RadiobuttonGroupComponent;
let fixture: ComponentFixture<RadiobuttonGroupComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [RadiobuttonGroupComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(RadiobuttonGroupComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,16 @@
import { ReactiveFormsModule } from '@angular/forms';
import { RadiobuttonGroupComponent } from './radiobutton-group.component';
import { UiRadiobuttonGroupModule } from './radiobutton-group.module';
export default { title: 'RadiobuttonGroup', component: RadiobuttonGroupComponent };
const componentModule = {
moduleMetadata: {
imports: [ReactiveFormsModule, UiRadiobuttonGroupModule],
},
};
export const standard = () => ({
...componentModule,
template: '<ui-radiobutton-group></ui-radiobutton-group>',
});

View File

@@ -0,0 +1,122 @@
import {
AfterViewInit,
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
EventEmitter,
Injector,
Input,
OnChanges,
Output,
} from '@angular/core';
import { ControlValueAccessor, NgControl, NG_VALUE_ACCESSOR } from '@angular/forms';
import { RadiobuttonGroupDirection } from './radiobutton-group-direction.enum';
import { Radiobutton } from './radiobutton.model';
/**
* A radiobutton-group component.
*
* ## Usage
* ``import {UiRadiobuttonGroupModule} from '@ui/radiobutton-group/radiobutton-group.module';``
*/
@Component({
selector: 'ui-radiobutton-group',
templateUrl: './radiobutton-group.component.html',
styleUrls: ['./radiobutton-group.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: RadiobuttonGroupComponent,
multi: true,
},
],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class RadiobuttonGroupComponent implements ControlValueAccessor, AfterViewInit, OnChanges {
@Input() uiDirection: RadiobuttonGroupDirection;
@Input() uiInvalid: boolean;
@Input() uiValidationMessage: string;
@Input() uiRadiobuttons: Radiobutton[];
@Input() uiBooleanValues: boolean;
@Input() uiSecondary: boolean;
@Input() uiRequired: boolean;
@Input() uiName: string;
@Input() uiAnnounceIfOptional: boolean;
@Output() uiOnChange = new EventEmitter<any>();
name: string | number;
onTouched: () => {};
private onChange: (value: any) => {};
private _value: any;
constructor(private injector: Injector, private changeDetectorRef: ChangeDetectorRef) {}
get currentValue(): any {
return this._value;
}
get radiobuttonsModifierClass(): string {
if (this.uiDirection === RadiobuttonGroupDirection.HORIZONTAL) {
return `ui-radiobutton-group__radiobuttons--horizontal`;
}
return '';
}
private _transformValue(value: any): any {
return this.uiBooleanValues ? value === 'true' : value;
}
private get _requiredText() {
if (this.uiRequired && !this.uiAnnounceIfOptional) {
return ' (obligatoriskt)';
}
if (!this.uiRequired && this.uiAnnounceIfOptional) {
return ' (frivilligt)';
}
return '';
}
getLabelText(label: string): string {
return `${label}${this._requiredText}`;
}
ngAfterViewInit(): void {
const ngControl: NgControl = this.injector.get(NgControl, null);
if (ngControl) {
this.name = ngControl.name || this.uiName;
}
}
ngOnChanges(): void {
const ngControl: NgControl = this.injector.get(NgControl, null);
if (ngControl) {
this.name = ngControl.name || this.uiName;
}
}
checkForChange(rawValue: any): void {
const value = this._transformValue(rawValue);
if (this._value !== value) {
if (this.onChange) {
this.onChange(value);
}
this._value = value;
this.uiOnChange.emit(value);
}
}
writeValue(value: any): void {
this._value = value;
this.changeDetectorRef.detectChanges();
}
registerOnChange(fn: (value: any) => {}) {
this.onChange = fn;
}
registerOnTouched(fn: () => {}) {
this.onTouched = fn;
}
}

View File

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

View File

@@ -0,0 +1,4 @@
export interface Radiobutton {
value: any;
label: string;
}