@schukai/monster 3.51.5 → 3.52.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (360) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +15 -12
  3. package/example/components/form/button.mjs +10 -0
  4. package/example/components/form/select.mjs +25 -0
  5. package/example/components/form/tree-select.mjs +27 -0
  6. package/example/components/host/host.mjs +0 -0
  7. package/example/components/notify/message.mjs +4 -0
  8. package/example/components/notify/notify.mjs +4 -0
  9. package/example/components/state/log.mjs +0 -0
  10. package/example/components/state/state.mjs +0 -0
  11. package/package.json +6 -2
  12. package/source/components/constants.mjs +132 -0
  13. package/source/components/datatable/columnbar.mjs +310 -0
  14. package/source/components/datatable/constants.mjs +121 -0
  15. package/source/components/datatable/dataset.mjs +219 -0
  16. package/source/components/datatable/datasource/dom.mjs +186 -0
  17. package/source/components/datatable/datasource/namespace.mjs +13 -0
  18. package/source/components/datatable/datasource/rest.mjs +400 -0
  19. package/source/components/datatable/datasource.mjs +102 -0
  20. package/source/components/datatable/datatable/header.mjs +268 -0
  21. package/source/components/datatable/datatable/namespace.mjs +13 -0
  22. package/source/components/datatable/datatable.mjs +789 -0
  23. package/source/components/datatable/embedded-pagination.mjs +113 -0
  24. package/source/components/datatable/filter/abstract-base.mjs +31 -0
  25. package/source/components/datatable/filter/date-range.mjs +1041 -0
  26. package/source/components/datatable/filter/input.mjs +175 -0
  27. package/source/components/datatable/filter/namespace.mjs +13 -0
  28. package/source/components/datatable/filter/range.mjs +671 -0
  29. package/source/components/datatable/filter/select.mjs +65 -0
  30. package/source/components/datatable/filter/settings.mjs +116 -0
  31. package/source/components/datatable/filter-button.mjs +98 -0
  32. package/source/components/datatable/filter.mjs +929 -0
  33. package/source/components/datatable/namespace.mjs +11 -0
  34. package/source/components/datatable/pagination.mjs +456 -0
  35. package/source/components/datatable/style/column-bar.pcss +123 -0
  36. package/source/components/datatable/style/dataset.pcss +13 -0
  37. package/source/components/datatable/style/datasource.pcss +16 -0
  38. package/source/components/datatable/style/datatable.pcss +239 -0
  39. package/source/components/datatable/style/embedded-pagination.pcss +101 -0
  40. package/source/components/datatable/style/filter-button.pcss +22 -0
  41. package/source/components/datatable/style/filter-controls-defaults.pcss +46 -0
  42. package/source/components/datatable/style/filter-date-range.pcss +9 -0
  43. package/source/components/datatable/style/filter-range.pcss +5 -0
  44. package/source/components/datatable/style/filter.pcss +156 -0
  45. package/source/components/datatable/style/pagination.pcss +59 -0
  46. package/source/components/datatable/style/select-filter.pcss +27 -0
  47. package/source/components/datatable/stylesheet/column-bar.mjs +33 -0
  48. package/source/components/datatable/stylesheet/dataset.mjs +33 -0
  49. package/source/components/datatable/stylesheet/datasource.mjs +33 -0
  50. package/source/components/datatable/stylesheet/datatable.mjs +33 -0
  51. package/source/components/datatable/stylesheet/embedded-pagination.mjs +33 -0
  52. package/source/components/datatable/stylesheet/filter-button.mjs +33 -0
  53. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +33 -0
  54. package/source/components/datatable/stylesheet/filter-date-range.mjs +33 -0
  55. package/source/components/datatable/stylesheet/filter-range.mjs +33 -0
  56. package/source/components/datatable/stylesheet/filter.mjs +33 -0
  57. package/source/components/datatable/stylesheet/namespace.mjs +13 -0
  58. package/source/components/datatable/stylesheet/pagination.mjs +33 -0
  59. package/source/components/datatable/stylesheet/select-filter.mjs +33 -0
  60. package/source/components/datatable/util.mjs +60 -0
  61. package/source/components/form/action-button.mjs +262 -0
  62. package/source/components/form/api-button.mjs +515 -0
  63. package/source/components/form/button-bar.mjs +739 -0
  64. package/source/components/form/button.mjs +350 -0
  65. package/source/components/form/confirm-button.mjs +330 -0
  66. package/source/components/form/constants.mjs +111 -0
  67. package/source/components/form/context-help.mjs +123 -0
  68. package/source/components/form/events.mjs +84 -0
  69. package/source/components/form/form.mjs +601 -0
  70. package/source/components/form/message-state-button.mjs +396 -0
  71. package/source/components/form/namespace.mjs +13 -0
  72. package/source/components/form/popper-button.mjs +435 -0
  73. package/source/components/form/popper.mjs +487 -0
  74. package/source/components/form/reload.mjs +360 -0
  75. package/source/components/form/select.mjs +2314 -0
  76. package/source/components/form/shadow-reload.mjs +137 -0
  77. package/source/components/form/state-button.mjs +182 -0
  78. package/source/components/form/style/action-button.pcss +41 -0
  79. package/source/components/form/style/api-button.pcss +0 -0
  80. package/source/components/form/style/button-bar.pcss +51 -0
  81. package/source/components/form/style/button.pcss +8 -0
  82. package/source/components/form/style/confirm-button.pcss +17 -0
  83. package/source/components/form/style/context-help.pcss +16 -0
  84. package/source/components/form/style/form.pcss +10 -0
  85. package/source/components/form/style/message-state-button.pcss +10 -0
  86. package/source/components/form/style/popper-button.pcss +16 -0
  87. package/source/components/form/style/popper.pcss +8 -0
  88. package/source/components/form/style/select.pcss +265 -0
  89. package/source/components/form/style/state-button.pcss +116 -0
  90. package/source/components/form/style/tabs.pcss +170 -0
  91. package/source/components/form/style/tree-select.pcss +81 -0
  92. package/source/components/form/stylesheet/action-button.mjs +33 -0
  93. package/source/components/form/stylesheet/api-button.mjs +33 -0
  94. package/source/components/form/stylesheet/button-bar.mjs +33 -0
  95. package/source/components/form/stylesheet/button.mjs +33 -0
  96. package/source/components/form/stylesheet/confirm-button.mjs +33 -0
  97. package/source/components/form/stylesheet/context-help.mjs +33 -0
  98. package/source/components/form/stylesheet/form.mjs +33 -0
  99. package/source/components/form/stylesheet/message-state-button.mjs +33 -0
  100. package/source/components/form/stylesheet/namespace.mjs +13 -0
  101. package/source/components/form/stylesheet/popper-button.mjs +33 -0
  102. package/source/components/form/stylesheet/popper.mjs +33 -0
  103. package/source/components/form/stylesheet/select.mjs +33 -0
  104. package/source/components/form/stylesheet/state-button.mjs +33 -0
  105. package/source/components/form/stylesheet/tabs.mjs +33 -0
  106. package/source/components/form/stylesheet/tree-select.mjs +33 -0
  107. package/source/components/form/tabs.mjs +1011 -0
  108. package/source/components/form/template.mjs +373 -0
  109. package/source/components/form/tree-select.mjs +527 -0
  110. package/source/components/form/types/namespace.mjs +13 -0
  111. package/source/components/form/types/state.mjs +93 -0
  112. package/source/components/form/util/fetch.mjs +133 -0
  113. package/source/components/form/util/floating-ui.mjs +245 -0
  114. package/source/components/form/util/namespace.mjs +13 -0
  115. package/source/components/form/util/popper.mjs +49 -0
  116. package/source/components/host/call-button.mjs +236 -0
  117. package/source/components/host/collapse.mjs +526 -0
  118. package/source/components/host/config-manager.mjs +304 -0
  119. package/source/components/host/constants.mjs +18 -0
  120. package/source/components/host/details.mjs +268 -0
  121. package/source/components/host/events.mjs +131 -0
  122. package/source/components/host/host.mjs +420 -0
  123. package/source/components/host/namespace.mjs +13 -0
  124. package/source/components/host/overlay.mjs +339 -0
  125. package/source/components/host/style/call-button.pcss +36 -0
  126. package/source/components/host/style/collapse.pcss +67 -0
  127. package/source/components/host/style/config-manager.pcss +5 -0
  128. package/source/components/host/style/details.pcss +68 -0
  129. package/source/components/host/style/host.pcss +43 -0
  130. package/source/components/host/style/overlay.pcss +73 -0
  131. package/source/components/host/style/toggle-button.pcss +36 -0
  132. package/source/components/host/style/viewer.pcss +13 -0
  133. package/source/components/host/stylesheet/call-button.mjs +33 -0
  134. package/source/components/host/stylesheet/collapse.mjs +33 -0
  135. package/source/components/host/stylesheet/config-manager.mjs +33 -0
  136. package/source/components/host/stylesheet/details.mjs +33 -0
  137. package/source/components/host/stylesheet/host.mjs +33 -0
  138. package/source/components/host/stylesheet/namespace.mjs +13 -0
  139. package/source/components/host/stylesheet/overlay.mjs +33 -0
  140. package/source/components/host/stylesheet/toggle-button.mjs +33 -0
  141. package/source/components/host/stylesheet/viewer.mjs +33 -0
  142. package/source/components/host/toggle-button.mjs +88 -0
  143. package/source/components/host/util.mjs +23 -0
  144. package/source/components/host/viewer.mjs +309 -0
  145. package/source/components/namespace.mjs +14 -0
  146. package/source/components/notify/constants.mjs +15 -0
  147. package/source/components/notify/events.mjs +15 -0
  148. package/source/components/notify/message.mjs +374 -0
  149. package/source/components/notify/namespace.mjs +15 -0
  150. package/source/components/notify/notify.mjs +236 -0
  151. package/source/components/notify/style/message.pcss +57 -0
  152. package/source/components/notify/style/notify.pcss +118 -0
  153. package/source/components/notify/stylesheet/message.mjs +33 -0
  154. package/source/components/notify/stylesheet/namespace.mjs +15 -0
  155. package/source/components/notify/stylesheet/notify.mjs +33 -0
  156. package/source/components/state/log/entry.mjs +126 -0
  157. package/source/components/state/log/namespace.mjs +13 -0
  158. package/source/components/state/log.mjs +275 -0
  159. package/source/components/state/namespace.mjs +13 -0
  160. package/source/components/state/state.mjs +131 -0
  161. package/source/components/state/style/log.pcss +111 -0
  162. package/source/components/state/style/state.pcss +113 -0
  163. package/source/components/state/stylesheet/log.mjs +33 -0
  164. package/source/components/state/stylesheet/state.mjs +33 -0
  165. package/source/components/style/badge.pcss +92 -0
  166. package/source/components/style/border.pcss +77 -0
  167. package/source/components/style/button.pcss +105 -0
  168. package/source/components/style/card.pcss +108 -0
  169. package/source/components/style/color.pcss +257 -0
  170. package/source/components/style/common.pcss +103 -0
  171. package/source/components/style/control.pcss +11 -0
  172. package/source/components/style/data-grid.pcss +43 -0
  173. package/source/components/style/display.pcss +42 -0
  174. package/source/components/style/floating-ui.pcss +33 -0
  175. package/source/components/style/form.pcss +5 -0
  176. package/source/components/style/host.pcss +15 -0
  177. package/source/components/style/link.pcss +63 -0
  178. package/source/components/style/mixin/badge.pcss +18 -0
  179. package/source/components/style/mixin/button.pcss +54 -0
  180. package/source/components/style/mixin/form.pcss +247 -0
  181. package/source/components/style/mixin/hover.pcss +8 -0
  182. package/source/components/style/mixin/media.pcss +107 -0
  183. package/source/components/style/mixin/property.pcss +288 -0
  184. package/source/components/style/mixin/skeleton.pcss +26 -0
  185. package/source/components/style/mixin/spinner.pcss +24 -0
  186. package/source/components/style/mixin/typography.pcss +52 -0
  187. package/source/components/style/normalize.pcss +14 -0
  188. package/source/components/style/popper.pcss +78 -0
  189. package/source/components/style/property.pcss +17 -0
  190. package/source/components/style/ripple.pcss +14 -0
  191. package/source/components/style/skeleton.pcss +28 -0
  192. package/source/components/style/space.pcss +47 -0
  193. package/source/components/style/spinner.pcss +6 -0
  194. package/source/components/style/table.pcss +46 -0
  195. package/source/components/style/theme.pcss +119 -0
  196. package/source/components/style/typography.pcss +131 -0
  197. package/source/components/stylesheet/badge.mjs +33 -0
  198. package/source/components/stylesheet/border.mjs +33 -0
  199. package/source/components/stylesheet/button.mjs +33 -0
  200. package/source/components/stylesheet/card.mjs +33 -0
  201. package/source/components/stylesheet/color.mjs +33 -0
  202. package/source/components/stylesheet/common.mjs +33 -0
  203. package/source/components/stylesheet/control.mjs +33 -0
  204. package/source/components/stylesheet/data-grid.mjs +33 -0
  205. package/source/components/stylesheet/display.mjs +33 -0
  206. package/source/components/stylesheet/floating-ui.mjs +33 -0
  207. package/source/components/stylesheet/form.mjs +33 -0
  208. package/source/components/stylesheet/host.mjs +33 -0
  209. package/source/components/stylesheet/link.mjs +33 -0
  210. package/source/components/stylesheet/namespace.mjs +13 -0
  211. package/source/components/stylesheet/normalize.mjs +33 -0
  212. package/source/components/stylesheet/popper.mjs +33 -0
  213. package/source/components/stylesheet/property.mjs +33 -0
  214. package/source/components/stylesheet/ripple.mjs +33 -0
  215. package/source/components/stylesheet/skeleton.mjs +33 -0
  216. package/source/components/stylesheet/space.mjs +33 -0
  217. package/source/components/stylesheet/spinner.mjs +33 -0
  218. package/source/components/stylesheet/table.mjs +33 -0
  219. package/source/components/stylesheet/theme.mjs +33 -0
  220. package/source/components/stylesheet/tree-menu.mjs +33 -0
  221. package/source/components/stylesheet/typography.mjs +33 -0
  222. package/source/components/tree-menu/namespace.mjs +13 -0
  223. package/source/components/tree-menu/style/tree-menu.pcss +107 -0
  224. package/source/components/tree-menu/stylesheet/namespace.mjs +13 -0
  225. package/source/components/tree-menu/stylesheet/tree-menu.mjs +33 -0
  226. package/source/components/tree-menu/tree-menu.mjs +660 -0
  227. package/source/constraints/abstract.mjs +17 -24
  228. package/source/constraints/abstractoperator.mjs +27 -22
  229. package/source/constraints/andoperator.mjs +20 -17
  230. package/source/constraints/invalid.mjs +17 -17
  231. package/source/constraints/isarray.mjs +20 -20
  232. package/source/constraints/isobject.mjs +20 -20
  233. package/source/constraints/oroperator.mjs +45 -45
  234. package/source/constraints/valid.mjs +17 -17
  235. package/source/data/buildmap.mjs +108 -103
  236. package/source/data/buildtree.mjs +59 -57
  237. package/source/data/datasource/dom.mjs +80 -84
  238. package/source/data/datasource/namespace.mjs +1 -1
  239. package/source/data/datasource/server/restapi/data-fetch-error.mjs +27 -25
  240. package/source/data/datasource/server/restapi/writeerror.mjs +34 -32
  241. package/source/data/datasource/server/restapi.mjs +176 -177
  242. package/source/data/datasource/server/webconnect.mjs +150 -156
  243. package/source/data/datasource/server.mjs +58 -59
  244. package/source/data/datasource/storage/localstorage.mjs +25 -24
  245. package/source/data/datasource/storage/sessionstorage.mjs +28 -25
  246. package/source/data/datasource/storage.mjs +74 -73
  247. package/source/data/datasource.mjs +176 -167
  248. package/source/data/diff.mjs +98 -97
  249. package/source/data/extend.mjs +42 -42
  250. package/source/data/pathfinder.mjs +301 -288
  251. package/source/data/pipe.mjs +36 -36
  252. package/source/data/transformer.mjs +742 -726
  253. package/source/dom/assembler.mjs +44 -44
  254. package/source/dom/attributes.mjs +142 -122
  255. package/source/dom/constants.mjs +62 -58
  256. package/source/dom/customcontrol.mjs +299 -299
  257. package/source/dom/customelement.mjs +843 -806
  258. package/source/dom/dimension.mjs +56 -46
  259. package/source/dom/events.mjs +74 -69
  260. package/source/dom/focusmanager.mjs +175 -175
  261. package/source/dom/locale.mjs +28 -28
  262. package/source/dom/ready.mjs +13 -13
  263. package/source/dom/resource/data.mjs +117 -111
  264. package/source/dom/resource/link/stylesheet.mjs +16 -16
  265. package/source/dom/resource/link.mjs +94 -96
  266. package/source/dom/resource/script.mjs +72 -74
  267. package/source/dom/resource.mjs +174 -172
  268. package/source/dom/resourcemanager.mjs +152 -156
  269. package/source/dom/slotted.mjs +78 -80
  270. package/source/dom/template.mjs +126 -112
  271. package/source/dom/theme.mjs +35 -35
  272. package/source/dom/updater.mjs +673 -651
  273. package/source/dom/util/extract-keys.mjs +34 -22
  274. package/source/dom/util/init-options-from-attributes.mjs +46 -38
  275. package/source/dom/util/namespace.mjs +13 -0
  276. package/source/dom/util/set-option-from-attribute.mjs +35 -29
  277. package/source/dom/util.mjs +112 -81
  278. package/source/dom/worker/factory.mjs +83 -83
  279. package/source/i18n/formatter.mjs +75 -73
  280. package/source/i18n/locale.mjs +146 -144
  281. package/source/i18n/provider.mjs +70 -64
  282. package/source/i18n/providers/embed.mjs +136 -127
  283. package/source/i18n/providers/fetch.mjs +84 -76
  284. package/source/i18n/translations.mjs +205 -195
  285. package/source/logging/handler/console.mjs +36 -36
  286. package/source/logging/handler.mjs +140 -140
  287. package/source/logging/logentry.mjs +25 -25
  288. package/source/logging/logger.mjs +177 -175
  289. package/source/math/random.mjs +63 -59
  290. package/source/monster.mjs +223 -103
  291. package/source/net/webconnect/message.mjs +31 -31
  292. package/source/net/webconnect.mjs +278 -271
  293. package/source/text/bracketed-key-value-hash.mjs +182 -179
  294. package/source/text/formatter.mjs +235 -210
  295. package/source/text/generate-range-comparison-expression.mjs +56 -34
  296. package/source/text/namespace.mjs +1 -1
  297. package/source/types/base.mjs +69 -61
  298. package/source/types/basewithoptions.mjs +46 -46
  299. package/source/types/binary.mjs +20 -20
  300. package/source/types/dataurl.mjs +96 -90
  301. package/source/types/global.mjs +45 -39
  302. package/source/types/id.mjs +25 -25
  303. package/source/types/internal.mjs +115 -114
  304. package/source/types/is.mjs +56 -40
  305. package/source/types/mediatype.mjs +119 -119
  306. package/source/types/namespace.mjs +1 -1
  307. package/source/types/node.mjs +160 -150
  308. package/source/types/nodelist.mjs +94 -96
  309. package/source/types/noderecursiveiterator.mjs +50 -50
  310. package/source/types/observablequeue.mjs +73 -73
  311. package/source/types/observer.mjs +104 -104
  312. package/source/types/observerlist.mjs +66 -66
  313. package/source/types/proxyobserver.mjs +210 -210
  314. package/source/types/queue.mjs +63 -63
  315. package/source/types/randomid.mjs +13 -13
  316. package/source/types/regex.mjs +3 -1
  317. package/source/types/stack.mjs +64 -64
  318. package/source/types/tokenlist.mjs +206 -205
  319. package/source/types/typeof.mjs +12 -10
  320. package/source/types/uniquequeue.mjs +48 -48
  321. package/source/types/uuid.mjs +32 -32
  322. package/source/types/validate.mjs +67 -67
  323. package/source/types/version.mjs +115 -105
  324. package/source/util/clone.mjs +103 -91
  325. package/source/util/comparator.mjs +97 -97
  326. package/source/util/deadmansswitch.mjs +40 -44
  327. package/source/util/freeze.mjs +10 -9
  328. package/source/util/namespace.mjs +1 -1
  329. package/source/util/processing.mjs +104 -105
  330. package/source/util/runtime.mjs +56 -44
  331. package/source/util/trimspaces.mjs +24 -24
  332. package/test/cases/components/form/button.mjs +122 -0
  333. package/test/cases/components/form/confirm-button.mjs +127 -0
  334. package/test/cases/components/form/form.mjs +317 -0
  335. package/test/cases/components/form/reload.mjs +188 -0
  336. package/test/cases/components/form/select.mjs +229 -0
  337. package/test/cases/components/form/state-button.mjs +130 -0
  338. package/test/cases/components/form/tabs.mjs +98 -0
  339. package/test/cases/components/form/template.mjs +189 -0
  340. package/test/cases/components/form/tree-select.mjs +216 -0
  341. package/test/cases/components/host/details.mjs +68 -0
  342. package/test/cases/components/host/host.mjs +70 -0
  343. package/test/cases/components/host/overlay.mjs +60 -0
  344. package/test/cases/components/host/util.mjs +79 -0
  345. package/test/cases/components/notify/message.mjs +39 -0
  346. package/test/cases/components/notify/notify.mjs +89 -0
  347. package/test/cases/dom/customcontrol.mjs +5 -4
  348. package/test/cases/math/random.mjs +0 -1
  349. package/test/cases/monster.mjs +1 -1
  350. package/test/cases/net/webconnect/message.mjs +0 -1
  351. package/test/cases/types/node.mjs +1 -1
  352. package/test/util/chai-dom.mjs +2 -2
  353. package/test/util/intersection-mock.mjs +69 -0
  354. package/test/util/jsdom.mjs +41 -25
  355. package/test/util/localstorage.mjs +1 -0
  356. package/test/util/resize-observer.mjs +29 -0
  357. package/test/util/websocket.mjs +4 -1
  358. package/test/web/import.js +16 -1
  359. package/test/web/test.html +28 -5
  360. package/test/web/tests.js +30398 -17879
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright 2023 schukai GmbH
3
+ * SPDX-License-Identifier: AGPL-3.0
4
+ */
5
+
6
+ /**
7
+ * @namespace Monster.Components.Datatable
8
+ * @memberOf Monster
9
+ * @author schukai GmbH
10
+ */
11
+ const ns = {};
@@ -0,0 +1,456 @@
1
+ /**
2
+ * Copyright 2023 schukai GmbH
3
+ * SPDX-License-Identifier: AGPL-3.0
4
+ */
5
+
6
+ import {
7
+ assembleMethodSymbol,
8
+ CustomElement,
9
+ registerCustomElement,
10
+ } from "../../dom/customelement.mjs";
11
+ import { ATTRIBUTE_DATASOURCE_SELECTOR } from "./constants.mjs";
12
+ import { Datasource } from "./datasource.mjs";
13
+ import { Observer } from "../../types/observer.mjs";
14
+ import { ATTRIBUTE_ROLE } from "../../dom/constants.mjs";
15
+ import { findTargetElementFromEvent } from "../../dom/events.mjs";
16
+ import { PaginationStyleSheet } from "./stylesheet/pagination.mjs";
17
+ import { isString } from "../../types/is.mjs";
18
+ import { Pathfinder } from "../../data/pathfinder.mjs";
19
+ import { instanceSymbol } from "../../constants.mjs";
20
+ import { Formatter } from "../../text/formatter.mjs";
21
+ import "../form/select.mjs";
22
+ import { addAttributeToken } from "../../dom/attributes.mjs";
23
+ import { ATTRIBUTE_ERRORMESSAGE } from "../../dom/constants.mjs";
24
+
25
+ import "./datasource/dom.mjs";
26
+ import "./datasource/rest.mjs";
27
+
28
+ export { Pagination };
29
+
30
+ /**
31
+ * @private
32
+ * @type {symbol}
33
+ */
34
+ const paginationElementSymbol = Symbol.for("paginationElement");
35
+
36
+ /**
37
+ * @private
38
+ * @type {symbol}
39
+ */
40
+ const datasourceLinkedElementSymbol = Symbol("datasourceLinkedElement");
41
+
42
+ /**
43
+ * The Pagination component is used to show the current page and the total number of pages.
44
+ *
45
+ * <img src="./images/pagination.png">
46
+ *
47
+ * Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library
48
+ *
49
+ * You can create this control either by specifying the HTML tag <monster-pagination />` directly in the HTML or using
50
+ * Javascript via the `document.createElement('monster-pagination');` method.
51
+ *
52
+ * ```html
53
+ * <monster-pagination></monster-pagination>
54
+ * ```
55
+ *
56
+ * Or you can create this CustomControl directly in Javascript:
57
+ *
58
+ * ```js
59
+ * import '@schukai/component-datatable/source/pagination.mjs';
60
+ * document.createElement('monster-pagination');
61
+ * ```
62
+ *
63
+ * @startuml pagination.png
64
+ * skinparam monochrome true
65
+ * skinparam shadowing false
66
+ * HTMLElement <|-- CustomElement
67
+ * CustomElement <|-- Pagination
68
+ * @enduml
69
+ *
70
+ * @copyright schukai GmbH
71
+ * @memberOf Monster.Components.Datatable
72
+ * @summary A datatable
73
+ */
74
+ class Pagination extends CustomElement {
75
+ /**
76
+ */
77
+ constructor() {
78
+ super();
79
+ this[datasourceLinkedElementSymbol] = null;
80
+ }
81
+
82
+ /**
83
+ * This method is called by the `instanceof` operator.
84
+ * @returns {symbol}
85
+ */
86
+ static get [instanceSymbol]() {
87
+ return Symbol.for("@schukai/monster/components/pagination");
88
+ }
89
+
90
+ /**
91
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
92
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
93
+ *
94
+ * The individual configuration values can be found in the table.
95
+ *
96
+ * @property {Object} templates Template definitions
97
+ * @property {string} templates.main Main template
98
+ * @property {int} offset Current offset
99
+ * @property {int} nextOffset Next offset
100
+ * @property {int} prevOffset Previous offset
101
+ * @property {int} objectsPerPage Number of objects per page
102
+ * @property {int} currentPage Current page
103
+ * @property {int} pages Total number of pages
104
+ * @property {int} total Total number of objects
105
+ */
106
+ get defaults() {
107
+ return Object.assign(
108
+ {},
109
+ super.defaults,
110
+ {
111
+ templates: {
112
+ main: getTemplate(),
113
+ },
114
+
115
+ datasource: {
116
+ selector: null,
117
+ },
118
+
119
+ labels: {
120
+ page: "${page}",
121
+ description: "Page ${page}",
122
+ previous: "Previous",
123
+ next: "Next",
124
+ of: "of",
125
+ },
126
+
127
+ href: "page-${page}",
128
+
129
+ currentPage: undefined,
130
+ pages: undefined,
131
+ objectsPerPage: 20,
132
+
133
+ mapping: {
134
+ pages: "sys.pagination.pages",
135
+ objectsPerPage: "sys.pagination.objectsPerPage",
136
+ currentPage: "sys.pagination.currentPage",
137
+ },
138
+
139
+ pagination: {
140
+ items: [],
141
+ },
142
+ },
143
+ initOptionsFromArguments.call(this),
144
+ );
145
+ }
146
+
147
+ /**
148
+ *
149
+ * @return {string}
150
+ */
151
+ static getTag() {
152
+ return "monster-pagination";
153
+ }
154
+
155
+ /**
156
+ *
157
+ * @return {Monster.Components.Form.Form}
158
+ */
159
+ [assembleMethodSymbol]() {;
160
+ super[assembleMethodSymbol]();
161
+
162
+ initControlReferences.call(this);
163
+ initEventHandler.call(this);
164
+
165
+ const selector = this.getOption("datasource.selector");
166
+
167
+ if (isString(selector)) {
168
+ const elements = document.querySelectorAll(selector);
169
+ if (elements.length !== 1) {
170
+ throw new Error("the selector must match exactly one element");
171
+ }
172
+
173
+ const element = elements[0];
174
+ if (!(element instanceof Datasource)) {
175
+ throw new TypeError("the element must be a datasource");
176
+ }
177
+
178
+ this[datasourceLinkedElementSymbol] = element;
179
+ element.datasource.attachObserver(
180
+ new Observer(handleDataSourceChanges.bind(this)),
181
+ );
182
+ }
183
+ }
184
+
185
+ /**
186
+ *
187
+ * @return [CSSStyleSheet]
188
+ */
189
+ static getCSSStyleSheet() {
190
+ return [PaginationStyleSheet];
191
+ }
192
+ }
193
+
194
+ /**
195
+ * @private
196
+ * @return {Select}
197
+ * @throws {Error} no shadow-root is defined
198
+ */
199
+ function initControlReferences() {;
200
+
201
+ if (!this.shadowRoot) {
202
+ throw new Error("no shadow-root is defined");
203
+ }
204
+
205
+ this[paginationElementSymbol] = this.shadowRoot.querySelector(
206
+ "[data-monster-role=pagination]",
207
+ );
208
+ }
209
+
210
+ /**
211
+ * @private
212
+ */
213
+ function initEventHandler() {
214
+ const self = this;
215
+
216
+ self[paginationElementSymbol].addEventListener("click", function (event) {
217
+ let element = null;
218
+ const datasource = self[datasourceLinkedElementSymbol];
219
+ if (!datasource) {
220
+ return;
221
+ }
222
+
223
+ element = findTargetElementFromEvent(
224
+ event,
225
+ ATTRIBUTE_ROLE,
226
+ "pagination-item",
227
+ );
228
+ if (!element) {
229
+ element = findTargetElementFromEvent(
230
+ event,
231
+ ATTRIBUTE_ROLE,
232
+ "pagination-next",
233
+ );
234
+ if (!element) {
235
+ element = findTargetElementFromEvent(
236
+ event,
237
+ ATTRIBUTE_ROLE,
238
+ "pagination-prev",
239
+ );
240
+ if (!element) {
241
+ return;
242
+ }
243
+ }
244
+ }
245
+
246
+ let page = null;
247
+
248
+ if (!element.hasAttribute("data-page-no")) {
249
+ return;
250
+ }
251
+
252
+ page = element.getAttribute("data-page-no");
253
+ event.preventDefault();
254
+
255
+ if (
256
+ !page ||
257
+ page === "" ||
258
+ page === null ||
259
+ page === undefined ||
260
+ page === "undefined" ||
261
+ page === "null"
262
+ ) {
263
+ return;
264
+ }
265
+
266
+ datasource.setParameters({ page }).reload();
267
+ });
268
+ }
269
+
270
+ /**
271
+ * This attribute can be used to pass a URL to this select.
272
+ *
273
+ * ```
274
+ * <monster-form data-monster-datasource="restapi:....."></monster-form>
275
+ * ```
276
+ *
277
+ * @private
278
+ * @return {object}
279
+ * @throws {TypeError} incorrect arguments passed for the datasource
280
+ * @throws {Error} the datasource could not be initialized
281
+ */
282
+ function initOptionsFromArguments() {;
283
+ const options = {};
284
+ const selector = this.getAttribute(ATTRIBUTE_DATASOURCE_SELECTOR);
285
+ if (selector) {
286
+ options.datasource = { selector: selector };
287
+ }
288
+
289
+ return options;
290
+ }
291
+
292
+ /**
293
+ * @private
294
+ */
295
+ function handleDataSourceChanges() {;
296
+ let pagination;
297
+
298
+ if (!this[datasourceLinkedElementSymbol]) {
299
+ return;
300
+ }
301
+
302
+ const mapping = this.getOption("mapping");
303
+ for (const key in mapping) {
304
+ const path = mapping[key];
305
+
306
+ let value;
307
+ try {
308
+ value = new Pathfinder(this[datasourceLinkedElementSymbol].data).getVia(
309
+ path,
310
+ );
311
+ this.setOption(key, value);
312
+ } catch (e) {
313
+ addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
314
+ }
315
+ }
316
+
317
+ pagination = buildPagination.call(
318
+ this,
319
+ this.getOption("currentPage"),
320
+ this.getOption("pages"),
321
+ );
322
+ this.setOption("pagination", pagination);
323
+ }
324
+
325
+ /**
326
+ *
327
+ * @param current
328
+ * @param max
329
+ * @returns {object}
330
+ */
331
+ function buildPagination(current, max) {;
332
+
333
+ let prev = current === 1 ? null : current - 1;
334
+ let next = current === max ? null : current + 1;
335
+ const itemList = [1];
336
+
337
+ if (current > 4) itemList.push("…");
338
+
339
+ const r = 2;
340
+ const r1 = current - r;
341
+ const r2 = current + r;
342
+
343
+ for (let i = r1 > 2 ? r1 : 2; i <= Math.min(max, r2); i++) itemList.push(i);
344
+
345
+ if (r2 + 1 < max) itemList.push("…");
346
+ if (r2 < max) itemList.push(max);
347
+
348
+ let prevClass = "";
349
+
350
+ if (prev === null) {
351
+ prevClass = " disabled";
352
+ }
353
+
354
+ let nextClass = "";
355
+ if (next === null) {
356
+ nextClass = " disabled";
357
+ }
358
+
359
+ const items = itemList.map((item) => {
360
+ const p = `${item}`;
361
+ const c = `${current}`;
362
+
363
+ const obj = {
364
+ pageNo: item, // as integer
365
+ page: p, // as string
366
+ current: p === c,
367
+ class: (p === c ? "current" : "").trim(),
368
+ };
369
+
370
+ if (p === "…") {
371
+ obj.class += " disabled".trim();
372
+ }
373
+
374
+ const formatter = new Formatter(obj);
375
+
376
+ obj.description = formatter.format(this.getOption("labels.description"));
377
+ obj.label = formatter.format(this.getOption("labels.page"));
378
+ obj.href =
379
+ p === "…"
380
+ ? "#"
381
+ : p === c
382
+ ? "#"
383
+ : p === "1"
384
+ ? "#"
385
+ : `#${formatter.format(this.getOption("href"))}`;
386
+ return obj;
387
+ });
388
+
389
+ const nextNo = next;
390
+ next = `${next}`;
391
+
392
+ const nextHref =
393
+ next === "null"
394
+ ? "#"
395
+ : `#${new Formatter({ page: next }).format(this.getOption("href"))}`;
396
+ const prevNo = prev;
397
+ prev = `${prev}`;
398
+ const prevHref =
399
+ prev === "null"
400
+ ? "#"
401
+ : `#${new Formatter({ page: prev }).format(this.getOption("href"))}`;
402
+
403
+ return {
404
+ current,
405
+ nextNo,
406
+ next,
407
+ nextClass,
408
+ nextHref,
409
+ prevNo,
410
+ prev,
411
+ prevClass,
412
+ prevHref,
413
+ items,
414
+ };
415
+ }
416
+
417
+ /**
418
+ * @private
419
+ * @return {string}
420
+ */
421
+ function getTemplate() {
422
+ // language=HTML
423
+ return `
424
+ <template id="items">
425
+ <li><a data-monster-attributes="class path:items.class,
426
+ href path:items.href,
427
+ aria-label path:items.description,
428
+ disabled path:items.disabled:?disabled:undefined,
429
+ data-page-no path:items.pageNo,
430
+ aria-current path:items.current"
431
+ data-monster-role="pagination-item"
432
+ data-monster-replace="path:items.label"></a></li>
433
+ </template>
434
+
435
+ <div data-monster-role="control">
436
+ <nav data-monster-role="pagination" role="navigation" aria-label="pagination">
437
+ <ul class="pagination-list" data-monster-insert="items path:pagination.items"
438
+ data-monster-select-this="true">
439
+ <li part="pagination-prev"><a data-monster-role="pagination-prev"
440
+ data-monster-attributes="
441
+ class path:pagination.prevClass | prefix: previous,
442
+ data-page-no path:pagination.prevNo,
443
+ href path:pagination.prevHref | prefix: #"
444
+ data-monster-replace="path:labels.previous">Previous</a></li>
445
+ <li part="pagination-next"><a data-monster-role="pagination-next"
446
+ data-monster-attributes="class path:pagination.nextClass | prefix: next,
447
+ data-page-no path:pagination.nextNo,
448
+ href path:pagination.nextHref | prefix: #"
449
+ data-monster-replace="path:labels.next">Next</a></li>
450
+ </ul>
451
+ </nav>
452
+ </div>
453
+ `;
454
+ }
455
+
456
+ registerCustomElement(Pagination);
@@ -0,0 +1,123 @@
1
+ @import "../../style/normalize.pcss";
2
+ @import "../../style/mixin/button.pcss";
3
+ @import "../../style/button.pcss";
4
+ @import "../../style/mixin/typography.pcss";
5
+ @import "../../style/mixin/hover.pcss";
6
+ @import "../../style/control.pcss";
7
+ @import "../../style/property.pcss";
8
+ @import "../../style/link.pcss";
9
+
10
+
11
+ [data-monster-role=control] {
12
+ display: flex;
13
+ align-items: center;
14
+ flex-direction: row;
15
+ justify-content: flex-end;
16
+
17
+ & [data-monster-role=dots] {
18
+ display: flex;
19
+ flex-direction: row;
20
+ justify-content: flex-start;
21
+ padding: 0;
22
+ margin: 0 15px 0 0;
23
+ //margin-left: 10px;
24
+
25
+ & li {
26
+ list-style: none;
27
+ padding: 0;
28
+ margin: 0 5px 0 0;
29
+ display: flex;
30
+ background-clip: border-box;
31
+
32
+ & .is-visible {
33
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3C/svg%3E");
34
+ background-repeat: no-repeat no-repeat;
35
+ background-position: center center;
36
+ background-size: cover;
37
+ width: 8px;
38
+ height: 8px;
39
+ }
40
+
41
+ & .is-hidden {
42
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='8'/%3E%3C/svg%3E");
43
+ background-repeat: no-repeat no-repeat;
44
+ background-position: center center;
45
+ background-size: cover;
46
+ width: 8px;
47
+ height: 8px;
48
+ }
49
+
50
+ & :hover, & :focus {
51
+ background-clip: border-box;
52
+ }
53
+
54
+
55
+ }
56
+
57
+
58
+
59
+ }
60
+
61
+ & [data-monster-role=settings-layer] {
62
+
63
+ background-color: var(--monster-bg-color-primary-4);
64
+ color: var(--monster-color-primary-4);
65
+ padding: 1rem;
66
+ border-radius: 4px;
67
+ z-index: var(--monster-z-index-popover);
68
+ display: none;
69
+
70
+ &.visible {
71
+ display: block;
72
+ }
73
+
74
+ & label {
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: flex-start;
78
+ margin: 0;
79
+ padding: 0;
80
+ cursor: pointer;
81
+
82
+ & input {
83
+ accent-color: var(--monster-bg-color-primary-4);
84
+ margin: 0 0.5rem 0 0;
85
+ }
86
+ }
87
+
88
+ & [data-monster-role=settings-popup-list] {
89
+ display: grid;
90
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
91
+ grid-gap: 0.1rem 1rem;
92
+
93
+ }
94
+
95
+ }
96
+
97
+
98
+ & a[data-monster-role=settings-button] {
99
+ display: flex;
100
+ align-items: center;
101
+
102
+ color: var(--monster-color-primary-1);
103
+ background: none;
104
+
105
+ &:after {
106
+ content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M0 1.5A1.5 1.5 0 0 1 1.5 0h13A1.5 1.5 0 0 1 16 1.5v13a1.5 1.5 0 0 1-1.5 1.5h-13A1.5 1.5 0 0 1 0 14.5v-13zM1.5 1a.5.5 0 0 0-.5.5v13a.5.5 0 0 0 .5.5H5V1H1.5zM10 15V1H6v14h4zm1 0h3.5a.5.5 0 0 0 .5-.5v-13a.5.5 0 0 0-.5-.5H11v14z'/%3E%3C/svg%3E");
107
+ margin: 2px 3px 0 5px;
108
+ padding-top: 4px;
109
+ }
110
+
111
+
112
+ }
113
+
114
+ &:hover {
115
+ color: var(--monster-color-primary-1);
116
+ }
117
+
118
+
119
+ &.hidden {
120
+ display: none;
121
+ }
122
+
123
+ }
@@ -0,0 +1,13 @@
1
+ @import "../../style/normalize.pcss";
2
+ @import "../../style/display.pcss";
3
+ @import "../../style/mixin/button.pcss";
4
+ @import "../../style/button.pcss";
5
+ @import "../../style/mixin/typography.pcss";
6
+ @import "../../style/mixin/hover.pcss";
7
+ @import "../../style/control.pcss";
8
+ @import "../../style/property.pcss";
9
+ @import "../../style/ripple.pcss";
10
+ @import "../../style/badge.pcss";
11
+ @import "../../style/link.pcss";
12
+
13
+
@@ -0,0 +1,16 @@
1
+
2
+
3
+ :host {
4
+ display: none;
5
+ }
6
+
7
+ :host(.intersection-observer) {
8
+ display: block;
9
+ width: 1px;
10
+ height: 1px;
11
+ overflow: hidden;
12
+ }
13
+
14
+
15
+
16
+