@schukai/monster 3.51.5 → 3.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/CHANGELOG.md +17 -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/package.json +6 -2
  12. package/source/components/constants.mjs +132 -0
  13. package/source/components/datatable/columnbar.mjs +310 -0
  14. package/source/components/datatable/constants.mjs +121 -0
  15. package/source/components/datatable/dataset.mjs +219 -0
  16. package/source/components/datatable/datasource/dom.mjs +186 -0
  17. package/source/components/datatable/datasource/namespace.mjs +13 -0
  18. package/source/components/datatable/datasource/rest.mjs +400 -0
  19. package/source/components/datatable/datasource.mjs +102 -0
  20. package/source/components/datatable/datatable/header.mjs +268 -0
  21. package/source/components/datatable/datatable/namespace.mjs +13 -0
  22. package/source/components/datatable/datatable.mjs +789 -0
  23. package/source/components/datatable/embedded-pagination.mjs +113 -0
  24. package/source/components/datatable/filter/abstract-base.mjs +31 -0
  25. package/source/components/datatable/filter/date-range.mjs +1041 -0
  26. package/source/components/datatable/filter/input.mjs +175 -0
  27. package/source/components/datatable/filter/namespace.mjs +13 -0
  28. package/source/components/datatable/filter/range.mjs +671 -0
  29. package/source/components/datatable/filter/select.mjs +65 -0
  30. package/source/components/datatable/filter/settings.mjs +116 -0
  31. package/source/components/datatable/filter-button.mjs +98 -0
  32. package/source/components/datatable/filter.mjs +929 -0
  33. package/source/components/datatable/namespace.mjs +11 -0
  34. package/source/components/datatable/pagination.mjs +456 -0
  35. package/source/components/datatable/style/column-bar.pcss +123 -0
  36. package/source/components/datatable/style/dataset.pcss +13 -0
  37. package/source/components/datatable/style/datasource.pcss +16 -0
  38. package/source/components/datatable/style/datatable.pcss +239 -0
  39. package/source/components/datatable/style/embedded-pagination.pcss +101 -0
  40. package/source/components/datatable/style/filter-button.pcss +22 -0
  41. package/source/components/datatable/style/filter-controls-defaults.pcss +46 -0
  42. package/source/components/datatable/style/filter-date-range.pcss +9 -0
  43. package/source/components/datatable/style/filter-range.pcss +5 -0
  44. package/source/components/datatable/style/filter.pcss +156 -0
  45. package/source/components/datatable/style/pagination.pcss +59 -0
  46. package/source/components/datatable/style/select-filter.pcss +27 -0
  47. package/source/components/datatable/stylesheet/column-bar.mjs +33 -0
  48. package/source/components/datatable/stylesheet/dataset.mjs +33 -0
  49. package/source/components/datatable/stylesheet/datasource.mjs +33 -0
  50. package/source/components/datatable/stylesheet/datatable.mjs +33 -0
  51. package/source/components/datatable/stylesheet/embedded-pagination.mjs +33 -0
  52. package/source/components/datatable/stylesheet/filter-button.mjs +33 -0
  53. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +33 -0
  54. package/source/components/datatable/stylesheet/filter-date-range.mjs +33 -0
  55. package/source/components/datatable/stylesheet/filter-range.mjs +33 -0
  56. package/source/components/datatable/stylesheet/filter.mjs +33 -0
  57. package/source/components/datatable/stylesheet/namespace.mjs +13 -0
  58. package/source/components/datatable/stylesheet/pagination.mjs +33 -0
  59. package/source/components/datatable/stylesheet/select-filter.mjs +33 -0
  60. package/source/components/datatable/util.mjs +60 -0
  61. package/source/components/form/action-button.mjs +262 -0
  62. package/source/components/form/api-button.mjs +515 -0
  63. package/source/components/form/button-bar.mjs +739 -0
  64. package/source/components/form/button.mjs +350 -0
  65. package/source/components/form/confirm-button.mjs +330 -0
  66. package/source/components/form/constants.mjs +111 -0
  67. package/source/components/form/context-help.mjs +123 -0
  68. package/source/components/form/events.mjs +84 -0
  69. package/source/components/form/form.mjs +601 -0
  70. package/source/components/form/message-state-button.mjs +396 -0
  71. package/source/components/form/namespace.mjs +13 -0
  72. package/source/components/form/popper-button.mjs +435 -0
  73. package/source/components/form/popper.mjs +487 -0
  74. package/source/components/form/reload.mjs +360 -0
  75. package/source/components/form/select.mjs +2314 -0
  76. package/source/components/form/shadow-reload.mjs +137 -0
  77. package/source/components/form/state-button.mjs +182 -0
  78. package/source/components/form/style/action-button.pcss +41 -0
  79. package/source/components/form/style/api-button.pcss +0 -0
  80. package/source/components/form/style/button-bar.pcss +51 -0
  81. package/source/components/form/style/button.pcss +8 -0
  82. package/source/components/form/style/confirm-button.pcss +17 -0
  83. package/source/components/form/style/context-help.pcss +16 -0
  84. package/source/components/form/style/form.pcss +10 -0
  85. package/source/components/form/style/message-state-button.pcss +10 -0
  86. package/source/components/form/style/popper-button.pcss +16 -0
  87. package/source/components/form/style/popper.pcss +8 -0
  88. package/source/components/form/style/select.pcss +265 -0
  89. package/source/components/form/style/state-button.pcss +116 -0
  90. package/source/components/form/style/tabs.pcss +170 -0
  91. package/source/components/form/style/tree-select.pcss +81 -0
  92. package/source/components/form/stylesheet/action-button.mjs +33 -0
  93. package/source/components/form/stylesheet/api-button.mjs +33 -0
  94. package/source/components/form/stylesheet/button-bar.mjs +33 -0
  95. package/source/components/form/stylesheet/button.mjs +33 -0
  96. package/source/components/form/stylesheet/confirm-button.mjs +33 -0
  97. package/source/components/form/stylesheet/context-help.mjs +33 -0
  98. package/source/components/form/stylesheet/form.mjs +33 -0
  99. package/source/components/form/stylesheet/message-state-button.mjs +33 -0
  100. package/source/components/form/stylesheet/namespace.mjs +13 -0
  101. package/source/components/form/stylesheet/popper-button.mjs +33 -0
  102. package/source/components/form/stylesheet/popper.mjs +33 -0
  103. package/source/components/form/stylesheet/select.mjs +33 -0
  104. package/source/components/form/stylesheet/state-button.mjs +33 -0
  105. package/source/components/form/stylesheet/tabs.mjs +33 -0
  106. package/source/components/form/stylesheet/tree-select.mjs +33 -0
  107. package/source/components/form/tabs.mjs +1011 -0
  108. package/source/components/form/template.mjs +373 -0
  109. package/source/components/form/tree-select.mjs +527 -0
  110. package/source/components/form/types/namespace.mjs +13 -0
  111. package/source/components/form/types/state.mjs +93 -0
  112. package/source/components/form/util/fetch.mjs +133 -0
  113. package/source/components/form/util/floating-ui.mjs +245 -0
  114. package/source/components/form/util/namespace.mjs +13 -0
  115. package/source/components/form/util/popper.mjs +49 -0
  116. package/source/components/host/call-button.mjs +236 -0
  117. package/source/components/host/collapse.mjs +526 -0
  118. package/source/components/host/config-manager.mjs +304 -0
  119. package/source/components/host/constants.mjs +18 -0
  120. package/source/components/host/details.mjs +268 -0
  121. package/source/components/host/events.mjs +131 -0
  122. package/source/components/host/host.mjs +420 -0
  123. package/source/components/host/namespace.mjs +13 -0
  124. package/source/components/host/overlay.mjs +339 -0
  125. package/source/components/host/style/call-button.pcss +36 -0
  126. package/source/components/host/style/collapse.pcss +67 -0
  127. package/source/components/host/style/config-manager.pcss +5 -0
  128. package/source/components/host/style/details.pcss +68 -0
  129. package/source/components/host/style/host.pcss +43 -0
  130. package/source/components/host/style/overlay.pcss +73 -0
  131. package/source/components/host/style/toggle-button.pcss +36 -0
  132. package/source/components/host/style/viewer.pcss +13 -0
  133. package/source/components/host/stylesheet/call-button.mjs +33 -0
  134. package/source/components/host/stylesheet/collapse.mjs +33 -0
  135. package/source/components/host/stylesheet/config-manager.mjs +33 -0
  136. package/source/components/host/stylesheet/details.mjs +33 -0
  137. package/source/components/host/stylesheet/host.mjs +33 -0
  138. package/source/components/host/stylesheet/namespace.mjs +13 -0
  139. package/source/components/host/stylesheet/overlay.mjs +33 -0
  140. package/source/components/host/stylesheet/toggle-button.mjs +33 -0
  141. package/source/components/host/stylesheet/viewer.mjs +33 -0
  142. package/source/components/host/toggle-button.mjs +88 -0
  143. package/source/components/host/util.mjs +23 -0
  144. package/source/components/host/viewer.mjs +309 -0
  145. package/source/components/namespace.mjs +14 -0
  146. package/source/components/notify/constants.mjs +15 -0
  147. package/source/components/notify/events.mjs +15 -0
  148. package/source/components/notify/message.mjs +374 -0
  149. package/source/components/notify/namespace.mjs +15 -0
  150. package/source/components/notify/notify.mjs +236 -0
  151. package/source/components/notify/style/message.pcss +57 -0
  152. package/source/components/notify/style/notify.pcss +118 -0
  153. package/source/components/notify/stylesheet/message.mjs +33 -0
  154. package/source/components/notify/stylesheet/namespace.mjs +15 -0
  155. package/source/components/notify/stylesheet/notify.mjs +33 -0
  156. package/source/components/state/log/entry.mjs +126 -0
  157. package/source/components/state/log/namespace.mjs +13 -0
  158. package/source/components/state/log.mjs +275 -0
  159. package/source/components/state/namespace.mjs +13 -0
  160. package/source/components/state/state.mjs +131 -0
  161. package/source/components/state/style/log.pcss +111 -0
  162. package/source/components/state/style/state.pcss +113 -0
  163. package/source/components/state/stylesheet/log.mjs +33 -0
  164. package/source/components/state/stylesheet/state.mjs +33 -0
  165. package/source/components/style/badge.pcss +92 -0
  166. package/source/components/style/border.pcss +77 -0
  167. package/source/components/style/button.pcss +105 -0
  168. package/source/components/style/card.pcss +108 -0
  169. package/source/components/style/color.pcss +257 -0
  170. package/source/components/style/common.pcss +103 -0
  171. package/source/components/style/control.pcss +11 -0
  172. package/source/components/style/data-grid.pcss +43 -0
  173. package/source/components/style/display.pcss +42 -0
  174. package/source/components/style/floating-ui.pcss +33 -0
  175. package/source/components/style/form.pcss +5 -0
  176. package/source/components/style/host.pcss +15 -0
  177. package/source/components/style/link.pcss +63 -0
  178. package/source/components/style/mixin/badge.pcss +18 -0
  179. package/source/components/style/mixin/button.pcss +54 -0
  180. package/source/components/style/mixin/form.pcss +247 -0
  181. package/source/components/style/mixin/hover.pcss +8 -0
  182. package/source/components/style/mixin/media.pcss +107 -0
  183. package/source/components/style/mixin/property.pcss +288 -0
  184. package/source/components/style/mixin/skeleton.pcss +26 -0
  185. package/source/components/style/mixin/spinner.pcss +24 -0
  186. package/source/components/style/mixin/typography.pcss +52 -0
  187. package/source/components/style/normalize.pcss +14 -0
  188. package/source/components/style/popper.pcss +78 -0
  189. package/source/components/style/property.pcss +17 -0
  190. package/source/components/style/ripple.pcss +14 -0
  191. package/source/components/style/skeleton.pcss +28 -0
  192. package/source/components/style/space.pcss +47 -0
  193. package/source/components/style/spinner.pcss +6 -0
  194. package/source/components/style/table.pcss +46 -0
  195. package/source/components/style/theme.pcss +119 -0
  196. package/source/components/style/typography.pcss +131 -0
  197. package/source/components/stylesheet/badge.mjs +33 -0
  198. package/source/components/stylesheet/border.mjs +33 -0
  199. package/source/components/stylesheet/button.mjs +33 -0
  200. package/source/components/stylesheet/card.mjs +33 -0
  201. package/source/components/stylesheet/color.mjs +33 -0
  202. package/source/components/stylesheet/common.mjs +33 -0
  203. package/source/components/stylesheet/control.mjs +33 -0
  204. package/source/components/stylesheet/data-grid.mjs +33 -0
  205. package/source/components/stylesheet/display.mjs +33 -0
  206. package/source/components/stylesheet/floating-ui.mjs +33 -0
  207. package/source/components/stylesheet/form.mjs +33 -0
  208. package/source/components/stylesheet/host.mjs +33 -0
  209. package/source/components/stylesheet/link.mjs +33 -0
  210. package/source/components/stylesheet/namespace.mjs +13 -0
  211. package/source/components/stylesheet/normalize.mjs +33 -0
  212. package/source/components/stylesheet/popper.mjs +33 -0
  213. package/source/components/stylesheet/property.mjs +33 -0
  214. package/source/components/stylesheet/ripple.mjs +33 -0
  215. package/source/components/stylesheet/skeleton.mjs +33 -0
  216. package/source/components/stylesheet/space.mjs +33 -0
  217. package/source/components/stylesheet/spinner.mjs +33 -0
  218. package/source/components/stylesheet/table.mjs +33 -0
  219. package/source/components/stylesheet/theme.mjs +33 -0
  220. package/source/components/stylesheet/tree-menu.mjs +33 -0
  221. package/source/components/stylesheet/typography.mjs +33 -0
  222. package/source/components/tree-menu/namespace.mjs +13 -0
  223. package/source/components/tree-menu/style/tree-menu.pcss +107 -0
  224. package/source/components/tree-menu/stylesheet/namespace.mjs +13 -0
  225. package/source/components/tree-menu/stylesheet/tree-menu.mjs +33 -0
  226. package/source/components/tree-menu/tree-menu.mjs +660 -0
  227. package/source/constraints/abstract.mjs +17 -24
  228. package/source/constraints/abstractoperator.mjs +27 -22
  229. package/source/constraints/andoperator.mjs +20 -17
  230. package/source/constraints/invalid.mjs +17 -17
  231. package/source/constraints/isarray.mjs +20 -20
  232. package/source/constraints/isobject.mjs +20 -20
  233. package/source/constraints/oroperator.mjs +45 -45
  234. package/source/constraints/valid.mjs +17 -17
  235. package/source/data/buildmap.mjs +108 -103
  236. package/source/data/buildtree.mjs +59 -57
  237. package/source/data/datasource/dom.mjs +80 -84
  238. package/source/data/datasource/namespace.mjs +1 -1
  239. package/source/data/datasource/server/restapi/data-fetch-error.mjs +27 -25
  240. package/source/data/datasource/server/restapi/writeerror.mjs +34 -32
  241. package/source/data/datasource/server/restapi.mjs +176 -177
  242. package/source/data/datasource/server/webconnect.mjs +150 -156
  243. package/source/data/datasource/server.mjs +58 -59
  244. package/source/data/datasource/storage/localstorage.mjs +25 -24
  245. package/source/data/datasource/storage/sessionstorage.mjs +28 -25
  246. package/source/data/datasource/storage.mjs +74 -73
  247. package/source/data/datasource.mjs +176 -167
  248. package/source/data/diff.mjs +98 -97
  249. package/source/data/extend.mjs +42 -42
  250. package/source/data/pathfinder.mjs +301 -288
  251. package/source/data/pipe.mjs +36 -36
  252. package/source/data/transformer.mjs +742 -726
  253. package/source/dom/assembler.mjs +44 -44
  254. package/source/dom/attributes.mjs +142 -122
  255. package/source/dom/constants.mjs +62 -58
  256. package/source/dom/customcontrol.mjs +299 -299
  257. package/source/dom/customelement.mjs +843 -806
  258. package/source/dom/dimension.mjs +56 -46
  259. package/source/dom/events.mjs +74 -69
  260. package/source/dom/focusmanager.mjs +175 -175
  261. package/source/dom/locale.mjs +28 -28
  262. package/source/dom/ready.mjs +13 -13
  263. package/source/dom/resource/data.mjs +117 -111
  264. package/source/dom/resource/link/stylesheet.mjs +16 -16
  265. package/source/dom/resource/link.mjs +94 -96
  266. package/source/dom/resource/script.mjs +72 -74
  267. package/source/dom/resource.mjs +174 -172
  268. package/source/dom/resourcemanager.mjs +152 -156
  269. package/source/dom/slotted.mjs +78 -80
  270. package/source/dom/template.mjs +126 -112
  271. package/source/dom/theme.mjs +35 -35
  272. package/source/dom/updater.mjs +673 -651
  273. package/source/dom/util/extract-keys.mjs +34 -22
  274. package/source/dom/util/init-options-from-attributes.mjs +46 -38
  275. package/source/dom/util/namespace.mjs +13 -0
  276. package/source/dom/util/set-option-from-attribute.mjs +35 -29
  277. package/source/dom/util.mjs +112 -81
  278. package/source/dom/worker/factory.mjs +83 -83
  279. package/source/i18n/formatter.mjs +75 -73
  280. package/source/i18n/locale.mjs +146 -144
  281. package/source/i18n/provider.mjs +70 -64
  282. package/source/i18n/providers/embed.mjs +136 -127
  283. package/source/i18n/providers/fetch.mjs +84 -76
  284. package/source/i18n/translations.mjs +205 -195
  285. package/source/logging/handler/console.mjs +36 -36
  286. package/source/logging/handler.mjs +140 -140
  287. package/source/logging/logentry.mjs +25 -25
  288. package/source/logging/logger.mjs +177 -175
  289. package/source/math/random.mjs +63 -59
  290. package/source/monster.mjs +223 -103
  291. package/source/net/webconnect/message.mjs +31 -31
  292. package/source/net/webconnect.mjs +278 -271
  293. package/source/text/bracketed-key-value-hash.mjs +182 -179
  294. package/source/text/formatter.mjs +235 -210
  295. package/source/text/generate-range-comparison-expression.mjs +56 -34
  296. package/source/text/namespace.mjs +1 -1
  297. package/source/types/base.mjs +69 -61
  298. package/source/types/basewithoptions.mjs +46 -46
  299. package/source/types/binary.mjs +20 -20
  300. package/source/types/dataurl.mjs +96 -90
  301. package/source/types/global.mjs +45 -39
  302. package/source/types/id.mjs +25 -25
  303. package/source/types/internal.mjs +115 -114
  304. package/source/types/is.mjs +56 -40
  305. package/source/types/mediatype.mjs +119 -119
  306. package/source/types/namespace.mjs +1 -1
  307. package/source/types/node.mjs +160 -150
  308. package/source/types/nodelist.mjs +94 -96
  309. package/source/types/noderecursiveiterator.mjs +50 -50
  310. package/source/types/observablequeue.mjs +73 -73
  311. package/source/types/observer.mjs +104 -104
  312. package/source/types/observerlist.mjs +66 -66
  313. package/source/types/proxyobserver.mjs +210 -210
  314. package/source/types/queue.mjs +63 -63
  315. package/source/types/randomid.mjs +13 -13
  316. package/source/types/regex.mjs +3 -1
  317. package/source/types/stack.mjs +64 -64
  318. package/source/types/tokenlist.mjs +206 -205
  319. package/source/types/typeof.mjs +12 -10
  320. package/source/types/uniquequeue.mjs +48 -48
  321. package/source/types/uuid.mjs +32 -32
  322. package/source/types/validate.mjs +67 -67
  323. package/source/types/version.mjs +115 -105
  324. package/source/util/clone.mjs +103 -91
  325. package/source/util/comparator.mjs +97 -97
  326. package/source/util/deadmansswitch.mjs +40 -44
  327. package/source/util/freeze.mjs +10 -9
  328. package/source/util/namespace.mjs +1 -1
  329. package/source/util/processing.mjs +104 -105
  330. package/source/util/runtime.mjs +56 -44
  331. package/source/util/trimspaces.mjs +24 -24
  332. package/test/cases/components/form/button.mjs +122 -0
  333. package/test/cases/components/form/confirm-button.mjs +127 -0
  334. package/test/cases/components/form/form.mjs +317 -0
  335. package/test/cases/components/form/reload.mjs +188 -0
  336. package/test/cases/components/form/select.mjs +229 -0
  337. package/test/cases/components/form/state-button.mjs +130 -0
  338. package/test/cases/components/form/tabs.mjs +98 -0
  339. package/test/cases/components/form/template.mjs +189 -0
  340. package/test/cases/components/form/tree-select.mjs +216 -0
  341. package/test/cases/components/host/details.mjs +68 -0
  342. package/test/cases/components/host/host.mjs +70 -0
  343. package/test/cases/components/host/overlay.mjs +60 -0
  344. package/test/cases/components/host/util.mjs +79 -0
  345. package/test/cases/components/notify/message.mjs +39 -0
  346. package/test/cases/components/notify/notify.mjs +89 -0
  347. package/test/cases/dom/customcontrol.mjs +5 -4
  348. package/test/cases/math/random.mjs +0 -1
  349. package/test/cases/monster.mjs +1 -1
  350. package/test/cases/net/webconnect/message.mjs +0 -1
  351. package/test/cases/types/node.mjs +1 -1
  352. package/test/util/chai-dom.mjs +2 -2
  353. package/test/util/intersection-mock.mjs +69 -0
  354. package/test/util/jsdom.mjs +41 -25
  355. package/test/util/localstorage.mjs +1 -0
  356. package/test/util/resize-observer.mjs +29 -0
  357. package/test/util/websocket.mjs +4 -1
  358. package/test/web/import.js +16 -1
  359. package/test/web/test.html +28 -5
  360. package/test/web/tests.js +30398 -17879
@@ -0,0 +1,660 @@
1
+ /**
2
+ * Copyright schukai GmbH and contributors 2022. All Rights Reserved.
3
+ * Node module: @schukai/component-treemenu
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
+
8
+ import { buildTree } from "../../data/buildtree.mjs";
9
+ import { Datasource } from "../../data/datasource.mjs";
10
+ import { addAttributeToken } from "../../dom/attributes.mjs";
11
+ import {
12
+ ATTRIBUTE_DISABLED,
13
+ ATTRIBUTE_ERRORMESSAGE,
14
+ ATTRIBUTE_ROLE,
15
+ ATTRIBUTE_UPDATER_INSERT_REFERENCE,
16
+ } from "../../dom/constants.mjs";
17
+ import {
18
+ assembleMethodSymbol,
19
+ CustomElement,
20
+ initMethodSymbol,
21
+ registerCustomElement,
22
+ } from "../../dom/customelement.mjs";
23
+ import { findTargetElementFromEvent } from "../../dom/events.mjs";
24
+ import { Formatter } from "../../text/formatter.mjs";
25
+ import { isObject } from "../../types/is.mjs";
26
+ import { Node } from "../../types/node.mjs";
27
+ import { NodeRecursiveIterator } from "../../types/noderecursiveiterator.mjs";
28
+ import { Observer } from "../../types/observer.mjs";
29
+ import { ProxyObserver } from "../../types/proxyobserver.mjs";
30
+ import { validateInstance } from "../../types/validate.mjs";
31
+ import { ATTRIBUTE_INTEND } from "./../constants.mjs";
32
+ import { CommonStyleSheet } from "../stylesheet/common.mjs";
33
+ import { TreeMenuStyleSheet } from "./stylesheet/tree-menu.mjs";
34
+
35
+ export { TreeMenu };
36
+
37
+ /**
38
+ * @private
39
+ * @type {symbol}
40
+ */
41
+ const internalNodesSymbol = Symbol("internalNodes");
42
+
43
+ /**
44
+ * @private
45
+ * @type {symbol}
46
+ */
47
+ const controlElementSymbol = Symbol("controlElement");
48
+
49
+ /**
50
+ * @private
51
+ * @type {symbol}
52
+ */
53
+ const openEntryEventHandlerSymbol = Symbol("openEntryEventHandler");
54
+
55
+ /**
56
+ * @private
57
+ * @type {symbol}
58
+ */
59
+ const dragstartEventHandlerSymbol = Symbol("dragstartEventHandler");
60
+ /**
61
+ * @private
62
+ * @type {symbol}
63
+ */
64
+ const dragenterEventHandlerSymbol = Symbol("dragenterEventHandler");
65
+
66
+ /**
67
+ * @private
68
+ * @type {symbol}
69
+ */
70
+ const dragleaveEventHandlerSymbol = Symbol("dragleaveEventHandler");
71
+
72
+ /**
73
+ * @private
74
+ * @type {symbol}
75
+ */
76
+ const dragEventHandlerSymbol = Symbol("dragEventHandler");
77
+
78
+ /**
79
+ * @private
80
+ * @type {symbol}
81
+ */
82
+ const dragoverEventHandlerSymbol = Symbol("dragoverEventHandler");
83
+
84
+ /**
85
+ * @private
86
+ * @type {symbol}
87
+ */
88
+ const dropEventHandlerSymbol = Symbol("dropEventHandlerSymbol");
89
+
90
+ /**
91
+ * TreeMenu
92
+ *
93
+ * <img src="./images/tree-menu.png">
94
+ *
95
+ * You can create this control either by specifying the HTML tag `<monster-tree-menu />` directly in the HTML
96
+ *
97
+ * ```html
98
+ * <monster-tree-menu></monster-tree-menu>
99
+ * ```
100
+ *
101
+ * or using Javascript via the `document.createElement('monster-tree-menu');` method.
102
+ *
103
+ * ```javascript
104
+ * import {TreeMenu} from 'https://cdn.jsdelivr.net/npm/@schukai/component-treemenu@0.1.0/dist/modules/treemenu.js';
105
+ * document.createElement('monster-treemenu');
106
+ * ```
107
+ *
108
+ * @startuml tree-menu.png
109
+ * skinparam monochrome true
110
+ * skinparam shadowing false
111
+ * HTMLElement <|-- CustomElement
112
+ * CustomElement <|-- CustomControl
113
+ * CustomControl <|-- TreeMenu
114
+ * @enduml
115
+ * @since 1.0.0
116
+ * @copyright schukai GmbH
117
+ * @memberOf Monster.Components.TreeMenu
118
+ * @summary A TreeMenu control
119
+ * @fires Monster.Components.TreeMenu.event:monster-fetched
120
+ */
121
+ class TreeMenu extends CustomElement {
122
+ /**
123
+ * This method is called internal and should not be called directly.
124
+ *
125
+ * The defaults can be set either directly in the object or via an attribute in the HTML tag.
126
+ * The value of the attribute `data-monster-options` in the HTML tag must be a JSON string.
127
+ *
128
+ * ```
129
+ * <monster-treemenu data-monster-options="{}"></monster-treemenu>
130
+ * ```
131
+ *
132
+ * Since 1.18.0 the JSON can be specified as a DataURI.
133
+ *
134
+ * ```
135
+ * new Monster.Types.DataUrl(btoa(JSON.stringify({
136
+ * shadowMode: 'open',
137
+ * })),'application/json',true).toString()
138
+ * ```
139
+ * @property {Object} toggleEventType=click,touch List of event types to be observed for opening the dropdown
140
+ * @property {Object} templates Template definitions
141
+ * @property {string} templates.main Main template
142
+ * @property {Datasource} datasource data source
143
+ * @property {Object} mapping
144
+ * @property {String} mapping.selector=* Path to select the appropriate entries
145
+ * @property {String} mapping.labelTemplate="" template with the label placeholders in the form ${name}, where name is the key
146
+ * @property {String} mapping.keyTemplate="" template with the key placeholders in the form ${name}, where name is the key
147
+ * @property {String} mapping.rootReferences=['0', undefined, null]
148
+ * @property {String} mapping.idTemplate=id
149
+ * @property {String} mapping.parentTemplate=parent
150
+ * @property {String} mapping.selection
151
+ */
152
+ get defaults() {
153
+ return Object.assign(
154
+ {},
155
+ super.defaults,
156
+ {
157
+ toggleEventType: ["click", "touch"],
158
+ mapping: {
159
+ rootReferences: ["0", undefined, null],
160
+ idTemplate: "id",
161
+ parentTemplate: "parent",
162
+ selector: "*",
163
+ labelTemplate: "",
164
+ valueTemplate: "",
165
+ filter: undefined,
166
+ },
167
+ templates: {
168
+ main: getTemplate(),
169
+ },
170
+ datasource: undefined,
171
+ entries: [],
172
+ },
173
+ initOptionsFromArguments.call(this),
174
+ );
175
+ }
176
+
177
+ /**
178
+ * This method determines which attributes are to be monitored by `attributeChangedCallback()`.
179
+ *
180
+ * @return {string[]}
181
+ * @since 1.15.0
182
+ */
183
+ static get observedAttributes() {
184
+ const list = super.observedAttributes;
185
+ //list.push(ATTRIBUTE_FORM_URL);
186
+ return list;
187
+ }
188
+
189
+ /**
190
+ *
191
+ */
192
+ [initMethodSymbol]() {;
193
+ super[initMethodSymbol]();
194
+ }
195
+
196
+ /**
197
+ *
198
+ * @return {Monster.Components.TreeMenu.Form}
199
+ */
200
+ [assembleMethodSymbol]() {;
201
+ super[assembleMethodSymbol]();
202
+
203
+ initControlReferences.call(this);
204
+ initEventhandler.call(this);
205
+ importEntriesFromDatasource.call(this);
206
+ initObserver.call(this);
207
+
208
+ return this;
209
+ }
210
+
211
+ /**
212
+ * This method is called internal and should not be called directly.
213
+ *
214
+ * @return {CSSStyleSheet[]}
215
+ */
216
+ static getCSSStyleSheet() {
217
+ return [CommonStyleSheet, TreeMenuStyleSheet];
218
+ }
219
+
220
+ /**
221
+ * This method is called internal and should not be called directly.
222
+ *
223
+ * @return {string}
224
+ */
225
+ static getTag() {
226
+ return "monster-tree-menu";
227
+ }
228
+ }
229
+
230
+ /**
231
+ * @private
232
+ */
233
+ function initEventhandler() {;
234
+
235
+ switchToConfig.call(this);
236
+
237
+ this[openEntryEventHandlerSymbol] = (event) => {
238
+ const container = findTargetElementFromEvent(
239
+ event,
240
+ ATTRIBUTE_ROLE,
241
+ "entry",
242
+ );
243
+ if (!(container instanceof HTMLElement)) {
244
+ return;
245
+ }
246
+
247
+ //let container = findClosestByAttribute(element, ATTRIBUTE_ROLE, 'option');
248
+ const index = container
249
+ .getAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE)
250
+ .split("-")
251
+ .pop();
252
+
253
+ const currentState = this.getOption("entries." + index + ".state");
254
+
255
+ const newState = currentState === "close" ? "open" : "close";
256
+ this.setOption("entries." + index + ".state", newState);
257
+
258
+ const newVisibility = newState === "open" ? "visible" : "hidden";
259
+
260
+ if (container.hasAttribute(ATTRIBUTE_INTEND)) {
261
+ const intend = container.getAttribute(ATTRIBUTE_INTEND);
262
+
263
+ let ref = container.nextElementSibling;
264
+ const childIntend = parseInt(intend) + 1;
265
+
266
+ const cmp = (a, b) => {
267
+ if (newState === "open") {
268
+ return a === b;
269
+ }
270
+
271
+ return a >= b;
272
+ };
273
+
274
+ while (
275
+ ref &&
276
+ ref.hasAttribute(ATTRIBUTE_INTEND) &&
277
+ cmp(parseInt(ref.getAttribute(ATTRIBUTE_INTEND)), childIntend)
278
+ ) {
279
+ const refIndex = ref
280
+ .getAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE)
281
+ .split("-")
282
+ .pop();
283
+ this.setOption("entries." + refIndex + ".visibility", newVisibility);
284
+
285
+ if (newState === "close") {
286
+ this.setOption("entries." + refIndex + ".state", "close");
287
+ }
288
+
289
+ ref = ref.nextElementSibling;
290
+ }
291
+ }
292
+ };
293
+
294
+ const types = this.getOption("toggleEventType", ["click"]);
295
+ for (const [, type] of Object.entries(types)) {
296
+ this.shadowRoot.addEventListener(type, this[openEntryEventHandlerSymbol]);
297
+ }
298
+
299
+ // for (const [, type] of Object.entries(types)) {
300
+ //
301
+ // self[controlElementSymbol].addEventListener(type, function (event) {
302
+ //
303
+ // const element = findTargetElementFromEvent(event, ATTRIBUTE_ROLE, 'entry');
304
+ // if (!(element instanceof HTMLElement)) {
305
+ // return;
306
+ // }
307
+ //
308
+ // toggle.call(self);
309
+ //
310
+ //
311
+ // })
312
+ //
313
+ // }
314
+
315
+ return this;
316
+ }
317
+
318
+ /**
319
+ * @private
320
+ * @this Form
321
+ */
322
+ function initObserver() {;
323
+ }
324
+
325
+ /**
326
+ * Import Menu Entries from dataset
327
+ *
328
+ * @since 1.0.0
329
+ * @param {array|object|Map|Set} data
330
+ * @return {TreeMenu}
331
+ * @throws {Error} map is not iterable
332
+ * @private
333
+ */
334
+ function importEntries(data) {;
335
+
336
+ this[internalNodesSymbol] = new Map();
337
+
338
+ const mappingOptions = this.getOption("mapping", {});
339
+
340
+ const filter = mappingOptions?.["filter"];
341
+ const rootReferences = mappingOptions?.["rootReferences"];
342
+
343
+ const id = this.getOption("mapping.idTemplate", "id");
344
+ const parentID = this.getOption("mapping.parentTemplate", "parent");
345
+
346
+ const selector = mappingOptions?.["selector"];
347
+
348
+ const nodes = buildTree(data, selector, id, parentID, {
349
+ filter,
350
+ rootReferences,
351
+ });
352
+
353
+ const options = [];
354
+ for (const node of nodes) {
355
+ const iterator = new NodeRecursiveIterator(node);
356
+ for (const n of iterator) {
357
+ const formattedValues = formatKeyLabel.call(this, n);
358
+
359
+ const label = formattedValues.label;
360
+ const value = formattedValues.value;
361
+ const intend = n.level;
362
+
363
+ const visibility = intend > 0 ? "hidden" : "visible";
364
+ const state = "close";
365
+
366
+ this[internalNodesSymbol].set(value, n);
367
+
368
+ options.push({
369
+ value,
370
+ label,
371
+ intend,
372
+ state,
373
+ visibility,
374
+ ["has-children"]: n.hasChildNodes(),
375
+ });
376
+ }
377
+ }
378
+
379
+ this.setOption("entries", options);
380
+ return this;
381
+ }
382
+
383
+ /**
384
+ * @private
385
+ */
386
+ function importEntriesFromDatasource() {
387
+ const self = this;
388
+ self.setAttribute(ATTRIBUTE_DISABLED, ATTRIBUTE_DISABLED);
389
+
390
+ const datasource = self.getOption("datasource");
391
+ if (!(datasource instanceof Datasource)) {
392
+ throw new Error("undefined datasource");
393
+ }
394
+
395
+ datasource.attachObserver(
396
+ new Observer(function () {
397
+ if (isObject(this) && this instanceof ProxyObserver) {
398
+ importEntries.call(self, datasource.get());
399
+ }
400
+ }),
401
+ );
402
+
403
+ datasource
404
+ .read()
405
+ .then(() => {
406
+ new Processing(() => {
407
+ self.removeAttribute(ATTRIBUTE_DISABLED);
408
+ }).run();
409
+ })
410
+ .catch((e) => {
411
+ addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, e.toString());
412
+ });
413
+
414
+ return self;
415
+ }
416
+
417
+ /**
418
+ *
419
+ * @param {Node} node
420
+ * @return {array<label, value>}
421
+ * @memberOf Monster.Components.TreeMenu
422
+ * @private
423
+ */
424
+ function formatKeyLabel(node) {;
425
+ validateInstance(node, Node);
426
+
427
+ const label = new Formatter(node.value).format(
428
+ this.getOption("mapping.labelTemplate", ""),
429
+ );
430
+ const value = new Formatter(node.value).format(
431
+ this.getOption("mapping.valueTemplate", ""),
432
+ );
433
+
434
+ return {
435
+ value,
436
+ label,
437
+ };
438
+ }
439
+
440
+ /**
441
+ * @private
442
+ * @return {Monster.Components.TreeMenu.Form}
443
+ */
444
+ function initControlReferences() {;
445
+
446
+ if (!this.shadowRoot) {
447
+ throw new Error("no shadow-root is defined");
448
+ }
449
+
450
+ this[controlElementSymbol] = this.shadowRoot.querySelector(
451
+ "[data-monster-role=control]",
452
+ );
453
+ return this;
454
+ }
455
+
456
+ /**
457
+ *
458
+ * ```
459
+ * <monster-tree-menu data-monster-url="https://example.com/"></monster-tree-menu>
460
+ * ```
461
+
462
+ * @private
463
+ * @return {object}
464
+ */
465
+ function initOptionsFromArguments() {;
466
+ const options = {};
467
+
468
+ // let url = self.getAttribute(ATTRIBUTE_FORM_URL);
469
+ //
470
+ // if (isString(url)) {
471
+ // options['url'] = new URL(url, document.location).toString()
472
+ // }
473
+
474
+ return options;
475
+ }
476
+
477
+ function switchToConfig() {;
478
+
479
+ if (!this.shadowRoot) {
480
+ throw new Error("no shadow-root is defined");
481
+ }
482
+
483
+ this[dragoverEventHandlerSymbol] = (event) => {
484
+ const element = findTargetElementFromEvent(event, ATTRIBUTE_ROLE, "entry");
485
+ event.preventDefault();
486
+ if (!(element instanceof HTMLElement)) {
487
+ return;
488
+ }
489
+
490
+ const dropzone = document.createElement("div");
491
+ dropzone.classList.add("dropzone");
492
+
493
+ element.prepend(dropzone);
494
+
495
+ console.log("over", element.outerHTML, event);
496
+
497
+ event.dataTransfer.dropEffect = "move";
498
+ };
499
+
500
+ this[dragenterEventHandlerSymbol] = (event) => {
501
+ const element = findTargetElementFromEvent(event, ATTRIBUTE_ROLE, "entry");
502
+ console.log("enter", element.outerHTML, event);
503
+
504
+ event.dataTransfer.dropEffect = "move";
505
+ event.preventDefault();
506
+ };
507
+
508
+ this[dragleaveEventHandlerSymbol] = (event) => {
509
+ const element = findTargetElementFromEvent(event, ATTRIBUTE_ROLE, "entry");
510
+
511
+ event.preventDefault();
512
+ if (!(element instanceof HTMLElement)) {
513
+ return;
514
+ }
515
+
516
+ console.log("leave", element.outerHTML, event);
517
+
518
+ event.dataTransfer.dropEffect = "move";
519
+ event.preventDefault();
520
+ };
521
+
522
+ this[dragEventHandlerSymbol] = (event) => {
523
+ console.log(event);
524
+ event.preventDefault();
525
+ };
526
+
527
+ this[dropEventHandlerSymbol] = (event) => {
528
+ const element = findTargetElementFromEvent(event, ATTRIBUTE_ROLE, "entry");
529
+ console.log("drop", element.outerHTML, event);
530
+ event.preventDefault();
531
+ };
532
+
533
+ this[dragstartEventHandlerSymbol] = (event) => {
534
+ const element = findTargetElementFromEvent(event, ATTRIBUTE_ROLE, "entry");
535
+ if (!(element instanceof HTMLElement)) {
536
+ return;
537
+ }
538
+
539
+ //let container = findClosestByAttribute(element, ATTRIBUTE_ROLE, 'option');
540
+ const index = element
541
+ .getAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE)
542
+ .split("-")
543
+ .pop();
544
+
545
+ const currentState = this.getOption("entries." + index + ".state");
546
+ event.dataTransfer.setData("text/plain", "22");
547
+ event.dataTransfer.setData("text/html", "22");
548
+ event.dataTransfer.effectAllowed = "move";
549
+ };
550
+
551
+ this[controlElementSymbol].addEventListener(
552
+ "dragstart",
553
+ this[dragstartEventHandlerSymbol],
554
+ );
555
+ this[controlElementSymbol].addEventListener(
556
+ "dragenter",
557
+ this[dragenterEventHandlerSymbol],
558
+ );
559
+ this[controlElementSymbol].addEventListener(
560
+ "dragleave",
561
+ this[dragleaveEventHandlerSymbol],
562
+ );
563
+ this[controlElementSymbol].addEventListener(
564
+ "dragover",
565
+ this[dragoverEventHandlerSymbol],
566
+ );
567
+ this[controlElementSymbol].addEventListener(
568
+ "drop",
569
+ this[dropEventHandlerSymbol],
570
+ );
571
+ }
572
+
573
+ // /**
574
+ // * @private
575
+ // * @throws {Error} missing default slot
576
+ // * @throws {Error} no shadow-root is defined
577
+ // * @throws {Error} missing url
578
+ // * @throws {Error} we won't be able to read the data
579
+ // * @throws {Error} request failed
580
+ // * @throws {Error} not found
581
+ // * @throws {Error} undefined status or type
582
+ // * @fires Monster.Components.TreeMenu.event:monster-fetched
583
+ // */
584
+ // function initIntersectionObserver() {
585
+ // const self = this;
586
+ //
587
+ // if (self[intersectionObserverWasInitialized] === true) {
588
+ // return
589
+ // }
590
+ //
591
+ // self[intersectionObserverWasInitialized] = true;
592
+ //
593
+ // let options = {
594
+ // threshold: [0.5]
595
+ // }
596
+ //
597
+ // const callback = (entries, observer) => {
598
+ //
599
+ // for (const [, entry] of entries.entries()) {
600
+ // if (entry.isIntersecting === true) {
601
+ // if (!self.hasAttribute(ATTRIBUTE_FORM_RELOAD) || self.getAttribute(ATTRIBUTE_FORM_RELOAD).toLowerCase() === 'onshow') {
602
+ // observer.disconnect();
603
+ // }
604
+ //
605
+ // try {
606
+ // loadContent.call(self);
607
+ // } catch (e) {
608
+ // self.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.toString());
609
+ // }
610
+ //
611
+ //
612
+ // }
613
+ // }
614
+ // }
615
+ //
616
+ // const observer = new IntersectionObserver(callback, options);
617
+ // observer.observe(self);
618
+ //
619
+ //
620
+ // }
621
+
622
+ /**
623
+ * @private
624
+ * @return {string}
625
+ */
626
+ function getTemplate() {
627
+ // language=HTML
628
+ return `
629
+
630
+ <template id="entries">
631
+ <div data-monster-role="entry"
632
+ draggable="true"
633
+ data-monster-attributes="
634
+ data-monster-intend path:entries.intend,
635
+ data-monster-state path:entries.state,
636
+ data-monster-visibility path:entries.visibility,
637
+ data-monster-filtered path:entries.filtered,
638
+ data-monster-has-children path:entries.has-children">
639
+
640
+ <button data-monster-role="button"
641
+ data-monster-attributes="
642
+ type path:type,
643
+ role path:role,
644
+ value path:entries.value,
645
+ name path:name,
646
+ part path:type | prefix:option- | suffix: form" tabindex="-1">
647
+ <span data-monster-role="folder-handler"></span>
648
+ <span data-monster-replace="path:entries | index:label" part="entry-label"></span>
649
+ </button>
650
+ </template>
651
+
652
+ <div data-monster-role="control" part="control">
653
+ <div part="entries" data-monster-role="entries"
654
+ data-monster-insert="entries path:entries"
655
+ tabindex="-1"></div>
656
+ </div>
657
+ `;
658
+ }
659
+
660
+ registerCustomElement(TreeMenu);
@@ -26,29 +26,22 @@ export { AbstractConstraint };
26
26
  * @summary The abstract constraint
27
27
  */
28
28
  class AbstractConstraint extends Base {
29
- /**
30
- *
31
- */
32
- constructor() {
33
- super();
34
- }
29
+ /**
30
+ * this method must return a promise containing the result of the check.
31
+ *
32
+ * @param {*} value
33
+ * @returns {Promise}
34
+ */
35
+ isValid(value) {
36
+ return Promise.reject(value);
37
+ }
35
38
 
36
- /**
37
- * this method must return a promise containing the result of the check.
38
- *
39
- * @param {*} value
40
- * @returns {Promise}
41
- */
42
- isValid(value) {
43
- return Promise.reject(value);
44
- }
45
-
46
- /**
47
- * This method is called by the `instanceof` operator.
48
- * @returns {symbol}
49
- * @since 2.1.0
50
- */
51
- static get [instanceSymbol]() {
52
- return Symbol.for("@schukai/monster/constraints/abstract-constraint");
53
- }
39
+ /**
40
+ * This method is called by the `instanceof` operator.
41
+ * @returns {symbol}
42
+ * @since 2.1.0
43
+ */
44
+ static get [instanceSymbol]() {
45
+ return Symbol.for("@schukai/monster/constraints/abstract-constraint");
46
+ }
54
47
  }