@eclipse-scout/core 22.0.1 → 22.0.2

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 (77) hide show
  1. package/dist/eclipse-scout-core-c98fb5230e71dcec75ce.min.js +2 -0
  2. package/dist/eclipse-scout-core-c98fb5230e71dcec75ce.min.js.map +1 -0
  3. package/dist/eclipse-scout-core-theme-6b2fef56e9e49231a49c.min.css +1 -0
  4. package/dist/eclipse-scout-core-theme-dark-d2bb274dd42f132bfca0.min.css +1 -0
  5. package/dist/eclipse-scout-core-theme-dark.css +367 -312
  6. package/dist/eclipse-scout-core-theme-dark.css.map +1 -1
  7. package/dist/eclipse-scout-core-theme.css +150 -95
  8. package/dist/eclipse-scout-core-theme.css.map +1 -1
  9. package/dist/eclipse-scout-core.js +371 -204
  10. package/dist/eclipse-scout-core.js.map +1 -1
  11. package/dist/file-list +7 -0
  12. package/dist/locales.json +47126 -0
  13. package/dist/texts.json +1153 -0
  14. package/package.json +2 -2
  15. package/src/action/Button.less +1 -0
  16. package/src/calendar/Calendar.js +40 -58
  17. package/src/calendar/Calendar.less +10 -10
  18. package/src/calendar/CalendarLayout.js +3 -1
  19. package/src/datepicker/DatePicker.less +1 -0
  20. package/src/desktop/desktoptab/DesktopTab.less +5 -2
  21. package/src/desktop/desktoptab/DesktopTabArea.less +7 -3
  22. package/src/desktop/navigation/DesktopNavigation.less +4 -0
  23. package/src/desktop/notification/DesktopNotification.js +11 -4
  24. package/src/desktop/notification/DesktopNotification.less +5 -3
  25. package/src/desktop/outline/Outline.less +4 -4
  26. package/src/desktop/viewbutton/ViewButton.less +13 -9
  27. package/src/desktop/viewbutton/ViewMenuTab.less +3 -2
  28. package/src/filechooser/FileChooser.less +1 -1
  29. package/src/form/Form.less +1 -0
  30. package/src/form/fields/LookupBox.js +2 -1
  31. package/src/form/fields/breadcrumbbarfield/BreadcrumbBarField.less +14 -0
  32. package/src/form/fields/groupbox/GroupBox.js +13 -9
  33. package/src/form/fields/groupbox/GroupBox.less +1 -0
  34. package/src/form/fields/htmlfield/HtmlField.less +0 -1
  35. package/src/form/fields/listbox/ListBox.js +8 -3
  36. package/src/form/fields/tabbox/TabAreaLayout.js +63 -66
  37. package/src/form/fields/tabbox/TabBox.js +4 -7
  38. package/src/form/fields/tabbox/TabBox.less +2 -1
  39. package/src/form/fields/tabbox/TabBoxHeaderLayout.js +5 -5
  40. package/src/glasspane/GlassPane.js +3 -3
  41. package/src/group/Group.less +1 -1
  42. package/src/index.less +1 -0
  43. package/src/jquery/jquery-scout.js +5 -4
  44. package/src/menu/ContextMenuPopup.less +9 -2
  45. package/src/menu/Menu.less +1 -0
  46. package/src/modeselector/Mode.less +15 -37
  47. package/src/modeselector/ModeSelector.js +1 -1
  48. package/src/modeselector/ModeSelector.less +2 -1
  49. package/src/planner/PlannerHeader.less +2 -1
  50. package/src/popup/Popup.js +24 -8
  51. package/src/popup/PopupLayout.js +2 -8
  52. package/src/scrollbar/Scrollbar.less +8 -1
  53. package/src/scrollbar/scrollbars.js +26 -4
  54. package/src/style/colors-dark.less +17 -10
  55. package/src/style/colors.less +11 -3
  56. package/src/style/fonts.less +5 -0
  57. package/src/style/mixins.less +16 -12
  58. package/src/style/sizes-dark.less +4 -1
  59. package/src/style/sizes.less +3 -4
  60. package/src/table/Table.js +37 -29
  61. package/src/table/Table.less +36 -13
  62. package/src/table/TableHeader.js +10 -8
  63. package/src/table/TableHeader.less +1 -0
  64. package/src/table/TableHeaderMenu.js +3 -1
  65. package/src/table/TableHeaderMenu.less +7 -2
  66. package/src/table/columns/BooleanColumn.js +2 -2
  67. package/src/table/columns/Column.js +3 -3
  68. package/src/table/editor/CellEditorPopup.js +8 -1
  69. package/src/tile/TileGrid.js +1 -1
  70. package/src/tile/TileGridLayout.js +2 -2
  71. package/src/tile/accordion/TileAccordion.js +16 -1
  72. package/src/tile/fields/FormFieldTile.less +18 -11
  73. package/src/tree/CompactTree.less +1 -1
  74. package/src/tree/Tree.less +1 -3
  75. package/src/util/arrays.js +24 -2
  76. package/src/util/objects.js +4 -1
  77. package/src/widget/Widget.js +11 -3
@@ -3429,7 +3429,7 @@ __webpack_require__.r(__webpack_exports__);
3429
3429
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
3430
3430
 
3431
3431
  /*
3432
- * Copyright (c) 2010-2020 BSI Business Systems Integration AG.
3432
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
3433
3433
  * All rights reserved. This program and the accompanying materials
3434
3434
  * are made available under the terms of the Eclipse Public License v1.0
3435
3435
  * which accompanies this distribution, and is available at
@@ -4212,7 +4212,8 @@ class Calendar extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
4212
4212
  this.$topGrid.find('.calendar-day-name').data('new-width', 0);
4213
4213
  this.$grids.find('.calendar-day').data('new-width', 0);
4214
4214
  let newWidthWorkWeek = Math.round(contentW / this.workDayIndices.length);
4215
- jquery__WEBPACK_IMPORTED_MODULE_1___default()('.calendar-day-name:nth-child(-n+6), ' + '.calendar-day:nth-child(-n+6)', this.$topGrid).data('new-width', newWidthWorkWeek);
4215
+ this.$topGrid.find('.calendar-day-name').slice(0, 5).data('new-width', newWidthWorkWeek);
4216
+ this.$topGrid.find('.calendar-day').slice(0, 5).data('new-width', newWidthWorkWeek);
4216
4217
  jquery__WEBPACK_IMPORTED_MODULE_1___default()('.calendar-day:nth-child(-n+6)', this.$grid).data('new-width', newWidthWorkWeek);
4217
4218
  this.widthPerDivision = newWidthWorkWeek;
4218
4219
  } else if (this._isMonth() || this._isWeek()) {
@@ -4229,23 +4230,33 @@ class Calendar extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
4229
4230
  $day = $comp.closest('.calendar-day');
4230
4231
  $comp.toggleClass('compact', $day.data('new-width') < _index__WEBPACK_IMPORTED_MODULE_0__.CalendarComponent.MONTH_COMPACT_THRESHOLD);
4231
4232
  });
4232
- }
4233
+ } // animate old to new sizes
4233
4234
 
4234
- let afterLayoutCallback = this._afterLayout.bind(this); // animate old to new sizes
4235
4235
 
4236
-
4237
- jquery__WEBPACK_IMPORTED_MODULE_1___default()('div', this.$container).each(function () {
4238
- let $e = jquery__WEBPACK_IMPORTED_MODULE_1___default()(this),
4239
- w = $e.data('new-width'),
4240
- h = $e.data('new-height');
4236
+ jquery__WEBPACK_IMPORTED_MODULE_1___default()('div', this.$container).each((i, elem) => {
4237
+ let $e = jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem);
4238
+ let w = $e.data('new-width');
4239
+ let h = $e.data('new-height');
4241
4240
  $e.stop(false, true);
4242
4241
 
4243
4242
  if (w !== undefined && w !== $e.outerWidth()) {
4244
4243
  if (animate) {
4245
- $e.animateAVCSD('width', w, afterLayoutCallback.bind(this, $e, animate));
4244
+ let opts = {
4245
+ complete: () => this._afterLayout($e, animate)
4246
+ };
4247
+
4248
+ if ($e[0] === this.$grids[0]) {
4249
+ // Grid contains scroll shadows that should be updated during animation (don't due it always for performance reasons)
4250
+ opts.progress = () => this._afterLayout($e, animate);
4251
+ }
4252
+
4253
+ $e.animate({
4254
+ width: w
4255
+ }, opts);
4246
4256
  } else {
4247
4257
  $e.css('width', w);
4248
- afterLayoutCallback($e, animate);
4258
+
4259
+ this._afterLayout($e, animate);
4249
4260
  }
4250
4261
  }
4251
4262
 
@@ -4260,7 +4271,7 @@ class Calendar extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
4260
4271
  $e.addClass('hidden');
4261
4272
  }
4262
4273
 
4263
- afterLayoutCallback($e, animate);
4274
+ this._afterLayout($e, animate);
4264
4275
  });
4265
4276
  } else {
4266
4277
  $e.css('height', h);
@@ -4269,7 +4280,7 @@ class Calendar extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
4269
4280
  $e.addClass('hidden');
4270
4281
  }
4271
4282
 
4272
- afterLayoutCallback($e, animate);
4283
+ this._afterLayout($e, animate);
4273
4284
  }
4274
4285
  }
4275
4286
  });
@@ -4309,13 +4320,18 @@ class Calendar extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
4309
4320
 
4310
4321
  _updateScrollbars($parent, animate) {
4311
4322
  let $scrollables = jquery__WEBPACK_IMPORTED_MODULE_1___default()('.calendar-scrollable-components', $parent);
4312
- $scrollables.each(function () {
4313
- let $scrollable = jquery__WEBPACK_IMPORTED_MODULE_1___default()(this);
4314
- _index__WEBPACK_IMPORTED_MODULE_0__.scrollbars.update($scrollable, true);
4323
+ $scrollables.each((i, elem) => {
4324
+ _index__WEBPACK_IMPORTED_MODULE_0__.scrollbars.update(jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem), true);
4315
4325
  });
4316
4326
  this.updateScrollPosition(animate);
4317
4327
  }
4318
4328
 
4329
+ _uninstallComponentScrollbars($parent) {
4330
+ $parent.find('.calendar-scrollable-components').each((i, elem) => {
4331
+ _index__WEBPACK_IMPORTED_MODULE_0__.scrollbars.uninstall(jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem), this.session);
4332
+ });
4333
+ }
4334
+
4319
4335
  _updateTopGrid() {
4320
4336
  jquery__WEBPACK_IMPORTED_MODULE_1___default()('.calendar-component', this.$topGrid).each((index, part) => {
4321
4337
  let component = jquery__WEBPACK_IMPORTED_MODULE_1___default()(part).data('component');
@@ -4494,17 +4510,9 @@ class Calendar extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
4494
4510
  }
4495
4511
 
4496
4512
  _remove() {
4497
- let $days = jquery__WEBPACK_IMPORTED_MODULE_1___default()('.calendar-day', this.$grid); // Ensure that scrollbars are unregistered
4513
+ this._uninstallComponentScrollbars(this.$grid);
4498
4514
 
4499
- for (let k = 0; k < $days.length; k++) {
4500
- let $day = $days.eq(k);
4501
- let $scrollableContainer = $day.children('.calendar-scrollable-components');
4502
-
4503
- if ($scrollableContainer.length > 0) {
4504
- _index__WEBPACK_IMPORTED_MODULE_0__.scrollbars.uninstall($scrollableContainer, this.session);
4505
- $scrollableContainer.remove();
4506
- }
4507
- }
4515
+ this._uninstallComponentScrollbars(this.$topGrid);
4508
4516
 
4509
4517
  this.$window.off('mousemove touchmove', this._mouseMoveHandler).off('mouseup touchend touchcancel', this._mouseUpHandler);
4510
4518
  this._moveData = null;
@@ -4639,6 +4647,8 @@ class Calendar extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
4639
4647
  if (this._isMonth()) {
4640
4648
  this._uninstallScrollbars();
4641
4649
 
4650
+ this._uninstallComponentScrollbars(this.$topGrid);
4651
+
4642
4652
  this.$grid.removeClass('calendar-scrollable-components');
4643
4653
  } else {
4644
4654
  this.$grid.addClass('calendar-scrollable-components'); // If we're in the non-month views, the time can scroll. Add scrollbars
@@ -4649,16 +4659,21 @@ class Calendar extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
4649
4659
  axis: 'y'
4650
4660
  });
4651
4661
 
4652
- let $topDays = jquery__WEBPACK_IMPORTED_MODULE_1___default()('.calendar-scrollable-components', this.$topGrid);
4662
+ this.$topGrid.find('.calendar-scrollable-components').each((i, elem) => {
4663
+ let $topDay = jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem);
4664
+
4665
+ if ($topDay.data('scrollable')) {
4666
+ _index__WEBPACK_IMPORTED_MODULE_0__.scrollbars.update($topDay);
4667
+ return;
4668
+ }
4653
4669
 
4654
- for (k = 0; k < $topDays.length; k++) {
4655
- let $topDay = $topDays.eq(k);
4656
4670
  _index__WEBPACK_IMPORTED_MODULE_0__.scrollbars.install($topDay, {
4657
4671
  parent: this,
4658
4672
  session: this.session,
4659
- axis: 'y'
4673
+ axis: 'y',
4674
+ scrollShadow: 'none'
4660
4675
  });
4661
- }
4676
+ });
4662
4677
  }
4663
4678
  }
4664
4679
 
@@ -5677,6 +5692,7 @@ class CalendarLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout
5677
5692
  this.calendar = calendar;
5678
5693
  this.stacked = false;
5679
5694
  this.compacted = false;
5695
+ this.compactWidth = 550;
5680
5696
  }
5681
5697
 
5682
5698
  layout($container) {
@@ -5694,7 +5710,8 @@ class CalendarLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout
5694
5710
  this.stack();
5695
5711
  }
5696
5712
 
5697
- if ($header[0].scrollWidth > $container.width()) {
5713
+ if ($container.width() < this.compactWidth || $header[0].scrollWidth > $container.width()) {
5714
+ // Title may take a lot of space, make it always compact for small devices so it won't toggle when changing display mode or view range
5698
5715
  this.compact();
5699
5716
  }
5700
5717
 
@@ -14376,18 +14393,19 @@ class DesktopNotification extends _index__WEBPACK_IMPORTED_MODULE_0__.Notificati
14376
14393
  }
14377
14394
 
14378
14395
  if (this.nativeNotificationVisibility === DesktopNotification.NativeNotificationVisibility.NONE) {
14396
+ this._hideLaterIfNativeOnly();
14397
+
14379
14398
  return;
14380
14399
  }
14381
14400
 
14382
14401
  if (this.nativeNotificationVisibility === DesktopNotification.NativeNotificationVisibility.BACKGROUND && !this._isDocumentHidden()) {
14402
+ this._hideLaterIfNativeOnly();
14403
+
14383
14404
  return;
14384
14405
  }
14385
14406
 
14386
14407
  if (window.Notification && Notification.permission === 'denied') {
14387
- if (this.nativeOnly) {
14388
- // If native notifications are not allowed, there is no need to keep the (invisible) desktop notification open
14389
- this.hide();
14390
- }
14408
+ this._hideLaterIfNativeOnly();
14391
14409
 
14392
14410
  return;
14393
14411
  }
@@ -14399,6 +14417,15 @@ class DesktopNotification extends _index__WEBPACK_IMPORTED_MODULE_0__.Notificati
14399
14417
  Notification.requestPermission(this._showNativeNotification.bind(this));
14400
14418
  }
14401
14419
  }
14420
+
14421
+ _hideLaterIfNativeOnly() {
14422
+ if (!this.nativeOnly) {
14423
+ return;
14424
+ } // If native notifications are not shown, there is no need to keep the (invisible) desktop notification open (prevent dom-leak)
14425
+
14426
+
14427
+ setTimeout(() => this.hide()); // async because this method is called in render and removing the notification within render throws exception
14428
+ }
14402
14429
  /**
14403
14430
  * Checks if browser supports the promise-based version of the method requestPermission. Safari only supports the older callback version.
14404
14431
  */
@@ -28887,7 +28914,7 @@ __webpack_require__.r(__webpack_exports__);
28887
28914
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
28888
28915
 
28889
28916
  /*
28890
- * Copyright (c) 2014-2017 BSI Business Systems Integration AG.
28917
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
28891
28918
  * All rights reserved. This program and the accompanying materials
28892
28919
  * are made available under the terms of the Eclipse Public License v1.0
28893
28920
  * which accompanies this distribution, and is available at
@@ -28905,6 +28932,7 @@ class LookupBox extends _index__WEBPACK_IMPORTED_MODULE_0__.ValueField {
28905
28932
  this.gridDataHints.weightY = 1.0;
28906
28933
  this.gridDataHints.h = 2;
28907
28934
  this.value = [];
28935
+ this.clearable = _index__WEBPACK_IMPORTED_MODULE_0__.ValueField.Clearable.NEVER;
28908
28936
  this.lookupCall = null;
28909
28937
  this._pendingLookup = null;
28910
28938
  this._currentLookupCall = null;
@@ -36404,13 +36432,13 @@ class GroupBox extends _index__WEBPACK_IMPORTED_MODULE_0__.CompositeField {
36404
36432
  render: () => true,
36405
36433
  offset: 0,
36406
36434
  hAlign: _index__WEBPACK_IMPORTED_MODULE_0__.HAlign.RIGHT,
36407
- $drawingArea: function ($drawingArea, event) {
36408
- if (this.labelVisible) {
36435
+ $drawingArea: ($drawingArea, event) => {
36436
+ if (this.$header && this.$header.isVisible()) {
36409
36437
  return this.$header;
36410
36438
  }
36411
36439
 
36412
36440
  return this.$body;
36413
- }.bind(this)
36441
+ }
36414
36442
  };
36415
36443
  keyStrokes.forEach(keyStroke => {
36416
36444
  keyStroke.actionKeyStroke.renderingHints = jquery__WEBPACK_IMPORTED_MODULE_1___default().extend({}, keyStroke.actionKeyStroke.renderingHints, groupBoxRenderingHints);
@@ -36627,13 +36655,11 @@ class GroupBox extends _index__WEBPACK_IMPORTED_MODULE_0__.CompositeField {
36627
36655
  this.$container.toggleClass('has-scroll-shadow-bottom', hasScrollShadowBottom);
36628
36656
 
36629
36657
  if ((headerVisible || hasMenubarTop) && oldHasScrollShadowTop !== hasScrollShadowTop || hasMenubarBottom && oldHasScrollShadowBottom !== hasScrollShadowBottom) {
36630
- this.invalidateLayout();
36658
+ this.invalidateLayoutTree(false);
36631
36659
  } // Enlarge header line if there is a shadow, but don't do it if there is a menubar on top
36632
36660
 
36633
36661
 
36634
- _index__WEBPACK_IMPORTED_MODULE_0__.fields.adjustStatusPositionForScrollShadow(this, () => hasScrollShadowTop && headerVisible && !hasMenubarTop); // Prevent flickering of status icon
36635
-
36636
- this.validateLayout();
36662
+ _index__WEBPACK_IMPORTED_MODULE_0__.fields.adjustStatusPositionForScrollShadow(this, () => hasScrollShadowTop && headerVisible && !hasMenubarTop);
36637
36663
  }
36638
36664
 
36639
36665
  setMainBox(mainBox) {
@@ -37075,10 +37101,18 @@ class GroupBox extends _index__WEBPACK_IMPORTED_MODULE_0__.CompositeField {
37075
37101
  }
37076
37102
 
37077
37103
  _onControlClick(event) {
37078
- if (this.expandable) {
37079
- this.setExpanded(!this.expanded);
37104
+ if (!this.expandable) {
37105
+ return;
37106
+ }
37107
+
37108
+ const target = _index__WEBPACK_IMPORTED_MODULE_0__.scout.widget(event.target);
37109
+
37110
+ if (this.menuBarPosition === GroupBox.MenuBarPosition.TITLE && this.menuBar.has(target)) {
37111
+ // If the position of the menubar is set to title and a menu has been clicked, then the event must not be handled
37112
+ return;
37080
37113
  }
37081
37114
 
37115
+ this.setExpanded(!this.expanded);
37082
37116
  jquery__WEBPACK_IMPORTED_MODULE_1___default().suppressEvent(event); // otherwise, the event would be triggered twice sometimes (by group-box-control and group-box-title)
37083
37117
  }
37084
37118
 
@@ -38503,7 +38537,7 @@ __webpack_require__.r(__webpack_exports__);
38503
38537
  /* harmony export */ });
38504
38538
  /* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../index */ "./src/index.js");
38505
38539
  /*
38506
- * Copyright (c) 2014-2017 BSI Business Systems Integration AG.
38540
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
38507
38541
  * All rights reserved. This program and the accompanying materials
38508
38542
  * are made available under the terms of the Eclipse Public License v1.0
38509
38543
  * which accompanies this distribution, and is available at
@@ -38518,7 +38552,6 @@ class ListBox extends _index__WEBPACK_IMPORTED_MODULE_0__.LookupBox {
38518
38552
  super();
38519
38553
  this.table = null;
38520
38554
  this.lookupStatus = null;
38521
- this.clearable = _index__WEBPACK_IMPORTED_MODULE_0__.ValueField.Clearable.NEVER;
38522
38555
 
38523
38556
  this._addWidgetProperties(['table', 'filterBox']);
38524
38557
  }
@@ -38533,6 +38566,13 @@ class ListBox extends _index__WEBPACK_IMPORTED_MODULE_0__.LookupBox {
38533
38566
  _initStructure(value) {
38534
38567
  if (!this.table) {
38535
38568
  this.table = this._createDefaultListBoxTable();
38569
+ } // align checkableColumn in table with checkboxes of tree fields
38570
+
38571
+
38572
+ if (this.table.checkableColumn) {
38573
+ // may be null if a non-default list-box-table with checkable=false is used
38574
+ this.table.checkableColumn.minWidth = 28;
38575
+ this.table.checkableColumn.width = this.table.checkableColumn.minWidth; // do not use setWidth here
38536
38576
  }
38537
38577
  }
38538
38578
 
@@ -48225,7 +48265,7 @@ __webpack_require__.r(__webpack_exports__);
48225
48265
  /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ "jquery");
48226
48266
  /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);
48227
48267
  /*
48228
- * Copyright (c) 2014-2018 BSI Business Systems Integration AG.
48268
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
48229
48269
  * All rights reserved. This program and the accompanying materials
48230
48270
  * are made available under the terms of the Eclipse Public License v1.0
48231
48271
  * which accompanies this distribution, and is available at
@@ -48253,30 +48293,37 @@ class TabAreaLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout {
48253
48293
  }
48254
48294
 
48255
48295
  layout($container) {
48256
- let ellipsis = this.tabArea.ellipsis,
48257
- htmlContainer = _index__WEBPACK_IMPORTED_MODULE_0__.HtmlComponent.get($container),
48296
+ let htmlContainer = _index__WEBPACK_IMPORTED_MODULE_0__.HtmlComponent.get($container),
48258
48297
  containerSize = htmlContainer.availableSize().subtract(htmlContainer.insets()); // compute visible and overflown tabs
48259
48298
 
48260
48299
  this.preferredLayoutSize($container, {
48261
48300
  widthHint: containerSize.width
48262
48301
  });
48263
48302
 
48264
- if (this.overflowTabs.length > 0) {
48265
- ellipsis.setHidden(false);
48266
- }
48303
+ this._layoutSelectionMarker();
48304
+ }
48267
48305
 
48268
- this.visibleTabs.forEach(tabItem => {
48269
- tabItem.setOverflown(false);
48270
- });
48271
- this.overflowTabs.forEach(tabItem => {
48272
- tabItem.setOverflown(true);
48273
- });
48306
+ _layoutSelectionMarker() {
48307
+ let $selectionMarker = this.tabArea.$selectionMarker,
48308
+ selectedTab = this.tabArea.selectedTab,
48309
+ selectedItemBounds;
48274
48310
 
48275
- if (this.overflowTabs.length === 0) {
48276
- ellipsis.setHidden(true);
48311
+ if (selectedTab) {
48312
+ $selectionMarker.setVisible(true);
48313
+ selectedItemBounds = _index__WEBPACK_IMPORTED_MODULE_0__.graphics.bounds(selectedTab.$container);
48314
+ $selectionMarker.cssLeft(selectedItemBounds.x);
48315
+ $selectionMarker.cssWidth(selectedItemBounds.width);
48316
+ } else {
48317
+ $selectionMarker.setVisible(false);
48277
48318
  }
48319
+ }
48278
48320
 
48321
+ _updateEllipsis() {
48322
+ let ellipsis = this.tabArea.ellipsis;
48323
+ ellipsis.setHidden(this.overflowTabs.length < 1);
48279
48324
  ellipsis.setText(this.overflowTabs.length + '');
48325
+ this.visibleTabs.forEach(tabItem => tabItem.setOverflown(false));
48326
+ this.overflowTabs.forEach(tabItem => tabItem.setOverflown(true));
48280
48327
  ellipsis.setChildActions(this.overflowTabs.map(tab => {
48281
48328
  let menu = _index__WEBPACK_IMPORTED_MODULE_0__.scout.create('Menu', {
48282
48329
  parent: ellipsis,
@@ -48293,38 +48340,21 @@ class TabAreaLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout {
48293
48340
  });
48294
48341
  return menu;
48295
48342
  }, this));
48296
-
48297
- this._layoutSelectionMarker();
48298
- }
48299
-
48300
- _layoutSelectionMarker() {
48301
- let $selectionMarker = this.tabArea.$selectionMarker,
48302
- selectedTab = this.tabArea.selectedTab,
48303
- selectedItemBounds;
48304
-
48305
- if (selectedTab) {
48306
- $selectionMarker.setVisible(true);
48307
- selectedItemBounds = _index__WEBPACK_IMPORTED_MODULE_0__.graphics.bounds(selectedTab.$container);
48308
- $selectionMarker.cssLeft(selectedItemBounds.x);
48309
- $selectionMarker.cssWidth(selectedItemBounds.width);
48310
- } else {
48311
- $selectionMarker.setVisible(false);
48312
- }
48313
48343
  }
48314
48344
 
48315
48345
  preferredLayoutSize($container, options) {
48316
48346
  let htmlComp = _index__WEBPACK_IMPORTED_MODULE_0__.HtmlComponent.get($container),
48317
48347
  prefSize = new _index__WEBPACK_IMPORTED_MODULE_0__.Dimension(0, 0),
48318
- prefWidth = Number.MAX_VALUE,
48319
- visibleTabItems = this.tabArea.visibleTabs(),
48320
- overflowableIndexes = visibleTabItems.map((tabItem, index) => {
48348
+ prefWidth = Number.MAX_VALUE;
48349
+ this.visibleTabs = this.tabArea.visibleTabs();
48350
+ let overflowableIndexes = this.visibleTabs.map((tabItem, index) => {
48321
48351
  if (tabItem.selected) {
48322
48352
  return -1;
48323
48353
  }
48324
48354
 
48325
48355
  return index;
48326
48356
  }).filter(index => index >= 0);
48327
- this.overflowTabs = []; // consider avoid falsy 0 in tabboxes a 0 withHint will be used to calculate the minimum width
48357
+ this.overflowTabs = []; // consider avoid falsy 0 in tab-boxes a 0 withHint will be used to calculate the minimum width
48328
48358
 
48329
48359
  if (options.widthHint === 0 || options.widthHint) {
48330
48360
  prefWidth = options.widthHint - htmlComp.insets().horizontal();
@@ -48332,26 +48362,28 @@ class TabAreaLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout {
48332
48362
 
48333
48363
 
48334
48364
  if (prefWidth <= 0) {
48335
- return this._minSize(visibleTabItems).add(htmlComp.insets());
48365
+ return this._minSize(this.visibleTabs).add(htmlComp.insets());
48336
48366
  }
48337
48367
 
48338
- let overflowIndex = -1;
48368
+ this._setFirstLastMarker(this.visibleTabs);
48339
48369
 
48340
- this._setFirstLastMarker(visibleTabItems);
48370
+ this._updateEllipsis();
48341
48371
 
48342
- prefSize = this._prefSize(visibleTabItems);
48372
+ prefSize = this._prefSize(this.visibleTabs);
48343
48373
 
48344
48374
  while (prefSize.width > prefWidth && overflowableIndexes.length > 0) {
48345
- overflowIndex = overflowableIndexes.splice(-1)[0];
48346
- this.overflowTabs.splice(0, 0, visibleTabItems[overflowIndex]);
48347
- visibleTabItems.splice(overflowIndex, 1);
48375
+ let overflowIndex = overflowableIndexes.splice(-1)[0];
48376
+ this.overflowTabs.splice(0, 0, this.visibleTabs[overflowIndex]);
48377
+ this.visibleTabs.splice(overflowIndex, 1);
48348
48378
 
48349
- this._setFirstLastMarker(visibleTabItems);
48379
+ this._setFirstLastMarker(this.visibleTabs);
48380
+
48381
+ this._updateEllipsis(); // update ellipsis here already so that the prefSize on the next line is correct
48350
48382
 
48351
- prefSize = this._prefSize(visibleTabItems);
48352
- }
48353
48383
 
48354
- this.visibleTabs = visibleTabItems; // Use the total available space if spreading tabs evenly.
48384
+ prefSize = this._prefSize(this.visibleTabs);
48385
+ } // Use the total available space if spreading tabs evenly.
48386
+
48355
48387
 
48356
48388
  if (this.tabArea.displayStyle === _index__WEBPACK_IMPORTED_MODULE_0__.TabArea.DisplayStyle.SPREAD_EVEN) {
48357
48389
  return _index__WEBPACK_IMPORTED_MODULE_0__.graphics.prefSize($container, options);
@@ -48361,8 +48393,7 @@ class TabAreaLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout {
48361
48393
  }
48362
48394
 
48363
48395
  _minSize(tabItems) {
48364
- let visibleTabItems = [],
48365
- prefSize;
48396
+ let visibleTabItems = [];
48366
48397
  this.overflowTabs = tabItems.filter(tabItem => {
48367
48398
  if (tabItem.selected) {
48368
48399
  visibleTabItems.push(tabItem);
@@ -48375,21 +48406,20 @@ class TabAreaLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout {
48375
48406
 
48376
48407
  this._setFirstLastMarker(visibleTabItems);
48377
48408
 
48378
- prefSize = this._prefSize(visibleTabItems);
48379
- return prefSize;
48409
+ return this._prefSize(visibleTabItems);
48380
48410
  }
48381
48411
 
48382
48412
  _prefSize(tabItems, considerEllipsis) {
48383
- let prefSize = tabItems.map(tabItem => this._tabItemSize(tabItem.htmlComp)).reduce((prefSize, itemSize) => {
48413
+ let prefSize = tabItems.map(tabItem => this._tabItemSize(tabItem)).reduce((prefSize, itemSize) => {
48384
48414
  prefSize.height = Math.max(prefSize.height, itemSize.height);
48385
48415
  prefSize.width += itemSize.width;
48386
48416
  return prefSize;
48387
- }, new _index__WEBPACK_IMPORTED_MODULE_0__.Dimension(0, 0)),
48388
- ellipsisSize = new _index__WEBPACK_IMPORTED_MODULE_0__.Dimension(0, 0);
48417
+ }, new _index__WEBPACK_IMPORTED_MODULE_0__.Dimension(0, 0));
48389
48418
  considerEllipsis = _index__WEBPACK_IMPORTED_MODULE_0__.scout.nvl(considerEllipsis, this.overflowTabs.length > 0);
48390
48419
 
48391
48420
  if (considerEllipsis) {
48392
- ellipsisSize = this._tabItemSize(this.tabArea.ellipsis.htmlComp);
48421
+ let ellipsisSize = this._tabItemSize(this.tabArea.ellipsis);
48422
+
48393
48423
  prefSize.height = Math.max(prefSize.height, ellipsisSize.height);
48394
48424
  prefSize.width += ellipsisSize.width;
48395
48425
  }
@@ -48416,8 +48446,9 @@ class TabAreaLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout {
48416
48446
  }
48417
48447
  }
48418
48448
 
48419
- _tabItemSize(htmlComp) {
48420
- let prefSize,
48449
+ _tabItemSize(item) {
48450
+ let htmlComp = item.htmlComp,
48451
+ prefSize,
48421
48452
  classList = htmlComp.$comp.attr('class'); // temporarily revert display style to default. otherwise the pref size of the tab item will be the size of the container.
48422
48453
 
48423
48454
  if (this.tabArea.displayStyle === _index__WEBPACK_IMPORTED_MODULE_0__.TabArea.DisplayStyle.SPREAD_EVEN) {
@@ -48429,6 +48460,27 @@ class TabAreaLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout {
48429
48460
  prefSize = htmlComp.prefSize({
48430
48461
  exact: true
48431
48462
  }).add(_index__WEBPACK_IMPORTED_MODULE_0__.graphics.margins(htmlComp.$comp));
48463
+
48464
+ if (item.fieldStatus && item.fieldStatus.htmlComp) {
48465
+ let statusOverflownAndHidden = item.overflown && !item.fieldStatus.visible;
48466
+
48467
+ if (statusOverflownAndHidden) {
48468
+ // overflown tabs have no fieldStatus: explicitly set to visible so that the real consumed space can be computed
48469
+ item.fieldStatus.setVisible(true);
48470
+ }
48471
+
48472
+ let statusWidth = item.fieldStatus.htmlComp.prefSize({
48473
+ includeMargin: true
48474
+ }).width;
48475
+
48476
+ if (statusOverflownAndHidden) {
48477
+ // restore
48478
+ item.fieldStatus.setVisible(false);
48479
+ }
48480
+
48481
+ prefSize.width += statusWidth;
48482
+ }
48483
+
48432
48484
  htmlComp.$comp.attrOrRemove('class', classList);
48433
48485
 
48434
48486
  if (this.tabArea.displayStyle === _index__WEBPACK_IMPORTED_MODULE_0__.TabArea.DisplayStyle.SPREAD_EVEN) {
@@ -48576,7 +48628,6 @@ class TabBox extends _index__WEBPACK_IMPORTED_MODULE_0__.CompositeField {
48576
48628
  this._addPreserveOnPropertyChangeProperties(['selectedTab']);
48577
48629
 
48578
48630
  this._tabBoxHeaderPropertyChangeHander = this._onTabBoxHeaderPropertyChange.bind(this);
48579
- this._selectedTabScrollTopChangeHandler = this._updateScrollShadow.bind(this);
48580
48631
  }
48581
48632
  /**
48582
48633
  * @override FormField.js
@@ -48730,17 +48781,19 @@ class TabBox extends _index__WEBPACK_IMPORTED_MODULE_0__.CompositeField {
48730
48781
  _renderSelectedTab() {
48731
48782
  if (this.selectedTab) {
48732
48783
  this.selectedTab.render(this._$tabContent);
48733
- this.selectedTab.on('propertyChange:scrollTop', this._selectedTabScrollTopChangeHandler);
48784
+ this.selectedTab.get$Scrollable().data('scroll-shadow-customizer', this._updateScrollShadow.bind(this));
48734
48785
  }
48735
48786
 
48736
48787
  if (this.rendered) {
48788
+ this._updateScrollShadow();
48789
+
48737
48790
  _index__WEBPACK_IMPORTED_MODULE_0__.HtmlComponent.get(this._$tabContent).invalidateLayoutTree();
48738
48791
  }
48739
48792
  }
48740
48793
 
48741
48794
  _removeSelectedTab() {
48742
48795
  if (this.selectedTab) {
48743
- this.selectedTab.off('propertyChange:scrollTop', this._selectedTabScrollTopChangeHandler);
48796
+ this.selectedTab.get$Scrollable().removeData('scroll-shadow-customizer');
48744
48797
  this.selectedTab.remove();
48745
48798
  }
48746
48799
  }
@@ -48755,13 +48808,11 @@ class TabBox extends _index__WEBPACK_IMPORTED_MODULE_0__.CompositeField {
48755
48808
  this.$container.toggleClass('has-scroll-shadow-top', hasScrollShadowTop);
48756
48809
 
48757
48810
  if (oldHasScrollShadowTop !== hasScrollShadowTop) {
48758
- this.invalidateLayout();
48811
+ this.invalidateLayoutTree(false);
48759
48812
  } // Enlarge header line if there is a shadow, but only if there is a header (controlled by labelVisible)
48760
48813
 
48761
48814
 
48762
- _index__WEBPACK_IMPORTED_MODULE_0__.fields.adjustStatusPositionForScrollShadow(this, () => hasScrollShadowTop && this.labelVisible); // Prevent flickering of status icon
48763
-
48764
- this.validateLayout();
48815
+ _index__WEBPACK_IMPORTED_MODULE_0__.fields.adjustStatusPositionForScrollShadow(this, () => hasScrollShadowTop && this.labelVisible);
48765
48816
  }
48766
48817
 
48767
48818
  setTabAreaStyle(tabAreaStyle) {
@@ -49047,7 +49098,7 @@ __webpack_require__.r(__webpack_exports__);
49047
49098
  /* harmony export */ });
49048
49099
  /* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../index */ "./src/index.js");
49049
49100
  /*
49050
- * Copyright (c) 2014-2017 BSI Business Systems Integration AG.
49101
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
49051
49102
  * All rights reserved. This program and the accompanying materials
49052
49103
  * are made available under the terms of the Eclipse Public License v1.0
49053
49104
  * which accompanies this distribution, and is available at
@@ -49082,21 +49133,20 @@ class TabBoxHeaderLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLay
49082
49133
  }
49083
49134
 
49084
49135
  layout($container) {
49085
- //
49086
49136
  let htmlContainer = _index__WEBPACK_IMPORTED_MODULE_0__.HtmlComponent.get($container),
49087
49137
  tabArea = this.tabBoxHeader.tabArea,
49088
49138
  tabAreaMargins = tabArea.htmlComp.margins(),
49089
49139
  tabAreaPrefSize,
49090
49140
  menuBar = this.tabBoxHeader.menuBar,
49091
49141
  menuBarMargins = menuBar.htmlComp.margins(),
49092
- menuBarMinumumSize,
49142
+ menuBarMinimumSize,
49093
49143
  $status = this.tabBoxHeader.tabBox.$status,
49094
49144
  statusSizeLarge = new _index__WEBPACK_IMPORTED_MODULE_0__.Dimension(),
49095
49145
  insets = htmlContainer.insets(),
49096
49146
  containerSize = htmlContainer.availableSize({
49097
49147
  exact: true
49098
49148
  }).subtract(htmlContainer.insets());
49099
- menuBarMinumumSize = menuBar.htmlComp.prefSize({
49149
+ menuBarMinimumSize = menuBar.htmlComp.prefSize({
49100
49150
  widthHint: 0
49101
49151
  });
49102
49152
 
@@ -49106,7 +49156,7 @@ class TabBoxHeaderLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLay
49106
49156
  }
49107
49157
 
49108
49158
  tabAreaPrefSize = tabArea.htmlComp.prefSize({
49109
- widthHint: containerSize.width - menuBarMinumumSize.width - menuBarMargins.horizontal() - statusSizeLarge.width,
49159
+ widthHint: containerSize.width - menuBarMinimumSize.width - menuBarMargins.horizontal() - statusSizeLarge.width,
49110
49160
  exact: false
49111
49161
  }); // layout tabArea
49112
49162
 
@@ -52370,7 +52420,7 @@ __webpack_require__.r(__webpack_exports__);
52370
52420
  /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ "jquery");
52371
52421
  /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);
52372
52422
  /*
52373
- * Copyright (c) 2010-2021 BSI Business Systems Integration AG.
52423
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
52374
52424
  * All rights reserved. This program and the accompanying materials
52375
52425
  * are made available under the terms of the Eclipse Public License v1.0
52376
52426
  * which accompanies this distribution, and is available at
@@ -52391,7 +52441,7 @@ class GlassPane extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
52391
52441
  this.$parent.addClass('glasspane-parent');
52392
52442
  let cssPosition = this.$parent.css('position');
52393
52443
 
52394
- if (!_index__WEBPACK_IMPORTED_MODULE_0__.scout.isOneOf(cssPosition, 'relative', 'absolute')) {
52444
+ if (cssPosition === 'static') {
52395
52445
  this.$parent.css('position', 'relative');
52396
52446
  } // Register 'glassPaneTarget' in focus manager.
52397
52447
 
@@ -56205,7 +56255,7 @@ __webpack_require__.r(__webpack_exports__);
56205
56255
  /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
56206
56256
  /* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../index */ "./src/index.js");
56207
56257
  /*
56208
- * Copyright (c) 2010-2021 BSI Business Systems Integration AG.
56258
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
56209
56259
  * All rights reserved. This program and the accompanying materials
56210
56260
  * are made available under the terms of the Eclipse Public License v1.0
56211
56261
  * which accompanies this distribution, and is available at
@@ -57358,17 +57408,19 @@ const __origCleanData = (jquery__WEBPACK_IMPORTED_MODULE_0___default().cleanData
57358
57408
  return this;
57359
57409
  }
57360
57410
 
57361
- return this.on('animationend webkitAnimationEnd', event => {
57411
+ let oneHandler = event => {
57362
57412
  if (event.target !== this[0]) {
57363
57413
  // Ignore events that bubble up from child elements
57364
57414
  return;
57365
57415
  } // Unregister listener to implement "one" semantics
57366
57416
 
57367
57417
 
57368
- this.off(event); // Notify actual event handler
57418
+ this.off('animationend webkitAnimationEnd', oneHandler); // Notify actual event handler
57369
57419
 
57370
57420
  handler(event);
57371
- });
57421
+ };
57422
+
57423
+ return this.on('animationend webkitAnimationEnd', oneHandler);
57372
57424
  };
57373
57425
 
57374
57426
  (jquery__WEBPACK_IMPORTED_MODULE_0___default().fn.hasAnimationClass) = function () {
@@ -73811,7 +73863,9 @@ class ModeSelector extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
73811
73863
 
73812
73864
  if (this.selectedMode && this.selectedMode.$container) {
73813
73865
  selectedModePosX = _index__WEBPACK_IMPORTED_MODULE_0__.graphics.position(this.selectedMode.$container).x;
73814
- selectedModeWidth = _index__WEBPACK_IMPORTED_MODULE_0__.graphics.size(this.selectedMode.$container).width;
73866
+ selectedModeWidth = _index__WEBPACK_IMPORTED_MODULE_0__.graphics.size(this.selectedMode.$container, {
73867
+ exact: true
73868
+ }).width;
73815
73869
  }
73816
73870
 
73817
73871
  this.$slider.cssLeft(selectedModePosX);
@@ -76748,7 +76802,7 @@ __webpack_require__.r(__webpack_exports__);
76748
76802
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
76749
76803
 
76750
76804
  /*
76751
- * Copyright (c) 2010-2021 BSI Business Systems Integration AG.
76805
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
76752
76806
  * All rights reserved. This program and the accompanying materials
76753
76807
  * are made available under the terms of the Eclipse Public License v1.0
76754
76808
  * which accompanies this distribution, and is available at
@@ -76880,20 +76934,18 @@ class Popup extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
76880
76934
 
76881
76935
  _openWithoutParent() {
76882
76936
  // resolve parent for entry-point (don't change the actual property)
76883
- let parent = this.parent;
76884
-
76885
- if (parent.destroyed) {
76937
+ if (this.parent.destroyed) {
76886
76938
  return;
76887
76939
  }
76888
76940
 
76889
- if (parent.rendered || parent.rendering) {
76890
- this.open(parent.entryPoint());
76941
+ if (this.parent.rendered || this.parent.rendering) {
76942
+ this.open(this._getDefaultOpen$Parent());
76891
76943
  return;
76892
76944
  } // This is important for popups rendered in another (native) browser window. The DOM in the popup window
76893
76945
  // is rendered later, so we must wait until that window is rendered and layouted. See popup-window.html.
76894
76946
 
76895
76947
 
76896
- parent.one('render', () => {
76948
+ this.parent.one('render', () => {
76897
76949
  this.session.layoutValidator.schedulePostValidateFunction(() => {
76898
76950
  if (this.destroyed || this.rendered) {
76899
76951
  return;
@@ -76903,6 +76955,15 @@ class Popup extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
76903
76955
  });
76904
76956
  });
76905
76957
  }
76958
+ /**
76959
+ * Only called if parent.rendered or parent.rendering
76960
+ * @return {$}
76961
+ */
76962
+
76963
+
76964
+ _getDefaultOpen$Parent() {
76965
+ return this.parent.entryPoint();
76966
+ }
76906
76967
 
76907
76968
  open($parent) {
76908
76969
  if (!$parent) {
@@ -77180,6 +77241,16 @@ class Popup extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
77180
77241
  return cssClass;
77181
77242
  }
77182
77243
 
77244
+ _animateRemovalWhileRemovingParent() {
77245
+ if (!this.$anchor) {
77246
+ // Allow remove animations for popups without an anchor
77247
+ return true;
77248
+ } // If parent is the anchor, prevent remove animation to ensure popup will be removed together with the anchor
77249
+
77250
+
77251
+ return _index__WEBPACK_IMPORTED_MODULE_0__.widgets.get(this.$anchor) !== this.parent;
77252
+ }
77253
+
77183
77254
  _isRemovalPrevented() {
77184
77255
  // If removal of a parent is pending due to an animation then don't return true to make sure popups are closed before the parent animation starts.
77185
77256
  // However, if the popup itself is removed by an animation, removal should be prevented to ensure remove() won't run multiple times.
@@ -77829,7 +77900,7 @@ class Popup extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
77829
77900
  }
77830
77901
 
77831
77902
  _handleGlassPanes() {
77832
- let parentCoveredByGlassPane = this.session.focusManager.isElementCovertByGlassPane(this.parent.$container); // if a popup is covered by a glass pane the glass pane's need to be rerendered to ensure a glass pane is also painted over the popup
77903
+ let parentCoveredByGlassPane = this.session.focusManager.isElementCovertByGlassPane(this.parent.$container); // if a popup is covered by a glass pane the glass pane's need to be re-rendered to ensure a glass pane is also painted over the popup
77833
77904
 
77834
77905
  if (parentCoveredByGlassPane) {
77835
77906
  this.session.focusManager.rerenderGlassPanes();
@@ -77970,7 +78041,7 @@ __webpack_require__.r(__webpack_exports__);
77970
78041
  /* harmony export */ });
77971
78042
  /* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index */ "./src/index.js");
77972
78043
  /*
77973
- * Copyright (c) 2014-2020 BSI Business Systems Integration AG.
78044
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
77974
78045
  * All rights reserved. This program and the accompanying materials
77975
78046
  * are made available under the terms of the Eclipse Public License v1.0
77976
78047
  * which accompanies this distribution, and is available at
@@ -78110,9 +78181,6 @@ class PopupLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout {
78110
78181
 
78111
78182
 
78112
78183
  _calcMaxSize() {
78113
- // Position the popup at the desired location before doing any calculations to consider the preferred bounds
78114
- this._position(false);
78115
-
78116
78184
  let maxWidth,
78117
78185
  maxHeight,
78118
78186
  htmlComp = this.popup.htmlComp,
@@ -78131,7 +78199,7 @@ class PopupLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout {
78131
78199
  windowSize = this._calcMaxSize(),
78132
78200
  Alignment = _index__WEBPACK_IMPORTED_MODULE_0__.Popup.Alignment,
78133
78201
  horizontalAlignment = this.popup.horizontalAlignment,
78134
- verticalAlignment = this.popup.verticalAlignment; // Decide whether the prefSize can be used or the popup needs to be shrinked so that it fits into the viewport
78202
+ verticalAlignment = this.popup.verticalAlignment; // Decide whether the prefSize can be used or the popup needs to be shrunken so that it fits into the viewport
78135
78203
  // The decision is based on the preferred opening direction
78136
78204
  // Example: The popup would like to be opened leftedge and bottom
78137
78205
  // If there is enough space on the right and on the bottom -> pref size is used
@@ -78198,9 +78266,6 @@ class PopupLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.AbstractLayout {
78198
78266
 
78199
78267
 
78200
78268
  _calcMaxSizeAroundAnchor() {
78201
- // Position the popup at the desired location before doing any calculations because positioning adds CSS classes which might change margins
78202
- this._position(false);
78203
-
78204
78269
  let maxWidthLeft,
78205
78270
  maxWidthRight,
78206
78271
  maxHeightDown,
@@ -80784,7 +80849,7 @@ __webpack_require__.r(__webpack_exports__);
80784
80849
  /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ "jquery");
80785
80850
  /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);
80786
80851
  /*
80787
- * Copyright (c) 2010-2021 BSI Business Systems Integration AG.
80852
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
80788
80853
  * All rights reserved. This program and the accompanying materials
80789
80854
  * are made available under the terms of the Eclipse Public License v1.0
80790
80855
  * which accompanies this distribution, and is available at
@@ -80954,7 +81019,19 @@ function installScrollShadow($container, session, options) {
80954
81019
 
80955
81020
  _installIntersectionObserver();
80956
81021
 
80957
- intersectionObserver.observe($container[0]);
81022
+ intersectionObserver.observe($container[0]); // this is required in addition to the intersection observer because the observer events are handled asynchronously later after all the setTimeout calls.
81023
+ // Then the shadow might stay visible too long which has an impact on layout updates.
81024
+
81025
+ let containerElement = $container[0];
81026
+
81027
+ let visibleListener = e => {
81028
+ if (e.target === containerElement) {
81029
+ _onScrollableVisibleChange(containerElement, e.type === 'show');
81030
+ }
81031
+ };
81032
+
81033
+ $container.data('scroll-shadow-visible-listener', visibleListener);
81034
+ $container.on('hide show', visibleListener);
80958
81035
  }
80959
81036
  function uninstallScrollShadow($container, session) {
80960
81037
  let $shadow = $container.data('scroll-shadow');
@@ -80977,6 +81054,12 @@ function uninstallScrollShadow($container, session) {
80977
81054
  intersectionObserver.unobserve($container[0]);
80978
81055
  }
80979
81056
 
81057
+ let visibleListener = $container.data('scroll-shadow-visible-listener');
81058
+
81059
+ if (visibleListener) {
81060
+ $container.off('hide show', visibleListener);
81061
+ }
81062
+
80980
81063
  let $scrollables = _$scrollables[session];
80981
81064
 
80982
81065
  if (!$scrollables || !$scrollables.some($scrollable => $scrollable.data('scroll-shadow'))) {
@@ -81052,7 +81135,7 @@ function updateScrollShadow($container) {
81052
81135
  $shadow.toggleClass('right', !atRight && style.indexOf('right') > -1);
81053
81136
  _index__WEBPACK_IMPORTED_MODULE_0__.graphics.setBounds($shadow, _index__WEBPACK_IMPORTED_MODULE_0__.graphics.bounds($container, {
81054
81137
  exact: true
81055
- }));
81138
+ }).subtract(insets($shadow)));
81056
81139
  _index__WEBPACK_IMPORTED_MODULE_0__.graphics.setMargins($shadow, _index__WEBPACK_IMPORTED_MODULE_0__.graphics.margins($container));
81057
81140
  $shadow.css('border-radius', $container.css('border-radius'));
81058
81141
  let customizer = $container.data('scroll-shadow-customizer');
@@ -81068,6 +81151,10 @@ function updateScrollShadow($container) {
81068
81151
  function atEnd(scrollPos, scrollSize, offsetSize) {
81069
81152
  return scrollPos + 1 >= scrollSize - offsetSize;
81070
81153
  }
81154
+
81155
+ function insets($shadow) {
81156
+ return new _index__WEBPACK_IMPORTED_MODULE_0__.Insets($shadow.cssPxValue('--scroll-shadow-inset-top'), $shadow.cssPxValue('--scroll-shadow-inset-right'), $shadow.cssPxValue('--scroll-shadow-inset-bottom'), $shadow.cssPxValue('--scroll-shadow-inset-left'));
81157
+ }
81071
81158
  }
81072
81159
  /**
81073
81160
  * Installs a dom mutation observer that tracks all scrollables in order to move the scroll shadow along with the scrollable.
@@ -81559,7 +81646,7 @@ function scrollToBottom($scrollable, options) {
81559
81646
  /**
81560
81647
  * @param location object with x and y properties
81561
81648
  * @param $scrollables one or more scrollables to check against
81562
- * @eturns {boolean} true if the location is visible in the current viewport of all the $scrollables, or if $scrollables is null
81649
+ * @returns {boolean} true if the location is visible in the current viewport of all the $scrollables, or if $scrollables is null
81563
81650
  */
81564
81651
 
81565
81652
  function isLocationInView(location, $scrollables) {
@@ -87700,6 +87787,7 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
87700
87787
  this.contextColumn = null;
87701
87788
  this.checkable = false;
87702
87789
  this.checkableStyle = Table.CheckableStyle.CHECKBOX;
87790
+ this.cellEditorPopup = null;
87703
87791
  this.compact = false;
87704
87792
  this.compactHandler = _index__WEBPACK_IMPORTED_MODULE_0__.scout.create('TableCompactHandler', {
87705
87793
  table: this
@@ -87781,6 +87869,7 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
87781
87869
  this._popupOpenHandler = this._onDesktopPopupOpen.bind(this);
87782
87870
  this._rerenderViewPortAfterAttach = false;
87783
87871
  this._renderViewPortAfterAttach = false;
87872
+ this._postAttachActions = [];
87784
87873
  this._desktopPropertyChangeHandler = this._onDesktopPropertyChange.bind(this);
87785
87874
 
87786
87875
  this._addWidgetProperties(['tableControls', 'menus', 'keyStrokes', 'staticMenus', 'tileTableHeader', 'tableTileGridMediator']);
@@ -88111,8 +88200,6 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
88111
88200
  }
88112
88201
 
88113
88202
  _removeData() {
88114
- this._destroyCellEditorPopup();
88115
-
88116
88203
  this._removeAggregateRows();
88117
88204
 
88118
88205
  this._uninstallImageListeners();
@@ -88297,13 +88384,13 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
88297
88384
  return;
88298
88385
  }
88299
88386
 
88387
+ let row = $row.data('row'); // read row before the $row potentially could be replaced by the column specific logic on mouse up
88388
+
88300
88389
  if (mouseButton === 1) {
88301
88390
  column.onMouseUp(event, $row);
88302
88391
  $appLink = this._find$AppLink(event);
88303
88392
  }
88304
88393
 
88305
- let row = $row.data('row');
88306
-
88307
88394
  if ($appLink) {
88308
88395
  this._triggerAppLinkAction(column, row, $appLink.data('ref'), $appLink);
88309
88396
  } else {
@@ -89869,8 +89956,26 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
89869
89956
  });
89870
89957
  }
89871
89958
  /**
89872
- * This functions starts the cell editor for the given row and column. Prepare must wait until
89873
- * a pending completeCellEdit operation is resolved.
89959
+ * Starts cell editing for the cell at the given column and row, but only if editing is allowed.
89960
+ * @see prepareCellEdit
89961
+ */
89962
+
89963
+
89964
+ focusCell(column, row) {
89965
+ let cell = this.cell(column, row);
89966
+
89967
+ if (this.enabledComputed && row.enabled && cell.editable) {
89968
+ this.prepareCellEdit(column, row);
89969
+ }
89970
+ }
89971
+ /**
89972
+ * Creates a cell editor for the cell at the given column and row, ensures the row is selected and passes the editor
89973
+ * to {@link #startCellEdit} which starts the editing by rendering the editor in a {@link CellEditorPopup}.<br>
89974
+ * If the completion of a previous cell edit is still in progress, the preparation is delayed until the completion is finished.
89975
+ *
89976
+ * @param {boolean} [openFieldPopupOnCellEdit] true to instruct the editor to open its control popup when the editor is rendered.
89977
+ * This only has an effect if the editor has a popup (e.g. SmartField or DateField).
89978
+ * @returns Promise the promise will be resolved when the preparation has been finished.
89874
89979
  */
89875
89980
 
89876
89981
 
@@ -89884,10 +89989,10 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
89884
89989
  return promise.then(this.prepareCellEditInternal.bind(this, column, row, openFieldPopupOnCellEdit));
89885
89990
  }
89886
89991
  /**
89887
- * @param openFieldPopupOnCellEdit when this parameter is set to true, the CellEditorPopup sets an
89992
+ * @param {boolean} [openFieldPopupOnCellEdit] when this parameter is set to true, the CellEditorPopup sets an
89888
89993
  * additional property 'cellEditor' on the editor-field. The field instance may use this property
89889
89994
  * to decide whether or not it should open a popup immediately after it is rendered. This is used
89890
- * for Smart- and DateFields.
89995
+ * for Smart- and DateFields. Default is false.
89891
89996
  */
89892
89997
 
89893
89998
 
@@ -90974,12 +91079,23 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
90974
91079
  }
90975
91080
 
90976
91081
  startCellEdit(column, row, field) {
90977
- if (!this._isDataRendered() || !this.isAttachedAndRendered()) {
91082
+ if (field.destroyed) {
91083
+ // May happen if the action was postponed and the field destroyed in the meantime using endCellEdit.
91084
+ return;
91085
+ }
91086
+
91087
+ if (!this._isDataRendered()) {
90978
91088
  this._postRenderActions.push(this.startCellEdit.bind(this, column, row, field));
90979
91089
 
90980
91090
  return;
90981
91091
  }
90982
91092
 
91093
+ if (!this.$container.isAttached()) {
91094
+ this._postAttachActions.push(this.startCellEdit.bind(this, column, row, field));
91095
+
91096
+ return;
91097
+ }
91098
+
90983
91099
  this.trigger('startCellEdit', {
90984
91100
  column: column,
90985
91101
  row: row,
@@ -90999,12 +91115,6 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
90999
91115
 
91000
91116
 
91001
91117
  endCellEdit(field, saveEditorValue) {
91002
- if (!this._isDataRendered() || !this.isAttachedAndRendered()) {
91003
- this._postRenderActions.push(this.endCellEdit.bind(this, field, saveEditorValue));
91004
-
91005
- return;
91006
- }
91007
-
91008
91118
  if (!this.cellEditorPopup) {
91009
91119
  // the cellEditorPopup could already be removed by scrolling (out of view range) or be removed by update rows
91010
91120
  field.destroy();
@@ -92783,7 +92893,11 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
92783
92893
  this.$container.toggleClass('table-row-check', this.checkableStyle === Table.CheckableStyle.TABLE_ROW);
92784
92894
 
92785
92895
  if (this._isDataRendered()) {
92896
+ this._updateRowWidth();
92897
+
92786
92898
  this._redraw();
92899
+
92900
+ this.invalidateLayoutTree();
92787
92901
  }
92788
92902
  }
92789
92903
  /**
@@ -93520,20 +93634,6 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
93520
93634
  }
93521
93635
  }
93522
93636
 
93523
- focusCell(column, row) {
93524
- if (!this._isDataRendered() || !this.isAttachedAndRendered()) {
93525
- this._postRenderActions.push(this.focusCell.bind(this, column, row));
93526
-
93527
- return;
93528
- }
93529
-
93530
- let cell = this.cell(column, row);
93531
-
93532
- if (this.enabledComputed && row.enabled && cell.editable) {
93533
- this.prepareCellEdit(column, row, false);
93534
- }
93535
- }
93536
-
93537
93637
  _attach() {
93538
93638
  this.$parent.append(this.$container);
93539
93639
 
@@ -93564,6 +93664,10 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
93564
93664
  this._rerenderViewportAfterAttach();
93565
93665
 
93566
93666
  this._renderViewportAfterAttach();
93667
+
93668
+ let actions = this._postAttachActions;
93669
+ this._postAttachActions = [];
93670
+ actions.forEach(action => action());
93567
93671
  }
93568
93672
 
93569
93673
  _rerenderViewportAfterAttach() {
@@ -93594,12 +93698,6 @@ class Table extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
93594
93698
 
93595
93699
  super._detach();
93596
93700
  }
93597
-
93598
- _onDetach() {
93599
- super._onDetach();
93600
-
93601
- this._destroyCellEditorPopup();
93602
- }
93603
93701
  /**
93604
93702
  * @param {function} [callback] function to be called right after the popup is destroyed
93605
93703
  */
@@ -96396,7 +96494,8 @@ class TableHeader extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
96396
96494
 
96397
96495
  if (column.sortActive || column.grouped || filtered) {
96398
96496
  if (column.minWidth < _index__WEBPACK_IMPORTED_MODULE_0__.Column.DEFAULT_MIN_WIDTH) {
96399
- column.prefMinWidth = column.minWidth;
96497
+ column.__minWidthWithoutState = column.minWidth;
96498
+ column.__widthWithoutState = column.width;
96400
96499
  column.minWidth = _index__WEBPACK_IMPORTED_MODULE_0__.Column.DEFAULT_MIN_WIDTH;
96401
96500
  }
96402
96501
 
@@ -96404,14 +96503,16 @@ class TableHeader extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
96404
96503
  this.table.resizeColumn(column, column.minWidth);
96405
96504
  }
96406
96505
  } else {
96407
- // Reset to preferred min width if no state is visible
96408
- if (column.prefMinWidth !== null) {
96409
- column.minWidth = column.prefMinWidth;
96410
- column.prefMinWidth = null; // Resize to old min width, assuming user has not manually changed the size because column is still as width as default_min_width
96506
+ // Reset to previous min width if no state is visible
96507
+ if (!_index__WEBPACK_IMPORTED_MODULE_0__.objects.isNullOrUndefined(column.__minWidthWithoutState)) {
96508
+ column.minWidth = column.__minWidthWithoutState; // Resize to previous min width, assuming user has not manually changed the size because column is still as width as default_min_width
96411
96509
 
96412
96510
  if (column.width === _index__WEBPACK_IMPORTED_MODULE_0__.Column.DEFAULT_MIN_WIDTH) {
96413
- this.table.resizeColumn(column, column.minWidth);
96511
+ this.table.resizeColumn(column, column.__widthWithoutState);
96414
96512
  }
96513
+
96514
+ column.__minWidthWithoutState = null;
96515
+ column.__widthWithoutState = null;
96415
96516
  }
96416
96517
  }
96417
96518
  }
@@ -96995,7 +97096,10 @@ class TableHeaderMenu extends _index__WEBPACK_IMPORTED_MODULE_0__.Popup {
96995
97096
  this.filterTable.off('rowsChecked', this._filterTableRowsCheckedHandler);
96996
97097
  }
96997
97098
 
96998
- this.tableHeader.$container.off('scroll', this._tableHeaderScrollHandler);
97099
+ if (this.tableHeader.rendered) {
97100
+ this.tableHeader.$container.off('scroll', this._tableHeaderScrollHandler);
97101
+ }
97102
+
96999
97103
  this.$headerItem.select(false);
97000
97104
  this.table.off('columnMoved', this._onColumnMovedHandler);
97001
97105
  this.table.off('filterAdded', this._tableFilterHandler);
@@ -101340,7 +101444,7 @@ __webpack_require__.r(__webpack_exports__);
101340
101444
  /* harmony export */ });
101341
101445
  /* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../index */ "./src/index.js");
101342
101446
  /*
101343
- * Copyright (c) 2010-2020 BSI Business Systems Integration AG.
101447
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
101344
101448
  * All rights reserved. This program and the accompanying materials
101345
101449
  * are made available under the terms of the Eclipse Public License v1.0
101346
101450
  * which accompanies this distribution, and is available at
@@ -101361,7 +101465,7 @@ class BooleanColumn extends _index__WEBPACK_IMPORTED_MODULE_0__.Column {
101361
101465
  this.comparator = _index__WEBPACK_IMPORTED_MODULE_0__.comparators.NUMERIC;
101362
101466
  this.filterType = 'ColumnUserFilter';
101363
101467
  this.horizontalAlignment = 0;
101364
- this.minWidth = _index__WEBPACK_IMPORTED_MODULE_0__.Column.NARROW_MIN_WIDTH;
101468
+ this.minWidth = _index__WEBPACK_IMPORTED_MODULE_0__.Column.SMALL_MIN_WIDTH;
101365
101469
  this.triStateEnabled = false;
101366
101470
  this.textBased = false;
101367
101471
  }
@@ -101544,7 +101648,7 @@ __webpack_require__.r(__webpack_exports__);
101544
101648
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
101545
101649
 
101546
101650
  /*
101547
- * Copyright (c) 2010-2021 BSI Business Systems Integration AG.
101651
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
101548
101652
  * All rights reserved. This program and the accompanying materials
101549
101653
  * are made available under the terms of the Eclipse Public License v1.0
101550
101654
  * which accompanies this distribution, and is available at
@@ -101588,7 +101692,6 @@ class Column {
101588
101692
  this.width = 60;
101589
101693
  this.initialWidth = undefined; // the width the column initially has
101590
101694
 
101591
- this.prefMinWidth = null;
101592
101695
  this.minWidth = Column.DEFAULT_MIN_WIDTH; // the minimal width the column can have
101593
101696
 
101594
101697
  this.showSeparator = true;
@@ -101615,7 +101718,6 @@ class Column {
101615
101718
  this.$separator = null;
101616
101719
  }
101617
101720
 
101618
- // for columns without text (icon, check box)
101619
101721
  init(model) {
101620
101722
  this.session = model.session; // Copy all properties from model to this
101621
101723
 
@@ -102684,6 +102786,8 @@ class Column {
102684
102786
 
102685
102787
  _defineProperty(Column, "DEFAULT_MIN_WIDTH", 60);
102686
102788
 
102789
+ _defineProperty(Column, "SMALL_MIN_WIDTH", 38);
102790
+
102687
102791
  _defineProperty(Column, "NARROW_MIN_WIDTH", 32);
102688
102792
 
102689
102793
  /***/ }),
@@ -105582,7 +105686,7 @@ __webpack_require__.r(__webpack_exports__);
105582
105686
  /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ "jquery");
105583
105687
  /* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);
105584
105688
  /*
105585
- * Copyright (c) 2014-2018 BSI Business Systems Integration AG.
105689
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
105586
105690
  * All rights reserved. This program and the accompanying materials
105587
105691
  * are made available under the terms of the Eclipse Public License v1.0
105588
105692
  * which accompanies this distribution, and is available at
@@ -105644,6 +105748,14 @@ class CellEditorPopup extends _index__WEBPACK_IMPORTED_MODULE_0__.Popup {
105644
105748
  this.position();
105645
105749
  this.pack();
105646
105750
  }
105751
+ /**
105752
+ * @override
105753
+ */
105754
+
105755
+
105756
+ _getDefaultOpen$Parent() {
105757
+ return this.table.$data;
105758
+ }
105647
105759
 
105648
105760
  _render() {
105649
105761
  super._render(); // determine CSS class for first and last column, required for additional margins/padding in cell-editor
@@ -111895,7 +112007,7 @@ class TileGrid extends _index__WEBPACK_IMPORTED_MODULE_0__.Widget {
111895
112007
  }
111896
112008
 
111897
112009
  _onAnimatedTileRemove(tile) {
111898
- if (!tile.rendered || !tile.animateRemoval) {
112010
+ if (!tile.removalPending) {
111899
112011
  return;
111900
112012
  }
111901
112013
 
@@ -113343,7 +113455,7 @@ __webpack_require__.r(__webpack_exports__);
113343
113455
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
113344
113456
 
113345
113457
  /*
113346
- * Copyright (c) 2010-2021 BSI Business Systems Integration AG.
113458
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
113347
113459
  * All rights reserved. This program and the accompanying materials
113348
113460
  * are made available under the terms of the Eclipse Public License v1.0
113349
113461
  * which accompanies this distribution, and is available at
@@ -113508,7 +113620,7 @@ class TileGridLayout extends _index__WEBPACK_IMPORTED_MODULE_0__.LogicalGridLayo
113508
113620
 
113509
113621
  _layoutCellBounds(containerSize, containerInsets) {
113510
113622
  // Since the tiles are positioned absolutely it is necessary to add the height of the filler to the top insets
113511
- if (this.widget.virtual) {
113623
+ if (this.widget.virtual && this.widget.$fillBefore) {
113512
113624
  containerInsets.top += this.widget.$fillBefore.outerHeight(true);
113513
113625
  }
113514
113626
 
@@ -114635,7 +114747,7 @@ __webpack_require__.r(__webpack_exports__);
114635
114747
  /* harmony export */ });
114636
114748
  /* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../index */ "./src/index.js");
114637
114749
  /*
114638
- * Copyright (c) 2010-2021 BSI Business Systems Integration AG.
114750
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
114639
114751
  * All rights reserved. This program and the accompanying materials
114640
114752
  * are made available under the terms of the Eclipse Public License v1.0
114641
114753
  * which accompanies this distribution, and is available at
@@ -115018,7 +115130,24 @@ class TileAccordion extends _index__WEBPACK_IMPORTED_MODULE_0__.Accordion {
115018
115130
 
115019
115131
  _filter() {
115020
115132
  this.groups.forEach(group => {
115021
- group.body.filter();
115133
+ group.body.filter(); // If the layout has not been invalidated as part of the filtering above, it even though must be validated here.
115134
+ // This is because groups above might have fewer visible Tiles now which makes room for this group.
115135
+ // The revalidateLayout() with scrolling=true here ensures TileGrid._renderViewPort() is called to ensure these Tiles become visible as there is space available now.
115136
+ // It is executed as postValidateFunction because the groups above must have completed their layouting so that
115137
+ // TileGrid._renderViewPort() knows that there is more space available now.
115138
+
115139
+ if (group.body.htmlComp && group.body.htmlComp.valid && !group.body._accordionLayoutHandler
115140
+ /* skip if already registered */
115141
+ ) {
115142
+ group.body._accordionLayoutHandler = () => {
115143
+ group.body.scrolling = true;
115144
+ group.body.revalidateLayout();
115145
+ group.body.scrolling = false;
115146
+ group.body._accordionLayoutHandler = null;
115147
+ };
115148
+
115149
+ this.session.layoutValidator.schedulePostValidateFunction(group.body._accordionLayoutHandler);
115150
+ }
115022
115151
  });
115023
115152
  }
115024
115153
  /**
@@ -126123,6 +126252,7 @@ __webpack_require__.r(__webpack_exports__);
126123
126252
  /* harmony export */ "$remove": () => (/* binding */ $remove),
126124
126253
  /* harmony export */ "randomElement": () => (/* binding */ randomElement),
126125
126254
  /* harmony export */ "toMap": () => (/* binding */ toMap),
126255
+ /* harmony export */ "nullIfEmpty": () => (/* binding */ nullIfEmpty),
126126
126256
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
126127
126257
  /* harmony export */ });
126128
126258
  /* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index */ "./src/index.js");
@@ -126348,6 +126478,12 @@ function containsAll(haystack, needles) {
126348
126478
  return haystack.indexOf(element) >= 0;
126349
126479
  });
126350
126480
  }
126481
+ /**
126482
+ * @template T
126483
+ * @param {T[]} arr
126484
+ * @return {T}
126485
+ */
126486
+
126351
126487
  function first(arr) {
126352
126488
  if (Array.isArray(arr)) {
126353
126489
  return arr[0];
@@ -126355,6 +126491,12 @@ function first(arr) {
126355
126491
 
126356
126492
  return arr;
126357
126493
  }
126494
+ /**
126495
+ * @template T
126496
+ * @param {T[]} arr
126497
+ * @return {T}
126498
+ */
126499
+
126358
126500
  function last(arr) {
126359
126501
  if (Array.isArray(arr)) {
126360
126502
  return arr[arr.length - 1];
@@ -126427,9 +126569,9 @@ function union(array1, array2) {
126427
126569
  }
126428
126570
  });
126429
126571
  return result;
126430
- } // noinspection DuplicatedCode
126431
-
126572
+ }
126432
126573
  function equalsIgnoreOrder(arr, arr2) {
126574
+ // noinspection DuplicatedCode
126433
126575
  if (arr === arr2) {
126434
126576
  return true;
126435
126577
  }
@@ -126447,9 +126589,9 @@ function equalsIgnoreOrder(arr, arr2) {
126447
126589
  }
126448
126590
 
126449
126591
  return containsAll(arr, arr2);
126450
- } // noinspection DuplicatedCode
126451
-
126592
+ }
126452
126593
  function equals(arr, arr2) {
126594
+ // noinspection DuplicatedCode
126453
126595
  if (arr === arr2) {
126454
126596
  return true;
126455
126597
  }
@@ -126777,6 +126919,17 @@ function toMap(array) {
126777
126919
  return map;
126778
126920
  }, {}));
126779
126921
  }
126922
+ /**
126923
+ * If the argument is an empty array, null is returned. Otherwise, the argument is returned unchanged.
126924
+ *
126925
+ * @template T
126926
+ * @param {T[]} array
126927
+ * @return {T[]|null}
126928
+ */
126929
+
126930
+ function nullIfEmpty(array) {
126931
+ return empty(array) ? null : array;
126932
+ }
126780
126933
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
126781
126934
  $indexOf,
126782
126935
  $remove,
@@ -126815,6 +126968,7 @@ function toMap(array) {
126815
126968
  max,
126816
126969
  min,
126817
126970
  move,
126971
+ nullIfEmpty,
126818
126972
  pushAll,
126819
126973
  pushIfDefined,
126820
126974
  pushSet,
@@ -131161,12 +131315,16 @@ function resolveConstProperty(object, config) {
131161
131315
  /**
131162
131316
  * @param {object} obj
131163
131317
  * @returns {Boolean|undefined}
131164
- * - true if the obj is empty
131318
+ * - true if the obj is empty, null or undefined
131165
131319
  * - false if the obj is not empty
131166
131320
  * - nothing if the obj is not an object
131167
131321
  */
131168
131322
 
131169
131323
  function isEmpty(obj) {
131324
+ if (isNullOrUndefined(obj)) {
131325
+ return true;
131326
+ }
131327
+
131170
131328
  if (!isPlainObject(obj)) {
131171
131329
  return;
131172
131330
  }
@@ -134044,7 +134202,9 @@ class Widget {
134044
134202
 
134045
134203
 
134046
134204
  _removeAnimated() {
134047
- if (!_index__WEBPACK_IMPORTED_MODULE_0__.Device.get().supportsCssAnimation() || !this.$container || this.$container.isDisplayNone()) {
134205
+ let animateRemovalWhileRemovingParent = this._animateRemovalWhileRemovingParent();
134206
+
134207
+ if (this.parent.removing && !animateRemovalWhileRemovingParent || !_index__WEBPACK_IMPORTED_MODULE_0__.Device.get().supportsCssAnimation() || !this.$container || this.$container.isDisplayNone()) {
134048
134208
  // Cannot remove animated, remove regularly
134049
134209
  this._removeInternal();
134050
134210
 
@@ -134066,7 +134226,7 @@ class Widget {
134066
134226
  throw new Error('Missing animate removal class. Cannot remove animated.');
134067
134227
  }
134068
134228
 
134069
- if (!this.$container.isVisible() || !this.$container.isEveryParentVisible()) {
134229
+ if (!this.$container.isVisible() || !this.$container.isEveryParentVisible() || !this.$container.isAttached()) {
134070
134230
  // If element is not visible, animationEnd would never fire -> remove it immediately
134071
134231
  this._removeInternal();
134072
134232
 
@@ -134080,7 +134240,14 @@ class Widget {
134080
134240
  }); // If the parent is being removed while the animation is running, the animationEnd event will never fire
134081
134241
  // -> Make sure remove is called nevertheless. Important: remove it before the parent is removed to maintain the regular remove order
134082
134242
 
134083
- this.parent.one('removing', this._parentRemovingWhileAnimatingHandler);
134243
+ if (!animateRemovalWhileRemovingParent) {
134244
+ this.parent.one('removing', this._parentRemovingWhileAnimatingHandler);
134245
+ }
134246
+ }
134247
+
134248
+ _animateRemovalWhileRemovingParent() {
134249
+ // By default, remove animation is prevented when parent is being removed
134250
+ return false;
134084
134251
  }
134085
134252
 
134086
134253
  _onParentRemovingWhileAnimating() {