@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,671 @@
1
+ /**
2
+ * Copyright 2023 schukai GmbH
3
+ * SPDX-License-Identifier: AGPL-3.0
4
+ */
5
+
6
+ import { instanceSymbol } from "../../../constants.mjs";
7
+ import {
8
+ assembleMethodSymbol,
9
+ registerCustomElement,
10
+ } from "../../../dom/customelement.mjs";
11
+ import { FilterRangeStyleSheet } from "../stylesheet/filter-range.mjs";
12
+ import { FilterControlsDefaultsStyleSheet } from "../stylesheet/filter-controls-defaults.mjs";
13
+ import { AbstractBase } from "./abstract-base.mjs";
14
+ import { positionPopper } from "../../form/util/floating-ui.mjs";
15
+ import { ATTRIBUTE_ROLE } from "../../../dom/constants.mjs";
16
+ import { getDocument } from "../../../dom/util.mjs";
17
+ import { STYLE_DISPLAY_MODE_BLOCK } from "../constants.mjs";
18
+ import { DeadMansSwitch } from "../../../util/deadmansswitch.mjs";
19
+ import {
20
+ addAttributeToken,
21
+ removeAttributeToken,
22
+ } from "../../../dom/attributes.mjs";
23
+ import { findTargetElementFromEvent } from "../../../dom/events.mjs";
24
+
25
+ export { Range };
26
+
27
+ /**
28
+ * @private
29
+ * @type {symbol}
30
+ */
31
+ const timerCallbackSymbol = Symbol("timerCallback");
32
+
33
+ /**
34
+ * local symbol
35
+ * @private
36
+ * @type {symbol}
37
+ */
38
+ const resizeObserverSymbol = Symbol("resizeObserver");
39
+
40
+ /**
41
+ * @private
42
+ * @type {symbol}
43
+ */
44
+ const controlElementSymbol = Symbol("controlElement");
45
+
46
+ /**
47
+ * local symbol
48
+ * @private
49
+ * @type {symbol}
50
+ */
51
+ const closeEventHandler = Symbol("closeEventHandler");
52
+
53
+ /**
54
+ * @private
55
+ * @type {symbol}
56
+ */
57
+ const inputElementSymbol = Symbol("inputElement");
58
+
59
+ /**
60
+ * @private
61
+ * @type {symbol}
62
+ */
63
+ const formContainerElementSymbol = Symbol("formContainerElement");
64
+
65
+ /**
66
+ * local symbol
67
+ * @private
68
+ * @type {symbol}
69
+ */
70
+ const popperElementSymbol = Symbol("popperElement");
71
+
72
+ /**
73
+ * local symbol
74
+ * @private
75
+ * @type {symbol}
76
+ */
77
+ const arrowElementSymbol = Symbol("arrowElement");
78
+
79
+ /**
80
+ * The range filter control is used to filter a data set by a range.
81
+ *
82
+ * <img src="./images/range.png">
83
+ *
84
+ * Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library
85
+ *
86
+ * You can create this control either by specifying the HTML tag <monster-filter-range />` directly in the HTML or using
87
+ * Javascript via the `document.createElement('monster-filter-range');` method.
88
+ *
89
+ * ```html
90
+ * <monster-filter-range></monster-filter-range>
91
+ * ```
92
+ *
93
+ * Or you can create this CustomControl directly in Javascript:
94
+ *
95
+ * ```js
96
+ * import '@schukai/component-datatable/source/filter/range.mjs';
97
+ * document.createElement('monster-filter-range');
98
+ * ```
99
+ *
100
+ * @startuml range.png
101
+ * skinparam monochrome true
102
+ * skinparam shadowing false
103
+ * HTMLElement <|-- CustomElement
104
+ * CustomElement <|-- AbstractBase
105
+ * AbstractBase <|-- Range
106
+ * @enduml
107
+ *
108
+ * @copyright schukai GmbH
109
+ * @memberOf Monster.Components.Datatable.Filter
110
+ * @summary A range filter control
111
+ */
112
+ class Range extends AbstractBase {
113
+ /**
114
+ * This method is called by the `instanceof` operator.
115
+ * @returns {symbol}
116
+ */
117
+ static get [instanceSymbol]() {
118
+ return Symbol.for("@schukai/monster/components/filter/range@@instance");
119
+ }
120
+
121
+ /**
122
+ *
123
+ * @return {FilterButton}
124
+ */
125
+ [assembleMethodSymbol]() {;
126
+ super[assembleMethodSymbol]();
127
+
128
+ initControlReferences.call(this);
129
+ initEventHandler.call(this);
130
+ }
131
+
132
+ /**
133
+ * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals)
134
+ *
135
+ * @param {*} value
136
+ */
137
+ set value(value) {
138
+ this[inputElementSymbol].value = value;
139
+ }
140
+
141
+ /**
142
+ * @returns {*}
143
+ */
144
+ get value() {
145
+ return this[inputElementSymbol].value;
146
+ }
147
+
148
+ /**
149
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
150
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
151
+ *
152
+ * The individual configuration values can be found in the table.
153
+ *
154
+ * @returns {Object}
155
+ *
156
+ * @property {Object} templates
157
+ * @property {string} templates.main
158
+ * @property {Object} labels
159
+ * @property {Object} features
160
+ */
161
+ get defaults() {
162
+ const d = Object.assign({}, super.defaults, {
163
+ templates: {
164
+ main: getTemplate(),
165
+ },
166
+
167
+ labels: {
168
+ singleValue: "Value",
169
+ fromValue: "From",
170
+ toValue: "To",
171
+ rangeFrom: "From",
172
+ rangeTo: "To",
173
+ },
174
+
175
+ features: {},
176
+
177
+ popper: {
178
+ placement: "bottom",
179
+ middleware: ["flip", "offset:1"],
180
+ },
181
+ });
182
+
183
+ return initOptionsFromArguments.call(this, d);
184
+ }
185
+
186
+ /**
187
+ *
188
+ * @return {CSSStyleSheet[]}
189
+ */
190
+ static getCSSStyleSheet() {
191
+ return [FilterControlsDefaultsStyleSheet, FilterRangeStyleSheet];
192
+ }
193
+
194
+ /**
195
+ *
196
+ * @return {string}
197
+ */
198
+ static getTag() {
199
+ return "monster-filter-range";
200
+ }
201
+
202
+ /**
203
+ * @return {void}
204
+ */
205
+ connectedCallback() {
206
+ super.connectedCallback();
207
+
208
+ const document = getDocument();;
209
+
210
+ for (const [, type] of Object.entries(["click", "touch"])) {
211
+ // close on outside ui-events
212
+ document.addEventListener(type, this[closeEventHandler]);
213
+ }
214
+
215
+ updatePopper.call(this);
216
+ attachResizeObserver.call(this);
217
+ }
218
+
219
+ /**
220
+ * @return {void}
221
+ */
222
+ disconnectedCallback() {
223
+ super.disconnectedCallback();
224
+
225
+ // close on outside ui-events
226
+ for (const [, type] of Object.entries(["click", "touch"])) {
227
+ document.removeEventListener(type, this[closeEventHandler]);
228
+ }
229
+
230
+ disconnectResizeObserver.call(this);
231
+ }
232
+
233
+ /**
234
+ *
235
+ * @return {Monster.Datatable.Filter.Range}
236
+ */
237
+ showDialog() {
238
+ show.call(this);
239
+ return this;
240
+ }
241
+
242
+ /**
243
+ *
244
+ * @return {Monster.Datatable.Filter.Range}
245
+ */
246
+ hideDialog() {
247
+ hide.call(this);
248
+ return this;
249
+ }
250
+
251
+ /**
252
+ *
253
+ * @return {Monster.Datatable.Filter.Range}
254
+ */
255
+ toggleDialog() {
256
+ if (this[popperElementSymbol].style.display === STYLE_DISPLAY_MODE_BLOCK) {
257
+ this.hideDialog();
258
+ } else {
259
+ this.showDialog();
260
+ }
261
+ return this;
262
+ }
263
+ }
264
+
265
+ function updateFilterValue(type, self, value, element) {
266
+ if (type === "single") {
267
+ self[inputElementSymbol].value = value;
268
+ } else if (type === "from") {
269
+ self[inputElementSymbol].value = value + "-";
270
+ } else if (type === "to") {
271
+ self[inputElementSymbol].value = "-" + value;
272
+ } else if (type === "from-to") {
273
+ // this option contain two input fields, we check which one was changed and read the other one
274
+ // the other field is in the same form group, for simplification we get both controls from the group here
275
+ const group = self[formContainerElementSymbol].querySelectorAll(
276
+ "input[type=radio][value=" + type + "] ~ input[type=number]",
277
+ );
278
+ let from = group[0].value;
279
+
280
+ if (from === "" || from === null || from < 0) {
281
+ from = 0;
282
+ }
283
+
284
+ let to = group[1].value;
285
+ if (to === "" || to === null || to < 0) {
286
+ to = 0;
287
+ }
288
+
289
+ if (element.name === "rangeTo") {
290
+ if (parseInt(from) > parseInt(to)) {
291
+ group[0].value = to;
292
+ from = to;
293
+ }
294
+ } else {
295
+ if (parseInt(from) > parseInt(to)) {
296
+ group[1].value = from;
297
+ to = from;
298
+ }
299
+ }
300
+
301
+ let range;
302
+ if (from === 0 && to === 0) {
303
+ range = "";
304
+ } else if (from === 0) {
305
+ range = "-" + to;
306
+ } else if (to === 0) {
307
+ range = from + "-";
308
+ } else if (from === to) {
309
+ range = from;
310
+ } else {
311
+ range = from + "-" + to;
312
+ }
313
+
314
+ self[inputElementSymbol].value = range;
315
+ }
316
+ }
317
+
318
+ /**
319
+ * @private
320
+ * @return {initEventHandler}
321
+ */
322
+ function initEventHandler() {;
323
+
324
+ this[closeEventHandler] = (event) => {
325
+ const path = event.composedPath();
326
+
327
+ for (const [, element] of Object.entries(path)) {
328
+ if (element === this) {
329
+ return;
330
+ }
331
+ }
332
+ hide.call(this);
333
+ };
334
+
335
+ this[inputElementSymbol].addEventListener("click", () => {
336
+ this.toggleDialog();
337
+ });
338
+
339
+ this[formContainerElementSymbol].addEventListener("click", (event) => {
340
+ const element = findTargetElementFromEvent(
341
+ event,
342
+ "data-monster-role",
343
+ "range-type",
344
+ );
345
+ if (!element) {
346
+ return;
347
+ }
348
+
349
+ const type = element.getAttribute("data-monster-range-type");
350
+
351
+ const radio = this[formContainerElementSymbol].querySelector(
352
+ "input[type=radio][value=" + type + "]",
353
+ );
354
+ if (!radio) {
355
+ return;
356
+ }
357
+
358
+ radio.checked = true;
359
+
360
+ // enable input from this group and disable the other
361
+ const group = this[formContainerElementSymbol].querySelectorAll(
362
+ "input[type=radio][value=" + type + "] ~ input[type=number]",
363
+ );
364
+ for (const [, element] of Object.entries(group)) {
365
+ element.disabled = false;
366
+ }
367
+
368
+ const otherGroup = this[formContainerElementSymbol].querySelectorAll(
369
+ "input[type=radio]:not([value=" + type + "]) ~ input[type=number]",
370
+ );
371
+ for (const [, element] of Object.entries(otherGroup)) {
372
+ element.disabled = true;
373
+ }
374
+ });
375
+
376
+ // if the user change the value of the input field, we have to update the main input field
377
+ this[formContainerElementSymbol].addEventListener("change", (event) => {
378
+ const element = findTargetElementFromEvent(event, "type", "number");
379
+ if (!element) {
380
+ return;
381
+ }
382
+
383
+ const typeElement = findTargetElementFromEvent(
384
+ event,
385
+ "data-monster-role",
386
+ "range-type",
387
+ );
388
+ if (!typeElement) {
389
+ return;
390
+ }
391
+
392
+ const type = typeElement.getAttribute("data-monster-range-type");
393
+ const value = element.value;
394
+ updateFilterValue(type, this, value, element);
395
+ });
396
+
397
+ // we should watch the change event of self[inputElementSymbol] and call updateInputFromValue
398
+ // if the value is changed from outside
399
+ this[inputElementSymbol].addEventListener("change", () => {
400
+ updateInputFromValue.call(this);
401
+ });
402
+
403
+ this.addEventListener("keydown", (event) => {
404
+ // if key code esc than hide dialog
405
+ if (event.key === "Escape") {
406
+ console.log("esc");
407
+ hide.call(this);
408
+
409
+ setTimeout(() => {
410
+ this[inputElementSymbol].focus();
411
+ }, 10);
412
+
413
+ return;
414
+ }
415
+
416
+ const input = findTargetElementFromEvent(
417
+ event,
418
+ "data-monster-role",
419
+ "input",
420
+ );
421
+ console.log(input, event, event.keyCode);
422
+ if (!input) {
423
+ return;
424
+ }
425
+
426
+ // key code down should activate first radio with name="singleValue"
427
+ if (event.key === "ArrowDown") {
428
+ show.call(this);
429
+ const radio = this[formContainerElementSymbol].querySelector(
430
+ "input[type=radio][value=single]",
431
+ );
432
+ if (radio) {
433
+ radio.checked = true;
434
+ }
435
+ setTimeout(() => {
436
+ // focus the input field
437
+ const input = this[formContainerElementSymbol].querySelector(
438
+ "input[type=radio][value=single] ~ input[name=singleValue]",
439
+ );
440
+ if (input) {
441
+ input.focus();
442
+ }
443
+ }, 10);
444
+ }
445
+ });
446
+
447
+ return this;
448
+ }
449
+
450
+ /**
451
+ * @private
452
+ */
453
+ function attachResizeObserver() {;
454
+
455
+ // against flickering
456
+ this[resizeObserverSymbol] = new ResizeObserver((entries) => {
457
+ if (this[timerCallbackSymbol] instanceof DeadMansSwitch) {
458
+ try {
459
+ this[timerCallbackSymbol].touch();
460
+ return;
461
+ } catch (e) {
462
+ delete this[timerCallbackSymbol];
463
+ }
464
+ }
465
+
466
+ this[timerCallbackSymbol] = new DeadMansSwitch(200, () => {
467
+ updatePopper.call(this);
468
+ });
469
+ });
470
+
471
+ this[resizeObserverSymbol].observe(this.parentElement);
472
+ }
473
+
474
+ function disconnectResizeObserver() {;
475
+ if (this[resizeObserverSymbol] instanceof ResizeObserver) {
476
+ this[resizeObserverSymbol].disconnect();
477
+ }
478
+ }
479
+
480
+ /**
481
+ * @private
482
+ */
483
+ function hide() {;
484
+
485
+ this[popperElementSymbol].style.display = "none";
486
+ removeAttributeToken(this[controlElementSymbol], "class", "open");
487
+ }
488
+
489
+ /**
490
+ * @private
491
+ * @this PopperButton
492
+ */
493
+ function show() {;
494
+
495
+ if (this.getOption("disabled", false) === true) {
496
+ return;
497
+ }
498
+
499
+ updateInputFromValue.call(this);
500
+
501
+ if (this[popperElementSymbol].style.display === STYLE_DISPLAY_MODE_BLOCK) {
502
+ return;
503
+ }
504
+
505
+ this[popperElementSymbol].style.visibility = "hidden";
506
+ this[popperElementSymbol].style.display = STYLE_DISPLAY_MODE_BLOCK;
507
+
508
+ addAttributeToken(this[controlElementSymbol], "class", "open");
509
+
510
+ updatePopper.call(this);
511
+ }
512
+
513
+ /**
514
+ * @private
515
+ */
516
+ function updateInputFromValue() {
517
+ const value = this[inputElementSymbol].value.trim();
518
+ const formContainer = this[formContainerElementSymbol];
519
+ const rangeTypes = ["single", "from", "to", "from-to"];
520
+ const rangeValues = value.split("-");
521
+ const hasDash = value.includes("-");
522
+
523
+ if (!/^(-?\d+(-\d+)?|-)?$/.test(value)) {
524
+ return; // Skip if input contains invalid characters
525
+ }
526
+
527
+ rangeTypes.forEach((rangeType) => {
528
+ const radio = formContainer.querySelector(
529
+ `input[type=radio][value=${rangeType}]`,
530
+ );
531
+ const inputs = formContainer.querySelectorAll(
532
+ `input[type=radio][value=${rangeType}] ~ input[type=number]`,
533
+ );
534
+
535
+ inputs.forEach((input) => (input.value = ""));
536
+
537
+ if (
538
+ (rangeType === "single" && !hasDash) ||
539
+ (rangeType === "to" && value.startsWith("-")) ||
540
+ (rangeType === "from" && value.endsWith("-")) ||
541
+ (rangeType === "from-to" && hasDash && rangeValues.length === 2)
542
+ ) {
543
+ if (rangeType === "single") {
544
+ inputs[0].value = value;
545
+ } else if (rangeType !== "from-to") {
546
+ inputs[0].value = rangeValues.pop();
547
+ } else {
548
+ if (isNaN(rangeValues[0]) || isNaN(rangeValues[1])) {
549
+ rangeValues[0] = rangeValues[1] = "";
550
+ } else if (parseInt(rangeValues[0]) > parseInt(rangeValues[1])) {
551
+ rangeValues.reverse();
552
+ this[inputElementSymbol].value = rangeValues.join("-");
553
+ }
554
+ inputs.forEach((input, index) => (input.value = rangeValues[index]));
555
+ }
556
+ radio.click();
557
+ inputs[0].focus();
558
+ }
559
+ });
560
+ }
561
+
562
+ /**
563
+ * @private
564
+ * @return {Monster.Components.Datatable.Filter.Range}
565
+ */
566
+ function initControlReferences() {;
567
+
568
+ if (!this.shadowRoot) {
569
+ throw new Error("no shadow-root is defined");
570
+ }
571
+
572
+ this[controlElementSymbol] = this.shadowRoot.querySelector(
573
+ `[${ATTRIBUTE_ROLE}=control]`,
574
+ );
575
+ this[inputElementSymbol] = this.shadowRoot.querySelector(
576
+ `[${ATTRIBUTE_ROLE}=input]`,
577
+ );
578
+ this[popperElementSymbol] = this.shadowRoot.querySelector(
579
+ `[${ATTRIBUTE_ROLE}=popper]`,
580
+ );
581
+ this[arrowElementSymbol] = this.shadowRoot.querySelector(
582
+ `[${ATTRIBUTE_ROLE}=arrow]`,
583
+ );
584
+ this[formContainerElementSymbol] = this.shadowRoot.querySelector(
585
+ `[${ATTRIBUTE_ROLE}=form]`,
586
+ );
587
+
588
+ return this;
589
+ }
590
+
591
+ /**
592
+ * @private
593
+ * @param {object} options
594
+ * @return {object}
595
+ */
596
+ function initOptionsFromArguments(options) {;
597
+
598
+ return options;
599
+ }
600
+
601
+ /**
602
+ * @private
603
+ */
604
+ function updatePopper() {;
605
+
606
+ if (this[popperElementSymbol].style.display !== STYLE_DISPLAY_MODE_BLOCK) {
607
+ return;
608
+ }
609
+
610
+ if (this.getOption("disabled", false) === true) {
611
+ return;
612
+ }
613
+
614
+ positionPopper.call(
615
+ this,
616
+ this[controlElementSymbol],
617
+ this[popperElementSymbol],
618
+ this.getOption("popper", {}),
619
+ );
620
+ }
621
+
622
+ /**
623
+ * @private
624
+ * @return {string}
625
+ */
626
+ function getTemplate() {
627
+ // language=HTML
628
+ return `
629
+ <div data-monster-role="control" part="control">
630
+ <input data-monster-attributes="disabled path:disabled | if:true, class path:classes.input"
631
+ data-monster-role="input"
632
+ part="button"
633
+ data-monster-replace="path:labels.button">
634
+
635
+ <div data-monster-role="popper" part="popper" tabindex="-1" class="monster-color-primary-1">
636
+ <div data-monster-role="arrow"></div>
637
+ <div part="filter" class="flex" data-monster-replace="path:filter">
638
+ <div class="form-container" data-monster-role="form">
639
+
640
+ <div class="form-group" data-monster-role="range-type" data-monster-range-type="single">
641
+ <input type="radio" name="rangeType" value="single" tabindex="0">
642
+ <label for="single"><span data-monster-replace="path:labels.singleValue"></span></label>
643
+ <input type="number" min="0" name="singleValue" disabled tabindex="0">
644
+ </div>
645
+ <div class="form-group" data-monster-role="range-type" data-monster-range-type="from">
646
+ <input type="radio" name="rangeType" value="from" tabindex="0">
647
+ <label for="from"><span data-monster-replace="path:labels.fromValue"></span></label>
648
+ <input type="number" min="0" name="fromValue" disabled tabindex="0">
649
+ </div>
650
+ <div class="form-group" data-monster-role="range-type" data-monster-range-type="to">
651
+ <input type="radio" name="rangeType" value="to" tabindex="0">
652
+ <label for="to"><span data-monster-replace="path:labels.toValue"></span></label>
653
+ <input type="number" min="0" name="toValue" disabled tabindex="0">
654
+ </div>
655
+ <div class="form-group" data-monster-role="range-type" data-monster-range-type="from-to">
656
+ <input type="radio" name="rangeType" value="from-to" tabindex="0">
657
+ <label for="rangeFrom"><span data-monster-replace="path:labels.rangeFrom"></span></label>
658
+ <input type="number" min="0" name="rangeFrom" disabled tabindex="0">
659
+ <label for="rangeTo"><span data-monster-replace="path:labels.toValue"></span></label>
660
+ <input type="number" min="0" name="rangeTo" disabled tabindex="0">
661
+ </div>
662
+
663
+
664
+ </div>
665
+ </div>
666
+ </div>
667
+
668
+ `;
669
+ }
670
+
671
+ registerCustomElement(Range);