@schukai/monster 3.54.0 → 3.55.1

Sign up to get free protection for your applications and to get access to all the features.
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
+ }