-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathform.ts
More file actions
67 lines (61 loc) · 2.24 KB
/
Copy pathform.ts
File metadata and controls
67 lines (61 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { JsonPipe } from '@angular/common';
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
import {
AbstractControl,
NonNullableFormBuilder,
ReactiveFormsModule,
ValidationErrors,
Validators,
} from '@angular/forms';
import { AlertService, UiLibraryAngularModule } from '@six-group/ui-library-angular';
@Component({
selector: 'app-form',
imports: [UiLibraryAngularModule, ReactiveFormsModule, JsonPipe],
templateUrl: './form.html',
styleUrl: './form.css',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class Form {
fb = inject(NonNullableFormBuilder);
alertService = inject(AlertService);
form = this.fb.group({
firstName: ['', [Validators.required, Validators.minLength(2)]],
lastName: [''],
email: ['', Validators.email],
username: ['', [Validators.required, usernameValidator, Validators.minLength(3)]],
iban: ['', Validators.pattern(/[A-Z]{2}\d{2}[A-Z ]+/)],
age: [null as number | null, Validators.min(18)],
userGroup: ['user' as UserGroup, Validators.required],
privileges: [['read'] as Privilege[]],
status: ['enabled' as Status | null, Validators.required],
internal: [false, Validators.requiredTrue],
date: [null as string | null, [Validators.required]],
startTime: ['', [Validators.required]],
interests: [[] as Interest[], Validators.required],
height: [0, Validators.min(10)],
description: ['', [Validators.required, Validators.minLength(20)]],
acceptsTerms: [false, Validators.requiredTrue],
});
weekendsOnly = (isoDate: string) => {
const day = new Date(isoDate).getDay();
return day !== 0 && day !== 6;
};
onSubmit() {
this.alertService.showAlert('Form submitted successfully!');
}
}
// Helpers
function usernameValidator(control: AbstractControl): ValidationErrors | null {
if (!control.value) {
return null;
}
const lowercaseCharsOnly = /^[a-z\-]+$/.test(control.value);
if (lowercaseCharsOnly) {
return null;
}
return { custom: { text: 'Username may only contain lowercase ascii characters.' } };
}
type UserGroup = 'admin' | 'developer' | 'user';
type Status = 'enabled' | 'disabled' | 'temporary';
type Interest = 'sport' | 'music' | 'movies';
type Privilege = 'read' | 'write' | 'delete';