@schukai/monster 3.51.5 → 3.52.1

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 (361) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +15 -12
  3. package/example/components/form/button.mjs +10 -0
  4. package/example/components/form/select.mjs +25 -0
  5. package/example/components/form/tree-select.mjs +27 -0
  6. package/example/components/host/host.mjs +0 -0
  7. package/example/components/notify/message.mjs +4 -0
  8. package/example/components/notify/notify.mjs +4 -0
  9. package/example/components/state/log.mjs +0 -0
  10. package/example/components/state/state.mjs +0 -0
  11. package/example/data/datasource/server/restapi.mjs +7 -1
  12. package/package.json +6 -2
  13. package/source/components/constants.mjs +132 -0
  14. package/source/components/datatable/columnbar.mjs +310 -0
  15. package/source/components/datatable/constants.mjs +121 -0
  16. package/source/components/datatable/dataset.mjs +219 -0
  17. package/source/components/datatable/datasource/dom.mjs +186 -0
  18. package/source/components/datatable/datasource/namespace.mjs +13 -0
  19. package/source/components/datatable/datasource/rest.mjs +400 -0
  20. package/source/components/datatable/datasource.mjs +102 -0
  21. package/source/components/datatable/datatable/header.mjs +268 -0
  22. package/source/components/datatable/datatable/namespace.mjs +13 -0
  23. package/source/components/datatable/datatable.mjs +789 -0
  24. package/source/components/datatable/embedded-pagination.mjs +113 -0
  25. package/source/components/datatable/filter/abstract-base.mjs +31 -0
  26. package/source/components/datatable/filter/date-range.mjs +1041 -0
  27. package/source/components/datatable/filter/input.mjs +175 -0
  28. package/source/components/datatable/filter/namespace.mjs +13 -0
  29. package/source/components/datatable/filter/range.mjs +671 -0
  30. package/source/components/datatable/filter/select.mjs +65 -0
  31. package/source/components/datatable/filter/settings.mjs +116 -0
  32. package/source/components/datatable/filter-button.mjs +98 -0
  33. package/source/components/datatable/filter.mjs +929 -0
  34. package/source/components/datatable/namespace.mjs +11 -0
  35. package/source/components/datatable/pagination.mjs +456 -0
  36. package/source/components/datatable/style/column-bar.pcss +123 -0
  37. package/source/components/datatable/style/dataset.pcss +13 -0
  38. package/source/components/datatable/style/datasource.pcss +16 -0
  39. package/source/components/datatable/style/datatable.pcss +239 -0
  40. package/source/components/datatable/style/embedded-pagination.pcss +101 -0
  41. package/source/components/datatable/style/filter-button.pcss +22 -0
  42. package/source/components/datatable/style/filter-controls-defaults.pcss +46 -0
  43. package/source/components/datatable/style/filter-date-range.pcss +9 -0
  44. package/source/components/datatable/style/filter-range.pcss +5 -0
  45. package/source/components/datatable/style/filter.pcss +156 -0
  46. package/source/components/datatable/style/pagination.pcss +59 -0
  47. package/source/components/datatable/style/select-filter.pcss +27 -0
  48. package/source/components/datatable/stylesheet/column-bar.mjs +27 -0
  49. package/source/components/datatable/stylesheet/dataset.mjs +27 -0
  50. package/source/components/datatable/stylesheet/datasource.mjs +27 -0
  51. package/source/components/datatable/stylesheet/datatable.mjs +27 -0
  52. package/source/components/datatable/stylesheet/embedded-pagination.mjs +27 -0
  53. package/source/components/datatable/stylesheet/filter-button.mjs +27 -0
  54. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +27 -0
  55. package/source/components/datatable/stylesheet/filter-date-range.mjs +27 -0
  56. package/source/components/datatable/stylesheet/filter-range.mjs +27 -0
  57. package/source/components/datatable/stylesheet/filter.mjs +27 -0
  58. package/source/components/datatable/stylesheet/namespace.mjs +13 -0
  59. package/source/components/datatable/stylesheet/pagination.mjs +27 -0
  60. package/source/components/datatable/stylesheet/select-filter.mjs +27 -0
  61. package/source/components/datatable/util.mjs +60 -0
  62. package/source/components/form/action-button.mjs +262 -0
  63. package/source/components/form/api-button.mjs +515 -0
  64. package/source/components/form/button-bar.mjs +739 -0
  65. package/source/components/form/button.mjs +350 -0
  66. package/source/components/form/confirm-button.mjs +330 -0
  67. package/source/components/form/constants.mjs +111 -0
  68. package/source/components/form/context-help.mjs +123 -0
  69. package/source/components/form/events.mjs +84 -0
  70. package/source/components/form/form.mjs +601 -0
  71. package/source/components/form/message-state-button.mjs +396 -0
  72. package/source/components/form/namespace.mjs +13 -0
  73. package/source/components/form/popper-button.mjs +435 -0
  74. package/source/components/form/popper.mjs +487 -0
  75. package/source/components/form/reload.mjs +360 -0
  76. package/source/components/form/select.mjs +2314 -0
  77. package/source/components/form/shadow-reload.mjs +137 -0
  78. package/source/components/form/state-button.mjs +182 -0
  79. package/source/components/form/style/action-button.pcss +41 -0
  80. package/source/components/form/style/api-button.pcss +0 -0
  81. package/source/components/form/style/button-bar.pcss +51 -0
  82. package/source/components/form/style/button.pcss +8 -0
  83. package/source/components/form/style/confirm-button.pcss +17 -0
  84. package/source/components/form/style/context-help.pcss +16 -0
  85. package/source/components/form/style/form.pcss +10 -0
  86. package/source/components/form/style/message-state-button.pcss +10 -0
  87. package/source/components/form/style/popper-button.pcss +16 -0
  88. package/source/components/form/style/popper.pcss +8 -0
  89. package/source/components/form/style/select.pcss +265 -0
  90. package/source/components/form/style/state-button.pcss +116 -0
  91. package/source/components/form/style/tabs.pcss +173 -0
  92. package/source/components/form/style/tree-select.pcss +81 -0
  93. package/source/components/form/stylesheet/action-button.mjs +27 -0
  94. package/source/components/form/stylesheet/api-button.mjs +27 -0
  95. package/source/components/form/stylesheet/button-bar.mjs +27 -0
  96. package/source/components/form/stylesheet/button.mjs +27 -0
  97. package/source/components/form/stylesheet/confirm-button.mjs +27 -0
  98. package/source/components/form/stylesheet/context-help.mjs +27 -0
  99. package/source/components/form/stylesheet/form.mjs +27 -0
  100. package/source/components/form/stylesheet/message-state-button.mjs +27 -0
  101. package/source/components/form/stylesheet/namespace.mjs +13 -0
  102. package/source/components/form/stylesheet/popper-button.mjs +27 -0
  103. package/source/components/form/stylesheet/popper.mjs +27 -0
  104. package/source/components/form/stylesheet/select.mjs +27 -0
  105. package/source/components/form/stylesheet/state-button.mjs +27 -0
  106. package/source/components/form/stylesheet/tabs.mjs +27 -0
  107. package/source/components/form/stylesheet/tree-select.mjs +27 -0
  108. package/source/components/form/tabs.mjs +1029 -0
  109. package/source/components/form/template.mjs +373 -0
  110. package/source/components/form/tree-select.mjs +527 -0
  111. package/source/components/form/types/namespace.mjs +13 -0
  112. package/source/components/form/types/state.mjs +93 -0
  113. package/source/components/form/util/fetch.mjs +133 -0
  114. package/source/components/form/util/floating-ui.mjs +245 -0
  115. package/source/components/form/util/namespace.mjs +13 -0
  116. package/source/components/form/util/popper.mjs +49 -0
  117. package/source/components/host/call-button.mjs +236 -0
  118. package/source/components/host/collapse.mjs +526 -0
  119. package/source/components/host/config-manager.mjs +304 -0
  120. package/source/components/host/constants.mjs +18 -0
  121. package/source/components/host/details.mjs +268 -0
  122. package/source/components/host/events.mjs +131 -0
  123. package/source/components/host/host.mjs +420 -0
  124. package/source/components/host/namespace.mjs +13 -0
  125. package/source/components/host/overlay.mjs +339 -0
  126. package/source/components/host/style/call-button.pcss +36 -0
  127. package/source/components/host/style/collapse.pcss +67 -0
  128. package/source/components/host/style/config-manager.pcss +5 -0
  129. package/source/components/host/style/details.pcss +68 -0
  130. package/source/components/host/style/host.pcss +43 -0
  131. package/source/components/host/style/overlay.pcss +73 -0
  132. package/source/components/host/style/toggle-button.pcss +36 -0
  133. package/source/components/host/style/viewer.pcss +13 -0
  134. package/source/components/host/stylesheet/call-button.mjs +27 -0
  135. package/source/components/host/stylesheet/collapse.mjs +27 -0
  136. package/source/components/host/stylesheet/config-manager.mjs +27 -0
  137. package/source/components/host/stylesheet/details.mjs +27 -0
  138. package/source/components/host/stylesheet/host.mjs +27 -0
  139. package/source/components/host/stylesheet/namespace.mjs +13 -0
  140. package/source/components/host/stylesheet/overlay.mjs +27 -0
  141. package/source/components/host/stylesheet/toggle-button.mjs +27 -0
  142. package/source/components/host/stylesheet/viewer.mjs +27 -0
  143. package/source/components/host/toggle-button.mjs +88 -0
  144. package/source/components/host/util.mjs +23 -0
  145. package/source/components/host/viewer.mjs +309 -0
  146. package/source/components/namespace.mjs +14 -0
  147. package/source/components/notify/constants.mjs +15 -0
  148. package/source/components/notify/events.mjs +15 -0
  149. package/source/components/notify/message.mjs +374 -0
  150. package/source/components/notify/namespace.mjs +15 -0
  151. package/source/components/notify/notify.mjs +236 -0
  152. package/source/components/notify/style/message.pcss +57 -0
  153. package/source/components/notify/style/notify.pcss +118 -0
  154. package/source/components/notify/stylesheet/message.mjs +27 -0
  155. package/source/components/notify/stylesheet/namespace.mjs +15 -0
  156. package/source/components/notify/stylesheet/notify.mjs +27 -0
  157. package/source/components/state/log/entry.mjs +126 -0
  158. package/source/components/state/log/namespace.mjs +13 -0
  159. package/source/components/state/log.mjs +275 -0
  160. package/source/components/state/namespace.mjs +13 -0
  161. package/source/components/state/state.mjs +131 -0
  162. package/source/components/state/style/log.pcss +111 -0
  163. package/source/components/state/style/state.pcss +113 -0
  164. package/source/components/state/stylesheet/log.mjs +27 -0
  165. package/source/components/state/stylesheet/state.mjs +27 -0
  166. package/source/components/style/badge.pcss +92 -0
  167. package/source/components/style/border.pcss +77 -0
  168. package/source/components/style/button.pcss +105 -0
  169. package/source/components/style/card.pcss +108 -0
  170. package/source/components/style/color.pcss +257 -0
  171. package/source/components/style/common.pcss +105 -0
  172. package/source/components/style/control.pcss +11 -0
  173. package/source/components/style/data-grid.pcss +43 -0
  174. package/source/components/style/display.pcss +42 -0
  175. package/source/components/style/floating-ui.pcss +33 -0
  176. package/source/components/style/form.pcss +5 -0
  177. package/source/components/style/host.pcss +15 -0
  178. package/source/components/style/link.pcss +63 -0
  179. package/source/components/style/mixin/badge.pcss +18 -0
  180. package/source/components/style/mixin/button.pcss +52 -0
  181. package/source/components/style/mixin/form.pcss +247 -0
  182. package/source/components/style/mixin/hover.pcss +8 -0
  183. package/source/components/style/mixin/media.pcss +107 -0
  184. package/source/components/style/mixin/property.pcss +292 -0
  185. package/source/components/style/mixin/skeleton.pcss +26 -0
  186. package/source/components/style/mixin/spinner.pcss +24 -0
  187. package/source/components/style/mixin/typography.pcss +52 -0
  188. package/source/components/style/normalize.pcss +14 -0
  189. package/source/components/style/popper.pcss +78 -0
  190. package/source/components/style/property.pcss +17 -0
  191. package/source/components/style/ripple.pcss +14 -0
  192. package/source/components/style/skeleton.pcss +28 -0
  193. package/source/components/style/space.pcss +47 -0
  194. package/source/components/style/spinner.pcss +6 -0
  195. package/source/components/style/table.pcss +46 -0
  196. package/source/components/style/theme.pcss +119 -0
  197. package/source/components/style/typography.pcss +131 -0
  198. package/source/components/stylesheet/badge.mjs +27 -0
  199. package/source/components/stylesheet/border.mjs +27 -0
  200. package/source/components/stylesheet/button.mjs +27 -0
  201. package/source/components/stylesheet/card.mjs +27 -0
  202. package/source/components/stylesheet/color.mjs +27 -0
  203. package/source/components/stylesheet/common.mjs +27 -0
  204. package/source/components/stylesheet/control.mjs +27 -0
  205. package/source/components/stylesheet/data-grid.mjs +27 -0
  206. package/source/components/stylesheet/display.mjs +27 -0
  207. package/source/components/stylesheet/floating-ui.mjs +27 -0
  208. package/source/components/stylesheet/form.mjs +27 -0
  209. package/source/components/stylesheet/host.mjs +27 -0
  210. package/source/components/stylesheet/link.mjs +27 -0
  211. package/source/components/stylesheet/namespace.mjs +13 -0
  212. package/source/components/stylesheet/normalize.mjs +27 -0
  213. package/source/components/stylesheet/popper.mjs +27 -0
  214. package/source/components/stylesheet/property.mjs +27 -0
  215. package/source/components/stylesheet/ripple.mjs +27 -0
  216. package/source/components/stylesheet/skeleton.mjs +27 -0
  217. package/source/components/stylesheet/space.mjs +27 -0
  218. package/source/components/stylesheet/spinner.mjs +27 -0
  219. package/source/components/stylesheet/table.mjs +27 -0
  220. package/source/components/stylesheet/theme.mjs +27 -0
  221. package/source/components/stylesheet/tree-menu.mjs +33 -0
  222. package/source/components/stylesheet/typography.mjs +27 -0
  223. package/source/components/tree-menu/namespace.mjs +13 -0
  224. package/source/components/tree-menu/style/tree-menu.pcss +107 -0
  225. package/source/components/tree-menu/stylesheet/namespace.mjs +13 -0
  226. package/source/components/tree-menu/stylesheet/tree-menu.mjs +27 -0
  227. package/source/components/tree-menu/tree-menu.mjs +660 -0
  228. package/source/constraints/abstract.mjs +17 -24
  229. package/source/constraints/abstractoperator.mjs +27 -22
  230. package/source/constraints/andoperator.mjs +20 -17
  231. package/source/constraints/invalid.mjs +17 -17
  232. package/source/constraints/isarray.mjs +20 -20
  233. package/source/constraints/isobject.mjs +20 -20
  234. package/source/constraints/oroperator.mjs +45 -45
  235. package/source/constraints/valid.mjs +17 -17
  236. package/source/data/buildmap.mjs +108 -103
  237. package/source/data/buildtree.mjs +59 -57
  238. package/source/data/datasource/dom.mjs +80 -84
  239. package/source/data/datasource/namespace.mjs +1 -1
  240. package/source/data/datasource/server/restapi/data-fetch-error.mjs +27 -25
  241. package/source/data/datasource/server/restapi/writeerror.mjs +35 -32
  242. package/source/data/datasource/server/restapi.mjs +176 -177
  243. package/source/data/datasource/server/webconnect.mjs +150 -156
  244. package/source/data/datasource/server.mjs +62 -63
  245. package/source/data/datasource/storage/localstorage.mjs +25 -24
  246. package/source/data/datasource/storage/sessionstorage.mjs +28 -25
  247. package/source/data/datasource/storage.mjs +74 -73
  248. package/source/data/datasource.mjs +177 -168
  249. package/source/data/diff.mjs +98 -97
  250. package/source/data/extend.mjs +42 -42
  251. package/source/data/pathfinder.mjs +301 -288
  252. package/source/data/pipe.mjs +36 -36
  253. package/source/data/transformer.mjs +742 -726
  254. package/source/dom/assembler.mjs +44 -44
  255. package/source/dom/attributes.mjs +142 -122
  256. package/source/dom/constants.mjs +62 -58
  257. package/source/dom/customcontrol.mjs +299 -299
  258. package/source/dom/customelement.mjs +843 -806
  259. package/source/dom/dimension.mjs +56 -46
  260. package/source/dom/events.mjs +74 -69
  261. package/source/dom/focusmanager.mjs +175 -175
  262. package/source/dom/locale.mjs +28 -28
  263. package/source/dom/ready.mjs +13 -13
  264. package/source/dom/resource/data.mjs +117 -111
  265. package/source/dom/resource/link/stylesheet.mjs +16 -16
  266. package/source/dom/resource/link.mjs +94 -96
  267. package/source/dom/resource/script.mjs +72 -74
  268. package/source/dom/resource.mjs +174 -172
  269. package/source/dom/resourcemanager.mjs +152 -156
  270. package/source/dom/slotted.mjs +78 -80
  271. package/source/dom/template.mjs +126 -112
  272. package/source/dom/theme.mjs +35 -35
  273. package/source/dom/updater.mjs +673 -651
  274. package/source/dom/util/extract-keys.mjs +34 -22
  275. package/source/dom/util/init-options-from-attributes.mjs +46 -38
  276. package/source/dom/util/namespace.mjs +13 -0
  277. package/source/dom/util/set-option-from-attribute.mjs +35 -29
  278. package/source/dom/util.mjs +112 -81
  279. package/source/dom/worker/factory.mjs +83 -83
  280. package/source/i18n/formatter.mjs +75 -73
  281. package/source/i18n/locale.mjs +146 -144
  282. package/source/i18n/provider.mjs +70 -64
  283. package/source/i18n/providers/embed.mjs +136 -127
  284. package/source/i18n/providers/fetch.mjs +84 -76
  285. package/source/i18n/translations.mjs +205 -195
  286. package/source/logging/handler/console.mjs +36 -36
  287. package/source/logging/handler.mjs +140 -140
  288. package/source/logging/logentry.mjs +25 -25
  289. package/source/logging/logger.mjs +177 -175
  290. package/source/math/random.mjs +63 -59
  291. package/source/monster.mjs +223 -103
  292. package/source/net/webconnect/message.mjs +31 -31
  293. package/source/net/webconnect.mjs +278 -271
  294. package/source/text/bracketed-key-value-hash.mjs +182 -179
  295. package/source/text/formatter.mjs +235 -210
  296. package/source/text/generate-range-comparison-expression.mjs +56 -34
  297. package/source/text/namespace.mjs +1 -1
  298. package/source/types/base.mjs +69 -61
  299. package/source/types/basewithoptions.mjs +46 -46
  300. package/source/types/binary.mjs +20 -20
  301. package/source/types/dataurl.mjs +96 -90
  302. package/source/types/global.mjs +45 -39
  303. package/source/types/id.mjs +25 -25
  304. package/source/types/internal.mjs +115 -114
  305. package/source/types/is.mjs +56 -40
  306. package/source/types/mediatype.mjs +119 -119
  307. package/source/types/namespace.mjs +1 -1
  308. package/source/types/node.mjs +160 -150
  309. package/source/types/nodelist.mjs +94 -96
  310. package/source/types/noderecursiveiterator.mjs +50 -50
  311. package/source/types/observablequeue.mjs +73 -73
  312. package/source/types/observer.mjs +114 -106
  313. package/source/types/observerlist.mjs +66 -66
  314. package/source/types/proxyobserver.mjs +210 -210
  315. package/source/types/queue.mjs +63 -63
  316. package/source/types/randomid.mjs +13 -13
  317. package/source/types/regex.mjs +3 -1
  318. package/source/types/stack.mjs +64 -64
  319. package/source/types/tokenlist.mjs +206 -205
  320. package/source/types/typeof.mjs +12 -10
  321. package/source/types/uniquequeue.mjs +48 -48
  322. package/source/types/uuid.mjs +32 -32
  323. package/source/types/validate.mjs +67 -67
  324. package/source/types/version.mjs +115 -105
  325. package/source/util/clone.mjs +103 -91
  326. package/source/util/comparator.mjs +97 -97
  327. package/source/util/deadmansswitch.mjs +40 -44
  328. package/source/util/freeze.mjs +10 -9
  329. package/source/util/namespace.mjs +1 -1
  330. package/source/util/processing.mjs +104 -105
  331. package/source/util/runtime.mjs +56 -44
  332. package/source/util/trimspaces.mjs +24 -24
  333. package/test/cases/components/form/button.mjs +122 -0
  334. package/test/cases/components/form/confirm-button.mjs +127 -0
  335. package/test/cases/components/form/form.mjs +317 -0
  336. package/test/cases/components/form/reload.mjs +188 -0
  337. package/test/cases/components/form/select.mjs +229 -0
  338. package/test/cases/components/form/state-button.mjs +130 -0
  339. package/test/cases/components/form/tabs.mjs +98 -0
  340. package/test/cases/components/form/template.mjs +189 -0
  341. package/test/cases/components/form/tree-select.mjs +216 -0
  342. package/test/cases/components/host/details.mjs +68 -0
  343. package/test/cases/components/host/host.mjs +70 -0
  344. package/test/cases/components/host/overlay.mjs +60 -0
  345. package/test/cases/components/host/util.mjs +79 -0
  346. package/test/cases/components/notify/message.mjs +39 -0
  347. package/test/cases/components/notify/notify.mjs +89 -0
  348. package/test/cases/dom/customcontrol.mjs +5 -4
  349. package/test/cases/math/random.mjs +0 -1
  350. package/test/cases/monster.mjs +1 -1
  351. package/test/cases/net/webconnect/message.mjs +0 -1
  352. package/test/cases/types/node.mjs +1 -1
  353. package/test/util/chai-dom.mjs +2 -2
  354. package/test/util/intersection-mock.mjs +69 -0
  355. package/test/util/jsdom.mjs +41 -25
  356. package/test/util/localstorage.mjs +1 -0
  357. package/test/util/resize-observer.mjs +29 -0
  358. package/test/util/websocket.mjs +4 -1
  359. package/test/web/import.js +16 -1
  360. package/test/web/test.html +28 -5
  361. package/test/web/tests.js +30398 -17879
@@ -0,0 +1,601 @@
1
+ /**
2
+ * Copyright schukai GmbH and contributors 2023. All Rights Reserved.
3
+ * Node module: @schukai/monster
4
+ * This file is licensed under the AGPLv3 License.
5
+ * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
+ */
7
+ import { instanceSymbol } from "../../constants.mjs";
8
+ import { internalSymbol } from "../../constants.mjs";
9
+ import { Datasource } from "../../data/datasource.mjs";
10
+ import { RestAPI } from "../../data/datasource/server/restapi.mjs";
11
+ import { WebConnect } from "../../data/datasource/server/webconnect.mjs";
12
+ import { WriteError } from "../../data/datasource/server/restapi/writeerror.mjs";
13
+ import { LocalStorage } from "../../data/datasource/storage/localstorage.mjs";
14
+ import { SessionStorage } from "../../data/datasource/storage/sessionstorage.mjs";
15
+ import {
16
+ ATTRIBUTE_DISABLED,
17
+ ATTRIBUTE_ERRORMESSAGE,
18
+ ATTRIBUTE_PREFIX,
19
+ ATTRIBUTE_UPDATER_ATTRIBUTES,
20
+ ATTRIBUTE_UPDATER_INSERT,
21
+ ATTRIBUTE_UPDATER_REMOVE,
22
+ ATTRIBUTE_UPDATER_REPLACE,
23
+ } from "../../dom/constants.mjs";
24
+ import {
25
+ assembleMethodSymbol,
26
+ CustomElement,
27
+ registerCustomElement,
28
+ } from "../../dom/customelement.mjs";
29
+ import { addObjectWithUpdaterToElement } from "../../dom/updater.mjs";
30
+ import { isFunction, isString } from "../../types/is.mjs";
31
+ import { Observer } from "../../types/observer.mjs";
32
+ import { ProxyObserver } from "../../types/proxyobserver.mjs";
33
+ import { Processing } from "../../util/processing.mjs";
34
+ import { MessageStateButton } from "./message-state-button.mjs";
35
+ import {
36
+ ATTRIBUTE_FORM_DATASOURCE,
37
+ ATTRIBUTE_FORM_DATASOURCE_ARGUMENTS,
38
+ } from "./constants.mjs";
39
+ import { StateButton } from "./state-button.mjs";
40
+ import { getSlottedElements } from "../../dom/customelement.mjs";
41
+ import { FormStyleSheet } from "./stylesheet/form.mjs";
42
+
43
+ export { Form };
44
+
45
+ /**
46
+ * @private
47
+ * @since 3.1.0
48
+ * @type {string}
49
+ */
50
+ const ATTRIBUTE_FORM_DATASOURCE_ACTION = `${ATTRIBUTE_PREFIX}datasource-action`;
51
+
52
+ /**
53
+ * Form data is the internal representation of the form data
54
+ *
55
+ * @private
56
+ * @type {symbol}
57
+ * @since 1.7.0
58
+ */
59
+ const formDataSymbol = Symbol.for("@schukai/component-form/form@@formdata");
60
+
61
+ /**
62
+ * @private
63
+ * @type {symbol}
64
+ * @since 2.8.0
65
+ */
66
+ const formDataUpdaterSymbol = Symbol.for(
67
+ "@schukai/component-form/form@@formdata-updater-link",
68
+ );
69
+
70
+ /**
71
+ * @private
72
+ * @type {symbol}
73
+ * @since 1.7.0
74
+ */
75
+ const formElementSymbol = Symbol.for(
76
+ "@schukai/component-form/form@@form-element",
77
+ );
78
+
79
+ /**
80
+ * @private
81
+ * @type {symbol}
82
+ * @since 2.5.0
83
+ */
84
+ const registeredDatasourcesSymbol = Symbol.for(
85
+ "@schukai/component-form/form@@registered-datasources",
86
+ );
87
+
88
+ /**
89
+ * @private
90
+ * @since 1.7.0
91
+ * @type {string}
92
+ */
93
+ const PROPERTY_VALIDATION_KEY = "__validation";
94
+
95
+ /**
96
+ * This CustomControl creates a form element with a variety of options.
97
+ *
98
+ * <img src="./images/form.png">
99
+ *
100
+ * Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library.
101
+ *
102
+ * You can create this control either by specifying the HTML tag `<monster-form />` directly in the HTML or using
103
+ * Javascript via the `document.createElement('monster-form');` method.
104
+ *
105
+ * ```html
106
+ * <monster-form></monster-form>
107
+ * ```
108
+ *
109
+ * Or you can create this CustomControl directly in Javascript:
110
+ *
111
+ * ```js
112
+ * import {Form} from '@schukai/component-form/source/form.js';
113
+ * document.createElement('monster-form');
114
+ * ```
115
+ *
116
+ * @startuml form.png
117
+ * skinparam monochrome true
118
+ * skinparam shadowing false
119
+ * HTMLElement <|-- CustomElement
120
+ * CustomElement <|-- Form
121
+ * @enduml
122
+ *
123
+ * @since 1.6.0
124
+ * @copyright schukai GmbH
125
+ * @memberOf Monster.Components.Form
126
+ * @summary A configurable form control
127
+ */
128
+ class Form extends CustomElement {
129
+ /**
130
+ * @throws {Error} the options attribute does not contain a valid json definition.
131
+ * @since 1.7.0
132
+ */
133
+ constructor() {
134
+ super();
135
+ this[formDataSymbol] = new ProxyObserver({});
136
+ }
137
+
138
+ /**
139
+ * This method is called by the `instanceof` operator.
140
+ * @returns {symbol}
141
+ * @since 2.1.0
142
+ */
143
+ static get [instanceSymbol]() {
144
+ return Symbol.for("@schukai/component-form/form");
145
+ }
146
+
147
+ /**
148
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
149
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
150
+ *
151
+ * The individual configuration values can be found in the table.
152
+ *
153
+ * @property {Object} templates Template definitions
154
+ * @property {string} templates.main Main template
155
+ * @property {Datasource} datasource data source
156
+ * @property {Object} reportValidity
157
+ * @property {string} reportValidity.selector which element should be used to report the validity
158
+ * @property {function} reportValidity.errorHandler function to handle the error
159
+ * @property {Object} classes
160
+ * @property {string} classes.button class for the form
161
+ */
162
+ get defaults() {
163
+ return Object.assign(
164
+ {},
165
+ super.defaults,
166
+ {
167
+ templates: {
168
+ main: getTemplate(),
169
+ },
170
+ datasource: undefined,
171
+ reportValidity: {
172
+ selector: "input,select,textarea",
173
+ errorHandler: undefined,
174
+ },
175
+ classes: {
176
+ form: "monster-form",
177
+ },
178
+ },
179
+ initOptionsFromArguments.call(this),
180
+ );
181
+ }
182
+
183
+ /**
184
+ * Called every time the element is inserted into the DOM. Useful for running setup code, such as
185
+ * fetching resources or rendering. Generally, you should try to delay work until this time.
186
+ *
187
+ * @return {void}
188
+ */
189
+ connectedCallback() {
190
+ super["connectedCallback"]();
191
+ }
192
+
193
+ /**
194
+ * The refresh method is called to update the control after a change with fresh data.
195
+ *
196
+ * Therefore, the data source is called again and the data is updated.
197
+ *
198
+ * If you have updated the data source with `setOption('datasource',datasource), you must call this method.
199
+ *
200
+ * @return {Form}
201
+ * @throws {Error} undefined datasource
202
+ */
203
+ refresh() {;
204
+
205
+ try {
206
+ this.setAttribute(ATTRIBUTE_DISABLED, "");
207
+ const datasource = this.getOption("datasource");
208
+
209
+ if (!(datasource instanceof Datasource)) {
210
+ throw new Error("undefined datasource");
211
+ }
212
+
213
+ return datasource
214
+ .read()
215
+ .then(() => {
216
+ this[formDataSymbol].setSubject(datasource.get());
217
+ })
218
+ .then(() => {
219
+ new Processing(() => {
220
+ this.removeAttribute(ATTRIBUTE_DISABLED);
221
+ }).run();
222
+ })
223
+ .catch((e) => {
224
+ this.removeAttribute(ATTRIBUTE_DISABLED);
225
+ this.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.toString());
226
+ });
227
+ } catch (e) {
228
+ this.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.toString());
229
+ this.removeAttribute(ATTRIBUTE_DISABLED);
230
+ throw e;
231
+ }
232
+ }
233
+
234
+ /**
235
+ *
236
+ * @return {Monster.Components.Form.Form}
237
+ */
238
+ [assembleMethodSymbol]() {;
239
+ super[assembleMethodSymbol]();
240
+
241
+ initControlReferences.call(this);
242
+ initDatasource.call(this);
243
+ initUpdater.call(this);
244
+ initObserver.call(this);
245
+
246
+ return this;
247
+ }
248
+
249
+ /**
250
+ *
251
+ * @return {*}
252
+ */
253
+ getValues() {
254
+ return this[formDataSymbol].getSubject();
255
+ }
256
+
257
+ /**
258
+ *
259
+ * @return {string}
260
+ */
261
+ static getTag() {
262
+ return "monster-form";
263
+ }
264
+
265
+ /**
266
+ *
267
+ * @return {CSSStyleSheet}
268
+ */
269
+ static getCSSStyleSheet() {
270
+ return [FormStyleSheet];
271
+ }
272
+
273
+ static [registeredDatasourcesSymbol] = new Map([
274
+ ["restapi", RestAPI],
275
+ ["localstorage", LocalStorage],
276
+ ["sessionstorage", SessionStorage],
277
+ ["webconnect", WebConnect],
278
+ ]);
279
+
280
+ /**
281
+ * Register a new datasource
282
+ *
283
+ * @param {string} name
284
+ * @param {Monster.Data.Datasource} datasource
285
+ */
286
+ static registerDatasource(name, datasource) {
287
+ Form[registeredDatasourcesSymbol].set(name, datasource);
288
+ }
289
+
290
+ /**
291
+ * Unregister a registered datasource
292
+ *
293
+ * @param {string} name
294
+ */
295
+ static unregisterDatasource(name) {
296
+ Form[registeredDatasourcesSymbol].delete(name);
297
+ }
298
+
299
+ /**
300
+ * Get registered data sources
301
+ *
302
+ * @return {Map}
303
+ */
304
+ static getDatasources() {
305
+ return Form[registeredDatasourcesSymbol];
306
+ }
307
+
308
+ /**
309
+ * Run reportValidation on all child html form controls.
310
+ *
311
+ * @since 2.10.0
312
+ * @returns {boolean}
313
+ */
314
+ reportValidity() {
315
+ let valid = true;
316
+
317
+ const selector = this.getOption("reportValidity.selector");
318
+ const nodes = getSlottedElements.call(this, selector);
319
+ nodes.forEach((node) => {
320
+ if (typeof node.reportValidity === "function") {
321
+ if (node.reportValidity() === false) {
322
+ valid = false;
323
+ }
324
+ }
325
+ });
326
+
327
+ return valid;
328
+ }
329
+ }
330
+
331
+ /**
332
+ * @private
333
+ */
334
+ function initUpdater() {;
335
+
336
+ if (!this.shadowRoot) {
337
+ throw new Error("no shadow-root is defined");
338
+ }
339
+
340
+ const slots = this.shadowRoot.querySelectorAll("slot");
341
+ for (const [, slot] of Object.entries(slots)) {
342
+ for (const [, node] of Object.entries(slot.assignedNodes())) {
343
+ if (!(node instanceof HTMLElement)) {
344
+ continue;
345
+ }
346
+
347
+ const query = `[${ATTRIBUTE_UPDATER_ATTRIBUTES}],[${ATTRIBUTE_UPDATER_REPLACE}],[${ATTRIBUTE_UPDATER_REMOVE}],[${ATTRIBUTE_UPDATER_INSERT}]`;
348
+ const controls = node.querySelectorAll(query);
349
+
350
+ const list = new Set([...controls]);
351
+
352
+ if (node.matches(query)) {
353
+ list.add(node);
354
+ }
355
+
356
+ if (list.size === 0) {
357
+ continue;
358
+ }
359
+
360
+ addObjectWithUpdaterToElement.call(
361
+ node,
362
+ list,
363
+ formDataUpdaterSymbol,
364
+ this[formDataSymbol],
365
+ );
366
+ }
367
+ }
368
+ }
369
+
370
+ /**
371
+ * @private
372
+ */
373
+ function initDatasource() {;
374
+
375
+ if (!this.shadowRoot) {
376
+ throw new Error("no shadow-root is defined");
377
+ }
378
+
379
+ const slots = this.shadowRoot.querySelectorAll("slot");
380
+ for (const [, slot] of Object.entries(slots)) {
381
+ for (const [, node] of Object.entries(slot.assignedNodes())) {
382
+ if (!(node instanceof HTMLElement)) {
383
+ continue;
384
+ }
385
+
386
+ const query = `[${ATTRIBUTE_FORM_DATASOURCE_ACTION}=write]`;
387
+ const controls = node.querySelectorAll(query);
388
+
389
+ const list = new Set([...controls]);
390
+
391
+ if (node.matches(query)) {
392
+ list.add(node);
393
+ }
394
+
395
+ if (list.size === 0) {
396
+ continue;
397
+ }
398
+
399
+ initWriteActions.call(this, list);
400
+ }
401
+ }
402
+ }
403
+
404
+ /**
405
+ * @private
406
+ * @param elements
407
+ */
408
+ function initWriteActions(elements) {;
409
+
410
+ elements.forEach((element) => {
411
+ if (element instanceof HTMLElement) {
412
+ element.addEventListener("click", () => {
413
+ runWriteCallback.call(this, element);
414
+ });
415
+
416
+ const g = element?.getOption;
417
+ if (!isFunction(g)) {
418
+ return;
419
+ }
420
+
421
+ const s = element?.setOption;
422
+ if (!isFunction(s)) {
423
+ return;
424
+ }
425
+
426
+ const fn = element.getOption("actions.click");
427
+
428
+ if (!isFunction(fn)) {
429
+ return;
430
+ }
431
+
432
+ // disable console.log of standard click event
433
+ element.setOption("actions.click", function () {
434
+ // do nothing!
435
+ });
436
+ }
437
+ });
438
+ }
439
+
440
+ function runWriteCallback(button) {;
441
+
442
+ if (typeof this.reportValidity === "function") {
443
+ if (this.reportValidity() === false) {
444
+ if (
445
+ button instanceof StateButton ||
446
+ button instanceof MessageStateButton
447
+ ) {
448
+ button.setState("failed");
449
+ }
450
+ return;
451
+ }
452
+ }
453
+
454
+ const datasource = this.getOption("datasource");
455
+ if (!(datasource instanceof Datasource)) {
456
+ return;
457
+ }
458
+
459
+ if (button instanceof StateButton || button instanceof MessageStateButton) {
460
+ button.setState("activity");
461
+ }
462
+
463
+ //const data = form?.[formDataSymbol]?.getRealSubject();
464
+ const writePromise = datasource
465
+ .set(this[formDataSymbol].getRealSubject())
466
+ .write();
467
+ if (!(writePromise instanceof Promise)) {
468
+ throw new Error("datasource.write() must return a promise");
469
+ }
470
+
471
+ writePromise
472
+ .then((r) => {
473
+ if (
474
+ button instanceof StateButton ||
475
+ button instanceof MessageStateButton
476
+ ) {
477
+ button.setState("successful");
478
+ }
479
+ this[formDataSymbol].getSubject()[PROPERTY_VALIDATION_KEY] = {};
480
+ })
481
+ .catch((e) => {
482
+ if (e instanceof WriteError) {
483
+ this[formDataSymbol].getSubject()[PROPERTY_VALIDATION_KEY] =
484
+ e.getValidation();
485
+ }
486
+
487
+ if (
488
+ button instanceof StateButton ||
489
+ button instanceof MessageStateButton
490
+ ) {
491
+ button.setState("failed");
492
+ }
493
+
494
+ if (button instanceof MessageStateButton) {
495
+ button.setMessage(e.message);
496
+ button.showMessage();
497
+ }
498
+ });
499
+ }
500
+
501
+ /**
502
+ * This attribute can be used to pass a URL to this select.
503
+ *
504
+ * ```
505
+ * <monster-form data-monster-datasource="restapi:....."></monster-form>
506
+ * ```
507
+ *
508
+ * @private
509
+ * @return {object}
510
+ */
511
+ function initOptionsFromArguments() {;
512
+ const options = {};
513
+
514
+ const datasource = this.getAttribute(ATTRIBUTE_FORM_DATASOURCE);
515
+ if (isString(datasource)) {
516
+ for (const [key, classObject] of Form.getDatasources()) {
517
+ if (datasource === key) {
518
+ let args = this.getAttribute(ATTRIBUTE_FORM_DATASOURCE_ARGUMENTS);
519
+
520
+ try {
521
+ args = JSON.parse(args);
522
+ } catch (e) {
523
+ this.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.toString());
524
+ continue;
525
+ }
526
+
527
+ try {
528
+ options["datasource"] = new classObject(args);
529
+ } catch (e) {
530
+ this.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.toString());
531
+ continue;
532
+ }
533
+
534
+ break;
535
+ }
536
+
537
+ if (options["datasource"] instanceof Datasource) {
538
+ break;
539
+ }
540
+ }
541
+ }
542
+
543
+ return options;
544
+ }
545
+
546
+ /**
547
+ * @private
548
+ * @this Form
549
+ */
550
+ function initObserver() {
551
+ const self = this;
552
+
553
+ let lastDatasource = null;
554
+ self[internalSymbol].attachObserver(
555
+ new Observer(function () {
556
+ const datasource = self.getOption("datasource");
557
+ if (datasource !== lastDatasource) {
558
+ new Processing(100, function () {
559
+ self.refresh();
560
+ }).run();
561
+ }
562
+
563
+ lastDatasource = datasource;
564
+ }),
565
+ );
566
+ }
567
+
568
+ /**
569
+ * @private
570
+ * @return {Monster.Components.Form.Form}
571
+ */
572
+ function initControlReferences() {;
573
+
574
+ if (!this.shadowRoot) {
575
+ throw new Error("no shadow-root is defined");
576
+ }
577
+
578
+ this[formElementSymbol] = this.shadowRoot.querySelector(
579
+ "[data-monster-role=form]",
580
+ );
581
+ return this;
582
+ }
583
+
584
+ /**
585
+ * @private
586
+ * @return {string}
587
+ */
588
+ function getTemplate() {
589
+ // language=HTML
590
+ return `
591
+ <div data-monster-role="control" part="control">
592
+ <form data-monster-attributes="disabled path:disabled | if:true, class path:classes.form"
593
+ data-monster-role="form"
594
+ part="form">
595
+ <slot data-monster-role="slot"></slot>
596
+ </form>
597
+ </div>
598
+ `;
599
+ }
600
+
601
+ registerCustomElement(Form);