peryl 1.5.1 → 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 +31 -17
- package/demo/form_demo.ts +1 -1
- package/demo/hsml-app-form-validation_demo.html +17 -0
- package/demo/hsml-app-form-validation_demo.ts +301 -0
- package/demo/hsml-app-form_demo.ts +25 -21
- package/demo/{hsml-appc_demo.html → hsml-app-test_demo.html} +1 -1
- package/demo/hsml-app-test_demo.ts +224 -0
- package/demo/hsml-app-tictactoe_demo.html +19 -0
- package/demo/hsml-app-tictactoe_demo.ts +86 -0
- package/demo/hsml-app_demo.html +2 -4
- package/demo/hsml-app_demo.ts +47 -198
- 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/dom.js +9 -6
- package/dist/browser-esmodule/dom.js.map +1 -1
- package/dist/browser-esmodule/encode.js.map +1 -1
- package/dist/browser-esmodule/hash.js +3 -2
- package/dist/browser-esmodule/hash.js.map +1 -1
- package/dist/browser-esmodule/hsml-app.js +102 -97
- 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 +7 -5
- 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 +4 -3
- package/dist/browser-esmodule/hsml-html.js.map +1 -1
- package/dist/browser-esmodule/hsml-idom.js +7 -6
- package/dist/browser-esmodule/hsml-idom.js.map +1 -1
- package/dist/browser-esmodule/hsml.js +2 -1
- package/dist/browser-esmodule/hsml.js.map +1 -1
- package/dist/browser-esmodule/http.js +4 -2
- package/dist/browser-esmodule/http.js.map +1 -1
- package/dist/browser-esmodule/index.js +177 -151
- package/dist/browser-esmodule/index.js.map +1 -1
- package/dist/browser-esmodule/router.js +2 -2
- package/dist/browser-esmodule/router.js.map +1 -1
- package/dist/browser-esmodule/settings.js.map +1 -1
- package/dist/browser-esmodule/validators-moment.js +37 -27
- package/dist/browser-esmodule/validators-moment.js.map +1 -1
- package/dist/browser-esmodule/validators-numeral.js +38 -28
- package/dist/browser-esmodule/validators-numeral.js.map +1 -1
- package/dist/browser-esmodule/validators-object.js +3 -2
- package/dist/browser-esmodule/validators-object.js.map +1 -1
- package/dist/browser-esmodule/validators.js +27 -20
- package/dist/browser-esmodule/validators.js.map +1 -1
- package/dist/browser-umd/dom.js +1 -1
- package/dist/browser-umd/dom.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/hash.js +1 -1
- package/dist/browser-umd/hash.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 +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/settings.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 +1 -1
- package/dist/browser-umd/validators-numeral.js.map +1 -1
- package/dist/browser-umd/validators-object.js +1 -1
- package/dist/browser-umd/validators-object.js.map +1 -1
- package/dist/browser-umd/validators.js +1 -1
- package/dist/browser-umd/validators.js.map +1 -1
- package/dist/demo/dom_demo.8df77c05.js +2 -0
- package/dist/demo/dom_demo.8df77c05.js.map +1 -0
- package/dist/demo/dom_demo.df09792b.js +2 -0
- package/dist/demo/dom_demo.df09792b.js.map +1 -0
- package/dist/demo/dom_demo.html +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/form_demo.0574ff51.js +2 -0
- package/dist/demo/form_demo.0574ff51.js.map +1 -0
- package/dist/demo/form_demo.4d337a03.js +2 -0
- package/dist/demo/form_demo.4d337a03.js.map +1 -0
- package/dist/demo/form_demo.html +1 -1
- package/dist/demo/hash_demo.00d956f4.js +2 -0
- package/dist/demo/hash_demo.00d956f4.js.map +1 -0
- package/dist/demo/hash_demo.94e63b31.js +2 -0
- package/dist/demo/hash_demo.94e63b31.js.map +1 -0
- package/dist/demo/hash_demo.html +1 -1
- package/dist/demo/history_demo.474c0b2f.js +2 -0
- package/dist/demo/history_demo.474c0b2f.js.map +1 -0
- package/dist/demo/history_demo.bb7446f1.js +2 -0
- package/dist/demo/history_demo.bb7446f1.js.map +1 -0
- package/dist/demo/history_demo.html +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 -0
- 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 -0
- 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 -0
- 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 +2 -0
- package/dist/demo/http_demo.3e7da3d8.js.map +1 -0
- package/dist/demo/http_demo.8e435f23.js +2 -0
- package/dist/demo/http_demo.8e435f23.js.map +1 -0
- package/dist/demo/http_demo.html +1 -1
- package/dist/demo/i18n_demo.html +1 -1
- package/dist/demo/router_demo.3cfa03aa.js +2 -0
- package/dist/demo/{router_demo.c42ee304.js.map → router_demo.3cfa03aa.js.map} +1 -1
- package/dist/demo/router_demo.89ab1681.js +2 -0
- package/dist/demo/{router_demo.8703f75f.js.map → router_demo.89ab1681.js.map} +1 -1
- package/dist/demo/router_demo.html +1 -1
- package/dist/demo/template_demo.07e850de.js +2 -0
- package/dist/demo/template_demo.07e850de.js.map +1 -0
- package/dist/demo/template_demo.52b839c7.js +2 -0
- package/dist/demo/template_demo.52b839c7.js.map +1 -0
- package/dist/demo/template_demo.html +1 -1
- package/dist/demo/validators_demo.6a5913d0.js +4 -0
- package/dist/demo/validators_demo.6a5913d0.js.map +1 -0
- package/dist/demo/validators_demo.8a773c14.js +4 -0
- package/dist/demo/validators_demo.8a773c14.js.map +1 -0
- package/dist/demo/{validators_demo.6d800c84.js → validators_demo.90ff6001.js} +2 -2
- package/dist/demo/validators_demo.90ff6001.js.map +1 -0
- package/dist/demo/{validators_demo.02c73222.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/dom.js +9 -6
- package/dist/dom.js.map +1 -1
- package/dist/encode.js +1 -1
- package/dist/encode.js.map +1 -1
- package/dist/hash.js +3 -2
- package/dist/hash.js.map +1 -1
- package/dist/hsml-app.d.ts +41 -39
- package/dist/hsml-app.js +87 -88
- 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 +5 -4
- package/dist/hsml-dom.js.map +1 -1
- package/dist/hsml-h.d.ts +9 -9
- 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 +28 -27
- package/dist/hsml.js +2 -1
- package/dist/hsml.js.map +1 -1
- package/dist/http.js +5 -3
- package/dist/http.js.map +1 -1
- package/dist/router.js +5 -5
- package/dist/router.js.map +1 -1
- package/dist/validators-moment.js +11 -8
- package/dist/validators-moment.js.map +1 -1
- package/dist/validators-numeral.js +11 -8
- package/dist/validators-numeral.js.map +1 -1
- package/dist/validators-object.js +3 -2
- package/dist/validators-object.js.map +1 -1
- package/dist/validators.js +23 -16
- package/dist/validators.js.map +1 -1
- package/package.json +10 -11
- package/src/dom.ts +6 -6
- package/src/hash.ts +2 -2
- package/src/hsml-app.ts +230 -167
- package/src/hsml-convert.ts +8 -8
- package/src/hsml-dom.ts +22 -34
- package/src/hsml-h.ts +11 -11
- package/src/hsml-html.ts +22 -29
- package/src/hsml-idom.ts +28 -40
- package/src/hsml.ts +52 -145
- package/src/http.ts +2 -2
- package/src/router.ts +4 -4
- package/src/settings.ts +1 -1
- package/src/validators-moment.ts +10 -10
- package/src/validators-numeral.ts +8 -8
- package/src/validators-object.ts +2 -2
- package/src/validators.ts +22 -21
- package/demo/hsml-app-tictactoe-demo.html +0 -16
- package/demo/hsml-app-tictactoe-demo.ts +0 -70
- package/demo/hsml-appc_demo.ts +0 -49
- package/dist/demo/dom_demo.3e0ad00b.js +0 -2
- package/dist/demo/dom_demo.3e0ad00b.js.map +0 -1
- package/dist/demo/dom_demo.94c07802.js +0 -2
- package/dist/demo/dom_demo.94c07802.js.map +0 -1
- package/dist/demo/form_demo.40b774c2.js +0 -2
- package/dist/demo/form_demo.40b774c2.js.map +0 -1
- package/dist/demo/form_demo.75ed39a0.js +0 -2
- package/dist/demo/form_demo.75ed39a0.js.map +0 -1
- package/dist/demo/hash_demo.416ed5fa.js +0 -2
- package/dist/demo/hash_demo.416ed5fa.js.map +0 -1
- package/dist/demo/hash_demo.b40a9611.js +0 -2
- package/dist/demo/hash_demo.b40a9611.js.map +0 -1
- package/dist/demo/history_demo.e11ea378.js +0 -2
- package/dist/demo/history_demo.e11ea378.js.map +0 -1
- package/dist/demo/history_demo.feee2e18.js +0 -2
- package/dist/demo/history_demo.feee2e18.js.map +0 -1
- package/dist/demo/hsml-app-form_demo.06d87b64.js +0 -2
- package/dist/demo/hsml-app-form_demo.06d87b64.js.map +0 -1
- package/dist/demo/hsml-app-form_demo.4706bc2e.js +0 -2
- package/dist/demo/hsml-app-form_demo.4706bc2e.js.map +0 -1
- package/dist/demo/hsml-app-tictactoe-demo.e0bc6fed.js +0 -2
- package/dist/demo/hsml-app-tictactoe-demo.e0bc6fed.js.map +0 -1
- package/dist/demo/hsml-app-tictactoe-demo.f9399bf0.js +0 -2
- package/dist/demo/hsml-app-tictactoe-demo.f9399bf0.js.map +0 -1
- package/dist/demo/hsml-app-tictactoe-demo.html +0 -1
- package/dist/demo/hsml-app_demo.033431ac.js +0 -2
- package/dist/demo/hsml-app_demo.033431ac.js.map +0 -1
- package/dist/demo/hsml-app_demo.204365df.js +0 -2
- package/dist/demo/hsml-app_demo.204365df.js.map +0 -1
- package/dist/demo/hsml-appc_demo.06ff0d1d.js +0 -2
- package/dist/demo/hsml-appc_demo.06ff0d1d.js.map +0 -1
- package/dist/demo/hsml-appc_demo.702d405b.js +0 -2
- package/dist/demo/hsml-appc_demo.702d405b.js.map +0 -1
- package/dist/demo/hsml-appc_demo.74bd46ea.js +0 -2
- package/dist/demo/hsml-appc_demo.74bd46ea.js.map +0 -1
- package/dist/demo/hsml-appc_demo.9a97c24c.js +0 -2
- package/dist/demo/hsml-appc_demo.9a97c24c.js.map +0 -1
- package/dist/demo/hsml-appc_demo.html +0 -1
- package/dist/demo/hsml-appel_demo.2a0812f7.js +0 -2
- package/dist/demo/hsml-appel_demo.2a0812f7.js.map +0 -1
- package/dist/demo/hsml-appel_demo.36395e9f.js +0 -2
- package/dist/demo/hsml-appel_demo.36395e9f.js.map +0 -1
- package/dist/demo/hsml-appi_demo.0492f5a4.js +0 -2
- package/dist/demo/hsml-appi_demo.0492f5a4.js.map +0 -1
- package/dist/demo/hsml-appi_demo.0847d145.js +0 -2
- package/dist/demo/hsml-appi_demo.0847d145.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/http_demo.0c22b4b7.js +0 -2
- package/dist/demo/http_demo.0c22b4b7.js.map +0 -1
- package/dist/demo/http_demo.cd09bdb8.js +0 -2
- package/dist/demo/http_demo.cd09bdb8.js.map +0 -1
- package/dist/demo/router_demo.8703f75f.js +0 -2
- package/dist/demo/router_demo.c42ee304.js +0 -2
- package/dist/demo/template_demo.60b5d288.js +0 -2
- package/dist/demo/template_demo.60b5d288.js.map +0 -1
- package/dist/demo/template_demo.7015ed65.js +0 -2
- package/dist/demo/template_demo.7015ed65.js.map +0 -1
- package/dist/demo/validators_demo.02c73222.js.map +0 -1
- package/dist/demo/validators_demo.05b7c138.js +0 -4
- package/dist/demo/validators_demo.05b7c138.js.map +0 -1
- package/dist/demo/validators_demo.48785856.js +0 -4
- package/dist/demo/validators_demo.48785856.js.map +0 -1
- package/dist/demo/validators_demo.6d800c84.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
# PeRyL
|
|
2
2
|
|
|
3
|
-
TypeScript/JavaScript library and tools for rapid server and client side web
|
|
3
|
+
TypeScript/JavaScript library and tools for rapid server and client side web
|
|
4
|
+
applications development.
|
|
4
5
|
|
|
5
6
|
## HApp - PeRyL HSML App
|
|
6
7
|
|
|
7
|
-
`HApp` - HSML App, TypeScript/JavaScript Web UI framework for rapid SPA web
|
|
8
|
+
`HApp` - HSML App, TypeScript/JavaScript Web UI framework for rapid SPA web
|
|
9
|
+
applications development based on Flux single directional data flow architecture.
|
|
8
10
|
|
|
9
11
|
Read [Tutorial](HApp.md) to learn how to write HApp.
|
|
10
12
|
|
|
@@ -35,13 +37,15 @@ HApp example code:
|
|
|
35
37
|
<script src="https://unpkg.com/peryl/dist/browser-umd/hsml-app.js"></script>
|
|
36
38
|
<script>
|
|
37
39
|
|
|
38
|
-
|
|
40
|
+
// Flux single directional data flow architecture actions
|
|
41
|
+
const Actions = {
|
|
39
42
|
title: "title",
|
|
40
43
|
dec: "dec",
|
|
41
44
|
inc: "inc",
|
|
42
45
|
clear: "clear"
|
|
43
46
|
}
|
|
44
47
|
|
|
48
|
+
// Flux single directional data flow architecture state/store init
|
|
45
49
|
function state() {
|
|
46
50
|
return {
|
|
47
51
|
title: "Counter",
|
|
@@ -49,24 +53,29 @@ HApp example code:
|
|
|
49
53
|
};
|
|
50
54
|
}
|
|
51
55
|
|
|
56
|
+
// Flux single directional data flow architecture view
|
|
52
57
|
function view(state) {
|
|
58
|
+
// HSML (Hyper Script Markup Language) HTML reprezentation
|
|
53
59
|
return [
|
|
54
60
|
["h2",
|
|
61
|
+
// conditional class
|
|
55
62
|
{ classes: [["w3-text-light-grey", !state.title]] },
|
|
56
63
|
state.title || "No title"
|
|
57
64
|
],
|
|
58
65
|
["p", [
|
|
59
66
|
["label", "Title:"],
|
|
67
|
+
// Input element static classes declaration
|
|
60
68
|
["input.w3-input.w3-border", {
|
|
61
69
|
type: "text",
|
|
62
70
|
name: "title",
|
|
63
71
|
value: new String(state.title),
|
|
64
|
-
|
|
72
|
+
// On click action definition
|
|
73
|
+
on: ["input", Actions.title]
|
|
65
74
|
}]
|
|
66
75
|
]],
|
|
67
76
|
["p", [
|
|
68
77
|
["button.w3-button.w3-blue",
|
|
69
|
-
{ on: ["click",
|
|
78
|
+
{ on: ["click", Actions.clear] },
|
|
70
79
|
"Clear title"
|
|
71
80
|
]
|
|
72
81
|
]],
|
|
@@ -85,42 +94,46 @@ HApp example code:
|
|
|
85
94
|
]
|
|
86
95
|
]],
|
|
87
96
|
["button.w3-button.w3-blue",
|
|
88
|
-
|
|
97
|
+
// On click action definition with attached data
|
|
98
|
+
{ on: ["click", Actions.dec, 1] },
|
|
89
99
|
[["i.fa.fa-chevron-left"]]
|
|
90
100
|
],
|
|
91
101
|
" ",
|
|
92
102
|
["button.w3-button.w3-blue",
|
|
93
|
-
{ on: ["click",
|
|
103
|
+
{ on: ["click", Actions.inc, 2] },
|
|
94
104
|
[["i.fa.fa-chevron-right"]]
|
|
95
105
|
]
|
|
96
106
|
]]
|
|
97
107
|
]
|
|
98
108
|
};
|
|
99
109
|
|
|
110
|
+
// Flux single directional data flow architecture dispatcher
|
|
100
111
|
async function dispatcher(action, state, dispatch) {
|
|
101
112
|
console.log("action:", action);
|
|
102
113
|
|
|
103
114
|
switch (action.type) {
|
|
104
|
-
|
|
105
|
-
case
|
|
106
|
-
case
|
|
115
|
+
// HSML App (HApp) lifecycle actions
|
|
116
|
+
case HAppActions.init:
|
|
117
|
+
case HAppActions.mount:
|
|
118
|
+
case HAppActions.umount:
|
|
107
119
|
break;
|
|
108
120
|
|
|
109
|
-
case
|
|
121
|
+
case Actions.title:
|
|
122
|
+
// Action data resolved automatically form input
|
|
110
123
|
state.title = action.data.title;
|
|
111
124
|
break;
|
|
112
125
|
|
|
113
|
-
case
|
|
126
|
+
case Actions.inc:
|
|
114
127
|
state.count = state.count + action.data;
|
|
115
128
|
// async action call
|
|
116
|
-
setTimeout(() => dispatch(
|
|
129
|
+
setTimeout(() => dispatch(Actions.dec, 1), 1e3);
|
|
117
130
|
break;
|
|
118
131
|
|
|
119
|
-
case
|
|
132
|
+
case Actions.dec:
|
|
120
133
|
state.count = state.count - action.data;
|
|
121
134
|
break;
|
|
122
135
|
|
|
123
|
-
case
|
|
136
|
+
case Actions.clear:
|
|
124
137
|
state.title = "";
|
|
125
138
|
break;
|
|
126
139
|
|
|
@@ -129,9 +142,10 @@ HApp example code:
|
|
|
129
142
|
}
|
|
130
143
|
};
|
|
131
144
|
|
|
132
|
-
|
|
145
|
+
HApp.debug = true; // Print console flux lifecycle details
|
|
133
146
|
|
|
134
|
-
|
|
147
|
+
// Run HApp application on html element with id "app"
|
|
148
|
+
new HApp(state, view, dispatcher, "app");
|
|
135
149
|
|
|
136
150
|
</script>
|
|
137
151
|
</body>
|
package/demo/form_demo.ts
CHANGED
|
@@ -31,7 +31,7 @@ const fileValidator = (entry: form.Entry, locale?: string): string => {
|
|
|
31
31
|
|
|
32
32
|
const showChange = (entry: form.Entry) => {
|
|
33
33
|
const el = select("#change");
|
|
34
|
-
el && (el.innerHTML = entry.getValue()
|
|
34
|
+
el && (el.innerHTML = entry.getValue() ?? "");
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
new form.Form("form")
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
7
|
+
<title>PeRyL HSML App Form</title>
|
|
8
|
+
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
|
|
9
|
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Raleway">
|
|
10
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
|
11
|
+
</head>
|
|
12
|
+
|
|
13
|
+
<body>
|
|
14
|
+
<script type="module" src="hsml-app-form-validation_demo.ts"></script>
|
|
15
|
+
</body>
|
|
16
|
+
|
|
17
|
+
</html>
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { HElement, hjoin } from "../src/hsml";
|
|
2
|
+
import { HAppActions, HDispatcher, HState, HView, happ } from "../src/hsml-app";
|
|
3
|
+
import { BooleanValidator, DateValidator, FormValidator, FormValidatorData, NumberValidator, SelectValidator, StringValidator } from "../src/validators";
|
|
4
|
+
|
|
5
|
+
export interface Data {
|
|
6
|
+
name: string;
|
|
7
|
+
born: Date;
|
|
8
|
+
children: number;
|
|
9
|
+
married: boolean;
|
|
10
|
+
gender: string;
|
|
11
|
+
sport: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface State {
|
|
15
|
+
title: string;
|
|
16
|
+
data: Data;
|
|
17
|
+
genders: {
|
|
18
|
+
label: string;
|
|
19
|
+
value: string;
|
|
20
|
+
}[];
|
|
21
|
+
sports: string[];
|
|
22
|
+
validatorData?: FormValidatorData<Data>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const state: HState<State> = function () {
|
|
26
|
+
return {
|
|
27
|
+
title: "Form Validation",
|
|
28
|
+
data: {
|
|
29
|
+
name: "Ema",
|
|
30
|
+
born: new Date(),
|
|
31
|
+
children: 0,
|
|
32
|
+
married: false,
|
|
33
|
+
gender: "female",
|
|
34
|
+
sport: "gymnastics"
|
|
35
|
+
},
|
|
36
|
+
genders: [
|
|
37
|
+
{ label: "Male", value: "male" },
|
|
38
|
+
{ label: "Female", value: "female" }
|
|
39
|
+
],
|
|
40
|
+
sports: ["football", "gymnastics"]
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export enum Actions {
|
|
45
|
+
change = "form-validation-change",
|
|
46
|
+
submit = "form-validation-submit"
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const view: HView<State, Actions> = function (state) {
|
|
50
|
+
return [
|
|
51
|
+
["div.w3-content", [
|
|
52
|
+
["h1", state.title],
|
|
53
|
+
["form.w3-container",
|
|
54
|
+
{
|
|
55
|
+
on: [
|
|
56
|
+
["change", Actions.change],
|
|
57
|
+
["submit", Actions.submit]
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
[
|
|
61
|
+
["p", [
|
|
62
|
+
["label", ["Name",
|
|
63
|
+
["input.w3-input", {
|
|
64
|
+
type: "text",
|
|
65
|
+
name: "name",
|
|
66
|
+
value: state.validatorData!.str.name,
|
|
67
|
+
on: ["input", Actions.change]
|
|
68
|
+
}]
|
|
69
|
+
]]
|
|
70
|
+
]],
|
|
71
|
+
["p.w3-text-red", [state.validatorData!.err.name]],
|
|
72
|
+
["p", [
|
|
73
|
+
["label", ["Born",
|
|
74
|
+
["input.w3-input", {
|
|
75
|
+
type: "datetime-local",
|
|
76
|
+
name: "born",
|
|
77
|
+
// placeholder: new DateValidator().format(new Date()).str,
|
|
78
|
+
value: datetimeLocal(state.validatorData!.obj.born)
|
|
79
|
+
}]
|
|
80
|
+
]]
|
|
81
|
+
]],
|
|
82
|
+
["p.w3-text-red", [state.validatorData!.err.born]],
|
|
83
|
+
["p", [
|
|
84
|
+
["label", ["Children",
|
|
85
|
+
["input.w3-input", {
|
|
86
|
+
type: "number",
|
|
87
|
+
name: "children",
|
|
88
|
+
value: state.validatorData!.str.children
|
|
89
|
+
}]
|
|
90
|
+
]]
|
|
91
|
+
]],
|
|
92
|
+
["p.w3-text-red", [state.validatorData!.err.children]],
|
|
93
|
+
["p", [
|
|
94
|
+
["label", [
|
|
95
|
+
["input.w3-check", {
|
|
96
|
+
type: "checkbox",
|
|
97
|
+
name: "married",
|
|
98
|
+
checked: state.validatorData!.obj.married
|
|
99
|
+
}],
|
|
100
|
+
" Married"
|
|
101
|
+
]]
|
|
102
|
+
]],
|
|
103
|
+
["p.w3-text-red", [state.validatorData!.err.married]],
|
|
104
|
+
["p",
|
|
105
|
+
hjoin(
|
|
106
|
+
state.genders.map<HElement<Actions>>(gender => (
|
|
107
|
+
["label", [
|
|
108
|
+
["input.w3-radio", {
|
|
109
|
+
type: "radio",
|
|
110
|
+
name: "gender",
|
|
111
|
+
value: gender.value,
|
|
112
|
+
checked: state.validatorData!.obj.gender === gender.value
|
|
113
|
+
}],
|
|
114
|
+
" ", gender.label
|
|
115
|
+
]]
|
|
116
|
+
)),
|
|
117
|
+
["br"]
|
|
118
|
+
)
|
|
119
|
+
],
|
|
120
|
+
["p.w3-text-red", [state.validatorData!.err.gender]],
|
|
121
|
+
["p", [
|
|
122
|
+
["select.w3-select", { name: "sport" },
|
|
123
|
+
[
|
|
124
|
+
["option",
|
|
125
|
+
{ value: "", disabled: true, selected: true },
|
|
126
|
+
"Sport"
|
|
127
|
+
],
|
|
128
|
+
...state.sports.map<HElement<Actions>>(sport => (
|
|
129
|
+
["option",
|
|
130
|
+
{
|
|
131
|
+
value: sport,
|
|
132
|
+
selected: sport === state.validatorData!.obj.sport
|
|
133
|
+
},
|
|
134
|
+
sport
|
|
135
|
+
])
|
|
136
|
+
)
|
|
137
|
+
]
|
|
138
|
+
]
|
|
139
|
+
]],
|
|
140
|
+
["p.w3-text-red", state.validatorData!.err.sport],
|
|
141
|
+
["button.w3-btn.w3-blue", "Submit"]
|
|
142
|
+
]
|
|
143
|
+
]
|
|
144
|
+
]]
|
|
145
|
+
];
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
let formValidator: FormValidator<Data>;
|
|
149
|
+
|
|
150
|
+
export const dispatcher: HDispatcher<State, Actions> = async function (action, state) {
|
|
151
|
+
console.log("action", action);
|
|
152
|
+
|
|
153
|
+
switch (action.type) {
|
|
154
|
+
|
|
155
|
+
case HAppActions.init:
|
|
156
|
+
formValidator = validator(state);
|
|
157
|
+
state.validatorData = formValidator.data();
|
|
158
|
+
break;
|
|
159
|
+
|
|
160
|
+
case Actions.change:
|
|
161
|
+
formValidator.validate({
|
|
162
|
+
...state.validatorData!.str,
|
|
163
|
+
...action.data
|
|
164
|
+
});
|
|
165
|
+
state.validatorData = formValidator.data();
|
|
166
|
+
console.log("obj:", JSON.stringify(state.validatorData, null, 4));
|
|
167
|
+
break;
|
|
168
|
+
|
|
169
|
+
case Actions.submit:
|
|
170
|
+
action.event!.preventDefault();
|
|
171
|
+
// console.log(action.data);
|
|
172
|
+
formValidator.validate(action.data);
|
|
173
|
+
state.validatorData = formValidator.data();
|
|
174
|
+
// console.log(state.validatorData);
|
|
175
|
+
state.validatorData = formValidator.data();
|
|
176
|
+
if (formValidator.valid) {
|
|
177
|
+
console.log(formValidator);
|
|
178
|
+
state.data = formValidator.obj!;
|
|
179
|
+
const formData = JSON.stringify(state.data, null, 4);
|
|
180
|
+
console.dir(formData);
|
|
181
|
+
alert(`Form submit: \n${formData}`);
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
export function validator(formState: State): FormValidator<Data> {
|
|
188
|
+
return new FormValidator<Data>()
|
|
189
|
+
.addValidator("name", new StringValidator(
|
|
190
|
+
{
|
|
191
|
+
required: true,
|
|
192
|
+
min: 3,
|
|
193
|
+
max: 5
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
required: "Required {{min}} - {{max}} {{regexp}}",
|
|
197
|
+
invalid_format: "Invalid format {{regexp}}",
|
|
198
|
+
not_in_range: "Not in range {{min}} - {{max}}"
|
|
199
|
+
}))
|
|
200
|
+
.addValidator("born", new DateValidator(
|
|
201
|
+
{
|
|
202
|
+
required: true,
|
|
203
|
+
// min: new Date(),
|
|
204
|
+
max: new Date(),
|
|
205
|
+
dateOnly: false,
|
|
206
|
+
iso: true
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
required: "Required {{min}} - {{max}}",
|
|
210
|
+
invalid_format: "Invalid format {{date}}",
|
|
211
|
+
not_in_range: "Not in range {{min}} - {{max}}"
|
|
212
|
+
}))
|
|
213
|
+
.addValidator("children", new NumberValidator(
|
|
214
|
+
{
|
|
215
|
+
required: true,
|
|
216
|
+
min: 0,
|
|
217
|
+
max: 10
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
required: "Required {{min}} - {{max}}",
|
|
221
|
+
invalid_format: "Invalid format, use format {{num}}",
|
|
222
|
+
not_in_range: "Not in range {{min}} - {{max}}"
|
|
223
|
+
}))
|
|
224
|
+
.addValidator("gender", new SelectValidator(
|
|
225
|
+
{
|
|
226
|
+
required: true,
|
|
227
|
+
options: formState.genders.map(g => g.value)
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
required: "Required {{options}}",
|
|
231
|
+
invalid_option: "Invalod option {{option}} {{options}}"
|
|
232
|
+
}))
|
|
233
|
+
.addValidator("married", new BooleanValidator(
|
|
234
|
+
{
|
|
235
|
+
required: true
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
required: "Required",
|
|
239
|
+
invalid_value: "Invalid value {{value}}"
|
|
240
|
+
}))
|
|
241
|
+
.addValidator("sport", new SelectValidator(
|
|
242
|
+
{
|
|
243
|
+
required: true,
|
|
244
|
+
options: formState.sports
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
required: "Required {{options}}",
|
|
248
|
+
invalid_option: "Invalod option {{option}} {{options}}"
|
|
249
|
+
}))
|
|
250
|
+
.format(formState.data);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function datetimeLocal(date: Date) {
|
|
254
|
+
if (!date) {
|
|
255
|
+
return "";
|
|
256
|
+
}
|
|
257
|
+
const tzo = - date.getTimezoneOffset();
|
|
258
|
+
if (tzo === 0) {
|
|
259
|
+
return date.toISOString();
|
|
260
|
+
} else {
|
|
261
|
+
// let dif = tzo >= 0 ? "+" : "-";
|
|
262
|
+
const pad = function (num: number, digits = 2) {
|
|
263
|
+
return String(num).padStart(digits, "0");
|
|
264
|
+
};
|
|
265
|
+
return (
|
|
266
|
+
date.getFullYear() +
|
|
267
|
+
"-" +
|
|
268
|
+
pad(date.getMonth() + 1) +
|
|
269
|
+
"-" +
|
|
270
|
+
pad(date.getDate()) +
|
|
271
|
+
"T" +
|
|
272
|
+
pad(date.getHours()) +
|
|
273
|
+
":" +
|
|
274
|
+
pad(date.getMinutes())
|
|
275
|
+
// pad(tzo >= 0 ? date.getHours() + (tzo / 60) : date.getHours() - (tzo / 60)) +
|
|
276
|
+
// ":" +
|
|
277
|
+
// pad(tzo >= 0 ? date.getMinutes() + (tzo % 60) : date.getMinutes() - (tzo % 60))
|
|
278
|
+
);
|
|
279
|
+
// return (
|
|
280
|
+
// date.getFullYear() +
|
|
281
|
+
// "-" +
|
|
282
|
+
// pad(date.getMonth() + 1) +
|
|
283
|
+
// "-" +
|
|
284
|
+
// pad(date.getDate()) +
|
|
285
|
+
// "T" +
|
|
286
|
+
// pad(date.getHours()) +
|
|
287
|
+
// ":" +
|
|
288
|
+
// pad(date.getMinutes()) +
|
|
289
|
+
// ":" +
|
|
290
|
+
// pad(date.getSeconds()) +
|
|
291
|
+
// dif +
|
|
292
|
+
// pad(tzo / 60) +
|
|
293
|
+
// ":" +
|
|
294
|
+
// pad(tzo % 60) +
|
|
295
|
+
// "." +
|
|
296
|
+
// pad(date.getMilliseconds(), 3)
|
|
297
|
+
// );
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
happ<State, Actions>(state, view, dispatcher);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { HElement,
|
|
2
|
-
import {
|
|
1
|
+
import { HElement, hjoin } from "../src/hsml";
|
|
2
|
+
import { HAppActions, HDispatcher, HState, HView, happ } from "../src/hsml-app";
|
|
3
3
|
|
|
4
4
|
interface FormData {
|
|
5
5
|
name: string;
|
|
@@ -10,7 +10,7 @@ interface FormData {
|
|
|
10
10
|
sport: string;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
interface
|
|
13
|
+
interface State {
|
|
14
14
|
title: string;
|
|
15
15
|
data: FormData;
|
|
16
16
|
genders: {
|
|
@@ -20,7 +20,7 @@ interface FormState {
|
|
|
20
20
|
sports: string[];
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
const
|
|
23
|
+
const state: HState<State> = function () {
|
|
24
24
|
return {
|
|
25
25
|
title: "HSML App Form",
|
|
26
26
|
data: {
|
|
@@ -40,12 +40,16 @@ const formState: HState<FormState> = function () {
|
|
|
40
40
|
};
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
// type FormActions =
|
|
44
|
+
// "form-change" |
|
|
45
|
+
// "form-submit";
|
|
46
|
+
|
|
47
|
+
enum Actions {
|
|
44
48
|
change = "form-change",
|
|
45
49
|
submit = "form-submit"
|
|
46
50
|
}
|
|
47
51
|
|
|
48
|
-
const
|
|
52
|
+
const view: HView<State, Actions> = function (state) {
|
|
49
53
|
return [
|
|
50
54
|
["div.w3-content.w3-light-gray", [
|
|
51
55
|
["div.w3-container", [
|
|
@@ -53,8 +57,8 @@ const formView: HView<FormState> = function (state): HElements {
|
|
|
53
57
|
["form.w3-panel",
|
|
54
58
|
{
|
|
55
59
|
on: [
|
|
56
|
-
["change",
|
|
57
|
-
["submit",
|
|
60
|
+
["change", Actions.change],
|
|
61
|
+
["submit", Actions.submit]
|
|
58
62
|
]
|
|
59
63
|
},
|
|
60
64
|
[
|
|
@@ -97,14 +101,14 @@ const formView: HView<FormState> = function (state): HElements {
|
|
|
97
101
|
["input#ch.w3-check", {
|
|
98
102
|
type: "checkbox",
|
|
99
103
|
name: "married",
|
|
100
|
-
checked: state.data.married
|
|
104
|
+
checked: state.data.married ?? false
|
|
101
105
|
}],
|
|
102
106
|
" Married"
|
|
103
107
|
]]
|
|
104
108
|
]],
|
|
105
109
|
["p",
|
|
106
110
|
hjoin(
|
|
107
|
-
state.genders.map<HElement
|
|
111
|
+
state.genders.map<HElement<Actions>>(gender => (
|
|
108
112
|
["label", [
|
|
109
113
|
["input.w3-radio", {
|
|
110
114
|
type: "radio",
|
|
@@ -129,7 +133,7 @@ const formView: HView<FormState> = function (state): HElements {
|
|
|
129
133
|
},
|
|
130
134
|
"Sport"
|
|
131
135
|
],
|
|
132
|
-
...state.sports.map<HElement
|
|
136
|
+
...state.sports.map<HElement<Actions>>(sport => (
|
|
133
137
|
["option",
|
|
134
138
|
{
|
|
135
139
|
value: sport,
|
|
@@ -149,21 +153,21 @@ const formView: HView<FormState> = function (state): HElements {
|
|
|
149
153
|
];
|
|
150
154
|
};
|
|
151
155
|
|
|
152
|
-
const
|
|
156
|
+
const dispatcher: HDispatcher<State, Actions> = async function (action, state) {
|
|
153
157
|
switch (action.type) {
|
|
154
158
|
|
|
155
|
-
case
|
|
156
|
-
case
|
|
157
|
-
case
|
|
158
|
-
case
|
|
159
|
+
case HAppActions.init:
|
|
160
|
+
case HAppActions.mount:
|
|
161
|
+
case HAppActions.umount:
|
|
162
|
+
case HAppActions.elementAttr:
|
|
159
163
|
break;
|
|
160
164
|
|
|
161
|
-
case
|
|
162
|
-
console.log("
|
|
165
|
+
case Actions.change:
|
|
166
|
+
console.log("FormActions.change", JSON.stringify(action.data, null, 4));
|
|
163
167
|
break;
|
|
164
168
|
|
|
165
|
-
case
|
|
166
|
-
console.log("
|
|
169
|
+
case Actions.submit:
|
|
170
|
+
console.log("FormActions.submit", JSON.stringify(action.data, null, 4));
|
|
167
171
|
const formData = JSON.stringify(action.data, null, 4);
|
|
168
172
|
alert(`Form submit: \n${formData}`);
|
|
169
173
|
state.data = { ...state.data, ...action.data };
|
|
@@ -177,4 +181,4 @@ function datetimeLocal(date: Date) {
|
|
|
177
181
|
return date.toISOString().slice(0, 16);
|
|
178
182
|
}
|
|
179
183
|
|
|
180
|
-
happ<
|
|
184
|
+
happ<State, Actions>(state, view, dispatcher);
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<h1>PeRyL hsml app demo</h1>
|
|
11
11
|
<div id="app"></div>
|
|
12
12
|
<!-- <script src="../incremental-dom/dist/umd/incremental-dom.js"></script> -->
|
|
13
|
-
<script type="module" src="hsml-
|
|
13
|
+
<script type="module" src="hsml-app-test_demo.ts"></script>
|
|
14
14
|
</body>
|
|
15
15
|
|
|
16
16
|
</html>
|