@schukai/monster 3.65.0 → 3.65.21

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 (383) hide show
  1. package/CHANGELOG.md +48 -327
  2. package/README.md +44 -40
  3. package/package.json +1 -48
  4. package/source/components/constants.mjs +10 -3
  5. package/source/components/datatable/change-button.mjs +18 -11
  6. package/source/components/datatable/columnbar.mjs +10 -1
  7. package/source/components/datatable/constants.mjs +11 -4
  8. package/source/components/datatable/dataset.mjs +212 -203
  9. package/source/components/datatable/datasource/dom.mjs +14 -1
  10. package/source/components/datatable/datasource/rest.mjs +10 -1
  11. package/source/components/datatable/datasource.mjs +10 -1
  12. package/source/components/datatable/datatable/header.mjs +220 -218
  13. package/source/components/datatable/datatable.mjs +754 -752
  14. package/source/components/datatable/embedded-pagination.mjs +10 -1
  15. package/source/components/datatable/filter/abstract-base.mjs +10 -1
  16. package/source/components/datatable/filter/date-range.mjs +10 -1
  17. package/source/components/datatable/filter/input.mjs +10 -1
  18. package/source/components/datatable/filter/range.mjs +10 -1
  19. package/source/components/datatable/filter/select.mjs +11 -4
  20. package/source/components/datatable/filter/settings.mjs +14 -0
  21. package/source/components/datatable/filter/util.mjs +14 -0
  22. package/source/components/datatable/filter-button.mjs +10 -1
  23. package/source/components/datatable/filter.mjs +15 -11
  24. package/source/components/datatable/pagination.mjs +18 -9
  25. package/source/components/datatable/save-button.mjs +280 -270
  26. package/source/components/datatable/status.mjs +15 -5
  27. package/source/components/datatable/stylesheet/change-button.mjs +16 -7
  28. package/source/components/datatable/stylesheet/column-bar.mjs +16 -7
  29. package/source/components/datatable/stylesheet/dataset.mjs +16 -7
  30. package/source/components/datatable/stylesheet/datasource.mjs +16 -7
  31. package/source/components/datatable/stylesheet/datatable.mjs +16 -7
  32. package/source/components/datatable/stylesheet/embedded-pagination.mjs +16 -7
  33. package/source/components/datatable/stylesheet/filter-button.mjs +16 -7
  34. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +16 -7
  35. package/source/components/datatable/stylesheet/filter-date-range.mjs +16 -7
  36. package/source/components/datatable/stylesheet/filter-range.mjs +16 -7
  37. package/source/components/datatable/stylesheet/filter.mjs +16 -7
  38. package/source/components/datatable/stylesheet/pagination.mjs +16 -7
  39. package/source/components/datatable/stylesheet/save-button.mjs +16 -7
  40. package/source/components/datatable/stylesheet/select-filter.mjs +16 -7
  41. package/source/components/datatable/stylesheet/status.mjs +16 -7
  42. package/source/components/datatable/util.mjs +16 -8
  43. package/source/components/form/action-button.mjs +11 -3
  44. package/source/components/form/api-button.mjs +11 -3
  45. package/source/components/form/button-bar.mjs +11 -3
  46. package/source/components/form/button.mjs +254 -249
  47. package/source/components/form/confirm-button.mjs +11 -3
  48. package/source/components/form/constants.mjs +10 -3
  49. package/source/components/form/context-error.mjs +69 -52
  50. package/source/components/form/context-help.mjs +11 -3
  51. package/source/components/form/field-set.mjs +10 -15
  52. package/source/components/form/form.mjs +12 -4
  53. package/source/components/form/message-state-button.mjs +11 -3
  54. package/source/components/form/popper-button.mjs +11 -3
  55. package/source/components/form/popper.mjs +6 -6
  56. package/source/components/form/reload.mjs +12 -4
  57. package/source/components/form/select.mjs +44 -33
  58. package/source/components/form/shadow-reload.mjs +11 -3
  59. package/source/components/form/state-button.mjs +11 -3
  60. package/source/components/form/stylesheet/action-button.mjs +16 -7
  61. package/source/components/form/stylesheet/api-button.mjs +16 -7
  62. package/source/components/form/stylesheet/button-bar.mjs +16 -7
  63. package/source/components/form/stylesheet/button.mjs +16 -7
  64. package/source/components/form/stylesheet/confirm-button.mjs +16 -7
  65. package/source/components/form/stylesheet/context-error.mjs +16 -7
  66. package/source/components/form/stylesheet/context-help.mjs +16 -7
  67. package/source/components/form/stylesheet/field-set.mjs +16 -7
  68. package/source/components/form/stylesheet/form.mjs +16 -7
  69. package/source/components/form/stylesheet/message-state-button.mjs +16 -7
  70. package/source/components/form/stylesheet/popper-button.mjs +16 -7
  71. package/source/components/form/stylesheet/select.mjs +16 -7
  72. package/source/components/form/stylesheet/state-button.mjs +16 -7
  73. package/source/components/form/stylesheet/toggle-switch.mjs +16 -7
  74. package/source/components/form/stylesheet/tree-select.mjs +16 -7
  75. package/source/components/form/tabs.mjs +12 -8
  76. package/source/components/form/template.mjs +11 -3
  77. package/source/components/form/toggle-switch.mjs +12 -8
  78. package/source/components/form/tree-select.mjs +10 -3
  79. package/source/components/form/types/state.mjs +10 -3
  80. package/source/components/form/util/fetch.mjs +10 -3
  81. package/source/components/form/util/floating-ui.mjs +10 -3
  82. package/source/components/form/util/popper.mjs +10 -3
  83. package/source/components/host/call-button.mjs +10 -1
  84. package/source/components/host/collapse.mjs +4 -6
  85. package/source/components/host/config-manager.mjs +2 -0
  86. package/source/components/host/constants.mjs +2 -0
  87. package/source/components/host/details.mjs +5 -8
  88. package/source/components/host/host.mjs +10 -1
  89. package/source/components/host/overlay.mjs +10 -1
  90. package/source/components/host/stylesheet/call-button.mjs +16 -7
  91. package/source/components/host/stylesheet/config-manager.mjs +16 -7
  92. package/source/components/host/stylesheet/host.mjs +16 -7
  93. package/source/components/host/stylesheet/overlay.mjs +16 -7
  94. package/source/components/host/stylesheet/toggle-button.mjs +16 -7
  95. package/source/components/host/stylesheet/viewer.mjs +16 -7
  96. package/source/components/host/toggle-button.mjs +10 -1
  97. package/source/components/host/util.mjs +14 -0
  98. package/source/components/host/viewer.mjs +10 -1
  99. package/source/components/layout/collapse.mjs +4 -3
  100. package/source/components/layout/details.mjs +2 -0
  101. package/source/components/layout/panel.mjs +179 -169
  102. package/source/components/layout/popper.mjs +324 -320
  103. package/source/components/layout/split-panel.mjs +329 -303
  104. package/source/components/layout/stylesheet/collapse.mjs +16 -7
  105. package/source/components/layout/stylesheet/details.mjs +16 -7
  106. package/source/components/layout/stylesheet/panel.mjs +16 -7
  107. package/source/components/layout/stylesheet/popper.mjs +16 -7
  108. package/source/components/layout/stylesheet/split-panel.mjs +16 -7
  109. package/source/components/layout/stylesheet/tabs.mjs +16 -7
  110. package/source/components/layout/stylesheet/width-toggle.mjs +16 -7
  111. package/source/components/layout/tabs.mjs +39 -24
  112. package/source/components/layout/width-toggle.mjs +148 -138
  113. package/source/components/navigation/style/table-of-content.pcss +20 -5
  114. package/source/components/navigation/stylesheet/table-of-content.mjs +17 -8
  115. package/source/components/navigation/table-of-content.mjs +394 -266
  116. package/source/components/notify/constants.mjs +10 -3
  117. package/source/components/notify/message.mjs +16 -9
  118. package/source/components/notify/notify.mjs +11 -4
  119. package/source/components/notify/stylesheet/message.mjs +16 -7
  120. package/source/components/notify/stylesheet/notify.mjs +16 -7
  121. package/source/components/state/log/entry.mjs +10 -1
  122. package/source/components/state/log.mjs +10 -1
  123. package/source/components/state/state.mjs +10 -1
  124. package/source/components/state/stylesheet/log.mjs +16 -7
  125. package/source/components/state/stylesheet/state.mjs +16 -7
  126. package/source/components/style/mixin/form.pcss +0 -1
  127. package/source/components/stylesheet/badge.mjs +16 -7
  128. package/source/components/stylesheet/border.mjs +16 -7
  129. package/source/components/stylesheet/button.mjs +16 -7
  130. package/source/components/stylesheet/card.mjs +16 -7
  131. package/source/components/stylesheet/color.mjs +16 -7
  132. package/source/components/stylesheet/common.mjs +16 -7
  133. package/source/components/stylesheet/control.mjs +16 -7
  134. package/source/components/stylesheet/data-grid.mjs +16 -7
  135. package/source/components/stylesheet/display.mjs +16 -7
  136. package/source/components/stylesheet/floating-ui.mjs +16 -7
  137. package/source/components/stylesheet/form.mjs +16 -7
  138. package/source/components/stylesheet/host.mjs +16 -7
  139. package/source/components/stylesheet/icons.mjs +16 -7
  140. package/source/components/stylesheet/link.mjs +16 -7
  141. package/source/components/stylesheet/mixin/badge.mjs +16 -7
  142. package/source/components/stylesheet/mixin/button.mjs +16 -7
  143. package/source/components/stylesheet/mixin/form.mjs +16 -7
  144. package/source/components/stylesheet/mixin/hover.mjs +16 -7
  145. package/source/components/stylesheet/mixin/icon.mjs +16 -7
  146. package/source/components/stylesheet/mixin/media.mjs +16 -7
  147. package/source/components/stylesheet/mixin/property.mjs +16 -7
  148. package/source/components/stylesheet/mixin/skeleton.mjs +16 -7
  149. package/source/components/stylesheet/mixin/spinner.mjs +16 -7
  150. package/source/components/stylesheet/mixin/typography.mjs +16 -7
  151. package/source/components/stylesheet/normalize.mjs +16 -7
  152. package/source/components/stylesheet/popper.mjs +16 -7
  153. package/source/components/stylesheet/property.mjs +16 -7
  154. package/source/components/stylesheet/ripple.mjs +16 -7
  155. package/source/components/stylesheet/skeleton.mjs +16 -7
  156. package/source/components/stylesheet/space.mjs +16 -7
  157. package/source/components/stylesheet/spinner.mjs +16 -7
  158. package/source/components/stylesheet/table.mjs +16 -7
  159. package/source/components/stylesheet/theme.mjs +16 -7
  160. package/source/components/stylesheet/tree-menu.mjs +10 -3
  161. package/source/components/stylesheet/typography.mjs +16 -7
  162. package/source/components/tree-menu/stylesheet/tree-menu.mjs +16 -7
  163. package/source/components/tree-menu/tree-menu.mjs +19 -8
  164. package/source/constants.mjs +10 -6
  165. package/source/constraints/abstract.mjs +10 -3
  166. package/source/constraints/abstractoperator.mjs +10 -3
  167. package/source/constraints/andoperator.mjs +10 -3
  168. package/source/constraints/invalid.mjs +10 -3
  169. package/source/constraints/isarray.mjs +10 -3
  170. package/source/constraints/isobject.mjs +10 -3
  171. package/source/constraints/oroperator.mjs +10 -3
  172. package/source/constraints/valid.mjs +10 -3
  173. package/source/data/buildmap.mjs +10 -3
  174. package/source/data/buildtree.mjs +10 -3
  175. package/source/data/datasource/dom.mjs +95 -87
  176. package/source/data/datasource/server/restapi/data-fetch-error.mjs +10 -3
  177. package/source/data/datasource/server/restapi/writeerror.mjs +10 -3
  178. package/source/data/datasource/server/restapi.mjs +10 -3
  179. package/source/data/datasource/server/webconnect.mjs +10 -3
  180. package/source/data/datasource/server.mjs +10 -3
  181. package/source/data/datasource/storage/localstorage.mjs +10 -3
  182. package/source/data/datasource/storage/sessionstorage.mjs +10 -3
  183. package/source/data/datasource/storage.mjs +10 -3
  184. package/source/data/datasource.mjs +10 -3
  185. package/source/data/diff.mjs +10 -3
  186. package/source/data/extend.mjs +10 -3
  187. package/source/data/pathfinder.mjs +10 -3
  188. package/source/data/pipe.mjs +10 -3
  189. package/source/data/transformer.mjs +34 -10
  190. package/source/dom/assembler.mjs +10 -3
  191. package/source/dom/attributes.mjs +10 -3
  192. package/source/dom/constants.mjs +10 -3
  193. package/source/dom/customcontrol.mjs +11 -4
  194. package/source/dom/customelement.mjs +31 -17
  195. package/source/dom/dimension.mjs +10 -3
  196. package/source/dom/events.mjs +10 -3
  197. package/source/dom/focusmanager.mjs +10 -3
  198. package/source/dom/locale.mjs +10 -3
  199. package/source/dom/ready.mjs +2 -1
  200. package/source/dom/resource/data.mjs +133 -123
  201. package/source/dom/resource/link/stylesheet.mjs +10 -3
  202. package/source/dom/resource/link.mjs +10 -3
  203. package/source/dom/resource/script.mjs +10 -3
  204. package/source/dom/resource.mjs +10 -4
  205. package/source/dom/resourcemanager.mjs +10 -3
  206. package/source/dom/slotted.mjs +14 -0
  207. package/source/dom/template.mjs +124 -136
  208. package/source/dom/theme.mjs +10 -3
  209. package/source/dom/updater.mjs +10 -3
  210. package/source/dom/util/extract-keys.mjs +10 -3
  211. package/source/dom/util/init-options-from-attributes.mjs +68 -61
  212. package/source/dom/util/set-option-from-attribute.mjs +10 -3
  213. package/source/dom/util.mjs +11 -4
  214. package/source/dom/worker/factory.mjs +10 -3
  215. package/source/i18n/formatter.mjs +10 -3
  216. package/source/i18n/locale.mjs +10 -3
  217. package/source/i18n/provider.mjs +10 -3
  218. package/source/i18n/providers/embed.mjs +10 -3
  219. package/source/i18n/providers/fetch.mjs +10 -3
  220. package/source/i18n/translations.mjs +10 -3
  221. package/source/logging/handler/console.mjs +10 -3
  222. package/source/logging/handler.mjs +10 -3
  223. package/source/logging/logentry.mjs +10 -3
  224. package/source/logging/logger.mjs +10 -3
  225. package/source/math/random.mjs +10 -3
  226. package/source/monster.mjs +3 -9
  227. package/source/net/webconnect/message.mjs +10 -3
  228. package/source/net/webconnect.mjs +20 -5
  229. package/source/text/bracketed-key-value-hash.mjs +10 -3
  230. package/source/text/formatter.mjs +10 -3
  231. package/source/text/generate-range-comparison-expression.mjs +10 -3
  232. package/source/text/util.mjs +14 -0
  233. package/source/types/base.mjs +10 -3
  234. package/source/types/basewithoptions.mjs +10 -3
  235. package/source/types/binary.mjs +10 -3
  236. package/source/types/dataurl.mjs +10 -3
  237. package/source/types/global.mjs +14 -7
  238. package/source/types/id.mjs +10 -3
  239. package/source/types/internal.mjs +11 -3
  240. package/source/types/is.mjs +10 -3
  241. package/source/types/mediatype.mjs +10 -3
  242. package/source/types/node.mjs +10 -3
  243. package/source/types/nodelist.mjs +10 -3
  244. package/source/types/noderecursiveiterator.mjs +10 -3
  245. package/source/types/observablequeue.mjs +10 -3
  246. package/source/types/observer.mjs +10 -3
  247. package/source/types/observerlist.mjs +10 -3
  248. package/source/types/proxyobserver.mjs +10 -3
  249. package/source/types/queue.mjs +10 -3
  250. package/source/types/randomid.mjs +10 -3
  251. package/source/types/regex.mjs +10 -3
  252. package/source/types/stack.mjs +10 -3
  253. package/source/types/tokenlist.mjs +10 -3
  254. package/source/types/typeof.mjs +10 -3
  255. package/source/types/uniquequeue.mjs +10 -3
  256. package/source/types/uuid.mjs +10 -3
  257. package/source/types/validate.mjs +10 -3
  258. package/source/types/version.mjs +10 -3
  259. package/source/util/clone.mjs +10 -3
  260. package/source/util/comparator.mjs +10 -3
  261. package/source/util/deadmansswitch.mjs +10 -3
  262. package/source/util/freeze.mjs +10 -3
  263. package/source/util/processing.mjs +10 -3
  264. package/source/util/runtime.mjs +10 -7
  265. package/source/util/sleep.mjs +10 -10
  266. package/source/util/trimspaces.mjs +10 -3
  267. package/test/cases/data/datasource/server/websocket.mjs +7 -9
  268. package/test/cases/data/transformer.mjs +47 -15
  269. package/test/cases/dom/customcontrol.mjs +0 -1
  270. package/test/cases/dom/customelement.mjs +1 -3
  271. package/test/cases/dom/template.mjs +3 -1
  272. package/test/util/jsdom.mjs +8 -7
  273. package/test/util/websocket.mjs +5 -1
  274. package/test/web/import.js +2 -1
  275. package/test/web/puppeteer.mjs +111 -0
  276. package/test/web/test.html +2 -2
  277. package/test/web/tests.js +2036 -1189
  278. package/example/components/form/button.mjs +0 -10
  279. package/example/components/form/field-set.mjs +0 -4
  280. package/example/components/form/select.mjs +0 -25
  281. package/example/components/form/toggle-switch.mjs +0 -7
  282. package/example/components/form/tree-select.mjs +0 -27
  283. package/example/components/host/host.mjs +0 -0
  284. package/example/components/notify/message.mjs +0 -4
  285. package/example/components/notify/notify.mjs +0 -4
  286. package/example/components/state/log.mjs +0 -0
  287. package/example/components/state/state.mjs +0 -0
  288. package/example/constraints/andoperator.mjs +0 -17
  289. package/example/constraints/invalid.mjs +0 -6
  290. package/example/constraints/isarray.mjs +0 -11
  291. package/example/constraints/isobject.mjs +0 -12
  292. package/example/constraints/oroperator.mjs +0 -15
  293. package/example/constraints/valid.mjs +0 -6
  294. package/example/data/buildmap.mjs +0 -67
  295. package/example/data/datasource/server/restapi.mjs +0 -20
  296. package/example/data/datasource/server/webconnect.mjs +0 -9
  297. package/example/data/datasource.mjs +0 -7
  298. package/example/data/diff.mjs +0 -39
  299. package/example/data/pathfinder-1.mjs +0 -23
  300. package/example/data/pathfinder-2.mjs +0 -19
  301. package/example/data/pipe.mjs +0 -14
  302. package/example/data/transformer.mjs +0 -9
  303. package/example/dom/customelement.mjs +0 -14
  304. package/example/dom/theme.mjs +0 -5
  305. package/example/dom/updater.mjs +0 -23
  306. package/example/i18n/formatter.mjs +0 -10
  307. package/example/i18n/providers/embed.mjs +0 -5
  308. package/example/i18n/providers/fetch.mjs +0 -5
  309. package/example/i18n/translations.mjs +0 -20
  310. package/example/net/webconnect.mjs +0 -16
  311. package/example/types/basewithoptions.mjs +0 -10
  312. package/example/types/is-1.mjs +0 -5
  313. package/example/types/is-10.mjs +0 -6
  314. package/example/types/is-2.mjs +0 -4
  315. package/example/types/is-3.mjs +0 -4
  316. package/example/types/is-4.mjs +0 -5
  317. package/example/types/is-5.mjs +0 -4
  318. package/example/types/is-6.mjs +0 -4
  319. package/example/types/is-7.mjs +0 -4
  320. package/example/types/is-8.mjs +0 -4
  321. package/example/types/is-9.mjs +0 -6
  322. package/example/types/noderecursiveiterator.mjs +0 -32
  323. package/example/types/observer.mjs +0 -9
  324. package/example/types/proxyobserver.mjs +0 -25
  325. package/example/types/queue.mjs +0 -20
  326. package/example/types/tokenlist-1.mjs +0 -4
  327. package/example/types/tokenlist-2.mjs +0 -7
  328. package/example/types/tokenlist-3.mjs +0 -5
  329. package/example/types/tokenlist-4.mjs +0 -5
  330. package/example/types/tokenlist-5.mjs +0 -5
  331. package/example/types/typeof.mjs +0 -9
  332. package/example/types/version-1.mjs +0 -6
  333. package/example/types/version-2.mjs +0 -3
  334. package/example/util/comparator.mjs +0 -10
  335. package/example/util/deadmansswitch.mjs +0 -9
  336. package/example/util/processing.mjs +0 -17
  337. package/source/components/datatable/datasource/namespace.mjs +0 -13
  338. package/source/components/datatable/datatable/namespace.mjs +0 -13
  339. package/source/components/datatable/events.mjs +0 -24
  340. package/source/components/datatable/filter/namespace.mjs +0 -13
  341. package/source/components/datatable/namespace.mjs +0 -11
  342. package/source/components/datatable/stylesheet/namespace.mjs +0 -13
  343. package/source/components/events.mjs +0 -17
  344. package/source/components/form/events.mjs +0 -108
  345. package/source/components/form/namespace.mjs +0 -13
  346. package/source/components/form/stylesheet/namespace.mjs +0 -13
  347. package/source/components/form/types/namespace.mjs +0 -13
  348. package/source/components/form/util/namespace.mjs +0 -13
  349. package/source/components/host/events.mjs +0 -131
  350. package/source/components/host/namespace.mjs +0 -13
  351. package/source/components/host/stylesheet/namespace.mjs +0 -13
  352. package/source/components/layout/events.mjs +0 -30
  353. package/source/components/layout/namespace.mjs +0 -13
  354. package/source/components/namespace.mjs +0 -14
  355. package/source/components/notify/events.mjs +0 -15
  356. package/source/components/notify/namespace.mjs +0 -15
  357. package/source/components/notify/stylesheet/namespace.mjs +0 -15
  358. package/source/components/state/log/namespace.mjs +0 -13
  359. package/source/components/state/namespace.mjs +0 -13
  360. package/source/components/stylesheet/namespace.mjs +0 -13
  361. package/source/components/tree-menu/namespace.mjs +0 -13
  362. package/source/components/tree-menu/stylesheet/namespace.mjs +0 -13
  363. package/source/constraints/namespace.mjs +0 -13
  364. package/source/data/datasource/namespace.mjs +0 -13
  365. package/source/data/datasource/server/namespace.mjs +0 -13
  366. package/source/data/datasource/server/restapi/namespace.mjs +0 -13
  367. package/source/data/datasource/storage/namespace.mjs +0 -13
  368. package/source/data/namespace.mjs +0 -13
  369. package/source/dom/namespace.mjs +0 -13
  370. package/source/dom/resource/link/namespace.mjs +0 -13
  371. package/source/dom/resource/namespace.mjs +0 -13
  372. package/source/dom/util/namespace.mjs +0 -13
  373. package/source/dom/worker/namespace.mjs +0 -13
  374. package/source/i18n/namespace.mjs +0 -13
  375. package/source/i18n/providers/namespace.mjs +0 -13
  376. package/source/logging/handler/namespace.mjs +0 -11
  377. package/source/logging/namespace.mjs +0 -13
  378. package/source/math/namespace.mjs +0 -13
  379. package/source/net/namespace.mjs +0 -13
  380. package/source/net/webconnect/namespace.mjs +0 -13
  381. package/source/text/namespace.mjs +0 -13
  382. package/source/types/namespace.mjs +0 -13
  383. package/source/util/namespace.mjs +0 -13
@@ -1,66 +1,82 @@
1
1
  /**
2
- * Copyright 2023 schukai GmbH
2
+ * Copyright © schukai GmbH and all contributing authors, {{copyRightYear}}. All rights reserved.
3
+ * Node module: @schukai/monster
4
+ *
5
+ * This source code is licensed under the GNU Affero General Public License version 3 (AGPLv3).
6
+ * The full text of the license can be found at: https://www.gnu.org/licenses/agpl-3.0.en.html
7
+ *
8
+ * For those who do not wish to adhere to the AGPLv3, a commercial license is available.
9
+ * Acquiring a commercial license allows you to use this software without complying with the AGPLv3 terms.
10
+ * For more information about purchasing a commercial license, please contact schukai GmbH.
11
+ *
3
12
  * SPDX-License-Identifier: AGPL-3.0
4
13
  */
5
14
 
6
- import {Datasource} from "./datasource.mjs";
15
+ import { Datasource } from "./datasource.mjs";
7
16
  import {
8
- assembleMethodSymbol,
9
- CustomElement,
10
- registerCustomElement,
11
- getSlottedElements,
17
+ assembleMethodSymbol,
18
+ CustomElement,
19
+ registerCustomElement,
20
+ getSlottedElements,
12
21
  } from "../../dom/customelement.mjs";
13
- import {findTargetElementFromEvent, fireCustomEvent} from "../../dom/events.mjs";
14
- import {clone} from "../../util/clone.mjs";
15
22
  import {
16
- isString,
17
- isFunction,
18
- isInstance,
19
- isObject,
20
- isArray,
23
+ findTargetElementFromEvent,
24
+ fireCustomEvent,
25
+ } from "../../dom/events.mjs";
26
+ import { clone } from "../../util/clone.mjs";
27
+ import {
28
+ isString,
29
+ isFunction,
30
+ isInstance,
31
+ isObject,
32
+ isArray,
21
33
  } from "../../types/is.mjs";
22
- import {validateArray, validateInteger, validateObject} from "../../types/validate.mjs";
23
- import {Observer} from "../../types/observer.mjs";
24
34
  import {
25
- ATTRIBUTE_DATATABLE_HEAD,
26
- ATTRIBUTE_DATATABLE_GRID_TEMPLATE,
27
- ATTRIBUTE_DATASOURCE_SELECTOR,
28
- ATTRIBUTE_DATATABLE_ALIGN,
29
- ATTRIBUTE_DATATABLE_SORTABLE,
30
- ATTRIBUTE_DATATABLE_MODE,
31
- ATTRIBUTE_DATATABLE_INDEX,
32
- ATTRIBUTE_DATATABLE_MODE_HIDDEN,
33
- ATTRIBUTE_DATATABLE_MODE_VISIBLE,
34
- ATTRIBUTE_DATATABLE_RESPONSIVE_BREAKPOINT,
35
- ATTRIBUTE_DATATABLE_MODE_FIXED,
35
+ validateArray,
36
+ validateInteger,
37
+ validateObject,
38
+ } from "../../types/validate.mjs";
39
+ import { Observer } from "../../types/observer.mjs";
40
+ import {
41
+ ATTRIBUTE_DATATABLE_HEAD,
42
+ ATTRIBUTE_DATATABLE_GRID_TEMPLATE,
43
+ ATTRIBUTE_DATASOURCE_SELECTOR,
44
+ ATTRIBUTE_DATATABLE_ALIGN,
45
+ ATTRIBUTE_DATATABLE_SORTABLE,
46
+ ATTRIBUTE_DATATABLE_MODE,
47
+ ATTRIBUTE_DATATABLE_INDEX,
48
+ ATTRIBUTE_DATATABLE_MODE_HIDDEN,
49
+ ATTRIBUTE_DATATABLE_MODE_VISIBLE,
50
+ ATTRIBUTE_DATATABLE_RESPONSIVE_BREAKPOINT,
51
+ ATTRIBUTE_DATATABLE_MODE_FIXED,
36
52
  } from "./constants.mjs";
37
- import {instanceSymbol} from "../../constants.mjs";
53
+ import { instanceSymbol } from "../../constants.mjs";
38
54
  import {
39
- Header,
40
- createOrderStatement,
41
- DIRECTION_ASC,
42
- DIRECTION_DESC,
43
- DIRECTION_NONE,
55
+ Header,
56
+ createOrderStatement,
57
+ DIRECTION_ASC,
58
+ DIRECTION_DESC,
59
+ DIRECTION_NONE,
44
60
  } from "./datatable/header.mjs";
45
- import {DatatableStyleSheet} from "./stylesheet/datatable.mjs";
61
+ import { DatatableStyleSheet } from "./stylesheet/datatable.mjs";
46
62
  import {
47
- handleDataSourceChanges,
48
- datasourceLinkedElementSymbol,
63
+ handleDataSourceChanges,
64
+ datasourceLinkedElementSymbol,
49
65
  } from "./util.mjs";
50
66
  import "./columnbar.mjs";
51
67
  import "./filter-button.mjs";
52
- import {getDocument, getWindow} from "../../dom/util.mjs";
53
- import {addAttributeToken} from "../../dom/attributes.mjs";
54
- import {ATTRIBUTE_ERRORMESSAGE} from "../../dom/constants.mjs";
55
- import {getDocumentTranslations} from "../../i18n/translations.mjs";
68
+ import {findElementWithSelectorUpwards, getDocument, getWindow} from "../../dom/util.mjs";
69
+ import { addAttributeToken } from "../../dom/attributes.mjs";
70
+ import { ATTRIBUTE_ERRORMESSAGE } from "../../dom/constants.mjs";
71
+ import { getDocumentTranslations } from "../../i18n/translations.mjs";
56
72
  import "../state/state.mjs";
57
73
  import "../host/collapse.mjs";
58
- import {generateUniqueConfigKey} from "../host/util.mjs";
74
+ import { generateUniqueConfigKey } from "../host/util.mjs";
59
75
 
60
76
  import "./datasource/dom.mjs";
61
77
  import "./datasource/rest.mjs";
62
78
 
63
- export {DataTable};
79
+ export { DataTable };
64
80
 
65
81
  /**
66
82
  * @private
@@ -124,358 +140,354 @@ const columnBarElementSymbol = Symbol("columnBarElement");
124
140
  * @fire Monster.Components.Datatable.event:monster-datatable-row-added
125
141
  */
126
142
  class DataTable extends CustomElement {
127
- /**
128
- * This method is called by the `instanceof` operator.
129
- * @returns {symbol}
130
- */
131
- static get [instanceSymbol]() {
132
- return Symbol.for("@schukai/monster/components/datatable@@instance");
133
- }
134
-
135
- /**
136
- * To set the options via the html tag the attribute `data-monster-options` must be used.
137
- * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
138
- *
139
- * The individual configuration values can be found in the table.
140
- *
141
- * @property {Object} templates Template definitions
142
- * @property {string} templates.main Main template
143
- * @property {Object} datasource Datasource configuration
144
- * @property {string} datasource.selector Selector for the datasource
145
- * @property {Object} mapping Mapping configuration
146
- * @property {string} mapping.data Data mapping
147
- * @property {Array} data Data
148
- * @property {Array} headers Headers
149
- * @property {Object} responsive Responsive configuration
150
- * @property {number} responsive.breakpoint Breakpoint for responsive mode
151
- * @property {Object} labels Labels
152
- * @property {string} labels.theListContainsNoEntries Label for empty state
153
- * @property {Object} classes Classes
154
- * @property {string} classes.container Container class
155
- * @property {Object} features Features
156
- * @property {boolean} features.settings Settings feature
157
- * @property {boolean} features.footer Footer feature
158
- * @property {boolean} features.autoInit Auto init feature (init datasource automatically)
159
- * @property {Object} templateMapping Template mapping
160
- * @property {string} templateMapping.row-key Row key
161
- * @property {string} templateMapping.filter-id Filter id
162
- **/
163
- get defaults() {
164
- return Object.assign(
165
- {},
166
- super.defaults,
167
- {
168
- templates: {
169
- main: getTemplate(),
170
- emptyState: getEmptyTemplate(),
171
- },
172
-
173
- datasource: {
174
- selector: null,
175
- },
176
-
177
- mapping: {
178
- data: "dataset",
179
- },
180
-
181
- data: [],
182
- headers: [],
183
-
184
- responsive: {
185
- breakpoint: 800,
186
- },
187
-
188
- labels: {
189
- theListContainsNoEntries: "The list contains no entries",
190
- },
191
-
192
- classes : {
193
- control: "monster-theme-control-container-1",
194
- container: "monster-theme-control-container-1",
195
- row: "monster-theme-control-row-1",
196
- },
197
-
198
- features: {
199
- settings: true,
200
- footer: true,
201
- autoInit: true,
202
- },
203
-
204
- templateMapping: {
205
- "row-key": null,
206
- "filter-id": null,
207
- },
208
- },
209
- initOptionsFromArguments.call(this),
210
- );
211
- }
212
-
213
- /**
214
- *
215
- * @param {string} selector
216
- * @returns {NodeListOf<*>}
217
- */
218
- getGridElements(selector) {
219
- return this[gridElementSymbol].querySelectorAll(selector);
220
- }
221
-
222
- /**
223
- *
224
- * @return {string}
225
- */
226
- static getTag() {
227
- return "monster-datatable";
228
- }
229
-
230
- /**
231
- *
232
- * @return {Monster.Components.Form.Form}
233
- */
234
- [assembleMethodSymbol]() {
235
- const rawKey = this.getOption("templateMapping.row-key");
236
-
237
- if (rawKey === null) {
238
- if (this.id !== null && this.id !== "") {
239
- const rawKey = this.getOption("templateMapping.row-key");
240
- if (rawKey === null) {
241
- this.setOption("templateMapping.row-key", this.id + "-row");
242
- }
243
- } else {
244
- this.setOption("templateMapping.row-key", "row");
245
- }
246
- }
247
-
248
- if (this.id !== null && this.id !== "") {
249
- this.setOption("templateMapping.filter-id", "" + this.id + "-filter");
250
- } else {
251
- this.setOption("templateMapping.filter-id", "filter");
252
- }
253
-
254
- super[assembleMethodSymbol]();
255
-
256
- initControlReferences.call(this);
257
- initEventHandler.call(this);
258
-
259
- const selector = this.getOption("datasource.selector");
260
-
261
- if (isString(selector)) {
262
- const elements = document.querySelectorAll(selector);
263
- if (elements.length !== 1) {
264
- throw new Error("the selector must match exactly one element");
265
- }
266
-
267
- const element = elements[0];
268
-
269
- if (!isInstance(element, Datasource)) {
270
- throw new TypeError("the element must be a datasource");
271
- }
272
-
273
- this[datasourceLinkedElementSymbol] = element;
274
-
275
- setTimeout(() => {
276
- handleDataSourceChanges.call(this);
277
- element.datasource.attachObserver(
278
- new Observer(handleDataSourceChanges.bind(this)),
279
- );
280
- }, 0);
281
- }
282
-
283
- getHostConfig
284
- .call(this, getColumnVisibilityConfigKey)
285
- .then((config) => {
286
- const headerOrderMap = new Map();
287
-
288
- getHostConfig
289
- .call(this, getStoredOrderConfigKey)
290
- .then((orderConfig) => {
291
- if (isArray(orderConfig) || orderConfig.length > 0) {
292
- for (let i = 0; i < orderConfig.length; i++) {
293
- const item = orderConfig[i];
294
- const parts = item.split(" ");
295
- const field = parts[0];
296
- const direction = parts[1] || DIRECTION_ASC;
297
- headerOrderMap.set(field, direction);
298
- }
299
- }
300
- })
301
- .then(() => {
302
- try {
303
- initGridAndStructs.call(this, config, headerOrderMap);
304
- } catch (error) {
305
- addAttributeToken(
306
- this,
307
- ATTRIBUTE_ERRORMESSAGE,
308
- error?.message || error.toString(),
309
- );
310
- }
311
-
312
- updateColumnBar.call(this);
313
- })
314
- .catch((error) => {
315
- addAttributeToken(
316
- this,
317
- ATTRIBUTE_ERRORMESSAGE,
318
- error?.message || error.toString(),
319
- );
320
- });
321
- })
322
- .catch((error) => {
323
- addAttributeToken(
324
- this,
325
- ATTRIBUTE_ERRORMESSAGE,
326
- error?.message || error.toString(),
327
- );
328
- });
329
- }
330
-
331
- /**
332
- *
333
- * @return {CSSStyleSheet[]}
334
- */
335
- static getCSSStyleSheet() {
336
- return [DatatableStyleSheet];
337
- }
338
-
339
- /**
340
- * Copy a row from the datatable
341
- * @param {number} fromIndex
342
- * @param {number} toIndex
343
- * @returns {Monster.Components.Datatable.DataTable}
344
- * @fire Monster.Components.Datatable.event:monster-datatable-row-copied
345
- */
346
- copyRow(fromIndex, toIndex) {
347
-
348
- const datasource = this[datasourceLinkedElementSymbol];
349
- if (!datasource) {
350
- return this;
351
- }
352
- let d = datasource.data;
353
- let c = clone(d);
354
-
355
- let rows = c
356
- const mapping = this.getOption("mapping.data");
357
-
358
- if (mapping) {
359
- rows=c?.[mapping];
360
- }
361
-
362
- if (rows === undefined || rows === null) {
363
- rows = [];
364
- }
365
-
366
- if (toIndex===undefined) {
367
- toIndex = rows.length;
368
- }
369
-
370
- fromIndex = parseInt(fromIndex);
371
- toIndex = parseInt(toIndex);
372
-
373
- if (toIndex < 0 || toIndex > rows.length) {
374
- throw new RangeError("index out of bounds");
375
- }
376
-
377
- validateArray(rows);
378
- validateInteger(fromIndex);
379
- validateInteger(toIndex);
380
-
381
- if (fromIndex < 0 || fromIndex >= rows.length) {
382
- throw new RangeError("index out of bounds");
383
- }
384
-
385
- rows.splice(toIndex, 0, clone(rows[fromIndex]));
386
- datasource.data=c;
387
-
388
- fireCustomEvent(this, "monster-datatable-row-copied", {
389
- index: toIndex,
390
- });
391
-
392
- return this;
393
- }
394
-
395
- /**
396
- * Remove a row from the datatable
397
- * @param index
398
- * @returns {Monster.Components.Datatable.DataTable}
399
- * @fire Monster.Components.Datatable.event:monster-datatable-row-removed
400
- */
401
- removeRow(index) {
402
- const datasource = this[datasourceLinkedElementSymbol];
403
- if (!datasource) {
404
- return this;
405
- }
406
- let d = datasource.data;
407
- let c = clone(d);
408
-
409
- let rows = c
410
- const mapping = this.getOption("mapping.data");
411
-
412
- if (mapping) {
413
- rows=c?.[mapping];
414
- }
415
-
416
- if (rows === undefined || rows === null) {
417
- rows = [];
418
- }
419
-
420
- index = parseInt(index);
421
-
422
- validateArray(rows);
423
- validateInteger(index);
424
- if (index < 0 || index >= rows.length) {
425
- throw new RangeError("index out of bounds");
426
- }
427
- if (mapping) {
428
- rows=c?.[mapping];
429
- }
430
-
431
- rows.splice(index, 1)
432
- datasource.data=c;
433
-
434
- fireCustomEvent(this, "monster-datatable-row-removed", {
435
- index: index,
436
- });
437
-
438
- return this;
439
- }
440
-
441
- /**
442
- * Add a row to the datatable
443
- * @param {Object} data
444
- * @returns {Monster.Components.Datatable.DataTable}
445
- * @fire Monster.Components.Datatable.event:monster-datatable-row-added
446
- **/
447
- addRow(data) {
448
- const datasource = this[datasourceLinkedElementSymbol];
449
- if (!datasource) {
450
- return this;
451
- }
452
- let d = datasource.data;
453
- let c = clone(d);
454
-
455
- let rows = c
456
-
457
- const mapping = this.getOption("mapping.data");
458
- if (mapping) {
459
- rows=c?.[mapping];
460
- }
461
-
462
- if (rows === undefined || rows === null) {
463
- rows = [];
464
- }
465
-
466
- validateArray(rows);
467
- validateObject(data);
468
-
469
- rows.push(data)
470
- datasource.data=c;
471
-
472
- fireCustomEvent(this, "monster-datatable-row-added", {
473
- index: rows.length - 1,
474
- });
475
-
476
- return this;
477
- }
478
-
143
+ /**
144
+ * This method is called by the `instanceof` operator.
145
+ * @returns {symbol}
146
+ */
147
+ static get [instanceSymbol]() {
148
+ return Symbol.for("@schukai/monster/components/datatable@@instance");
149
+ }
150
+
151
+ /**
152
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
153
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
154
+ *
155
+ * The individual configuration values can be found in the table.
156
+ *
157
+ * @property {Object} templates Template definitions
158
+ * @property {string} templates.main Main template
159
+ * @property {Object} datasource Datasource configuration
160
+ * @property {string} datasource.selector Selector for the datasource
161
+ * @property {Object} mapping Mapping configuration
162
+ * @property {string} mapping.data Data mapping
163
+ * @property {Array} data Data
164
+ * @property {Array} headers Headers
165
+ * @property {Object} responsive Responsive configuration
166
+ * @property {number} responsive.breakpoint Breakpoint for responsive mode
167
+ * @property {Object} labels Labels
168
+ * @property {string} labels.theListContainsNoEntries Label for empty state
169
+ * @property {Object} classes Classes
170
+ * @property {string} classes.container Container class
171
+ * @property {Object} features Features
172
+ * @property {boolean} features.settings Settings feature
173
+ * @property {boolean} features.footer Footer feature
174
+ * @property {boolean} features.autoInit Auto init feature (init datasource automatically)
175
+ * @property {Object} templateMapping Template mapping
176
+ * @property {string} templateMapping.row-key Row key
177
+ * @property {string} templateMapping.filter-id Filter id
178
+ **/
179
+ get defaults() {
180
+ return Object.assign(
181
+ {},
182
+ super.defaults,
183
+ {
184
+ templates: {
185
+ main: getTemplate(),
186
+ emptyState: getEmptyTemplate(),
187
+ },
188
+
189
+ datasource: {
190
+ selector: null,
191
+ },
192
+
193
+ mapping: {
194
+ data: "dataset",
195
+ },
196
+
197
+ data: [],
198
+ headers: [],
199
+
200
+ responsive: {
201
+ breakpoint: 800,
202
+ },
203
+
204
+ labels: {
205
+ theListContainsNoEntries: "The list contains no entries",
206
+ },
207
+
208
+ classes: {
209
+ control: "monster-theme-control-container-1",
210
+ container: "monster-theme-control-container-1",
211
+ row: "monster-theme-control-row-1",
212
+ },
213
+
214
+ features: {
215
+ settings: true,
216
+ footer: true,
217
+ autoInit: true,
218
+ },
219
+
220
+ templateMapping: {
221
+ "row-key": null,
222
+ "filter-id": null,
223
+ },
224
+ },
225
+ initOptionsFromArguments.call(this),
226
+ );
227
+ }
228
+
229
+ /**
230
+ *
231
+ * @param {string} selector
232
+ * @returns {NodeListOf<*>}
233
+ */
234
+ getGridElements(selector) {
235
+ return this[gridElementSymbol].querySelectorAll(selector);
236
+ }
237
+
238
+ /**
239
+ *
240
+ * @return {string}
241
+ */
242
+ static getTag() {
243
+ return "monster-datatable";
244
+ }
245
+
246
+ /**
247
+ *
248
+ * @return {Monster.Components.Form.Form}
249
+ */
250
+ [assembleMethodSymbol]() {
251
+ const rawKey = this.getOption("templateMapping.row-key");
252
+
253
+ if (rawKey === null) {
254
+ if (this.id !== null && this.id !== "") {
255
+ const rawKey = this.getOption("templateMapping.row-key");
256
+ if (rawKey === null) {
257
+ this.setOption("templateMapping.row-key", this.id + "-row");
258
+ }
259
+ } else {
260
+ this.setOption("templateMapping.row-key", "row");
261
+ }
262
+ }
263
+
264
+ if (this.id !== null && this.id !== "") {
265
+ this.setOption("templateMapping.filter-id", "" + this.id + "-filter");
266
+ } else {
267
+ this.setOption("templateMapping.filter-id", "filter");
268
+ }
269
+
270
+ super[assembleMethodSymbol]();
271
+
272
+ initControlReferences.call(this);
273
+ initEventHandler.call(this);
274
+
275
+ const selector = this.getOption("datasource.selector");
276
+
277
+ if (isString(selector)) {
278
+ const element = findElementWithSelectorUpwards( this,selector);
279
+ if (element===null) {
280
+ throw new Error("the selector must match exactly one element");
281
+ }
282
+
283
+ if (!isInstance(element, Datasource)) {
284
+ throw new TypeError("the element must be a datasource");
285
+ }
286
+
287
+ this[datasourceLinkedElementSymbol] = element;
288
+
289
+ setTimeout(() => {
290
+ handleDataSourceChanges.call(this);
291
+ element.datasource.attachObserver(
292
+ new Observer(handleDataSourceChanges.bind(this)),
293
+ );
294
+ }, 0);
295
+ }
296
+
297
+ getHostConfig
298
+ .call(this, getColumnVisibilityConfigKey)
299
+ .then((config) => {
300
+ const headerOrderMap = new Map();
301
+
302
+ getHostConfig
303
+ .call(this, getStoredOrderConfigKey)
304
+ .then((orderConfig) => {
305
+ if (isArray(orderConfig) || orderConfig.length > 0) {
306
+ for (let i = 0; i < orderConfig.length; i++) {
307
+ const item = orderConfig[i];
308
+ const parts = item.split(" ");
309
+ const field = parts[0];
310
+ const direction = parts[1] || DIRECTION_ASC;
311
+ headerOrderMap.set(field, direction);
312
+ }
313
+ }
314
+ })
315
+ .then(() => {
316
+ try {
317
+ initGridAndStructs.call(this, config, headerOrderMap);
318
+ } catch (error) {
319
+ addAttributeToken(
320
+ this,
321
+ ATTRIBUTE_ERRORMESSAGE,
322
+ error?.message || error.toString(),
323
+ );
324
+ }
325
+
326
+ updateColumnBar.call(this);
327
+ })
328
+ .catch((error) => {
329
+ addAttributeToken(
330
+ this,
331
+ ATTRIBUTE_ERRORMESSAGE,
332
+ error?.message || error.toString(),
333
+ );
334
+ });
335
+ })
336
+ .catch((error) => {
337
+ addAttributeToken(
338
+ this,
339
+ ATTRIBUTE_ERRORMESSAGE,
340
+ error?.message || error.toString(),
341
+ );
342
+ });
343
+ }
344
+
345
+ /**
346
+ *
347
+ * @return {CSSStyleSheet[]}
348
+ */
349
+ static getCSSStyleSheet() {
350
+ return [DatatableStyleSheet];
351
+ }
352
+
353
+ /**
354
+ * Copy a row from the datatable
355
+ * @param {number} fromIndex
356
+ * @param {number} toIndex
357
+ * @returns {Monster.Components.Datatable.DataTable}
358
+ * @fire Monster.Components.Datatable.event:monster-datatable-row-copied
359
+ */
360
+ copyRow(fromIndex, toIndex) {
361
+ const datasource = this[datasourceLinkedElementSymbol];
362
+ if (!datasource) {
363
+ return this;
364
+ }
365
+ let d = datasource.data;
366
+ let c = clone(d);
367
+
368
+ let rows = c;
369
+ const mapping = this.getOption("mapping.data");
370
+
371
+ if (mapping) {
372
+ rows = c?.[mapping];
373
+ }
374
+
375
+ if (rows === undefined || rows === null) {
376
+ rows = [];
377
+ }
378
+
379
+ if (toIndex === undefined) {
380
+ toIndex = rows.length;
381
+ }
382
+
383
+ fromIndex = parseInt(fromIndex);
384
+ toIndex = parseInt(toIndex);
385
+
386
+ if (toIndex < 0 || toIndex > rows.length) {
387
+ throw new RangeError("index out of bounds");
388
+ }
389
+
390
+ validateArray(rows);
391
+ validateInteger(fromIndex);
392
+ validateInteger(toIndex);
393
+
394
+ if (fromIndex < 0 || fromIndex >= rows.length) {
395
+ throw new RangeError("index out of bounds");
396
+ }
397
+
398
+ rows.splice(toIndex, 0, clone(rows[fromIndex]));
399
+ datasource.data = c;
400
+
401
+ fireCustomEvent(this, "monster-datatable-row-copied", {
402
+ index: toIndex,
403
+ });
404
+
405
+ return this;
406
+ }
407
+
408
+ /**
409
+ * Remove a row from the datatable
410
+ * @param index
411
+ * @returns {Monster.Components.Datatable.DataTable}
412
+ * @fire Monster.Components.Datatable.event:monster-datatable-row-removed
413
+ */
414
+ removeRow(index) {
415
+ const datasource = this[datasourceLinkedElementSymbol];
416
+ if (!datasource) {
417
+ return this;
418
+ }
419
+ let d = datasource.data;
420
+ let c = clone(d);
421
+
422
+ let rows = c;
423
+ const mapping = this.getOption("mapping.data");
424
+
425
+ if (mapping) {
426
+ rows = c?.[mapping];
427
+ }
428
+
429
+ if (rows === undefined || rows === null) {
430
+ rows = [];
431
+ }
432
+
433
+ index = parseInt(index);
434
+
435
+ validateArray(rows);
436
+ validateInteger(index);
437
+ if (index < 0 || index >= rows.length) {
438
+ throw new RangeError("index out of bounds");
439
+ }
440
+ if (mapping) {
441
+ rows = c?.[mapping];
442
+ }
443
+
444
+ rows.splice(index, 1);
445
+ datasource.data = c;
446
+
447
+ fireCustomEvent(this, "monster-datatable-row-removed", {
448
+ index: index,
449
+ });
450
+
451
+ return this;
452
+ }
453
+
454
+ /**
455
+ * Add a row to the datatable
456
+ * @param {Object} data
457
+ * @returns {Monster.Components.Datatable.DataTable}
458
+ * @fire Monster.Components.Datatable.event:monster-datatable-row-added
459
+ **/
460
+ addRow(data) {
461
+ const datasource = this[datasourceLinkedElementSymbol];
462
+ if (!datasource) {
463
+ return this;
464
+ }
465
+ let d = datasource.data;
466
+ let c = clone(d);
467
+
468
+ let rows = c;
469
+
470
+ const mapping = this.getOption("mapping.data");
471
+ if (mapping) {
472
+ rows = c?.[mapping];
473
+ }
474
+
475
+ if (rows === undefined || rows === null) {
476
+ rows = [];
477
+ }
478
+
479
+ validateArray(rows);
480
+ validateObject(data);
481
+
482
+ rows.push(data);
483
+ datasource.data = c;
484
+
485
+ fireCustomEvent(this, "monster-datatable-row-added", {
486
+ index: rows.length - 1,
487
+ });
488
+
489
+ return this;
490
+ }
479
491
  }
480
492
 
481
493
  /**
@@ -483,7 +495,7 @@ class DataTable extends CustomElement {
483
495
  * @returns {string}
484
496
  */
485
497
  function getColumnVisibilityConfigKey() {
486
- return generateUniqueConfigKey("datatable", this?.id, "columns-visibility");
498
+ return generateUniqueConfigKey("datatable", this?.id, "columns-visibility");
487
499
  }
488
500
 
489
501
  /**
@@ -491,7 +503,7 @@ function getColumnVisibilityConfigKey() {
491
503
  * @returns {string}
492
504
  */
493
505
  function getFilterConfigKey() {
494
- return generateUniqueConfigKey("datatable", this?.id, "filter");
506
+ return generateUniqueConfigKey("datatable", this?.id, "filter");
495
507
  }
496
508
 
497
509
  /**
@@ -499,293 +511,291 @@ function getFilterConfigKey() {
499
511
  * @returns {Promise}
500
512
  */
501
513
  function getHostConfig(callback) {
502
- const document = getDocument();
503
- const host = document.querySelector("monster-host");
504
-
505
- if (!(host && this.id)) {
506
- return Promise.resolve({});
507
- }
508
-
509
- if (!host || !isFunction(host?.getConfig)) {
510
- throw new TypeError("the host must be a monster-host");
511
- }
512
-
513
- const configKey = callback.call(this);
514
- return host.hasConfig(configKey).then((hasConfig) => {
515
- if (hasConfig) {
516
- return host.getConfig(configKey);
517
- } else {
518
- return {};
519
- }
520
- });
514
+ const host = findElementWithSelectorUpwards( this,"monster-host");
515
+
516
+ if (!(host && this.id)) {
517
+ return Promise.resolve({});
518
+ }
519
+
520
+ if (!host || !isFunction(host?.getConfig)) {
521
+ throw new TypeError("the host must be a monster-host");
522
+ }
523
+
524
+ const configKey = callback.call(this);
525
+ return host.hasConfig(configKey).then((hasConfig) => {
526
+ if (hasConfig) {
527
+ return host.getConfig(configKey);
528
+ } else {
529
+ return {};
530
+ }
531
+ });
521
532
  }
522
533
 
523
534
  /**
524
535
  * @private
525
536
  */
526
537
  function updateColumnBar() {
527
- if (!this[columnBarElementSymbol]) {
528
- return;
529
- }
530
-
531
- const columns = [];
532
- for (const header of this.getOption("headers")) {
533
- const mode = header.getInternal("mode");
534
-
535
- if (mode === ATTRIBUTE_DATATABLE_MODE_FIXED) {
536
- continue;
537
- }
538
-
539
- columns.push({
540
- visible: mode !== ATTRIBUTE_DATATABLE_MODE_HIDDEN,
541
- name: header.label,
542
- index: header.index,
543
- });
544
- }
545
-
546
- this[columnBarElementSymbol].setOption("columns", columns);
538
+ if (!this[columnBarElementSymbol]) {
539
+ return;
540
+ }
541
+
542
+ const columns = [];
543
+ for (const header of this.getOption("headers")) {
544
+ const mode = header.getInternal("mode");
545
+
546
+ if (mode === ATTRIBUTE_DATATABLE_MODE_FIXED) {
547
+ continue;
548
+ }
549
+
550
+ columns.push({
551
+ visible: mode !== ATTRIBUTE_DATATABLE_MODE_HIDDEN,
552
+ name: header.label,
553
+ index: header.index,
554
+ });
555
+ }
556
+
557
+ this[columnBarElementSymbol].setOption("columns", columns);
547
558
  }
548
559
 
549
560
  /**
550
561
  * @private
551
562
  */
552
563
  function updateHeaderFromColumnBar() {
553
- if (!this[columnBarElementSymbol]) {
554
- return;
555
- }
564
+ if (!this[columnBarElementSymbol]) {
565
+ return;
566
+ }
556
567
 
557
- const options = this[columnBarElementSymbol].getOption("columns");
558
- if (!isArray(options)) return;
568
+ const options = this[columnBarElementSymbol].getOption("columns");
569
+ if (!isArray(options)) return;
559
570
 
560
- const invisibleMap = {};
571
+ const invisibleMap = {};
561
572
 
562
- for (let i = 0; i < options.length; i++) {
563
- const option = options[i];
564
- invisibleMap[option.index] = option.visible;
565
- }
573
+ for (let i = 0; i < options.length; i++) {
574
+ const option = options[i];
575
+ invisibleMap[option.index] = option.visible;
576
+ }
566
577
 
567
- for (const header of this.getOption("headers")) {
568
- const mode = header.getInternal("mode");
578
+ for (const header of this.getOption("headers")) {
579
+ const mode = header.getInternal("mode");
569
580
 
570
- if (mode === ATTRIBUTE_DATATABLE_MODE_FIXED) {
571
- continue;
572
- }
581
+ if (mode === ATTRIBUTE_DATATABLE_MODE_FIXED) {
582
+ continue;
583
+ }
573
584
 
574
- if (invisibleMap[header.index] === false) {
575
- header.setInternal("mode", ATTRIBUTE_DATATABLE_MODE_HIDDEN);
576
- } else {
577
- header.setInternal("mode", ATTRIBUTE_DATATABLE_MODE_VISIBLE);
578
- }
579
- }
585
+ if (invisibleMap[header.index] === false) {
586
+ header.setInternal("mode", ATTRIBUTE_DATATABLE_MODE_HIDDEN);
587
+ } else {
588
+ header.setInternal("mode", ATTRIBUTE_DATATABLE_MODE_VISIBLE);
589
+ }
590
+ }
580
591
  }
581
592
 
582
593
  /**
583
594
  * @private
584
595
  */
585
596
  function updateConfigColumnBar() {
586
- if (!this[columnBarElementSymbol]) {
587
- return;
588
- }
589
-
590
- const options = this[columnBarElementSymbol].getOption("columns");
591
- if (!isArray(options)) return;
592
-
593
- const map = {};
594
- for (let i = 0; i < options.length; i++) {
595
- const option = options[i];
596
- map[option.name] = option.visible;
597
- }
598
-
599
- const document = getDocument();
600
- const host = document.querySelector("monster-host");
601
- if (!(host && this.id)) {
602
- return;
603
- }
604
- const configKey = getColumnVisibilityConfigKey.call(this);
605
-
606
- try {
607
- host.setConfig(configKey, map);
608
- } catch (error) {
609
- addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
610
- }
597
+ if (!this[columnBarElementSymbol]) {
598
+ return;
599
+ }
600
+
601
+ const options = this[columnBarElementSymbol].getOption("columns");
602
+ if (!isArray(options)) return;
603
+
604
+ const map = {};
605
+ for (let i = 0; i < options.length; i++) {
606
+ const option = options[i];
607
+ map[option.name] = option.visible;
608
+ }
609
+
610
+ const host = findElementWithSelectorUpwards( this,"monster-host");
611
+ if (!(host && this.id)) {
612
+ return;
613
+ }
614
+ const configKey = getColumnVisibilityConfigKey.call(this);
615
+
616
+ try {
617
+ host.setConfig(configKey, map);
618
+ } catch (error) {
619
+ addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
620
+ }
611
621
  }
612
622
 
613
623
  /**
614
624
  * @private
615
625
  */
616
626
  function initEventHandler() {
617
- const self = this;
618
-
619
- getWindow().addEventListener("resize", (event) => {
620
- updateGrid.call(self);
621
- });
622
-
623
- self[columnBarElementSymbol].attachObserver(
624
- new Observer((e) => {
625
- updateHeaderFromColumnBar.call(self);
626
- updateGrid.call(self);
627
- updateConfigColumnBar.call(self);
628
- }),
629
- );
630
-
631
- self[gridHeadersElementSymbol].addEventListener("click", function (event) {
632
- let element = null;
633
- const datasource = self[datasourceLinkedElementSymbol];
634
- if (!datasource) {
635
- return;
636
- }
637
-
638
- element = findTargetElementFromEvent(event, ATTRIBUTE_DATATABLE_SORTABLE);
639
- if (element) {
640
- const index = element.parentNode.getAttribute(ATTRIBUTE_DATATABLE_INDEX);
641
- const headers = self.getOption("headers");
642
-
643
- event.preventDefault();
644
-
645
- headers[index].changeDirection();
646
-
647
- setTimeout(function () {
648
- /** hotfix, normally this should be done via the updater, no idea why this is not possible. */
649
- element.setAttribute(
650
- ATTRIBUTE_DATATABLE_SORTABLE,
651
- `${headers[index].field} ${headers[index].direction}`,
652
- );
653
-
654
- storeOrderStatement.call(self, true);
655
- }, 0);
656
- }
657
- });
627
+ const self = this;
628
+
629
+ getWindow().addEventListener("resize", (event) => {
630
+ updateGrid.call(self);
631
+ });
632
+
633
+ self[columnBarElementSymbol].attachObserver(
634
+ new Observer((e) => {
635
+ updateHeaderFromColumnBar.call(self);
636
+ updateGrid.call(self);
637
+ updateConfigColumnBar.call(self);
638
+ }),
639
+ );
640
+
641
+ self[gridHeadersElementSymbol].addEventListener("click", function (event) {
642
+ let element = null;
643
+ const datasource = self[datasourceLinkedElementSymbol];
644
+ if (!datasource) {
645
+ return;
646
+ }
647
+
648
+ element = findTargetElementFromEvent(event, ATTRIBUTE_DATATABLE_SORTABLE);
649
+ if (element) {
650
+ const index = element.parentNode.getAttribute(ATTRIBUTE_DATATABLE_INDEX);
651
+ const headers = self.getOption("headers");
652
+
653
+ event.preventDefault();
654
+
655
+ headers[index].changeDirection();
656
+
657
+ setTimeout(function () {
658
+ /** hotfix, normally this should be done via the updater, no idea why this is not possible. */
659
+ element.setAttribute(
660
+ ATTRIBUTE_DATATABLE_SORTABLE,
661
+ `${headers[index].field} ${headers[index].direction}`,
662
+ );
663
+
664
+ storeOrderStatement.call(self, true);
665
+ }, 0);
666
+ }
667
+ });
658
668
  }
659
669
 
660
670
  /**
661
671
  * @private
662
672
  */
663
673
  function initGridAndStructs(hostConfig, headerOrderMap) {
664
- const rowID = this.getOption("templateMapping.row-key");
665
-
666
- if (!this[gridElementSymbol]) {
667
- throw new Error("no grid element is defined");
668
- }
669
-
670
- let template;
671
- getSlottedElements.call(this).forEach((e) => {
672
- if (e instanceof HTMLTemplateElement && e.id === rowID) {
673
- template = e;
674
- }
675
- });
676
-
677
- if (!template) {
678
- throw new Error("no template is defined");
679
- }
680
-
681
- const rowCount = template.content.children.length;
682
-
683
- const headers = [];
684
-
685
- for (let i = 0; i < rowCount; i++) {
686
- let hClass = "";
687
- const row = template.content.children[i];
688
-
689
- let mode = "";
690
- if (row.hasAttribute(ATTRIBUTE_DATATABLE_MODE)) {
691
- mode = row.getAttribute(ATTRIBUTE_DATATABLE_MODE);
692
- }
693
-
694
- let grid = row.getAttribute(ATTRIBUTE_DATATABLE_GRID_TEMPLATE);
695
- if (!grid || grid === "" || grid === "auto") {
696
- grid = "minmax(0, 1fr)";
697
- }
698
-
699
- let label = "";
700
- let labelKey = "";
701
-
702
- if (row.hasAttribute(ATTRIBUTE_DATATABLE_HEAD)) {
703
- label = row.getAttribute(ATTRIBUTE_DATATABLE_HEAD);
704
- labelKey = label;
705
-
706
- try {
707
- if (label.startsWith("i18n:")) {
708
- label = label.substring(5, label.length);
709
- label = getDocumentTranslations().getText(label, label);
710
- }
711
- } catch (e) {
712
- label = "i18n error " + label;
713
- }
714
- }
715
-
716
- if (!label) {
717
- label = i + 1 + "";
718
- mode = ATTRIBUTE_DATATABLE_MODE_FIXED;
719
- labelKey = label;
720
- }
721
-
722
- if (isObject(hostConfig) && hostConfig.hasOwnProperty(label)) {
723
- if (hostConfig[label] === false) {
724
- mode = ATTRIBUTE_DATATABLE_MODE_HIDDEN;
725
- } else {
726
- mode = ATTRIBUTE_DATATABLE_MODE_VISIBLE;
727
- }
728
- }
729
-
730
- let align = "";
731
- if (row.hasAttribute(ATTRIBUTE_DATATABLE_ALIGN)) {
732
- align = row.getAttribute(ATTRIBUTE_DATATABLE_ALIGN);
733
- }
734
-
735
- switch (align) {
736
- case "center":
737
- hClass = "flex-center";
738
- break;
739
- case "end":
740
- hClass = "flex-end";
741
- break;
742
- case "start":
743
- hClass = "flex-start";
744
- break;
745
- default:
746
- hClass = "flex-start";
747
- }
748
-
749
- let field = "";
750
- let direction = DIRECTION_NONE;
751
- if (row.hasAttribute(ATTRIBUTE_DATATABLE_SORTABLE)) {
752
- field = row.getAttribute(ATTRIBUTE_DATATABLE_SORTABLE).trim();
753
- const parts = field.split(" ").map((item) => item.trim());
754
- field = parts[0];
755
-
756
- if (headerOrderMap.has(field)) {
757
- direction = headerOrderMap.get(field);
758
- } else if (
759
- parts.length === 2 &&
760
- [DIRECTION_ASC, DIRECTION_DESC].indexOf(parts[1]) !== -1
761
- ) {
762
- direction = parts[1];
763
- }
764
- }
765
-
766
- if (mode === ATTRIBUTE_DATATABLE_MODE_HIDDEN) {
767
- hClass += " hidden";
768
- }
769
-
770
- const header = new Header();
771
- header.setInternals({
772
- field: field,
773
- label: label,
774
- classes: hClass,
775
- index: i,
776
- mode: mode,
777
- grid: grid,
778
- labelKey: labelKey,
779
- direction: direction,
780
- });
781
-
782
- headers.push(header);
783
- }
784
-
785
- this.setOption("headers", headers);
786
- setTimeout(() => {
787
- storeOrderStatement.call(this, this.getOption("features.autoInit"));
788
- }, 0);
674
+ const rowID = this.getOption("templateMapping.row-key");
675
+
676
+ if (!this[gridElementSymbol]) {
677
+ throw new Error("no grid element is defined");
678
+ }
679
+
680
+ let template;
681
+ getSlottedElements.call(this).forEach((e) => {
682
+ if (e instanceof HTMLTemplateElement && e.id === rowID) {
683
+ template = e;
684
+ }
685
+ });
686
+
687
+ if (!template) {
688
+ throw new Error("no template is defined");
689
+ }
690
+
691
+ const rowCount = template.content.children.length;
692
+
693
+ const headers = [];
694
+
695
+ for (let i = 0; i < rowCount; i++) {
696
+ let hClass = "";
697
+ const row = template.content.children[i];
698
+
699
+ let mode = "";
700
+ if (row.hasAttribute(ATTRIBUTE_DATATABLE_MODE)) {
701
+ mode = row.getAttribute(ATTRIBUTE_DATATABLE_MODE);
702
+ }
703
+
704
+ let grid = row.getAttribute(ATTRIBUTE_DATATABLE_GRID_TEMPLATE);
705
+ if (!grid || grid === "" || grid === "auto") {
706
+ grid = "minmax(0, 1fr)";
707
+ }
708
+
709
+ let label = "";
710
+ let labelKey = "";
711
+
712
+ if (row.hasAttribute(ATTRIBUTE_DATATABLE_HEAD)) {
713
+ label = row.getAttribute(ATTRIBUTE_DATATABLE_HEAD);
714
+ labelKey = label;
715
+
716
+ try {
717
+ if (label.startsWith("i18n:")) {
718
+ label = label.substring(5, label.length);
719
+ label = getDocumentTranslations().getText(label, label);
720
+ }
721
+ } catch (e) {
722
+ label = "i18n error " + label;
723
+ }
724
+ }
725
+
726
+ if (!label) {
727
+ label = i + 1 + "";
728
+ mode = ATTRIBUTE_DATATABLE_MODE_FIXED;
729
+ labelKey = label;
730
+ }
731
+
732
+ if (isObject(hostConfig) && hostConfig.hasOwnProperty(label)) {
733
+ if (hostConfig[label] === false) {
734
+ mode = ATTRIBUTE_DATATABLE_MODE_HIDDEN;
735
+ } else {
736
+ mode = ATTRIBUTE_DATATABLE_MODE_VISIBLE;
737
+ }
738
+ }
739
+
740
+ let align = "";
741
+ if (row.hasAttribute(ATTRIBUTE_DATATABLE_ALIGN)) {
742
+ align = row.getAttribute(ATTRIBUTE_DATATABLE_ALIGN);
743
+ }
744
+
745
+ switch (align) {
746
+ case "center":
747
+ hClass = "flex-center";
748
+ break;
749
+ case "end":
750
+ hClass = "flex-end";
751
+ break;
752
+ case "start":
753
+ hClass = "flex-start";
754
+ break;
755
+ default:
756
+ hClass = "flex-start";
757
+ }
758
+
759
+ let field = "";
760
+ let direction = DIRECTION_NONE;
761
+ if (row.hasAttribute(ATTRIBUTE_DATATABLE_SORTABLE)) {
762
+ field = row.getAttribute(ATTRIBUTE_DATATABLE_SORTABLE).trim();
763
+ const parts = field.split(" ").map((item) => item.trim());
764
+ field = parts[0];
765
+
766
+ if (headerOrderMap.has(field)) {
767
+ direction = headerOrderMap.get(field);
768
+ } else if (
769
+ parts.length === 2 &&
770
+ [DIRECTION_ASC, DIRECTION_DESC].indexOf(parts[1]) !== -1
771
+ ) {
772
+ direction = parts[1];
773
+ }
774
+ }
775
+
776
+ if (mode === ATTRIBUTE_DATATABLE_MODE_HIDDEN) {
777
+ hClass += " hidden";
778
+ }
779
+
780
+ const header = new Header();
781
+ header.setInternals({
782
+ field: field,
783
+ label: label,
784
+ classes: hClass,
785
+ index: i,
786
+ mode: mode,
787
+ grid: grid,
788
+ labelKey: labelKey,
789
+ direction: direction,
790
+ });
791
+
792
+ headers.push(header);
793
+ }
794
+
795
+ this.setOption("headers", headers);
796
+ setTimeout(() => {
797
+ storeOrderStatement.call(this, this.getOption("features.autoInit"));
798
+ }, 0);
789
799
  }
790
800
 
791
801
  /**
@@ -793,78 +803,75 @@ function initGridAndStructs(hostConfig, headerOrderMap) {
793
803
  * @returns {string}
794
804
  */
795
805
  export function getStoredOrderConfigKey() {
796
- return generateUniqueConfigKey("datatable", this?.id, "stored-order");
806
+ return generateUniqueConfigKey("datatable", this?.id, "stored-order");
797
807
  }
798
808
 
799
809
  /**
800
810
  * @private
801
811
  */
802
812
  function storeOrderStatement(doFetch) {
803
- const headers = this.getOption("headers");
804
- const statement = createOrderStatement(headers);
805
- setDataSource.call(this, {orderBy: statement}, doFetch);
813
+ const headers = this.getOption("headers");
814
+ const statement = createOrderStatement(headers);
815
+ setDataSource.call(this, { orderBy: statement }, doFetch);
806
816
 
807
- const document = getDocument();
808
- const host = document.querySelector("monster-host");
809
- if (!(host && this.id)) {
810
- return;
811
- }
817
+ const host = findElementWithSelectorUpwards( this,"monster-host");
818
+ if (!(host && this.id)) {
819
+ return;
820
+ }
812
821
 
813
- const configKey = getStoredOrderConfigKey.call(this);
822
+ const configKey = getStoredOrderConfigKey.call(this);
814
823
 
815
- // statement explode with , and remove all empty
816
- const list = statement.split(",").filter((item) => item.trim() !== "");
817
- if (list.length === 0) {
818
- return;
819
- }
824
+ // statement explode with , and remove all empty
825
+ const list = statement.split(",").filter((item) => item.trim() !== "");
826
+ if (list.length === 0) {
827
+ return;
828
+ }
820
829
 
821
- host.setConfig(configKey, list);
830
+ host.setConfig(configKey, list);
822
831
  }
823
832
 
824
833
  /**
825
834
  * @private
826
835
  */
827
836
  function updateGrid() {
828
- if (!this[gridElementSymbol]) {
829
- throw new Error("no grid element is defined");
830
- }
831
-
832
- let gridTemplateColumns = "";
833
-
834
- const headers = this.getOption("headers");
835
-
836
- let styles = "";
837
-
838
- for (let i = 0; i < headers.length; i++) {
839
- const header = headers[i];
840
-
841
- if (header.mode === ATTRIBUTE_DATATABLE_MODE_HIDDEN) {
842
- styles += `[data-monster-role=datatable]>[data-monster-head="${header.labelKey}"] { display: none; }\n`;
843
- styles += `[data-monster-role=datatable-headers]>[data-monster-index="${header.index}"] { display: none; }\n`;
844
- } else {
845
- gridTemplateColumns += `${header.grid} `;
846
- }
847
- }
848
-
849
- const sheet = new CSSStyleSheet();
850
- if (styles !== "") sheet.replaceSync(styles);
851
- this.shadowRoot.adoptedStyleSheets = [...DataTable.getCSSStyleSheet(), sheet];
852
-
853
- const bodyWidth = getDocument().body.getBoundingClientRect().width;
854
-
855
- const breakpoint = this.getOption("responsive.breakpoint");
856
-
857
- if (bodyWidth > breakpoint) {
858
- this[
859
- gridElementSymbol
860
- ].style.gridTemplateColumns = `${gridTemplateColumns}`;
861
- this[
862
- gridHeadersElementSymbol
863
- ].style.gridTemplateColumns = `${gridTemplateColumns}`;
864
- } else {
865
- this[gridElementSymbol].style.gridTemplateColumns = "auto";
866
- this[gridHeadersElementSymbol].style.gridTemplateColumns = "auto";
867
- }
837
+ if (!this[gridElementSymbol]) {
838
+ throw new Error("no grid element is defined");
839
+ }
840
+
841
+ let gridTemplateColumns = "";
842
+
843
+ const headers = this.getOption("headers");
844
+
845
+ let styles = "";
846
+
847
+ for (let i = 0; i < headers.length; i++) {
848
+ const header = headers[i];
849
+
850
+ if (header.mode === ATTRIBUTE_DATATABLE_MODE_HIDDEN) {
851
+ styles += `[data-monster-role=datatable]>[data-monster-head="${header.labelKey}"] { display: none; }\n`;
852
+ styles += `[data-monster-role=datatable-headers]>[data-monster-index="${header.index}"] { display: none; }\n`;
853
+ } else {
854
+ gridTemplateColumns += `${header.grid} `;
855
+ }
856
+ }
857
+
858
+ const sheet = new CSSStyleSheet();
859
+ if (styles !== "") sheet.replaceSync(styles);
860
+ this.shadowRoot.adoptedStyleSheets = [...DataTable.getCSSStyleSheet(), sheet];
861
+
862
+ const bodyWidth = getDocument().body.getBoundingClientRect().width;
863
+
864
+ const breakpoint = this.getOption("responsive.breakpoint");
865
+
866
+ if (bodyWidth > breakpoint) {
867
+ this[gridElementSymbol].style.gridTemplateColumns =
868
+ `${gridTemplateColumns}`;
869
+ this[gridHeadersElementSymbol].style.gridTemplateColumns =
870
+ `${gridTemplateColumns}`;
871
+ } else {
872
+ this[gridElementSymbol].style.gridTemplateColumns = "auto";
873
+ this[gridHeadersElementSymbol].style.gridTemplateColumns = "auto";
874
+ }
868
875
  }
869
876
 
870
877
  /**
@@ -872,20 +879,20 @@ function updateGrid() {
872
879
  * @param {Monster.Components.Datatable.Header[]} headers
873
880
  * @param {bool} doFetch
874
881
  */
875
- function setDataSource({orderBy}, doFetch) {
876
- const datasource = this[datasourceLinkedElementSymbol];
882
+ function setDataSource({ orderBy }, doFetch) {
883
+ const datasource = this[datasourceLinkedElementSymbol];
877
884
 
878
- if (!datasource) {
879
- return;
880
- }
885
+ if (!datasource) {
886
+ return;
887
+ }
881
888
 
882
- if (isFunction(datasource?.setParameters)) {
883
- datasource.setParameters({orderBy});
884
- }
889
+ if (isFunction(datasource?.setParameters)) {
890
+ datasource.setParameters({ orderBy });
891
+ }
885
892
 
886
- if (doFetch !== false && isFunction(datasource?.fetch)) {
887
- datasource.fetch();
888
- }
893
+ if (doFetch !== false && isFunction(datasource?.fetch)) {
894
+ datasource.fetch();
895
+ }
889
896
  }
890
897
 
891
898
  /**
@@ -893,20 +900,20 @@ function setDataSource({orderBy}, doFetch) {
893
900
  * @return {Monster.Components.Datatable.Form}
894
901
  */
895
902
  function initControlReferences() {
896
- if (!this.shadowRoot) {
897
- throw new Error("no shadow-root is defined");
898
- }
899
-
900
- this[gridElementSymbol] = this.shadowRoot.querySelector(
901
- "[data-monster-role=datatable]",
902
- );
903
- this[gridHeadersElementSymbol] = this.shadowRoot.querySelector(
904
- "[data-monster-role=datatable-headers]",
905
- );
906
- this[columnBarElementSymbol] =
907
- this.shadowRoot.querySelector("monster-column-bar");
908
-
909
- return this;
903
+ if (!this.shadowRoot) {
904
+ throw new Error("no shadow-root is defined");
905
+ }
906
+
907
+ this[gridElementSymbol] = this.shadowRoot.querySelector(
908
+ "[data-monster-role=datatable]",
909
+ );
910
+ this[gridHeadersElementSymbol] = this.shadowRoot.querySelector(
911
+ "[data-monster-role=datatable-headers]",
912
+ );
913
+ this[columnBarElementSymbol] =
914
+ this.shadowRoot.querySelector("monster-column-bar");
915
+
916
+ return this;
910
917
  }
911
918
 
912
919
  /**
@@ -916,22 +923,22 @@ function initControlReferences() {
916
923
  * @throws {Error} the datasource could not be initialized
917
924
  */
918
925
  function initOptionsFromArguments() {
919
- const options = {};
920
- const selector = this.getAttribute(ATTRIBUTE_DATASOURCE_SELECTOR);
921
-
922
- if (selector) {
923
- options.datasource = {selector: selector};
924
- }
925
-
926
- const breakpoint = this.getAttribute(
927
- ATTRIBUTE_DATATABLE_RESPONSIVE_BREAKPOINT,
928
- );
929
- if (breakpoint) {
930
- options.responsive = {};
931
- options.responsive.breakpoint = parseInt(breakpoint);
932
- }
933
-
934
- return options;
926
+ const options = {};
927
+ const selector = this.getAttribute(ATTRIBUTE_DATASOURCE_SELECTOR);
928
+
929
+ if (selector) {
930
+ options.datasource = { selector: selector };
931
+ }
932
+
933
+ const breakpoint = this.getAttribute(
934
+ ATTRIBUTE_DATATABLE_RESPONSIVE_BREAKPOINT,
935
+ );
936
+ if (breakpoint) {
937
+ options.responsive = {};
938
+ options.responsive.breakpoint = parseInt(breakpoint);
939
+ }
940
+
941
+ return options;
935
942
  }
936
943
 
937
944
  /**
@@ -939,14 +946,9 @@ function initOptionsFromArguments() {
939
946
  * @return {string}
940
947
  */
941
948
  function getEmptyTemplate() {
942
- return `<monster-state data-monster-role="empty-without-action">
949
+ return `<monster-state data-monster-role="empty-without-action">
943
950
  <div part="visual">
944
- <style>
945
- path {
946
- fill: var(--monster-bg-color-primary-4);
947
- }
948
- </style>
949
- <svg width="4rem" height="4rem" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
951
+ <svg width="4rem" height="4rem" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
950
952
  <path d="m21.5 22h-19c-1.378 0-2.5-1.121-2.5-2.5v-7c0-.07.015-.141.044-.205l3.969-8.82c.404-.896 1.299-1.475 2.28-1.475h11.414c.981 0 1.876.579 2.28 1.475l3.969 8.82c.029.064.044.135.044.205v7c0 1.379-1.122 2.5-2.5 2.5zm-20.5-9.393v6.893c0 .827.673 1.5 1.5 1.5h19c.827 0 1.5-.673 1.5-1.5v-6.893l-3.925-8.723c-.242-.536-.779-.884-1.368-.884h-11.414c-.589 0-1.126.348-1.368.885z"/>
951
953
  <path d="m16.807 17h-9.614c-.622 0-1.186-.391-1.404-.973l-1.014-2.703c-.072-.194-.26-.324-.468-.324h-3.557c-.276 0-.5-.224-.5-.5s.224-.5.5-.5h3.557c.622 0 1.186.391 1.405.973l1.013 2.703c.073.194.261.324.468.324h9.613c.208 0 .396-.13.468-.324l1.013-2.703c.22-.582.784-.973 1.406-.973h3.807c.276 0 .5.224.5.5s-.224.5-.5.5h-3.807c-.208 0-.396.13-.468.324l-1.013 2.703c-.219.582-.784.973-1.405.973z"/>
952
954
  </svg>
@@ -962,8 +964,8 @@ function getEmptyTemplate() {
962
964
  * @return {string}
963
965
  */
964
966
  function getTemplate() {
965
- // language=HTML
966
- return `
967
+ // language=HTML
968
+ return `
967
969
  <div data-monster-role="control" part="control" data-monster-attributes="class path:classes.control">
968
970
  <template id="headers-row">
969
971
  <div data-monster-attributes="class path:headers-row.classes,