@luftborn/custom-elements 2.4.0 → 2.5.0
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/assets/icons/datepicker-icon.png +0 -0
- package/demo/index.js +233 -126
- package/demo/index.min.js +232 -125
- package/demo/index.min.js.map +1 -1
- package/dist/elements/CustomDataFiledElement/CustomFormatDateFieldElement.d.ts +16 -0
- package/dist/elements/CustomDataFiledElement/CustomFormatDateFieldElement.js +133 -0
- package/dist/elements/CustomDataFiledElement/CustomFormatDateFieldElement.js.map +1 -0
- package/dist/elements/Elements.d.ts +2 -1
- package/dist/elements/Elements.js +3 -1
- package/dist/elements/Elements.js.map +1 -1
- package/dist/framework/CustomInputElement.d.ts +1 -0
- package/dist/framework/CustomInputElement.js +1 -0
- package/dist/framework/CustomInputElement.js.map +1 -1
- package/dist/framework/Validation/Validators/SEPersonalNumber.d.ts +2 -2
- package/dist/framework/Validation/Validators/SEPersonalNumber.js +28 -58
- package/dist/framework/Validation/Validators/SEPersonalNumber.js.map +1 -1
- package/package.json +2 -2
- package/src/elements/CustomDataFiledElement/CustomFormatDateFieldElement.ts +157 -0
- package/src/elements/Elements.ts +2 -0
- package/src/framework/CustomInputElement.ts +2 -0
- package/src/framework/Validation/Validators/SEPersonalNumber.ts +32 -69
|
@@ -1,80 +1,43 @@
|
|
|
1
1
|
import IValidation from '../IValidator.interface';
|
|
2
2
|
|
|
3
3
|
export default class SEPersonalNumberValidator implements IValidation {
|
|
4
|
-
private regex: RegExp = new RegExp(
|
|
5
|
-
/^(\d{2}){0,1}(\d{2})(\d{2})(\d{2})([\+\-]?)((?!000)\d{3})(\d)$/
|
|
6
|
-
);
|
|
7
4
|
|
|
5
|
+
public isSatisfiedBy(input: string, allowEmpty: boolean = true): boolean {
|
|
6
|
+
// Format: 10 or 12 digits [YY]YYMMDD[-/+]NNNN and pass checksum validation
|
|
7
|
+
const match = input
|
|
8
|
+
.replace(/[ +-]/g, '')
|
|
9
|
+
.match(/^(\d{2}|\d{4})(\d{2})(\d{2})(\d{4})$/i)
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
if (allowEmpty && !input) {
|
|
11
|
-
return true;
|
|
12
|
-
}
|
|
11
|
+
if (!match) return false // not matching regex
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const decade = groups[2];
|
|
21
|
-
let century;
|
|
22
|
-
|
|
23
|
-
if (groups[1]) {
|
|
24
|
-
century = groups[1];
|
|
25
|
-
} else {
|
|
26
|
-
let born = new Date().getFullYear() - parseInt(decade, 10);
|
|
27
|
-
if (groups[5] && groups[5] === '+') {
|
|
28
|
-
born -= 100;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
century = born.toString().substring(0, 2);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Create date time object.
|
|
35
|
-
let day = parseInt(groups[4], 10);
|
|
36
|
-
const isCoordinationNumber = day > 60;
|
|
37
|
-
day = isCoordinationNumber ? day - 60 : day;
|
|
38
|
-
|
|
39
|
-
const realDay = day;
|
|
40
|
-
const year = decade;
|
|
41
|
-
const fullYear = century + decade;
|
|
42
|
-
const month = groups[3];
|
|
43
|
-
const numbers = groups[6] + groups[7];
|
|
44
|
-
const controlNumber = groups[7];
|
|
45
|
-
|
|
46
|
-
// Try parse date-time to make sure it's actually a real date.
|
|
47
|
-
if (!Date.parse(`${fullYear}-${month}-${realDay}`)) {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (this.luhn(`${year}${month}${day}${groups[6]}`) !== parseInt(controlNumber, 10)) {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return true;
|
|
13
|
+
let [, month, day] = match.slice(1).map(Number)
|
|
14
|
+
return (
|
|
15
|
+
(!allowEmpty ? !!input : true) &&
|
|
16
|
+
this.validateDayAndMonth(month, day) &&
|
|
17
|
+
this.validateChecksum(input)
|
|
18
|
+
)
|
|
56
19
|
}
|
|
57
20
|
|
|
58
|
-
private
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
// The value passed is a string, so we aught to get the actual integer value from each char (i.e., subtract '0' which is 48).
|
|
66
|
-
const t: number[] = value.split('').map((d) => parseInt(d, 10));
|
|
67
|
-
let sum = 0;
|
|
68
|
-
let temp;
|
|
69
|
-
for (let i = 0; i < t.length; i++) {
|
|
70
|
-
temp = t[i];
|
|
71
|
-
temp *= 2 - (i % 2);
|
|
72
|
-
if (temp > 9) {
|
|
73
|
-
temp -= 9;
|
|
74
|
-
}
|
|
75
|
-
sum += temp;
|
|
76
|
-
}
|
|
21
|
+
private validateDayAndMonth(month: number, day: number) {
|
|
22
|
+
const maxDaysInMonth = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
|
23
|
+
return (
|
|
24
|
+
!(month < 1 || month > 12) && !(day < 1 || day > maxDaysInMonth[month])
|
|
25
|
+
)
|
|
26
|
+
}
|
|
77
27
|
|
|
78
|
-
|
|
28
|
+
private validateChecksum(persNo: string) {
|
|
29
|
+
const digits = persNo
|
|
30
|
+
.replace(/[ +-]/g, '')
|
|
31
|
+
.slice(-10)
|
|
32
|
+
.split('')
|
|
33
|
+
.map(Number)
|
|
34
|
+
const luhnWeights = [2, 1, 2, 1, 2, 1, 2, 1, 2, 1]
|
|
35
|
+
const luhnF = (n: number) => (n < 10 ? n : n - 9)
|
|
36
|
+
const luhnSum = luhnWeights
|
|
37
|
+
.map((value: number, index: number) => value * digits[index])
|
|
38
|
+
.map(luhnF)
|
|
39
|
+
.reduce((a: number, b: number) => a + b)
|
|
40
|
+
const controlSum = 10 - (+luhnSum % 10)
|
|
41
|
+
return controlSum % 10 == 0
|
|
79
42
|
}
|
|
80
43
|
}
|