@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,400 @@
1
+ /**
2
+ * Copyright 2023 schukai GmbH
3
+ * SPDX-License-Identifier: AGPL-3.0
4
+ */
5
+
6
+ import { addAttributeToken } from "../../../dom/attributes.mjs";
7
+ import { ATTRIBUTE_ERRORMESSAGE } from "../../../dom/constants.mjs";
8
+ import { Datasource, dataSourceSymbol } from "../datasource.mjs";
9
+ import { DatasourceStyleSheet } from "../stylesheet/datasource.mjs";
10
+ import { instanceSymbol } from "../../../constants.mjs";
11
+ import {
12
+ assembleMethodSymbol,
13
+ registerCustomElement,
14
+ } from "../../../dom/customelement.mjs";
15
+ import { RestAPI } from "../../../data/datasource/server/restapi.mjs";
16
+ import { Formatter } from "../../../text/formatter.mjs";
17
+ import { clone } from "../../../util/clone.mjs";
18
+ import { validateBoolean } from "../../../types/validate.mjs";
19
+ import { findElementWithIdUpwards } from "../../../dom/util.mjs";
20
+ import { Observer } from "../../../types/observer.mjs";
21
+ import { Pathfinder } from "../../../data/pathfinder.mjs";
22
+ import { fireCustomEvent } from "../../../dom/events.mjs";
23
+
24
+ export { Rest };
25
+
26
+ /**
27
+ * @private
28
+ * @type {symbol}
29
+ */
30
+ const intersectionObserverHandlerSymbol = Symbol("intersectionObserverHandler");
31
+
32
+ /**
33
+ * @private
34
+ * @type {symbol}
35
+ */
36
+ const intersectionObserverObserverSymbol = Symbol(
37
+ "intersectionObserverObserver",
38
+ );
39
+
40
+ /**
41
+ * @private
42
+ * @type {symbol}
43
+ */
44
+ const filterObserverSymbol = Symbol("filterObserver");
45
+
46
+ /**
47
+ * The Datasource component is a basic class for the datatable component.
48
+ *
49
+ * <img src="./images/rest.png">
50
+ *
51
+ * Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library
52
+ *
53
+ * @startuml rest.png
54
+ * skinparam monochrome true
55
+ * skinparam shadowing false
56
+ * HTMLElement <|-- CustomElement
57
+ * CustomElement <|-- Datasource
58
+ * Datasource <|-- Rest
59
+ * @enduml
60
+ *
61
+ * @copyright schukai GmbH
62
+ * @memberOf Monster.Components.Datatable.Datasource
63
+ * @summary A rest api datasource
64
+ */
65
+ class Rest extends Datasource {
66
+ /**
67
+ * the constructor of the class
68
+ */
69
+ constructor() {
70
+ super();
71
+ this[dataSourceSymbol] = new RestAPI();
72
+ }
73
+
74
+ /**
75
+ * This method is called by the `instanceof` operator.
76
+ * @returns {symbol}
77
+ */
78
+ static get [instanceSymbol]() {
79
+ return Symbol.for("@schukai/monster/components/datasource/rest@@instance");
80
+ }
81
+
82
+ /**
83
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
84
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
85
+ *
86
+ * The individual configuration values can be found in the table.
87
+ *
88
+ * @property {Object} templates Template definitions
89
+ * @property {string} templates.main Main template
90
+ * @property {Object} features Feature definitions
91
+ * @property {boolean} features.autoInit If true, the component is initialized automatically
92
+ * @property {Object} read Read configuration
93
+ * @property {string} read.url The url of the rest api
94
+ * @property {string} read.method The method of the rest api
95
+ * @property {Object} read.parameters The parameters of the rest api
96
+ * @property {Object} read.parameters.filter The filter of the rest api
97
+ * @property {Object} read.parameters.orderBy The order by of the rest api
98
+ * @property {Object} read.parameters.page The page of the rest api
99
+ * @property {Object} write Write configuration
100
+ */
101
+ get defaults() {
102
+ const restOptions = new RestAPI().defaults;
103
+
104
+ restOptions.read.parameters = {
105
+ filter: undefined,
106
+ oderBy: undefined,
107
+ page: "1",
108
+ };
109
+
110
+ return Object.assign({}, super.defaults, restOptions, {
111
+ templates: {
112
+ main: getTemplate(),
113
+ },
114
+
115
+ features: {
116
+ autoInit: true,
117
+ filter: false,
118
+ },
119
+
120
+ autoInit: {
121
+ intersectionObserver: false,
122
+ oneTime: true,
123
+ },
124
+
125
+ filter: {
126
+ id: undefined,
127
+ },
128
+
129
+ response: {
130
+ errorMessagePath: "sys.message",
131
+ },
132
+ });
133
+ }
134
+
135
+ /**
136
+ *
137
+ * @param {string} page
138
+ * @param {string} query
139
+ * @param {string} orderBy
140
+ * @returns {Monster.Components.Datatable.Datasource.Rest}
141
+ */
142
+ setParameters({ page, query, orderBy }) {;
143
+ const parameters = this.getOption("read.parameters");
144
+ if (query !== undefined) {
145
+ parameters.query = `${query}`;
146
+ parameters.page = "1";
147
+ }
148
+
149
+ // after a query the page is set to 1, so if the page is not set, it is set to 1
150
+ if (page !== undefined) parameters.page = `${page}`;
151
+ if (orderBy !== undefined) parameters.order = `${orderBy}`;
152
+ this.setOption("read.parameters", parameters);
153
+ return this;
154
+ }
155
+
156
+ /**
157
+ *
158
+ * @return {Monster.Components.Form.Form}
159
+ */
160
+ [assembleMethodSymbol]() {;
161
+ super[assembleMethodSymbol]();
162
+
163
+ initEventHandler.call(this);
164
+ initAutoInit.call(this);
165
+ }
166
+
167
+ /**
168
+ * @deprecated 2023-06-25
169
+ * @returns {Promise<never>|*}
170
+ */
171
+ reload() {
172
+ return this.fetch();
173
+ }
174
+
175
+ /**
176
+ * Fetches the data from the rest api
177
+ * @returns {Promise<never>|*}
178
+ */
179
+ fetch() {;
180
+
181
+ const opt = clone(this.getOption("read"));
182
+ this[dataSourceSymbol].setOption("read", opt);
183
+
184
+ let url = this.getOption("read.url");
185
+ const formatter = new Formatter(this.getOption("read.parameters"));
186
+
187
+ if (!url) {
188
+ return Promise.reject(new Error("No url defined"));
189
+ }
190
+
191
+ url = formatter.format(url);
192
+
193
+ this[dataSourceSymbol].setOption("read.url", url);
194
+ return this[dataSourceSymbol].read();
195
+ }
196
+
197
+ /**
198
+ *
199
+ * @return {CSSStyleSheet[]}
200
+ */
201
+ static getCSSStyleSheet() {
202
+ return [DatasourceStyleSheet];
203
+ }
204
+
205
+ /**
206
+ * @private
207
+ * @return {string}
208
+ */
209
+ static getTag() {
210
+ return "monster-datasource-rest";
211
+ }
212
+
213
+ /**
214
+ * This method activates the intersection observer manually.
215
+ * For this purpose, the option `autoInit.intersectionObserver` must be set to `false`.
216
+ *
217
+ * @returns {Monster.Components.Datatable.Datasource.Rest}
218
+ */
219
+ initIntersectionObserver() {
220
+ initIntersectionObserver.call(this);
221
+ return this;
222
+ }
223
+
224
+ /**
225
+ * @private
226
+ */
227
+ connectedCallback() {
228
+ super.connectedCallback();;
229
+
230
+ setTimeout(() => {
231
+ if (this.getOption("features.filter", false) === true) {
232
+ initFilter.call(this);
233
+ }
234
+ }, 0);
235
+ }
236
+
237
+ /**
238
+ * @private
239
+ */
240
+ disconnectedCallback() {
241
+ super.disconnectedCallback();;
242
+ removeFilter.call(this);
243
+ }
244
+ }
245
+
246
+ /**
247
+ * @private
248
+ */
249
+ function removeFilter() {;
250
+ const filterID = this.getOption("filter.id", undefined);
251
+ if (!filterID) return;
252
+
253
+ const filterControl = findElementWithIdUpwards(this, filterID);
254
+
255
+ if (filterControl && this[filterObserverSymbol]) {
256
+ filterControl?.detachObserver(this[filterObserverSymbol]);
257
+ }
258
+ }
259
+
260
+ /**
261
+ * @private
262
+ */
263
+ function initFilter() {;
264
+ const filterID = this.getOption("filter.id", undefined);
265
+
266
+ if (!filterID)
267
+ throw new Error("filter feature is enabled but no filter id is defined");
268
+
269
+ const filterControl = findElementWithIdUpwards(this, filterID);
270
+ if (!filterControl)
271
+ throw new Error(
272
+ "filter feature is enabled but no filter control with id " +
273
+ filterID +
274
+ " is found",
275
+ );
276
+
277
+ this[filterObserverSymbol] = new Observer(() => {
278
+ const query = filterControl.getOption("query", undefined);
279
+ this.setParameters({ query: query });
280
+ this
281
+ .fetch()
282
+ .then(() => {
283
+ this.dispatchEvent(new CustomEvent("reload", { bubbles: true }));
284
+ filterControl?.showSuccess();
285
+ })
286
+ .catch((e) => {
287
+ this.dispatchEvent(
288
+ new CustomEvent("error", { bubbles: true, detail: e }),
289
+ );
290
+
291
+ const response = e?.getResponse();
292
+ if (response && response.status === 400) {
293
+ response
294
+ .json()
295
+ .then((json) => {
296
+ const path = new Pathfinder(json);
297
+ const error = path.getVia(
298
+ this.getOption("response.errorMessagePath"),
299
+ );
300
+ if (error) {
301
+ filterControl?.showFailureMessage(error);
302
+ return;
303
+ }
304
+
305
+ filterControl?.showFailureMessage(e.message);
306
+ })
307
+ .catch((e) => {
308
+ filterControl?.showFailureMessage(e.message);
309
+ });
310
+ } else {
311
+ filterControl?.showFailureMessage(e.message);
312
+ }
313
+ });
314
+ });
315
+
316
+ filterControl.attachObserver(this[filterObserverSymbol]);
317
+ }
318
+
319
+ /**
320
+ * @private
321
+ */
322
+ function initAutoInit() {;
323
+
324
+ const autoInit = this.getOption("features.autoInit");
325
+ validateBoolean(autoInit);
326
+
327
+ if (autoInit !== true) return;
328
+
329
+ if (this.getOption("autoInit.intersectionObserver") === true) {
330
+ initIntersectionObserver.call(this);
331
+ return;
332
+ }
333
+
334
+ setTimeout(() => {
335
+ this
336
+ .fetch()
337
+ .then(() => {
338
+ fireCustomEvent(this, "monster-datasource-fetched", {
339
+ datasource: this,
340
+ });
341
+ })
342
+ .catch((error) => {
343
+ fireCustomEvent(this, "monster-datasource-error", {
344
+ error: error,
345
+ });
346
+
347
+ addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
348
+ });
349
+ }, 0);
350
+ }
351
+
352
+ function initEventHandler() {;
353
+
354
+ this[intersectionObserverHandlerSymbol] = (entries) => {
355
+ entries.forEach((entry) => {
356
+ if (entry.isIntersecting) {
357
+ if (entry.intersectionRatio > 0) {
358
+ this.fetch();
359
+ }
360
+
361
+ // only load once
362
+ if (
363
+ this.getOption("autoInit.oneTime") === true &&
364
+ this[intersectionObserverObserverSymbol] !== undefined
365
+ ) {
366
+ this[intersectionObserverObserverSymbol].unobserve(this);
367
+ }
368
+ }
369
+ });
370
+ };
371
+ }
372
+
373
+ function initIntersectionObserver() {;
374
+
375
+ this.classList.add("intersection-observer");
376
+
377
+ const options = {
378
+ root: null,
379
+ rootMargin: "0px",
380
+ threshold: 0.1,
381
+ };
382
+
383
+ this[intersectionObserverObserverSymbol] = new IntersectionObserver(
384
+ this[intersectionObserverHandlerSymbol],
385
+ options,
386
+ );
387
+ this[intersectionObserverObserverSymbol].observe(this);
388
+ }
389
+
390
+ /**
391
+ * @private
392
+ * @return {string}
393
+ */
394
+ function getTemplate() {
395
+ // language=HTML
396
+ return `
397
+ <slot></slot>`;
398
+ }
399
+
400
+ registerCustomElement(Rest);
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Copyright 2023 schukai GmbH
3
+ * SPDX-License-Identifier: AGPL-3.0
4
+ */
5
+
6
+ import {
7
+ CustomElement,
8
+ assembleMethodSymbol,
9
+ } from "../../dom/customelement.mjs";
10
+ import { Datasource as DatasourceBase } from "../../data/datasource.mjs";
11
+ import { instanceSymbol } from "../../constants.mjs";
12
+
13
+ export { Datasource, dataSourceSymbol };
14
+
15
+ /**
16
+ * @private
17
+ * @type {symbol}
18
+ */
19
+ const dataSourceSymbol = Symbol.for(
20
+ "@schukai/monster/components/datasource@@datasource",
21
+ );
22
+
23
+ /**
24
+ * The Datasource component is a basic class for the datatable component.
25
+ *
26
+ * <img src="./images/datasource.png">
27
+ *
28
+ * Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library
29
+ *
30
+ * @startuml datasource.png
31
+ * skinparam monochrome true
32
+ * skinparam shadowing false
33
+ * HTMLElement <|-- CustomElement
34
+ * CustomElement <|-- Datasource
35
+ * @enduml
36
+ *
37
+ * @copyright schukai GmbH
38
+ * @memberOf Monster.Components.Datatable
39
+ * @summary A abstract datasource
40
+ */
41
+ class Datasource extends CustomElement {
42
+ /**
43
+ * the constructor of the class
44
+ */
45
+ constructor() {
46
+ super();
47
+ this[dataSourceSymbol] = new DatasourceBase();
48
+ }
49
+
50
+ /**
51
+ * This method is called by the `instanceof` operator.
52
+ * @returns {symbol}
53
+ */
54
+ static get [instanceSymbol]() {
55
+ return Symbol.for("@schukai/monster/components/datasource@@instance");
56
+ }
57
+
58
+ /**
59
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
60
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
61
+ *
62
+ * The individual configuration values can be found in the table.
63
+ *
64
+ * @property {Object} templates Template definitions
65
+ * @property {string} templates.main Main template
66
+ */
67
+ get defaults() {
68
+ return Object.assign({}, super.defaults, {});
69
+ }
70
+
71
+ /**
72
+ *
73
+ * @return {Monster.Components.Form.Form}
74
+ */
75
+ [assembleMethodSymbol]() {;
76
+ super[assembleMethodSymbol]();
77
+ }
78
+
79
+ /**
80
+ * Get the data, without proxy
81
+ * @returns {Object}
82
+ */
83
+ get data() {
84
+ return this[dataSourceSymbol].get();
85
+ }
86
+
87
+ /**
88
+ * set the data
89
+ * @param {Object} data
90
+ */
91
+ set data(data) {
92
+ this[dataSourceSymbol].set(data);
93
+ }
94
+
95
+ /**
96
+ * Get the datasource
97
+ * @returns {Monster.Data.Datasource}
98
+ */
99
+ get datasource() {
100
+ return this[dataSourceSymbol];
101
+ }
102
+ }