@abgov/angular-components 3.0.0-alpha.7 → 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 CHANGED
@@ -1,2 +1,4 @@
1
1
  export * from "./lib/angular-components.module";
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY29tcG9uZW50cy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQ0FBaUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2xpYi9hbmd1bGFyLWNvbXBvbmVudHMubW9kdWxlXCI7XG4iXX0=
2
+ export * from "./lib/validation";
3
+ export * from "./lib/public-form-utils";
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY29tcG9uZW50cy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMseUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9saWIvYW5ndWxhci1jb21wb25lbnRzLm1vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL3ZhbGlkYXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9wdWJsaWMtZm9ybS11dGlsc1wiO1xuIl19
@@ -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=
@@ -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 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","/**\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
@@ -1 +1,3 @@
1
1
  export * from "./lib/angular-components.module";
2
+ export * from "./lib/validation";
3
+ export * from "./lib/public-form-utils";
@@ -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 {};
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "url": "https://github.com/GovAlta/ui-components/issues"
6
6
  },
7
7
  "license": "Apache-2.0",
8
- "version": "3.0.0-alpha.7",
8
+ "version": "3.0.0-alpha.8",
9
9
  "keywords": [
10
10
  "GoA",
11
11
  "ui-components",