@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,304 @@
1
+ /**
2
+ * Copyright 2023 schukai GmbH
3
+ * SPDX-License-Identifier: AGPL-3.0
4
+ */
5
+
6
+ import {
7
+ assembleMethodSymbol,
8
+ CustomElement,
9
+ registerCustomElement,
10
+ } from "../../dom/customelement.mjs";
11
+ import { ConfigManagerStyleSheet } from "./stylesheet/config-manager.mjs";
12
+ import { getWindow } from "../../dom/util.mjs";
13
+ import { instanceSymbol } from "../../constants.mjs";
14
+
15
+ export { ConfigManager };
16
+
17
+ /**
18
+ * @private
19
+ * @type {symbol}
20
+ */
21
+ const indexDBInstanceSymbol = Symbol("indexDBInstance");
22
+
23
+ /**
24
+ * @private
25
+ * @type {symbol}
26
+ */
27
+ const initializedPromiseSymbol = Symbol("initializedPromiseSymbol");
28
+
29
+ /**
30
+ * @private
31
+ * @type {string}
32
+ */
33
+ const MODE_READONLY = "readonly";
34
+
35
+ /**
36
+ * @private
37
+ * @type {string}
38
+ */
39
+ const MODE_READ_WRITE = "readwrite";
40
+
41
+ /**
42
+ * The Config Manager component is used to encapsulate the configuration of the application.
43
+ *
44
+ * <img src="./images/config-manager.png">
45
+ *
46
+ * Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library
47
+ *
48
+ * You can create this control either by specifying the HTML tag <monster-host />` directly in the HTML or using
49
+ * Javascript via the `document.createElement('monster-host');` method.
50
+ *
51
+ * ```html
52
+ * <monster-config-manager></monster-config-manager>
53
+ * ```
54
+ *
55
+ * Or you can create this CustomControl directly in Javascript:
56
+ *
57
+ * ```js
58
+ * import '@schukai/component-state/source/config-manager.mjs';
59
+ * document.createElement('monster-config-manager');
60
+ * ```
61
+ *
62
+ * The Body should have a class "hidden" to ensure that the styles are applied correctly.
63
+ *
64
+ * ```css
65
+ * body.hidden {
66
+ * visibility: hidden;
67
+ * }
68
+ * ```
69
+ *
70
+ * @startuml config-manager.png
71
+ * skinparam monochrome true
72
+ * skinparam shadowing false
73
+ * HTMLElement <|-- CustomElement
74
+ * CustomElement <|-- ConfigManager
75
+ * @enduml
76
+ *
77
+ * @copyright schukai GmbH
78
+ * @memberOf Monster.Components.Host
79
+ * @summary A config manager component
80
+ */
81
+ class ConfigManager extends CustomElement {
82
+ /**
83
+ * This method is called by the `instanceof` operator.
84
+ * @returns {symbol}
85
+ */
86
+ static get [instanceSymbol]() {
87
+ return Symbol.for("@schukai/component-host/config-manager@@instance");
88
+ }
89
+
90
+ constructor() {
91
+ super();
92
+
93
+ /**
94
+ * @private
95
+ * @type {symbol}
96
+ */
97
+ this[initializedPromiseSymbol] = [];
98
+ this[indexDBInstanceSymbol] = null;
99
+ this[initializedPromiseSymbol].push(openDatabase.call(this));
100
+ }
101
+
102
+ /**
103
+ * @returns {Promise}
104
+ */
105
+ ready() {
106
+ return Promise.all(this[initializedPromiseSymbol]);
107
+ }
108
+
109
+ /**
110
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
111
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
112
+ *
113
+ * The individual configuration values can be found in the table.
114
+ *
115
+ * @property {Object} templates Template definitions
116
+ * @property {string} templates.main Main template
117
+ */
118
+ get defaults() {
119
+ return Object.assign({}, super.defaults, {
120
+ templates: {
121
+ main: getTemplate(),
122
+ },
123
+ indexDB: {
124
+ name: "monster",
125
+ version: 2,
126
+ objectStore: {
127
+ name: "config",
128
+ keyPath: "key",
129
+ },
130
+ },
131
+ });
132
+ }
133
+
134
+ /**
135
+ * @param {string} key
136
+ * @returns {Promise<unknown>}
137
+ */
138
+ getConfig(key) {;
139
+
140
+ return this.ready().then(() => {
141
+ return getBlob.call(this, key);
142
+ });
143
+ }
144
+
145
+ /**
146
+ * @param {string} key
147
+ * @param {*} value
148
+ * @returns {Promise<unknown>}
149
+ */
150
+ setConfig(key, value) {;
151
+ return this.ready().then(() => {
152
+ return setBlob.call(this, key, value);
153
+ });
154
+ }
155
+
156
+ /**
157
+ *
158
+ * @return {string}
159
+ */
160
+ static getTag() {
161
+ return "monster-config-manager";
162
+ }
163
+
164
+ /**
165
+ * @return {CSSStyleSheet[]}
166
+ */
167
+ static getCSSStyleSheet() {
168
+ return [ConfigManagerStyleSheet];
169
+ }
170
+
171
+ /**
172
+ *
173
+ * @return {Monster.Components.Host.Host}
174
+ */
175
+ [assembleMethodSymbol]() {
176
+ super[assembleMethodSymbol]();
177
+ }
178
+ }
179
+
180
+ function openDatabase() {;
181
+ const window = getWindow();
182
+
183
+ const name = this.getOption("indexDB.name");
184
+ const version = this.getOption("indexDB.version");
185
+ const storageName = this.getOption("indexDB.objectStore.name");
186
+ const KeyPath = this.getOption("indexDB.objectStore.keyPath");
187
+
188
+ if (!name || !version) {
189
+ throw new Error("The database name and version must be set.");
190
+ }
191
+
192
+ const request = window.indexedDB.open(name, version);
193
+
194
+ return new Promise((resolve, reject) => {
195
+ request.onerror = (event) => {
196
+ console.error("Error opening database", event);
197
+ reject(request.error);
198
+ };
199
+
200
+ request.onsuccess = (event) => {
201
+ this[indexDBInstanceSymbol] = event?.target?.result;
202
+ resolve(request.result);
203
+ };
204
+
205
+ request.onupgradeneeded = (event) => {
206
+ const db = event.target.result;
207
+
208
+ let objectStore;
209
+ if (!db.objectStoreNames.contains(storageName)) {
210
+ objectStore = db.createObjectStore(storageName, { keyPath: KeyPath });
211
+ }
212
+
213
+ objectStore.transaction.oncomplete = (event) => {
214
+ console.log("Database upgrade complete");
215
+ resolve();
216
+ };
217
+ };
218
+ });
219
+ }
220
+
221
+ /**
222
+ * @param {string} mode either "readonly" or "readwrite"
223
+ */
224
+ function getObjectStore(mode) {;
225
+ const storageName = this.getOption("indexDB.objectStore.name");
226
+
227
+ if (!this[indexDBInstanceSymbol]) {
228
+ throw new Error("The database is not open.");
229
+ }
230
+
231
+ // @see https://developer.mozilla.org/en-US/docs/Web/API/IDBDatabase/transaction
232
+ // transaction(storeNames, mode, options)
233
+ const tx = this[indexDBInstanceSymbol].transaction(storageName, mode);
234
+ return tx.objectStore(storageName);
235
+ }
236
+
237
+ /**
238
+ * @param {string} key
239
+ * @returns {Promise<unknown>}
240
+ */
241
+ function clearObjectStore() {;
242
+
243
+ const store = getObjectStore.call(this, "readwrite");
244
+
245
+ return new Promise((resolve, reject) => {
246
+ const req = store.clear();
247
+ req.onsuccess = function (evt) {
248
+ console.log("clearObjectStore completed");
249
+ resolve();
250
+ };
251
+ req.onerror = function (evt) {
252
+ console.error("clearObjectStore:", evt.target.errorCode);
253
+ reject(evt.target.errorCode);
254
+ };
255
+ });
256
+ }
257
+
258
+ function getBlob(key) {;
259
+ const store = getObjectStore.call(this, MODE_READONLY);
260
+
261
+ const req = store.get(key);
262
+
263
+ return new Promise((resolve, reject) => {
264
+ req.onsuccess = function (evt) {
265
+ const value = evt.target.result;
266
+ if (value) {
267
+ resolve(value.blob);
268
+ return;
269
+ }
270
+ reject();
271
+ };
272
+ });
273
+ }
274
+
275
+ function setBlob(key, blob) {;
276
+ const store = getObjectStore.call(this, MODE_READ_WRITE);
277
+
278
+ const KeyPath = this.getOption("indexDB.objectStore.keyPath");
279
+ const obj = {};
280
+ obj[KeyPath] = key;
281
+ obj.blob = blob;
282
+ const req = store.put(obj);
283
+
284
+ return new Promise((resolve, reject) => {
285
+ req.onsuccess = function (evt) {
286
+ resolve();
287
+ };
288
+
289
+ req.onerror = function (evt) {
290
+ console.error("setBlob:", evt.target.errorCode);
291
+ reject(evt.target.errorCode);
292
+ };
293
+ });
294
+ }
295
+
296
+ function getTemplate() {
297
+ // language=HTML
298
+ return `
299
+ <div data-monster-role="control" part="control">
300
+ <slot></slot>
301
+ </div>`;
302
+ }
303
+
304
+ registerCustomElement(ConfigManager);
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright schukai GmbH and contributors 2022. All Rights Reserved.
3
+ * Node module: @schukai/component-form
4
+ * This file is licensed under the AGPLv3 License.
5
+ * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
+ */
7
+
8
+ import { ATTRIBUTE_PREFIX } from "../../dom/constants.mjs";
9
+
10
+ /**
11
+ * This attribute `data-monster-button-label` can be used to pass labels.
12
+ *
13
+ * @memberOf Monster.Components.Host
14
+ * @type {string}
15
+ */
16
+ const ATTRIBUTE_BUTTON_LABEL = `${ATTRIBUTE_PREFIX}button-label`;
17
+
18
+ export { ATTRIBUTE_BUTTON_LABEL };
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Copyright 2023 schukai GmbH
3
+ * SPDX-License-Identifier: AGPL-3.0
4
+ */
5
+
6
+ import {
7
+ assembleMethodSymbol,
8
+ registerCustomElement,
9
+ } from "../../dom/customelement.mjs";
10
+ import { Host } from "./host.mjs";
11
+ import { DetailsStyleSheet } from "./stylesheet/details.mjs";
12
+ import { ATTRIBUTE_BUTTON_LABEL } from "./constants.mjs";
13
+ import { isString } from "../../types/is.mjs";
14
+ import { generateUniqueConfigKey } from "./util.mjs";
15
+ import { Collapse, nameSymbol } from "./collapse.mjs";
16
+ import { instanceSymbol } from "../../constants.mjs";
17
+
18
+ export { Details };
19
+
20
+ /**
21
+ * @private
22
+ * @type {symbol}
23
+ */
24
+ const buttonElementSymbol = Symbol("buttonElement");
25
+
26
+ /**
27
+ * @private
28
+ * @type {symbol}
29
+ */
30
+ const buttonEventHandlerSymbol = Symbol("buttonEventHandler");
31
+
32
+ /**
33
+ * The Details component is used to show a details.
34
+ *
35
+ * <img src="./images/details.png">
36
+ *
37
+ * Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library
38
+ *
39
+ * You can create this control either by specifying the HTML tag <monster-details />` directly in the HTML or using
40
+ * Javascript via the `document.createElement('monster-details');` method.
41
+ *
42
+ * ```html
43
+ * <monster-details></monster-details>
44
+ * ```
45
+ *
46
+ * Or you can create this CustomControl directly in Javascript:
47
+ *
48
+ * ```js
49
+ * import '@schukai/component-state/source/details.mjs';
50
+ * document.createElement('monster-details');
51
+ * ```
52
+ *
53
+ * The Body should have a class "hidden" to ensure that the styles are applied correctly.
54
+ *
55
+ * ```css
56
+ * body.hidden {
57
+ * visibility: hidden;
58
+ * }
59
+ * ```
60
+ *
61
+ * @startuml details.png
62
+ * skinparam monochrome true
63
+ * skinparam shadowing false
64
+ * HTMLElement <|-- CustomElement
65
+ * CustomElement <|-- Collapse
66
+ * Collapse <|-- Details
67
+ * @enduml
68
+ *
69
+ * @copyright schukai GmbH
70
+ * @memberOf Monster.Components.Host
71
+ * @summary A simple details component
72
+ * @fires Monster.Components.Host.Details.event:monster-details-before-open
73
+ * @fires Monster.Components.Host.Details.event:monster-details-open
74
+ * @fires Monster.Components.Host.Details.event:monster-details-before-close
75
+ * @fires Monster.Components.Host.Details.event:monster-details-closed
76
+ */
77
+ class Details extends Collapse {
78
+ /**
79
+ * This method is called by the `instanceof` operator.
80
+ * @returns {symbol}
81
+ */
82
+ static get [instanceSymbol]() {
83
+ return Symbol.for("@schukai/component-host/details@@instance");
84
+ }
85
+
86
+ /**
87
+ *
88
+ */
89
+ constructor() {
90
+ super();
91
+ // the name is only used for the host config and the event name
92
+ this[nameSymbol] = "details";
93
+ }
94
+
95
+ /**
96
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
97
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
98
+ *
99
+ * The individual configuration values can be found in the table.
100
+ *
101
+ * @property {Object} templates Template definitions
102
+ * @property {string} templates.main Main template
103
+ * @property {Object} classes CSS classes
104
+ * @property {string} classes.button CSS class for the button
105
+ * @property {Object} button Button configuration
106
+ * @property {string} button.label Button label
107
+ * @property {Object} features Feature configuration
108
+ * @property {boolean} features.accordion Enable accordion mode
109
+ * @property {boolean} features.persistState Persist the state in the host configuration
110
+ */
111
+ get defaults() {
112
+ return Object.assign({}, super.defaults, {
113
+ templates: {
114
+ main: getTemplate(),
115
+ },
116
+ labels: {
117
+ button: "Details",
118
+ },
119
+ });
120
+ }
121
+
122
+ /**
123
+ *
124
+ * @returns {Monster.Components.Host.Details}
125
+ */
126
+ [assembleMethodSymbol]() {
127
+ super[assembleMethodSymbol]();
128
+
129
+ initButtonLabel.call(this);
130
+ initControlReferences.call(this);
131
+ initEventHandler.call(this);
132
+ }
133
+
134
+ connectedCallback() {;
135
+ super.connectedCallback();
136
+
137
+ const containDocument = this.shadowRoot;
138
+
139
+ if (containDocument !== null) {
140
+ const previousElement = this.previousElementSibling;
141
+ if (previousElement && previousElement.tagName === "MONSTER-DETAILS") {
142
+ this[buttonElementSymbol].style.borderTop = "0";
143
+ }
144
+ }
145
+ }
146
+
147
+ /**
148
+ *
149
+ * @return {string}
150
+ */
151
+ static getTag() {
152
+ return "monster-details";
153
+ }
154
+
155
+ /**
156
+ * @return {Array<CSSStyleSheet>}
157
+ */
158
+ static getCSSStyleSheet() {
159
+ const css = super.getCSSStyleSheet();
160
+ css.push(DetailsStyleSheet);
161
+ return css;
162
+ }
163
+ }
164
+
165
+ /**
166
+ * @private
167
+ * @return {Select}
168
+ * @throws {Error} no shadow-root is defined
169
+ */
170
+ function initControlReferences() {;
171
+
172
+ if (!this.shadowRoot) {
173
+ throw new Error("no shadow-root is defined");
174
+ }
175
+
176
+ this[buttonElementSymbol] = this.shadowRoot.querySelector(
177
+ "[data-monster-role=button]",
178
+ );
179
+ }
180
+
181
+ /**
182
+ * @private
183
+ */
184
+ function initEventHandler() {;
185
+
186
+ if (!this.shadowRoot) {
187
+ throw new Error("no shadow-root is defined");
188
+ }
189
+
190
+ this[buttonEventHandlerSymbol] = (event) => {
191
+ this.toggle();
192
+ };
193
+
194
+ this[buttonElementSymbol].addEventListener(
195
+ "click",
196
+ this[buttonEventHandlerSymbol],
197
+ );
198
+
199
+ return this;
200
+ }
201
+
202
+ /**
203
+ * @private
204
+ * @return {string}
205
+ */
206
+ function initButtonLabel() {;
207
+
208
+ let label;
209
+ const setLabel = false;
210
+ if (this.hasAttribute(ATTRIBUTE_BUTTON_LABEL)) {
211
+ label = this.getAttribute(ATTRIBUTE_BUTTON_LABEL);
212
+ } else {
213
+ label = this.innerText;
214
+ }
215
+
216
+ if (!isString(label)) {
217
+ label = "";
218
+ }
219
+
220
+ label = label.trim();
221
+
222
+ if (label === "") {
223
+ label = this.getOption("labels.button", "Details");
224
+ }
225
+
226
+ if (label.length > 100) {
227
+ label = `${label.substring(0, 99)}…`;
228
+ }
229
+
230
+ this.setAttribute(ATTRIBUTE_BUTTON_LABEL, label);
231
+ this.setOption("labels.button", label);
232
+
233
+ return label;
234
+ }
235
+
236
+ /**
237
+ * @private
238
+ * @returns {string}
239
+ */
240
+ function getConfigKey() {;
241
+ return generateUniqueConfigKey("details", this.id, "state");
242
+ }
243
+
244
+ /**
245
+ * @private
246
+ * @return {string}
247
+ */
248
+ function getTemplate() {
249
+ // language=HTML
250
+ return `
251
+ <div data-monster-role="control" part="control" class="overflow-hidden">
252
+ <div data-monster-role="summary" part="summary">
253
+ <button part="button" data-monster-attributes="class path:classes.button"
254
+ data-monster-role="button"
255
+ data-monster-replace="path:labels.button | default:click me">click me
256
+ </button>
257
+ </div>
258
+ <div data-monster-role="detail">
259
+ <div data-monster-attributes="class path:classes.container" part="container"
260
+ data-monster-role="container">
261
+ <slot></slot>
262
+ </div>
263
+ <div class="deco-line" data-monster-role="deco"></div>
264
+ </div>
265
+ </div>`;
266
+ }
267
+
268
+ registerCustomElement(Details);
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Copyright schukai GmbH and contributors 2022. All Rights Reserved.
3
+ * Node module: @schukai/component-form
4
+ * This file is licensed under the AGPLv3 License.
5
+ * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
+ */
7
+
8
+ /**
9
+ * This event is fired before the overlay is opened. The event is fired on the overlay opener element.
10
+ *
11
+ * @memberOf Monster.Components.Host.Overlay
12
+ * @event event:monster-overlay-before-open
13
+ * @type {object}
14
+ */
15
+
16
+ /**
17
+ * This event is fired after the overlay is opened. The event is fired on the overlay opener element.
18
+ *
19
+ * @memberOf Monster.Components.Host.Overlay
20
+ * @event event:monster-overlay-opened
21
+ * @type {object}
22
+ */
23
+
24
+ /**
25
+ * This event is fired before the overlay is closed. The event is fired on the overlay opener element.
26
+ *
27
+ * @memberOf Monster.Components.Host.Overlay
28
+ * @event event:monster-overlay-before-close
29
+ * @type {object}
30
+ */
31
+
32
+ /**
33
+ * This event is fired after the overlay is closed. The event is fired on the overlay opener element.
34
+ *
35
+ * @memberOf Monster.Components.Host.Overlay
36
+ * @event event:monster-overlay-closed
37
+ * @type {object}
38
+ */
39
+
40
+ /**
41
+ * This event is fired during the host connection process. The event is fired on the host element.
42
+ *
43
+ * @memberOf Monster.Components.Host.Host
44
+ * @event event:monster-host-connected
45
+ * @type {object}
46
+ */
47
+
48
+ /**
49
+ * This event is fired during the host disconnection process. The event is fired on the host element.
50
+ *
51
+ * @memberOf Monster.Components.Host.Host
52
+ * @event event:monster-host-disconnected
53
+ * @type {object}
54
+ */
55
+
56
+ /**
57
+ * This event is fired during the Details component opening process.
58
+ *
59
+ * @memberOf Monster.Components.Host.Details
60
+ * @fires event:monster-details-before-open
61
+ * @type {object}
62
+ */
63
+
64
+ /**
65
+ * This event is fired during the Details component opening process.
66
+ *
67
+ * @memberOf Monster.Components.Host.Details
68
+ * @fires event:monster-details-open
69
+ * @type {object}
70
+ */
71
+
72
+ /**
73
+ * This event is fired during the Details component closing process.
74
+ *
75
+ * @memberOf Monster.Components.Host.Details
76
+ * @fires event:monster-details-before-close
77
+ * @type {object}
78
+ */
79
+
80
+ /**
81
+ * This event is fired during the Details component closing process.
82
+ *
83
+ * @memberOf Monster.Components.Host.Details
84
+ * @fires event:monster-details-closed
85
+ * @type {object}
86
+ */
87
+ /**
88
+ * This event is fired during the Details component closing process.
89
+ *
90
+ * @memberOf Monster.Components.Host.Details
91
+ * @fires Monster.Components.Host.Details.event:monster-details-adjust-height
92
+ * @type {object}
93
+ */
94
+
95
+ /**
96
+ * This event is fired during the Details component opening process.
97
+ *
98
+ * @memberOf Monster.Components.Host.Collapse
99
+ * @fires event:monster-collapse-before-open
100
+ * @type {object}
101
+ */
102
+
103
+ /**
104
+ * This event is fired during the Details component opening process.
105
+ *
106
+ * @memberOf Monster.Components.Host.Collapse
107
+ * @fires event:monster-collapse-open
108
+ * @type {object}
109
+ */
110
+
111
+ /**
112
+ * This event is fired during the Details component closing process.
113
+ *
114
+ * @memberOf Monster.Components.Host.Collapse
115
+ * @fires event:monster-collapse-before-close
116
+ * @type {object}
117
+ */
118
+ /**
119
+ * This event is fired during the Details component closing process.
120
+ *
121
+ * @memberOf Monster.Components.Host.Collapse
122
+ * @fires event:monster-collapse-closed
123
+ * @type {object}
124
+ */
125
+ /**
126
+ * This event is fired during the Details component closing process.
127
+ *
128
+ * @memberOf Monster.Components.Host.Collapse
129
+ * @fires Monster.Components.Host.Collapse.event:monster-collapse-adjust-height
130
+ * @type {object}
131
+ */