@schukai/monster 4.148.8 → 4.149.0

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 (209) hide show
  1. package/package.json +1 -1
  2. package/source/components/accessibility/stylesheet/locale-picker.mjs +61 -1
  3. package/source/components/content/image-editor.mjs +79 -11
  4. package/source/components/content/style/copy.pcss +1 -1
  5. package/source/components/content/stylesheet/camera-capture.mjs +1 -1
  6. package/source/components/content/stylesheet/copy.mjs +1 -1
  7. package/source/components/content/stylesheet/fetch-box.mjs +1 -1
  8. package/source/components/content/stylesheet/viewer.mjs +61 -1
  9. package/source/components/data/kpi-tile.mjs +5 -3
  10. package/source/components/data/metric-graph.mjs +22 -20
  11. package/source/components/data/metric.mjs +20 -18
  12. package/source/components/data/style/kpi-tile.pcss +65 -43
  13. package/source/components/data/style/metric-graph.pcss +35 -18
  14. package/source/components/data/style/metric.pcss +35 -28
  15. package/source/components/data/stylesheet/kpi-tile.mjs +61 -1
  16. package/source/components/data/stylesheet/metric-graph.mjs +61 -1
  17. package/source/components/data/stylesheet/metric.mjs +61 -1
  18. package/source/components/datatable/columnbar.mjs +4 -2
  19. package/source/components/datatable/datatable.mjs +73 -15
  20. package/source/components/datatable/filter/date-range.mjs +61 -61
  21. package/source/components/datatable/filter/date-time.mjs +5 -1
  22. package/source/components/datatable/filter/range.mjs +3 -3
  23. package/source/components/datatable/filter/select-operator.mjs +7 -1
  24. package/source/components/datatable/filter/text-operator.mjs +11 -3
  25. package/source/components/datatable/filter.mjs +16 -0
  26. package/source/components/datatable/pagination.mjs +2 -2
  27. package/source/components/datatable/style/column-bar.pcss +115 -23
  28. package/source/components/datatable/style/datatable.pcss +257 -29
  29. package/source/components/datatable/style/embedded-pagination.pcss +63 -34
  30. package/source/components/datatable/style/filter-button.pcss +1 -1
  31. package/source/components/datatable/style/filter-controls-defaults.pcss +49 -3
  32. package/source/components/datatable/style/filter-select.pcss +4 -1
  33. package/source/components/datatable/style/filter.pcss +18 -1
  34. package/source/components/datatable/stylesheet/change-button.mjs +61 -1
  35. package/source/components/datatable/stylesheet/column-bar.mjs +69 -1
  36. package/source/components/datatable/stylesheet/dataset.mjs +61 -1
  37. package/source/components/datatable/stylesheet/datatable.mjs +71 -1
  38. package/source/components/datatable/stylesheet/embedded-pagination.mjs +1 -1
  39. package/source/components/datatable/stylesheet/filter-button.mjs +1 -1
  40. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +1 -1
  41. package/source/components/datatable/stylesheet/filter-select.mjs +61 -1
  42. package/source/components/datatable/stylesheet/filter.mjs +61 -1
  43. package/source/components/datatable/stylesheet/pagination.mjs +67 -1
  44. package/source/components/datatable/stylesheet/save-button.mjs +61 -1
  45. package/source/components/datatable/stylesheet/status.mjs +61 -1
  46. package/source/components/form/action-button.mjs +2 -1
  47. package/source/components/form/button-bar.mjs +7 -2
  48. package/source/components/form/context-error.mjs +4 -3
  49. package/source/components/form/context-help.mjs +10 -4
  50. package/source/components/form/context-hint.mjs +1 -1
  51. package/source/components/form/context-info.mjs +1 -1
  52. package/source/components/form/context-note.mjs +1 -1
  53. package/source/components/form/context-success.mjs +1 -1
  54. package/source/components/form/context-warning.mjs +1 -1
  55. package/source/components/form/control-bar.mjs +300 -14
  56. package/source/components/form/credential-button.mjs +4 -2
  57. package/source/components/form/digits.mjs +28 -1
  58. package/source/components/form/field-set.mjs +30 -0
  59. package/source/components/form/login.mjs +13 -10
  60. package/source/components/form/password.mjs +6 -0
  61. package/source/components/form/popper-button.mjs +1 -1
  62. package/source/components/form/quantity.mjs +14 -6
  63. package/source/components/form/register-wizard.mjs +46 -26
  64. package/source/components/form/select.mjs +17 -10
  65. package/source/components/form/sheet.mjs +13 -2
  66. package/source/components/form/style/action-button.pcss +131 -5
  67. package/source/components/form/style/button-bar.pcss +204 -3
  68. package/source/components/form/style/control-bar.pcss +254 -26
  69. package/source/components/form/style/digits.pcss +7 -6
  70. package/source/components/form/style/input-group.pcss +65 -1
  71. package/source/components/form/style/login.pcss +1 -1
  72. package/source/components/form/style/mixin/field-set-layout.pcss +8 -0
  73. package/source/components/form/style/password.pcss +25 -1
  74. package/source/components/form/style/popper-button.pcss +1 -0
  75. package/source/components/form/style/quantity.pcss +11 -20
  76. package/source/components/form/style/select.pcss +52 -7
  77. package/source/components/form/style/sheet.pcss +70 -1
  78. package/source/components/form/style/state-button.pcss +5 -2
  79. package/source/components/form/style/toggle-switch.pcss +7 -4
  80. package/source/components/form/stylesheet/action-button.mjs +63 -1
  81. package/source/components/form/stylesheet/button-bar.mjs +153 -1
  82. package/source/components/form/stylesheet/button.mjs +61 -1
  83. package/source/components/form/stylesheet/control-bar.mjs +163 -1
  84. package/source/components/form/stylesheet/digits.mjs +1 -1
  85. package/source/components/form/stylesheet/field-layout.mjs +1 -1
  86. package/source/components/form/stylesheet/field-set.mjs +1 -1
  87. package/source/components/form/stylesheet/form.mjs +1 -1
  88. package/source/components/form/stylesheet/input-group.mjs +15 -1
  89. package/source/components/form/stylesheet/login.mjs +1 -1
  90. package/source/components/form/stylesheet/password.mjs +7 -1
  91. package/source/components/form/stylesheet/popper-button.mjs +61 -1
  92. package/source/components/form/stylesheet/quantity.mjs +1 -1
  93. package/source/components/form/stylesheet/register-wizard.mjs +1 -1
  94. package/source/components/form/stylesheet/select.mjs +3 -1
  95. package/source/components/form/stylesheet/sheet.mjs +1 -1
  96. package/source/components/form/stylesheet/state-button.mjs +3 -1
  97. package/source/components/form/stylesheet/toggle-switch.mjs +1 -1
  98. package/source/components/form/stylesheet/wizard.mjs +1 -1
  99. package/source/components/form/util/floating-ui.mjs +35 -7
  100. package/source/components/host/call-button.mjs +3 -1
  101. package/source/components/host/stylesheet/call-button.mjs +61 -1
  102. package/source/components/host/stylesheet/host.mjs +1 -1
  103. package/source/components/host/stylesheet/toggle-button.mjs +61 -1
  104. package/source/components/layout/full-screen.mjs +31 -23
  105. package/source/components/layout/iframe.mjs +5 -1
  106. package/source/components/layout/popper.mjs +34 -4
  107. package/source/components/layout/style/full-screen.pcss +94 -23
  108. package/source/components/layout/style/split-panel.pcss +57 -5
  109. package/source/components/layout/style/tabs.pcss +277 -47
  110. package/source/components/layout/style/vertical-tabs.pcss +147 -0
  111. package/source/components/layout/stylesheet/collapse.mjs +61 -1
  112. package/source/components/layout/stylesheet/details.mjs +61 -1
  113. package/source/components/layout/stylesheet/full-screen.mjs +23 -1
  114. package/source/components/layout/stylesheet/overlay.mjs +1 -1
  115. package/source/components/layout/stylesheet/panel.mjs +1 -1
  116. package/source/components/layout/stylesheet/slider.mjs +1 -1
  117. package/source/components/layout/stylesheet/split-panel.mjs +17 -1
  118. package/source/components/layout/stylesheet/tabs.mjs +97 -1
  119. package/source/components/layout/stylesheet/vertical-tabs.mjs +33 -95
  120. package/source/components/layout/tabs.mjs +63 -0
  121. package/source/components/layout/vertical-tabs.mjs +63 -0
  122. package/source/components/navigation/stylesheet/site-navigation.mjs +1 -1
  123. package/source/components/navigation/stylesheet/table-of-content.mjs +1 -1
  124. package/source/components/navigation/stylesheet/wizard-navigation.mjs +1 -1
  125. package/source/components/navigation/table-of-content.mjs +13 -0
  126. package/source/components/notify/style/notify.pcss +1 -2
  127. package/source/components/notify/stylesheet/message.mjs +1 -1
  128. package/source/components/notify/stylesheet/notify.mjs +1 -1
  129. package/source/components/state/style/log.pcss +1 -0
  130. package/source/components/state/style/state.pcss +5 -1
  131. package/source/components/state/stylesheet/log.mjs +1 -1
  132. package/source/components/state/stylesheet/state.mjs +7 -1
  133. package/source/components/style/button.css +61 -205
  134. package/source/components/style/button.pcss +78 -34
  135. package/source/components/style/common.css +1 -170
  136. package/source/components/style/common.pcss +5 -9
  137. package/source/components/style/form.css +1 -49
  138. package/source/components/style/form.pcss +24 -6
  139. package/source/components/style/link.css +1 -39
  140. package/source/components/style/link.pcss +8 -16
  141. package/source/components/style/mixin/button.pcss +19 -10
  142. package/source/components/style/mixin/property.pcss +8 -0
  143. package/source/components/style/mixin/skeleton.pcss +11 -5
  144. package/source/components/style/normalize.css +1 -144
  145. package/source/components/style/normalize.pcss +5 -5
  146. package/source/components/style/property.css +1 -387
  147. package/source/components/style/skeleton.css +1 -198
  148. package/source/components/style/skeleton.pcss +8 -2
  149. package/source/components/style/theme-modern.css +74 -0
  150. package/source/components/style/theme-modern.pcss +498 -0
  151. package/source/components/stylesheet/button.mjs +61 -1
  152. package/source/components/stylesheet/common.mjs +1 -1
  153. package/source/components/stylesheet/form.mjs +1 -1
  154. package/source/components/stylesheet/link.mjs +1 -1
  155. package/source/components/stylesheet/normalize.mjs +1 -1
  156. package/source/components/stylesheet/property.mjs +1 -1
  157. package/source/components/stylesheet/skeleton.mjs +1 -1
  158. package/source/components/stylesheet/theme-modern.mjs +110 -0
  159. package/source/components/time/stylesheet/day.mjs +61 -1
  160. package/source/components/time/stylesheet/month-calendar.mjs +61 -1
  161. package/source/components/time/timeline/stylesheet/appointment.mjs +61 -1
  162. package/source/components/time/timeline/stylesheet/segment.mjs +61 -1
  163. package/source/components/tree-menu/style/tree-menu.pcss +26 -37
  164. package/source/components/tree-menu/stylesheet/tree-menu.mjs +1 -1
  165. package/source/dom/customelement.mjs +105 -40
  166. package/source/dom/updater.mjs +381 -119
  167. package/test/cases/components/content/image-editor.mjs +19 -0
  168. package/test/cases/components/datatable/accessibility-defaults.mjs +112 -0
  169. package/test/cases/components/datatable/filter-availability.mjs +37 -0
  170. package/test/cases/components/datatable/filter-date-range-layout.mjs +40 -0
  171. package/test/cases/components/datatable/filter-select-operator.mjs +118 -0
  172. package/test/cases/components/datatable/mobile-layout.mjs +203 -0
  173. package/test/cases/components/datatable/responsive-breakpoint.mjs +41 -0
  174. package/test/cases/components/datatable/selection.mjs +149 -0
  175. package/test/cases/components/form/action-button-style.mjs +85 -0
  176. package/test/cases/components/form/button-bar.mjs +222 -3
  177. package/test/cases/components/form/context-theme-colors.mjs +59 -0
  178. package/test/cases/components/form/control-bar.mjs +228 -3
  179. package/test/cases/components/form/control-heights.mjs +103 -0
  180. package/test/cases/components/form/digits-accessibility.mjs +65 -0
  181. package/test/cases/components/form/field-set.mjs +54 -0
  182. package/test/cases/components/form/floating-ui.mjs +74 -0
  183. package/test/cases/components/form/input-group.mjs +61 -28
  184. package/test/cases/components/form/login.mjs +47 -0
  185. package/test/cases/components/form/password.mjs +63 -0
  186. package/test/cases/components/form/popper-button.mjs +30 -15
  187. package/test/cases/components/form/quantity-accessibility.mjs +46 -0
  188. package/test/cases/components/form/register-wizard.mjs +79 -0
  189. package/test/cases/components/form/select.mjs +94 -2
  190. package/test/cases/components/form/sheet.mjs +56 -2
  191. package/test/cases/components/host/toggle-button.mjs +50 -0
  192. package/test/cases/components/layout/full-screen.mjs +60 -0
  193. package/test/cases/components/layout/iframe-accessibility.mjs +44 -0
  194. package/test/cases/components/layout/popper.mjs +128 -0
  195. package/test/cases/components/layout/slit-panel.mjs +30 -1
  196. package/test/cases/components/layout/tabs.mjs +93 -0
  197. package/test/cases/components/navigation/table-of-content.mjs +18 -0
  198. package/test/cases/components/state/state-style.mjs +31 -0
  199. package/test/cases/components/style/action-menu.mjs +74 -0
  200. package/test/cases/components/style/form-controls.mjs +37 -0
  201. package/test/cases/components/style/kpi-tile.mjs +60 -0
  202. package/test/cases/components/style/legacy-theme-compatibility.mjs +137 -0
  203. package/test/cases/components/style/metric-layout.mjs +94 -0
  204. package/test/cases/components/style/skeleton.mjs +69 -0
  205. package/test/cases/components/style/theme-component-catalog.mjs +853 -0
  206. package/test/cases/components/style/theme-modern.mjs +439 -0
  207. package/test/cases/components/style/theme-review-regressions.mjs +41 -0
  208. package/test/cases/dom/customelement.mjs +136 -1
  209. package/test/cases/dom/updater.mjs +174 -0
@@ -243,7 +243,7 @@ class DataTable extends CustomElement {
243
243
  headers: [],
244
244
 
245
245
  responsive: {
246
- breakpoint: 1440,
246
+ breakpoint: 960,
247
247
  },
248
248
 
249
249
  labels: getTranslations(),
@@ -481,6 +481,7 @@ class DataTable extends CustomElement {
481
481
  );
482
482
  if (selectAll instanceof HTMLInputElement) {
483
483
  selectAll.checked = false;
484
+ selectAll.indeterminate = false;
484
485
  }
485
486
 
486
487
  getSlottedElements
@@ -495,6 +496,7 @@ class DataTable extends CustomElement {
495
496
  const rows = this.getGridElements(`[data-monster-role="select-row"]`);
496
497
  rows.forEach((row) => {
497
498
  row.checked = false;
499
+ setRowSelectionState.call(this, row, false);
498
500
  });
499
501
  }),
500
502
  );
@@ -1267,27 +1269,21 @@ function initEventHandler() {
1267
1269
 
1268
1270
  if (!(checkbox instanceof HTMLInputElement)) return;
1269
1271
 
1270
- const parentNode = checkbox.parentNode;
1271
- if (!(parentNode instanceof HTMLDivElement)) return;
1272
-
1273
- const key = parentNode.getAttribute("data-monster-insert-reference");
1274
- const row = self.getGridElements(
1275
- `[data-monster-insert-reference="${key}"]`,
1276
- );
1277
- const index = key.split("-").pop();
1272
+ const index = setRowSelectionState.call(self, checkbox, checkbox.checked);
1273
+ if (index === null) return;
1278
1274
 
1279
1275
  if (checkbox.checked) {
1280
- row.forEach((col) => col.classList.add("selected"));
1281
1276
  fireCustomEvent(self, "monster-datatable-row-selected", { index });
1282
1277
  } else {
1283
- row.forEach((col) => col.classList.remove("selected"));
1284
1278
  fireCustomEvent(self, "monster-datatable-row-deselected", { index });
1285
1279
  }
1286
1280
 
1287
1281
  fireCustomEvent(this, "monster-datatable-selection-changed", {});
1288
1282
 
1289
1283
  const rows = self.getGridElements(`[data-monster-role="select-row"]`);
1290
- const allSelected = Array.from(rows).every((r) => r.checked);
1284
+ const selectedRows = Array.from(rows).filter((row) => row.checked);
1285
+ const allSelected =
1286
+ selectedRows.length > 0 && selectedRows.length === rows.length;
1291
1287
 
1292
1288
  const selectAll = this[gridHeadersElementSymbol].querySelector(
1293
1289
  `[data-monster-role="select-all"]`,
@@ -1302,7 +1298,10 @@ function initEventHandler() {
1302
1298
  if (e instanceof HTMLElement) e.style.visibility = mode;
1303
1299
  });
1304
1300
 
1305
- if (selectAll) selectAll.checked = allSelected;
1301
+ if (selectAll instanceof HTMLInputElement) {
1302
+ selectAll.checked = allSelected;
1303
+ selectAll.indeterminate = selectedRows.length > 0 && !allSelected;
1304
+ }
1306
1305
  };
1307
1306
 
1308
1307
  this[gridElementSymbol].addEventListener("click", selectRowCallback);
@@ -1315,13 +1314,15 @@ function initEventHandler() {
1315
1314
  "data-monster-role",
1316
1315
  "select-all",
1317
1316
  );
1318
- if (!toggle) return;
1317
+ if (!(toggle instanceof HTMLInputElement)) return;
1319
1318
 
1320
1319
  const mode = toggle.checked;
1321
1320
  const rows = this.getGridElements(`[data-monster-role="select-row"]`);
1322
1321
  rows.forEach((row) => {
1323
1322
  row.checked = mode;
1323
+ setRowSelectionState.call(this, row, mode);
1324
1324
  });
1325
+ toggle.indeterminate = false;
1325
1326
 
1326
1327
  if (mode) {
1327
1328
  fireCustomEvent(this, "monster-datatable-all-rows-selected", {});
@@ -1343,6 +1344,34 @@ function initEventHandler() {
1343
1344
  this[gridHeadersElementSymbol].addEventListener("touch", selectAllCallback);
1344
1345
  }
1345
1346
 
1347
+ /**
1348
+ * Synchronize a row checkbox with the selected state of every cell in its row.
1349
+ *
1350
+ * @private
1351
+ * @param {HTMLInputElement} checkbox
1352
+ * @param {boolean} selected
1353
+ * @returns {string|null}
1354
+ */
1355
+ function setRowSelectionState(checkbox, selected) {
1356
+ const parentNode = checkbox.parentNode;
1357
+ if (!(parentNode instanceof HTMLDivElement)) {
1358
+ return null;
1359
+ }
1360
+
1361
+ const key = parentNode.getAttribute("data-monster-insert-reference");
1362
+ if (!key) {
1363
+ return null;
1364
+ }
1365
+
1366
+ this.getGridElements(`[data-monster-insert-reference="${key}"]`).forEach(
1367
+ (cell) => {
1368
+ cell.classList.toggle("selected", selected);
1369
+ },
1370
+ );
1371
+
1372
+ return key.split("-").pop();
1373
+ }
1374
+
1346
1375
  /**
1347
1376
  * @private
1348
1377
  */
@@ -1374,6 +1403,12 @@ function initGridAndStructs(hostConfig, headerOrderMap) {
1374
1403
  let hClass = "";
1375
1404
  const row = template.content.children[i];
1376
1405
 
1406
+ row.toggleAttribute("data-monster-datatable-row-start", i === 0);
1407
+ row.toggleAttribute(
1408
+ "data-monster-datatable-row-end",
1409
+ i === rowCount - 1,
1410
+ );
1411
+
1377
1412
  let mode = "";
1378
1413
  if (row.hasAttribute(ATTRIBUTE_DATATABLE_MODE)) {
1379
1414
  mode = row.getAttribute(ATTRIBUTE_DATATABLE_MODE);
@@ -1464,7 +1499,11 @@ function initGridAndStructs(hostConfig, headerOrderMap) {
1464
1499
  features.push(feature.trim());
1465
1500
 
1466
1501
  if (feature === "select") {
1467
- label = "<input type='checkbox' data-monster-role='select-all' />";
1502
+ const translations = getTranslations();
1503
+ const selectionLabel = row.hasAttribute(ATTRIBUTE_DATATABLE_HEAD)
1504
+ ? label
1505
+ : translations.selectRow;
1506
+ label = `<input type='checkbox' data-monster-role='select-all' aria-label='${translations.selectAllRows}' />`;
1468
1507
 
1469
1508
  while (row.firstChild) {
1470
1509
  row.removeChild(row.firstChild);
@@ -1473,6 +1512,7 @@ function initGridAndStructs(hostConfig, headerOrderMap) {
1473
1512
  const checkbox = document.createElement("input");
1474
1513
  checkbox.type = "checkbox";
1475
1514
  checkbox.setAttribute("data-monster-role", "select-row");
1515
+ checkbox.setAttribute("aria-label", selectionLabel);
1476
1516
  row.appendChild(checkbox);
1477
1517
  }
1478
1518
  });
@@ -1533,6 +1573,8 @@ function getTranslations() {
1533
1573
  return {
1534
1574
  theListContainsNoEntries: "Die Liste enthält keine Einträge",
1535
1575
  copyAll: "Alles kopieren",
1576
+ selectRow: "Zeile auswählen",
1577
+ selectAllRows: "Alle Zeilen auswählen",
1536
1578
  helpText:
1537
1579
  "<p>Sie können die Werte aus einzelnen Zeilen<br>" +
1538
1580
  "in die Zwischenablage kopieren, indem Sie auf die entsprechende Spalte doppelklicken.</p>" +
@@ -1543,6 +1585,8 @@ function getTranslations() {
1543
1585
  return {
1544
1586
  theListContainsNoEntries: "La liste ne contient aucune entrée",
1545
1587
  copyAll: "Copier tout",
1588
+ selectRow: "Sélectionner la ligne",
1589
+ selectAllRows: "Sélectionner toutes les lignes",
1546
1590
  helpText:
1547
1591
  "<p>Vous pouvez copier les valeurs des rangées individuelles<br>" +
1548
1592
  "dans le presse-papiers en double-cliquant sur la colonne concernée.</p>" +
@@ -1553,6 +1597,8 @@ function getTranslations() {
1553
1597
  return {
1554
1598
  theListContainsNoEntries: "La lista no contiene entradas",
1555
1599
  copyAll: "Copiar todo",
1600
+ selectRow: "Seleccionar fila",
1601
+ selectAllRows: "Seleccionar todas las filas",
1556
1602
  helpText:
1557
1603
  "<p>Puedes copiar los valores de filas individuales<br>" +
1558
1604
  "al portapapeles haciendo doble clic en la columna correspondiente.</p>" +
@@ -1563,6 +1609,8 @@ function getTranslations() {
1563
1609
  return {
1564
1610
  theListContainsNoEntries: "L'elenco non contiene voci",
1565
1611
  copyAll: "Copia tutto",
1612
+ selectRow: "Seleziona riga",
1613
+ selectAllRows: "Seleziona tutte le righe",
1566
1614
  helpText:
1567
1615
  "<p>Puoi copiare i valori dalle singole righe<br>" +
1568
1616
  "negli appunti facendo doppio clic sulla colonna relativa.</p>" +
@@ -1573,6 +1621,8 @@ function getTranslations() {
1573
1621
  return {
1574
1622
  theListContainsNoEntries: "Lista nie zawiera wpisów",
1575
1623
  copyAll: "Kopiuj wszystko",
1624
+ selectRow: "Wybierz wiersz",
1625
+ selectAllRows: "Wybierz wszystkie wiersze",
1576
1626
  helpText:
1577
1627
  "<p>Możesz skopiować wartości z poszczególnych wierszy<br>" +
1578
1628
  "do schowka, klikając dwukrotnie na odpowiednią kolumnę.</p>" +
@@ -1583,6 +1633,8 @@ function getTranslations() {
1583
1633
  return {
1584
1634
  theListContainsNoEntries: "Listen inneholder ingen oppføringer",
1585
1635
  copyAll: "Kopier alt",
1636
+ selectRow: "Velg rad",
1637
+ selectAllRows: "Velg alle rader",
1586
1638
  helpText:
1587
1639
  "<p>Du kan kopiere verdier fra enkeltrader<br>" +
1588
1640
  "til utklippstavlen ved å dobbeltklikke på den relevante kolonnen.</p>" +
@@ -1593,6 +1645,8 @@ function getTranslations() {
1593
1645
  return {
1594
1646
  theListContainsNoEntries: "Listen indeholder ingen poster",
1595
1647
  copyAll: "Kopiér alt",
1648
+ selectRow: "Vælg række",
1649
+ selectAllRows: "Vælg alle rækker",
1596
1650
  helpText:
1597
1651
  "<p>Du kan kopiere værdier fra enkelte rækker<br>" +
1598
1652
  "til udklipsholderen ved at dobbeltklikke på den relevante kolonne.</p>" +
@@ -1603,6 +1657,8 @@ function getTranslations() {
1603
1657
  return {
1604
1658
  theListContainsNoEntries: "Listan innehåller inga poster",
1605
1659
  copyAll: "Kopiera allt",
1660
+ selectRow: "Välj rad",
1661
+ selectAllRows: "Välj alla rader",
1606
1662
  helpText:
1607
1663
  "<p>Du kan kopiera värden från enskilda rader<br>" +
1608
1664
  "till urklipp genom att dubbelklicka på den relevanta kolumnen.</p>" +
@@ -1615,6 +1671,8 @@ function getTranslations() {
1615
1671
  return {
1616
1672
  theListContainsNoEntries: "The list contains no entries",
1617
1673
  copyAll: "Copy all",
1674
+ selectRow: "Select row",
1675
+ selectAllRows: "Select all rows",
1618
1676
  helpText:
1619
1677
  "<p>You can copy the values from individual rows<br>" +
1620
1678
  "to the clipboard by double-clicking on the relevant column.</p>" +
@@ -208,7 +208,7 @@ class DateRange extends AbstractBase {
208
208
  main: getTemplate(),
209
209
  },
210
210
 
211
- labels: getTranslations(),
211
+ labels: Object.assign({ button: "Choose date range" }, getTranslations()),
212
212
 
213
213
  features: {
214
214
  moreThan: true,
@@ -1107,77 +1107,77 @@ function getTemplate() {
1107
1107
  // language=HTML
1108
1108
  return `
1109
1109
  <div data-monster-role="control" part="control">
1110
- <input data-monster-attributes="disabled path:disabled | if:true, class path:classes.input"
1111
- data-monster-role="input"
1110
+ <input data-monster-role="input"
1112
1111
  part="button"
1112
+ data-monster-attributes="disabled path:disabled | if:true, class path:classes.input, aria-label path:labels.button"
1113
1113
  data-monster-replace="path:labels.button">
1114
1114
 
1115
1115
  <div data-monster-role="popper" part="popper" tabindex="-1" class="monster-color-primary-1">
1116
1116
  <div data-monster-role="arrow"></div>
1117
- <div part="filter" class="flex" data-monster-replace="path:filter">
1118
- <div class="form-container" data-monster-role="form">
1119
-
1120
- <div data-monster-role="range-type" data-monster-range-type="today" data-monster-attributes="class path:features.moreThan | ?:form-group:hidden">
1121
- <input type="radio" name="rangeType" value="today" tabindex="0">
1122
- <label for="today"><span data-monster-replace="path:labels.todayValue"></span></label>
1123
- <input type="hidden" name="todayValue" disabled tabindex="0">
1124
- </div>
1117
+ <div part="content">
1118
+ <div part="filter" class="flex" data-monster-replace="path:filter">
1119
+ <div class="form-container" data-monster-role="form">
1120
+
1121
+ <div data-monster-role="range-type" data-monster-range-type="today" data-monster-attributes="class path:features.moreThan | ?:form-group:hidden">
1122
+ <input type="radio" name="rangeType" value="today" tabindex="0">
1123
+ <label for="today"><span data-monster-replace="path:labels.todayValue"></span></label>
1124
+ <input type="hidden" name="todayValue" disabled tabindex="0">
1125
+ </div>
1125
1126
 
1126
- <div data-monster-role="range-type" data-monster-range-type="within" data-monster-attributes="class path:features.within | ?:form-group:hidden">
1127
- <input type="radio" name="rangeType" value="within" tabindex="0">
1128
- <label for="within"><span
1129
- data-monster-replace="path:labels.withinValue"></span></label>
1130
- <input data-monster-watch="true" type="number" name="withinValue" disabled
1131
- tabindex="0">
1132
- <select data-monster-watch="true" name="withinValueUnit" disabled tabindex="0">
1133
- <option selected value="days" data-monster-replace="path:labels.days"></option>
1134
- <option value="weeks" data-monster-replace="path:labels.weeks"></option>
1135
- <option value="months" data-monster-replace="path:labels.months"></option>
1136
- <option value="years" data-monster-replace="path:labels.years"></option>
1137
- </select>
1138
- </div>
1127
+ <div data-monster-role="range-type" data-monster-range-type="within" data-monster-attributes="class path:features.within | ?:form-group:hidden">
1128
+ <input type="radio" name="rangeType" value="within" tabindex="0">
1129
+ <label for="within"><span
1130
+ data-monster-replace="path:labels.withinValue"></span></label>
1131
+ <input data-monster-watch="true" type="number" name="withinValue" disabled
1132
+ tabindex="0">
1133
+ <select data-monster-watch="true" name="withinValueUnit" disabled tabindex="0">
1134
+ <option selected value="days" data-monster-replace="path:labels.days"></option>
1135
+ <option value="weeks" data-monster-replace="path:labels.weeks"></option>
1136
+ <option value="months" data-monster-replace="path:labels.months"></option>
1137
+ <option value="years" data-monster-replace="path:labels.years"></option>
1138
+ </select>
1139
+ </div>
1139
1140
 
1140
- <div data-monster-role="range-type" data-monster-range-type="more-than" data-monster-attributes="class path:features.moreThan | ?:form-group:hidden">
1141
- <input type="radio" name="rangeType" value="more-than" tabindex="0">
1142
- <label for="more-than"><span
1143
- data-monster-replace="path:labels.moreThanValue"></span></label>
1144
- <input data-monster-watch="true" type="number" name="moreThanValue" disabled
1145
- tabindex="0">
1146
- <select data-monster-watch="true" name="moreThanValueUnit" disabled tabindex="0">
1147
- <option selected value="days" data-monster-replace="path:labels.days"></option>
1148
- <option value="weeks" data-monster-replace="path:labels.weeks"></option>
1149
- <option value="months" data-monster-replace="path:labels.months"></option>
1150
- <option value="years" data-monster-replace="path:labels.years"></option>
1151
- </select>
1152
- </div>
1153
-
1154
- <div class="form-group" data-monster-role="range-type" data-monster-range-type="single">
1155
- <input type="radio" name="rangeType" value="single" tabindex="0">
1156
- <label for="single"><span data-monster-replace="path:labels.singleValue"></span></label>
1157
- <input type="date" data-monster-watch="true" name="singleValue" disabled tabindex="0">
1158
- </div>
1141
+ <div data-monster-role="range-type" data-monster-range-type="more-than" data-monster-attributes="class path:features.moreThan | ?:form-group:hidden">
1142
+ <input type="radio" name="rangeType" value="more-than" tabindex="0">
1143
+ <label for="more-than"><span
1144
+ data-monster-replace="path:labels.moreThanValue"></span></label>
1145
+ <input data-monster-watch="true" type="number" name="moreThanValue" disabled
1146
+ tabindex="0">
1147
+ <select data-monster-watch="true" name="moreThanValueUnit" disabled tabindex="0">
1148
+ <option selected value="days" data-monster-replace="path:labels.days"></option>
1149
+ <option value="weeks" data-monster-replace="path:labels.weeks"></option>
1150
+ <option value="months" data-monster-replace="path:labels.months"></option>
1151
+ <option value="years" data-monster-replace="path:labels.years"></option>
1152
+ </select>
1153
+ </div>
1154
+
1155
+ <div class="form-group" data-monster-role="range-type" data-monster-range-type="single">
1156
+ <input type="radio" name="rangeType" value="single" tabindex="0">
1157
+ <label for="single"><span data-monster-replace="path:labels.singleValue"></span></label>
1158
+ <input type="date" data-monster-watch="true" name="singleValue" disabled tabindex="0">
1159
+ </div>
1159
1160
 
1160
- <div class="form-group" data-monster-role="range-type" data-monster-range-type="from">
1161
- <input type="radio" name="rangeType" value="from" tabindex="0">
1162
- <label for="from"><span data-monster-replace="path:labels.fromValue"></span></label>
1163
- <input type="date" data-monster-watch="true" name="fromValue" disabled tabindex="0">
1164
- </div>
1161
+ <div class="form-group" data-monster-role="range-type" data-monster-range-type="from">
1162
+ <input type="radio" name="rangeType" value="from" tabindex="0">
1163
+ <label for="from"><span data-monster-replace="path:labels.fromValue"></span></label>
1164
+ <input type="date" data-monster-watch="true" name="fromValue" disabled tabindex="0">
1165
+ </div>
1165
1166
 
1166
- <div class="form-group" data-monster-role="range-type" data-monster-range-type="to">
1167
- <input type="radio" name="rangeType" value="to" tabindex="0">
1168
- <label for="to"><span data-monster-replace="path:labels.toValue"></span></label>
1169
- <input type="date" data-monster-watch="true" name="toValue" disabled tabindex="0">
1170
- </div>
1167
+ <div class="form-group" data-monster-role="range-type" data-monster-range-type="to">
1168
+ <input type="radio" name="rangeType" value="to" tabindex="0">
1169
+ <label for="to"><span data-monster-replace="path:labels.toValue"></span></label>
1170
+ <input type="date" data-monster-watch="true" name="toValue" disabled tabindex="0">
1171
+ </div>
1171
1172
 
1172
- <div class="form-group" data-monster-role="range-type" data-monster-range-type="from-to">
1173
- <input type="radio" name="rangeType" value="from-to" tabindex="0">
1174
- <label for="rangeFrom"><span data-monster-replace="path:labels.fromValue"></span></label>
1175
- <input type="date" data-monster-watch="true" name="fromValue" disabled tabindex="0">
1176
- <label for="rangeTo"><span data-monster-replace="path:labels.toValue"></span></label>
1177
- <input type="date" data-monster-watch="true" name="toValue" disabled tabindex="0">
1173
+ <div class="form-group" data-monster-role="range-type" data-monster-range-type="from-to">
1174
+ <input type="radio" name="rangeType" value="from-to" tabindex="0">
1175
+ <label for="rangeFrom"><span data-monster-replace="path:labels.fromValue"></span></label>
1176
+ <input type="date" data-monster-watch="true" name="fromValue" disabled tabindex="0">
1177
+ <label for="rangeTo"><span data-monster-replace="path:labels.toValue"></span></label>
1178
+ <input type="date" data-monster-watch="true" name="toValue" disabled tabindex="0">
1179
+ </div>
1178
1180
  </div>
1179
-
1180
-
1181
1181
  </div>
1182
1182
  </div>
1183
1183
  </div>
@@ -65,6 +65,9 @@ class DateTimeFilter extends CustomControl {
65
65
  templates: {
66
66
  main: getTemplate(),
67
67
  },
68
+ labels: {
69
+ query: "Date and time",
70
+ },
68
71
  });
69
72
  }
70
73
 
@@ -153,7 +156,8 @@ function getTemplate() {
153
156
  return `
154
157
  <div data-monster-role="control" part="control">
155
158
  <slot></slot>
156
- <input type="datetime-local" name="query" data-monster-role="query" data-monster-attributes="value path:query">
159
+ <input type="datetime-local" name="query" data-monster-role="query"
160
+ data-monster-attributes="value path:query, aria-label path:labels.query">
157
161
  </div>
158
162
  `;
159
163
  }
@@ -175,7 +175,7 @@ class Range extends AbstractBase {
175
175
  main: getTemplate(),
176
176
  },
177
177
 
178
- labels: getTranslations(),
178
+ labels: Object.assign({ button: "Choose range" }, getTranslations()),
179
179
 
180
180
  features: {},
181
181
 
@@ -722,9 +722,9 @@ function getTemplate() {
722
722
  // language=HTML
723
723
  return `
724
724
  <div data-monster-role="control" part="control">
725
- <input data-monster-attributes="disabled path:disabled | if:true, class path:classes.input"
726
- data-monster-role="input"
725
+ <input data-monster-role="input"
727
726
  part="button"
727
+ data-monster-attributes="disabled path:disabled | if:true, class path:classes.input, aria-label path:labels.button"
728
728
  data-monster-replace="path:labels.button">
729
729
 
730
730
  <div data-monster-role="popper" part="popper" tabindex="-1" class="monster-color-primary-1">
@@ -491,12 +491,17 @@ function getTemplate() {
491
491
  monster-filter-select::part(control) {
492
492
  border: none;
493
493
  box-shadow: none;
494
+ height: 100%;
495
+ min-block-size: 0;
494
496
  }
495
497
  monster-input-group {
496
498
  width: 100%;
497
- height: 100%;
499
+ height: var(--monster-control-min-block-size, 2.5rem);
498
500
  align-self: stretch;
499
501
  }
502
+ monster-filter-select {
503
+ --monster-select-control-min-block-size: 0;
504
+ }
500
505
  monster-input-group::part(control) {
501
506
  align-items: stretch;
502
507
  }
@@ -515,6 +520,7 @@ function getTemplate() {
515
520
  <select slot="prefix" data-monster-role="operator" name="operator"></select>
516
521
  <monster-filter-select
517
522
  data-monster-role="select"
523
+ data-monster-selected-template="summary"
518
524
  style="flex: 1 1 auto; min-width: 0; width: 1%; height: -webkit-fill-available; height: -moz-available; height: fill-available; align-self: stretch;"
519
525
  ></monster-filter-select>
520
526
  </monster-input-group>
@@ -82,7 +82,13 @@ class TextOperator extends CustomControl {
82
82
  quotes: {
83
83
  char: '"',
84
84
  },
85
- labels: getTranslations(),
85
+ labels: Object.assign(
86
+ {
87
+ operator: "Filter operator",
88
+ query: "Filter value",
89
+ },
90
+ getTranslations(),
91
+ ),
86
92
  });
87
93
  }
88
94
 
@@ -422,8 +428,10 @@ function getTemplate() {
422
428
  <div data-monster-role="control" part="control">
423
429
  <slot></slot>
424
430
  <monster-input-group>
425
- <select slot="prefix" data-monster-role="operator" name="operator"></select>
426
- <input type="search" data-monster-role="query" name="query" data-monster-attributes="value path:query">
431
+ <select slot="prefix" data-monster-role="operator" name="operator"
432
+ data-monster-attributes="aria-label path:labels.operator"></select>
433
+ <input type="search" data-monster-role="query" name="query"
434
+ data-monster-attributes="value path:query, aria-label path:labels.query">
427
435
  </monster-input-group>
428
436
  </div>
429
437
  `;
@@ -752,6 +752,22 @@ function initFilter() {
752
752
  });
753
753
 
754
754
  updateFilterSelections.call(this);
755
+ updateFilterAvailability.call(this);
756
+ }
757
+
758
+ /**
759
+ * Disable filter actions when no filter definitions are available.
760
+ * @private
761
+ */
762
+ function updateFilterAvailability() {
763
+ const hasFilters = this[settingsSymbol].getOptions().length > 0;
764
+ for (const control of [
765
+ this[filterSelectElementSymbol],
766
+ this[searchButtonElementSymbol],
767
+ this[resetButtonElementSymbol],
768
+ ]) {
769
+ control?.setOption?.("disabled", !hasFilters);
770
+ }
755
771
  }
756
772
 
757
773
  /**
@@ -95,8 +95,8 @@ const lastNavClickTargetSymbol = Symbol("lastNavClickTarget");
95
95
 
96
96
  const minNavDoubleClickDelayMs = 200;
97
97
 
98
- const compactPrevIcon = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"><path d="M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0m3.5 7.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5z"/></svg>`;
99
- const compactNextIcon = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0M4.5 7.5a.5.5 0 0 0 0 1h5.793l-2.147 2.146a.5.5 0 0 0 .708.708l3-3a.5.5 0 0 0 0-.708l-3-3a.5.5 0 1 0-.708.708L10.293 7.5z"/></svg>`;
98
+ const compactPrevIcon = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0"/></svg>`;
99
+ const compactNextIcon = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4.646 1.646a.5.5 0 0 0 0 .708L10.293 8l-5.647 5.646a.5.5 0 0 0 .708.708l6-6a.5.5 0 0 0 0-.708l-6-6a.5.5 0 0 0-.708 0"/></svg>`;
100
100
 
101
101
  /**
102
102
  * A Pagination component