@eclipse-scout/core 22.0.0-beta.5 → 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 (101) 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 +511 -399
  6. package/dist/eclipse-scout-core-theme-dark.css.map +1 -1
  7. package/dist/eclipse-scout-core-theme.css +247 -135
  8. package/dist/eclipse-scout-core-theme.css.map +1 -1
  9. package/dist/eclipse-scout-core.js +865 -646
  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/App.js +17 -10
  16. package/src/action/Button.less +1 -0
  17. package/src/box/Box.less +2 -2
  18. package/src/breadcrumbbar/BreadcrumbBarLayout.js +2 -2
  19. package/src/calendar/Calendar.js +40 -58
  20. package/src/calendar/Calendar.less +10 -10
  21. package/src/calendar/CalendarLayout.js +3 -1
  22. package/src/datepicker/DatePicker.less +1 -0
  23. package/src/desktop/desktoptab/DesktopTab.less +19 -2
  24. package/src/desktop/desktoptab/DesktopTabArea.less +7 -3
  25. package/src/desktop/desktoptab/DesktopTabAreaLayout.js +1 -1
  26. package/src/desktop/navigation/DesktopNavigation.less +4 -0
  27. package/src/desktop/notification/DesktopNotification.js +11 -4
  28. package/src/desktop/notification/DesktopNotification.less +5 -3
  29. package/src/desktop/outline/Outline.js +0 -30
  30. package/src/desktop/outline/Outline.less +4 -4
  31. package/src/desktop/viewbutton/ViewButton.less +18 -9
  32. package/src/desktop/viewbutton/ViewButtonBox.js +2 -2
  33. package/src/desktop/viewbutton/ViewMenuTab.less +3 -2
  34. package/src/filechooser/FileChooser.less +1 -1
  35. package/src/form/Form.less +1 -0
  36. package/src/form/fields/LookupBox.js +2 -1
  37. package/src/form/fields/breadcrumbbarfield/BreadcrumbBarField.less +14 -0
  38. package/src/form/fields/groupbox/GroupBox.js +13 -9
  39. package/src/form/fields/groupbox/GroupBox.less +4 -1
  40. package/src/form/fields/htmlfield/HtmlField.less +0 -1
  41. package/src/form/fields/listbox/ListBox.js +8 -3
  42. package/src/form/fields/tabbox/TabAreaLayout.js +63 -66
  43. package/src/form/fields/tabbox/TabBox.js +4 -7
  44. package/src/form/fields/tabbox/TabBox.less +2 -1
  45. package/src/form/fields/tabbox/TabBoxHeaderLayout.js +5 -5
  46. package/src/glasspane/GlassPane.js +3 -3
  47. package/src/group/Group.less +1 -1
  48. package/src/index.js +2 -1
  49. package/src/index.less +1 -0
  50. package/src/jquery/jquery-scout.js +5 -4
  51. package/src/login/LoginBox.less +9 -7
  52. package/src/menu/ContextMenuPopup.less +9 -2
  53. package/src/menu/Menu.less +1 -0
  54. package/src/messagebox/MessageBox.less +3 -3
  55. package/src/modeselector/Mode.less +15 -37
  56. package/src/modeselector/ModeSelector.js +1 -1
  57. package/src/modeselector/ModeSelector.less +2 -1
  58. package/src/planner/PlannerHeader.less +2 -1
  59. package/src/popup/Popup.js +24 -8
  60. package/src/popup/PopupLayout.js +2 -8
  61. package/src/scrollbar/Scrollbar.less +8 -1
  62. package/src/scrollbar/scrollbars.js +26 -4
  63. package/src/session/Session.js +4 -1
  64. package/src/style/colors-dark.less +25 -11
  65. package/src/style/colors.less +17 -3
  66. package/src/style/fonts.less +5 -0
  67. package/src/style/mixins.less +21 -14
  68. package/src/style/sizes-dark.less +4 -1
  69. package/src/style/sizes.less +7 -7
  70. package/src/table/Table.js +45 -33
  71. package/src/table/Table.less +49 -16
  72. package/src/table/TableHeader.js +10 -8
  73. package/src/table/TableHeader.less +1 -0
  74. package/src/table/TableHeaderMenu.js +3 -1
  75. package/src/table/TableHeaderMenu.less +7 -2
  76. package/src/table/columns/BooleanColumn.js +2 -2
  77. package/src/table/columns/Column.js +3 -3
  78. package/src/table/columns/ColumnOptimalWidthMeasurer.js +1 -1
  79. package/src/table/editor/CellEditorPopup.js +8 -1
  80. package/src/tagbar/TagBarOverflowPopupLayout.js +1 -1
  81. package/src/tile/TileGrid.js +1 -1
  82. package/src/tile/TileGridLayout.js +2 -2
  83. package/src/tile/accordion/TileAccordion.js +16 -1
  84. package/src/tile/fields/FormFieldTile.less +18 -11
  85. package/src/tile/fields/button/ButtonTile.js +1 -1
  86. package/src/tile/fields/htmlfield/TileHtmlField.js +28 -0
  87. package/src/tooltip/Tooltip.less +7 -5
  88. package/src/tree/CompactTree.less +1 -1
  89. package/src/tree/LazyNodeFilter.js +26 -15
  90. package/src/tree/Tree.js +114 -143
  91. package/src/tree/Tree.less +3 -5
  92. package/src/tree/TreeLayout.js +1 -1
  93. package/src/tree/TreeNode.js +2 -2
  94. package/src/util/Device.js +6 -2
  95. package/src/util/arrays.js +24 -2
  96. package/src/util/dragAndDrop.js +5 -4
  97. package/src/util/events.js +1 -1
  98. package/src/util/objects.js +4 -1
  99. package/src/widget/FilterSupport.js +7 -5
  100. package/src/widget/FilterSupport.less +38 -9
  101. package/src/widget/Widget.js +24 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-scout/core",
3
- "version": "22.0.0-beta.5",
3
+ "version": "22.0.2",
4
4
  "description": "Eclipse Scout runtime",
5
5
  "author": "BSI Business Systems Integration AG",
6
6
  "homepage": "https://www.eclipse.org/scout",
@@ -26,7 +26,7 @@
26
26
  "src"
27
27
  ],
28
28
  "devDependencies": {
29
- "@eclipse-scout/cli": "22.0.0-beta.5",
29
+ "@eclipse-scout/cli": "22.0.2",
30
30
  "@eclipse-scout/releng": "^22.0.0",
31
31
  "jasmine-core": "3.10.1",
32
32
  "jasmine-ajax": "4.0.0",
package/src/App.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2010-2021 BSI Business Systems Integration AG.
2
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
3
3
  * All rights reserved. This program and the accompanying materials
4
4
  * are made available under the terms of the Eclipse Public License v1.0
5
5
  * which accompanies this distribution, and is available at
@@ -196,7 +196,7 @@ export default class App {
196
196
  */
197
197
  _init(options) {
198
198
  options = options || {};
199
- this.setLoading(true)
199
+ this.setLoading(true);
200
200
  let compatibilityPromise = this._checkBrowserCompatibility(options);
201
201
  if (compatibilityPromise) {
202
202
  this.setLoading(false);
@@ -224,7 +224,6 @@ export default class App {
224
224
 
225
225
  _checkBrowserCompatibility(options) {
226
226
  let device = Device.get();
227
- let app = this;
228
227
  $.log.isInfoEnabled() && $.log.info('Detected browser ' + device.browser + ' version ' + device.browserVersion);
229
228
  if (!scout.nvl(options.checkBrowserCompatibility, true) || device.isSupportedBrowser()) {
230
229
  // No check requested or browser is supported
@@ -292,7 +291,7 @@ export default class App {
292
291
  $loadingRoot.css('opacity', $loadingRoot.css('opacity'));
293
292
  // Add animation listener before adding the classes to ensure the listener will always be triggered even while debugging
294
293
  $loadingRoot.oneAnimationEnd(() => $loadingRoot.remove());
295
- if ($loadingRoot.css('opacity') == 1) {
294
+ if ($loadingRoot.css('opacity') === '1') {
296
295
  $loadingRoot.addClass('fadeout and-more');
297
296
  } else {
298
297
  $loadingRoot.addClass('fadeout');
@@ -400,9 +399,7 @@ export default class App {
400
399
 
401
400
  // TODO [7.0] cgu improve this, start must not be executed because it currently does a server request
402
401
  let desktop = this._createDesktop(session.root);
403
- this.trigger('desktopReady', {
404
- desktop: desktop
405
- });
402
+ this._triggerDesktopReady(desktop);
406
403
  session.render(() => {
407
404
  session._renderDesktop();
408
405
 
@@ -411,14 +408,24 @@ export default class App {
411
408
  session.focusManager.validateFocus();
412
409
 
413
410
  session.ready = true;
414
- this.trigger('sessionReady', {
415
- session: session
416
- });
411
+ this._triggerSessionReady(session);
417
412
  $.log.isInfoEnabled() && $.log.info('Session initialized. Detected ' + Device.get());
418
413
  });
419
414
  return $.resolvedPromise();
420
415
  }
421
416
 
417
+ _triggerDesktopReady(desktop) {
418
+ this.trigger('desktopReady', {
419
+ desktop: desktop
420
+ });
421
+ }
422
+
423
+ _triggerSessionReady(session) {
424
+ this.trigger('sessionReady', {
425
+ session: session
426
+ });
427
+ }
428
+
422
429
  _createSession(options) {
423
430
  return scout.create('Session', options, {
424
431
  ensureUniqueId: false
@@ -33,6 +33,7 @@
33
33
 
34
34
  & > .text {
35
35
  #scout.overflow-ellipsis-nowrap();
36
+ margin-top: @text-margin-top;
36
37
  }
37
38
 
38
39
  & > .icon {
package/src/box/Box.less CHANGED
@@ -26,9 +26,9 @@
26
26
  }
27
27
 
28
28
  .box-content {
29
- border: 1px solid @border-color;
29
+ border: @popup-border-width solid @popup-border-color;
30
30
  border-radius: @border-radius-large;
31
- background-color: @background-color;
31
+ background-color: @popup-background-color;
32
32
  max-width: @box-width;
33
33
  margin: 0 auto;
34
34
  padding: 45px 95px 50px 95px;
@@ -44,7 +44,7 @@ export default class BreadcrumbBarLayout extends AbstractLayout {
44
44
  this._collapse(breadcrumbItems, containerSize);
45
45
  }
46
46
 
47
- _collapse = function($container, containerSize) {
47
+ _collapse($container, containerSize) {
48
48
  let currentIndex = 1;
49
49
  const visibleBreadcrumbItems = this._visibleBreadcrumbItems();
50
50
  let prefSize = this._actualPrefSize(visibleBreadcrumbItems, true);
@@ -116,7 +116,7 @@ export default class BreadcrumbBarLayout extends AbstractLayout {
116
116
  /**
117
117
  * @return {number} the preferred width of all breadcrumbItems (plus ellipsis breadcrumb)
118
118
  */
119
- _breadcrumbItemsWidth = function(breadcrumbItems, considerEllipsis) {
119
+ _breadcrumbItemsWidth(breadcrumbItems, considerEllipsis) {
120
120
  let breadcrumbsWidth = 0;
121
121
  breadcrumbItems = breadcrumbItems || this._visibleBreadcrumbItems();
122
122
  breadcrumbItems.forEach(breadcrumbItem => {
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2010-2020 BSI Business Systems Integration AG.
2
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
3
3
  * All rights reserved. This program and the accompanying materials
4
4
  * are made available under the terms of the Eclipse Public License v1.0
5
5
  * which accompanies this distribution, and is available at
@@ -8,27 +8,7 @@
8
8
  * Contributors:
9
9
  * BSI Business Systems Integration AG - initial API and implementation
10
10
  */
11
- import {
12
- CalendarComponent,
13
- CalendarLayout,
14
- CalendarListComponent,
15
- DateRange,
16
- dates,
17
- Device,
18
- events,
19
- GroupBox,
20
- HtmlComponent,
21
- KeyStrokeContext,
22
- menus,
23
- numbers,
24
- objects,
25
- Point,
26
- Range,
27
- scout,
28
- scrollbars,
29
- strings,
30
- Widget
31
- } from '../index';
11
+ import {CalendarComponent, CalendarLayout, CalendarListComponent, DateRange, dates, Device, events, GroupBox, HtmlComponent, KeyStrokeContext, menus, numbers, objects, Point, Range, scout, scrollbars, strings, Widget} from '../index';
32
12
  import $ from 'jquery';
33
13
 
34
14
  export default class Calendar extends Widget {
@@ -759,11 +739,9 @@ export default class Calendar extends Widget {
759
739
  this.$topGrid.find('.calendar-day-name').data('new-width', 0);
760
740
  this.$grids.find('.calendar-day').data('new-width', 0);
761
741
  let newWidthWorkWeek = Math.round(contentW / this.workDayIndices.length);
762
- $('.calendar-day-name:nth-child(-n+6), ' +
763
- '.calendar-day:nth-child(-n+6)', this.$topGrid)
764
- .data('new-width', newWidthWorkWeek);
765
- $('.calendar-day:nth-child(-n+6)', this.$grid)
766
- .data('new-width', newWidthWorkWeek);
742
+ this.$topGrid.find('.calendar-day-name').slice(0, 5).data('new-width', newWidthWorkWeek);
743
+ this.$topGrid.find('.calendar-day').slice(0, 5).data('new-width', newWidthWorkWeek);
744
+ $('.calendar-day:nth-child(-n+6)', this.$grid).data('new-width', newWidthWorkWeek);
767
745
  this.widthPerDivision = newWidthWorkWeek;
768
746
  } else if (this._isMonth() || this._isWeek()) {
769
747
  let newWidthMonthOrWeek = Math.round(contentW / 7);
@@ -781,21 +759,26 @@ export default class Calendar extends Widget {
781
759
  });
782
760
  }
783
761
 
784
- let afterLayoutCallback = this._afterLayout.bind(this);
785
-
786
762
  // animate old to new sizes
787
- $('div', this.$container).each(function() {
788
- let $e = $(this),
789
- w = $e.data('new-width'),
790
- h = $e.data('new-height');
763
+ $('div', this.$container).each((i, elem) => {
764
+ let $e = $(elem);
765
+ let w = $e.data('new-width');
766
+ let h = $e.data('new-height');
791
767
  $e.stop(false, true);
792
768
 
793
769
  if (w !== undefined && w !== $e.outerWidth()) {
794
770
  if (animate) {
795
- $e.animateAVCSD('width', w, afterLayoutCallback.bind(this, $e, animate));
771
+ let opts = {
772
+ complete: () => this._afterLayout($e, animate)
773
+ };
774
+ if ($e[0] === this.$grids[0]) {
775
+ // Grid contains scroll shadows that should be updated during animation (don't due it always for performance reasons)
776
+ opts.progress = () => this._afterLayout($e, animate);
777
+ }
778
+ $e.animate({width: w}, opts);
796
779
  } else {
797
780
  $e.css('width', w);
798
- afterLayoutCallback($e, animate);
781
+ this._afterLayout($e, animate);
799
782
  }
800
783
  }
801
784
  if (h !== undefined && h !== $e.outerHeight()) {
@@ -807,14 +790,14 @@ export default class Calendar extends Widget {
807
790
  if (h === 0) {
808
791
  $e.addClass('hidden');
809
792
  }
810
- afterLayoutCallback($e, animate);
793
+ this._afterLayout($e, animate);
811
794
  });
812
795
  } else {
813
796
  $e.css('height', h);
814
797
  if (h === 0) {
815
798
  $e.addClass('hidden');
816
799
  }
817
- afterLayoutCallback($e, animate);
800
+ this._afterLayout($e, animate);
818
801
  }
819
802
  }
820
803
  });
@@ -853,13 +836,18 @@ export default class Calendar extends Widget {
853
836
 
854
837
  _updateScrollbars($parent, animate) {
855
838
  let $scrollables = $('.calendar-scrollable-components', $parent);
856
- $scrollables.each(function() {
857
- let $scrollable = $(this);
858
- scrollbars.update($scrollable, true);
839
+ $scrollables.each((i, elem) => {
840
+ scrollbars.update($(elem), true);
859
841
  });
860
842
  this.updateScrollPosition(animate);
861
843
  }
862
844
 
845
+ _uninstallComponentScrollbars($parent) {
846
+ $parent.find('.calendar-scrollable-components').each((i, elem) => {
847
+ scrollbars.uninstall($(elem), this.session);
848
+ });
849
+ }
850
+
863
851
  _updateTopGrid() {
864
852
  $('.calendar-component', this.$topGrid).each((index, part) => {
865
853
  let component = $(part).data('component');
@@ -1037,18 +1025,8 @@ export default class Calendar extends Widget {
1037
1025
  }
1038
1026
 
1039
1027
  _remove() {
1040
- let $days = $('.calendar-day', this.$grid);
1041
-
1042
- // Ensure that scrollbars are unregistered
1043
- for (let k = 0; k < $days.length; k++) {
1044
- let $day = $days.eq(k);
1045
- let $scrollableContainer = $day.children('.calendar-scrollable-components');
1046
-
1047
- if ($scrollableContainer.length > 0) {
1048
- scrollbars.uninstall($scrollableContainer, this.session);
1049
- $scrollableContainer.remove();
1050
- }
1051
- }
1028
+ this._uninstallComponentScrollbars(this.$grid);
1029
+ this._uninstallComponentScrollbars(this.$topGrid);
1052
1030
 
1053
1031
  this.$window
1054
1032
  .off('mousemove touchmove', this._mouseMoveHandler)
@@ -1179,6 +1157,7 @@ export default class Calendar extends Widget {
1179
1157
 
1180
1158
  if (this._isMonth()) {
1181
1159
  this._uninstallScrollbars();
1160
+ this._uninstallComponentScrollbars(this.$topGrid);
1182
1161
  this.$grid.removeClass('calendar-scrollable-components');
1183
1162
  } else {
1184
1163
  this.$grid.addClass('calendar-scrollable-components');
@@ -1188,16 +1167,19 @@ export default class Calendar extends Widget {
1188
1167
  session: this.session,
1189
1168
  axis: 'y'
1190
1169
  });
1191
-
1192
- let $topDays = $('.calendar-scrollable-components', this.$topGrid);
1193
- for (k = 0; k < $topDays.length; k++) {
1194
- let $topDay = $topDays.eq(k);
1170
+ this.$topGrid.find('.calendar-scrollable-components').each((i, elem) => {
1171
+ let $topDay = $(elem);
1172
+ if ($topDay.data('scrollable')) {
1173
+ scrollbars.update($topDay);
1174
+ return;
1175
+ }
1195
1176
  scrollbars.install($topDay, {
1196
1177
  parent: this,
1197
1178
  session: this.session,
1198
- axis: 'y'
1179
+ axis: 'y',
1180
+ scrollShadow: 'none'
1199
1181
  });
1200
- }
1182
+ });
1201
1183
  }
1202
1184
  }
1203
1185
 
@@ -28,15 +28,6 @@
28
28
  height: 100%;
29
29
  }
30
30
 
31
- .calendar-week-scrollable {
32
- overflow: visible;
33
- }
34
-
35
- .calendar-scrollable-components-week {
36
- top: calc(@calendar-day-selected-circle-size ~'+ 5px');
37
- height: calc(~'15% - (' @calendar-day-selected-circle-size ~' + 5px)');
38
- }
39
-
40
31
  .calendar-header {
41
32
  position: relative;
42
33
  display: block;
@@ -147,7 +138,8 @@
147
138
  }
148
139
 
149
140
  .calendar-mode {
150
- width: 65px;
141
+ padding: 0 8px;
142
+ min-width: 65px;
151
143
 
152
144
  border-top: 1px solid @control-border-color;
153
145
  border-bottom: 1px solid @control-border-color;
@@ -362,8 +354,16 @@
362
354
  height: calc(~'100% - 25px');
363
355
  padding-right: @root-group-box-padding-right;
364
356
 
357
+ & + .scroll-shadow {
358
+ --scroll-shadow-inset-right: @root-group-box-padding-right;
359
+ }
360
+
365
361
  &.mobile {
366
362
  padding-right: @calendar-padding-right-mobile;
363
+
364
+ & + .scroll-shadow {
365
+ --scroll-shadow-inset-right: @calendar-padding-right-mobile;
366
+ }
367
367
  }
368
368
  }
369
369
 
@@ -17,6 +17,7 @@ export default class CalendarLayout extends AbstractLayout {
17
17
  this.calendar = calendar;
18
18
  this.stacked = false;
19
19
  this.compacted = false;
20
+ this.compactWidth = 550;
20
21
  }
21
22
 
22
23
  layout($container) {
@@ -34,7 +35,8 @@ export default class CalendarLayout extends AbstractLayout {
34
35
  if ($header[0].scrollWidth > $container.width()) {
35
36
  this.stack();
36
37
  }
37
- if ($header[0].scrollWidth > $container.width()) {
38
+ if ($container.width() < this.compactWidth || $header[0].scrollWidth > $container.width()) {
39
+ // 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
38
40
  this.compact();
39
41
  }
40
42
 
@@ -142,6 +142,7 @@
142
142
  cursor: default;
143
143
  font-size: 18px;
144
144
  line-height: 30px;
145
+ margin-top: @text-margin-top;
145
146
  #scout.overflow-ellipsis-nowrap();
146
147
  }
147
148
 
@@ -10,11 +10,12 @@
10
10
  */
11
11
  .desktop-tab.simple-tab {
12
12
  width: @desktop-tab-width;
13
- min-width: @desktop-tab-min-width ;
13
+ min-width: @desktop-tab-min-width;
14
14
  margin: @desktop-tab-margin-top @desktop-tab-margin-right 0 0;
15
15
  padding: @desktop-tab-padding @desktop-tab-padding 0 @desktop-tab-padding-left;
16
16
  border-radius: @desktop-tab-border-radius @desktop-tab-border-radius 0 0;
17
- border-right-width: 0;
17
+ border: @desktop-tab-border-width solid @desktop-tab-border-color;
18
+ border-bottom-width: 0;
18
19
  background-color: @desktop-tab-background-color;
19
20
 
20
21
  & > .title-line {
@@ -79,12 +80,27 @@
79
80
  &:hover,
80
81
  &:active {
81
82
  background-color: @desktop-tab-hover-background-color;
83
+ border-color: transparent;
82
84
 
83
85
  & > .title-line > .title {
84
86
  color: inherit;
85
87
  }
86
88
  }
87
89
 
90
+ &.glasspane-parent {
91
+ // Modality highlight does not work with pointer-events: none because mouse down is ignored on the glass pane completely by the browser
92
+ // -> we need to disable the hover effect manually
93
+ pointer-events: unset;
94
+
95
+ &:not(.disabled):not(.selected):hover {
96
+ background-color: @desktop-tab-background-color;
97
+ }
98
+
99
+ &:not(.selected):hover > .closer {
100
+ display: none;
101
+ }
102
+ }
103
+
88
104
  &.disabled {
89
105
  background-color: transparent;
90
106
 
@@ -95,6 +111,7 @@
95
111
 
96
112
  &.selected {
97
113
  background-color: @simple-tab-selected-background-color;
114
+ border-color: transparent;
98
115
 
99
116
  & > .title-line {
100
117
  & > .icon-container {
@@ -11,17 +11,21 @@
11
11
  .desktop-tab-area {
12
12
 
13
13
  & > .simple-overflow-tab-item {
14
- border-radius: @desktop-tab-border-radius;
15
- margin: @desktop-tab-margin-top @desktop-tab-margin-right @desktop-tab-margin-right * 2;
14
+ @desktop-overflow-tab-margin-bottom: @desktop-tab-margin-right * 2;
15
+
16
+ border-radius: @view-tab-border-radius; // Use smaller border radius, so it fits nicely into the inverted border radius of the last tab if it is selected
17
+ margin: @desktop-tab-margin-top + @desktop-overflow-tab-margin-bottom @desktop-tab-margin-right @desktop-overflow-tab-margin-bottom;
16
18
  background-color: @desktop-tab-background-color;
17
- border: 0;
19
+ border: @desktop-tab-border-width solid @desktop-tab-border-color;
18
20
 
19
21
  &:hover {
20
22
  background-color: @desktop-tab-hover-background-color;
23
+ border-color: transparent;
21
24
  }
22
25
 
23
26
  &.selected {
24
27
  background-color: @desktop-tab-hover-background-color;
28
+ border-color: transparent;
25
29
  }
26
30
  }
27
31
  }
@@ -19,4 +19,4 @@ export default class DesktopTabAreaLayout extends SimpleTabAreaLayout {
19
19
  super.layout($container);
20
20
  this.tabArea.updateFirstTabSelected();
21
21
  }
22
- }
22
+ }
@@ -47,5 +47,9 @@
47
47
  & > .font-icon {
48
48
  font-size: @view-tab-icon-font-size;
49
49
  }
50
+
51
+ &.ellipsis > .font-icon {
52
+ font-size: @view-tab-icon-font-size + 2px;
53
+ }
50
54
  }
51
55
  }
@@ -160,18 +160,17 @@ export default class DesktopNotification extends ScoutNotification {
160
160
  return;
161
161
  }
162
162
  if (this.nativeNotificationVisibility === DesktopNotification.NativeNotificationVisibility.NONE) {
163
+ this._hideLaterIfNativeOnly();
163
164
  return;
164
165
  }
165
166
 
166
167
  if (this.nativeNotificationVisibility === DesktopNotification.NativeNotificationVisibility.BACKGROUND && !this._isDocumentHidden()) {
168
+ this._hideLaterIfNativeOnly();
167
169
  return;
168
170
  }
169
171
 
170
172
  if (window.Notification && Notification.permission === 'denied') {
171
- if (this.nativeOnly) {
172
- // If native notifications are not allowed, there is no need to keep the (invisible) desktop notification open
173
- this.hide();
174
- }
173
+ this._hideLaterIfNativeOnly();
175
174
  return;
176
175
  }
177
176
  if (this._checkNotificationPromise()) {
@@ -182,6 +181,14 @@ export default class DesktopNotification extends ScoutNotification {
182
181
  }
183
182
  }
184
183
 
184
+ _hideLaterIfNativeOnly() {
185
+ if (!this.nativeOnly) {
186
+ return;
187
+ }
188
+ // If native notifications are not shown, there is no need to keep the (invisible) desktop notification open (prevent dom-leak)
189
+ setTimeout(() => this.hide()); // async because this method is called in render and removing the notification within render throws exception
190
+ }
191
+
185
192
  /**
186
193
  * Checks if browser supports the promise-based version of the method requestPermission. Safari only supports the older callback version.
187
194
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2010-2021 BSI Business Systems Integration AG.
2
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
3
3
  * All rights reserved. This program and the accompanying materials
4
4
  * are made available under the terms of the Eclipse Public License v1.0
5
5
  * which accompanies this distribution, and is available at
@@ -12,12 +12,14 @@
12
12
  @desktop-notification-margin-bottom: 10px;
13
13
 
14
14
  .desktop-notifications {
15
+ @desktop-notifications-margin-top: @desktop-header-height + 8px;
16
+
15
17
  position: fixed;
16
18
  right: 10px;
17
19
  top: 0;
18
- height: 100%;
20
+ height: calc(~'100% - ' @desktop-notifications-margin-top);
19
21
  width: @desktop-notification-width;
20
- margin-top: @desktop-header-height + 8px;
22
+ margin-top: @desktop-notifications-margin-top;
21
23
  pointer-events: none; /* Don't block access to the elements in the background */
22
24
  }
23
25
 
@@ -1076,42 +1076,12 @@ export default class Outline extends Tree {
1076
1076
  if (desktop.navigation) {
1077
1077
  $elements.push(desktop.navigation.$body);
1078
1078
  }
1079
- if (desktop.bench && element instanceof Form && element.displayHint === Form.DisplayHint.VIEW) {
1080
- arrays.pushAll($elements, this._getBenchGlassPaneTargetsForView(element));
1081
- }
1082
1079
  if (desktop.bench && desktop.bench.outlineContent) {
1083
1080
  arrays.pushAll($elements, desktop.bench.outlineContent.glassPaneTargets(element));
1084
1081
  }
1085
1082
  return $elements;
1086
1083
  }
1087
1084
 
1088
- _getBenchGlassPaneTargetsForView(view) {
1089
- let $glassPanes = [];
1090
- $glassPanes = $glassPanes.concat(this._getTabGlassPaneTargetsForView(view, this.session.desktop.header));
1091
- this.session.desktop.bench.visibleTabBoxes().forEach(function(tabBox) {
1092
- if (tabBox.hasView(view)) {
1093
- arrays.pushAll($glassPanes, this._getTabGlassPaneTargetsForView(view, tabBox));
1094
- } else if (tabBox.$container) {
1095
- $glassPanes.push(tabBox.$container);
1096
- }
1097
- }, this);
1098
- return $glassPanes;
1099
- }
1100
-
1101
- _getTabGlassPaneTargetsForView(view, tabBox) {
1102
- let $glassPanes = [];
1103
- tabBox.tabArea.tabs.forEach(tab => {
1104
- if (tab.view !== view && tab.view.displayParent === this) {
1105
- $glassPanes.push(tab.$container);
1106
- // Workaround for javascript not being able to prevent hover event propagation:
1107
- // In case of tabs, the hover selector is defined on the element that is the direct parent
1108
- // of the glass pane. Under these circumstances, the hover style isn't be prevented by the glass pane.
1109
- tab.$container.addClass('glasspane-parent');
1110
- }
1111
- });
1112
- return $glassPanes;
1113
- }
1114
-
1115
1085
  _onGlassPaneMouseDown(glassPaneOwner, $glassPane) {
1116
1086
  let desktop = this.session.desktop;
1117
1087
  if (desktop.navigation) {
@@ -58,10 +58,6 @@
58
58
  line-height: @outline-node-control-line-height;
59
59
  color: @outline-node-control-color;
60
60
 
61
- &::before {
62
- font-size: @outline-node-control-size;
63
- }
64
-
65
61
  &:hover {
66
62
  color: @highlight-color;
67
63
  }
@@ -77,6 +73,10 @@
77
73
 
78
74
  & > .tree-node-control {
79
75
  color: @outline-node-selected-control-color;
76
+
77
+ &:hover {
78
+ color: @highlight-color;
79
+ }
80
80
  }
81
81
 
82
82
  & > .font-icon {
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2014-2018 BSI Business Systems Integration AG.
2
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
3
3
  * All rights reserved. This program and the accompanying materials
4
4
  * are made available under the terms of the Eclipse Public License v1.0
5
5
  * which accompanies this distribution, and is available at
@@ -35,6 +35,11 @@
35
35
  border-radius: @view-tab-selected-border-radius;
36
36
  }
37
37
 
38
+ & > .edge {
39
+ // Ensure GlassPane.js does not set position: relative if glass pane is added before view tab is selected
40
+ position: absolute;
41
+ }
42
+
38
43
  &.selected:not(.in-background) {
39
44
  margin: @view-tab-selected-margin-top 0 0;
40
45
  border-radius: @view-tab-selected-border-radius @view-tab-selected-border-radius 0 0;
@@ -65,14 +70,12 @@
65
70
 
66
71
  &.left {
67
72
  visibility: hidden;
68
- left: 0;
69
- animation: show-view-tab-left-edge @view-tab-transition-duration ease-out 0s forwards;
73
+ animation: show-view-tab-left-edge 40ms ease-out 160ms forwards;
70
74
  }
71
75
 
72
76
  &.right {
73
77
  visibility: hidden;
74
- right: 0;
75
- animation: show-view-tab-right-edge @view-tab-transition-duration ease-out 0s forwards;
78
+ animation: show-view-tab-right-edge 40ms ease-out 160ms forwards;
76
79
  }
77
80
  }
78
81
  }
@@ -127,15 +130,21 @@
127
130
  }
128
131
 
129
132
  @keyframes show-view-tab-left-edge {
130
- to {
133
+ 0% {
131
134
  visibility: visible;
132
- transform: translateX(-24px);
135
+ left: -5px;
136
+ }
137
+ 100% {
138
+ left: -12px;
133
139
  }
134
140
  }
135
141
 
136
142
  @keyframes show-view-tab-right-edge {
137
- to {
143
+ 0% {
138
144
  visibility: visible;
139
- transform: translateX(24px);
145
+ right: -5px;
146
+ }
147
+ 100% {
148
+ right: -12px;
140
149
  }
141
150
  }
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2014-2018 BSI Business Systems Integration AG.
2
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
3
3
  * All rights reserved. This program and the accompanying materials
4
4
  * are made available under the terms of the Eclipse Public License v1.0
5
5
  * which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
8
8
  * Contributors:
9
9
  * BSI Business Systems Integration AG - initial API and implementation
10
10
  */
11
- import {Desktop, HtmlComponent, OutlineViewButton, scout, Widget, widgets} from '../../index';
11
+ import {HtmlComponent, OutlineViewButton, scout, Widget, widgets} from '../../index';
12
12
 
13
13
  export default class ViewButtonBox extends Widget {
14
14