@schukai/monster 3.64.1 → 3.65.20

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 (395) hide show
  1. package/CHANGELOG.md +92 -318
  2. package/README.md +44 -40
  3. package/package.json +1 -47
  4. package/source/components/constants.mjs +10 -3
  5. package/source/components/datatable/change-button.mjs +12 -5
  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 +10 -1
  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 +12 -3
  13. package/source/components/datatable/datatable.mjs +757 -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 +11 -3
  24. package/source/components/datatable/pagination.mjs +14 -5
  25. package/source/components/datatable/save-button.mjs +279 -270
  26. package/source/components/datatable/status.mjs +10 -1
  27. package/source/components/datatable/style/dataset.pcss +1 -0
  28. package/source/components/datatable/style/datatable.pcss +1 -0
  29. package/source/components/datatable/stylesheet/change-button.mjs +16 -7
  30. package/source/components/datatable/stylesheet/column-bar.mjs +16 -7
  31. package/source/components/datatable/stylesheet/dataset.mjs +17 -8
  32. package/source/components/datatable/stylesheet/datasource.mjs +16 -7
  33. package/source/components/datatable/stylesheet/datatable.mjs +17 -8
  34. package/source/components/datatable/stylesheet/embedded-pagination.mjs +16 -7
  35. package/source/components/datatable/stylesheet/filter-button.mjs +16 -7
  36. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +16 -7
  37. package/source/components/datatable/stylesheet/filter-date-range.mjs +16 -7
  38. package/source/components/datatable/stylesheet/filter-range.mjs +16 -7
  39. package/source/components/datatable/stylesheet/filter.mjs +16 -7
  40. package/source/components/datatable/stylesheet/pagination.mjs +16 -7
  41. package/source/components/datatable/stylesheet/save-button.mjs +16 -7
  42. package/source/components/datatable/stylesheet/select-filter.mjs +16 -7
  43. package/source/components/datatable/stylesheet/status.mjs +16 -7
  44. package/source/components/datatable/util.mjs +16 -8
  45. package/source/components/form/action-button.mjs +11 -3
  46. package/source/components/form/api-button.mjs +11 -3
  47. package/source/components/form/button-bar.mjs +11 -3
  48. package/source/components/form/button.mjs +37 -50
  49. package/source/components/form/confirm-button.mjs +11 -3
  50. package/source/components/form/constants.mjs +10 -3
  51. package/source/components/form/context-error.mjs +69 -52
  52. package/source/components/form/context-help.mjs +11 -3
  53. package/source/components/form/field-set.mjs +295 -0
  54. package/source/components/form/form.mjs +12 -4
  55. package/source/components/form/message-state-button.mjs +11 -3
  56. package/source/components/form/popper-button.mjs +11 -3
  57. package/source/components/form/popper.mjs +13 -480
  58. package/source/components/form/reload.mjs +12 -4
  59. package/source/components/form/select.mjs +44 -33
  60. package/source/components/form/shadow-reload.mjs +11 -3
  61. package/source/components/form/state-button.mjs +11 -3
  62. package/source/components/form/style/field-set.pcss +13 -0
  63. package/source/components/form/stylesheet/action-button.mjs +16 -7
  64. package/source/components/form/stylesheet/api-button.mjs +16 -7
  65. package/source/components/form/stylesheet/button-bar.mjs +17 -8
  66. package/source/components/form/stylesheet/button.mjs +16 -7
  67. package/source/components/form/stylesheet/confirm-button.mjs +17 -8
  68. package/source/components/form/stylesheet/context-error.mjs +16 -7
  69. package/source/components/form/stylesheet/context-help.mjs +16 -7
  70. package/source/components/form/stylesheet/field-set.mjs +40 -0
  71. package/source/components/form/stylesheet/form.mjs +17 -8
  72. package/source/components/form/stylesheet/message-state-button.mjs +16 -7
  73. package/source/components/form/stylesheet/popper-button.mjs +16 -7
  74. package/source/components/form/stylesheet/select.mjs +16 -7
  75. package/source/components/form/stylesheet/state-button.mjs +16 -7
  76. package/source/components/form/stylesheet/toggle-switch.mjs +16 -7
  77. package/source/components/form/stylesheet/tree-select.mjs +16 -7
  78. package/source/components/form/tabs.mjs +12 -8
  79. package/source/components/form/template.mjs +11 -3
  80. package/source/components/form/toggle-switch.mjs +12 -8
  81. package/source/components/form/tree-select.mjs +10 -3
  82. package/source/components/form/types/state.mjs +10 -3
  83. package/source/components/form/util/fetch.mjs +10 -3
  84. package/source/components/form/util/floating-ui.mjs +10 -3
  85. package/source/components/form/util/popper.mjs +10 -3
  86. package/source/components/host/call-button.mjs +10 -1
  87. package/source/components/host/collapse.mjs +15 -519
  88. package/source/components/host/config-manager.mjs +10 -1
  89. package/source/components/host/constants.mjs +11 -4
  90. package/source/components/host/details.mjs +14 -256
  91. package/source/components/host/host.mjs +10 -1
  92. package/source/components/host/overlay.mjs +10 -1
  93. package/source/components/host/stylesheet/call-button.mjs +16 -7
  94. package/source/components/host/stylesheet/config-manager.mjs +16 -7
  95. package/source/components/host/stylesheet/host.mjs +17 -8
  96. package/source/components/host/stylesheet/overlay.mjs +17 -8
  97. package/source/components/host/stylesheet/toggle-button.mjs +16 -7
  98. package/source/components/host/stylesheet/viewer.mjs +16 -7
  99. package/source/components/host/toggle-button.mjs +10 -1
  100. package/source/components/host/util.mjs +14 -0
  101. package/source/components/host/viewer.mjs +10 -1
  102. package/source/components/layout/collapse.mjs +543 -0
  103. package/source/components/layout/details.mjs +273 -0
  104. package/source/components/layout/panel.mjs +179 -169
  105. package/source/components/layout/popper.mjs +480 -0
  106. package/source/components/layout/split-panel.mjs +329 -303
  107. package/source/components/{host → layout}/stylesheet/collapse.mjs +16 -7
  108. package/source/components/{host → layout}/stylesheet/details.mjs +16 -7
  109. package/source/components/layout/stylesheet/panel.mjs +16 -7
  110. package/source/components/{form → layout}/stylesheet/popper.mjs +16 -7
  111. package/source/components/layout/stylesheet/split-panel.mjs +16 -7
  112. package/source/components/layout/stylesheet/tabs.mjs +16 -7
  113. package/source/components/layout/stylesheet/width-toggle.mjs +16 -7
  114. package/source/components/layout/tabs.mjs +38 -23
  115. package/source/components/layout/width-toggle.mjs +150 -140
  116. package/source/components/navigation/style/table-of-content.pcss +99 -0
  117. package/source/components/navigation/stylesheet/table-of-content.mjs +40 -0
  118. package/source/components/navigation/table-of-content.mjs +546 -0
  119. package/source/components/notify/constants.mjs +10 -3
  120. package/source/components/notify/message.mjs +16 -9
  121. package/source/components/notify/notify.mjs +11 -4
  122. package/source/components/notify/stylesheet/message.mjs +16 -7
  123. package/source/components/notify/stylesheet/notify.mjs +16 -7
  124. package/source/components/state/log/entry.mjs +10 -1
  125. package/source/components/state/log.mjs +10 -1
  126. package/source/components/state/state.mjs +10 -1
  127. package/source/components/state/stylesheet/log.mjs +16 -7
  128. package/source/components/state/stylesheet/state.mjs +17 -8
  129. package/source/components/style/link.pcss +0 -1
  130. package/source/components/style/mixin/form.pcss +0 -1
  131. package/source/components/style/mixin/typography.pcss +7 -7
  132. package/source/components/style/typography.pcss +1 -1
  133. package/source/components/stylesheet/badge.mjs +16 -7
  134. package/source/components/stylesheet/border.mjs +16 -7
  135. package/source/components/stylesheet/button.mjs +16 -7
  136. package/source/components/stylesheet/card.mjs +16 -7
  137. package/source/components/stylesheet/color.mjs +16 -7
  138. package/source/components/stylesheet/common.mjs +16 -7
  139. package/source/components/stylesheet/control.mjs +16 -7
  140. package/source/components/stylesheet/data-grid.mjs +16 -7
  141. package/source/components/stylesheet/display.mjs +16 -7
  142. package/source/components/stylesheet/floating-ui.mjs +16 -7
  143. package/source/components/stylesheet/form.mjs +16 -7
  144. package/source/components/stylesheet/host.mjs +16 -7
  145. package/source/components/stylesheet/icons.mjs +16 -7
  146. package/source/components/stylesheet/link.mjs +16 -7
  147. package/source/components/stylesheet/mixin/badge.mjs +16 -7
  148. package/source/components/stylesheet/mixin/button.mjs +16 -7
  149. package/source/components/stylesheet/mixin/form.mjs +16 -7
  150. package/source/components/stylesheet/mixin/hover.mjs +16 -7
  151. package/source/components/stylesheet/mixin/icon.mjs +16 -7
  152. package/source/components/stylesheet/mixin/media.mjs +16 -7
  153. package/source/components/stylesheet/mixin/property.mjs +16 -7
  154. package/source/components/stylesheet/mixin/skeleton.mjs +16 -7
  155. package/source/components/stylesheet/mixin/spinner.mjs +16 -7
  156. package/source/components/stylesheet/mixin/typography.mjs +16 -7
  157. package/source/components/stylesheet/normalize.mjs +16 -7
  158. package/source/components/stylesheet/popper.mjs +16 -7
  159. package/source/components/stylesheet/property.mjs +16 -7
  160. package/source/components/stylesheet/ripple.mjs +16 -7
  161. package/source/components/stylesheet/skeleton.mjs +16 -7
  162. package/source/components/stylesheet/space.mjs +16 -7
  163. package/source/components/stylesheet/spinner.mjs +16 -7
  164. package/source/components/stylesheet/table.mjs +16 -7
  165. package/source/components/stylesheet/theme.mjs +16 -7
  166. package/source/components/stylesheet/tree-menu.mjs +10 -3
  167. package/source/components/stylesheet/typography.mjs +17 -8
  168. package/source/components/tree-menu/stylesheet/tree-menu.mjs +16 -7
  169. package/source/components/tree-menu/tree-menu.mjs +19 -8
  170. package/source/constants.mjs +10 -6
  171. package/source/constraints/abstract.mjs +10 -3
  172. package/source/constraints/abstractoperator.mjs +10 -3
  173. package/source/constraints/andoperator.mjs +10 -3
  174. package/source/constraints/invalid.mjs +10 -3
  175. package/source/constraints/isarray.mjs +10 -3
  176. package/source/constraints/isobject.mjs +10 -3
  177. package/source/constraints/oroperator.mjs +10 -3
  178. package/source/constraints/valid.mjs +10 -3
  179. package/source/data/buildmap.mjs +10 -3
  180. package/source/data/buildtree.mjs +10 -3
  181. package/source/data/datasource/dom.mjs +10 -3
  182. package/source/data/datasource/server/restapi/data-fetch-error.mjs +10 -3
  183. package/source/data/datasource/server/restapi/writeerror.mjs +10 -3
  184. package/source/data/datasource/server/restapi.mjs +10 -3
  185. package/source/data/datasource/server/webconnect.mjs +10 -3
  186. package/source/data/datasource/server.mjs +10 -3
  187. package/source/data/datasource/storage/localstorage.mjs +10 -3
  188. package/source/data/datasource/storage/sessionstorage.mjs +10 -3
  189. package/source/data/datasource/storage.mjs +10 -3
  190. package/source/data/datasource.mjs +10 -3
  191. package/source/data/diff.mjs +10 -3
  192. package/source/data/extend.mjs +10 -3
  193. package/source/data/pathfinder.mjs +10 -3
  194. package/source/data/pipe.mjs +10 -3
  195. package/source/data/transformer.mjs +34 -10
  196. package/source/dom/assembler.mjs +10 -3
  197. package/source/dom/attributes.mjs +10 -3
  198. package/source/dom/constants.mjs +10 -3
  199. package/source/dom/customcontrol.mjs +11 -4
  200. package/source/dom/customelement.mjs +31 -17
  201. package/source/dom/dimension.mjs +10 -3
  202. package/source/dom/events.mjs +10 -3
  203. package/source/dom/focusmanager.mjs +10 -3
  204. package/source/dom/locale.mjs +10 -3
  205. package/source/dom/ready.mjs +11 -4
  206. package/source/dom/resource/data.mjs +10 -3
  207. package/source/dom/resource/link/stylesheet.mjs +10 -3
  208. package/source/dom/resource/link.mjs +10 -3
  209. package/source/dom/resource/script.mjs +10 -3
  210. package/source/dom/resource.mjs +10 -3
  211. package/source/dom/resourcemanager.mjs +10 -3
  212. package/source/dom/slotted.mjs +14 -0
  213. package/source/dom/template.mjs +124 -136
  214. package/source/dom/theme.mjs +10 -3
  215. package/source/dom/updater.mjs +10 -3
  216. package/source/dom/util/extract-keys.mjs +10 -3
  217. package/source/dom/util/init-options-from-attributes.mjs +68 -61
  218. package/source/dom/util/set-option-from-attribute.mjs +10 -3
  219. package/source/dom/util.mjs +11 -4
  220. package/source/dom/worker/factory.mjs +10 -3
  221. package/source/i18n/formatter.mjs +10 -3
  222. package/source/i18n/locale.mjs +10 -3
  223. package/source/i18n/provider.mjs +10 -3
  224. package/source/i18n/providers/embed.mjs +10 -3
  225. package/source/i18n/providers/fetch.mjs +10 -3
  226. package/source/i18n/translations.mjs +10 -3
  227. package/source/logging/handler/console.mjs +10 -3
  228. package/source/logging/handler.mjs +10 -3
  229. package/source/logging/logentry.mjs +10 -3
  230. package/source/logging/logger.mjs +10 -3
  231. package/source/math/random.mjs +10 -3
  232. package/source/monster.mjs +8 -93
  233. package/source/net/webconnect/message.mjs +10 -3
  234. package/source/net/webconnect.mjs +20 -5
  235. package/source/text/bracketed-key-value-hash.mjs +10 -3
  236. package/source/text/formatter.mjs +10 -3
  237. package/source/text/generate-range-comparison-expression.mjs +10 -3
  238. package/source/text/util.mjs +14 -0
  239. package/source/types/base.mjs +10 -3
  240. package/source/types/basewithoptions.mjs +10 -3
  241. package/source/types/binary.mjs +10 -3
  242. package/source/types/dataurl.mjs +10 -3
  243. package/source/types/global.mjs +14 -7
  244. package/source/types/id.mjs +10 -3
  245. package/source/types/internal.mjs +11 -3
  246. package/source/types/is.mjs +10 -3
  247. package/source/types/mediatype.mjs +10 -3
  248. package/source/types/node.mjs +10 -3
  249. package/source/types/nodelist.mjs +10 -3
  250. package/source/types/noderecursiveiterator.mjs +10 -3
  251. package/source/types/observablequeue.mjs +10 -3
  252. package/source/types/observer.mjs +10 -3
  253. package/source/types/observerlist.mjs +10 -3
  254. package/source/types/proxyobserver.mjs +14 -5
  255. package/source/types/queue.mjs +10 -3
  256. package/source/types/randomid.mjs +10 -3
  257. package/source/types/regex.mjs +10 -3
  258. package/source/types/stack.mjs +10 -3
  259. package/source/types/tokenlist.mjs +10 -3
  260. package/source/types/typeof.mjs +10 -3
  261. package/source/types/uniquequeue.mjs +10 -3
  262. package/source/types/uuid.mjs +10 -3
  263. package/source/types/validate.mjs +10 -3
  264. package/source/types/version.mjs +11 -4
  265. package/source/util/clone.mjs +10 -3
  266. package/source/util/comparator.mjs +10 -3
  267. package/source/util/deadmansswitch.mjs +10 -3
  268. package/source/util/freeze.mjs +10 -3
  269. package/source/util/processing.mjs +10 -3
  270. package/source/util/runtime.mjs +10 -7
  271. package/source/util/sleep.mjs +10 -10
  272. package/source/util/trimspaces.mjs +10 -3
  273. package/test/cases/data/datasource/server/websocket.mjs +7 -9
  274. package/test/cases/data/transformer.mjs +47 -15
  275. package/test/cases/dom/customcontrol.mjs +0 -1
  276. package/test/cases/dom/customelement.mjs +1 -3
  277. package/test/cases/dom/template.mjs +3 -1
  278. package/test/cases/monster.mjs +1 -1
  279. package/test/util/jsdom.mjs +8 -7
  280. package/test/util/websocket.mjs +5 -1
  281. package/test/web/import.js +2 -1
  282. package/test/web/puppeteer.mjs +111 -0
  283. package/test/web/test.html +2 -2
  284. package/test/web/tests.js +2039 -1192
  285. package/example/components/form/button.mjs +0 -10
  286. package/example/components/form/select.mjs +0 -25
  287. package/example/components/form/toggle-switch.mjs +0 -7
  288. package/example/components/form/tree-select.mjs +0 -27
  289. package/example/components/host/host.mjs +0 -0
  290. package/example/components/notify/message.mjs +0 -4
  291. package/example/components/notify/notify.mjs +0 -4
  292. package/example/components/state/log.mjs +0 -0
  293. package/example/components/state/state.mjs +0 -0
  294. package/example/constraints/andoperator.mjs +0 -17
  295. package/example/constraints/invalid.mjs +0 -6
  296. package/example/constraints/isarray.mjs +0 -11
  297. package/example/constraints/isobject.mjs +0 -12
  298. package/example/constraints/oroperator.mjs +0 -15
  299. package/example/constraints/valid.mjs +0 -6
  300. package/example/data/buildmap.mjs +0 -67
  301. package/example/data/datasource/server/restapi.mjs +0 -20
  302. package/example/data/datasource/server/webconnect.mjs +0 -9
  303. package/example/data/datasource.mjs +0 -7
  304. package/example/data/diff.mjs +0 -39
  305. package/example/data/pathfinder-1.mjs +0 -23
  306. package/example/data/pathfinder-2.mjs +0 -19
  307. package/example/data/pipe.mjs +0 -14
  308. package/example/data/transformer.mjs +0 -9
  309. package/example/dom/customelement.mjs +0 -14
  310. package/example/dom/theme.mjs +0 -5
  311. package/example/dom/updater.mjs +0 -23
  312. package/example/i18n/formatter.mjs +0 -10
  313. package/example/i18n/providers/embed.mjs +0 -5
  314. package/example/i18n/providers/fetch.mjs +0 -5
  315. package/example/i18n/translations.mjs +0 -20
  316. package/example/net/webconnect.mjs +0 -16
  317. package/example/types/basewithoptions.mjs +0 -10
  318. package/example/types/is-1.mjs +0 -5
  319. package/example/types/is-10.mjs +0 -6
  320. package/example/types/is-2.mjs +0 -4
  321. package/example/types/is-3.mjs +0 -4
  322. package/example/types/is-4.mjs +0 -5
  323. package/example/types/is-5.mjs +0 -4
  324. package/example/types/is-6.mjs +0 -4
  325. package/example/types/is-7.mjs +0 -4
  326. package/example/types/is-8.mjs +0 -4
  327. package/example/types/is-9.mjs +0 -6
  328. package/example/types/noderecursiveiterator.mjs +0 -32
  329. package/example/types/observer.mjs +0 -9
  330. package/example/types/proxyobserver.mjs +0 -25
  331. package/example/types/queue.mjs +0 -20
  332. package/example/types/tokenlist-1.mjs +0 -4
  333. package/example/types/tokenlist-2.mjs +0 -7
  334. package/example/types/tokenlist-3.mjs +0 -5
  335. package/example/types/tokenlist-4.mjs +0 -5
  336. package/example/types/tokenlist-5.mjs +0 -5
  337. package/example/types/typeof.mjs +0 -9
  338. package/example/types/version-1.mjs +0 -6
  339. package/example/types/version-2.mjs +0 -3
  340. package/example/util/comparator.mjs +0 -10
  341. package/example/util/deadmansswitch.mjs +0 -9
  342. package/example/util/processing.mjs +0 -17
  343. package/source/components/datatable/datasource/namespace.mjs +0 -13
  344. package/source/components/datatable/datatable/namespace.mjs +0 -13
  345. package/source/components/datatable/events.mjs +0 -24
  346. package/source/components/datatable/filter/namespace.mjs +0 -13
  347. package/source/components/datatable/namespace.mjs +0 -11
  348. package/source/components/datatable/stylesheet/namespace.mjs +0 -13
  349. package/source/components/events.mjs +0 -17
  350. package/source/components/form/events.mjs +0 -108
  351. package/source/components/form/form-field.mjs +0 -341
  352. package/source/components/form/namespace.mjs +0 -13
  353. package/source/components/form/style/form-field.pcss +0 -4
  354. package/source/components/form/stylesheet/form-field.mjs +0 -31
  355. package/source/components/form/stylesheet/namespace.mjs +0 -13
  356. package/source/components/form/types/namespace.mjs +0 -13
  357. package/source/components/form/util/namespace.mjs +0 -13
  358. package/source/components/host/events.mjs +0 -131
  359. package/source/components/host/namespace.mjs +0 -13
  360. package/source/components/host/stylesheet/namespace.mjs +0 -13
  361. package/source/components/layout/events.mjs +0 -30
  362. package/source/components/layout/namespace.mjs +0 -13
  363. package/source/components/namespace.mjs +0 -14
  364. package/source/components/notify/events.mjs +0 -15
  365. package/source/components/notify/namespace.mjs +0 -15
  366. package/source/components/notify/stylesheet/namespace.mjs +0 -15
  367. package/source/components/state/log/namespace.mjs +0 -13
  368. package/source/components/state/namespace.mjs +0 -13
  369. package/source/components/stylesheet/namespace.mjs +0 -13
  370. package/source/components/tree-menu/namespace.mjs +0 -13
  371. package/source/components/tree-menu/stylesheet/namespace.mjs +0 -13
  372. package/source/constraints/namespace.mjs +0 -13
  373. package/source/data/datasource/namespace.mjs +0 -13
  374. package/source/data/datasource/server/namespace.mjs +0 -13
  375. package/source/data/datasource/server/restapi/namespace.mjs +0 -13
  376. package/source/data/datasource/storage/namespace.mjs +0 -13
  377. package/source/data/namespace.mjs +0 -13
  378. package/source/dom/namespace.mjs +0 -13
  379. package/source/dom/resource/link/namespace.mjs +0 -13
  380. package/source/dom/resource/namespace.mjs +0 -13
  381. package/source/dom/util/namespace.mjs +0 -13
  382. package/source/dom/worker/namespace.mjs +0 -13
  383. package/source/i18n/namespace.mjs +0 -13
  384. package/source/i18n/providers/namespace.mjs +0 -13
  385. package/source/logging/handler/namespace.mjs +0 -11
  386. package/source/logging/namespace.mjs +0 -13
  387. package/source/math/namespace.mjs +0 -13
  388. package/source/net/namespace.mjs +0 -13
  389. package/source/net/webconnect/namespace.mjs +0 -13
  390. package/source/text/namespace.mjs +0 -13
  391. package/source/types/namespace.mjs +0 -13
  392. package/source/util/namespace.mjs +0 -13
  393. /package/source/components/{host → layout}/style/collapse.pcss +0 -0
  394. /package/source/components/{host → layout}/style/details.pcss +0 -0
  395. /package/source/components/{form → layout}/style/popper.pcss +0 -0
@@ -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,293 @@ 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 document = getDocument();
515
+ const host = document.querySelector("monster-host");
516
+
517
+ if (!(host && this.id)) {
518
+ return Promise.resolve({});
519
+ }
520
+
521
+ if (!host || !isFunction(host?.getConfig)) {
522
+ throw new TypeError("the host must be a monster-host");
523
+ }
524
+
525
+ const configKey = callback.call(this);
526
+ return host.hasConfig(configKey).then((hasConfig) => {
527
+ if (hasConfig) {
528
+ return host.getConfig(configKey);
529
+ } else {
530
+ return {};
531
+ }
532
+ });
521
533
  }
522
534
 
523
535
  /**
524
536
  * @private
525
537
  */
526
538
  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);
539
+ if (!this[columnBarElementSymbol]) {
540
+ return;
541
+ }
542
+
543
+ const columns = [];
544
+ for (const header of this.getOption("headers")) {
545
+ const mode = header.getInternal("mode");
546
+
547
+ if (mode === ATTRIBUTE_DATATABLE_MODE_FIXED) {
548
+ continue;
549
+ }
550
+
551
+ columns.push({
552
+ visible: mode !== ATTRIBUTE_DATATABLE_MODE_HIDDEN,
553
+ name: header.label,
554
+ index: header.index,
555
+ });
556
+ }
557
+
558
+ this[columnBarElementSymbol].setOption("columns", columns);
547
559
  }
548
560
 
549
561
  /**
550
562
  * @private
551
563
  */
552
564
  function updateHeaderFromColumnBar() {
553
- if (!this[columnBarElementSymbol]) {
554
- return;
555
- }
565
+ if (!this[columnBarElementSymbol]) {
566
+ return;
567
+ }
556
568
 
557
- const options = this[columnBarElementSymbol].getOption("columns");
558
- if (!isArray(options)) return;
569
+ const options = this[columnBarElementSymbol].getOption("columns");
570
+ if (!isArray(options)) return;
559
571
 
560
- const invisibleMap = {};
572
+ const invisibleMap = {};
561
573
 
562
- for (let i = 0; i < options.length; i++) {
563
- const option = options[i];
564
- invisibleMap[option.index] = option.visible;
565
- }
574
+ for (let i = 0; i < options.length; i++) {
575
+ const option = options[i];
576
+ invisibleMap[option.index] = option.visible;
577
+ }
566
578
 
567
- for (const header of this.getOption("headers")) {
568
- const mode = header.getInternal("mode");
579
+ for (const header of this.getOption("headers")) {
580
+ const mode = header.getInternal("mode");
569
581
 
570
- if (mode === ATTRIBUTE_DATATABLE_MODE_FIXED) {
571
- continue;
572
- }
582
+ if (mode === ATTRIBUTE_DATATABLE_MODE_FIXED) {
583
+ continue;
584
+ }
573
585
 
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
- }
586
+ if (invisibleMap[header.index] === false) {
587
+ header.setInternal("mode", ATTRIBUTE_DATATABLE_MODE_HIDDEN);
588
+ } else {
589
+ header.setInternal("mode", ATTRIBUTE_DATATABLE_MODE_VISIBLE);
590
+ }
591
+ }
580
592
  }
581
593
 
582
594
  /**
583
595
  * @private
584
596
  */
585
597
  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
- }
598
+ if (!this[columnBarElementSymbol]) {
599
+ return;
600
+ }
601
+
602
+ const options = this[columnBarElementSymbol].getOption("columns");
603
+ if (!isArray(options)) return;
604
+
605
+ const map = {};
606
+ for (let i = 0; i < options.length; i++) {
607
+ const option = options[i];
608
+ map[option.name] = option.visible;
609
+ }
610
+
611
+ const document = getDocument();
612
+ const host = document.querySelector("monster-host");
613
+ if (!(host && this.id)) {
614
+ return;
615
+ }
616
+ const configKey = getColumnVisibilityConfigKey.call(this);
617
+
618
+ try {
619
+ host.setConfig(configKey, map);
620
+ } catch (error) {
621
+ addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
622
+ }
611
623
  }
612
624
 
613
625
  /**
614
626
  * @private
615
627
  */
616
628
  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
- });
629
+ const self = this;
630
+
631
+ getWindow().addEventListener("resize", (event) => {
632
+ updateGrid.call(self);
633
+ });
634
+
635
+ self[columnBarElementSymbol].attachObserver(
636
+ new Observer((e) => {
637
+ updateHeaderFromColumnBar.call(self);
638
+ updateGrid.call(self);
639
+ updateConfigColumnBar.call(self);
640
+ }),
641
+ );
642
+
643
+ self[gridHeadersElementSymbol].addEventListener("click", function (event) {
644
+ let element = null;
645
+ const datasource = self[datasourceLinkedElementSymbol];
646
+ if (!datasource) {
647
+ return;
648
+ }
649
+
650
+ element = findTargetElementFromEvent(event, ATTRIBUTE_DATATABLE_SORTABLE);
651
+ if (element) {
652
+ const index = element.parentNode.getAttribute(ATTRIBUTE_DATATABLE_INDEX);
653
+ const headers = self.getOption("headers");
654
+
655
+ event.preventDefault();
656
+
657
+ headers[index].changeDirection();
658
+
659
+ setTimeout(function () {
660
+ /** hotfix, normally this should be done via the updater, no idea why this is not possible. */
661
+ element.setAttribute(
662
+ ATTRIBUTE_DATATABLE_SORTABLE,
663
+ `${headers[index].field} ${headers[index].direction}`,
664
+ );
665
+
666
+ storeOrderStatement.call(self, true);
667
+ }, 0);
668
+ }
669
+ });
658
670
  }
659
671
 
660
672
  /**
661
673
  * @private
662
674
  */
663
675
  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);
676
+ const rowID = this.getOption("templateMapping.row-key");
677
+
678
+ if (!this[gridElementSymbol]) {
679
+ throw new Error("no grid element is defined");
680
+ }
681
+
682
+ let template;
683
+ getSlottedElements.call(this).forEach((e) => {
684
+ if (e instanceof HTMLTemplateElement && e.id === rowID) {
685
+ template = e;
686
+ }
687
+ });
688
+
689
+ if (!template) {
690
+ throw new Error("no template is defined");
691
+ }
692
+
693
+ const rowCount = template.content.children.length;
694
+
695
+ const headers = [];
696
+
697
+ for (let i = 0; i < rowCount; i++) {
698
+ let hClass = "";
699
+ const row = template.content.children[i];
700
+
701
+ let mode = "";
702
+ if (row.hasAttribute(ATTRIBUTE_DATATABLE_MODE)) {
703
+ mode = row.getAttribute(ATTRIBUTE_DATATABLE_MODE);
704
+ }
705
+
706
+ let grid = row.getAttribute(ATTRIBUTE_DATATABLE_GRID_TEMPLATE);
707
+ if (!grid || grid === "" || grid === "auto") {
708
+ grid = "minmax(0, 1fr)";
709
+ }
710
+
711
+ let label = "";
712
+ let labelKey = "";
713
+
714
+ if (row.hasAttribute(ATTRIBUTE_DATATABLE_HEAD)) {
715
+ label = row.getAttribute(ATTRIBUTE_DATATABLE_HEAD);
716
+ labelKey = label;
717
+
718
+ try {
719
+ if (label.startsWith("i18n:")) {
720
+ label = label.substring(5, label.length);
721
+ label = getDocumentTranslations().getText(label, label);
722
+ }
723
+ } catch (e) {
724
+ label = "i18n error " + label;
725
+ }
726
+ }
727
+
728
+ if (!label) {
729
+ label = i + 1 + "";
730
+ mode = ATTRIBUTE_DATATABLE_MODE_FIXED;
731
+ labelKey = label;
732
+ }
733
+
734
+ if (isObject(hostConfig) && hostConfig.hasOwnProperty(label)) {
735
+ if (hostConfig[label] === false) {
736
+ mode = ATTRIBUTE_DATATABLE_MODE_HIDDEN;
737
+ } else {
738
+ mode = ATTRIBUTE_DATATABLE_MODE_VISIBLE;
739
+ }
740
+ }
741
+
742
+ let align = "";
743
+ if (row.hasAttribute(ATTRIBUTE_DATATABLE_ALIGN)) {
744
+ align = row.getAttribute(ATTRIBUTE_DATATABLE_ALIGN);
745
+ }
746
+
747
+ switch (align) {
748
+ case "center":
749
+ hClass = "flex-center";
750
+ break;
751
+ case "end":
752
+ hClass = "flex-end";
753
+ break;
754
+ case "start":
755
+ hClass = "flex-start";
756
+ break;
757
+ default:
758
+ hClass = "flex-start";
759
+ }
760
+
761
+ let field = "";
762
+ let direction = DIRECTION_NONE;
763
+ if (row.hasAttribute(ATTRIBUTE_DATATABLE_SORTABLE)) {
764
+ field = row.getAttribute(ATTRIBUTE_DATATABLE_SORTABLE).trim();
765
+ const parts = field.split(" ").map((item) => item.trim());
766
+ field = parts[0];
767
+
768
+ if (headerOrderMap.has(field)) {
769
+ direction = headerOrderMap.get(field);
770
+ } else if (
771
+ parts.length === 2 &&
772
+ [DIRECTION_ASC, DIRECTION_DESC].indexOf(parts[1]) !== -1
773
+ ) {
774
+ direction = parts[1];
775
+ }
776
+ }
777
+
778
+ if (mode === ATTRIBUTE_DATATABLE_MODE_HIDDEN) {
779
+ hClass += " hidden";
780
+ }
781
+
782
+ const header = new Header();
783
+ header.setInternals({
784
+ field: field,
785
+ label: label,
786
+ classes: hClass,
787
+ index: i,
788
+ mode: mode,
789
+ grid: grid,
790
+ labelKey: labelKey,
791
+ direction: direction,
792
+ });
793
+
794
+ headers.push(header);
795
+ }
796
+
797
+ this.setOption("headers", headers);
798
+ setTimeout(() => {
799
+ storeOrderStatement.call(this, this.getOption("features.autoInit"));
800
+ }, 0);
789
801
  }
790
802
 
791
803
  /**
@@ -793,78 +805,76 @@ function initGridAndStructs(hostConfig, headerOrderMap) {
793
805
  * @returns {string}
794
806
  */
795
807
  export function getStoredOrderConfigKey() {
796
- return generateUniqueConfigKey("datatable", this?.id, "stored-order");
808
+ return generateUniqueConfigKey("datatable", this?.id, "stored-order");
797
809
  }
798
810
 
799
811
  /**
800
812
  * @private
801
813
  */
802
814
  function storeOrderStatement(doFetch) {
803
- const headers = this.getOption("headers");
804
- const statement = createOrderStatement(headers);
805
- setDataSource.call(this, {orderBy: statement}, doFetch);
815
+ const headers = this.getOption("headers");
816
+ const statement = createOrderStatement(headers);
817
+ setDataSource.call(this, { orderBy: statement }, doFetch);
806
818
 
807
- const document = getDocument();
808
- const host = document.querySelector("monster-host");
809
- if (!(host && this.id)) {
810
- return;
811
- }
819
+ const document = getDocument();
820
+ const host = document.querySelector("monster-host");
821
+ if (!(host && this.id)) {
822
+ return;
823
+ }
812
824
 
813
- const configKey = getStoredOrderConfigKey.call(this);
825
+ const configKey = getStoredOrderConfigKey.call(this);
814
826
 
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
- }
827
+ // statement explode with , and remove all empty
828
+ const list = statement.split(",").filter((item) => item.trim() !== "");
829
+ if (list.length === 0) {
830
+ return;
831
+ }
820
832
 
821
- host.setConfig(configKey, list);
833
+ host.setConfig(configKey, list);
822
834
  }
823
835
 
824
836
  /**
825
837
  * @private
826
838
  */
827
839
  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
- }
840
+ if (!this[gridElementSymbol]) {
841
+ throw new Error("no grid element is defined");
842
+ }
843
+
844
+ let gridTemplateColumns = "";
845
+
846
+ const headers = this.getOption("headers");
847
+
848
+ let styles = "";
849
+
850
+ for (let i = 0; i < headers.length; i++) {
851
+ const header = headers[i];
852
+
853
+ if (header.mode === ATTRIBUTE_DATATABLE_MODE_HIDDEN) {
854
+ styles += `[data-monster-role=datatable]>[data-monster-head="${header.labelKey}"] { display: none; }\n`;
855
+ styles += `[data-monster-role=datatable-headers]>[data-monster-index="${header.index}"] { display: none; }\n`;
856
+ } else {
857
+ gridTemplateColumns += `${header.grid} `;
858
+ }
859
+ }
860
+
861
+ const sheet = new CSSStyleSheet();
862
+ if (styles !== "") sheet.replaceSync(styles);
863
+ this.shadowRoot.adoptedStyleSheets = [...DataTable.getCSSStyleSheet(), sheet];
864
+
865
+ const bodyWidth = getDocument().body.getBoundingClientRect().width;
866
+
867
+ const breakpoint = this.getOption("responsive.breakpoint");
868
+
869
+ if (bodyWidth > breakpoint) {
870
+ this[gridElementSymbol].style.gridTemplateColumns =
871
+ `${gridTemplateColumns}`;
872
+ this[gridHeadersElementSymbol].style.gridTemplateColumns =
873
+ `${gridTemplateColumns}`;
874
+ } else {
875
+ this[gridElementSymbol].style.gridTemplateColumns = "auto";
876
+ this[gridHeadersElementSymbol].style.gridTemplateColumns = "auto";
877
+ }
868
878
  }
869
879
 
870
880
  /**
@@ -872,20 +882,20 @@ function updateGrid() {
872
882
  * @param {Monster.Components.Datatable.Header[]} headers
873
883
  * @param {bool} doFetch
874
884
  */
875
- function setDataSource({orderBy}, doFetch) {
876
- const datasource = this[datasourceLinkedElementSymbol];
885
+ function setDataSource({ orderBy }, doFetch) {
886
+ const datasource = this[datasourceLinkedElementSymbol];
877
887
 
878
- if (!datasource) {
879
- return;
880
- }
888
+ if (!datasource) {
889
+ return;
890
+ }
881
891
 
882
- if (isFunction(datasource?.setParameters)) {
883
- datasource.setParameters({orderBy});
884
- }
892
+ if (isFunction(datasource?.setParameters)) {
893
+ datasource.setParameters({ orderBy });
894
+ }
885
895
 
886
- if (doFetch !== false && isFunction(datasource?.fetch)) {
887
- datasource.fetch();
888
- }
896
+ if (doFetch !== false && isFunction(datasource?.fetch)) {
897
+ datasource.fetch();
898
+ }
889
899
  }
890
900
 
891
901
  /**
@@ -893,20 +903,20 @@ function setDataSource({orderBy}, doFetch) {
893
903
  * @return {Monster.Components.Datatable.Form}
894
904
  */
895
905
  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;
906
+ if (!this.shadowRoot) {
907
+ throw new Error("no shadow-root is defined");
908
+ }
909
+
910
+ this[gridElementSymbol] = this.shadowRoot.querySelector(
911
+ "[data-monster-role=datatable]",
912
+ );
913
+ this[gridHeadersElementSymbol] = this.shadowRoot.querySelector(
914
+ "[data-monster-role=datatable-headers]",
915
+ );
916
+ this[columnBarElementSymbol] =
917
+ this.shadowRoot.querySelector("monster-column-bar");
918
+
919
+ return this;
910
920
  }
911
921
 
912
922
  /**
@@ -916,22 +926,22 @@ function initControlReferences() {
916
926
  * @throws {Error} the datasource could not be initialized
917
927
  */
918
928
  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;
929
+ const options = {};
930
+ const selector = this.getAttribute(ATTRIBUTE_DATASOURCE_SELECTOR);
931
+
932
+ if (selector) {
933
+ options.datasource = { selector: selector };
934
+ }
935
+
936
+ const breakpoint = this.getAttribute(
937
+ ATTRIBUTE_DATATABLE_RESPONSIVE_BREAKPOINT,
938
+ );
939
+ if (breakpoint) {
940
+ options.responsive = {};
941
+ options.responsive.breakpoint = parseInt(breakpoint);
942
+ }
943
+
944
+ return options;
935
945
  }
936
946
 
937
947
  /**
@@ -939,14 +949,9 @@ function initOptionsFromArguments() {
939
949
  * @return {string}
940
950
  */
941
951
  function getEmptyTemplate() {
942
- return `<monster-state data-monster-role="empty-without-action">
952
+ return `<monster-state data-monster-role="empty-without-action">
943
953
  <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">
954
+ <svg width="4rem" height="4rem" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
950
955
  <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
956
  <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
957
  </svg>
@@ -962,8 +967,8 @@ function getEmptyTemplate() {
962
967
  * @return {string}
963
968
  */
964
969
  function getTemplate() {
965
- // language=HTML
966
- return `
970
+ // language=HTML
971
+ return `
967
972
  <div data-monster-role="control" part="control" data-monster-attributes="class path:classes.control">
968
973
  <template id="headers-row">
969
974
  <div data-monster-attributes="class path:headers-row.classes,