@abgov/angular-components 3.0.0-alpha.6 → 3.0.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.mjs +3 -1
- package/esm2022/lib/checked-directive.mjs +3 -3
- package/esm2022/lib/public-form-utils.mjs +34 -0
- package/esm2022/lib/validation.mjs +205 -0
- package/fesm2022/abgov-angular-components.mjs +242 -3
- package/fesm2022/abgov-angular-components.mjs.map +1 -1
- package/index.d.ts +2 -0
- package/lib/public-form-utils.d.ts +18 -0
- package/lib/validation.d.ts +44 -0
- package/package.json +1 -1
package/esm2022/index.mjs
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export * from "./lib/angular-components.module";
|
|
2
|
-
|
|
2
|
+
export * from "./lib/validation";
|
|
3
|
+
export * from "./lib/public-form-utils";
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY29tcG9uZW50cy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMseUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9saWIvYW5ndWxhci1jb21wb25lbnRzLm1vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL3ZhbGlkYXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9wdWJsaWMtZm9ybS11dGlsc1wiO1xuIl19
|
|
@@ -35,8 +35,8 @@ export class CheckedDirective extends CheckboxControlValueAccessor {
|
|
|
35
35
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: CheckedDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
36
36
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.1.5", type: CheckedDirective, selector: "[goaChecked]", host: { listeners: { "_change": "listenForValueChange($event.detail.checked)" } }, providers: [
|
|
37
37
|
{
|
|
38
|
-
provide: NG_VALUE_ACCESSOR,
|
|
39
38
|
useExisting: forwardRef(() => CheckedDirective),
|
|
39
|
+
provide: NG_VALUE_ACCESSOR,
|
|
40
40
|
multi: true,
|
|
41
41
|
},
|
|
42
42
|
], usesInheritance: true, ngImport: i0 }); }
|
|
@@ -47,8 +47,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
|
|
|
47
47
|
selector: "[goaChecked]",
|
|
48
48
|
providers: [
|
|
49
49
|
{
|
|
50
|
-
provide: NG_VALUE_ACCESSOR,
|
|
51
50
|
useExisting: forwardRef(() => CheckedDirective),
|
|
51
|
+
provide: NG_VALUE_ACCESSOR,
|
|
52
52
|
multi: true,
|
|
53
53
|
},
|
|
54
54
|
],
|
|
@@ -57,4 +57,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
|
|
|
57
57
|
type: HostListener,
|
|
58
58
|
args: ["_change", ["$event.detail.checked"]]
|
|
59
59
|
}] } });
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tlZC1kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY29tcG9uZW50cy9zcmMvbGliL2NoZWNrZWQtZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7O0FBYXhCLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSw0QkFBNEI7SUFPaEUsWUFBc0IsUUFBbUIsRUFBWSxVQUFzQjtRQUN6RSxLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRFIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFZLGVBQVUsR0FBVixVQUFVLENBQVk7UUFObkUsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUV6Qix1REFBdUQ7UUFDOUMsYUFBUSxHQUFRLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQixjQUFTLEdBQVEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBSXBDLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFZO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUNsRCxDQUFDO0lBRVEsVUFBVSxDQUFDLE9BQVk7UUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7SUFDdkIsQ0FBQztJQUVRLGdCQUFnQixDQUFDLEVBQW9CO1FBQzVDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFUSxpQkFBaUIsQ0FBQyxFQUFjO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFHRCxvQkFBb0IsQ0FBQyxPQUFZO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO0lBQ3ZCLENBQUM7OEdBckNVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCLDBIQVRoQjtZQUNUO2dCQUNFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9DLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRjs7MkZBR1UsZ0JBQWdCO2tCQVg1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO29CQUN4QixTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUM7NEJBQy9DLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO2lCQUNGO3VHQXFDQyxvQkFBb0I7c0JBRG5CLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBmb3J3YXJkUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgUmVuZGVyZXIyLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2dvYUNoZWNrZWRdXCIsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENoZWNrZWREaXJlY3RpdmUpLFxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcblxuZXhwb3J0IGNsYXNzIENoZWNrZWREaXJlY3RpdmUgZXh0ZW5kcyBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJpdmF0ZSBfY2hlY2tlZCA9IGZhbHNlO1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgb3ZlcnJpZGUgb25DaGFuZ2U6IGFueSA9ICgpID0+IHsgfTtcbiAgb3ZlcnJpZGUgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7IH07XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIocmVuZGVyZXIsIGVsZW1lbnRSZWYpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NoZWNrZWQgPyBcImNoZWNrZWRcIiA6IFwiXCI7XG4gIH1cblxuICBzZXQgdmFsdWUoY2hlY2tlZDogYW55KSB7XG4gICAgdGhpcy5fY2hlY2tlZCA9ICEhY2hlY2tlZDtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuX2NoZWNrZWQpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2hlY2tlZCA9IGNoZWNrZWQ7XG4gIH1cblxuICBvdmVycmlkZSB3cml0ZVZhbHVlKGNoZWNrZWQ6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSBjaGVja2VkO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4gdm9pZCkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoXCJfY2hhbmdlXCIsIFtcIiRldmVudC5kZXRhaWwuY2hlY2tlZFwiXSlcbiAgbGlzdGVuRm9yVmFsdWVDaGFuZ2UoY2hlY2tlZDogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IGNoZWNrZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function dispatch(el, eventName, detail, opts) {
|
|
2
|
+
if (!el) {
|
|
3
|
+
console.error("dispatch element is null");
|
|
4
|
+
return;
|
|
5
|
+
}
|
|
6
|
+
el.dispatchEvent(new CustomEvent(eventName, {
|
|
7
|
+
composed: true,
|
|
8
|
+
bubbles: opts?.bubbles,
|
|
9
|
+
detail: detail,
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
export function relay(el, eventName, data, opts) {
|
|
13
|
+
if (!el) {
|
|
14
|
+
console.error("dispatch element is null");
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
// console.log(`RELAY(${eventName}):`, data, el);
|
|
18
|
+
el.dispatchEvent(new CustomEvent("msg", {
|
|
19
|
+
composed: true,
|
|
20
|
+
bubbles: opts?.bubbles,
|
|
21
|
+
detail: {
|
|
22
|
+
action: eventName,
|
|
23
|
+
data,
|
|
24
|
+
},
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
// TODO: Logic similar to this needs to be done on the React side as well i.e. an initial onMount
|
|
28
|
+
// event that passes a ref to the form,
|
|
29
|
+
export function continueTo(el, name) {
|
|
30
|
+
relay(el, "external::continue", {
|
|
31
|
+
next: name,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWZvcm0tdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY29tcG9uZW50cy9zcmMvbGliL3B1YmxpYy1mb3JtLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWNBLE1BQU0sVUFBVSxRQUFRLENBQ3RCLEVBQTRDLEVBQzVDLFNBQWlCLEVBQ2pCLE1BQVUsRUFDVixJQUE0QjtJQUU1QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDMUMsT0FBTztJQUNULENBQUM7SUFDRCxFQUFFLENBQUMsYUFBYSxDQUNkLElBQUksV0FBVyxDQUFJLFNBQVMsRUFBRTtRQUM1QixRQUFRLEVBQUUsSUFBSTtRQUNkLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTztRQUN0QixNQUFNLEVBQUUsTUFBTTtLQUNmLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxLQUFLLENBQ25CLEVBQTRDLEVBQzVDLFNBQWlCLEVBQ2pCLElBQVEsRUFDUixJQUE0QjtJQUU1QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDMUMsT0FBTztJQUNULENBQUM7SUFDRCxpREFBaUQ7SUFDakQsRUFBRSxDQUFDLGFBQWEsQ0FDZCxJQUFJLFdBQVcsQ0FBK0IsS0FBSyxFQUFFO1FBQ25ELFFBQVEsRUFBRSxJQUFJO1FBQ2QsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPO1FBQ3RCLE1BQU0sRUFBRTtZQUNOLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLElBQUk7U0FDTDtLQUNGLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELGlHQUFpRztBQUNqRyx1Q0FBdUM7QUFDdkMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxFQUFlLEVBQUUsSUFBWTtJQUN0RCxLQUFLLENBQW1CLEVBQUUsRUFBRSxvQkFBb0IsRUFBRTtRQUNoRCxJQUFJLEVBQUUsSUFBSTtLQUNYLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBcHBTdGF0ZSA9IHtcbiAgZm9ybTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgRmllbGRzZXRJdGVtU3RhdGU+W10+O1xuICBoaXN0b3J5OiBzdHJpbmdbXTtcbiAgZWRpdHRpbmc6IHN0cmluZztcbiAgbGFzdE1vZGlmaWVkPzogRGF0ZTtcbn07XG5cbmV4cG9ydCB0eXBlIEZpZWxkc2V0SXRlbVN0YXRlID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8vIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xuICB2YWx1ZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoPFQ+KFxuICBlbDogSFRNTEVsZW1lbnQgfCBFbGVtZW50IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgZXZlbnROYW1lOiBzdHJpbmcsXG4gIGRldGFpbD86IFQsXG4gIG9wdHM/OiB7IGJ1YmJsZXM/OiBib29sZWFuIH0sXG4pIHtcbiAgaWYgKCFlbCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJkaXNwYXRjaCBlbGVtZW50IGlzIG51bGxcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVsLmRpc3BhdGNoRXZlbnQoXG4gICAgbmV3IEN1c3RvbUV2ZW50PFQ+KGV2ZW50TmFtZSwge1xuICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICBidWJibGVzOiBvcHRzPy5idWJibGVzLFxuICAgICAgZGV0YWlsOiBkZXRhaWwsXG4gICAgfSksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxheTxUPihcbiAgZWw6IEhUTUxFbGVtZW50IHwgRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGV2ZW50TmFtZTogc3RyaW5nLFxuICBkYXRhPzogVCxcbiAgb3B0cz86IHsgYnViYmxlcz86IGJvb2xlYW4gfSxcbikge1xuICBpZiAoIWVsKSB7XG4gICAgY29uc29sZS5lcnJvcihcImRpc3BhdGNoIGVsZW1lbnQgaXMgbnVsbFwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gY29uc29sZS5sb2coYFJFTEFZKCR7ZXZlbnROYW1lfSk6YCwgZGF0YSwgZWwpO1xuICBlbC5kaXNwYXRjaEV2ZW50KFxuICAgIG5ldyBDdXN0b21FdmVudDx7IGFjdGlvbjogc3RyaW5nOyBkYXRhPzogVCB9PihcIm1zZ1wiLCB7XG4gICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgIGJ1YmJsZXM6IG9wdHM/LmJ1YmJsZXMsXG4gICAgICBkZXRhaWw6IHtcbiAgICAgICAgYWN0aW9uOiBldmVudE5hbWUsXG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgIH0pLFxuICApO1xufVxuXG4vLyBUT0RPOiBMb2dpYyBzaW1pbGFyIHRvIHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBvbiB0aGUgUmVhY3Qgc2lkZSBhcyB3ZWxsIGkuZS4gYW4gaW5pdGlhbCBvbk1vdW50XG4vLyBldmVudCB0aGF0IHBhc3NlcyBhIHJlZiB0byB0aGUgZm9ybSxcbmV4cG9ydCBmdW5jdGlvbiBjb250aW51ZVRvKGVsOiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nKSB7XG4gIHJlbGF5PHsgbmV4dDogc3RyaW5nIH0+KGVsLCBcImV4dGVybmFsOjpjb250aW51ZVwiLCB7XG4gICAgbmV4dDogbmFtZSxcbiAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// TODO: move this into the form-utils file, since it is specific to the public form component
|
|
2
|
+
export function validate(field, fieldsetEl, fieldsetState, validators) {
|
|
3
|
+
const value = fieldsetState?.[field]?.value;
|
|
4
|
+
for (const validator of validators) {
|
|
5
|
+
const msg = validator(value);
|
|
6
|
+
if (msg) {
|
|
7
|
+
dispatchError(fieldsetEl, field, msg);
|
|
8
|
+
return [false, ""];
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return [true, value];
|
|
12
|
+
}
|
|
13
|
+
// TODO: move this into the form-utils file, since it is specific to the public form component
|
|
14
|
+
function dispatchError(el, name, msg) {
|
|
15
|
+
el.dispatchEvent(new CustomEvent("msg", {
|
|
16
|
+
composed: true,
|
|
17
|
+
detail: {
|
|
18
|
+
action: "external::set:error",
|
|
19
|
+
data: {
|
|
20
|
+
name,
|
|
21
|
+
msg,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
export class FormValidator {
|
|
27
|
+
constructor(validators) {
|
|
28
|
+
this.validators = validators || {};
|
|
29
|
+
}
|
|
30
|
+
add(fieldName, ...validators) {
|
|
31
|
+
this.validators[fieldName] = validators;
|
|
32
|
+
}
|
|
33
|
+
validate(data) {
|
|
34
|
+
const errors = {};
|
|
35
|
+
Object.entries(this.validators).forEach(([name, validators]) => {
|
|
36
|
+
const err = validators
|
|
37
|
+
.map((validatorFn) => {
|
|
38
|
+
const errMsg = validatorFn(data[name]);
|
|
39
|
+
return errMsg;
|
|
40
|
+
})
|
|
41
|
+
.find((msg) => !!msg);
|
|
42
|
+
if (err) {
|
|
43
|
+
errors[name] = err;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return errors;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// **********
|
|
50
|
+
// Validators
|
|
51
|
+
// **********
|
|
52
|
+
export function birthDayValidator() {
|
|
53
|
+
return [
|
|
54
|
+
requiredValidator("Day is required"),
|
|
55
|
+
numericValidator({
|
|
56
|
+
min: 1,
|
|
57
|
+
max: 31,
|
|
58
|
+
minMsg: "Day must be between 1 and 31",
|
|
59
|
+
maxMsg: "Day must be between 1 and 31",
|
|
60
|
+
}),
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
export function birthMonthValidator() {
|
|
64
|
+
return [
|
|
65
|
+
requiredValidator("Month is required"),
|
|
66
|
+
numericValidator({
|
|
67
|
+
min: 0,
|
|
68
|
+
max: 11,
|
|
69
|
+
minMsg: "Month must be between Jan and Dec",
|
|
70
|
+
maxMsg: "Month must be between Jan and Dec",
|
|
71
|
+
}),
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
export function birthYearValidator() {
|
|
75
|
+
const maxYear = new Date().getFullYear();
|
|
76
|
+
return [
|
|
77
|
+
requiredValidator("Year is required"),
|
|
78
|
+
numericValidator({
|
|
79
|
+
min: 1900,
|
|
80
|
+
max: maxYear,
|
|
81
|
+
minMsg: "Year must be greater than 1900",
|
|
82
|
+
maxMsg: `Year must be less than ${maxYear}`,
|
|
83
|
+
}),
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
export function requiredValidator(msg) {
|
|
87
|
+
return (value) => {
|
|
88
|
+
msg = msg || "Required";
|
|
89
|
+
if (typeof value === "number" && !isNaN(value)) {
|
|
90
|
+
return "";
|
|
91
|
+
}
|
|
92
|
+
if (value) {
|
|
93
|
+
return "";
|
|
94
|
+
}
|
|
95
|
+
return msg;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export function phoneNumberValidator(msg) {
|
|
99
|
+
const regex = new RegExp(/^\+?[\d-() ]{10,18}$/);
|
|
100
|
+
return regexValidator(regex, msg || "Invalid phone number");
|
|
101
|
+
}
|
|
102
|
+
export function emailValidator(msg) {
|
|
103
|
+
// emailregex.com
|
|
104
|
+
const regex = new RegExp(/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/);
|
|
105
|
+
return regexValidator(regex, msg || "Invalid email address");
|
|
106
|
+
}
|
|
107
|
+
export function SINValidator() {
|
|
108
|
+
return (value) => {
|
|
109
|
+
if (!value)
|
|
110
|
+
return "";
|
|
111
|
+
const checkValue = "121121121".split("").map((c) => parseInt(c));
|
|
112
|
+
const valueStr = value.replace(/\D/g, "");
|
|
113
|
+
if (valueStr.length !== 9)
|
|
114
|
+
return "SIN must contain 9 numbers";
|
|
115
|
+
const checkSum = valueStr
|
|
116
|
+
.split("")
|
|
117
|
+
.map((c) => parseInt(c))
|
|
118
|
+
.map((num, index) => {
|
|
119
|
+
const val = num * checkValue[index];
|
|
120
|
+
if (val < 10) {
|
|
121
|
+
return val;
|
|
122
|
+
}
|
|
123
|
+
return `${val}`
|
|
124
|
+
.split("")
|
|
125
|
+
.map((c) => parseInt(c))
|
|
126
|
+
.reduce((acc, val) => acc * val, 1);
|
|
127
|
+
})
|
|
128
|
+
.reduce((acc, val) => acc + val, 0);
|
|
129
|
+
if (checkSum % 10 === 0) {
|
|
130
|
+
return "";
|
|
131
|
+
}
|
|
132
|
+
return "Invalid SIN";
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
export function postalCodeValidator() {
|
|
136
|
+
return regexValidator(/^[ABCEGHJ-NPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ -]?\d[ABCEGHJ-NPRSTV-Z]\d$/i, "Invalid postal code");
|
|
137
|
+
}
|
|
138
|
+
export function regexValidator(regex, msg) {
|
|
139
|
+
return (value) => {
|
|
140
|
+
if (!value) {
|
|
141
|
+
return "";
|
|
142
|
+
}
|
|
143
|
+
if (value.match(regex)) {
|
|
144
|
+
return "";
|
|
145
|
+
}
|
|
146
|
+
return msg;
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export function dateValidator({ invalidMsg, startMsg, endMsg, start, end, }) {
|
|
150
|
+
return (date) => {
|
|
151
|
+
let _date = new Date(0);
|
|
152
|
+
if (typeof date === "string") {
|
|
153
|
+
_date = new Date(date);
|
|
154
|
+
}
|
|
155
|
+
if (date.toDateString) {
|
|
156
|
+
_date = date;
|
|
157
|
+
}
|
|
158
|
+
if (_date.toString() === "Invalid Date" || _date.getTime() === 0) {
|
|
159
|
+
return invalidMsg || "Invalid date";
|
|
160
|
+
}
|
|
161
|
+
if (_date && start && _date < start) {
|
|
162
|
+
return startMsg || `Must be after ${start}`;
|
|
163
|
+
}
|
|
164
|
+
if (_date && end && _date > end) {
|
|
165
|
+
return endMsg || `Must be before ${end}`;
|
|
166
|
+
}
|
|
167
|
+
return "";
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
export function numericValidator({ invalidTypeMsg, minMsg, maxMsg, min = -Number.MAX_VALUE, max = Number.MAX_VALUE, }) {
|
|
171
|
+
return (value) => {
|
|
172
|
+
let _value = Number.MAX_VALUE;
|
|
173
|
+
if (typeof value === "string") {
|
|
174
|
+
_value = parseFloat(value);
|
|
175
|
+
}
|
|
176
|
+
if (typeof value === "number") {
|
|
177
|
+
_value = value;
|
|
178
|
+
}
|
|
179
|
+
if (isNaN(_value)) {
|
|
180
|
+
return invalidTypeMsg || "Must be a numeric value";
|
|
181
|
+
}
|
|
182
|
+
if (_value > max) {
|
|
183
|
+
return maxMsg || `Must be less than or equal to ${max}`;
|
|
184
|
+
}
|
|
185
|
+
if (_value < min) {
|
|
186
|
+
return minMsg || `Must be greater than or equal to ${min}`;
|
|
187
|
+
}
|
|
188
|
+
return "";
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
export function lengthValidator({ invalidTypeMsg, minMsg, maxMsg, min = -Number.MAX_VALUE, max = Number.MAX_VALUE, }) {
|
|
192
|
+
return (value) => {
|
|
193
|
+
if (typeof value !== "string") {
|
|
194
|
+
return invalidTypeMsg || "Invalid type";
|
|
195
|
+
}
|
|
196
|
+
if (value.length > max) {
|
|
197
|
+
return maxMsg || `Must be less than ${max} characters`;
|
|
198
|
+
}
|
|
199
|
+
if (value.length < min) {
|
|
200
|
+
return minMsg || `Must be greater than ${min} characters`;
|
|
201
|
+
}
|
|
202
|
+
return "";
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb21wb25lbnRzL3NyYy9saWIvdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSw4RkFBOEY7QUFDOUYsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsS0FBYSxFQUNiLFVBQXVCLEVBQ3ZCLGFBQTRCLEVBQzVCLFVBQTRCO0lBRTVCLE1BQU0sS0FBSyxHQUFHLGFBQWEsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUU1QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdEMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVELDhGQUE4RjtBQUM5RixTQUFTLGFBQWEsQ0FBQyxFQUFlLEVBQUUsSUFBWSxFQUFFLEdBQVc7SUFDL0QsRUFBRSxDQUFDLGFBQWEsQ0FDZCxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUU7UUFDckIsUUFBUSxFQUFFLElBQUk7UUFDZCxNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUscUJBQXFCO1lBQzdCLElBQUksRUFBRTtnQkFDSixJQUFJO2dCQUNKLEdBQUc7YUFDSjtTQUNGO0tBQ0YsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxPQUFPLGFBQWE7SUFFeEIsWUFBWSxVQUE2QztRQUN2RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7SUFDckMs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O1FBRUQsSUFBSSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDakIsT0FBTyxNQUFNLElBQUksaUNBQWlDLEdBQUcsRUFBRSxDQUFDO1FBQzFELENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNqQixPQUFPLE1BQU0sSUFBSSxvQ0FBb0MsR0FBRyxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVNELE1BQU0sVUFBVSxlQUFlLENBQUMsRUFDOUIsY0FBYyxFQUNkLE1BQU0sRUFDTixNQUFNLEVBQ04sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFDdkIsR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEdBQ0M7SUFDdkIsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxjQUFjLElBQUksY0FBYyxDQUFDO1FBQzFDLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDdkIsT0FBTyxNQUFNLElBQUkscUJBQXFCLEdBQUcsYUFBYSxDQUFDO1FBQ3pELENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDdkIsT0FBTyxNQUFNLElBQUksd0JBQXdCLEdBQUcsYUFBYSxDQUFDO1FBQzVELENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWVsZHNldEl0ZW1TdGF0ZSB9IGZyb20gXCIuL3B1YmxpYy1mb3JtLXV0aWxzXCI7XG5cbmV4cG9ydCB0eXBlIEZpZWxkVmFsaWRhdG9yID0gKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmc7XG5leHBvcnQgdHlwZSBGaWVsZHNldFN0YXRlID0gUmVjb3JkPHN0cmluZywgRmllbGRzZXRJdGVtU3RhdGU+O1xuXG4vLyBUT0RPOiBtb3ZlIHRoaXMgaW50byB0aGUgZm9ybS11dGlscyBmaWxlLCBzaW5jZSBpdCBpcyBzcGVjaWZpYyB0byB0aGUgcHVibGljIGZvcm0gY29tcG9uZW50XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGUoXG4gIGZpZWxkOiBzdHJpbmcsXG4gIGZpZWxkc2V0RWw6IEhUTUxFbGVtZW50LFxuICBmaWVsZHNldFN0YXRlOiBGaWVsZHNldFN0YXRlLFxuICB2YWxpZGF0b3JzOiBGaWVsZFZhbGlkYXRvcltdLFxuKTogW2Jvb2xlYW4sIHN0cmluZ10ge1xuICBjb25zdCB2YWx1ZSA9IGZpZWxkc2V0U3RhdGU/LltmaWVsZF0/LnZhbHVlO1xuXG4gIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIHZhbGlkYXRvcnMpIHtcbiAgICBjb25zdCBtc2cgPSB2YWxpZGF0b3IodmFsdWUpO1xuICAgIGlmIChtc2cpIHtcbiAgICAgIGRpc3BhdGNoRXJyb3IoZmllbGRzZXRFbCwgZmllbGQsIG1zZyk7XG4gICAgICByZXR1cm4gW2ZhbHNlLCBcIlwiXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFt0cnVlLCB2YWx1ZV07XG59XG5cbi8vIFRPRE86IG1vdmUgdGhpcyBpbnRvIHRoZSBmb3JtLXV0aWxzIGZpbGUsIHNpbmNlIGl0IGlzIHNwZWNpZmljIHRvIHRoZSBwdWJsaWMgZm9ybSBjb21wb25lbnRcbmZ1bmN0aW9uIGRpc3BhdGNoRXJyb3IoZWw6IEhUTUxFbGVtZW50LCBuYW1lOiBzdHJpbmcsIG1zZzogc3RyaW5nKSB7XG4gIGVsLmRpc3BhdGNoRXZlbnQoXG4gICAgbmV3IEN1c3RvbUV2ZW50KFwibXNnXCIsIHtcbiAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgZGV0YWlsOiB7XG4gICAgICAgIGFjdGlvbjogXCJleHRlcm5hbDo6c2V0OmVycm9yXCIsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIG1zZyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICk7XG59XG5cbmV4cG9ydCBjbGFzcyBGb3JtVmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSB2YWxpZGF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBGaWVsZFZhbGlkYXRvcltdPjtcbiAgY29uc3RydWN0b3IodmFsaWRhdG9ycz86IFJlY29yZDxzdHJpbmcsIEZpZWxkVmFsaWRhdG9yW10+KSB7XG4gICAgdGhpcy52YWxpZGF0b3JzID0gdmFsaWRhdG9ycyB8fCB7fTtcbiAgfVxuXG4gIGFkZChmaWVsZE5hbWU6IHN0cmluZywgLi4udmFsaWRhdG9yczogRmllbGRWYWxpZGF0b3JbXSkge1xuICAgIHRoaXMudmFsaWRhdG9yc1tmaWVsZE5hbWVdID0gdmFsaWRhdG9ycztcbiAgfVxuXG4gIHZhbGlkYXRlKGRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMudmFsaWRhdG9ycykuZm9yRWFjaCgoW25hbWUsIHZhbGlkYXRvcnNdKSA9PiB7XG4gICAgICBjb25zdCBlcnIgPSB2YWxpZGF0b3JzXG4gICAgICAgIC5tYXAoKHZhbGlkYXRvckZuKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXJyTXNnID0gdmFsaWRhdG9yRm4oZGF0YVtuYW1lXSk7XG4gICAgICAgICAgcmV0dXJuIGVyck1zZztcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmQoKG1zZykgPT4gISFtc2cpO1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBlcnJvcnNbbmFtZV0gPSBlcnI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG59XG5cbi8vICoqKioqKioqKipcbi8vIFZhbGlkYXRvcnNcbi8vICoqKioqKioqKipcblxuZXhwb3J0IGZ1bmN0aW9uIGJpcnRoRGF5VmFsaWRhdG9yKCk6IEZpZWxkVmFsaWRhdG9yW10ge1xuICByZXR1cm4gW1xuICAgIHJlcXVpcmVkVmFsaWRhdG9yKFwiRGF5IGlzIHJlcXVpcmVkXCIpLFxuICAgIG51bWVyaWNWYWxpZGF0b3Ioe1xuICAgICAgbWluOiAxLFxuICAgICAgbWF4OiAzMSxcbiAgICAgIG1pbk1zZzogXCJEYXkgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDMxXCIsXG4gICAgICBtYXhNc2c6IFwiRGF5IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAzMVwiLFxuICAgIH0pLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmlydGhNb250aFZhbGlkYXRvcigpOiBGaWVsZFZhbGlkYXRvcltdIHtcbiAgcmV0dXJuIFtcbiAgICByZXF1aXJlZFZhbGlkYXRvcihcIk1vbnRoIGlzIHJlcXVpcmVkXCIpLFxuICAgIG51bWVyaWNWYWxpZGF0b3Ioe1xuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMSxcbiAgICAgIG1pbk1zZzogXCJNb250aCBtdXN0IGJlIGJldHdlZW4gSmFuIGFuZCBEZWNcIixcbiAgICAgIG1heE1zZzogXCJNb250aCBtdXN0IGJlIGJldHdlZW4gSmFuIGFuZCBEZWNcIixcbiAgICB9KSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpcnRoWWVhclZhbGlkYXRvcigpOiBGaWVsZFZhbGlkYXRvcltdIHtcbiAgY29uc3QgbWF4WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgcmV0dXJuIFtcbiAgICByZXF1aXJlZFZhbGlkYXRvcihcIlllYXIgaXMgcmVxdWlyZWRcIiksXG4gICAgbnVtZXJpY1ZhbGlkYXRvcih7XG4gICAgICBtaW46IDE5MDAsXG4gICAgICBtYXg6IG1heFllYXIsXG4gICAgICBtaW5Nc2c6IFwiWWVhciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxOTAwXCIsXG4gICAgICBtYXhNc2c6IGBZZWFyIG11c3QgYmUgbGVzcyB0aGFuICR7bWF4WWVhcn1gLFxuICAgIH0pLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWRWYWxpZGF0b3IobXNnPzogc3RyaW5nKTogRmllbGRWYWxpZGF0b3Ige1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgbXNnID0gbXNnIHx8IFwiUmVxdWlyZWRcIjtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHJldHVybiBtc2c7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwaG9uZU51bWJlclZhbGlkYXRvcihtc2c/OiBzdHJpbmcpOiBGaWVsZFZhbGlkYXRvciB7XG4gIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgvXlxcKz9bXFxkLSgpIF17MTAsMTh9JC8pO1xuICByZXR1cm4gcmVnZXhWYWxpZGF0b3IocmVnZXgsIG1zZyB8fCBcIkludmFsaWQgcGhvbmUgbnVtYmVyXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1haWxWYWxpZGF0b3IobXNnPzogc3RyaW5nKTogRmllbGRWYWxpZGF0b3Ige1xuICAvLyBlbWFpbHJlZ2V4LmNvbVxuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgL14oKFtePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKSopfChcIi4rXCIpKUAoKFxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31dKXwoKFthLXpBLVpcXC0wLTldK1xcLikrW2EtekEtWl17Mix9KSkkLyxcbiAgKTtcbiAgcmV0dXJuIHJlZ2V4VmFsaWRhdG9yKHJlZ2V4LCBtc2cgfHwgXCJJbnZhbGlkIGVtYWlsIGFkZHJlc3NcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTSU5WYWxpZGF0b3IoKTogRmllbGRWYWxpZGF0b3Ige1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgY2hlY2tWYWx1ZSA9IFwiMTIxMTIxMTIxXCIuc3BsaXQoXCJcIikubWFwKChjKSA9PiBwYXJzZUludChjKSk7XG4gICAgY29uc3QgdmFsdWVTdHIgPSAodmFsdWUgYXMgc3RyaW5nKS5yZXBsYWNlKC9cXEQvZywgXCJcIik7XG5cbiAgICBpZiAodmFsdWVTdHIubGVuZ3RoICE9PSA5KSByZXR1cm4gXCJTSU4gbXVzdCBjb250YWluIDkgbnVtYmVyc1wiO1xuXG4gICAgY29uc3QgY2hlY2tTdW0gPSB2YWx1ZVN0clxuICAgICAgLnNwbGl0KFwiXCIpXG4gICAgICAubWFwKChjKSA9PiBwYXJzZUludChjKSlcbiAgICAgIC5tYXAoKG51bSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsID0gbnVtICogY2hlY2tWYWx1ZVtpbmRleF07XG4gICAgICAgIGlmICh2YWwgPCAxMCkge1xuICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3ZhbH1gXG4gICAgICAgICAgLnNwbGl0KFwiXCIpXG4gICAgICAgICAgLm1hcCgoYykgPT4gcGFyc2VJbnQoYykpXG4gICAgICAgICAgLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyAqIHZhbCwgMSk7XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbCwgMCk7XG5cbiAgICBpZiAoY2hlY2tTdW0gJSAxMCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiSW52YWxpZCBTSU5cIjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvc3RhbENvZGVWYWxpZGF0b3IoKTogRmllbGRWYWxpZGF0b3Ige1xuICByZXR1cm4gcmVnZXhWYWxpZGF0b3IoXG4gICAgL15bQUJDRUdISi1OUFJTVFZYWV1cXGRbQUJDRUdISi1OUFJTVFYtWl1bIC1dP1xcZFtBQkNFR0hKLU5QUlNUVi1aXVxcZCQvaSxcbiAgICBcIkludmFsaWQgcG9zdGFsIGNvZGVcIixcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2V4VmFsaWRhdG9yKHJlZ2V4OiBSZWdFeHAsIG1zZzogc3RyaW5nKTogRmllbGRWYWxpZGF0b3Ige1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGlmICgodmFsdWUgYXMgc3RyaW5nKS5tYXRjaChyZWdleCkpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHJldHVybiBtc2c7XG4gIH07XG59XG5cbmludGVyZmFjZSBEYXRlVmFsaWRhdG9yT3B0aW9ucyB7XG4gIGludmFsaWRNc2c/OiBzdHJpbmc7XG4gIHN0YXJ0TXNnPzogc3RyaW5nO1xuICBlbmRNc2c/OiBzdHJpbmc7XG4gIHN0YXJ0PzogRGF0ZTtcbiAgZW5kPzogRGF0ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkYXRlVmFsaWRhdG9yKHtcbiAgaW52YWxpZE1zZyxcbiAgc3RhcnRNc2csXG4gIGVuZE1zZyxcbiAgc3RhcnQsXG4gIGVuZCxcbn06IERhdGVWYWxpZGF0b3JPcHRpb25zKTogRmllbGRWYWxpZGF0b3Ige1xuICByZXR1cm4gKGRhdGU6IHVua25vd24pID0+IHtcbiAgICBsZXQgX2RhdGU6IERhdGUgPSBuZXcgRGF0ZSgwKTtcblxuICAgIGlmICh0eXBlb2YgZGF0ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgX2RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICB9XG4gICAgaWYgKChkYXRlIGFzIERhdGUpLnRvRGF0ZVN0cmluZykge1xuICAgICAgX2RhdGUgPSBkYXRlIGFzIERhdGU7XG4gICAgfVxuXG4gICAgaWYgKF9kYXRlLnRvU3RyaW5nKCkgPT09IFwiSW52YWxpZCBEYXRlXCIgfHwgX2RhdGUuZ2V0VGltZSgpID09PSAwKSB7XG4gICAgICByZXR1cm4gaW52YWxpZE1zZyB8fCBcIkludmFsaWQgZGF0ZVwiO1xuICAgIH1cblxuICAgIGlmIChfZGF0ZSAmJiBzdGFydCAmJiBfZGF0ZSA8IHN0YXJ0KSB7XG4gICAgICByZXR1cm4gc3RhcnRNc2cgfHwgYE11c3QgYmUgYWZ0ZXIgJHtzdGFydH1gO1xuICAgIH1cbiAgICBpZiAoX2RhdGUgJiYgZW5kICYmIF9kYXRlID4gZW5kKSB7XG4gICAgICByZXR1cm4gZW5kTXNnIHx8IGBNdXN0IGJlIGJlZm9yZSAke2VuZH1gO1xuICAgIH1cblxuICAgIHJldHVybiBcIlwiO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTnVtZXJpY1ZhbGlkYXRvck9wdGlvbnMge1xuICBpbnZhbGlkVHlwZU1zZz86IHN0cmluZztcbiAgbWluTXNnPzogc3RyaW5nO1xuICBtYXhNc2c/OiBzdHJpbmc7XG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG51bWVyaWNWYWxpZGF0b3Ioe1xuICBpbnZhbGlkVHlwZU1zZyxcbiAgbWluTXNnLFxuICBtYXhNc2csXG4gIG1pbiA9IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICBtYXggPSBOdW1iZXIuTUFYX1ZBTFVFLFxufTogTnVtZXJpY1ZhbGlkYXRvck9wdGlvbnMpOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBsZXQgX3ZhbHVlOiBudW1iZXIgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgX3ZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIF92YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGlmIChpc05hTihfdmFsdWUpKSB7XG4gICAgICByZXR1cm4gaW52YWxpZFR5cGVNc2cgfHwgXCJNdXN0IGJlIGEgbnVtZXJpYyB2YWx1ZVwiO1xuICAgIH1cblxuICAgIGlmIChfdmFsdWUgPiBtYXgpIHtcbiAgICAgIHJldHVybiBtYXhNc2cgfHwgYE11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bWF4fWA7XG4gICAgfVxuICAgIGlmIChfdmFsdWUgPCBtaW4pIHtcbiAgICAgIHJldHVybiBtaW5Nc2cgfHwgYE11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bWlufWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCI7XG4gIH07XG59XG5cbmludGVyZmFjZSBMZW5ndGhWYWxpZGF0b3JPcHRpb25zIHtcbiAgaW52YWxpZFR5cGVNc2c/OiBzdHJpbmc7XG4gIG1pbk1zZz86IHN0cmluZztcbiAgbWF4TXNnPzogc3RyaW5nO1xuICBtYXg/OiBudW1iZXI7XG4gIG1pbj86IG51bWJlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGhWYWxpZGF0b3Ioe1xuICBpbnZhbGlkVHlwZU1zZyxcbiAgbWluTXNnLFxuICBtYXhNc2csXG4gIG1pbiA9IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICBtYXggPSBOdW1iZXIuTUFYX1ZBTFVFLFxufTogTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyk6IEZpZWxkVmFsaWRhdG9yIHtcbiAgcmV0dXJuICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkVHlwZU1zZyB8fCBcIkludmFsaWQgdHlwZVwiO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5sZW5ndGggPiBtYXgpIHtcbiAgICAgIHJldHVybiBtYXhNc2cgfHwgYE11c3QgYmUgbGVzcyB0aGFuICR7bWF4fSBjaGFyYWN0ZXJzYDtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUubGVuZ3RoIDwgbWluKSB7XG4gICAgICByZXR1cm4gbWluTXNnIHx8IGBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAke21pbn0gY2hhcmFjdGVyc2A7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCI7XG4gIH07XG59XG4iXX0=
|
|
@@ -164,8 +164,8 @@ class CheckedDirective extends CheckboxControlValueAccessor {
|
|
|
164
164
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: CheckedDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
165
165
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.1.5", type: CheckedDirective, selector: "[goaChecked]", host: { listeners: { "_change": "listenForValueChange($event.detail.checked)" } }, providers: [
|
|
166
166
|
{
|
|
167
|
-
provide: NG_VALUE_ACCESSOR,
|
|
168
167
|
useExisting: forwardRef(() => CheckedDirective),
|
|
168
|
+
provide: NG_VALUE_ACCESSOR,
|
|
169
169
|
multi: true,
|
|
170
170
|
},
|
|
171
171
|
], usesInheritance: true, ngImport: i0 }); }
|
|
@@ -176,8 +176,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
|
|
|
176
176
|
selector: "[goaChecked]",
|
|
177
177
|
providers: [
|
|
178
178
|
{
|
|
179
|
-
provide: NG_VALUE_ACCESSOR,
|
|
180
179
|
useExisting: forwardRef(() => CheckedDirective),
|
|
180
|
+
provide: NG_VALUE_ACCESSOR,
|
|
181
181
|
multi: true,
|
|
182
182
|
},
|
|
183
183
|
],
|
|
@@ -201,9 +201,248 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
|
|
|
201
201
|
}]
|
|
202
202
|
}] });
|
|
203
203
|
|
|
204
|
+
// TODO: move this into the form-utils file, since it is specific to the public form component
|
|
205
|
+
function validate(field, fieldsetEl, fieldsetState, validators) {
|
|
206
|
+
const value = fieldsetState?.[field]?.value;
|
|
207
|
+
for (const validator of validators) {
|
|
208
|
+
const msg = validator(value);
|
|
209
|
+
if (msg) {
|
|
210
|
+
dispatchError(fieldsetEl, field, msg);
|
|
211
|
+
return [false, ""];
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return [true, value];
|
|
215
|
+
}
|
|
216
|
+
// TODO: move this into the form-utils file, since it is specific to the public form component
|
|
217
|
+
function dispatchError(el, name, msg) {
|
|
218
|
+
el.dispatchEvent(new CustomEvent("msg", {
|
|
219
|
+
composed: true,
|
|
220
|
+
detail: {
|
|
221
|
+
action: "external::set:error",
|
|
222
|
+
data: {
|
|
223
|
+
name,
|
|
224
|
+
msg,
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
}));
|
|
228
|
+
}
|
|
229
|
+
class FormValidator {
|
|
230
|
+
constructor(validators) {
|
|
231
|
+
this.validators = validators || {};
|
|
232
|
+
}
|
|
233
|
+
add(fieldName, ...validators) {
|
|
234
|
+
this.validators[fieldName] = validators;
|
|
235
|
+
}
|
|
236
|
+
validate(data) {
|
|
237
|
+
const errors = {};
|
|
238
|
+
Object.entries(this.validators).forEach(([name, validators]) => {
|
|
239
|
+
const err = validators
|
|
240
|
+
.map((validatorFn) => {
|
|
241
|
+
const errMsg = validatorFn(data[name]);
|
|
242
|
+
return errMsg;
|
|
243
|
+
})
|
|
244
|
+
.find((msg) => !!msg);
|
|
245
|
+
if (err) {
|
|
246
|
+
errors[name] = err;
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
return errors;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// **********
|
|
253
|
+
// Validators
|
|
254
|
+
// **********
|
|
255
|
+
function birthDayValidator() {
|
|
256
|
+
return [
|
|
257
|
+
requiredValidator("Day is required"),
|
|
258
|
+
numericValidator({
|
|
259
|
+
min: 1,
|
|
260
|
+
max: 31,
|
|
261
|
+
minMsg: "Day must be between 1 and 31",
|
|
262
|
+
maxMsg: "Day must be between 1 and 31",
|
|
263
|
+
}),
|
|
264
|
+
];
|
|
265
|
+
}
|
|
266
|
+
function birthMonthValidator() {
|
|
267
|
+
return [
|
|
268
|
+
requiredValidator("Month is required"),
|
|
269
|
+
numericValidator({
|
|
270
|
+
min: 0,
|
|
271
|
+
max: 11,
|
|
272
|
+
minMsg: "Month must be between Jan and Dec",
|
|
273
|
+
maxMsg: "Month must be between Jan and Dec",
|
|
274
|
+
}),
|
|
275
|
+
];
|
|
276
|
+
}
|
|
277
|
+
function birthYearValidator() {
|
|
278
|
+
const maxYear = new Date().getFullYear();
|
|
279
|
+
return [
|
|
280
|
+
requiredValidator("Year is required"),
|
|
281
|
+
numericValidator({
|
|
282
|
+
min: 1900,
|
|
283
|
+
max: maxYear,
|
|
284
|
+
minMsg: "Year must be greater than 1900",
|
|
285
|
+
maxMsg: `Year must be less than ${maxYear}`,
|
|
286
|
+
}),
|
|
287
|
+
];
|
|
288
|
+
}
|
|
289
|
+
function requiredValidator(msg) {
|
|
290
|
+
return (value) => {
|
|
291
|
+
msg = msg || "Required";
|
|
292
|
+
if (typeof value === "number" && !isNaN(value)) {
|
|
293
|
+
return "";
|
|
294
|
+
}
|
|
295
|
+
if (value) {
|
|
296
|
+
return "";
|
|
297
|
+
}
|
|
298
|
+
return msg;
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
function phoneNumberValidator(msg) {
|
|
302
|
+
const regex = new RegExp(/^\+?[\d-() ]{10,18}$/);
|
|
303
|
+
return regexValidator(regex, msg || "Invalid phone number");
|
|
304
|
+
}
|
|
305
|
+
function emailValidator(msg) {
|
|
306
|
+
// emailregex.com
|
|
307
|
+
const regex = new RegExp(/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/);
|
|
308
|
+
return regexValidator(regex, msg || "Invalid email address");
|
|
309
|
+
}
|
|
310
|
+
function SINValidator() {
|
|
311
|
+
return (value) => {
|
|
312
|
+
if (!value)
|
|
313
|
+
return "";
|
|
314
|
+
const checkValue = "121121121".split("").map((c) => parseInt(c));
|
|
315
|
+
const valueStr = value.replace(/\D/g, "");
|
|
316
|
+
if (valueStr.length !== 9)
|
|
317
|
+
return "SIN must contain 9 numbers";
|
|
318
|
+
const checkSum = valueStr
|
|
319
|
+
.split("")
|
|
320
|
+
.map((c) => parseInt(c))
|
|
321
|
+
.map((num, index) => {
|
|
322
|
+
const val = num * checkValue[index];
|
|
323
|
+
if (val < 10) {
|
|
324
|
+
return val;
|
|
325
|
+
}
|
|
326
|
+
return `${val}`
|
|
327
|
+
.split("")
|
|
328
|
+
.map((c) => parseInt(c))
|
|
329
|
+
.reduce((acc, val) => acc * val, 1);
|
|
330
|
+
})
|
|
331
|
+
.reduce((acc, val) => acc + val, 0);
|
|
332
|
+
if (checkSum % 10 === 0) {
|
|
333
|
+
return "";
|
|
334
|
+
}
|
|
335
|
+
return "Invalid SIN";
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
function postalCodeValidator() {
|
|
339
|
+
return regexValidator(/^[ABCEGHJ-NPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ -]?\d[ABCEGHJ-NPRSTV-Z]\d$/i, "Invalid postal code");
|
|
340
|
+
}
|
|
341
|
+
function regexValidator(regex, msg) {
|
|
342
|
+
return (value) => {
|
|
343
|
+
if (!value) {
|
|
344
|
+
return "";
|
|
345
|
+
}
|
|
346
|
+
if (value.match(regex)) {
|
|
347
|
+
return "";
|
|
348
|
+
}
|
|
349
|
+
return msg;
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
function dateValidator({ invalidMsg, startMsg, endMsg, start, end, }) {
|
|
353
|
+
return (date) => {
|
|
354
|
+
let _date = new Date(0);
|
|
355
|
+
if (typeof date === "string") {
|
|
356
|
+
_date = new Date(date);
|
|
357
|
+
}
|
|
358
|
+
if (date.toDateString) {
|
|
359
|
+
_date = date;
|
|
360
|
+
}
|
|
361
|
+
if (_date.toString() === "Invalid Date" || _date.getTime() === 0) {
|
|
362
|
+
return invalidMsg || "Invalid date";
|
|
363
|
+
}
|
|
364
|
+
if (_date && start && _date < start) {
|
|
365
|
+
return startMsg || `Must be after ${start}`;
|
|
366
|
+
}
|
|
367
|
+
if (_date && end && _date > end) {
|
|
368
|
+
return endMsg || `Must be before ${end}`;
|
|
369
|
+
}
|
|
370
|
+
return "";
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
function numericValidator({ invalidTypeMsg, minMsg, maxMsg, min = -Number.MAX_VALUE, max = Number.MAX_VALUE, }) {
|
|
374
|
+
return (value) => {
|
|
375
|
+
let _value = Number.MAX_VALUE;
|
|
376
|
+
if (typeof value === "string") {
|
|
377
|
+
_value = parseFloat(value);
|
|
378
|
+
}
|
|
379
|
+
if (typeof value === "number") {
|
|
380
|
+
_value = value;
|
|
381
|
+
}
|
|
382
|
+
if (isNaN(_value)) {
|
|
383
|
+
return invalidTypeMsg || "Must be a numeric value";
|
|
384
|
+
}
|
|
385
|
+
if (_value > max) {
|
|
386
|
+
return maxMsg || `Must be less than or equal to ${max}`;
|
|
387
|
+
}
|
|
388
|
+
if (_value < min) {
|
|
389
|
+
return minMsg || `Must be greater than or equal to ${min}`;
|
|
390
|
+
}
|
|
391
|
+
return "";
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
function lengthValidator({ invalidTypeMsg, minMsg, maxMsg, min = -Number.MAX_VALUE, max = Number.MAX_VALUE, }) {
|
|
395
|
+
return (value) => {
|
|
396
|
+
if (typeof value !== "string") {
|
|
397
|
+
return invalidTypeMsg || "Invalid type";
|
|
398
|
+
}
|
|
399
|
+
if (value.length > max) {
|
|
400
|
+
return maxMsg || `Must be less than ${max} characters`;
|
|
401
|
+
}
|
|
402
|
+
if (value.length < min) {
|
|
403
|
+
return minMsg || `Must be greater than ${min} characters`;
|
|
404
|
+
}
|
|
405
|
+
return "";
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
function dispatch(el, eventName, detail, opts) {
|
|
410
|
+
if (!el) {
|
|
411
|
+
console.error("dispatch element is null");
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
el.dispatchEvent(new CustomEvent(eventName, {
|
|
415
|
+
composed: true,
|
|
416
|
+
bubbles: opts?.bubbles,
|
|
417
|
+
detail: detail,
|
|
418
|
+
}));
|
|
419
|
+
}
|
|
420
|
+
function relay(el, eventName, data, opts) {
|
|
421
|
+
if (!el) {
|
|
422
|
+
console.error("dispatch element is null");
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
// console.log(`RELAY(${eventName}):`, data, el);
|
|
426
|
+
el.dispatchEvent(new CustomEvent("msg", {
|
|
427
|
+
composed: true,
|
|
428
|
+
bubbles: opts?.bubbles,
|
|
429
|
+
detail: {
|
|
430
|
+
action: eventName,
|
|
431
|
+
data,
|
|
432
|
+
},
|
|
433
|
+
}));
|
|
434
|
+
}
|
|
435
|
+
// TODO: Logic similar to this needs to be done on the React side as well i.e. an initial onMount
|
|
436
|
+
// event that passes a ref to the form,
|
|
437
|
+
function continueTo(el, name) {
|
|
438
|
+
relay(el, "external::continue", {
|
|
439
|
+
next: name,
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
|
|
204
443
|
/**
|
|
205
444
|
* Generated bundle index. Do not edit.
|
|
206
445
|
*/
|
|
207
446
|
|
|
208
|
-
export { AngularComponentsModule, CheckedDirective, ValueDirective, ValueListDirective };
|
|
447
|
+
export { AngularComponentsModule, CheckedDirective, FormValidator, SINValidator, ValueDirective, ValueListDirective, birthDayValidator, birthMonthValidator, birthYearValidator, continueTo, dateValidator, dispatch, emailValidator, lengthValidator, numericValidator, phoneNumberValidator, postalCodeValidator, regexValidator, relay, requiredValidator, validate };
|
|
209
448
|
//# sourceMappingURL=abgov-angular-components.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abgov-angular-components.mjs","sources":["../../../../libs/angular-components/src/lib/value-directive.ts","../../../../libs/angular-components/src/lib/checked-directive.ts","../../../../libs/angular-components/src/lib/angular-components.module.ts","../../../../libs/angular-components/src/abgov-angular-components.ts"],"sourcesContent":["import { forwardRef, Directive, ElementRef, HostListener } from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\n@Directive({\n selector: \"[goaValue]\", providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ValueDirective),\n multi: true,\n }],\n})\nexport class ValueDirective implements ControlValueAccessor {\n private _value = \"\";\n private _disabled = false;\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n onChange: any = () => { };\n onTouched: any = () => { };\n\n get value(): string {\n return this._value;\n }\n\n set value(val: string) {\n this._value = val;\n this.onChange(this._value);\n this.onTouched();\n this.elementRef.nativeElement.value = val;\n }\n\n writeValue(value: string) {\n this.value = value;\n }\n\n registerOnChange(fn: () => void) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void) {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled = isDisabled;\n this.elementRef.nativeElement.disabled = isDisabled;\n }\n\n constructor(protected elementRef: ElementRef) { }\n\n @HostListener(\"_change\", [\"$event.detail.value\"])\n listenForValueChange(value: string) {\n this.value = value;\n }\n @HostListener(\"disabledChange\", [\"$event.detail.disabled\"])\n listenForDisabledChange(isDisabled: boolean) {\n this.setDisabledState(isDisabled);\n }\n}\n\n@Directive({\n selector: \"[goaValueList]\",\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ValueListDirective),\n multi: true,\n }],\n})\nexport class ValueListDirective implements ControlValueAccessor {\n private _value?: string[] = [];\n\n onChange: any = () => { };\n onTouched: any = () => { };\n\n get value(): string[] | undefined {\n return this._value;\n }\n\n set value(val: string[] | undefined) {\n if (val && val !== this._value) {\n this._setValue(val);\n this.elementRef.nativeElement.value = JSON.stringify(val);\n }\n }\n\n writeValue(value?: string[]) {\n if (value) {\n this.value = value;\n }\n }\n\n registerOnChange(fn: () => void) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void) {\n this.onTouched = fn;\n }\n\n constructor(protected elementRef: ElementRef) { }\n\n @HostListener(\"_change\", [\"$event.detail.value\"])\n listenForValueChange(value: string) {\n if (!value) {\n this._setValue(undefined);\n return;\n }\n\n try {\n this.value = JSON.parse(value);\n } catch (e) {\n // we still need to trigger the events to prevent any previous valid value to remain set.\n const v = value.match(/^[\\w\\s,]*$/) ? value.split(\",\") : undefined;\n this._setValue(v);\n }\n }\n\n _setValue(value?: string[]) {\n this._value = value;\n this.onChange(value);\n this.onTouched();\n }\n}\n","import {\n forwardRef,\n Directive,\n ElementRef,\n HostListener,\n Renderer2,\n} from \"@angular/core\";\nimport {\n CheckboxControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from \"@angular/forms\";\n\n@Directive({\n selector: \"[goaChecked]\",\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CheckedDirective),\n multi: true,\n },\n ],\n})\n\nexport class CheckedDirective extends CheckboxControlValueAccessor {\n private _checked = false;\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n override onChange: any = () => { };\n override onTouched: any = () => { };\n\n constructor(protected renderer: Renderer2, protected elementRef: ElementRef) {\n super(renderer, elementRef);\n }\n\n get value(): string {\n return this._checked ? \"checked\" : \"\";\n }\n\n set value(checked: any) {\n this._checked = !!checked;\n this.onChange(this._checked);\n this.onTouched();\n this.elementRef.nativeElement.checked = checked;\n }\n\n override writeValue(checked: any) {\n this.value = checked;\n }\n\n override registerOnChange(fn: (_: any) => void) {\n this.onChange = fn;\n }\n\n override registerOnTouched(fn: () => void) {\n this.onTouched = fn;\n }\n\n @HostListener(\"_change\", [\"$event.detail.checked\"])\n listenForValueChange(checked: any) {\n this.value = checked;\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\nimport { ValueDirective, ValueListDirective } from \"./value-directive\";\nimport { CheckedDirective } from \"./checked-directive\";\n\n@NgModule({\n declarations: [ValueDirective, ValueListDirective, CheckedDirective],\n exports: [ValueDirective, ValueListDirective, CheckedDirective],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class AngularComponentsModule {}\n\nexport { ValueDirective, ValueListDirective, CheckedDirective };\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"abgov-angular-components.mjs","sources":["../../../../libs/angular-components/src/lib/value-directive.ts","../../../../libs/angular-components/src/lib/checked-directive.ts","../../../../libs/angular-components/src/lib/angular-components.module.ts","../../../../libs/angular-components/src/lib/validation.ts","../../../../libs/angular-components/src/lib/public-form-utils.ts","../../../../libs/angular-components/src/abgov-angular-components.ts"],"sourcesContent":["import { forwardRef, Directive, ElementRef, HostListener } from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\n@Directive({\n selector: \"[goaValue]\", providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ValueDirective),\n multi: true,\n }],\n})\nexport class ValueDirective implements ControlValueAccessor {\n private _value = \"\";\n private _disabled = false;\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n onChange: any = () => { };\n onTouched: any = () => { };\n\n get value(): string {\n return this._value;\n }\n\n set value(val: string) {\n this._value = val;\n this.onChange(this._value);\n this.onTouched();\n this.elementRef.nativeElement.value = val;\n }\n\n writeValue(value: string) {\n this.value = value;\n }\n\n registerOnChange(fn: () => void) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void) {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled = isDisabled;\n this.elementRef.nativeElement.disabled = isDisabled;\n }\n\n constructor(protected elementRef: ElementRef) { }\n\n @HostListener(\"_change\", [\"$event.detail.value\"])\n listenForValueChange(value: string) {\n this.value = value;\n }\n @HostListener(\"disabledChange\", [\"$event.detail.disabled\"])\n listenForDisabledChange(isDisabled: boolean) {\n this.setDisabledState(isDisabled);\n }\n}\n\n@Directive({\n selector: \"[goaValueList]\",\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ValueListDirective),\n multi: true,\n }],\n})\nexport class ValueListDirective implements ControlValueAccessor {\n private _value?: string[] = [];\n\n onChange: any = () => { };\n onTouched: any = () => { };\n\n get value(): string[] | undefined {\n return this._value;\n }\n\n set value(val: string[] | undefined) {\n if (val && val !== this._value) {\n this._setValue(val);\n this.elementRef.nativeElement.value = JSON.stringify(val);\n }\n }\n\n writeValue(value?: string[]) {\n if (value) {\n this.value = value;\n }\n }\n\n registerOnChange(fn: () => void) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void) {\n this.onTouched = fn;\n }\n\n constructor(protected elementRef: ElementRef) { }\n\n @HostListener(\"_change\", [\"$event.detail.value\"])\n listenForValueChange(value: string) {\n if (!value) {\n this._setValue(undefined);\n return;\n }\n\n try {\n this.value = JSON.parse(value);\n } catch (e) {\n // we still need to trigger the events to prevent any previous valid value to remain set.\n const v = value.match(/^[\\w\\s,]*$/) ? value.split(\",\") : undefined;\n this._setValue(v);\n }\n }\n\n _setValue(value?: string[]) {\n this._value = value;\n this.onChange(value);\n this.onTouched();\n }\n}\n","import {\n forwardRef,\n Directive,\n ElementRef,\n HostListener,\n Renderer2,\n} from \"@angular/core\";\nimport {\n CheckboxControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from \"@angular/forms\";\n\n@Directive({\n selector: \"[goaChecked]\",\n providers: [\n {\n useExisting: forwardRef(() => CheckedDirective),\n provide: NG_VALUE_ACCESSOR,\n multi: true,\n },\n ],\n})\n\nexport class CheckedDirective extends CheckboxControlValueAccessor {\n private _checked = false;\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n override onChange: any = () => { };\n override onTouched: any = () => { };\n\n constructor(protected renderer: Renderer2, protected elementRef: ElementRef) {\n super(renderer, elementRef);\n }\n\n get value(): string {\n return this._checked ? \"checked\" : \"\";\n }\n\n set value(checked: any) {\n this._checked = !!checked;\n this.onChange(this._checked);\n this.onTouched();\n this.elementRef.nativeElement.checked = checked;\n }\n\n override writeValue(checked: any) {\n this.value = checked;\n }\n\n override registerOnChange(fn: (_: any) => void) {\n this.onChange = fn;\n }\n\n override registerOnTouched(fn: () => void) {\n this.onTouched = fn;\n }\n\n @HostListener(\"_change\", [\"$event.detail.checked\"])\n listenForValueChange(checked: any) {\n this.value = checked;\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\nimport { ValueDirective, ValueListDirective } from \"./value-directive\";\nimport { CheckedDirective } from \"./checked-directive\";\n\n@NgModule({\n declarations: [ValueDirective, ValueListDirective, CheckedDirective],\n exports: [ValueDirective, ValueListDirective, CheckedDirective],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class AngularComponentsModule {}\n\nexport { ValueDirective, ValueListDirective, CheckedDirective };\n","import { FieldsetItemState } from \"./public-form-utils\";\n\nexport type FieldValidator = (value: unknown) => string;\nexport type FieldsetState = Record<string, FieldsetItemState>;\n\n// TODO: move this into the form-utils file, since it is specific to the public form component\nexport function validate(\n field: string,\n fieldsetEl: HTMLElement,\n fieldsetState: FieldsetState,\n validators: FieldValidator[],\n): [boolean, string] {\n const value = fieldsetState?.[field]?.value;\n\n for (const validator of validators) {\n const msg = validator(value);\n if (msg) {\n dispatchError(fieldsetEl, field, msg);\n return [false, \"\"];\n }\n }\n return [true, value];\n}\n\n// TODO: move this into the form-utils file, since it is specific to the public form component\nfunction dispatchError(el: HTMLElement, name: string, msg: string) {\n el.dispatchEvent(\n new CustomEvent(\"msg\", {\n composed: true,\n detail: {\n action: \"external::set:error\",\n data: {\n name,\n msg,\n },\n },\n }),\n );\n}\n\nexport class FormValidator {\n private validators: Record<string, FieldValidator[]>;\n constructor(validators?: Record<string, FieldValidator[]>) {\n this.validators = validators || {};\n }\n\n add(fieldName: string, ...validators: FieldValidator[]) {\n this.validators[fieldName] = validators;\n }\n\n validate(data: Record<string, string>): Record<string, string> {\n const errors: Record<string, string> = {};\n\n Object.entries(this.validators).forEach(([name, validators]) => {\n const err = validators\n .map((validatorFn) => {\n const errMsg = validatorFn(data[name]);\n return errMsg;\n })\n .find((msg) => !!msg);\n if (err) {\n errors[name] = err;\n }\n });\n\n return errors;\n }\n}\n\n// **********\n// Validators\n// **********\n\nexport function birthDayValidator(): FieldValidator[] {\n return [\n requiredValidator(\"Day is required\"),\n numericValidator({\n min: 1,\n max: 31,\n minMsg: \"Day must be between 1 and 31\",\n maxMsg: \"Day must be between 1 and 31\",\n }),\n ];\n}\n\nexport function birthMonthValidator(): FieldValidator[] {\n return [\n requiredValidator(\"Month is required\"),\n numericValidator({\n min: 0,\n max: 11,\n minMsg: \"Month must be between Jan and Dec\",\n maxMsg: \"Month must be between Jan and Dec\",\n }),\n ];\n}\n\nexport function birthYearValidator(): FieldValidator[] {\n const maxYear = new Date().getFullYear();\n return [\n requiredValidator(\"Year is required\"),\n numericValidator({\n min: 1900,\n max: maxYear,\n minMsg: \"Year must be greater than 1900\",\n maxMsg: `Year must be less than ${maxYear}`,\n }),\n ];\n}\n\nexport function requiredValidator(msg?: string): FieldValidator {\n return (value: unknown) => {\n msg = msg || \"Required\";\n\n if (typeof value === \"number\" && !isNaN(value)) {\n return \"\";\n }\n if (value) {\n return \"\";\n }\n return msg;\n };\n}\n\nexport function phoneNumberValidator(msg?: string): FieldValidator {\n const regex = new RegExp(/^\\+?[\\d-() ]{10,18}$/);\n return regexValidator(regex, msg || \"Invalid phone number\");\n}\n\nexport function emailValidator(msg?: string): FieldValidator {\n // emailregex.com\n const regex = new RegExp(\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\n );\n return regexValidator(regex, msg || \"Invalid email address\");\n}\n\nexport function SINValidator(): FieldValidator {\n return (value: unknown) => {\n if (!value) return \"\";\n const checkValue = \"121121121\".split(\"\").map((c) => parseInt(c));\n const valueStr = (value as string).replace(/\\D/g, \"\");\n\n if (valueStr.length !== 9) return \"SIN must contain 9 numbers\";\n\n const checkSum = valueStr\n .split(\"\")\n .map((c) => parseInt(c))\n .map((num, index) => {\n const val = num * checkValue[index];\n if (val < 10) {\n return val;\n }\n return `${val}`\n .split(\"\")\n .map((c) => parseInt(c))\n .reduce((acc, val) => acc * val, 1);\n })\n .reduce((acc, val) => acc + val, 0);\n\n if (checkSum % 10 === 0) {\n return \"\";\n }\n\n return \"Invalid SIN\";\n };\n}\n\nexport function postalCodeValidator(): FieldValidator {\n return regexValidator(\n /^[ABCEGHJ-NPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z][ -]?\\d[ABCEGHJ-NPRSTV-Z]\\d$/i,\n \"Invalid postal code\",\n );\n}\n\nexport function regexValidator(regex: RegExp, msg: string): FieldValidator {\n return (value: unknown) => {\n if (!value) {\n return \"\";\n }\n if ((value as string).match(regex)) {\n return \"\";\n }\n\n return msg;\n };\n}\n\ninterface DateValidatorOptions {\n invalidMsg?: string;\n startMsg?: string;\n endMsg?: string;\n start?: Date;\n end?: Date;\n}\nexport function dateValidator({\n invalidMsg,\n startMsg,\n endMsg,\n start,\n end,\n}: DateValidatorOptions): FieldValidator {\n return (date: unknown) => {\n let _date: Date = new Date(0);\n\n if (typeof date === \"string\") {\n _date = new Date(date);\n }\n if ((date as Date).toDateString) {\n _date = date as Date;\n }\n\n if (_date.toString() === \"Invalid Date\" || _date.getTime() === 0) {\n return invalidMsg || \"Invalid date\";\n }\n\n if (_date && start && _date < start) {\n return startMsg || `Must be after ${start}`;\n }\n if (_date && end && _date > end) {\n return endMsg || `Must be before ${end}`;\n }\n\n return \"\";\n };\n}\n\ninterface NumericValidatorOptions {\n invalidTypeMsg?: string;\n minMsg?: string;\n maxMsg?: string;\n min?: number;\n max?: number;\n}\nexport function numericValidator({\n invalidTypeMsg,\n minMsg,\n maxMsg,\n min = -Number.MAX_VALUE,\n max = Number.MAX_VALUE,\n}: NumericValidatorOptions): FieldValidator {\n return (value: unknown) => {\n let _value: number = Number.MAX_VALUE;\n\n if (typeof value === \"string\") {\n _value = parseFloat(value);\n }\n if (typeof value === \"number\") {\n _value = value;\n }\n\n if (isNaN(_value)) {\n return invalidTypeMsg || \"Must be a numeric value\";\n }\n\n if (_value > max) {\n return maxMsg || `Must be less than or equal to ${max}`;\n }\n if (_value < min) {\n return minMsg || `Must be greater than or equal to ${min}`;\n }\n\n return \"\";\n };\n}\n\ninterface LengthValidatorOptions {\n invalidTypeMsg?: string;\n minMsg?: string;\n maxMsg?: string;\n max?: number;\n min?: number;\n}\nexport function lengthValidator({\n invalidTypeMsg,\n minMsg,\n maxMsg,\n min = -Number.MAX_VALUE,\n max = Number.MAX_VALUE,\n}: LengthValidatorOptions): FieldValidator {\n return (value: unknown) => {\n if (typeof value !== \"string\") {\n return invalidTypeMsg || \"Invalid type\";\n }\n\n if (value.length > max) {\n return maxMsg || `Must be less than ${max} characters`;\n }\n\n if (value.length < min) {\n return minMsg || `Must be greater than ${min} characters`;\n }\n\n return \"\";\n };\n}\n","export type AppState = {\n form: Record<string, Record<string, FieldsetItemState>[]>;\n history: string[];\n editting: string;\n lastModified?: Date;\n};\n\nexport type FieldsetItemState = {\n name: string;\n label: string;\n // value: string | number | Date;\n value: string;\n};\n\nexport function dispatch<T>(\n el: HTMLElement | Element | null | undefined,\n eventName: string,\n detail?: T,\n opts?: { bubbles?: boolean },\n) {\n if (!el) {\n console.error(\"dispatch element is null\");\n return;\n }\n el.dispatchEvent(\n new CustomEvent<T>(eventName, {\n composed: true,\n bubbles: opts?.bubbles,\n detail: detail,\n }),\n );\n}\n\nexport function relay<T>(\n el: HTMLElement | Element | null | undefined,\n eventName: string,\n data?: T,\n opts?: { bubbles?: boolean },\n) {\n if (!el) {\n console.error(\"dispatch element is null\");\n return;\n }\n // console.log(`RELAY(${eventName}):`, data, el);\n el.dispatchEvent(\n new CustomEvent<{ action: string; data?: T }>(\"msg\", {\n composed: true,\n bubbles: opts?.bubbles,\n detail: {\n action: eventName,\n data,\n },\n }),\n );\n}\n\n// TODO: Logic similar to this needs to be done on the React side as well i.e. an initial onMount\n// event that passes a ref to the form,\nexport function continueTo(el: HTMLElement, name: string) {\n relay<{ next: string }>(el, \"external::continue\", {\n next: name,\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type AppState = {
|
|
2
|
+
form: Record<string, Record<string, FieldsetItemState>[]>;
|
|
3
|
+
history: string[];
|
|
4
|
+
editting: string;
|
|
5
|
+
lastModified?: Date;
|
|
6
|
+
};
|
|
7
|
+
export type FieldsetItemState = {
|
|
8
|
+
name: string;
|
|
9
|
+
label: string;
|
|
10
|
+
value: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function dispatch<T>(el: HTMLElement | Element | null | undefined, eventName: string, detail?: T, opts?: {
|
|
13
|
+
bubbles?: boolean;
|
|
14
|
+
}): void;
|
|
15
|
+
export declare function relay<T>(el: HTMLElement | Element | null | undefined, eventName: string, data?: T, opts?: {
|
|
16
|
+
bubbles?: boolean;
|
|
17
|
+
}): void;
|
|
18
|
+
export declare function continueTo(el: HTMLElement, name: string): void;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { FieldsetItemState } from "./public-form-utils";
|
|
2
|
+
export type FieldValidator = (value: unknown) => string;
|
|
3
|
+
export type FieldsetState = Record<string, FieldsetItemState>;
|
|
4
|
+
export declare function validate(field: string, fieldsetEl: HTMLElement, fieldsetState: FieldsetState, validators: FieldValidator[]): [boolean, string];
|
|
5
|
+
export declare class FormValidator {
|
|
6
|
+
private validators;
|
|
7
|
+
constructor(validators?: Record<string, FieldValidator[]>);
|
|
8
|
+
add(fieldName: string, ...validators: FieldValidator[]): void;
|
|
9
|
+
validate(data: Record<string, string>): Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
export declare function birthDayValidator(): FieldValidator[];
|
|
12
|
+
export declare function birthMonthValidator(): FieldValidator[];
|
|
13
|
+
export declare function birthYearValidator(): FieldValidator[];
|
|
14
|
+
export declare function requiredValidator(msg?: string): FieldValidator;
|
|
15
|
+
export declare function phoneNumberValidator(msg?: string): FieldValidator;
|
|
16
|
+
export declare function emailValidator(msg?: string): FieldValidator;
|
|
17
|
+
export declare function SINValidator(): FieldValidator;
|
|
18
|
+
export declare function postalCodeValidator(): FieldValidator;
|
|
19
|
+
export declare function regexValidator(regex: RegExp, msg: string): FieldValidator;
|
|
20
|
+
interface DateValidatorOptions {
|
|
21
|
+
invalidMsg?: string;
|
|
22
|
+
startMsg?: string;
|
|
23
|
+
endMsg?: string;
|
|
24
|
+
start?: Date;
|
|
25
|
+
end?: Date;
|
|
26
|
+
}
|
|
27
|
+
export declare function dateValidator({ invalidMsg, startMsg, endMsg, start, end, }: DateValidatorOptions): FieldValidator;
|
|
28
|
+
interface NumericValidatorOptions {
|
|
29
|
+
invalidTypeMsg?: string;
|
|
30
|
+
minMsg?: string;
|
|
31
|
+
maxMsg?: string;
|
|
32
|
+
min?: number;
|
|
33
|
+
max?: number;
|
|
34
|
+
}
|
|
35
|
+
export declare function numericValidator({ invalidTypeMsg, minMsg, maxMsg, min, max, }: NumericValidatorOptions): FieldValidator;
|
|
36
|
+
interface LengthValidatorOptions {
|
|
37
|
+
invalidTypeMsg?: string;
|
|
38
|
+
minMsg?: string;
|
|
39
|
+
maxMsg?: string;
|
|
40
|
+
max?: number;
|
|
41
|
+
min?: number;
|
|
42
|
+
}
|
|
43
|
+
export declare function lengthValidator({ invalidTypeMsg, minMsg, maxMsg, min, max, }: LengthValidatorOptions): FieldValidator;
|
|
44
|
+
export {};
|