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.
Files changed (297) hide show
  1. package/README.md +31 -17
  2. package/demo/form_demo.ts +1 -1
  3. package/demo/hsml-app-form-validation_demo.html +17 -0
  4. package/demo/hsml-app-form-validation_demo.ts +301 -0
  5. package/demo/hsml-app-form_demo.ts +25 -21
  6. package/demo/{hsml-appc_demo.html → hsml-app-test_demo.html} +1 -1
  7. package/demo/hsml-app-test_demo.ts +224 -0
  8. package/demo/hsml-app-tictactoe_demo.html +19 -0
  9. package/demo/hsml-app-tictactoe_demo.ts +86 -0
  10. package/demo/hsml-app_demo.html +2 -4
  11. package/demo/hsml-app_demo.ts +47 -198
  12. package/demo/hsml-appel_demo.html +7 -0
  13. package/demo/hsml-appel_demo.ts +33 -25
  14. package/demo/hsml-appi_demo.ts +9 -9
  15. package/demo/hsml_demo.ts +27 -22
  16. package/demo/js/hsml-app-js-happi_demo.html +16 -8
  17. package/demo/js/hsml-app-js_demo.html +15 -15
  18. package/dist/browser-esmodule/dom.js +9 -6
  19. package/dist/browser-esmodule/dom.js.map +1 -1
  20. package/dist/browser-esmodule/encode.js.map +1 -1
  21. package/dist/browser-esmodule/hash.js +3 -2
  22. package/dist/browser-esmodule/hash.js.map +1 -1
  23. package/dist/browser-esmodule/hsml-app.js +102 -97
  24. package/dist/browser-esmodule/hsml-app.js.map +1 -1
  25. package/dist/browser-esmodule/hsml-convert.js.map +1 -1
  26. package/dist/browser-esmodule/hsml-dom.js +7 -5
  27. package/dist/browser-esmodule/hsml-dom.js.map +1 -1
  28. package/dist/browser-esmodule/hsml-h.js.map +1 -1
  29. package/dist/browser-esmodule/hsml-html.js +4 -3
  30. package/dist/browser-esmodule/hsml-html.js.map +1 -1
  31. package/dist/browser-esmodule/hsml-idom.js +7 -6
  32. package/dist/browser-esmodule/hsml-idom.js.map +1 -1
  33. package/dist/browser-esmodule/hsml.js +2 -1
  34. package/dist/browser-esmodule/hsml.js.map +1 -1
  35. package/dist/browser-esmodule/http.js +4 -2
  36. package/dist/browser-esmodule/http.js.map +1 -1
  37. package/dist/browser-esmodule/index.js +177 -151
  38. package/dist/browser-esmodule/index.js.map +1 -1
  39. package/dist/browser-esmodule/router.js +2 -2
  40. package/dist/browser-esmodule/router.js.map +1 -1
  41. package/dist/browser-esmodule/settings.js.map +1 -1
  42. package/dist/browser-esmodule/validators-moment.js +37 -27
  43. package/dist/browser-esmodule/validators-moment.js.map +1 -1
  44. package/dist/browser-esmodule/validators-numeral.js +38 -28
  45. package/dist/browser-esmodule/validators-numeral.js.map +1 -1
  46. package/dist/browser-esmodule/validators-object.js +3 -2
  47. package/dist/browser-esmodule/validators-object.js.map +1 -1
  48. package/dist/browser-esmodule/validators.js +27 -20
  49. package/dist/browser-esmodule/validators.js.map +1 -1
  50. package/dist/browser-umd/dom.js +1 -1
  51. package/dist/browser-umd/dom.js.map +1 -1
  52. package/dist/browser-umd/encode.js +1 -1
  53. package/dist/browser-umd/encode.js.map +1 -1
  54. package/dist/browser-umd/hash.js +1 -1
  55. package/dist/browser-umd/hash.js.map +1 -1
  56. package/dist/browser-umd/hsml-app.js +1 -1
  57. package/dist/browser-umd/hsml-app.js.map +1 -1
  58. package/dist/browser-umd/hsml-convert.js.map +1 -1
  59. package/dist/browser-umd/hsml-dom.js +1 -1
  60. package/dist/browser-umd/hsml-dom.js.map +1 -1
  61. package/dist/browser-umd/hsml-h.js.map +1 -1
  62. package/dist/browser-umd/hsml-html.js +1 -1
  63. package/dist/browser-umd/hsml-html.js.map +1 -1
  64. package/dist/browser-umd/hsml-idom.js +1 -1
  65. package/dist/browser-umd/hsml-idom.js.map +1 -1
  66. package/dist/browser-umd/hsml.js +1 -1
  67. package/dist/browser-umd/hsml.js.map +1 -1
  68. package/dist/browser-umd/http.js +1 -1
  69. package/dist/browser-umd/http.js.map +1 -1
  70. package/dist/browser-umd/index.js +1 -1
  71. package/dist/browser-umd/index.js.map +1 -1
  72. package/dist/browser-umd/router.js +1 -1
  73. package/dist/browser-umd/router.js.map +1 -1
  74. package/dist/browser-umd/settings.js.map +1 -1
  75. package/dist/browser-umd/validators-moment.js +1 -1
  76. package/dist/browser-umd/validators-moment.js.map +1 -1
  77. package/dist/browser-umd/validators-numeral.js +1 -1
  78. package/dist/browser-umd/validators-numeral.js.map +1 -1
  79. package/dist/browser-umd/validators-object.js +1 -1
  80. package/dist/browser-umd/validators-object.js.map +1 -1
  81. package/dist/browser-umd/validators.js +1 -1
  82. package/dist/browser-umd/validators.js.map +1 -1
  83. package/dist/demo/dom_demo.8df77c05.js +2 -0
  84. package/dist/demo/dom_demo.8df77c05.js.map +1 -0
  85. package/dist/demo/dom_demo.df09792b.js +2 -0
  86. package/dist/demo/dom_demo.df09792b.js.map +1 -0
  87. package/dist/demo/dom_demo.html +1 -1
  88. package/dist/demo/encode_demo.ce182166.js.map +1 -1
  89. package/dist/demo/encode_demo.f40a44eb.js.map +1 -1
  90. package/dist/demo/form_demo.0574ff51.js +2 -0
  91. package/dist/demo/form_demo.0574ff51.js.map +1 -0
  92. package/dist/demo/form_demo.4d337a03.js +2 -0
  93. package/dist/demo/form_demo.4d337a03.js.map +1 -0
  94. package/dist/demo/form_demo.html +1 -1
  95. package/dist/demo/hash_demo.00d956f4.js +2 -0
  96. package/dist/demo/hash_demo.00d956f4.js.map +1 -0
  97. package/dist/demo/hash_demo.94e63b31.js +2 -0
  98. package/dist/demo/hash_demo.94e63b31.js.map +1 -0
  99. package/dist/demo/hash_demo.html +1 -1
  100. package/dist/demo/history_demo.474c0b2f.js +2 -0
  101. package/dist/demo/history_demo.474c0b2f.js.map +1 -0
  102. package/dist/demo/history_demo.bb7446f1.js +2 -0
  103. package/dist/demo/history_demo.bb7446f1.js.map +1 -0
  104. package/dist/demo/history_demo.html +1 -1
  105. package/dist/demo/hsml-app-form-validation_demo.a9e2c583.js +2 -0
  106. package/dist/demo/hsml-app-form-validation_demo.a9e2c583.js.map +1 -0
  107. package/dist/demo/hsml-app-form-validation_demo.bb392ab0.js +2 -0
  108. package/dist/demo/hsml-app-form-validation_demo.bb392ab0.js.map +1 -0
  109. package/dist/demo/hsml-app-form-validation_demo.c6856b02.js +2 -0
  110. package/dist/demo/hsml-app-form-validation_demo.c6856b02.js.map +1 -0
  111. package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js +2 -0
  112. package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js.map +1 -0
  113. package/dist/demo/hsml-app-form-validation_demo.html +1 -0
  114. package/dist/demo/hsml-app-form_demo.e36ef1e9.js +2 -0
  115. package/dist/demo/hsml-app-form_demo.e36ef1e9.js.map +1 -0
  116. package/dist/demo/hsml-app-form_demo.fd22dfcf.js +2 -0
  117. package/dist/demo/hsml-app-form_demo.fd22dfcf.js.map +1 -0
  118. package/dist/demo/hsml-app-form_demo.html +1 -1
  119. package/dist/demo/hsml-app-test_demo.ba5f166c.js +2 -0
  120. package/dist/demo/hsml-app-test_demo.ba5f166c.js.map +1 -0
  121. package/dist/demo/hsml-app-test_demo.e8b5e4b2.js +2 -0
  122. package/dist/demo/hsml-app-test_demo.e8b5e4b2.js.map +1 -0
  123. package/dist/demo/hsml-app-test_demo.html +1 -0
  124. package/dist/demo/hsml-app-tictactoe_demo.03d8363f.js +2 -0
  125. package/dist/demo/hsml-app-tictactoe_demo.03d8363f.js.map +1 -0
  126. package/dist/demo/hsml-app-tictactoe_demo.399f8e69.js +2 -0
  127. package/dist/demo/hsml-app-tictactoe_demo.399f8e69.js.map +1 -0
  128. package/dist/demo/hsml-app-tictactoe_demo.html +1 -0
  129. package/dist/demo/hsml-app_demo.44aa1072.js +2 -0
  130. package/dist/demo/hsml-app_demo.44aa1072.js.map +1 -0
  131. package/dist/demo/hsml-app_demo.70ef3e7a.js +2 -0
  132. package/dist/demo/hsml-app_demo.70ef3e7a.js.map +1 -0
  133. package/dist/demo/hsml-app_demo.html +1 -1
  134. package/dist/demo/hsml-appel_demo.2a9f7f3f.js +2 -0
  135. package/dist/demo/hsml-appel_demo.2a9f7f3f.js.map +1 -0
  136. package/dist/demo/hsml-appel_demo.bea7849a.js +2 -0
  137. package/dist/demo/hsml-appel_demo.bea7849a.js.map +1 -0
  138. package/dist/demo/hsml-appel_demo.html +1 -1
  139. package/dist/demo/hsml-appi_demo.3dc5de90.js +2 -0
  140. package/dist/demo/hsml-appi_demo.3dc5de90.js.map +1 -0
  141. package/dist/demo/hsml-appi_demo.bfc7056a.js +2 -0
  142. package/dist/demo/hsml-appi_demo.bfc7056a.js.map +1 -0
  143. package/dist/demo/hsml-appi_demo.html +1 -1
  144. package/dist/demo/hsml-convert_demo.0ea1fa3b.js.map +1 -1
  145. package/dist/demo/hsml-convert_demo.63e3e7b5.js.map +1 -1
  146. package/dist/demo/{hsml_demo.ff950ba1.js → hsml_demo.a248689a.js} +2 -2
  147. package/dist/demo/hsml_demo.a248689a.js.map +1 -0
  148. package/dist/demo/hsml_demo.eb3b08be.js +2 -0
  149. package/dist/demo/hsml_demo.eb3b08be.js.map +1 -0
  150. package/dist/demo/hsml_demo.html +1 -1
  151. package/dist/demo/http_demo.3e7da3d8.js +2 -0
  152. package/dist/demo/http_demo.3e7da3d8.js.map +1 -0
  153. package/dist/demo/http_demo.8e435f23.js +2 -0
  154. package/dist/demo/http_demo.8e435f23.js.map +1 -0
  155. package/dist/demo/http_demo.html +1 -1
  156. package/dist/demo/i18n_demo.html +1 -1
  157. package/dist/demo/router_demo.3cfa03aa.js +2 -0
  158. package/dist/demo/{router_demo.c42ee304.js.map → router_demo.3cfa03aa.js.map} +1 -1
  159. package/dist/demo/router_demo.89ab1681.js +2 -0
  160. package/dist/demo/{router_demo.8703f75f.js.map → router_demo.89ab1681.js.map} +1 -1
  161. package/dist/demo/router_demo.html +1 -1
  162. package/dist/demo/template_demo.07e850de.js +2 -0
  163. package/dist/demo/template_demo.07e850de.js.map +1 -0
  164. package/dist/demo/template_demo.52b839c7.js +2 -0
  165. package/dist/demo/template_demo.52b839c7.js.map +1 -0
  166. package/dist/demo/template_demo.html +1 -1
  167. package/dist/demo/validators_demo.6a5913d0.js +4 -0
  168. package/dist/demo/validators_demo.6a5913d0.js.map +1 -0
  169. package/dist/demo/validators_demo.8a773c14.js +4 -0
  170. package/dist/demo/validators_demo.8a773c14.js.map +1 -0
  171. package/dist/demo/{validators_demo.6d800c84.js → validators_demo.90ff6001.js} +2 -2
  172. package/dist/demo/validators_demo.90ff6001.js.map +1 -0
  173. package/dist/demo/{validators_demo.02c73222.js → validators_demo.ef5b2dea.js} +2 -2
  174. package/dist/demo/validators_demo.ef5b2dea.js.map +1 -0
  175. package/dist/demo/validators_demo.html +1 -1
  176. package/dist/dom.js +9 -6
  177. package/dist/dom.js.map +1 -1
  178. package/dist/encode.js +1 -1
  179. package/dist/encode.js.map +1 -1
  180. package/dist/hash.js +3 -2
  181. package/dist/hash.js.map +1 -1
  182. package/dist/hsml-app.d.ts +41 -39
  183. package/dist/hsml-app.js +87 -88
  184. package/dist/hsml-app.js.map +1 -1
  185. package/dist/hsml-convert.d.ts +3 -3
  186. package/dist/hsml-convert.js.map +1 -1
  187. package/dist/hsml-dom.d.ts +2 -2
  188. package/dist/hsml-dom.js +5 -4
  189. package/dist/hsml-dom.js.map +1 -1
  190. package/dist/hsml-h.d.ts +9 -9
  191. package/dist/hsml-h.js.map +1 -1
  192. package/dist/hsml-html.d.ts +4 -4
  193. package/dist/hsml-html.js +2 -2
  194. package/dist/hsml-html.js.map +1 -1
  195. package/dist/hsml-idom.d.ts +2 -2
  196. package/dist/hsml-idom.js +5 -5
  197. package/dist/hsml-idom.js.map +1 -1
  198. package/dist/hsml.d.ts +28 -27
  199. package/dist/hsml.js +2 -1
  200. package/dist/hsml.js.map +1 -1
  201. package/dist/http.js +5 -3
  202. package/dist/http.js.map +1 -1
  203. package/dist/router.js +5 -5
  204. package/dist/router.js.map +1 -1
  205. package/dist/validators-moment.js +11 -8
  206. package/dist/validators-moment.js.map +1 -1
  207. package/dist/validators-numeral.js +11 -8
  208. package/dist/validators-numeral.js.map +1 -1
  209. package/dist/validators-object.js +3 -2
  210. package/dist/validators-object.js.map +1 -1
  211. package/dist/validators.js +23 -16
  212. package/dist/validators.js.map +1 -1
  213. package/package.json +10 -11
  214. package/src/dom.ts +6 -6
  215. package/src/hash.ts +2 -2
  216. package/src/hsml-app.ts +230 -167
  217. package/src/hsml-convert.ts +8 -8
  218. package/src/hsml-dom.ts +22 -34
  219. package/src/hsml-h.ts +11 -11
  220. package/src/hsml-html.ts +22 -29
  221. package/src/hsml-idom.ts +28 -40
  222. package/src/hsml.ts +52 -145
  223. package/src/http.ts +2 -2
  224. package/src/router.ts +4 -4
  225. package/src/settings.ts +1 -1
  226. package/src/validators-moment.ts +10 -10
  227. package/src/validators-numeral.ts +8 -8
  228. package/src/validators-object.ts +2 -2
  229. package/src/validators.ts +22 -21
  230. package/demo/hsml-app-tictactoe-demo.html +0 -16
  231. package/demo/hsml-app-tictactoe-demo.ts +0 -70
  232. package/demo/hsml-appc_demo.ts +0 -49
  233. package/dist/demo/dom_demo.3e0ad00b.js +0 -2
  234. package/dist/demo/dom_demo.3e0ad00b.js.map +0 -1
  235. package/dist/demo/dom_demo.94c07802.js +0 -2
  236. package/dist/demo/dom_demo.94c07802.js.map +0 -1
  237. package/dist/demo/form_demo.40b774c2.js +0 -2
  238. package/dist/demo/form_demo.40b774c2.js.map +0 -1
  239. package/dist/demo/form_demo.75ed39a0.js +0 -2
  240. package/dist/demo/form_demo.75ed39a0.js.map +0 -1
  241. package/dist/demo/hash_demo.416ed5fa.js +0 -2
  242. package/dist/demo/hash_demo.416ed5fa.js.map +0 -1
  243. package/dist/demo/hash_demo.b40a9611.js +0 -2
  244. package/dist/demo/hash_demo.b40a9611.js.map +0 -1
  245. package/dist/demo/history_demo.e11ea378.js +0 -2
  246. package/dist/demo/history_demo.e11ea378.js.map +0 -1
  247. package/dist/demo/history_demo.feee2e18.js +0 -2
  248. package/dist/demo/history_demo.feee2e18.js.map +0 -1
  249. package/dist/demo/hsml-app-form_demo.06d87b64.js +0 -2
  250. package/dist/demo/hsml-app-form_demo.06d87b64.js.map +0 -1
  251. package/dist/demo/hsml-app-form_demo.4706bc2e.js +0 -2
  252. package/dist/demo/hsml-app-form_demo.4706bc2e.js.map +0 -1
  253. package/dist/demo/hsml-app-tictactoe-demo.e0bc6fed.js +0 -2
  254. package/dist/demo/hsml-app-tictactoe-demo.e0bc6fed.js.map +0 -1
  255. package/dist/demo/hsml-app-tictactoe-demo.f9399bf0.js +0 -2
  256. package/dist/demo/hsml-app-tictactoe-demo.f9399bf0.js.map +0 -1
  257. package/dist/demo/hsml-app-tictactoe-demo.html +0 -1
  258. package/dist/demo/hsml-app_demo.033431ac.js +0 -2
  259. package/dist/demo/hsml-app_demo.033431ac.js.map +0 -1
  260. package/dist/demo/hsml-app_demo.204365df.js +0 -2
  261. package/dist/demo/hsml-app_demo.204365df.js.map +0 -1
  262. package/dist/demo/hsml-appc_demo.06ff0d1d.js +0 -2
  263. package/dist/demo/hsml-appc_demo.06ff0d1d.js.map +0 -1
  264. package/dist/demo/hsml-appc_demo.702d405b.js +0 -2
  265. package/dist/demo/hsml-appc_demo.702d405b.js.map +0 -1
  266. package/dist/demo/hsml-appc_demo.74bd46ea.js +0 -2
  267. package/dist/demo/hsml-appc_demo.74bd46ea.js.map +0 -1
  268. package/dist/demo/hsml-appc_demo.9a97c24c.js +0 -2
  269. package/dist/demo/hsml-appc_demo.9a97c24c.js.map +0 -1
  270. package/dist/demo/hsml-appc_demo.html +0 -1
  271. package/dist/demo/hsml-appel_demo.2a0812f7.js +0 -2
  272. package/dist/demo/hsml-appel_demo.2a0812f7.js.map +0 -1
  273. package/dist/demo/hsml-appel_demo.36395e9f.js +0 -2
  274. package/dist/demo/hsml-appel_demo.36395e9f.js.map +0 -1
  275. package/dist/demo/hsml-appi_demo.0492f5a4.js +0 -2
  276. package/dist/demo/hsml-appi_demo.0492f5a4.js.map +0 -1
  277. package/dist/demo/hsml-appi_demo.0847d145.js +0 -2
  278. package/dist/demo/hsml-appi_demo.0847d145.js.map +0 -1
  279. package/dist/demo/hsml_demo.33f28c29.js +0 -2
  280. package/dist/demo/hsml_demo.33f28c29.js.map +0 -1
  281. package/dist/demo/hsml_demo.ff950ba1.js.map +0 -1
  282. package/dist/demo/http_demo.0c22b4b7.js +0 -2
  283. package/dist/demo/http_demo.0c22b4b7.js.map +0 -1
  284. package/dist/demo/http_demo.cd09bdb8.js +0 -2
  285. package/dist/demo/http_demo.cd09bdb8.js.map +0 -1
  286. package/dist/demo/router_demo.8703f75f.js +0 -2
  287. package/dist/demo/router_demo.c42ee304.js +0 -2
  288. package/dist/demo/template_demo.60b5d288.js +0 -2
  289. package/dist/demo/template_demo.60b5d288.js.map +0 -1
  290. package/dist/demo/template_demo.7015ed65.js +0 -2
  291. package/dist/demo/template_demo.7015ed65.js.map +0 -1
  292. package/dist/demo/validators_demo.02c73222.js.map +0 -1
  293. package/dist/demo/validators_demo.05b7c138.js +0 -4
  294. package/dist/demo/validators_demo.05b7c138.js.map +0 -1
  295. package/dist/demo/validators_demo.48785856.js +0 -4
  296. package/dist/demo/validators_demo.48785856.js.map +0 -1
  297. 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 applications development.
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 applications development.
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
- const Action = {
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
- on: ["input", Action.title]
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", Action.clear] },
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
- { on: ["click", Action.dec, 1] },
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", Action.inc, 2] },
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
- case HAppAction._init:
105
- case HAppAction._mount:
106
- case HAppAction._umount:
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 Action.title:
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 Action.inc:
126
+ case Actions.inc:
114
127
  state.count = state.count + action.data;
115
128
  // async action call
116
- setTimeout(() => dispatch(Action.dec, 1), 1e3);
129
+ setTimeout(() => dispatch(Actions.dec, 1), 1e3);
117
130
  break;
118
131
 
119
- case Action.dec:
132
+ case Actions.dec:
120
133
  state.count = state.count - action.data;
121
134
  break;
122
135
 
123
- case Action.clear:
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
- // HApp.debug = true;
145
+ HApp.debug = true; // Print console flux lifecycle details
133
146
 
134
- new HApp(state, view, dispatcher, document.getElementById("app"));
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, HElements, hjoin } from "../src/hsml";
2
- import { happ, HAppAction, HDispatcher, HState, HView } from "../src/hsml-app";
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 FormState {
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 formState: HState<FormState> = function () {
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
- enum FormAction {
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 formView: HView<FormState> = function (state): HElements {
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", FormAction.change],
57
- ["submit", FormAction.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 || false
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>(gender => (
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>(sport => (
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 formDispatcher: HDispatcher<FormState> = async function (action, state) {
156
+ const dispatcher: HDispatcher<State, Actions> = async function (action, state) {
153
157
  switch (action.type) {
154
158
 
155
- case HAppAction._init:
156
- case HAppAction._mount:
157
- case HAppAction._umount:
158
- case HAppAction._element:
159
+ case HAppActions.init:
160
+ case HAppActions.mount:
161
+ case HAppActions.umount:
162
+ case HAppActions.elementAttr:
159
163
  break;
160
164
 
161
- case FormAction.change:
162
- console.log("FormAction.change", JSON.stringify(action.data, null, 4));
165
+ case Actions.change:
166
+ console.log("FormActions.change", JSON.stringify(action.data, null, 4));
163
167
  break;
164
168
 
165
- case FormAction.submit:
166
- console.log("FormAction.submit", JSON.stringify(action.data, null, 4));
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<FormState>(formState, formView, formDispatcher);
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-appc_demo.ts"></script>
13
+ <script type="module" src="hsml-app-test_demo.ts"></script>
14
14
  </body>
15
15
 
16
16
  </html>