Added more fields inside create-account form

This commit is contained in:
Erik Tiekstra
2021-04-15 13:10:44 +02:00
parent 9fe6e0f91f
commit 50e499540d
5 changed files with 189 additions and 65 deletions

View File

@@ -6,68 +6,103 @@
rutrum velit. Sed vitae ullamcorper sem. Aliquam malesuada nunc sed purus mollis scelerisque. Curabitur bibendum rutrum velit. Sed vitae ullamcorper sem. Aliquam malesuada nunc sed purus mollis scelerisque. Curabitur bibendum
leo quis ante porttitor tincidunt. Nam tincidunt imperdiet tortor eu suscipit. Maecenas ut dui est. leo quis ante porttitor tincidunt. Nam tincidunt imperdiet tortor eu suscipit. Maecenas ut dui est.
</p> </p>
<form [formGroup]="formGroup">
<div class="create-account__block">
<h2>Personuppgifter</h2>
<div class="create-account__combined-inputs">
<digi-ng-form-input
class="create-account__input"
formControlName="firstName"
afLabel="Förnamn"
afInvalidMessage="Förnamn är obligatoriskt"
[afDisableValidStyle]="true"
[afInvalid]="firstNameControl.invalid && firstNameControl.dirty"
></digi-ng-form-input>
<digi-ng-form-input
class="create-account__input"
formControlName="lastName"
afLabel="Efternamn"
afInvalidMessage="Efternamn är obligatoriskt"
[afDisableValidStyle]="true"
[afInvalid]="lastNameControl.invalid && lastNameControl.dirty"
></digi-ng-form-input>
</div>
<digi-ng-form-input
class="create-account__input"
formControlName="ssn"
afLabel="Personnummer"
[afInvalidMessage]="ssnControl.errors?.message || ''"
[afDisableValidStyle]="true"
[afInvalid]="ssnControl.invalid && ssnControl.dirty"
></digi-ng-form-input>
<digi-ng-form-input
class="create-account__input"
formControlName="email"
afLabel="Arbetsmejl"
afType="email"
[afInvalidMessage]="ssnControl.errors?.message || ''"
[afDisableValidStyle]="true"
[afInvalid]="ssnControl.invalid && ssnControl.dirty"
></digi-ng-form-input>
<digi-ng-form-input
class="create-account__input"
formControlName="phone"
afLabel="Telefonnummer arbete"
afType="tel"
[afInvalidMessage]="ssnControl.errors?.message || ''"
[afDisableValidStyle]="true"
[afInvalid]="ssnControl.invalid && ssnControl.dirty"
></digi-ng-form-input>
</div>
<div class="create-account__block">
<h2>Bemanning av personal</h2>
<fieldset>
<legend>Är {{ firstNameControl.value || 'medarbetaren' }} i aktiv tjänst?</legend>
<digi-ng-form-radiobutton-group
[afRadiobuttons]="activeRadioButtons"
formControlName="active"
></digi-ng-form-radiobutton-group>
</fieldset>
</div>
</form>
</digi-typography> </digi-typography>
<form [formGroup]="formGroup" (ngSubmit)="submitForm()">
<div class="create-account__block">
<h2>Personuppgifter</h2>
<div class="create-account__combined-inputs">
<digi-ng-form-input
class="create-account__input"
formControlName="firstName"
afLabel="Förnamn"
afInvalidMessage="Förnamn är obligatoriskt"
[afDisableValidStyle]="true"
[afInvalid]="firstNameControl.invalid && firstNameControl.dirty"
></digi-ng-form-input>
<digi-ng-form-input
class="create-account__input"
formControlName="lastName"
afLabel="Efternamn"
afInvalidMessage="Efternamn är obligatoriskt"
[afDisableValidStyle]="true"
[afInvalid]="lastNameControl.invalid && lastNameControl.dirty"
></digi-ng-form-input>
</div>
<digi-ng-form-input
class="create-account__input"
formControlName="ssn"
afLabel="Personnummer"
[afInvalidMessage]="ssnControl.errors?.message || ''"
[afDisableValidStyle]="true"
[afInvalid]="ssnControl.invalid && ssnControl.dirty"
></digi-ng-form-input>
<digi-ng-form-input
class="create-account__input"
formControlName="staffId"
afLabel="Personal-ID"
[afInvalidMessage]="staffIdControl.errors?.message || ''"
[afDisableValidStyle]="true"
[afInvalid]="staffIdControl.invalid && staffIdControl.dirty"
></digi-ng-form-input>
<digi-ng-form-input
class="create-account__input"
formControlName="email"
afLabel="Arbetsmejl"
afType="email"
[afInvalidMessage]="emailControl.errors?.message || ''"
[afDisableValidStyle]="true"
[afInvalid]="emailControl.invalid && emailControl.dirty"
></digi-ng-form-input>
<digi-ng-form-input
class="create-account__input"
formControlName="phone"
afLabel="Telefonnummer arbete"
afType="tel"
[afInvalidMessage]="phoneControl.errors?.message || ''"
[afDisableValidStyle]="true"
[afInvalid]="phoneControl.invalid && phoneControl.dirty"
></digi-ng-form-input>
</div>
<div class="create-account__block">
<h2>Bemanning av personal</h2>
<fieldset class="create-account__fieldset">
<legend>Är {{ firstNameControl.value || 'medarbetaren' }} i aktiv tjänst?</legend>
<digi-ng-form-radiobutton-group
[afRadiobuttons]="activeRadioButtons"
formControlName="active"
></digi-ng-form-radiobutton-group>
</fieldset>
<fieldset class="create-account__fieldset">
<legend>Planerad frånvaroperiod</legend>
<div class="create-account__combined-inputs">
<digi-ng-form-datepicker
formControlName="outOfOfficeStart"
afLabel="Från"
[afMinDate]="todaysDate"
></digi-ng-form-datepicker>
<digi-ng-form-datepicker
formControlName="outOfOfficeEnd"
afLabel="Till"
[afMinDate]="todaysDate"
></digi-ng-form-datepicker>
</div>
<digi-button (afOnClick)="addOutOfOfficeDate()">Lägg till</digi-button>
<ul *ngIf="pendingOutOfOfficeDates.length">
<li *ngFor="let date of pendingOutOfOfficeDates">
start: {{ date.start | localDate }} end: {{ date.end | localDate }}
</li>
</ul>
</fieldset>
</div>
<div class="create-account__footer">
<digi-button af-type="reset" af-variation="secondary">Avbryt</digi-button>
<digi-button af-type="submit">Registrera konto</digi-button>
</div>
</form>
</section> </section>

View File

@@ -9,7 +9,30 @@
} }
&__input { &__input {
display: block;
width: 100%; width: 100%;
margin-bottom: var(--digi--layout--gutter); margin-bottom: var(--digi--layout--gutter);
} }
&__fieldset {
margin: 0;
margin-bottom: var(--digi--layout--gutter);
padding: 0;
border-width: 0;
legend {
width: 100%;
display: flex;
align-items: center;
margin: 0;
font-weight: var(--digi--typography--font-weight--bold);
font-size: var(--digi--typography--font-size);
padding-bottom: var(--digi--layout--gutter--s);
}
}
&__footer {
display: flex;
gap: var(--digi--layout--gutter);
}
} }

View File

@@ -3,6 +3,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core';
import { AbstractControl, FormBuilder, FormGroup } from '@angular/forms'; import { AbstractControl, FormBuilder, FormGroup } from '@angular/forms';
import { RequiredValidator } from '@dafa-validators/required.validator'; import { RequiredValidator } from '@dafa-validators/required.validator';
import { SocialSecurityNumberValidator } from '@dafa-validators/social-security-number.validator'; import { SocialSecurityNumberValidator } from '@dafa-validators/social-security-number.validator';
import { BehaviorSubject } from 'rxjs';
@Component({ @Component({
selector: 'dafa-create-account', selector: 'dafa-create-account',
@@ -11,21 +12,27 @@ import { SocialSecurityNumberValidator } from '@dafa-validators/social-security-
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class CreateAccountComponent { export class CreateAccountComponent {
private _pendingOutOfOfficeDates$ = new BehaviorSubject<{ start: Date; end: Date }[]>([]);
formGroup: FormGroup; formGroup: FormGroup;
todaysDate = new Date();
constructor(private formBuilder: FormBuilder) { constructor(private formBuilder: FormBuilder) {
this.formGroup = this.formBuilder.group({ this.formGroup = this.formBuilder.group({
firstName: this.formBuilder.control('', [RequiredValidator('Förnamn')]), firstName: this.formBuilder.control('', [RequiredValidator('Förnamn')]),
lastName: this.formBuilder.control('', [RequiredValidator('Efternamn')]), lastName: this.formBuilder.control('', [RequiredValidator('Efternamn')]),
ssn: this.formBuilder.control('', [RequiredValidator('Personnummer'), SocialSecurityNumberValidator()]), ssn: this.formBuilder.control('', [RequiredValidator('Personnummer'), SocialSecurityNumberValidator()]),
staffId: this.formBuilder.control('', [RequiredValidator('Personal-ID')]),
email: this.formBuilder.control('', [RequiredValidator('Arbetsmejl')]), email: this.formBuilder.control('', [RequiredValidator('Arbetsmejl')]),
phone: this.formBuilder.control('', [RequiredValidator('Telefonnummer arbete')]), phone: this.formBuilder.control('', [RequiredValidator('Telefonnummer arbete')]),
active: this.formBuilder.control(true), active: this.formBuilder.control(true),
outOfOfficeStart: this.formBuilder.control(''),
outOfOfficeEnd: this.formBuilder.control(''),
}); });
this.formGroup.valueChanges.subscribe(values => console.table(values));
} }
get pendingOutOfOfficeDates(): { start: Date; end: Date }[] {
return this._pendingOutOfOfficeDates$.getValue();
}
get activeRadioButtons(): RadiobuttonModel[] { get activeRadioButtons(): RadiobuttonModel[] {
return [ return [
{ {
@@ -48,4 +55,58 @@ export class CreateAccountComponent {
get ssnControl(): AbstractControl { get ssnControl(): AbstractControl {
return this.formGroup.get('ssn'); return this.formGroup.get('ssn');
} }
get staffIdControl(): AbstractControl {
return this.formGroup.get('staffId');
}
get emailControl(): AbstractControl {
return this.formGroup.get('email');
}
get phoneControl(): AbstractControl {
return this.formGroup.get('phone');
}
get outOfOfficeStartControl(): AbstractControl {
return this.formGroup.get('outOfOfficeStart');
}
get outOfOfficeEndControl(): AbstractControl {
return this.formGroup.get('outOfOfficeEnd');
}
addOutOfOfficeDate(): void {
if (this.outOfOfficeStartControl.value && this.outOfOfficeEndControl.value) {
this._pendingOutOfOfficeDates$.next([
...this.pendingOutOfOfficeDates,
{ start: new Date(this.outOfOfficeStartControl.value), end: new Date(this.outOfOfficeEndControl.value) },
]);
this.outOfOfficeStartControl.patchValue('');
this.outOfOfficeEndControl.patchValue('');
}
}
private _markFormAsDirty(): void {
Object.keys(this.formGroup.controls).forEach(control => {
this.formGroup.get(control).markAsDirty();
this.formGroup.get(control).markAsTouched();
});
}
submitForm(): void {
if (this.formGroup.valid) {
const submittableValues = {
...this.formGroup.value,
outOfOffice: this.pendingOutOfOfficeDates,
};
delete submittableValues.outOfOfficeStart;
delete submittableValues.outOfOfficeEnd;
console.warn('Should submit the form...');
console.table(submittableValues);
this.formGroup.reset();
} else {
console.error('Form is invalid, do something...');
this._markFormAsDirty();
}
}
} }

View File

@@ -1,9 +1,11 @@
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 { DigiNgFormRadiobuttonGroupModule } from '@af/digi-ng/_form/form-radiobutton-group';
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';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { LocalDatePipeModule } from '@dafa-shared/pipes/local-date/local-date.module';
import { CreateAccountComponent } from './create-account.component'; import { CreateAccountComponent } from './create-account.component';
@NgModule({ @NgModule({
@@ -13,8 +15,10 @@ import { CreateAccountComponent } from './create-account.component';
CommonModule, CommonModule,
RouterModule.forChild([{ path: '', component: CreateAccountComponent }]), RouterModule.forChild([{ path: '', component: CreateAccountComponent }]),
ReactiveFormsModule, ReactiveFormsModule,
LocalDatePipeModule,
DigiNgFormInputModule, DigiNgFormInputModule,
DigiNgFormRadiobuttonGroupModule, DigiNgFormRadiobuttonGroupModule,
DigiNgFormDatepickerModule,
], ],
}) })
export class CreateAccountModule {} export class CreateAccountModule {}

View File

@@ -20,6 +20,7 @@ body {
button { button {
font-family: var(--digi--typography--font-family); font-family: var(--digi--typography--font-family);
cursor: pointer;
} }
strong { strong {