@schukai/monster 3.54.0 → 3.55.1

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 (124) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/package.json +1 -1
  3. package/source/components/datatable/datasource/rest.mjs +93 -57
  4. package/source/components/datatable/datatable/header.mjs +8 -0
  5. package/source/components/datatable/datatable.mjs +88 -44
  6. package/source/components/datatable/embedded-pagination.mjs +24 -43
  7. package/source/components/datatable/filter/util.mjs +138 -0
  8. package/source/components/datatable/filter.mjs +418 -174
  9. package/source/components/datatable/pagination.mjs +26 -2
  10. package/source/components/datatable/status.mjs +226 -0
  11. package/source/components/datatable/style/datatable.pcss +1 -0
  12. package/source/components/datatable/style/embedded-pagination.pcss +59 -2
  13. package/source/components/datatable/style/filter.pcss +4 -0
  14. package/source/components/datatable/style/pagination.pcss +28 -4
  15. package/source/components/datatable/style/status.pcss +42 -0
  16. package/source/components/datatable/stylesheet/column-bar.mjs +15 -9
  17. package/source/components/datatable/stylesheet/dataset.mjs +14 -8
  18. package/source/components/datatable/stylesheet/datasource.mjs +14 -8
  19. package/source/components/datatable/stylesheet/datatable.mjs +15 -9
  20. package/source/components/datatable/stylesheet/embedded-pagination.mjs +14 -8
  21. package/source/components/datatable/stylesheet/filter-button.mjs +15 -9
  22. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +14 -8
  23. package/source/components/datatable/stylesheet/filter-date-range.mjs +14 -8
  24. package/source/components/datatable/stylesheet/filter-range.mjs +14 -8
  25. package/source/components/datatable/stylesheet/filter.mjs +15 -9
  26. package/source/components/datatable/stylesheet/pagination.mjs +15 -9
  27. package/source/components/datatable/stylesheet/select-filter.mjs +14 -8
  28. package/source/components/datatable/stylesheet/status.mjs +33 -0
  29. package/source/components/form/action-button.mjs +3 -1
  30. package/source/components/form/api-button.mjs +1 -1
  31. package/source/components/form/button-bar.mjs +1 -1
  32. package/source/components/form/button.mjs +1 -1
  33. package/source/components/form/confirm-button.mjs +3 -1
  34. package/source/components/form/context-error.mjs +272 -0
  35. package/source/components/form/context-help.mjs +7 -5
  36. package/source/components/form/form.mjs +4 -2
  37. package/source/components/form/message-state-button.mjs +4 -2
  38. package/source/components/form/popper-button.mjs +9 -4
  39. package/source/components/form/popper.mjs +11 -3
  40. package/source/components/form/reload.mjs +1 -1
  41. package/source/components/form/select.mjs +3 -3
  42. package/source/components/form/shadow-reload.mjs +1 -1
  43. package/source/components/form/state-button.mjs +4 -1
  44. package/source/components/form/style/context-error.pcss +32 -0
  45. package/source/components/form/style/context-help.pcss +22 -5
  46. package/source/components/form/stylesheet/action-button.mjs +14 -8
  47. package/source/components/form/stylesheet/api-button.mjs +14 -8
  48. package/source/components/form/stylesheet/button-bar.mjs +14 -8
  49. package/source/components/form/stylesheet/button.mjs +14 -8
  50. package/source/components/form/stylesheet/confirm-button.mjs +14 -8
  51. package/source/components/form/stylesheet/context-error.mjs +33 -0
  52. package/source/components/form/stylesheet/context-help.mjs +15 -9
  53. package/source/components/form/stylesheet/form.mjs +14 -8
  54. package/source/components/form/stylesheet/message-state-button.mjs +14 -8
  55. package/source/components/form/stylesheet/popper-button.mjs +14 -8
  56. package/source/components/form/stylesheet/popper.mjs +14 -8
  57. package/source/components/form/stylesheet/select.mjs +15 -9
  58. package/source/components/form/stylesheet/state-button.mjs +14 -8
  59. package/source/components/form/stylesheet/tabs.mjs +15 -9
  60. package/source/components/form/stylesheet/tree-select.mjs +14 -8
  61. package/source/components/form/tabs.mjs +53 -7
  62. package/source/components/form/template.mjs +1 -1
  63. package/source/components/form/tree-select.mjs +1 -1
  64. package/source/components/host/collapse.mjs +20 -5
  65. package/source/components/host/config-manager.mjs +41 -2
  66. package/source/components/host/host.mjs +14 -0
  67. package/source/components/host/stylesheet/call-button.mjs +15 -9
  68. package/source/components/host/stylesheet/collapse.mjs +14 -8
  69. package/source/components/host/stylesheet/config-manager.mjs +14 -8
  70. package/source/components/host/stylesheet/details.mjs +14 -8
  71. package/source/components/host/stylesheet/host.mjs +14 -8
  72. package/source/components/host/stylesheet/overlay.mjs +15 -9
  73. package/source/components/host/stylesheet/toggle-button.mjs +15 -9
  74. package/source/components/host/stylesheet/viewer.mjs +14 -8
  75. package/source/components/host/util.mjs +6 -1
  76. package/source/components/notify/stylesheet/message.mjs +15 -9
  77. package/source/components/notify/stylesheet/notify.mjs +14 -8
  78. package/source/components/state/stylesheet/log.mjs +14 -8
  79. package/source/components/state/stylesheet/state.mjs +14 -8
  80. package/source/components/stylesheet/badge.mjs +14 -8
  81. package/source/components/stylesheet/border.mjs +14 -8
  82. package/source/components/stylesheet/button.mjs +14 -8
  83. package/source/components/stylesheet/card.mjs +14 -8
  84. package/source/components/stylesheet/color.mjs +14 -8
  85. package/source/components/stylesheet/common.mjs +14 -8
  86. package/source/components/stylesheet/control.mjs +14 -8
  87. package/source/components/stylesheet/data-grid.mjs +14 -8
  88. package/source/components/stylesheet/display.mjs +14 -8
  89. package/source/components/stylesheet/floating-ui.mjs +14 -8
  90. package/source/components/stylesheet/form.mjs +14 -8
  91. package/source/components/stylesheet/host.mjs +14 -8
  92. package/source/components/stylesheet/icons.mjs +15 -9
  93. package/source/components/stylesheet/link.mjs +14 -8
  94. package/source/components/stylesheet/normalize.mjs +14 -8
  95. package/source/components/stylesheet/popper.mjs +14 -8
  96. package/source/components/stylesheet/property.mjs +14 -8
  97. package/source/components/stylesheet/ripple.mjs +14 -8
  98. package/source/components/stylesheet/skeleton.mjs +14 -8
  99. package/source/components/stylesheet/space.mjs +14 -8
  100. package/source/components/stylesheet/spinner.mjs +14 -8
  101. package/source/components/stylesheet/table.mjs +14 -8
  102. package/source/components/stylesheet/theme.mjs +14 -8
  103. package/source/components/stylesheet/typography.mjs +14 -8
  104. package/source/components/tree-menu/stylesheet/tree-menu.mjs +14 -8
  105. package/source/data/transformer.mjs +38 -43
  106. package/source/dom/attributes.mjs +5 -5
  107. package/source/dom/customelement.mjs +1 -1
  108. package/source/dom/updater.mjs +14 -5
  109. package/source/dom/util.mjs +42 -0
  110. package/source/i18n/providers/embed.mjs +3 -3
  111. package/source/monster.mjs +5 -0
  112. package/source/text/formatter.mjs +2 -2
  113. package/source/types/noderecursiveiterator.mjs +9 -7
  114. package/source/types/observer.mjs +1 -1
  115. package/source/types/version.mjs +1 -1
  116. package/source/util/sleep.mjs +17 -0
  117. package/test/cases/components/form/button.mjs +2 -1
  118. package/test/cases/components/form/select.mjs +1 -1
  119. package/test/cases/components/form/tree-select.mjs +1 -1
  120. package/test/cases/data/transformer.mjs +2 -2
  121. package/test/cases/dom/updater.mjs +67 -46
  122. package/test/cases/monster.mjs +1 -1
  123. package/test/web/test.html +2 -2
  124. package/test/web/tests.js +18 -13
package/CHANGELOG.md CHANGED
@@ -1,9 +1,34 @@
1
1
 
2
+ ## [3.55.1] - 2024-01-22
3
+
4
+ ### Bug Fixes
5
+
6
+ - catch errors [#133](https://gitlab.schukai.com/oss/libraries/javascript/monster/issues/133)
7
+ - catch errors [#133](https://gitlab.schukai.com/oss/libraries/javascript/monster/issues/133)
8
+ - check parameter [#132](https://gitlab.schukai.com/oss/libraries/javascript/monster/issues/132)
9
+ ### Changes
10
+
11
+ - doc
12
+ - lint + formatt
13
+ - update nixos to 23-11
14
+
15
+ ## [3.55.0] - 2023-11-29
16
+
17
+ ### Add Features
18
+
19
+ - various changes [#131](https://gitlab.schukai.com/oss/libraries/javascript/monster/issues/131)
20
+ ### Changes
21
+
22
+ - release and publish to npm new version 3.55.0
23
+
2
24
  ## [3.54.0] - 2023-11-23
3
25
 
4
26
  ### Add Features
5
27
 
6
28
  - new closeOnSelect feature
29
+ ### Changes
30
+
31
+ - release and publish to npm new version 3.54.0
7
32
 
8
33
  ## [3.53.0] - 2023-11-11
9
34
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schukai/monster",
3
- "version": "3.54.0",
3
+ "version": "3.55.1",
4
4
  "description": "Monster is a simple library for creating fast, robust and lightweight websites.",
5
5
  "keywords": [
6
6
  "framework",
@@ -80,24 +80,35 @@ class Rest extends Datasource {
80
80
  }
81
81
 
82
82
  /**
83
- * To set the options via the html tag the attribute `data-monster-options` must be used.
84
- * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
85
- *
86
- * The individual configuration values can be found in the table.
87
- *
88
- * @property {Object} templates Template definitions
89
- * @property {string} templates.main Main template
90
- * @property {Object} features Feature definitions
91
- * @property {boolean} features.autoInit If true, the component is initialized automatically
92
- * @property {Object} read Read configuration
93
- * @property {string} read.url The url of the rest api
94
- * @property {string} read.method The method of the rest api
95
- * @property {Object} read.parameters The parameters of the rest api
96
- * @property {Object} read.parameters.filter The filter of the rest api
97
- * @property {Object} read.parameters.orderBy The order by of the rest api
98
- * @property {Object} read.parameters.page The page of the rest api
99
- * @property {Object} write Write configuration
100
- */
83
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
84
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
85
+ *
86
+ * The individual configuration values can be found in the table.
87
+ *
88
+ * @property {Object} templates Template definitions
89
+ * @property {string} templates.main Main template
90
+ * @property {Object} features Feature definitions
91
+ * @property {boolean} features.autoInit If true, the component is initialized automatically
92
+ * @property {boolean} features.filter If true, the component is initialized automatically
93
+ * @property {Object} autoInit Auto init definitions
94
+ * @property {boolean} autoInit.intersectionObserver If true, the intersection observer is initialized automatically
95
+ * @property {boolean} autoInit.oneTime If true, the intersection observer is initialized only once
96
+ * @property {Object} filter Filter definitions
97
+ * @property {string} filter.id The id of the filter control
98
+ * @property {Object} datatable Datatable definitions
99
+ * @property {string} datatable.id The id of the datatable control
100
+ * @property {Object} response Response definitions
101
+ * @property {string} response.errorMessagePath The path to the error message in the response
102
+ * @property {Object} read Read configuration
103
+ * @property {string} read.url The url of the rest api
104
+ * @property {string} read.method The method of the rest api
105
+ * @property {Object} read.parameters The parameters of the rest api
106
+ * @property {Object} read.parameters.filter The filter of the rest api
107
+ * @property {Object} read.parameters.orderBy The order by of the rest api
108
+ * @property {Object} read.parameters.page The page of the rest api
109
+ * @property {Object} write Write configuration
110
+
111
+ */
101
112
  get defaults() {
102
113
  const restOptions = new RestAPI().defaults;
103
114
 
@@ -126,6 +137,10 @@ class Rest extends Datasource {
126
137
  id: undefined,
127
138
  },
128
139
 
140
+ datatable: {
141
+ id: undefined,
142
+ },
143
+
129
144
  response: {
130
145
  errorMessagePath: "sys.message",
131
146
  },
@@ -176,7 +191,7 @@ class Rest extends Datasource {
176
191
  * Fetches the data from the rest api
177
192
  * @returns {Promise<never>|*}
178
193
  */
179
- fetch() {
194
+ fetch() {;
180
195
  const opt = clone(this.getOption("read"));
181
196
  this[dataSourceSymbol].setOption("read", opt);
182
197
 
@@ -190,7 +205,32 @@ class Rest extends Datasource {
190
205
  url = formatter.format(url);
191
206
 
192
207
  this[dataSourceSymbol].setOption("read.url", url);
193
- return this[dataSourceSymbol].read();
208
+
209
+ return new Promise((resolve, reject) => {
210
+ fireCustomEvent(this, "monster-datasource-fetch", {
211
+ datasource: this,
212
+ });
213
+
214
+ setTimeout(() => {
215
+ this[dataSourceSymbol]
216
+ .read()
217
+ .then((response) => {
218
+ fireCustomEvent(this, "monster-datasource-fetched", {
219
+ datasource: this,
220
+ });
221
+
222
+ resolve(response);
223
+ })
224
+ .catch((error) => {
225
+ fireCustomEvent(this, "monster-datasource-error", {
226
+ error: error,
227
+ });
228
+
229
+ addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, error.toString());
230
+ reject(error);
231
+ });
232
+ }, 0);
233
+ });
194
234
  }
195
235
 
196
236
  /**
@@ -277,37 +317,45 @@ function initFilter() {
277
317
  const query = filterControl.getOption("query", undefined);
278
318
  this.setParameters({ query: query });
279
319
  this.fetch()
280
- .then(() => {
281
- this.dispatchEvent(new CustomEvent("reload", { bubbles: true }));
282
- filterControl?.showSuccess();
320
+ .then((response) => {
321
+ if (!(response instanceof Response)) {
322
+ throw new Error("Response is not an instance of Response");
323
+ }
324
+
325
+ if (response?.ok === true) {
326
+ this.dispatchEvent(new CustomEvent("reload", { bubbles: true }));
327
+ filterControl?.showSuccess();
328
+ }
329
+
330
+ response
331
+ .json()
332
+ .then((json) => {
333
+ const path = new Pathfinder(json);
334
+ const error = path.getVia(
335
+ this.getOption("response.errorMessagePath"),
336
+ );
337
+ if (error) {
338
+ filterControl?.showFailureMessage(error);
339
+ return;
340
+ }
341
+
342
+ filterControl?.showFailureMessage(e.message);
343
+ })
344
+ .catch((e) => {
345
+ filterControl?.showFailureMessage(e.message);
346
+ });
283
347
  })
284
348
  .catch((e) => {
285
349
  this.dispatchEvent(
286
350
  new CustomEvent("error", { bubbles: true, detail: e }),
287
351
  );
288
352
 
289
- const response = e?.getResponse();
290
- if (response && response.status === 400) {
291
- response
292
- .json()
293
- .then((json) => {
294
- const path = new Pathfinder(json);
295
- const error = path.getVia(
296
- this.getOption("response.errorMessagePath"),
297
- );
298
- if (error) {
299
- filterControl?.showFailureMessage(error);
300
- return;
301
- }
302
-
303
- filterControl?.showFailureMessage(e.message);
304
- })
305
- .catch((e) => {
306
- filterControl?.showFailureMessage(e.message);
307
- });
308
- } else {
309
- filterControl?.showFailureMessage(e.message);
353
+ if (!(e instanceof Error)) {
354
+ e = new Error(e);
310
355
  }
356
+
357
+ filterControl?.showFailureMessage(e.message);
358
+ return Promise.reject(e);
311
359
  });
312
360
  });
313
361
 
@@ -329,19 +377,7 @@ function initAutoInit() {
329
377
  }
330
378
 
331
379
  setTimeout(() => {
332
- this.fetch()
333
- .then(() => {
334
- fireCustomEvent(this, "monster-datasource-fetched", {
335
- datasource: this,
336
- });
337
- })
338
- .catch((error) => {
339
- fireCustomEvent(this, "monster-datasource-error", {
340
- error: error,
341
- });
342
-
343
- addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
344
- });
380
+ this.fetch().catch(() => {});
345
381
  }, 0);
346
382
  }
347
383
 
@@ -110,6 +110,14 @@ class Header extends Base {
110
110
  this.setInternal("direction", direction);
111
111
  }
112
112
 
113
+ /**
114
+ *
115
+ * @param direction
116
+ */
117
+ setDirection(direction) {
118
+ this.setInternal("direction", direction);
119
+ }
120
+
113
121
  /**
114
122
  * @param {string} field
115
123
  */
@@ -40,6 +40,7 @@ import {
40
40
  DIRECTION_DESC,
41
41
  DIRECTION_NONE,
42
42
  } from "./datatable/header.mjs";
43
+ import { getStoredFilterConfigKey } from "./filter/util.mjs";
43
44
  import { DatatableStyleSheet } from "./stylesheet/datatable.mjs";
44
45
  import {
45
46
  handleDataSourceChanges,
@@ -270,31 +271,48 @@ class DataTable extends CustomElement {
270
271
  getHostConfig
271
272
  .call(this, getColumnVisibilityConfigKey)
272
273
  .then((config) => {
273
- try {
274
- initGridAndStructs.call(this, config);
275
- } catch (error) {
276
- addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
277
- }
278
-
279
- updateColumnBar.call(this);
274
+ const headerOrderMap = new Map();
275
+
276
+ getHostConfig
277
+ .call(this, getStoredOrderConfigKey)
278
+ .then((orderConfig) => {
279
+ if (isArray(orderConfig) || orderConfig.length > 0) {
280
+ for (let i = 0; i < orderConfig.length; i++) {
281
+ const item = orderConfig[i];
282
+ const parts = item.split(" ");
283
+ const field = parts[0];
284
+ const direction = parts[1] || DIRECTION_ASC;
285
+ headerOrderMap.set(field, direction);
286
+ }
287
+ }
288
+ })
289
+ .then(() => {
290
+ try {
291
+ initGridAndStructs.call(this, config, headerOrderMap);
292
+ } catch (error) {
293
+ addAttributeToken(
294
+ this,
295
+ ATTRIBUTE_ERRORMESSAGE,
296
+ error?.message || error.toString(),
297
+ );
298
+ }
299
+
300
+ updateColumnBar.call(this);
301
+ })
302
+ .catch((error) => {
303
+ addAttributeToken(
304
+ this,
305
+ ATTRIBUTE_ERRORMESSAGE,
306
+ error?.message || error.toString(),
307
+ );
308
+ });
280
309
  })
281
310
  .catch((error) => {
282
- addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
283
- });
284
-
285
- getHostConfig
286
- .call(this, getFilterConfigKey)
287
- .then((config) => {
288
- try {
289
- // initGridAndStructs.call(self, config);
290
- } catch (error) {
291
- // addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, String(error));
292
- }
293
-
294
- //updateColumnBar.call(self);
295
- })
296
- .catch((error) => {
297
- addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
311
+ addAttributeToken(
312
+ this,
313
+ ATTRIBUTE_ERRORMESSAGE,
314
+ error?.message || error.toString(),
315
+ );
298
316
  });
299
317
  }
300
318
 
@@ -340,14 +358,13 @@ function getHostConfig(callback) {
340
358
  }
341
359
 
342
360
  const configKey = callback.call(this);
343
- return host
344
- .getConfig(configKey)
345
- .then((config) => {
346
- return config;
347
- })
348
- .catch(() => {
361
+ return host.hasConfig(configKey).then((hasConfig) => {
362
+ if (hasConfig) {
363
+ return host.getConfig(configKey);
364
+ } else {
349
365
  return {};
350
- });
366
+ }
367
+ });
351
368
  }
352
369
 
353
370
  /**
@@ -367,7 +384,7 @@ function updateColumnBar() {
367
384
  }
368
385
 
369
386
  columns.push({
370
- visible: mode === ATTRIBUTE_DATATABLE_MODE_HIDDEN ? false : true,
387
+ visible: mode !== ATTRIBUTE_DATATABLE_MODE_HIDDEN,
371
388
  name: header.label,
372
389
  index: header.index,
373
390
  });
@@ -480,11 +497,8 @@ function initEventHandler() {
480
497
  ATTRIBUTE_DATATABLE_SORTABLE,
481
498
  `${headers[index].field} ${headers[index].direction}`,
482
499
  );
483
- setDataSource.call(
484
- self,
485
- { orderBy: createOrderStatement(headers) },
486
- true,
487
- );
500
+
501
+ storeOrderStatement.call(self, true);
488
502
  }, 0);
489
503
  }
490
504
  });
@@ -493,7 +507,7 @@ function initEventHandler() {
493
507
  /**
494
508
  * @private
495
509
  */
496
- function initGridAndStructs(hostConfig) {
510
+ function initGridAndStructs(hostConfig, headerOrderMap) {
497
511
  const rowID = this.getOption("templateMapping.row-key");
498
512
 
499
513
  if (!this[gridElementSymbol]) {
@@ -597,18 +611,48 @@ function initGridAndStructs(hostConfig) {
597
611
  mode: mode,
598
612
  grid: grid,
599
613
  labelKey: labelKey,
614
+ direction: headerOrderMap.get(field) || DIRECTION_NONE,
600
615
  });
601
616
 
602
617
  headers.push(header);
603
618
  }
604
619
 
605
- const statement = createOrderStatement(headers);
606
- setDataSource.call(
607
- this,
608
- { orderBy: statement },
609
- this.getOption("features.autoInit"),
610
- );
611
620
  this.setOption("headers", headers);
621
+ storeOrderStatement.call(this, this.getOption("features.autoInit"));
622
+ }
623
+
624
+ /**
625
+ * @private
626
+ * @returns {string}
627
+ */
628
+ export function getStoredOrderConfigKey() {
629
+ return generateUniqueConfigKey("datatable", this?.id, "stored-order");
630
+ }
631
+
632
+ /**
633
+ * @private
634
+ */
635
+ function storeOrderStatement(doFetch) {
636
+ const headers = this.getOption("headers");
637
+ const statement = createOrderStatement(headers);
638
+ setDataSource.call(this, { orderBy: statement }, doFetch);
639
+
640
+ const document = getDocument();
641
+ const host = document.querySelector("monster-host");
642
+ if (!(host && this.id)) {
643
+ return;
644
+ }
645
+
646
+ const configKey = getStoredOrderConfigKey.call(this);
647
+
648
+ // statement explode with , and remove all empty
649
+ const list = statement.split(",").filter((item) => item.trim() !== "");
650
+ if (list.length === 0) {
651
+ // host.deleteConfig(configKey);
652
+ return;
653
+ }
654
+
655
+ host.setConfig(configKey, list);
612
656
  }
613
657
 
614
658
  /**
@@ -736,7 +780,7 @@ function getEmptyTemplate() {
736
780
  <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"/>
737
781
  </svg>
738
782
  </div>
739
- <div part="content" monster-replace="path:labels.theListContainsNoEntries">
783
+ <div part="content" data-monster-replace="path:labels.theListContainsNoEntries">
740
784
  The list contains no entries.
741
785
  </div>
742
786
  </monster-state>`;
@@ -3,9 +3,13 @@
3
3
  * SPDX-License-Identifier: AGPL-3.0
4
4
  */
5
5
 
6
- import { registerCustomElement } from "../../dom/customelement.mjs";
6
+ import {
7
+ assembleMethodSymbol,
8
+ registerCustomElement,
9
+ } from "../../dom/customelement.mjs";
7
10
  import { EmbeddedPaginationStyleSheet } from "./stylesheet/embedded-pagination.mjs";
8
11
  import { instanceSymbol } from "../../constants.mjs";
12
+
9
13
  import "../form/select.mjs";
10
14
  import { Pagination } from "./pagination.mjs";
11
15
 
@@ -55,6 +59,21 @@ class EmbeddedPagination extends Pagination {
55
59
  return Symbol.for("@schukai/monster/components/embedded-pagination");
56
60
  }
57
61
 
62
+ [assembleMethodSymbol]() {
63
+ super[assembleMethodSymbol]();
64
+ }
65
+
66
+ get defaults() {
67
+ return Object.assign({}, super.defaults, {
68
+ classes: {
69
+ spinner: "monster-spinner monster-theme-primary-3",
70
+ spinnerContainer: "monster-theme-primary-2 ",
71
+ error: "monster-theme-error-2 monster-bg-color-primary-2",
72
+ errorContainer: "monster-theme-primary-2",
73
+ },
74
+ });
75
+ }
76
+
58
77
  /**
59
78
  *
60
79
  * @return {string}
@@ -64,50 +83,12 @@ class EmbeddedPagination extends Pagination {
64
83
  }
65
84
 
66
85
  /**
67
- *
68
- * @return {CSSStyleSheet[]}
86
+ * @private
87
+ * @returns {CSSStyleSheet}
69
88
  */
70
- static getCSSStyleSheet() {
71
- return [EmbeddedPaginationStyleSheet];
89
+ static getControlCSSStyleSheet() {
90
+ return EmbeddedPaginationStyleSheet;
72
91
  }
73
92
  }
74
93
 
75
- /**
76
- * @private
77
- * @return {string}
78
- */
79
- function getTemplate() {
80
- // language=HTML
81
- return `
82
- <template id="items">
83
- <li><a data-monster-attributes="class path:items.class,
84
- href path:items.href,
85
- aria-label path:items.description,
86
- disabled path:items.disabled:?disabled:undefined,
87
- data-page-no path:items.pageNo,
88
- aria-current path:items.current"
89
- data-monster-role="pagination-item"
90
- data-monster-replace="path:items.label"></a></li>
91
- </template>
92
-
93
- <div data-monster-role="control">
94
- <nav data-monster-role="pagination" role="navigation" aria-label="pagination">
95
- <ul class="pagination-list" data-monster-insert="items path:pagination.items">
96
- <li part="pagination-prev"><a data-monster-role="pagination-prev"
97
- data-monster-attributes="
98
- class path:pagination.prevClass | prefix: previous,
99
- data-page-no path:pagination.prevNo,
100
- href path:pagination.prevHref | prefix: #"
101
- data-monster-replace="path:labels.previous">Previous</a></li>
102
- <li part="pagination-next"><a data-monster-role="pagination-next"
103
- data-monster-attributes="class path:pagination.nextClass | prefix: next,
104
- data-page-no path:pagination.nextNo,
105
- href path:pagination.nextHref | prefix: #"
106
- data-monster-replace="path:labels.next">Next</a></li>
107
- </ul>
108
- </nav>
109
- </div>
110
- `;
111
- }
112
-
113
94
  registerCustomElement(EmbeddedPagination);
@@ -0,0 +1,138 @@
1
+ import { generateUniqueConfigKey } from "../../host/util.mjs";
2
+
3
+ /**
4
+ * @private
5
+ * @returns {string}
6
+ */
7
+ export function getFilterConfigKey() {
8
+ return generateUniqueConfigKey("datatable", this?.id, "filter");
9
+ }
10
+
11
+ /**
12
+ * @private
13
+ * @returns {string}
14
+ */
15
+ export function getStoredFilterConfigKey() {
16
+ return generateUniqueConfigKey("datatable", this?.id, "stored-filter");
17
+ }
18
+
19
+ /**
20
+ * @private
21
+ * @param {String} str
22
+ * @param {String} field
23
+ * @returns {String}
24
+ * @throws {Error} if no field is defined
25
+ */
26
+ export function parseDateInput(str, field) {
27
+ if (!str) {
28
+ return "";
29
+ }
30
+
31
+ if (!field) {
32
+ throw new Error("no field is defined");
33
+ }
34
+
35
+ // Define the supported formats
36
+ //let formats = ['DD-MM-YYYY', 'MM-DD-YYYY', 'YYYY-MM-DD', 'YYYY/MM/DD', 'DD.MM.YYYY'];
37
+ const formats = ["YYYY-MM-DD"];
38
+ // Determine the current date format of the localization
39
+ const currentDateFormat = new Intl.DateTimeFormat()
40
+ .format(new Date())
41
+ .replace(/\d/g, "D");
42
+ // formats.push(currentDateFormat);
43
+
44
+ // Run through the supported formats and try to parse the date
45
+ for (let i = 0; i < formats.length; i++) {
46
+ const format = formats[i];
47
+ // Replace the corresponding placeholders in the format string with regular expressions
48
+
49
+ try {
50
+ const pattern = format
51
+ .replace("DD", "\\d{2}")
52
+ .replace("MM", "\\d{2}")
53
+ .replace("YYYY", "\\d{4}");
54
+ const rangePattern =
55
+ "(?<from>" + pattern + ")\\s*-\\s*(?<to>" + pattern + ")";
56
+
57
+ const rangeRegex = new RegExp("^" + rangePattern + "$", "g");
58
+
59
+ if (rangeRegex.test(str)) {
60
+ rangeRegex.lastIndex = 0;
61
+
62
+ const rangeResult = rangeRegex.exec(str);
63
+
64
+ if (!rangeResult) {
65
+ continue;
66
+ }
67
+
68
+ const from = rangeResult?.groups?.from;
69
+ const to = rangeResult?.groups?.to;
70
+
71
+ if (from && to) {
72
+ return (
73
+ "(" +
74
+ field +
75
+ ">='" +
76
+ from +
77
+ " 00:00:00' AND " +
78
+ field +
79
+ "<='" +
80
+ to +
81
+ " 23:59:59')"
82
+ );
83
+ }
84
+
85
+ if (from) {
86
+ return "(" + field + ">='" + from + " 00:00:00')";
87
+ } else if (to) {
88
+ return "(" + field + "<='" + to + "' 23:59:59')";
89
+ }
90
+
91
+ return "false";
92
+ }
93
+
94
+ const prefix = str.substring(0, 1) === "-";
95
+ const suffix = str.substring(str.length - 1, str.length) === "-";
96
+
97
+ if (prefix) {
98
+ str = str.substring(1, str.length);
99
+ } else if (suffix) {
100
+ str = str.substring(0, str.length - 1);
101
+ }
102
+
103
+ const regex = new RegExp("^(?<date>" + pattern + ")$", "g");
104
+ if (regex.test(str)) {
105
+ regex.lastIndex = 0;
106
+ const result = regex.exec(str);
107
+
108
+ if (!result) {
109
+ continue;
110
+ }
111
+
112
+ const date = result?.groups?.date;
113
+ if (date) {
114
+ if (prefix) {
115
+ return "(" + field + "<='" + date + " 23:59:59')";
116
+ } else if (suffix) {
117
+ return "(" + field + ">='" + date + "' 00:00:00')";
118
+ }
119
+ return (
120
+ "(" +
121
+ field +
122
+ ">='" +
123
+ date +
124
+ " 00:00:00' AND " +
125
+ field +
126
+ "<='" +
127
+ date +
128
+ " 23:59:59')"
129
+ );
130
+ } else {
131
+ return "false";
132
+ }
133
+ }
134
+ } catch (e) {}
135
+ }
136
+
137
+ return "false";
138
+ }