peryl 1.5.2 → 1.5.3
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/README.md +30 -16
- package/demo/hsml-app-form-validation_demo.ts +22 -23
- package/demo/hsml-app-form_demo.ts +24 -20
- package/demo/hsml-app-test_demo.ts +35 -36
- package/demo/hsml-app-tictactoe_demo.ts +16 -15
- package/demo/hsml-app_demo.ts +20 -12
- package/demo/hsml-appel_demo.html +7 -0
- package/demo/hsml-appel_demo.ts +33 -25
- package/demo/hsml-appi_demo.ts +9 -9
- package/demo/hsml_demo.ts +27 -22
- package/demo/js/hsml-app-js-happi_demo.html +16 -8
- package/demo/js/hsml-app-js_demo.html +15 -15
- package/dist/browser-esmodule/encode.js.map +1 -1
- package/dist/browser-esmodule/hsml-app.js +67 -73
- package/dist/browser-esmodule/hsml-app.js.map +1 -1
- package/dist/browser-esmodule/hsml-convert.js.map +1 -1
- package/dist/browser-esmodule/hsml-dom.js +3 -3
- package/dist/browser-esmodule/hsml-dom.js.map +1 -1
- package/dist/browser-esmodule/hsml-h.js.map +1 -1
- package/dist/browser-esmodule/hsml-html.js +2 -2
- package/dist/browser-esmodule/hsml-html.js.map +1 -1
- package/dist/browser-esmodule/hsml-idom.js +5 -5
- package/dist/browser-esmodule/hsml-idom.js.map +1 -1
- package/dist/browser-esmodule/hsml.js.map +1 -1
- package/dist/browser-esmodule/http.js.map +1 -1
- package/dist/browser-esmodule/index.js +71 -77
- package/dist/browser-esmodule/index.js.map +1 -1
- package/dist/browser-esmodule/router.js.map +1 -1
- package/dist/browser-umd/encode.js +1 -1
- package/dist/browser-umd/encode.js.map +1 -1
- package/dist/browser-umd/hsml-app.js +1 -1
- package/dist/browser-umd/hsml-app.js.map +1 -1
- package/dist/browser-umd/hsml-convert.js.map +1 -1
- package/dist/browser-umd/hsml-dom.js +1 -1
- package/dist/browser-umd/hsml-dom.js.map +1 -1
- package/dist/browser-umd/hsml-h.js.map +1 -1
- package/dist/browser-umd/hsml-html.js +1 -1
- package/dist/browser-umd/hsml-html.js.map +1 -1
- package/dist/browser-umd/hsml-idom.js +1 -1
- package/dist/browser-umd/hsml-idom.js.map +1 -1
- package/dist/browser-umd/hsml.js.map +1 -1
- package/dist/browser-umd/http.js +1 -1
- package/dist/browser-umd/http.js.map +1 -1
- package/dist/browser-umd/index.js +1 -1
- package/dist/browser-umd/index.js.map +1 -1
- package/dist/browser-umd/router.js +1 -1
- package/dist/browser-umd/router.js.map +1 -1
- package/dist/browser-umd/validators-moment.js +1 -1
- package/dist/browser-umd/validators-moment.js.map +1 -1
- package/dist/browser-umd/validators-numeral.js.map +1 -1
- package/dist/demo/encode_demo.ce182166.js.map +1 -1
- package/dist/demo/encode_demo.f40a44eb.js.map +1 -1
- package/dist/demo/hsml-app-form-validation_demo.a9e2c583.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.a9e2c583.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.bb392ab0.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.bb392ab0.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.c6856b02.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.c6856b02.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.html +1 -1
- package/dist/demo/hsml-app-form_demo.e36ef1e9.js +2 -0
- package/dist/demo/hsml-app-form_demo.e36ef1e9.js.map +1 -0
- package/dist/demo/hsml-app-form_demo.fd22dfcf.js +2 -0
- package/dist/demo/hsml-app-form_demo.fd22dfcf.js.map +1 -0
- package/dist/demo/hsml-app-form_demo.html +1 -1
- package/dist/demo/hsml-app-test_demo.ba5f166c.js +2 -0
- package/dist/demo/hsml-app-test_demo.ba5f166c.js.map +1 -0
- package/dist/demo/hsml-app-test_demo.e8b5e4b2.js +2 -0
- package/dist/demo/hsml-app-test_demo.e8b5e4b2.js.map +1 -0
- package/dist/demo/hsml-app-test_demo.html +1 -1
- package/dist/demo/hsml-app-tictactoe_demo.03d8363f.js +2 -0
- package/dist/demo/hsml-app-tictactoe_demo.03d8363f.js.map +1 -0
- package/dist/demo/hsml-app-tictactoe_demo.399f8e69.js +2 -0
- package/dist/demo/hsml-app-tictactoe_demo.399f8e69.js.map +1 -0
- package/dist/demo/hsml-app-tictactoe_demo.html +1 -1
- package/dist/demo/hsml-app_demo.44aa1072.js +2 -0
- package/dist/demo/hsml-app_demo.44aa1072.js.map +1 -0
- package/dist/demo/hsml-app_demo.70ef3e7a.js +2 -0
- package/dist/demo/hsml-app_demo.70ef3e7a.js.map +1 -0
- package/dist/demo/hsml-app_demo.html +1 -1
- package/dist/demo/hsml-appel_demo.2a9f7f3f.js +2 -0
- package/dist/demo/hsml-appel_demo.2a9f7f3f.js.map +1 -0
- package/dist/demo/hsml-appel_demo.bea7849a.js +2 -0
- package/dist/demo/hsml-appel_demo.bea7849a.js.map +1 -0
- package/dist/demo/hsml-appel_demo.html +1 -1
- package/dist/demo/hsml-appi_demo.3dc5de90.js +2 -0
- package/dist/demo/hsml-appi_demo.3dc5de90.js.map +1 -0
- package/dist/demo/hsml-appi_demo.bfc7056a.js +2 -0
- package/dist/demo/hsml-appi_demo.bfc7056a.js.map +1 -0
- package/dist/demo/hsml-appi_demo.html +1 -1
- package/dist/demo/hsml-convert_demo.0ea1fa3b.js.map +1 -1
- package/dist/demo/hsml-convert_demo.63e3e7b5.js.map +1 -1
- package/dist/demo/{hsml_demo.ff950ba1.js → hsml_demo.a248689a.js} +2 -2
- package/dist/demo/hsml_demo.a248689a.js.map +1 -0
- package/dist/demo/hsml_demo.eb3b08be.js +2 -0
- package/dist/demo/hsml_demo.eb3b08be.js.map +1 -0
- package/dist/demo/hsml_demo.html +1 -1
- package/dist/demo/http_demo.3e7da3d8.js.map +1 -1
- package/dist/demo/http_demo.8e435f23.js.map +1 -1
- package/dist/demo/i18n_demo.html +1 -1
- package/dist/demo/router_demo.3cfa03aa.js.map +1 -1
- package/dist/demo/router_demo.89ab1681.js.map +1 -1
- package/dist/demo/{validators_demo.252e13a6.js → validators_demo.90ff6001.js} +2 -2
- package/dist/demo/validators_demo.90ff6001.js.map +1 -0
- package/dist/demo/{validators_demo.66893723.js → validators_demo.ef5b2dea.js} +2 -2
- package/dist/demo/validators_demo.ef5b2dea.js.map +1 -0
- package/dist/demo/validators_demo.html +1 -1
- package/dist/encode.js +1 -1
- package/dist/encode.js.map +1 -1
- package/dist/hsml-app.d.ts +38 -37
- package/dist/hsml-app.js +60 -62
- package/dist/hsml-app.js.map +1 -1
- package/dist/hsml-convert.d.ts +3 -3
- package/dist/hsml-convert.js.map +1 -1
- package/dist/hsml-dom.d.ts +2 -2
- package/dist/hsml-dom.js +3 -3
- package/dist/hsml-dom.js.map +1 -1
- package/dist/hsml-h.d.ts +8 -8
- package/dist/hsml-h.js.map +1 -1
- package/dist/hsml-html.d.ts +4 -4
- package/dist/hsml-html.js +2 -2
- package/dist/hsml-html.js.map +1 -1
- package/dist/hsml-idom.d.ts +2 -2
- package/dist/hsml-idom.js +5 -5
- package/dist/hsml-idom.js.map +1 -1
- package/dist/hsml.d.ts +26 -27
- package/dist/hsml.js.map +1 -1
- package/dist/http.js +1 -1
- package/dist/http.js.map +1 -1
- package/dist/router.js +1 -1
- package/dist/router.js.map +1 -1
- package/package.json +8 -8
- package/src/hsml-app.ts +209 -144
- package/src/hsml-convert.ts +8 -8
- package/src/hsml-dom.ts +18 -18
- package/src/hsml-h.ts +10 -10
- package/src/hsml-html.ts +19 -19
- package/src/hsml-idom.ts +25 -25
- package/src/hsml.ts +46 -143
- package/demo/hsml-appc_demo.html +0 -16
- package/demo/hsml-appc_demo.ts +0 -49
- package/dist/demo/hsml-app-form-validation_demo.0b03b743.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.0b03b743.js.map +0 -1
- package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js.map +0 -1
- package/dist/demo/hsml-app-form-validation_demo.d3925067.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.d3925067.js.map +0 -1
- package/dist/demo/hsml-app-form-validation_demo.f757d763.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.f757d763.js.map +0 -1
- package/dist/demo/hsml-app-form_demo.007ffcaa.js +0 -2
- package/dist/demo/hsml-app-form_demo.007ffcaa.js.map +0 -1
- package/dist/demo/hsml-app-form_demo.a034239d.js +0 -2
- package/dist/demo/hsml-app-form_demo.a034239d.js.map +0 -1
- package/dist/demo/hsml-app-test_demo.35c14dc9.js +0 -2
- package/dist/demo/hsml-app-test_demo.35c14dc9.js.map +0 -1
- package/dist/demo/hsml-app-test_demo.3c7e16ae.js +0 -2
- package/dist/demo/hsml-app-test_demo.3c7e16ae.js.map +0 -1
- package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js +0 -2
- package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js.map +0 -1
- package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js +0 -2
- package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js.map +0 -1
- package/dist/demo/hsml-app_demo.87d83c29.js +0 -2
- package/dist/demo/hsml-app_demo.87d83c29.js.map +0 -1
- package/dist/demo/hsml-app_demo.941a13a6.js +0 -2
- package/dist/demo/hsml-app_demo.941a13a6.js.map +0 -1
- package/dist/demo/hsml-appc_demo.0234ff15.js +0 -2
- package/dist/demo/hsml-appc_demo.0234ff15.js.map +0 -1
- package/dist/demo/hsml-appc_demo.f5783031.js +0 -2
- package/dist/demo/hsml-appc_demo.f5783031.js.map +0 -1
- package/dist/demo/hsml-appc_demo.html +0 -1
- package/dist/demo/hsml-appel_demo.0e8a4d4c.js +0 -2
- package/dist/demo/hsml-appel_demo.0e8a4d4c.js.map +0 -1
- package/dist/demo/hsml-appel_demo.1a5c2c26.js +0 -2
- package/dist/demo/hsml-appel_demo.1a5c2c26.js.map +0 -1
- package/dist/demo/hsml-appi_demo.2c3fb511.js +0 -2
- package/dist/demo/hsml-appi_demo.2c3fb511.js.map +0 -1
- package/dist/demo/hsml-appi_demo.427fdebd.js +0 -2
- package/dist/demo/hsml-appi_demo.427fdebd.js.map +0 -1
- package/dist/demo/hsml_demo.33f28c29.js +0 -2
- package/dist/demo/hsml_demo.33f28c29.js.map +0 -1
- package/dist/demo/hsml_demo.ff950ba1.js.map +0 -1
- package/dist/demo/validators_demo.252e13a6.js.map +0 -1
- package/dist/demo/validators_demo.66893723.js.map +0 -1
package/src/hsml.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// HSML tag head format "tag#id.class1.class2~handler"
|
|
2
2
|
|
|
3
|
-
export type HTagHeadName = keyof HTMLElementTagNameMap
|
|
3
|
+
export type HTagHeadName = keyof HTMLElementTagNameMap | `${string}${"-"}${string}`;
|
|
4
4
|
export type HTagHeadAttr = "." | "#" | "~";
|
|
5
5
|
|
|
6
6
|
export type HTagHead<T extends string = string> = `${HTagHeadName}` | `${HTagHeadName}${HTagHeadAttr}${T}`;
|
|
@@ -22,8 +22,6 @@ export type HAttrData = {
|
|
|
22
22
|
| Object;
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
-
export type HAttrOnAction = string;
|
|
26
|
-
|
|
27
25
|
export type HAttrOnDataFnc = (e: Event) => any;
|
|
28
26
|
|
|
29
27
|
export type HAttrOnData =
|
|
@@ -41,25 +39,25 @@ export type HAttrOnData =
|
|
|
41
39
|
|
|
42
40
|
export type HAttrOnCb = [keyof HTMLElementEventMap, EventListener];
|
|
43
41
|
|
|
44
|
-
export type HAttrOnAct = [
|
|
42
|
+
export type HAttrOnAct<HAttrOnActType extends string> = [
|
|
45
43
|
keyof HTMLElementEventMap | string,
|
|
46
|
-
|
|
44
|
+
HAttrOnActType,
|
|
47
45
|
HAttrOnData?
|
|
48
46
|
];
|
|
49
47
|
|
|
50
|
-
export type HAttrOn = HAttrOnCb | HAttrOnAct | Array<HAttrOnCb | HAttrOnAct
|
|
48
|
+
export type HAttrOn<HAttrOnActType extends string> = HAttrOnCb | HAttrOnAct<HAttrOnActType> | Array<HAttrOnCb | HAttrOnAct<HAttrOnActType>>;
|
|
51
49
|
|
|
52
|
-
export interface HTagAttrs {
|
|
50
|
+
export interface HTagAttrs<HAttrOnActType extends string> {
|
|
53
51
|
readonly _id?: string;
|
|
54
52
|
readonly _classes?: string[];
|
|
55
53
|
readonly _ref?: string;
|
|
56
|
-
readonly
|
|
57
|
-
readonly
|
|
58
|
-
readonly
|
|
54
|
+
readonly _hObj?: HObj<HAttrOnActType>;
|
|
55
|
+
readonly key?: string;
|
|
56
|
+
readonly skip?: boolean;
|
|
59
57
|
readonly classes?: HAttrClasses;
|
|
60
58
|
readonly styles?: HAttrStyles;
|
|
61
59
|
readonly data?: HAttrData;
|
|
62
|
-
readonly on?: HAttrOn
|
|
60
|
+
readonly on?: HAttrOn<HAttrOnActType>;
|
|
63
61
|
readonly [key: string]:
|
|
64
62
|
| string
|
|
65
63
|
| String
|
|
@@ -73,24 +71,24 @@ export interface HTagAttrs {
|
|
|
73
71
|
| HAttrClasses
|
|
74
72
|
| HAttrStyles
|
|
75
73
|
// | HsmlAttrData
|
|
76
|
-
| HAttrOn
|
|
74
|
+
| HAttrOn<HAttrOnActType>
|
|
77
75
|
| EventListener
|
|
78
|
-
| HObj
|
|
76
|
+
| HObj<HAttrOnActType>
|
|
79
77
|
| undefined;
|
|
80
78
|
}
|
|
81
79
|
|
|
82
80
|
export type HFnc = (e: Element) => boolean | void;
|
|
83
81
|
|
|
84
|
-
export interface HObj {
|
|
85
|
-
toHsml?(): HElement
|
|
82
|
+
export interface HObj<HAttrOnActType extends string> {
|
|
83
|
+
toHsml?(): HElement<HAttrOnActType>;
|
|
86
84
|
}
|
|
87
85
|
|
|
88
|
-
export interface HElements extends Array<HElement
|
|
86
|
+
export interface HElements<HAttrOnActType extends string> extends Array<HElement<HAttrOnActType>> {}
|
|
89
87
|
|
|
90
|
-
export type HTagChildren =
|
|
91
|
-
| HElements
|
|
88
|
+
export type HTagChildren<HAttrOnActType extends string> =
|
|
89
|
+
| HElements<HAttrOnActType>
|
|
92
90
|
| HFnc
|
|
93
|
-
| HObj
|
|
91
|
+
| HObj<HAttrOnActType>
|
|
94
92
|
| string
|
|
95
93
|
| String
|
|
96
94
|
| boolean
|
|
@@ -101,15 +99,15 @@ export type HTagChildren =
|
|
|
101
99
|
| undefined
|
|
102
100
|
| null;
|
|
103
101
|
|
|
104
|
-
export type HTagNoAttr = [HTagHead, HTagChildren
|
|
105
|
-
export type HTagWithAttr = [HTagHead, HTagAttrs
|
|
102
|
+
export type HTagNoAttr<HAttrOnActType extends string> = [HTagHead, HTagChildren<HAttrOnActType>?];
|
|
103
|
+
export type HTagWithAttr<HAttrOnActType extends string> = [HTagHead, HTagAttrs<HAttrOnActType>, HTagChildren<HAttrOnActType>?];
|
|
106
104
|
|
|
107
|
-
export type HTag = HTagNoAttr | HTagWithAttr
|
|
105
|
+
export type HTag<HAttrOnActType extends string> = HTagNoAttr<HAttrOnActType> | HTagWithAttr<HAttrOnActType>;
|
|
108
106
|
|
|
109
|
-
export type HElement =
|
|
107
|
+
export type HElement<HAttrOnActType extends string> =
|
|
110
108
|
| HFnc
|
|
111
|
-
| HObj
|
|
112
|
-
| HTag
|
|
109
|
+
| HObj<HAttrOnActType>
|
|
110
|
+
| HTag<HAttrOnActType>
|
|
113
111
|
| string
|
|
114
112
|
| String
|
|
115
113
|
| boolean
|
|
@@ -120,24 +118,25 @@ export type HElement =
|
|
|
120
118
|
| undefined
|
|
121
119
|
| null;
|
|
122
120
|
|
|
123
|
-
export interface HHandlerCtx extends HObj {
|
|
121
|
+
export interface HHandlerCtx<HAttrOnActType extends string> extends HObj<HAttrOnActType> {
|
|
124
122
|
refs: { [name: string]: Element };
|
|
125
|
-
actionCb(action:
|
|
123
|
+
actionCb(action: HAttrOnActType, data: HAttrOnData, e: Event): void;
|
|
126
124
|
}
|
|
127
125
|
|
|
128
|
-
export interface HHandler<C extends HHandlerCtx
|
|
129
|
-
open(tag: HTagHeadName, attrs: HTagAttrs
|
|
130
|
-
close(tag: HTagHeadName, children: HElements
|
|
126
|
+
export interface HHandler<HAttrOnActType extends string, C extends HHandlerCtx<HAttrOnActType>> {
|
|
127
|
+
open(tag: HTagHeadName, attrs: HTagAttrs<HAttrOnActType>, children: HElements<HAttrOnActType>, ctx?: C): boolean;
|
|
128
|
+
close(tag: HTagHeadName, children: HElements<HAttrOnActType>, ctx?: C): void;
|
|
131
129
|
text(text: string, ctx?: C): void;
|
|
132
130
|
fnc(fnc: HFnc, ctx?: C): void;
|
|
133
|
-
obj(obj: HObj
|
|
131
|
+
obj(obj: HObj<HAttrOnActType>, ctx?: C): void;
|
|
134
132
|
}
|
|
135
133
|
|
|
136
134
|
export const NBSP = "\u00a0 ";
|
|
137
135
|
|
|
138
|
-
export function hsml<C extends HHandlerCtx
|
|
139
|
-
|
|
140
|
-
|
|
136
|
+
export function hsml<HAttrOnActType extends string, C extends HHandlerCtx<HAttrOnActType>>(
|
|
137
|
+
hml: HElement<HAttrOnActType>,
|
|
138
|
+
handler: HHandler<HAttrOnActType, C>,
|
|
139
|
+
ctx?: C): void {
|
|
141
140
|
// console.log("hsml", hsml);
|
|
142
141
|
if (hml === undefined || hml === null) {
|
|
143
142
|
return;
|
|
@@ -174,7 +173,7 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
|
|
|
174
173
|
// // console.error("hsml parse error:", JSON.stringify(hml, null, 4));
|
|
175
174
|
// // throw Error(`hsml parse error: ${JSON.stringify(hml)}`);
|
|
176
175
|
// }
|
|
177
|
-
hsmlTag(hml as HTag
|
|
176
|
+
hsmlTag(hml as HTag<HAttrOnActType>, handler, ctx);
|
|
178
177
|
break;
|
|
179
178
|
case Function:
|
|
180
179
|
handler.fnc(hml as HFnc, ctx);
|
|
@@ -196,10 +195,10 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
|
|
|
196
195
|
handler.text(ds, ctx);
|
|
197
196
|
break;
|
|
198
197
|
default: // HObj
|
|
199
|
-
handler.obj(hml as HObj
|
|
198
|
+
handler.obj(hml as HObj<HAttrOnActType>, ctx);
|
|
200
199
|
}
|
|
201
200
|
|
|
202
|
-
function hsmlTag(hmlTag: HTag
|
|
201
|
+
function hsmlTag(hmlTag: HTag<HAttrOnActType>, handler: HHandler<HAttrOnActType, C>, ctx?: C): void {
|
|
203
202
|
// console.log("hsml tag", hmlTag);
|
|
204
203
|
|
|
205
204
|
if (typeof hmlTag[0] !== "string") {
|
|
@@ -212,14 +211,14 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
|
|
|
212
211
|
const hasAttrs = attrsObj && attrsObj.constructor === Object;
|
|
213
212
|
const childIdx = hasAttrs ? 2 : 1;
|
|
214
213
|
|
|
215
|
-
let children: HElements = [];
|
|
214
|
+
let children: HElements<HAttrOnActType> = [];
|
|
216
215
|
let hFnc: HFnc | undefined;
|
|
217
|
-
let hObj: HObj | undefined;
|
|
216
|
+
let hObj: HObj<HAttrOnActType> | undefined;
|
|
218
217
|
|
|
219
218
|
const htc = hmlTag[childIdx];
|
|
220
219
|
switch (htc != null && htc.constructor) { // switch ((typeof htc !== "undefined" || htc !== null) && htc.constructor) {
|
|
221
220
|
case Array:
|
|
222
|
-
children = htc as HElements
|
|
221
|
+
children = htc as HElements<HAttrOnActType>;
|
|
223
222
|
break;
|
|
224
223
|
case Function:
|
|
225
224
|
hFnc = htc as HFnc;
|
|
@@ -231,7 +230,7 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
|
|
|
231
230
|
children = [htc as string | boolean | number | Date];
|
|
232
231
|
break;
|
|
233
232
|
default: // HObj
|
|
234
|
-
hObj = htc as HObj
|
|
233
|
+
hObj = htc as HObj<HAttrOnActType>;
|
|
235
234
|
break;
|
|
236
235
|
}
|
|
237
236
|
|
|
@@ -243,11 +242,11 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
|
|
|
243
242
|
const id = hashSplit[1];
|
|
244
243
|
const classes = dotSplit.slice(1);
|
|
245
244
|
|
|
246
|
-
let attrs: HTagAttrs
|
|
245
|
+
let attrs: HTagAttrs<HAttrOnActType>;
|
|
247
246
|
if (hasAttrs) {
|
|
248
|
-
attrs = attrsObj as HTagAttrs
|
|
247
|
+
attrs = attrsObj as HTagAttrs<HAttrOnActType>;
|
|
249
248
|
} else {
|
|
250
|
-
attrs = {} as HTagAttrs
|
|
249
|
+
attrs = {} as HTagAttrs<HAttrOnActType>;
|
|
251
250
|
}
|
|
252
251
|
|
|
253
252
|
if (id) {
|
|
@@ -277,107 +276,11 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
|
|
|
277
276
|
}
|
|
278
277
|
}
|
|
279
278
|
|
|
280
|
-
export function hjoin(hsmls: HElements
|
|
281
|
-
const r = hsmls.reduce<HElements
|
|
279
|
+
export function hjoin<HAttrOnActType extends string>(hsmls: HElements<HAttrOnActType>, sep: string | HElement<HAttrOnActType>): HElements<HAttrOnActType> {
|
|
280
|
+
const r = hsmls.reduce<HElements<HAttrOnActType>>(
|
|
282
281
|
(p, c) => (p.push(c, sep), p),
|
|
283
|
-
[] as HElements
|
|
282
|
+
[] as HElements<HAttrOnActType>
|
|
284
283
|
);
|
|
285
284
|
r.splice(-1);
|
|
286
285
|
return r;
|
|
287
286
|
}
|
|
288
|
-
|
|
289
|
-
// Test
|
|
290
|
-
|
|
291
|
-
// const hsmls: Hsmls = [
|
|
292
|
-
// "text",
|
|
293
|
-
// ["tag", [
|
|
294
|
-
// "d",
|
|
295
|
-
// [""]
|
|
296
|
-
// ]],
|
|
297
|
-
// ["taga", { attr: "attr", classes: ["class"] }, [
|
|
298
|
-
// "text",
|
|
299
|
-
// 123,
|
|
300
|
-
// true
|
|
301
|
-
// ]]
|
|
302
|
-
// ];
|
|
303
|
-
|
|
304
|
-
// const hml: Hsml = ["xxx", {}, [
|
|
305
|
-
// "types", " ", 1235.456, " ", new Date(), " ",
|
|
306
|
-
// ...hsmls,
|
|
307
|
-
// ["t", ["t", "a", ""]],
|
|
308
|
-
// ["t", {}, ["t", "a", ""]],
|
|
309
|
-
// ["t"]
|
|
310
|
-
// ]];
|
|
311
|
-
|
|
312
|
-
// console.log(hsmls, hml);
|
|
313
|
-
|
|
314
|
-
// const hml1: Hsml = ["div", null, [
|
|
315
|
-
// ["span", null, [
|
|
316
|
-
// ["a",
|
|
317
|
-
// {
|
|
318
|
-
// href: "https://gitlab.com/peter-rybar/diasheet",
|
|
319
|
-
// title: "GitLab",
|
|
320
|
-
// target: "_blank"
|
|
321
|
-
// },
|
|
322
|
-
// [["i.fa.fa-gitlab"]]
|
|
323
|
-
// ]
|
|
324
|
-
// ]],
|
|
325
|
-
// ["span"]
|
|
326
|
-
// ]];
|
|
327
|
-
// console.log(hml1);
|
|
328
|
-
|
|
329
|
-
// const hml2: Hsml = ["div", [
|
|
330
|
-
// ["h2", ["title"]],
|
|
331
|
-
// ["div.w3-card-12", [
|
|
332
|
-
// ["header.w3-container w3-light-grey", [
|
|
333
|
-
// ["h3", ["Account: ", "User"]]
|
|
334
|
-
// ]],
|
|
335
|
-
// ["div.w3-container.w3-light-grey", [
|
|
336
|
-
// ["p", ["Balance: 4 DCT"]],
|
|
337
|
-
// ["br"]
|
|
338
|
-
// ]],
|
|
339
|
-
// ["h4", ["Your account spending"]],
|
|
340
|
-
// ["div#piechart"],
|
|
341
|
-
// ["h4", ["Your account balance"]],
|
|
342
|
-
// ["div#linechart"],
|
|
343
|
-
// ["button.w3-button.w3-block.w3-dark-grey", ["Refresh"]]
|
|
344
|
-
// ]],
|
|
345
|
-
// ["br"]
|
|
346
|
-
// ]];
|
|
347
|
-
// console.log(hml2);
|
|
348
|
-
|
|
349
|
-
// TEST
|
|
350
|
-
|
|
351
|
-
// import { hsmls2htmls } from "./hsml-html";
|
|
352
|
-
// import { HDispatch } from "./hsml-app";
|
|
353
|
-
|
|
354
|
-
// const dispatch: HDispatch = (type: string, data?: any, event?: Event): void => {
|
|
355
|
-
// console.log("action:", type, data, event);
|
|
356
|
-
// };
|
|
357
|
-
|
|
358
|
-
// const data = { attr: "action-data" };
|
|
359
|
-
|
|
360
|
-
// const hmls: HElements = [
|
|
361
|
-
// ["button", { on: ["click", "action", data] }, "send"],
|
|
362
|
-
// ["h1", "aaa"],
|
|
363
|
-
// ["input",
|
|
364
|
-
// {
|
|
365
|
-
// type: "text",
|
|
366
|
-
// on: [
|
|
367
|
-
// ["mouseover", "hover-action", data],
|
|
368
|
-
// ["change", "click-action", e => (e.target as HTMLInputElement).value],
|
|
369
|
-
// ["click", e => dispatch("action", data, e)],
|
|
370
|
-
// ],
|
|
371
|
-
// click: e => dispatch("action", data, e)
|
|
372
|
-
// }
|
|
373
|
-
// ],
|
|
374
|
-
// ["button",
|
|
375
|
-
// {
|
|
376
|
-
// on: ["click", e => dispatch("action", data, e)],
|
|
377
|
-
// click: e => dispatch("action", data, e)
|
|
378
|
-
// },
|
|
379
|
-
// ["Send"]
|
|
380
|
-
// ]
|
|
381
|
-
// ];
|
|
382
|
-
|
|
383
|
-
// console.log(hsmls2htmls(hmls, true).join(""));
|
package/demo/hsml-appc_demo.html
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
|
|
4
|
-
<head>
|
|
5
|
-
<meta charset="UTF-8">
|
|
6
|
-
<title>PeRyL hsml app demo</title>
|
|
7
|
-
</head>
|
|
8
|
-
|
|
9
|
-
<body>
|
|
10
|
-
<h1>PeRyL hsml app demo</h1>
|
|
11
|
-
<div id="app"></div>
|
|
12
|
-
<!-- <script src="../incremental-dom/dist/umd/incremental-dom.js"></script> -->
|
|
13
|
-
<script type="module" src="hsml-appc_demo.ts"></script>
|
|
14
|
-
</body>
|
|
15
|
-
|
|
16
|
-
</html>
|
package/demo/hsml-appc_demo.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { HElements } from "../src/hsml";
|
|
2
|
-
import { controllersDdispatcher, happ, HAppAction, HControllers } from "../src/hsml-app";
|
|
3
|
-
|
|
4
|
-
enum Action {
|
|
5
|
-
name = "name"
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
interface State {
|
|
9
|
-
name: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function state(): State {
|
|
13
|
-
return { name: "" };
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function view(state: State): HElements {
|
|
17
|
-
return [
|
|
18
|
-
["h1", "Hello"],
|
|
19
|
-
["input~focus", {
|
|
20
|
-
type: "text",
|
|
21
|
-
placeholder: "name",
|
|
22
|
-
on: ["input", Action.name]
|
|
23
|
-
}],
|
|
24
|
-
["p",
|
|
25
|
-
state.name
|
|
26
|
-
? ["Hello ", ["b", state.name], "!"]
|
|
27
|
-
: "Greeting"
|
|
28
|
-
]
|
|
29
|
-
];
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const controllers: HControllers<State, typeof Action & typeof HAppAction> = {
|
|
33
|
-
// _init: function (data) {
|
|
34
|
-
// console.log(data);
|
|
35
|
-
// },
|
|
36
|
-
_mount: function (data) {
|
|
37
|
-
this.refs["focus"].focus();
|
|
38
|
-
},
|
|
39
|
-
name: function (data) {
|
|
40
|
-
this.state.name = data;
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
// HApp.debug = true;
|
|
45
|
-
// HApp.debug = window.location.hostname === "localhost";
|
|
46
|
-
|
|
47
|
-
const app = happ<State>(state, view, controllersDdispatcher<State, typeof Action>(controllers));
|
|
48
|
-
|
|
49
|
-
(self as any).app = app;
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
!function(){function t(t,e,n,i){Object.defineProperty(t,e,{get:n,set:i,enumerable:!0,configurable:!0})}var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},i={},r=e.parcelRequirede31;null==r&&((r=function(t){if(t in n)return n[t].exports;if(t in i){var e=i[t];delete i[t];var r={id:t,exports:{}};return n[t]=r,e.call(r.exports,r,r.exports),r.exports}var a=new Error("Cannot find module '"+t+"'");throw a.code="MODULE_NOT_FOUND",a}).register=function(t,e){i[t]=e},e.parcelRequirede31=r);var a=r("g7NCG"),o={};t(o,"HAppAction",(function(){return h}),(function(t){return h=t})),t(o,"happ",(function(){return w}),(function(t){return w=t})),t(o,"HApp",(function(){return O}),(function(t){return O=t})),t(o,"happi",(function(){return j}),(function(t){return j=t})),t(o,"happel",(function(){return x}),(function(t){return x=t})),t(o,"controllersDdispatcher",(function(){return _}),(function(t){return _=t}));var s=r("8IJ2T"),l=function(t,e,n,i){return new(n||(n=Promise))((function(r,a){function o(t){try{l(i.next(t))}catch(t){a(t)}}function s(t){try{l(i.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,s)}l((i=i.apply(t,e||[])).next())}))};const d=console.log,u=console.error,c=console.warn;var h,m;(m=h||(h={}))._init="_init",m._mount="_mount",m._umount="_umount",m._element="_element";const p=window.requestAnimationFrame||function(t){window.setTimeout(t,1e3/60)},v=window.cancelAnimationFrame||function(t){window.clearTimeout(t)},b="HApp action:",f="HApp dispatch:",g="HApp render:";function w(t,e,n,i=document.body){return new O(t,e,n,i)}function j(t,e=document.body){const n=new t;return new O(n.state,n.view,n.dispatcher,e)}function x(t,e,n,i,r){customElements.define(t,class extends HTMLElement{static get observedAttributes(){return e}connectedCallback(){this.attachShadow({mode:"open"}),this._happel.mount(this.shadowRoot)}disconnectedCallback(){this._happel.umount()}adoptedCallback(){this._happel.update()}attributeChangedCallback(t,e,n){this._happel.dispatch(h._element,{attrName:t,oldVal:e,newVal:n})}constructor(){super(),this._happel=new O(n,i,r),this._happel.customElement=this}})}function _(t){return function(e){return l(this,void 0,void 0,(function*(){const n=t[e.type];n?n.apply(this,[e.data,e.event]):c("no controller for action",e)}))}}const y="happ";class O{_dispatch(t,e,n){var i;return l(this,void 0,void 0,(function*(){try{yield this.dispatcher({type:t,data:e,event:n},this.state,this.dispatch),null===(i=this._onDispatch)||void 0===i||i.call(this,{type:t,data:e,event:n},this.state,this.dispatch),this.dom&&D(this.dom,y,{type:t,data:e,event:n}),this.customElement&&D(this.customElement,t,e),!this.customElement&&this.dom&&D(this.dom,t,e),this.update()}catch(t){u(f,t)}}))}windowDispatchOn(){this._windowEventListener?c("windowEventListener olready setted"):(this._windowEventListener=t=>{const e=t.detail;this.dispatch(e.type,e.data,t)},window.addEventListener(y,this._windowEventListener))}windowDispatchOff(){this._windowEventListener&&window.removeEventListener(y,this._windowEventListener)}constructor(t,e,n,i=document.body){this.refs={},this.onDispatch=t=>(this._onDispatch=t,this),this.dispatch=(t,e,n)=>l(this,void 0,void 0,(function*(){if(O.debug){d(b,{type:t,data:e,event:n});const i=performance.now();yield this._dispatch(t,e,n);const r=performance.now();d(f,r-i+" ms",this.state)}else yield this._dispatch(t,e,n)})),this.windowDispatch=(t,e,n)=>l(this,void 0,void 0,(function*(){window.dispatchEvent(new CustomEvent(y,{detail:{type:t,data:e}}))})),this.render=()=>{if(O.debug){const t=performance.now();let e;try{e=this.view(this.state)}catch(t){u(g,t)}const n=performance.now();return d(g,n-t+" ms",e),null!=e?e:[]}{let t;try{t=this.view(this.state)}catch(t){u(g,t)}return null!=t?t:[]}},this.actionCb=(t,e,n)=>{void 0===(e=(null==e?void 0:e.constructor)===Function?e(n):e)&&n&&(e=n instanceof CustomEvent?n.detail:function(t){const e=t.target;if("FORM"===e.nodeName){t.preventDefault();const n=e.elements,i={};for(let t=0;t<n.length;t++){const e=q(n[t]);if("object"==typeof e){const r=Object.keys(e);if(r.length){const a=r[0],o=e[a];void 0===i[a]?i[a]=o:"string"==typeof i[a]||i[a]instanceof String?i[a]=o instanceof Array?[i[a],...o]:[i[a],o]:i[a]instanceof Array?o instanceof Array?i[a]=i[a].concat(o):i[a].push(o):i[a]=o instanceof Array?[i[a],...o]:[i[a],o],i[a]instanceof Array&&(i[a]=i[a].filter((t=>null!==t)),"radio"===n[t].type&&(i[a]=i[a].length?i[a][0]:null))}}}return i}return q(e)}(n)),this.dispatch(t,e,n)},this.mount=(t=document.body)=>{var e;const n="string"==typeof t?null!==(e=document.getElementById(t))&&void 0!==e?e:document.body:null!=t?t:document.body;if(n[y]){n[y].umount()}if(!this.dom){this.dom=n,n[y]=this;S(n,this.render(),this),this.dispatch(h._mount,this.dom)}return this},this.umount=()=>{if(this.dom){this.dispatch(h._umount,this.dom),this.dom.hasAttribute(y)&&this.dom.removeAttribute(y);const t=this.dom.querySelectorAll(`[${y}]`);for(let e=0;e<t.length;e++){const n=t[e].happ;null==n||n.umount()}for(;this.dom.firstChild;)this.dom.removeChild(this.dom.firstChild);delete this.dom.happ,this.dom=void 0}return this},this.update=()=>(this.dom&&!this._updateSched&&(this._updateSched=p((()=>{if(this.dom){const t=this.render();S(this.dom,t,this)}this._updateSched=void 0}))),this),this.toHsml=()=>{if(this.dom){if(!this._updateSched)return["div",{_skip:!0}];v(this._updateSched),this._updateSched=void 0}const t=this.render();return t.push((t=>{this.dom||(this.dom=t,t.happ=this,this.dispatch(h._mount,this.dom))})),["div",t]},this.toHtml=()=>this.dom?this.dom.outerHTML:"",this.state=t(),this.view=e,this.dispatcher=null!=n?n:t=>l(this,void 0,void 0,(function*(){return d(b,t.type,t.data)})),this.dispatch(h._init,this).then((()=>this.mount(i)))}}function S(t,e,n){if(O.debug){const i=performance.now();(0,s.hsmls2idomPatch)(t,e,n);const r=performance.now();d("HApp update:",r-i+" ms",t)}else(0,s.hsmls2idomPatch)(t,e,n)}function D(t,e,n){var i,r;null==t||t.dispatchEvent(new CustomEvent(e,{detail:n})),null===(r=(i=t)[`on${e.toLowerCase()}`])||void 0===r||r.call(i,new CustomEvent(e,{detail:n}))}function q(t){let e=null;switch(t.nodeName){case"INPUT":const n=t;switch(n.type){case"text":case"hidden":case"password":case"email":case"number":case"search":case"url":case"tel":case"color":case"date":case"datetime-local":case"month":case"range":case"time":case"week":case"submit":case"button":e=n.name?{[n.name]:n.value}:n.value;break;case"radio":e=n.name?{[n.name]:n.checked?n.value:null}:n.checked?n.value:null;break;case"checkbox":e="on"===n.value?n.name?{[n.name]:n.checked}:n.checked:n.name?{[n.name]:n.checked?String(n.value):null}:n.checked?String(n.value):null}break;case"SELECT":const i=t;if(i.multiple){const t=Array.from(i.selectedOptions).map((t=>t.value));e=i.name?{[i.name]:t}:t}else e=i.name?{[i.name]:i.value}:i.value;break;case"TEXTAREA":const r=t;e=r.name?{[r.name]:r.value}:r.value;break;case"BUTTON":const a=t;e=a.name?{[a.name]:a.value}:a.value}return e}O.debug=!1;const T="required",k="not_in_range",E="invalid_format";class N{validate(t){if("string"==typeof t||null==t){const e=t;this.str=e;const n=this.strToObj(e);if(this.obj=n.obj,n.err)return this.err=n.err,{str:null!=e?e:"",obj:n.obj,err:n.err};const i=this.objCheck(n.obj);return this.err=i,{str:null!=e?e:"",obj:n.obj,err:i}}{this.str=null==t?null:""+t;const e=this.objCheck(t);return this.err=e,{str:this.str,obj:t,err:e}}}format(t,e){var n;const i=this.objToStr(t,e);return{str:null!==(n=i.str)&&void 0!==n?n:"",err:i.err}}constructor(t,e){this.str=null,this.err=null,this.obj=null,this.opts=null!=t?t:{},this.msgs=null!=e?e:{}}}function C(t,e){return Object.keys(e).map((t=>[t,e[t]])).reduce(((t,e)=>t.replace(new RegExp(`\\{\\{${e[0]}\\}\\}`,"g"),String(e[1]))),t)}class A extends N{strToObj(t){const e=this.opts,n=this.msgs;return"required"in e&&e.required&&!t?{obj:null,err:n.required?C(n.required,Object.assign(Object.assign({},e.data),{options:"options"in e?e.options.join(", "):""})):T}:{obj:void 0===t?null:t,err:""}}objCheck(t){if(null==t)return"";const e=this.opts,n=this.msgs;return"options"in e&&t&&-1===e.options.indexOf(t)?n.invalid_option?C(n.invalid_option,Object.assign(Object.assign({},e.data),{option:null===t?"":t,options:"options"in e?e.options.join(", "):""})):"invalid_option":""}objToStr(t,e){return{str:null!=t?t:"",err:""}}constructor(t,e){super(t,e)}}class L extends N{strToObj(t){var e,n,i,r;const a=this.opts,o=this.msgs;return"required"in a&&a.required&&!t?{obj:null,err:o.required?C(o.required,Object.assign(Object.assign({},a.data),{min:"min"in a?""+(null!==(e=a.min)&&void 0!==e?e:""):"",max:"max"in a?""+(null!==(n=a.max)&&void 0!==n?n:""):"",regexp:"regexp"in a?""+(null!==(i=a.regexp)&&void 0!==i?i:""):""})):T}:t?"regexp"in a&&!a.regexp.test(t)?{obj:null,err:o.invalid_format?C(o.invalid_format,Object.assign(Object.assign({},a.data),{regexp:"regexp"in a?""+(null!==(r=a.regexp)&&void 0!==r?r:""):""})):E}:{obj:t,err:""}:{obj:null,err:""}}objCheck(t){var e,n;if(null==t)return"";const i=this.opts,r=this.msgs;let a=!1;return"max"in i&&t.length>i.max&&(a=!0),"min"in i&&t.length<i.min&&(a=!0),"min"in i&&"max"in i&&t.length>i.max&&t.length<i.min&&(a=!0),a?r.not_in_range?C(r.not_in_range,Object.assign(Object.assign({},i.data),{min:"min"in i?""+(null!==(e=i.min)&&void 0!==e?e:""):"",max:"max"in i?""+(null!==(n=i.max)&&void 0!==n?n:""):""})):k:""}objToStr(t,e){return{str:null!=t?t:"",err:""}}constructor(t,e){super(t,e)}}class F extends N{strToObj(t){var e,n,i;const r=this.opts,a=this.msgs;if("required"in r&&r.required&&!t)return{obj:null,err:a.required?C(a.required,Object.assign(Object.assign({},r.data),{min:"min"in r?""+(null!==(e=r.min)&&void 0!==e?e:""):"",max:"max"in r?""+(null!==(n=r.max)&&void 0!==n?n:""):""})):T};if(t){const e=Number(t);let n=!1;if(isNaN(e)&&(n=!0),r.strict&&t!==this.objToStr(e).str&&(n=!0),n){const t=isNaN(e)?1234.45:e;return{obj:isNaN(e)?null:e,err:a.invalid_format?C(a.invalid_format,Object.assign(Object.assign({},r.data),{num:null!==(i=this.objToStr(t).str)&&void 0!==i?i:""})):E}}return{obj:e,err:""}}return{obj:null,err:""}}objCheck(t){var e,n;if(null==t)return"";const i=this.opts,r=this.msgs;let a=!1;return"max"in i&&t>i.max&&(a=!0),"min"in i&&t<i.min&&(a=!0),a?r.not_in_range?C(r.not_in_range,Object.assign(Object.assign({},i.data),{min:"min"in i?""+(null!==(e=i.min)&&void 0!==e?e:""):"",max:"max"in i?""+(null!==(n=i.max)&&void 0!==n?n:""):""})):k:""}objToStr(t,e){let n;return n=null==t?"":"decimals"in this.opts?t.toFixed(this.opts.decimals):String(t),{str:n,err:""}}constructor(t,e){super(t,e)}}const H=t=>t.toLocaleString(),I=t=>t.toLocaleDateString(),R=t=>t.toISOString(),M=t=>new Date(t.toDateString()).toISOString();class V extends N{strToObj(t){var e;const n=this.opts,i=this.msgs;if("required"in n&&n.required&&!t)return{obj:null,err:i.required?C(i.required,Object.assign(Object.assign({},n.data),{min:"min"in n&&n.min?this.dateToStr(n.min):"",max:"max"in n&&n.max?this.dateToStr(n.max):""})):T};if(t){const r=Date.parse(t);let a=new Date(r);n.dateOnly&&(a=new Date(a.getFullYear(),a.getMonth(),a.getDate()));let o=!1;if(isNaN(r)&&(o=!0),o){const t=isNaN(r)?new Date:a;return{obj:isNaN(r)?null:a,err:i.invalid_format?C(i.invalid_format,Object.assign(Object.assign({},n.data),{date:null!==(e=this.objToStr(t).str)&&void 0!==e?e:""})):E}}return{obj:a,err:""}}return{obj:null,err:""}}objCheck(t){if(null==t)return"";const e=this.opts,n=this.msgs;let i=!1;return"max"in e&&e.max&&t.getTime()>e.max.getTime()&&(i=!0),"min"in e&&e.min&&t<e.min&&(i=!0),i?n.not_in_range?C(n.not_in_range,Object.assign(Object.assign({},e.data),{min:"min"in e&&e.min?this.dateToStr(e.min):"",max:"max"in e&&e.max?this.dateToStr(e.max):""})):k:""}objToStr(t,e){return{str:null==t?"":this.dateToStr(t),err:""}}constructor(t,e){super(t,e),(null==t?void 0:t.iso)?this.dateToStr=(null==t?void 0:t.dateOnly)?M:R:this.dateToStr=(null==t?void 0:t.dateOnly)?I:H,(null==t?void 0:t.dateOnly)&&(null==t?void 0:t.min)&&(t.min=new Date(t.min.getFullYear(),t.min.getMonth(),t.min.getDate())),(null==t?void 0:t.dateOnly)&&(null==t?void 0:t.max)&&(t.max=new Date(t.max.getFullYear(),t.max.getMonth(),t.max.getDate()+1))}}class P extends N{strToObj(t){const e=this.opts,n=this.msgs;if("required"in e&&e.required&&!t)return{obj:null,err:n.required?C(n.required,Object.assign({},e.data)):T};let i;switch(t){case"true":case"1":case"on":case"yes":i=!0;break;default:i=!1}return{obj:i,err:""}}objCheck(t){var e;if(null==t)return"";const n=this.opts,i=this.msgs;let r=!1;return"value"in n&&t!==n.value&&(r=!0),r?i.invalid_value?C(i.invalid_value,Object.assign(Object.assign({},n.data),{value:"value"in n?""+(null!==(e=n.value)&&void 0!==e?e:""):""})):"invalid_value":""}objToStr(t,e){return{str:null==t?"":""+t,err:""}}constructor(t,e){super(t,e)}}class U{addValidator(t,e){return this.validators[t]=e,this}validate(t){const e=Object.keys(this.validators).reduce(((e,n)=>{const i=t[n],r=this.validators[n].validate(i);return e.str[n]=r.str,e.obj[n]=r.obj,e.err[n]=r.err,r.err&&(e.valid=!1),e}),{str:{},obj:{},err:{},valid:!0});return this.str=e.str,this.obj=e.obj,this.err=e.err,this.valid=e.valid,this}format(t){const e=Object.keys(this.validators).reduce(((e,n)=>{const i=t[n],r=this.validators[n].format(i);return e.str[n]=r.str,e.obj[n]=i,e.err[n]=r.err,r.err&&(e.valid=!1),e}),{str:{},obj:{},err:{},valid:!0});return this.str=e.str,this.obj=e.obj,this.err=e.err,this.valid=e.valid,this}data(){return{str:this.str,obj:this.obj,err:this.err,valid:this.valid}}constructor(){this.validators={}}}var Y=function(t,e,n,i){return new(n||(n=Promise))((function(r,a){function o(t){try{l(i.next(t))}catch(t){a(t)}}function s(t){try{l(i.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,s)}l((i=i.apply(t,e||[])).next())}))};var $,B;(B=$||($={})).change="form-validation-change",B.submit="form-validation-submit";let J;function z(t){if(!t)return"";if(0===-t.getTimezoneOffset())return t.toISOString();{const e=function(t,e=2){return String(t).padStart(e,"0")};return t.getFullYear()+"-"+e(t.getMonth()+1)+"-"+e(t.getDate())+"T"+e(t.getHours())+":"+e(t.getMinutes())}}(0,o.happ)((function(){return{title:"Form Validation",data:{name:"Ema",born:new Date,children:0,married:!1,gender:"female",sport:"gymnastics"},genders:[{label:"Male",value:"male"},{label:"Female",value:"female"}],sports:["football","gymnastics"]}}),(function(t){return[["div.w3-content",[["h1",t.title],["form.w3-container",{on:[["change",$.change],["submit",$.submit]]},[["p",[["label",["Name",["input.w3-input",{type:"text",name:"name",value:t.validatorData.str.name,on:["input",$.change]}]]]]],["p.w3-text-red",[t.validatorData.err.name]],["p",[["label",["Born",["input.w3-input",{type:"datetime-local",name:"born",value:z(t.validatorData.obj.born)}]]]]],["p.w3-text-red",[t.validatorData.err.born]],["p",[["label",["Children",["input.w3-input",{type:"number",name:"children",value:t.validatorData.str.children}]]]]],["p.w3-text-red",[t.validatorData.err.children]],["p",[["label",[["input.w3-check",{type:"checkbox",name:"married",checked:t.validatorData.obj.married}]," Married"]]]],["p.w3-text-red",[t.validatorData.err.married]],["p",(0,a.hjoin)(t.genders.map((e=>["label",[["input.w3-radio",{type:"radio",name:"gender",value:e.value,checked:t.validatorData.obj.gender===e.value}]," ",e.label]])),["br"])],["p.w3-text-red",[t.validatorData.err.gender]],["p",[["select.w3-select",{name:"sport"},[["option",{value:"",disabled:!0,selected:!0},"Sport"],...t.sports.map((e=>["option",{value:e,selected:e===t.validatorData.obj.sport},e]))]]]],["p.w3-text-red",t.validatorData.err.sport],["button.w3-btn.w3-blue","Submit"]]]]]]}),(function(t,e){return Y(this,void 0,void 0,(function*(){switch(console.log("action",t),t.type){case o.HAppAction._init:n=e,J=(new U).addValidator("name",new L({required:!0,min:3,max:5},{required:"Required {{min}} - {{max}} {{regexp}}",invalid_format:"Invalid format {{regexp}}",not_in_range:"Not in range {{min}} - {{max}}"})).addValidator("born",new V({required:!0,max:new Date,dateOnly:!1,iso:!0},{required:"Required {{min}} - {{max}}",invalid_format:"Invalid format {{date}}",not_in_range:"Not in range {{min}} - {{max}}"})).addValidator("children",new F({required:!0,min:0,max:10},{required:"Required {{min}} - {{max}}",invalid_format:"Invalid format, use format {{num}}",not_in_range:"Not in range {{min}} - {{max}}"})).addValidator("gender",new A({required:!0,options:n.genders.map((t=>t.value))},{required:"Required {{options}}",invalid_option:"Invalod option {{option}} {{options}}"})).addValidator("married",new P({required:!0},{required:"Required",invalid_value:"Invalid value {{value}}"})).addValidator("sport",new A({required:!0,options:n.sports},{required:"Required {{options}}",invalid_option:"Invalod option {{option}} {{options}}"})).format(n.data),e.validatorData=J.data();break;case $.change:J.validate(Object.assign(Object.assign({},e.validatorData.str),t.data)),e.validatorData=J.data(),console.log("obj:",JSON.stringify(e.validatorData,null,4));break;case $.submit:if(t.event.preventDefault(),J.validate(t.data),e.validatorData=J.data(),e.validatorData=J.data(),J.valid){console.log(J),e.data=J.obj;const t=JSON.stringify(e.data,null,4);console.dir(t),alert(`Form submit: \n${t}`)}}var n}))}))}();
|
|
2
|
-
//# sourceMappingURL=hsml-app-form-validation_demo.0b03b743.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/hsml-app.ts","src/validators.ts","demo/hsml-app-form-validation_demo.ts"],"sourcesContent":["import { HAttrOnData, HAttrOnDataFnc, HElement, HElements, HHandlerCtx } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\n\nconst log = console.log;\nconst error = console.error;\nconst warn = console.warn;\n\nexport type HState<STATE> = () => STATE;\nexport type HView<STATE> = (state: STATE) => HElements;\nexport type HView1<STATE> = (state: STATE) => HElement;\n\nexport interface HAction {\n type: string;\n data?: any;\n event?: Event;\n}\n\nexport type HDispatch = (type: HAction[\"type\"],\n data?: HAction[\"data\"],\n event?: HAction[\"event\"]) => Promise<void>;\n\nexport type HUpdate = () => void;\n\nexport type HDispatcher<STATE> = (action: HAction, state: STATE, dispatch: HDispatch) => Promise<void>;\n// export type HDispatcher<STATE> = (this: HApp<STATE>, action: HAction, state: STATE, dispatch: HDispatch) => Promise<void>;\n\nexport enum HAppAction {\n _init = \"_init\",\n _mount = \"_mount\",\n _umount = \"_umount\",\n _element = \"_element\"\n}\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst msgAction = \"HApp action:\";\nconst msgDispatch = \"HApp dispatch:\";\nconst msgRender = \"HApp render:\";\nconst msgUpdate = \"HApp update:\";\n\nexport function happ<STATE>(state: HState<STATE>,\n view: HView<STATE>,\n dispatcher: HDispatcher<STATE>,\n element: Element | string | null = document.body) {\n return new HApp<STATE>(state, view, dispatcher, element);\n}\n\n// HAppI\n\nexport type Class<T = object> = new (...args: any[]) => T;\n\nexport interface HAppI<STATE> {\n state(): STATE;\n view(state: STATE): HElements;\n dispatcher(action: HAction, state: STATE, dispatch: HDispatch): Promise<void>;\n // dispatcher(this: HApp<STATE>, action: HAction, state: STATE, dispatch: HDispatch): Promise<void>;\n}\n\nexport function happi<STATE>(hAppI: Class<HAppI<STATE>>, e: Element | string | null = document.body) {\n const hapi = new hAppI();\n return new HApp<STATE>(hapi.state, hapi.view, hapi.dispatcher, e);\n}\n\n// HAppEl\n\nexport function happel<STATE>(elementName: string,\n elementAttrs: string[],\n state: HState<STATE>,\n view: HView<STATE>,\n dispatcher: HDispatcher<STATE>): void {\n customElements.define(elementName, class HAppElement extends HTMLElement {\n\n static get observedAttributes() {\n return elementAttrs;\n }\n\n private _happel: HApp<STATE>;\n\n constructor() {\n super();\n this._happel = new HApp<STATE>(state, view, dispatcher);\n (this._happel as any).customElement = this;\n }\n\n connectedCallback() {\n // this._happel.mount(this);\n this.attachShadow({ mode: \"open\" });\n this._happel.mount(this.shadowRoot as any);\n }\n\n disconnectedCallback() {\n this._happel.umount();\n }\n\n adoptedCallback() {\n this._happel.update();\n }\n\n attributeChangedCallback(attrName: string, oldVal: string | null, newVal: string | null) {\n this._happel.dispatch(HAppAction._element, { attrName, oldVal, newVal });\n }\n\n });\n}\n\n// HAppC\n\nexport type HController<State> = (this: HApp<State>,\n data?: HAction[\"data\"],\n event?: HAction[\"event\"]) => void;\n\nexport type HControllers<State, TypeofActionEnum> = { [actionType in keyof TypeofActionEnum]?: HController<State>; };\n\nexport function controllersDdispatcher<State, TyopeofActionEnum>(controllers: HControllers<State, TyopeofActionEnum>): HDispatcher<State> {\n return async function (this: HApp<State>, action) {\n const controller = controllers[action.type as keyof TyopeofActionEnum];\n if (controller) {\n controller.apply<HApp<State>, [any?, Event?], void>(this, [action.data, action.event]);\n } else {\n warn(\"no controller for action\", action);\n }\n };\n}\n\nconst HAPP = \"happ\";\n\nexport class HApp<STATE> implements HHandlerCtx {\n\n static debug = false;\n\n readonly state: STATE;\n readonly view: HView<STATE>;\n readonly dispatcher: HDispatcher<STATE>;\n\n readonly customElement?: HTMLElement; // happ custom html element\n\n readonly dom?: HTMLElement;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n private _updateSched?: number;\n\n private _onDispatch?: HDispatcher<STATE>;\n\n private _windowEventListener?: (event: Event) => void;\n\n constructor(state: HState<STATE>, view: HView<STATE>, dispatcher?: HDispatcher<STATE>, e: Element | string | null = document.body) {\n this.state = state();\n this.view = view;\n this.dispatcher = dispatcher ?? (async (a) => log(msgAction, a.type, a.data));\n this.dispatch(HAppAction._init, this).then(() => this.mount(e));\n }\n\n private async _dispatch(type: string, data: any, event: Event | undefined) {\n try {\n await this.dispatcher({ type, data, event }, this.state, this.dispatch);\n this._onDispatch?.({ type, data, event }, this.state, this.dispatch);\n this.dom && elementDispatchCustomEvent(this.dom, HAPP, { type, data, event });\n this.customElement && elementDispatchCustomEvent(this.customElement, type, data);\n !this.customElement && this.dom && elementDispatchCustomEvent(this.dom, type, data);\n this.update();\n } catch (e) {\n error(msgDispatch, e);\n }\n }\n\n onDispatch = (dispatcher: HDispatcher<STATE>): this => {\n this._onDispatch = dispatcher;\n return this;\n }\n\n dispatch: HDispatch = async (type: string, data?: any, event?: Event): Promise<void> => {\n if (HApp.debug) {\n log(msgAction, { type, data, event });\n const t0 = performance.now();\n await this._dispatch(type, data, event);\n const t1 = performance.now();\n log(msgDispatch, `${t1 - t0} ms`, this.state);\n } else {\n await this._dispatch(type, data, event);\n }\n }\n\n windowDispatch: HDispatch = async (type: string, data?: any, event?: Event): Promise<void> => {\n window.dispatchEvent(new CustomEvent(HAPP, { detail: { type, data } }));\n }\n\n windowDispatchOn() {\n if (!this._windowEventListener) {\n this._windowEventListener = (event: Event) => {\n const action = (event as CustomEvent).detail as HAction;\n this.dispatch(action.type, action.data, event);\n };\n window.addEventListener(HAPP, this._windowEventListener);\n } else {\n warn(\"windowEventListener olready setted\");\n }\n }\n\n windowDispatchOff() {\n if (this._windowEventListener) {\n window.removeEventListener(HAPP, this._windowEventListener);\n }\n }\n\n render = (): HElements => {\n if (HApp.debug) {\n const t0 = performance.now();\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(msgRender, e);\n }\n const t1 = performance.now();\n log(msgRender, `${t1 - t0} ms`, hsmls);\n return hsmls ?? [];\n } else {\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(msgRender, e);\n }\n return hsmls ?? [];\n }\n }\n\n actionCb = (action: string, data: HAttrOnData, event: Event): void => {\n data = (data?.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n if (event instanceof CustomEvent) {\n data = event.detail;\n } else {\n data = formData(event);\n }\n }\n this.dispatch(action, data, event);\n }\n\n mount = (e: Element | string | null = document.body): this => {\n const el = (typeof e === \"string\")\n ? document.getElementById(e) ?? document.body\n : e ?? document.body;\n if ((el as any)[HAPP]) {\n const a = (el as any)[HAPP] as HApp<STATE>;\n a.umount();\n }\n if (!this.dom) {\n (this as any).dom = el;\n (el as any)[HAPP] = this;\n const hsmls = (this as any).render();\n updateDom(el, hsmls, this);\n this.dispatch(HAppAction._mount, this.dom);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.dom) {\n this.dispatch(HAppAction._umount, this.dom);\n if (this.dom.hasAttribute(HAPP)) {\n this.dom.removeAttribute(HAPP);\n }\n const aNodes = this.dom.querySelectorAll(`[${HAPP}]`);\n for (let i = 0; i < aNodes.length; i++) {\n const a = (aNodes[i] as any).happ as HApp<STATE>;\n a?.umount();\n }\n while (this.dom.firstChild /*.hasChildNodes()*/) {\n this.dom.removeChild(this.dom.firstChild);\n }\n delete (this.dom as any).happ;\n (this as any).dom = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.dom && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.dom) {\n const hsmls = this.render();\n updateDom(this.dom, hsmls, this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml = (): HElement => {\n if (this.dom) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return [\"div\", { _skip: true }];\n }\n }\n const hsmls = this.render();\n hsmls.push(\n (e: Element) => {\n if (!this.dom) {\n (this as any).dom = e;\n (e as any).happ = this;\n this.dispatch(HAppAction._mount, this.dom);\n }\n });\n return [\"div\", hsmls];\n }\n\n toHtml = (): string => {\n return this.dom ? this.dom.outerHTML : \"\";\n }\n\n}\n\nfunction updateDom(el: Element, hsml: HElements, ctx: HHandlerCtx): void {\n if (HApp.debug) {\n const t0 = performance.now();\n hsmls2idomPatch(el, hsml, ctx);\n const t1 = performance.now();\n log(msgUpdate, `${t1 - t0} ms`, el);\n } else {\n hsmls2idomPatch(el, hsml, ctx);\n }\n}\n\nfunction elementDispatchCustomEvent(el: HTMLElement, type: string, data: any) {\n el?.dispatchEvent(new CustomEvent(type, { detail: data }));\n (el as any)[`on${type.toLowerCase()}`]?.(new CustomEvent(type, { detail: data }));\n}\n\nfunction formData(e: Event): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n const el = e.target as HTMLElement;\n switch (el.nodeName) {\n case \"FORM\":\n (e as Event).preventDefault();\n const els = (el as HTMLFormElement).elements;\n const data = {} as { [k: string]: string | null | Array<string | null> };\n for (let i = 0; i < els.length; i++) {\n const d = formInputData(els[i]);\n if (typeof d === \"object\") {\n const names = Object.keys(d as object);\n if (names.length) {\n const name = names[0];\n const value = (d as any)[name];\n if (data[name] === undefined) {\n data[name] = value;\n } else if (typeof data[name] === \"string\" || data[name] instanceof String) {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value as string];\n }\n } else if (data[name] instanceof Array) {\n if (value instanceof Array) {\n data[name] = (data[name] as Array<string | null>).concat(value);\n } else {\n (data[name] as Array<string | null>).push(value);\n }\n } else {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value];\n }\n }\n if (data[name] instanceof Array) {\n data[name] = (data[name] as Array<string | null>)\n .filter(d => d !== null);\n if ((els[i] as HTMLInputElement).type === \"radio\") {\n data[name] = (data[name] as Array<string | null>).length\n ? (data[name] as Array<string | null>)[0]\n : null;\n }\n }\n }\n }\n }\n return data;\n default:\n return formInputData(el);\n }\n}\n\nfunction formInputData(el: Element): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n let data: { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> = null;\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = el as HTMLInputElement;\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n if (iel.name) {\n data = { [iel.name]: iel.value };\n } else {\n data = iel.value;\n }\n break;\n case \"radio\":\n if (iel.name) {\n data = { [iel.name]: iel.checked ? iel.value : null };\n } else {\n data = iel.checked ? iel.value : null;\n }\n break;\n case \"checkbox\":\n if (iel.value === \"on\") { // value not set in element\n if (iel.name) {\n data = { [iel.name]: iel.checked };\n } else {\n data = iel.checked;\n }\n } else {\n if (iel.name) {\n data = { [iel.name]: iel.checked\n ? String(iel.value)\n : null };\n } else {\n data = iel.checked\n ? String(iel.value)\n : null;\n }\n }\n break;\n }\n break;\n case \"SELECT\":\n const sel = el as HTMLSelectElement;\n if (sel.multiple) {\n const values = Array.from(sel.selectedOptions).map(o => o.value);\n if (sel.name) {\n data = { [sel.name]: values };\n } else {\n data = values;\n }\n } else {\n if (sel.name) {\n data = { [sel.name]: sel.value };\n } else {\n data = sel.value;\n }\n }\n break;\n case \"TEXTAREA\":\n const tel = el as HTMLTextAreaElement;\n if (tel.name) {\n data = { [tel.name]: tel.value };\n } else {\n data = tel.value;\n }\n break;\n case \"BUTTON\":\n const bel = el as HTMLButtonElement;\n if (bel.name) {\n data = { [bel.name]: bel.value };\n } else {\n data = bel.value;\n }\n break;\n }\n return data;\n}\n\n// export const formInputData = <STATE>(dispatcher: Actions<STATE>): Actions<STATE> =>\n// (app: App<STATE>, action: string | number, data?: any, event?: Event): void => {\n// if (data === undefined && event) {\n// data = inputEventData(event);\n// }\n// dispatcher(app, action, data, event);\n// };\n\n// // Decorator\n// export function FormInputData() {\n// return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n// const method = descriptor.value;\n// descriptor.value = formInputData(method);\n// return descriptor;\n// };\n// }\n","const requiredMsg = \"required\";\nconst notInRangeMsg = \"not_in_range\";\nconst invalidFormatMsg = \"invalid_format\";\nconst invalidOptionMsg = \"invalid_option\";\nconst invalidValueMsg = \"invalid_value\";\n\n// name@doamin.net\nexport const emailRegex = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n\n// +421901123456 or +421 901 123 456 or +421-901-123-456 or 901123456 or 901 123 456 or 901-123-456\nexport const phoneRgex = /^(((00)([- ]?)|\\+)(\\d{1,3})([- ]?))?((\\d{3})([- ]?))((\\d{3})([- ]?))(\\d{3})$/;\n\n// 123 45 or 12345\nexport const pscRgex = /^\\d{3} ?\\d{2}$/;\n\n// 450115/8346\nexport const rodneCisloRgex = /^\\s*(\\d\\d)(\\d\\d)(\\d\\d)[ /]*(\\d\\d\\d)(\\d?)\\s*$/;\n\nexport abstract class Validator<TYPE, OPTS, MSGS> {\n\n readonly opts: OPTS;\n readonly msgs: MSGS;\n\n readonly str: string | null = null;\n readonly err: string | null = null;\n readonly obj: TYPE | null = null;\n\n constructor(opts?: OPTS, msgs?: MSGS) {\n this.opts = opts ?? {} as OPTS;\n this.msgs = msgs ?? {} as MSGS;\n }\n\n protected abstract strToObj(str?: string | null): { obj: TYPE | null, err: string };\n\n protected abstract objCheck(obj?: TYPE | null): string;\n\n protected abstract objToStr(obj?: TYPE | null,\n format?: string): { str: string, err: string };\n\n validate(value?: string | TYPE): { str?: string | null, obj?: TYPE | null, err: string } {\n if (typeof value === \"string\" || value === undefined || value === null) {\n const v = value as string | null | undefined;\n (this.str as any) = v;\n const sto = this.strToObj(v);\n (this.obj as any) = sto.obj;\n if (sto.err) {\n (this.err as any) = sto.err;\n return {\n str: v ?? \"\",\n obj: sto.obj,\n err: sto.err\n };\n }\n const err = this.objCheck(sto.obj);\n (this.err as any) = err;\n return {\n str: v ?? \"\",\n obj: sto.obj,\n err\n };\n } else {\n (this.str as any) = (value === undefined || value === null) ? null : (\"\" + value);\n const err = this.objCheck(value);\n (this.err as any) = err;\n return {\n str: this.str,\n obj: value,\n err\n };\n }\n }\n\n format(obj?: TYPE | null, format?: string): { str: string, err: string } {\n // const err = this.objCheck(obj);\n const ots = this.objToStr(obj, format);\n return {\n str: ots.str ?? \"\",\n // err: ots.err ? ots.err : err\n err: ots.err\n };\n }\n\n}\n\nexport function tpl(tmpl: string, data: { [k: string]: any }): string {\n return Object.keys(data)\n .map(k => [k, data[k]])\n .reduce((t, d) =>\n t.replace(new RegExp(`\\\\{\\\\{${d[0]}\\\\}\\\\}`, \"g\"), String(d[1])), tmpl);\n}\n\nexport interface ValidatorDataOpts {\n data?: { [key: string]: any };\n}\n\nexport interface SelectValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n options?: string[];\n}\n\nexport interface SelectValidatorMsgs {\n required?: string;\n invalid_option?: string;\n}\n\nexport class SelectValidator\n extends Validator<string, SelectValidatorOpts, SelectValidatorMsgs> {\n\n constructor(opts?: SelectValidatorOpts, msgs?: SelectValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: string | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n options: (\"options\" in opts)\n ? opts.options!.join(\", \")\n : \"\"\n })\n : requiredMsg\n };\n }\n }\n return {\n obj: str === undefined ? null : str,\n err: \"\"\n };\n }\n\n protected objCheck(obj?: string | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"options\" in opts) {\n if (obj && opts.options!.indexOf(obj) === -1) {\n return msgs.invalid_option\n ? tpl(msgs.invalid_option,\n {\n ...opts.data,\n option: obj === null ? \"\" : obj,\n options: (\"options\" in opts)\n ? opts.options!.join(\", \")\n : \"\"\n })\n : invalidOptionMsg;\n }\n }\n return \"\";\n }\n\n protected objToStr(obj?: string | null,\n format?: string): { str: string, err: string } {\n return { str: obj ?? \"\", err: \"\" };\n }\n\n}\n\nexport interface StringValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: number;\n max?: number;\n regexp?: RegExp;\n}\n\nexport interface StringValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nexport class StringValidator\n extends Validator<string, StringValidatorOpts, StringValidatorMsgs> {\n\n constructor(opts?: StringValidatorOpts, msgs?: StringValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: string | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min ?? \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max ?? \"\")) : \"\",\n regexp: (\"regexp\" in opts)\n ? (\"\" + (opts.regexp ?? \"\"))\n : \"\"\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n if (\"regexp\" in opts) {\n if (!opts.regexp!.test(str)) {\n return {\n obj: null,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n regexp: (\"regexp\" in opts)\n ? (\"\" + (opts.regexp ?? \"\"))\n : \"\"\n })\n : invalidFormatMsg\n };\n }\n }\n return { obj: str , err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: string | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (obj.length > opts.max!) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (obj.length < opts.min!) {\n err = true;\n }\n }\n if ((\"min\" in opts) && (\"max\" in opts)) {\n if (obj.length > opts.max! && obj.length < opts.min!) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min ?? \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max ?? \"\")) : \"\",\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: string | null,\n format?: string): { str: string, err: string } {\n return { str: obj ?? \"\", err: \"\" };\n }\n\n}\n\nexport interface NumberValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: number;\n max?: number;\n strict?: boolean;\n decimals?: number;\n}\n\nexport interface NumberValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nexport class NumberValidator\n extends Validator<number, NumberValidatorOpts, NumberValidatorMsgs> {\n\n constructor(opts?: NumberValidatorOpts, msgs?: NumberValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: number | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min ?? \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max ?? \"\")) : \"\",\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n const n = Number(str);\n let err: boolean = false;\n if (isNaN(n)) {\n err = true;\n }\n if (opts.strict && (str !== this.objToStr(n).str)) {\n err = true;\n }\n if (err) {\n const num = isNaN(n) ? 1234.45 : n;\n return {\n obj: isNaN(n) ? null : n,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n num: this.objToStr(num).str ?? \"\"\n })\n : invalidFormatMsg\n };\n }\n return { obj: n, err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: number | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (obj > opts.max!) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (obj < opts.min!) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min ?? \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max ?? \"\")) : \"\",\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: number | null,\n format?: string): { str: string, err: string } {\n let str;\n if (obj === undefined || obj === null) {\n str = \"\";\n } else {\n if (\"decimals\" in this.opts) {\n str = obj.toFixed(this.opts.decimals);\n } else {\n str = String(obj);\n }\n }\n return {\n str,\n err: \"\"\n };\n }\n\n}\n\nexport interface DateValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: Date;\n max?: Date;\n dateOnly?: boolean;\n iso?: boolean;\n // strict?: boolean;\n\n}\n\nexport interface DateValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nconst dateToLocaleString = (date: Date) => date.toLocaleString();\nconst dateToLocaleDateString = (date: Date) => date.toLocaleDateString();\n\nconst dateToIsoString = (date: Date) => date.toISOString();\nconst dateToIsoDateString = (date: Date) => new Date(date.toDateString()).toISOString();\n\nexport class DateValidator\n extends Validator<Date, DateValidatorOpts, DateValidatorMsgs> {\n\n dateToStr: (date: Date) => string;\n\n constructor(opts?: DateValidatorOpts, msgs?: DateValidatorMsgs) {\n super(opts, msgs);\n if (opts?.iso) {\n this.dateToStr = opts?.dateOnly ? dateToIsoDateString : dateToIsoString;\n } else {\n this.dateToStr = opts?.dateOnly ? dateToLocaleDateString : dateToLocaleString;\n }\n if (opts?.dateOnly && opts?.min) {\n opts.min = new Date(opts.min.getFullYear(), opts.min.getMonth(), opts.min.getDate());\n }\n if (opts?.dateOnly && opts?.max) {\n opts.max = new Date(opts.max.getFullYear(), opts.max.getMonth(), opts.max.getDate() + 1);\n }\n }\n\n protected strToObj(str?: string | null): { obj: Date | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts && opts.min) ? this.dateToStr(opts.min) : \"\",\n max: (\"max\" in opts && opts.max) ? this.dateToStr(opts.max) : \"\"\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n const dt = Date.parse(str);\n let d = new Date(dt);\n if (opts.dateOnly) {\n d = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n }\n let err: boolean = false;\n if (isNaN(dt)) {\n err = true;\n }\n // if (opts.strict && (str !== this.objToStr(d).str)) {\n // err = true;\n // }\n if (err) {\n const date = isNaN(dt) ? new Date() : d;\n return {\n obj: isNaN(dt) ? null : d,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n date: this.objToStr(date).str ?? \"\"\n })\n : invalidFormatMsg\n };\n }\n return { obj: d, err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: Date | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (opts.max && obj.getTime() > opts.max.getTime()) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (opts.min && obj < opts.min) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts && opts.min) ? this.dateToStr(opts.min) : \"\",\n max: (\"max\" in opts && opts.max) ? this.dateToStr(opts.max) : \"\"\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: Date | null,\n format?: string): { str: string, err: string } {\n return {\n str: (obj === undefined || obj === null) ? \"\" : this.dateToStr(obj),\n err: \"\"\n };\n }\n\n}\n\nexport interface BooleanValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n value?: boolean;\n}\n\nexport interface BooleanValidatorMsgs {\n required?: string;\n invalid_value?: string;\n}\n\nexport class BooleanValidator\n extends Validator<boolean, BooleanValidatorOpts, BooleanValidatorMsgs> {\n\n constructor(opts?: BooleanValidatorOpts, msgs?: BooleanValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: boolean | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data\n })\n : requiredMsg\n };\n }\n }\n let b;\n switch (str) {\n case \"true\":\n case \"1\":\n case \"on\":\n case \"yes\":\n b = true;\n break;\n default:\n b = false;\n }\n return { obj: b, err: \"\" };\n }\n\n protected objCheck(obj?: boolean | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err = false;\n if (\"value\" in opts) {\n if (obj !== opts.value) {\n err = true;\n }\n }\n if (err) {\n return msgs.invalid_value\n ? tpl(msgs.invalid_value,\n {\n ...opts.data,\n value: (\"value\" in opts) ? (\"\" + (opts.value ?? \"\")) : \"\",\n })\n : invalidValueMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: boolean | null,\n format?: string): { str: string, err: string } {\n return {\n str: (obj === undefined || obj === null) ? \"\" : (\"\" + obj),\n err: \"\"\n };\n }\n\n}\n\ntype FormValidators<TYPE> = { [key in keyof TYPE]: Validator<any, any, any> };\n\nexport type Str<TYPE> = { [key in keyof TYPE]: string };\nexport type Obj<TYPE> = { [key in keyof TYPE]: any };\nexport type Err<TYPE> = { [key in keyof TYPE]: string };\n\nexport interface FormValidatorData<TYPE> {\n str: Str<TYPE>;\n obj: Obj<TYPE>;\n err: Err<TYPE>;\n valid: boolean;\n}\n\nexport class FormValidator<TYPE extends { [key: string]: any }> {\n\n readonly validators: FormValidators<TYPE> = {} as FormValidators<TYPE>;\n\n readonly str?: Str<TYPE>;\n readonly obj?: Obj<TYPE>;\n readonly err?: Err<TYPE>;\n\n readonly valid?: boolean;\n\n addValidator(field: keyof TYPE, validator: Validator<any, any, any>): this {\n this.validators[field] = validator;\n return this;\n }\n\n validate(data: { [key in keyof TYPE]?: string }): this {\n const res = Object.keys(this.validators)\n .reduce(\n (a, k) => {\n const v = (data as any)[k];\n const r = (this.validators as any)[k].validate(v);\n (a.str as any)[k] = r.str;\n (a.obj as any)[k] = r.obj;\n (a.err as any)[k] = r.err;\n r.err && (a.valid = false);\n return a;\n },\n { str: {}, obj: {}, err: {}, valid: true });\n (this.str as any) = res.str;\n (this.obj as any) = res.obj;\n (this.err as any) = res.err;\n (this.valid as any) = res.valid;\n return this;\n }\n\n format(data: { [key in keyof TYPE]: any }): this {\n const res = Object.keys(this.validators)\n .reduce(\n (a, k) => {\n const v = (data as any)[k];\n const r = (this.validators as any)[k].format(v);\n (a.str as any)[k] = r.str;\n (a.obj as any)[k] = v;\n (a.err as any)[k] = r.err;\n r.err && (a.valid = false);\n return a;\n },\n { str: {}, obj: {}, err: {}, valid: true });\n (this.str as any) = res.str;\n (this.obj as any) = res.obj;\n (this.err as any) = res.err;\n (this.valid as any) = res.valid;\n return this;\n }\n\n data(): FormValidatorData<TYPE> {\n return {\n str: this.str!,\n obj: this.obj!,\n err: this.err!,\n valid: this.valid!\n };\n }\n\n}\n\n\n// TEST\n\n// const sv = new StringValidator(\n// {\n// required: true,\n// min: 3,\n// max: 5,\n// // regexp: /^[0123]+$/\n// data: {\n// xxx: \"xXx\"\n// }\n// },\n// {\n// required: \"required {{min}} {{max}} {{regexp}}\",\n// invalid_format: \"invalid_format {{regexp}}\",\n// not_in_range: \"not_in_range {{min}} {{max}} | data.xxx={{xxx}}\"\n// });\n\n// [\n// \"x1234\",\n// \"x1234y\",\n// \"xy\"\n// ].forEach(v => {\n// console.log();\n// console.log(v);\n// const r = sv.validate(v);\n// console.log(r);\n// if (r.obj) {\n// const f = sv.format(r.obj);\n// console.log(f);\n// }\n// });\n\n// console.log();\n\n// const nv = new NumberValidator(\n// {\n// required: true,\n// min: 3,\n// max: 500000,\n// decimals: 2,\n// strict: true\n// },\n// {\n// required: \"required {{min}} {{max}}\",\n// invalid_format: \"invalid_format {{num}}\",\n// not_in_range: \"not_in_range {{min}} {{max}}\"\n// });\n\n// console.log(nv.format(undefined));\n// console.log(nv.format(12345.6789));\n\n// console.log(nv.validate(\"12345.6789\"));\n// console.log(nv.validate(\"12345,6789\"));\n// console.log(nv.validate(\"12,345.6789\"));\n\n// const dv = new DateValidator(\n// {\n// required: false,\n// // min: new Date(),\n// max: new Date(),\n// clearTime: false\n// // strict: true\n// },\n// {\n// required: \"required {{min}} {{max}}\",\n// invalid_format: \"invalid_format {{date}}\",\n// not_in_range: \"not_in_range {{min}} {{max}}\"\n// });\n\n// console.log(dv.opts);\n\n// console.log(dv.format(undefined));\n\n// console.log(dv.format(new Date));\n\n// console.log(dv.validate(\"9/17/2020, 10:46:07 AM\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"9/17/2020\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"2020-09-17T08:46:07.000Z\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"\"));\n// console.log(dv.format(dv.obj).str);\n\n// console.log(new Date().toString());\n// console.log(new Date().toDateString());\n// console.log(new Date().toTimeString());\n// console.log(new Date().toLocaleString());\n// console.log(new Date().toLocaleDateString());\n// console.log(new Date().toLocaleTimeString());\n// console.log();\n// console.log(new Date(Date.parse(new Date().toString())));\n// console.log(new Date(Date.parse(new Date().toDateString())));\n// console.log(new Date(Date.parse(new Date().toTimeString())));\n// console.log(new Date(Date.parse(new Date().toLocaleString())));\n// console.log(new Date(Date.parse(new Date().toLocaleDateString())));\n// console.log(new Date(Date.parse(new Date().toLocaleTimeString())));\n\n// const formData = { str: \"123a\", num: \"123456.789\", date: \"9/17/2020, 10:46:07 AM\" };\n// const formData = { str: \"\", num: \"\", date: \"\" };\n// const formData = { str: undefined, num: undefined, date: undefined };\n\n// const fv = new FormValidator<typeof formData>()\n// .addValidator(\"str\", sv)\n// .addValidator(\"num\", nv)\n// .addValidator(\"date\", dv)\n// .validate(formData);\n\n// console.log(fv.data());\n\n// fv.format(fv.obj!);\n// console.log(fv);\n\n// const ovData = { str: \"123a\", num: \"123.45\", date: \"02.01.2019 12:12\" };\n\n// const ov = new ObjectValidator<typeof ovData>()\n// .addValidator(\"str\", sv)\n// .addValidator(\"num\", nv)\n// // .addValidator(\"date\", dv)\n// .validate(ovData);\n\n// // console.log(ov);\n\n// ov.format(ov.obj!);\n// console.log(ov);\n\n// console.log();\n\n// interface ReportFormData {\n// spz: string;\n// tachometer: string;\n// dateCreated: string;\n// user: {\n// // name: string[];\n// email: string;\n// };\n// }\n\n// const dov = new ObjectValidator<ReportFormData>()\n// .addValidator(\"spz\", new StringValidator({ required: true }))\n// .addValidator(\"tachometer\", new NumberValidator({ required: true, min: 1 } ))\n// .addValidator(\"dateCreated\", new StringValidator({ required: true }))\n// .addValidator(\"user\", new ObjectValidator<ReportFormData[\"user\"]>()\n// .addValidator(\"email\", new StringValidator({ required: true}))\n// // .addValidator(\"name\", { })\n// // new ArrayValidator({\n// // required: true,\n// // validator: new StringValidator({ required: true })\n// // })\n// );\n\n// dov.validate(\n// {\n// spz: \"dasdas\",\n// tachometer: \"111222\",\n// // dateCreated: \"10.02.2019\",\n// user: {\n// // email: \"dsafasdf\",\n// }\n// },\n// {\n// dateCreated: \"01.03.2011\",\n// spz: \"32ds9f0f\",\n// tachometer: \"3213214214\",\n// user: {\n// email: \"sadmaskdmk2@dsadsamkl.com\"\n// }\n// });\n\n// const avn = new ArrayValidator<number>(new NumberValidator());\n// const rn = avn.validate([345, 123]);\n// console.log(rn);\n\n\n// interface D {\n// a: number;\n// b?: string;\n// }\n\n// const av = new ArrayValidator<T>(new ObjectValidator<T>()\n// .addValidator(\"a\", new NumberValidator())\n// .addValidator(\"b\", new StringValidator({ required: true }))\n// );\n\n// const d: D[] = [\n// { a: 123, b: \"text\" },\n// // { a: 5.6, b: \"\" },\n// { a: 5.6 }\n// ];\n\n// const r = av.validate(d);\n// console.log(r);\n\n// const ro = new ObjectValidator<T>()\n// .addValidator(\"a\", new NumberValidator())\n// .addValidator(\"b\", new StringValidator({ required: true }))\n// .validate({\n// a: \"5.6\",\n// b: undefined\n// // b: \"text\"\n// });\n// console.log(\"---\", ro);\n\n// const v = new StringValidator({ required: true });\n// const str = undefined;\n// const sr = v.validate(str!);\n// console.log(sr);\n\n// const v = new StringValidator({ required: true, min: 8 });\n// const str = \"\";\n// const sr = v.format(str);\n// console.log(sr, v);\n","import { HElement, HElements, hjoin } from \"../src/hsml\";\nimport { HAppAction, HDispatcher, HState, HView } from \"../src/hsml-app\";\nimport { BooleanValidator, DateValidator, FormValidator, FormValidatorData, NumberValidator, SelectValidator, StringValidator } from \"../src/validators\";\nimport { happ } from \"../src/hsml-app\";\n\nexport interface FormValidationData {\n name: string;\n born: Date;\n children: number;\n married: boolean;\n gender: string;\n sport: string;\n}\n\nexport interface FormValidationState {\n title: string;\n data: FormValidationData;\n genders: {\n label: string;\n value: string;\n }[];\n sports: string[];\n validatorData?: FormValidatorData<FormValidationData>;\n}\n\nexport const formValidationState: HState<FormValidationState> = function () {\n return {\n title: \"Form Validation\",\n data: {\n name: \"Ema\",\n born: new Date(),\n children: 0,\n married: false,\n gender: \"female\",\n sport: \"gymnastics\"\n },\n genders: [\n { label: \"Male\", value: \"male\" },\n { label: \"Female\", value: \"female\" }\n ],\n sports: [\"football\", \"gymnastics\"]\n }\n};\n\nexport enum FormValidationAction {\n change = \"form-validation-change\",\n submit = \"form-validation-submit\"\n}\n\nexport const formValidationView: HView<FormValidationState> = function (state): HElements {\n return [\n [\"div.w3-content\", [\n [\"h1\", state.title],\n [\"form.w3-container\",\n {\n on: [\n [\"change\", FormValidationAction.change],\n [\"submit\", FormValidationAction.submit]\n ]\n },\n [\n [\"p\", [\n [\"label\", [\"Name\",\n [\"input.w3-input\", {\n type: \"text\",\n name: \"name\",\n value: state.validatorData!.str.name,\n on: [\"input\", FormValidationAction.change]\n }]\n ]]\n ]],\n [\"p.w3-text-red\", [state.validatorData!.err.name]],\n [\"p\", [\n [\"label\", [\"Born\",\n [\"input.w3-input\", {\n type: \"datetime-local\",\n name: \"born\",\n // placeholder: new DateValidator().format(new Date()).str,\n value: datetimeLocal(state.validatorData!.obj.born)\n }]\n ]]\n ]],\n [\"p.w3-text-red\", [state.validatorData!.err.born]],\n [\"p\", [\n [\"label\", [\"Children\",\n [\"input.w3-input\", {\n type: \"number\",\n name: \"children\",\n value: state.validatorData!.str.children\n }]\n ]]\n ]],\n [\"p.w3-text-red\", [state.validatorData!.err.children]],\n [\"p\", [\n [\"label\", [\n [\"input.w3-check\", {\n type: \"checkbox\",\n name: \"married\",\n checked: state.validatorData!.obj.married\n }],\n \" Married\"\n ]]\n ]],\n [\"p.w3-text-red\", [state.validatorData!.err.married]],\n [\"p\",\n hjoin(\n state.genders.map<HElement>(gender => (\n [\"label\", [\n [\"input.w3-radio\", {\n type: \"radio\",\n name: \"gender\",\n value: gender.value,\n checked: state.validatorData!.obj.gender === gender.value\n }],\n \" \", gender.label\n ]]\n )),\n [\"br\"]\n )\n ],\n [\"p.w3-text-red\", [state.validatorData!.err.gender]],\n [\"p\", [\n [\"select.w3-select\", { name: \"sport\" },\n [\n [\"option\",\n { value: \"\", disabled: true, selected: true },\n \"Sport\"\n ],\n ...state.sports.map<HElement>(sport => (\n [\"option\",\n {\n value: sport,\n selected: sport === state.validatorData!.obj.sport\n },\n sport\n ])\n )\n ]\n ]\n ]],\n [\"p.w3-text-red\", state.validatorData!.err.sport],\n [\"button.w3-btn.w3-blue\", \"Submit\"]\n ]\n ]\n ]]\n ];\n};\n\nlet formValidator: FormValidator<FormValidationData>;\n\nexport const formValidationDispatcher: HDispatcher<FormValidationState> = async function (action, state) {\n console.log(\"action\", action);\n\n switch (action.type) {\n\n case HAppAction._init:\n formValidator = validator(state);\n state.validatorData = formValidator.data();\n break;\n\n case FormValidationAction.change:\n formValidator.validate({\n ...state.validatorData!.str,\n ...action.data\n });\n state.validatorData = formValidator.data();\n console.log(\"obj:\", JSON.stringify(state.validatorData, null, 4));\n break;\n\n case FormValidationAction.submit:\n action.event!.preventDefault();\n // console.log(action.data);\n formValidator.validate(action.data);\n state.validatorData = formValidator.data();\n // console.log(state.validatorData);\n state.validatorData = formValidator.data();\n if (formValidator.valid) {\n console.log(formValidator);\n state.data = formValidator.obj!;\n const formData = JSON.stringify(state.data, null, 4);\n console.dir(formData);\n alert(`Form submit: \\n${formData}`);\n }\n break;\n }\n};\n\nexport function validator(formState: FormValidationState): FormValidator<FormValidationData> {\n return new FormValidator<FormValidationData>()\n .addValidator(\"name\", new StringValidator(\n {\n required: true,\n min: 3,\n max: 5\n },\n {\n required: \"Required {{min}} - {{max}} {{regexp}}\",\n invalid_format: \"Invalid format {{regexp}}\",\n not_in_range: \"Not in range {{min}} - {{max}}\"\n }))\n .addValidator(\"born\", new DateValidator(\n {\n required: true,\n // min: new Date(),\n max: new Date(),\n dateOnly: false,\n iso: true\n },\n {\n required: \"Required {{min}} - {{max}}\",\n invalid_format: \"Invalid format {{date}}\",\n not_in_range: \"Not in range {{min}} - {{max}}\"\n }))\n .addValidator(\"children\", new NumberValidator(\n {\n required: true,\n min: 0,\n max: 10\n },\n {\n required: \"Required {{min}} - {{max}}\",\n invalid_format: \"Invalid format, use format {{num}}\",\n not_in_range: \"Not in range {{min}} - {{max}}\"\n }))\n .addValidator(\"gender\", new SelectValidator(\n {\n required: true,\n options: formState.genders.map(g => g.value)\n },\n {\n required: \"Required {{options}}\",\n invalid_option: \"Invalod option {{option}} {{options}}\"\n }))\n .addValidator(\"married\", new BooleanValidator(\n {\n required: true\n },\n {\n required: \"Required\",\n invalid_value: \"Invalid value {{value}}\"\n }))\n .addValidator(\"sport\", new SelectValidator(\n {\n required: true,\n options: formState.sports\n },\n {\n required: \"Required {{options}}\",\n invalid_option: \"Invalod option {{option}} {{options}}\"\n }))\n .format(formState.data);\n}\n\nfunction datetimeLocal(date: Date) {\n if (!date) {\n return \"\";\n }\n const tzo = - date.getTimezoneOffset();\n if (tzo === 0) {\n return date.toISOString();\n } else {\n // let dif = tzo >= 0 ? \"+\" : \"-\";\n const pad = function (num: number, digits = 2) {\n return String(num).padStart(digits, \"0\");\n };\n return (\n date.getFullYear() +\n \"-\" +\n pad(date.getMonth() + 1) +\n \"-\" +\n pad(date.getDate()) +\n \"T\" +\n pad(date.getHours()) +\n \":\" +\n pad(date.getMinutes())\n // pad(tzo >= 0 ? date.getHours() + (tzo / 60) : date.getHours() - (tzo / 60)) +\n // \":\" +\n // pad(tzo >= 0 ? date.getMinutes() + (tzo % 60) : date.getMinutes() - (tzo % 60))\n );\n // return (\n // date.getFullYear() +\n // \"-\" +\n // pad(date.getMonth() + 1) +\n // \"-\" +\n // pad(date.getDate()) +\n // \"T\" +\n // pad(date.getHours()) +\n // \":\" +\n // pad(date.getMinutes()) +\n // \":\" +\n // pad(date.getSeconds()) +\n // dif +\n // pad(tzo / 60) +\n // \":\" +\n // pad(tzo % 60) +\n // \".\" +\n // pad(date.getMilliseconds(), 3)\n // );\n }\n}\n\nhapp<FormValidationState>(formValidationState, formValidationView, formValidationDispatcher);\n"],"names":["$a85519cc1b20a4af$var$log","console","log","$a85519cc1b20a4af$var$error","error","$a85519cc1b20a4af$var$warn","warn","$a85519cc1b20a4af$export$15cfcbba5b21308e","HAppAction","$a85519cc1b20a4af$var$schedule","window","requestAnimationFrame","callback","setTimeout","$a85519cc1b20a4af$var$unschedule","cancelAnimationFrame","handle","clearTimeout","$a85519cc1b20a4af$var$msgAction","$a85519cc1b20a4af$var$msgDispatch","$a85519cc1b20a4af$var$msgRender","$a85519cc1b20a4af$export$eb8950696418f795","state","view","dispatcher","element","document","body","$a85519cc1b20a4af$export$8cfef5dc37c46888","$a85519cc1b20a4af$export$e905700d74a7763f","hAppI","e","hapi","$a85519cc1b20a4af$export$1cfc54b3834d3c50","elementName","elementAttrs","customElements","define","HTMLElement","observedAttributes","connectedCallback","this","attachShadow","mode","_happel","mount","shadowRoot","disconnectedCallback","umount","adoptedCallback","update","attributeChangedCallback","attrName","oldVal","newVal","dispatch","_element","constructor","super","customElement","$a85519cc1b20a4af$export$dd8a94d3c5ec9827","controllers","action","controller","type","apply","data","event","$a85519cc1b20a4af$var$HAPP","_dispatch","_a","_onDispatch","call","dom","$a85519cc1b20a4af$var$elementDispatchCustomEvent","windowDispatchOn","_windowEventListener","detail","addEventListener","windowDispatchOff","removeEventListener","refs","onDispatch","$a85519cc1b20a4af$var$__awaiter","debug","t0","performance","now","t1","windowDispatch","dispatchEvent","CustomEvent","render","hsmls","actionCb","undefined","Function","el","target","nodeName","preventDefault","els","elements","i","length","d","$a85519cc1b20a4af$var$formInputData","names","Object","keys","name","value","String","Array","concat","push","filter","$a85519cc1b20a4af$var$formData","getElementById","$a85519cc1b20a4af$var$updateDom","_mount","_umount","hasAttribute","removeAttribute","aNodes","querySelectorAll","a","happ","firstChild","removeChild","_updateSched","toHsml","_skip","toHtml","outerHTML","_init","then","hsml","ctx","$8IJ2T","hsmls2idomPatch","_b","toLowerCase","iel","checked","sel","multiple","values","from","selectedOptions","map","o","tel","bel","$f8ef79223f7b25f5$var$requiredMsg","$f8ef79223f7b25f5$var$notInRangeMsg","$f8ef79223f7b25f5$var$invalidFormatMsg","$f8ef79223f7b25f5$export$9eeb22c0bba4ed5e","validate","v","str","sto","strToObj","obj","err","objCheck","format","ots","objToStr","opts","msgs","$f8ef79223f7b25f5$export$5dfe2efd653fcea4","tmpl","k","reduce","t","replace","RegExp","$f8ef79223f7b25f5$export$d25426df72e77dd3","required","assign","options","join","indexOf","invalid_option","option","$f8ef79223f7b25f5$export$312ff19fe6f84b5e","min","max","regexp","_c","test","invalid_format","_d","not_in_range","$f8ef79223f7b25f5$export$5464fb7e86e4a9f1","n","Number","isNaN","strict","num","toFixed","decimals","$f8ef79223f7b25f5$var$dateToLocaleString","date","toLocaleString","$f8ef79223f7b25f5$var$dateToLocaleDateString","toLocaleDateString","$f8ef79223f7b25f5$var$dateToIsoString","toISOString","$f8ef79223f7b25f5$var$dateToIsoDateString","Date","toDateString","$f8ef79223f7b25f5$export$73e260ca9e9e4b55","dateToStr","dt","parse","dateOnly","getFullYear","getMonth","getDate","getTime","iso","$f8ef79223f7b25f5$export$d74a5d77bac81ab5","b","invalid_value","$f8ef79223f7b25f5$export$7c385359179c028a","addValidator","field","validator","validators","res","r","valid","$19850c2a6f6be7d2$export$82d15d3be5333d49","FormValidationAction","$19850c2a6f6be7d2$var$formValidator","$19850c2a6f6be7d2$var$datetimeLocal","getTimezoneOffset","pad","digits","padStart","getHours","getMinutes","$a85519cc1b20a4af$exports","title","born","children","married","gender","sport","genders","label","sports","on","change","submit","validatorData","$g7NCG","hjoin","disabled","selected","formState","g","JSON","stringify","formData","dir","alert"],"version":3,"file":"hsml-app-form-validation_demo.0b03b743.js.map"}
|