@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,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
  }