@schukai/monster 3.51.4 → 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 (451) hide show
  1. package/CHANGELOG.md +706 -0
  2. package/README.md +16 -13
  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 +226 -217
  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/constraint/abstractoperator.mjs +2 -2
  348. package/test/cases/constraint/andoperator.mjs +3 -3
  349. package/test/cases/constraint/invalid.mjs +1 -1
  350. package/test/cases/constraint/isarray.mjs +1 -1
  351. package/test/cases/constraint/isobject.mjs +1 -1
  352. package/test/cases/constraint/oroperator.mjs +3 -3
  353. package/test/cases/constraint/valid.mjs +1 -1
  354. package/test/cases/data/buildmap.mjs +1 -1
  355. package/test/cases/data/buildtree.mjs +2 -2
  356. package/test/cases/data/datasource/dom.mjs +1 -1
  357. package/test/cases/data/datasource/server/restapi.mjs +2 -2
  358. package/test/cases/data/datasource/server/websocket.mjs +1 -1
  359. package/test/cases/data/datasource/server.mjs +1 -1
  360. package/test/cases/data/datasource/storage/localstorage.mjs +1 -1
  361. package/test/cases/data/datasource/storage/sessionstorage.mjs +1 -1
  362. package/test/cases/data/datasource.mjs +1 -1
  363. package/test/cases/data/diff.mjs +2 -2
  364. package/test/cases/data/extend.mjs +1 -1
  365. package/test/cases/data/pathfinder.mjs +1 -1
  366. package/test/cases/data/pipe.mjs +2 -2
  367. package/test/cases/data/transformer.mjs +3 -4
  368. package/test/cases/dom/assembler.mjs +1 -1
  369. package/test/cases/dom/attributes.mjs +1 -1
  370. package/test/cases/dom/customcontrol.mjs +8 -7
  371. package/test/cases/dom/customelement-initfromscripthost.mjs +6 -6
  372. package/test/cases/dom/customelement.mjs +7 -7
  373. package/test/cases/dom/dimension.mjs +4 -4
  374. package/test/cases/dom/events.mjs +1 -1
  375. package/test/cases/dom/find.mjs +1 -1
  376. package/test/cases/dom/focusmanager.mjs +1 -1
  377. package/test/cases/dom/locale.mjs +2 -2
  378. package/test/cases/dom/ready.mjs +1 -1
  379. package/test/cases/dom/resource/data.mjs +3 -3
  380. package/test/cases/dom/resource/link/stylesheet.mjs +3 -3
  381. package/test/cases/dom/resource/link.mjs +3 -3
  382. package/test/cases/dom/resource/script.mjs +3 -3
  383. package/test/cases/dom/resource.mjs +1 -1
  384. package/test/cases/dom/resourcemanager.mjs +1 -1
  385. package/test/cases/dom/slotted-nodes.mjs +1 -1
  386. package/test/cases/dom/template.mjs +2 -2
  387. package/test/cases/dom/theme.mjs +2 -2
  388. package/test/cases/dom/updater.mjs +4 -4
  389. package/test/cases/dom/util/extract-keys.mjs +1 -1
  390. package/test/cases/dom/util/init-options-from-attributes.mjs +1 -1
  391. package/test/cases/dom/util.mjs +2 -2
  392. package/test/cases/dom/worker/factory.mjs +2 -2
  393. package/test/cases/i18n/formatter.mjs +2 -2
  394. package/test/cases/i18n/locale.mjs +1 -1
  395. package/test/cases/i18n/provider.mjs +4 -4
  396. package/test/cases/i18n/providers/embed.mjs +3 -3
  397. package/test/cases/i18n/providers/fetch.mjs +3 -3
  398. package/test/cases/i18n/translations.mjs +3 -3
  399. package/test/cases/logging/handler/console.mjs +3 -3
  400. package/test/cases/logging/handler.mjs +3 -3
  401. package/test/cases/logging/logentry.mjs +1 -1
  402. package/test/cases/logging/logger.mjs +1 -1
  403. package/test/cases/math/random.mjs +1 -2
  404. package/test/cases/monster.mjs +2 -2
  405. package/test/cases/net/webconnect/message.mjs +1 -2
  406. package/test/cases/net/webconnect.mjs +3 -3
  407. package/test/cases/text/bracketed-key-value-hash.mjs +1 -1
  408. package/test/cases/text/formatter.mjs +1 -1
  409. package/test/cases/text/util.mjs +1 -1
  410. package/test/cases/types/base.mjs +2 -2
  411. package/test/cases/types/basewithoptions.mjs +1 -1
  412. package/test/cases/types/binary.mjs +1 -1
  413. package/test/cases/types/dataurl.mjs +1 -1
  414. package/test/cases/types/global.mjs +1 -1
  415. package/test/cases/types/id.mjs +1 -1
  416. package/test/cases/types/internal.mjs +2 -2
  417. package/test/cases/types/is.mjs +2 -2
  418. package/test/cases/types/mediatype.mjs +1 -1
  419. package/test/cases/types/node.mjs +4 -4
  420. package/test/cases/types/nodelist.mjs +2 -2
  421. package/test/cases/types/noderecursiveiterator.mjs +3 -3
  422. package/test/cases/types/observablequeue.mjs +2 -2
  423. package/test/cases/types/observer.mjs +1 -1
  424. package/test/cases/types/observerlist.mjs +2 -2
  425. package/test/cases/types/proxyobserver.mjs +4 -4
  426. package/test/cases/types/queue.mjs +1 -1
  427. package/test/cases/types/randomid.mjs +1 -1
  428. package/test/cases/types/regex.mjs +1 -1
  429. package/test/cases/types/stack.mjs +1 -1
  430. package/test/cases/types/tokenlist.mjs +1 -1
  431. package/test/cases/types/typeof.mjs +2 -2
  432. package/test/cases/types/uniquequeue.mjs +1 -1
  433. package/test/cases/types/uuid.mjs +1 -1
  434. package/test/cases/types/validate.mjs +3 -3
  435. package/test/cases/types/version.mjs +1 -1
  436. package/test/cases/util/clone.mjs +1 -1
  437. package/test/cases/util/comparator.mjs +1 -1
  438. package/test/cases/util/deadmansswitch.mjs +1 -1
  439. package/test/cases/util/freeze.mjs +1 -1
  440. package/test/cases/util/processing.mjs +1 -1
  441. package/test/cases/util/trimspaces.mjs +1 -1
  442. package/test/util/chai-dom.mjs +2 -2
  443. package/test/util/intersection-mock.mjs +69 -0
  444. package/test/util/jsdom.mjs +43 -27
  445. package/test/util/localstorage.mjs +1 -0
  446. package/test/util/resize-observer.mjs +29 -0
  447. package/test/util/websocket.mjs +5 -2
  448. package/test/web/import.js +92 -73
  449. package/test/web/test.html +28 -5
  450. package/test/web/tests.js +29430 -15209
  451. package/CHANGELOG +0 -438
@@ -0,0 +1,929 @@
1
+ /**
2
+ * Copyright 2023 schukai GmbH
3
+ * SPDX-License-Identifier: AGPL-3.0
4
+ */
5
+
6
+ import { instanceSymbol } from "../../constants.mjs";
7
+ import { findElementWithIdUpwards } from "../../dom/util.mjs";
8
+ import {
9
+ assembleMethodSymbol,
10
+ CustomElement,
11
+ getSlottedElements,
12
+ registerCustomElement,
13
+ } from "../../dom/customelement.mjs";
14
+ import { ID } from "../../types/id.mjs";
15
+ import { Settings } from "./filter/settings.mjs";
16
+ import { FilterStyleSheet } from "./stylesheet/filter.mjs";
17
+ import { getDocument, getWindow } from "../../dom/util.mjs";
18
+ import { getGlobal } from "../../types/global.mjs";
19
+ import { isInstance, isFunction, isObject, isArray } from "../../types/is.mjs";
20
+ import { Host } from "../host/host.mjs";
21
+ import { addAttributeToken } from "../../dom/attributes.mjs";
22
+ import { ATTRIBUTE_ERRORMESSAGE } from "../../dom/constants.mjs";
23
+ import "../form/message-state-button.mjs";
24
+ import { Formatter } from "../../text/formatter.mjs";
25
+ import { generateRangeComparisonExpression } from "../../text/util.mjs";
26
+ import { generateUniqueConfigKey } from "../host/util.mjs";
27
+ import {
28
+ parseBracketedKeyValueHash,
29
+ createBracketedKeyValueHash,
30
+ } from "../../text/bracketed-key-value-hash.mjs";
31
+
32
+ import "./filter/select.mjs";
33
+
34
+ export { Filter };
35
+
36
+ /**
37
+ * @private
38
+ * @type {symbol}
39
+ */
40
+ const filterSelectElementSymbol = Symbol("filterSelectElement");
41
+
42
+ /**
43
+ * @private
44
+ * @type {symbol}
45
+ */
46
+ const searchButtonElementSymbol = Symbol("searchButtonElement");
47
+
48
+ /**
49
+ * @private
50
+ * @type {symbol}
51
+ */
52
+ const resetButtonElementSymbol = Symbol("resetButtonElement");
53
+
54
+ /**
55
+ * @private
56
+ * @type {symbol}
57
+ */
58
+ const filterControlElementSymbol = Symbol("filterControlElement");
59
+
60
+ /**
61
+ * @private
62
+ * @type {symbol}
63
+ */
64
+ const locationChangeHandlerSymbol = Symbol("locationChangeHandler");
65
+
66
+ /**
67
+ * @private
68
+ * @type {symbol}
69
+ */
70
+ const settingsSymbol = Symbol("settings");
71
+
72
+ /**
73
+ * The Filter component is used to show and handle the filter values.
74
+ *
75
+ * <img src="./images/filter.png">
76
+ *
77
+ * Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library
78
+ *
79
+ * You can create this control either by specifying the HTML tag <monster-filter />` directly in the HTML or using
80
+ * Javascript via the `document.createElement('monster-filter');` method.
81
+ *
82
+ * ```html
83
+ * <monster-datatable-filter></monster-datatable-filter>
84
+ * ```
85
+ *
86
+ * Or you can create this CustomControl directly in Javascript:
87
+ *
88
+ * ```js
89
+ * import '@schukai/component-datatable/source/filter.mjs';
90
+ * document.createElement('monster-datatable-filter');
91
+ * ```
92
+ *
93
+ * The Body should have a class "hidden" to ensure that the styles are applied correctly.
94
+ *
95
+ * ```css
96
+ * body.hidden {
97
+ * visibility: hidden;
98
+ * }
99
+ * ```
100
+ *
101
+ * @startuml filter.png
102
+ * skinparam monochrome true
103
+ * skinparam shadowing false
104
+ * HTMLElement <|-- CustomElement
105
+ * CustomElement <|-- Filter
106
+ * @enduml
107
+ *
108
+ * @copyright schukai GmbH
109
+ * @memberOf Monster.Components.Datatable
110
+ * @summary A data set
111
+ */
112
+ class Filter extends CustomElement {
113
+ /**
114
+ *
115
+ */
116
+ constructor() {
117
+ super();;
118
+ this[settingsSymbol] = new Settings();
119
+ }
120
+
121
+ /**
122
+ * This method is called by the `instanceof` operator.
123
+ * @returns {symbol}
124
+ */
125
+ static get [instanceSymbol]() {
126
+ return Symbol.for("@schukai/monster/components/filter@@instance");
127
+ }
128
+
129
+ /**
130
+ *
131
+ * @param {string} message
132
+ * @returns {Monster.Components.Datatable.Filter}
133
+ */
134
+ showFailureMessage(message) {;
135
+ this[searchButtonElementSymbol].setState("failed", 10000);
136
+ this[searchButtonElementSymbol]
137
+ .setMessage(String(message))
138
+ .showMessage(10000);
139
+ return this;
140
+ }
141
+
142
+ /**
143
+ *
144
+ * @returns {Monster.Components.Datatable.Filter}
145
+ */
146
+ resetFailureMessage() {;
147
+ this[searchButtonElementSymbol].hideMessage();
148
+ this[searchButtonElementSymbol].removeState();
149
+ return this;
150
+ }
151
+
152
+ /**
153
+ *
154
+ * @returns {Monster.Components.Datatable.Filter}
155
+ */
156
+ showSuccess() {;
157
+ this[searchButtonElementSymbol].setState("successful", 5000);
158
+ return this;
159
+ }
160
+
161
+ /**
162
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
163
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
164
+ *
165
+ * The individual configuration values can be found in the table.
166
+ *
167
+ * @property {Object} templates Template definitions
168
+ * @property {string} templates.main Main template
169
+ * @property {Object} labels Label definitions
170
+ * @property {string} labels.search Search button label
171
+ * @property {string} labels.reset Reset button label
172
+ * @property {Object} queries Query definitions
173
+ * @property {function} queries.wrap Wrap query
174
+ * @property {function} queries.join Join queries
175
+ * @property {string} defaultQuery Default query
176
+ */
177
+ get defaults() {
178
+ const obj = Object.assign({}, super.defaults, {
179
+ templates: {
180
+ main: getTemplate(),
181
+ },
182
+ labels: {
183
+ search: "Search",
184
+ reset: "Reset",
185
+ "empty-query-and-no-default": "Please select a filter",
186
+ "query-not-changed": "The query has not changed",
187
+ },
188
+
189
+ queries: {
190
+ wrap: (value, definition) => {
191
+ return value;
192
+ },
193
+ join: (queries) => {
194
+ if (queries.length === 0) {
195
+ return "";
196
+ }
197
+ return queries.join(" AND ");
198
+ },
199
+ },
200
+
201
+ query: "",
202
+ defaultQuery: "",
203
+ });
204
+
205
+ return obj;
206
+ }
207
+
208
+ /**
209
+ *
210
+ * @return {string}
211
+ */
212
+ static getTag() {
213
+ return "monster-datatable-filter";
214
+ }
215
+
216
+ /**
217
+ * @return {FilterButton}
218
+ */
219
+ [assembleMethodSymbol]() {;
220
+ super[assembleMethodSymbol]();
221
+
222
+ initControlReferences.call(this);
223
+ initEventHandler.call(this);
224
+
225
+ initFromConfig
226
+ .call(this)
227
+ .then(() => {
228
+ initFilter.call(this);
229
+ })
230
+ .catch((error) => {
231
+ console.error(error);
232
+ });
233
+ }
234
+
235
+ /**
236
+ *
237
+ */
238
+ connectedCallback() {;
239
+ super.connectedCallback();
240
+
241
+ getWindow().addEventListener(
242
+ "hashchange",
243
+ this[locationChangeHandlerSymbol],
244
+ );
245
+ }
246
+
247
+ /**
248
+ *
249
+ */
250
+ disconnectedCallback() {;
251
+ super.disconnectedCallback();
252
+
253
+ getWindow().removeEventListener(
254
+ "hashchange",
255
+ this[locationChangeHandlerSymbol],
256
+ );
257
+ }
258
+
259
+ /**
260
+ * @return {Array<CSSStyleSheet>}
261
+ */
262
+ static getCSSStyleSheet() {
263
+ return [FilterStyleSheet];
264
+ }
265
+ }
266
+
267
+ /**
268
+ * @private
269
+ * @return {FilterButton}
270
+ */
271
+ function initControlReferences() {;
272
+
273
+ if (!this.shadowRoot) {
274
+ throw new Error("no shadow-root is defined");
275
+ }
276
+
277
+ this[filterControlElementSymbol] = this.shadowRoot.querySelector(
278
+ "[data-monster-role=control]",
279
+ );
280
+ this[filterSelectElementSymbol] = this.shadowRoot.querySelector(
281
+ "[data-monster-role=filter-select]",
282
+ );
283
+ this[searchButtonElementSymbol] = this.shadowRoot.querySelector(
284
+ "[data-monster-role=search-button]",
285
+ );
286
+ this[resetButtonElementSymbol] = this.shadowRoot.querySelector(
287
+ "[data-monster-role=reset-button]",
288
+ );
289
+ return this;
290
+ }
291
+
292
+ /**
293
+ * @private
294
+ * @throws {Error} no filter label is defined
295
+ */
296
+ function initFilter() {;
297
+
298
+ const storedConfig = this[settingsSymbol];
299
+ this[settingsSymbol] = new Settings();
300
+
301
+ const result = parseBracketedKeyValueHash(getGlobal().location.hash);
302
+ let valuesFromHash = {};
303
+ if (isObject(result) && result?.[this.id]) {
304
+ valuesFromHash = result[this.id];
305
+ }
306
+
307
+ getSlottedElements
308
+ .call(this, "label[data-monster-label]")
309
+ .forEach((element) => {
310
+ const label = element.getAttribute("data-monster-label");
311
+ if (!label) {
312
+ throw new Error("no filter label is defined");
313
+ }
314
+
315
+ let value = element.id;
316
+ if (!value) {
317
+ const prefix = label.replace(/\W/g, "-");
318
+ prefix.charAt(0).match(/[\d_]/g)?.length ? `f${prefix}` : prefix;
319
+
320
+ value = new ID(prefix + "-").toString();
321
+ element.id = value;
322
+ }
323
+
324
+ let setting = storedConfig.get(value);
325
+
326
+ if (setting) {
327
+ this[settingsSymbol].set(setting);
328
+ }
329
+
330
+ if (valuesFromHash?.[element.id]) {
331
+ const v = escapeAttributeValue(valuesFromHash[element.id]);
332
+ const searchInput = element.firstElementChild;
333
+ try {
334
+ searchInput.value = valuesFromHash[element.id];
335
+ } catch (error) {}
336
+ }
337
+
338
+ setting = this[settingsSymbol].get(value);
339
+ if (setting) {
340
+ setSlotAttribute(element, setting.visible);
341
+ //style.display = setting.visible ? "block" : "none";
342
+ }
343
+
344
+ //const visible = window.getComputedStyle(element).display !== "none";
345
+ const visible = getVisibilityFromSlotAttribute(element);
346
+
347
+ this[settingsSymbol].set({ value, label, visible });
348
+ });
349
+
350
+ this[filterSelectElementSymbol].setOption(
351
+ "options",
352
+ this[settingsSymbol].getOptions(),
353
+ );
354
+ setTimeout(() => {
355
+ this[filterSelectElementSymbol].value = this[settingsSymbol].getSelected();
356
+ }, 10);
357
+ }
358
+
359
+ /**
360
+ *
361
+ * @param {string} input
362
+ * @returns {*}
363
+ */
364
+ function escapeAttributeValue(input) {
365
+ return input
366
+ .replace(/&/g, "&amp;")
367
+ .replace(/"/g, "&quot;")
368
+ .replace(/'/g, "&#x27;")
369
+ .replace(/</g, "&lt;")
370
+ .replace(/>/g, "&gt;");
371
+ }
372
+
373
+ /**
374
+ *
375
+ * @param {HTMLElement} element
376
+ * @returns {boolean}
377
+ */
378
+ function getVisibilityFromSlotAttribute(element) {
379
+ return element.hasAttribute("slot") &&
380
+ element.getAttribute("slot") === "hidden"
381
+ ? false
382
+ : true;
383
+ }
384
+
385
+ /**
386
+ * @private
387
+ * @param {HTMLElement} element
388
+ * @param {boolean} visible
389
+ */
390
+ function setSlotAttribute(element, visible) {
391
+ if (visible) {
392
+ element.removeAttribute("slot");
393
+ return;
394
+ }
395
+
396
+ element.setAttribute("slot", "hidden");
397
+ }
398
+
399
+ /**
400
+ * @private
401
+ */
402
+ function initEventHandler() {
403
+ const self = this;
404
+ /**
405
+ * Monster.Components.Form.event:monster-selection-cleared
406
+ */
407
+ if (self[filterSelectElementSymbol]) {
408
+ self[filterSelectElementSymbol].addEventListener(
409
+ "monster-selection-cleared",
410
+ function (event) {
411
+ const settings = self[settingsSymbol].getOptions();
412
+
413
+ for (const setting of settings) {
414
+ const filterElement = findElementWithIdUpwards(self, setting.value);
415
+ if (filterElement) {
416
+ setSlotAttribute(filterElement, false);
417
+
418
+ self[settingsSymbol].set({ value: setting.value, visible: false });
419
+ }
420
+ }
421
+
422
+ updateConfig.call(self);
423
+ },
424
+ );
425
+
426
+ self[filterSelectElementSymbol].addEventListener(
427
+ "monster-changed",
428
+ function (event) {
429
+ const filterElement = findElementWithIdUpwards(
430
+ self,
431
+ event.detail.value,
432
+ );
433
+ if (filterElement) {
434
+ //filterElement.style.display = event.detail.checked ? "block" : "none";
435
+ setSlotAttribute(filterElement, event.detail.checked);
436
+ }
437
+
438
+ self[settingsSymbol].set({
439
+ value: event.detail.value,
440
+ visible: event.detail.checked,
441
+ });
442
+
443
+ updateConfig.call(self);
444
+ },
445
+ );
446
+ }
447
+
448
+ self[searchButtonElementSymbol].setOption("actions.click", () => {
449
+ doSearch.call(self);
450
+ });
451
+
452
+ // the reset button should reset the filter and the search query
453
+ // all input elements should be reset to their default values
454
+ // which is the empty string. we search for all input elements
455
+ // in the filter and reset them to their default value
456
+ self[resetButtonElementSymbol].setOption("actions.click", () => {
457
+ getSlottedElements
458
+ .call(self, "label[data-monster-label]")
459
+ .forEach((element) => {
460
+ const label = element.getAttribute("data-monster-label");
461
+ if (!label) {
462
+ return;
463
+ }
464
+
465
+ const input = element.firstElementChild;
466
+
467
+ if (input) {
468
+ input.value = "";
469
+ }
470
+ });
471
+
472
+ doSearch.call(self, { showEffect: false });
473
+ });
474
+
475
+ self[locationChangeHandlerSymbol] = (event) => {
476
+ if (event instanceof HashChangeEvent) {
477
+ if (event.oldURL === event.newURL) {
478
+ return;
479
+ }
480
+ }
481
+ };
482
+
483
+ self.addEventListener("keyup", (event) => {
484
+ const path = event.composedPath();
485
+ if (path.length === 0) {
486
+ return;
487
+ }
488
+
489
+ if (!(path[0] instanceof HTMLInputElement)) {
490
+ return;
491
+ }
492
+
493
+ if (event.keyCode === 13) {
494
+ doSearch.call(self, { showEffect: false });
495
+ }
496
+ });
497
+ }
498
+
499
+ /**
500
+ * @private
501
+ */
502
+ function doSearch({ showEffect } = { showEffect: true }) {;
503
+
504
+ this.resetFailureMessage();
505
+
506
+ if (showEffect) {
507
+ this[searchButtonElementSymbol].setState("activity", 10000);
508
+ }
509
+
510
+ collectSearchQueries
511
+ .call(this)
512
+ .then((query) => {
513
+ const buildQuery = buildSearchQuery.call(this, query);
514
+ if (buildQuery === "" && !this.getOption("defaultQuery")) {
515
+ this[searchButtonElementSymbol].removeState();
516
+ this[searchButtonElementSymbol]
517
+ .setMessage(this.getOption("labels.empty-query-and-no-default"))
518
+ .showMessage(5000);
519
+ return;
520
+ }
521
+
522
+ if (buildQuery === this.getOption("query")) {
523
+ this[searchButtonElementSymbol].removeState();
524
+ this[searchButtonElementSymbol]
525
+ .setMessage(this.getOption("labels.query-not-changed"))
526
+ .showMessage(5000);
527
+ return;
528
+ }
529
+
530
+ if (showEffect) {
531
+ this[searchButtonElementSymbol].setState("activity", 2000);
532
+ }
533
+
534
+ this.setOption("query", buildSearchQuery.call(this, query));
535
+ })
536
+ .catch((error) => {
537
+ console.error(error);
538
+ if (error instanceof Error) {
539
+ addAttributeToken(
540
+ this,
541
+ ATTRIBUTE_ERRORMESSAGE,
542
+ error.message + " " + error.stack,
543
+ );
544
+ } else {
545
+ addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
546
+ }
547
+
548
+ this[searchButtonElementSymbol].setState("failed", 10000);
549
+ this[searchButtonElementSymbol].setMessage(String(error)).showMessage();
550
+ });
551
+ }
552
+
553
+ /**
554
+ * @private
555
+ * @param queries
556
+ * @returns {string|undefind}
557
+ */
558
+ function buildSearchQuery(queries) {;
559
+
560
+ if (!isArray(queries) || queries.length === 0) {
561
+ return this.getOption("defaultQuery");
562
+ }
563
+
564
+ const joinCallback = this.getOption("queries.join");
565
+ if (isFunction(joinCallback)) {
566
+ return joinCallback(queries);
567
+ }
568
+
569
+ const q = queries.join(" ").trim();
570
+ if (q.length === 0) {
571
+ return this.getOption("defaultQuery");
572
+ }
573
+
574
+ return q;
575
+ }
576
+
577
+ /**
578
+ * @private
579
+ * @returns {Promise<unknown>}
580
+ */
581
+ function collectSearchQueries() {;
582
+
583
+ const currentHash = parseBracketedKeyValueHash(getGlobal().location.hash);
584
+
585
+ return new Promise((resolve, reject) => {
586
+ const query = [];
587
+ const wrapCallback = this.getOption("queries.wrap");
588
+
589
+ getSlottedElements
590
+ .call(this, "label[data-monster-label]")
591
+ .forEach((element) => {
592
+ const label = element.getAttribute("data-monster-label");
593
+ if (!label) {
594
+ throw new Error("no filter label is defined");
595
+ }
596
+
597
+ const id = element.id;
598
+ if (!id) {
599
+ reject(new Error("no filter id is defined"));
600
+ return;
601
+ }
602
+
603
+ //const visible = window.getComputedStyle(element).display !== "none";
604
+ const visible = getVisibilityFromSlotAttribute(element);
605
+ if (!visible) {
606
+ return;
607
+ }
608
+
609
+ let template = element.getAttribute("data-monster-template");
610
+ if (!template) {
611
+ template = "${id}=${value}";
612
+ }
613
+
614
+ const controlValue = getControlValuesFromLabel(element);
615
+ if (!controlValue) {
616
+ if (controlValue === "" && currentHash?.[this.id]?.[id]) {
617
+ delete currentHash[this.id][id];
618
+ }
619
+
620
+ return;
621
+ }
622
+
623
+ if (!isObject(currentHash[this.id])) {
624
+ currentHash[this.id] = {};
625
+ }
626
+ currentHash[this.id][id] = controlValue;
627
+
628
+ const mapping = {
629
+ id,
630
+ value: controlValue,
631
+ label,
632
+ };
633
+
634
+ const formatter = new Formatter(mapping, {
635
+ callbacks: {
636
+ range: (value, key) => {
637
+ return generateRangeComparisonExpression(value, key, {
638
+ urlEncode: true,
639
+ andOp: "AND",
640
+ orOp: "OR",
641
+ eqOp: "=",
642
+ gtOp: ">",
643
+ ltOp: "<",
644
+ });
645
+ },
646
+ "date-range": (value, key) => {
647
+ const query = parseDateInput(value, key);
648
+ if (!query || query === "false") {
649
+ return "";
650
+ }
651
+
652
+ // return query as url encoded
653
+ return encodeURIComponent(query);
654
+ },
655
+ },
656
+ });
657
+
658
+ let queryPart = formatter.format(template);
659
+ if (queryPart) {
660
+ if (isFunction(wrapCallback)) {
661
+ queryPart = wrapCallback(queryPart, mapping);
662
+ }
663
+ query.push(queryPart);
664
+ }
665
+ });
666
+
667
+ getGlobal().location.hash = createBracketedKeyValueHash(currentHash);
668
+ resolve(query);
669
+ });
670
+ }
671
+
672
+ /**
673
+ * @private
674
+ * @param {String} str
675
+ * @param {String} field
676
+ * @returns {String}
677
+ * @throws {Error} if no field is defined
678
+ */
679
+ function parseDateInput(str, field) {
680
+ if (!str) {
681
+ return "";
682
+ }
683
+
684
+ if (!field) {
685
+ throw new Error("no field is defined");
686
+ }
687
+
688
+ // Define the supported formats
689
+ //let formats = ['DD-MM-YYYY', 'MM-DD-YYYY', 'YYYY-MM-DD', 'YYYY/MM/DD', 'DD.MM.YYYY'];
690
+ const formats = ["YYYY-MM-DD"];
691
+ // Determine the current date format of the localization
692
+ const currentDateFormat = new Intl.DateTimeFormat()
693
+ .format(new Date())
694
+ .replace(/\d/g, "D");
695
+ // formats.push(currentDateFormat);
696
+
697
+ // Run through the supported formats and try to parse the date
698
+ for (let i = 0; i < formats.length; i++) {
699
+ const format = formats[i];
700
+ // Replace the corresponding placeholders in the format string with regular expressions
701
+
702
+ try {
703
+ const pattern = format
704
+ .replace("DD", "\\d{2}")
705
+ .replace("MM", "\\d{2}")
706
+ .replace("YYYY", "\\d{4}");
707
+ const rangePattern =
708
+ "(?<from>" + pattern + ")\\s*-\\s*(?<to>" + pattern + ")";
709
+
710
+ const rangeRegex = new RegExp("^" + rangePattern + "$", "g");
711
+
712
+ if (rangeRegex.test(str)) {
713
+ rangeRegex.lastIndex = 0;
714
+
715
+ const rangeResult = rangeRegex.exec(str);
716
+
717
+ if (!rangeResult) {
718
+ continue;
719
+ }
720
+
721
+ const from = rangeResult?.groups?.from;
722
+ const to = rangeResult?.groups?.to;
723
+
724
+ if (from && to) {
725
+ return (
726
+ "(" +
727
+ field +
728
+ ">='" +
729
+ from +
730
+ " 00:00:00' AND " +
731
+ field +
732
+ "<='" +
733
+ to +
734
+ " 23:59:59')"
735
+ );
736
+ }
737
+
738
+ if (from) {
739
+ return "(" + field + ">='" + from + " 00:00:00')";
740
+ } else if (to) {
741
+ return "(" + field + "<='" + to + "' 23:59:59')";
742
+ }
743
+
744
+ return "false";
745
+ }
746
+
747
+ const prefix = str.substring(0, 1) === "-";
748
+ const suffix = str.substring(str.length - 1, str.length) === "-";
749
+
750
+ if (prefix) {
751
+ str = str.substring(1, str.length);
752
+ } else if (suffix) {
753
+ str = str.substring(0, str.length - 1);
754
+ }
755
+
756
+ const regex = new RegExp("^(?<date>" + pattern + ")$", "g");
757
+ if (regex.test(str)) {
758
+ regex.lastIndex = 0;
759
+ const result = regex.exec(str);
760
+
761
+ if (!result) {
762
+ continue;
763
+ }
764
+
765
+ const date = result?.groups?.date;
766
+ if (date) {
767
+ if (prefix) {
768
+ return "(" + field + "<='" + date + " 23:59:59')";
769
+ } else if (suffix) {
770
+ return "(" + field + ">='" + date + "' 00:00:00')";
771
+ }
772
+ return (
773
+ "(" +
774
+ field +
775
+ ">='" +
776
+ date +
777
+ " 00:00:00' AND " +
778
+ field +
779
+ "<='" +
780
+ date +
781
+ " 23:59:59')"
782
+ );
783
+ } else {
784
+ return "false";
785
+ }
786
+ }
787
+ } catch (e) {}
788
+ }
789
+
790
+ return "false";
791
+ }
792
+
793
+ /**
794
+ * @private
795
+ * @param label
796
+ * @returns {null|Array|undefined|string}
797
+ */
798
+ function getControlValuesFromLabel(label) {
799
+ const foundControl = label.firstElementChild;
800
+
801
+ if (foundControl) {
802
+ if (foundControl.tagName === "INPUT") {
803
+ if (foundControl.type === "checkbox") {
804
+ const checkedControls = label.querySelectorAll(`${control}:checked`);
805
+ const values = [];
806
+
807
+ checkedControls.forEach((checkedControl) => {
808
+ values.push(checkedControl.value);
809
+ });
810
+
811
+ return values;
812
+ } else if (foundControl.type === "radio") {
813
+ const checkedControl = label.querySelector(`${control}:checked`);
814
+
815
+ if (checkedControl) {
816
+ return checkedControl.value;
817
+ } else {
818
+ return null;
819
+ }
820
+ } else {
821
+ return foundControl.value;
822
+ }
823
+ } else {
824
+ return foundControl.value;
825
+ }
826
+ }
827
+
828
+ return null;
829
+ }
830
+
831
+ /**
832
+ * @private
833
+ * @returns {string}
834
+ */
835
+ function getFilterConfigKey() {
836
+ return generateUniqueConfigKey("datatable", this?.id, "filter");
837
+ }
838
+
839
+ /**
840
+ * @private
841
+ * @returns {Promise<unknown>}
842
+ */
843
+ function initFromConfig() {;
844
+
845
+ const document = getDocument();
846
+ const host = document.querySelector("monster-host");
847
+
848
+ if (!(isInstance(host, Host) && this.id)) {
849
+ return Promise.resolve();
850
+ }
851
+
852
+ const configKey = getFilterConfigKey.call(this);
853
+
854
+ return new Promise((resolve, reject) => {
855
+ host
856
+ .getConfig(configKey)
857
+ .then((config) => {
858
+ if (config) {
859
+ this[settingsSymbol].setOptions(config);
860
+ }
861
+ resolve();
862
+ })
863
+ .catch((error) => {
864
+ if (error === undefined) {
865
+ resolve();
866
+ return;
867
+ }
868
+
869
+ addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
870
+ reject(error);
871
+ });
872
+ });
873
+ }
874
+
875
+ /**
876
+ * @private
877
+ */
878
+ function updateConfig() {;
879
+
880
+ const document = getDocument();
881
+ const host = document.querySelector("monster-host");
882
+ if (!(host && this.id)) {
883
+ return;
884
+ }
885
+ const configKey = getFilterConfigKey.call(this);
886
+
887
+ try {
888
+ host.setConfig(configKey, this[settingsSymbol].getOptions());
889
+ } catch (error) {
890
+ addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
891
+ }
892
+ }
893
+
894
+ /**
895
+ * @private
896
+ * @return {string}
897
+ */
898
+ function getTemplate() {
899
+ // language=HTML
900
+ return `
901
+ <div data-monster-role="control" part="control">
902
+ <div data-monster-role="layout">
903
+ <div data-monster-role="filter">
904
+ <slot></slot>
905
+ <slot name="hidden"></slot>
906
+ </div>
907
+ <div data-monster-role="select-and-search">
908
+ <monster-select class="stretched-control"
909
+ data-monster-selected-template="summary"
910
+ data-monster-option-type="checkbox"
911
+ data-monster-option-filter-mode="options"
912
+ data-monster-option-filter-position="popper"
913
+ data-monster-role="filter-select"></monster-select>
914
+ <monster-message-state-button data-monster-role="search-button" class="stretched-control"
915
+ data-monster-replace="path:labels.search">
916
+ </monster-message-state-button>
917
+ <monster-button data-monster-role="reset-button" class="stretched-control"
918
+ data-monster-replace="path:labels.reset">
919
+ </monster-button>
920
+ </div>
921
+
922
+ </div>
923
+ <input class="hidden" name="query" data-monster-role="query"
924
+ data-monster-attributes="value path:query">
925
+ </div>
926
+ `;
927
+ }
928
+
929
+ registerCustomElement(Filter);