@eclipse-scout/core 22.0.0 → 22.0.10

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 (166) hide show
  1. package/dist/eclipse-scout-core-e5e8740e3649f5b9f279.min.js +2 -0
  2. package/dist/eclipse-scout-core-e5e8740e3649f5b9f279.min.js.map +1 -0
  3. package/dist/eclipse-scout-core-theme-74b63e0d57bed407a729.min.css +1 -0
  4. package/dist/eclipse-scout-core-theme-dark-b82aea152f416e38ce7f.min.css +1 -0
  5. package/dist/eclipse-scout-core-theme-dark.css +597 -422
  6. package/dist/eclipse-scout-core-theme-dark.css.map +1 -1
  7. package/dist/eclipse-scout-core-theme.css +333 -158
  8. package/dist/eclipse-scout-core-theme.css.map +1 -1
  9. package/dist/eclipse-scout-core.js +1196 -811
  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 +1 -1
  16. package/src/ErrorHandler.js +66 -28
  17. package/src/{table/TableHeaderMenuButtonKeyStroke.js → action/ActionExecKeyStroke.js} +4 -5
  18. package/src/action/Button.less +1 -0
  19. package/src/box/Box.less +12 -8
  20. package/src/breadcrumbbar/BreadcrumbBarLayout.js +2 -2
  21. package/src/breadcrumbbar/BreadcrumbItem.less +3 -6
  22. package/src/calendar/Calendar.js +40 -58
  23. package/src/calendar/Calendar.less +10 -10
  24. package/src/calendar/CalendarLayout.js +3 -1
  25. package/src/checkbox/CheckBox.less +3 -1
  26. package/src/datepicker/DatePicker.less +1 -0
  27. package/src/datepicker/DatePickerTouchPopup.js +8 -0
  28. package/src/desktop/DisableBrowserF5ReloadKeyStroke.js +1 -0
  29. package/src/desktop/bench/DesktopTabSelectKeyStroke.js +2 -1
  30. package/src/desktop/desktoptab/DesktopTab.less +5 -2
  31. package/src/desktop/desktoptab/DesktopTabArea.less +7 -3
  32. package/src/desktop/desktoptab/DesktopTabAreaLayout.js +1 -1
  33. package/src/desktop/desktoptab/DisableBrowserTabSwitchingKeyStroke.js +1 -0
  34. package/src/desktop/navigation/DesktopNavigation.less +4 -0
  35. package/src/desktop/navigation/EnlargeNavigationKeyStroke.js +1 -0
  36. package/src/desktop/navigation/ShrinkNavigationKeyStroke.js +1 -0
  37. package/src/desktop/notification/DesktopNotification.js +11 -4
  38. package/src/desktop/notification/DesktopNotification.less +5 -3
  39. package/src/desktop/outline/Outline.less +4 -4
  40. package/src/desktop/viewbutton/ViewButton.less +18 -9
  41. package/src/desktop/viewbutton/ViewMenuPopupEnterKeyStroke.js +2 -1
  42. package/src/desktop/viewbutton/ViewMenuTab.less +3 -2
  43. package/src/filechooser/FileChooser.js +1 -1
  44. package/src/filechooser/FileChooser.less +16 -11
  45. package/src/focus/FocusContext.js +11 -8
  46. package/src/focus/FocusManager.js +24 -5
  47. package/src/form/Form.less +1 -0
  48. package/src/form/fields/LookupBox.js +5 -2
  49. package/src/form/fields/LookupBox.less +28 -2
  50. package/src/form/fields/TextFieldIcon.less +2 -2
  51. package/src/form/fields/ValueField.js +11 -2
  52. package/src/form/fields/breadcrumbbarfield/BreadcrumbBarField.less +20 -0
  53. package/src/form/fields/button/ButtonKeyStroke.js +0 -3
  54. package/src/form/fields/datefield/DateField.js +31 -47
  55. package/src/form/fields/filechooserfield/FileChooserFieldBrowseKeyStroke.js +1 -3
  56. package/src/form/fields/filechooserfield/FileChooserFieldDeleteKeyStroke.js +1 -3
  57. package/src/form/fields/groupbox/GroupBox.js +14 -9
  58. package/src/form/fields/groupbox/GroupBox.less +1 -0
  59. package/src/form/fields/htmlfield/HtmlField.less +0 -1
  60. package/src/form/fields/listbox/ListBox.js +13 -7
  61. package/src/form/fields/lookupfield/lookupField.js +6 -5
  62. package/src/form/fields/smartfield/ProposalField.js +2 -1
  63. package/src/form/fields/smartfield/ProposalTreeNode.js +4 -8
  64. package/src/form/fields/smartfield/SmartField.js +4 -20
  65. package/src/form/fields/smartfield/SmartField.less +24 -11
  66. package/src/form/fields/splitbox/SplitBoxCollapseKeyStroke.js +1 -0
  67. package/src/form/fields/splitbox/SplitBoxFirstCollapseKeyStroke.js +1 -0
  68. package/src/form/fields/splitbox/SplitBoxSecondCollapseKeyStroke.js +1 -0
  69. package/src/form/fields/tabbox/TabAreaLayout.js +63 -66
  70. package/src/form/fields/tabbox/TabAreaLeftKeyStroke.js +2 -0
  71. package/src/form/fields/tabbox/TabAreaRightKeyStroke.js +2 -0
  72. package/src/form/fields/tabbox/TabBox.js +8 -7
  73. package/src/form/fields/tabbox/TabBox.less +2 -1
  74. package/src/form/fields/tabbox/TabBoxHeader.js +4 -0
  75. package/src/form/fields/tabbox/TabBoxHeaderLayout.js +5 -5
  76. package/src/form/fields/tabbox/TabItem.js +4 -0
  77. package/src/form/fields/treebox/TreeBox.js +6 -5
  78. package/src/glasspane/GlassPane.js +3 -3
  79. package/src/group/Group.less +1 -1
  80. package/src/index.js +1 -1
  81. package/src/index.less +1 -0
  82. package/src/jquery/jquery-scout.js +17 -4
  83. package/src/keystroke/CloseKeyStroke.js +1 -0
  84. package/src/keystroke/ContextMenuKeyStroke.js +1 -0
  85. package/src/keystroke/FocusFilterFieldKeyStroke.js +1 -0
  86. package/src/keystroke/KeyStroke.js +11 -3
  87. package/src/keystroke/TabItemKeyStroke.js +8 -5
  88. package/src/logging/logging.js +16 -8
  89. package/src/login/LoginBox.js +3 -2
  90. package/src/login/LoginBox.less +27 -8
  91. package/src/menu/ContextMenuPopup.less +9 -2
  92. package/src/menu/Menu.less +1 -0
  93. package/src/menu/MenuExecKeyStroke.js +3 -17
  94. package/src/menu/MenuNavigationKeyStroke.js +1 -0
  95. package/src/menu/menubar/MenuBarLeftKeyStroke.js +2 -0
  96. package/src/menu/menubar/MenuBarRightKeyStroke.js +2 -0
  97. package/src/messagebox/MessageBox.less +20 -20
  98. package/src/modeselector/Mode.less +15 -37
  99. package/src/modeselector/ModeSelector.js +1 -1
  100. package/src/modeselector/ModeSelector.less +2 -1
  101. package/src/planner/Planner.js +2 -0
  102. package/src/planner/PlannerHeader.less +2 -1
  103. package/src/popup/Popup.js +24 -8
  104. package/src/popup/PopupLayout.js +2 -8
  105. package/src/scrollbar/Scrollbar.less +8 -1
  106. package/src/scrollbar/scrollbars.js +26 -4
  107. package/src/session/Session.js +8 -5
  108. package/src/style/colors-dark.less +25 -11
  109. package/src/style/colors.less +17 -3
  110. package/src/style/fonts.less +10 -1
  111. package/src/style/mixins.less +21 -14
  112. package/src/style/sizes-dark.less +4 -1
  113. package/src/style/sizes.less +17 -9
  114. package/src/table/Table.js +63 -49
  115. package/src/table/Table.less +50 -20
  116. package/src/table/TableAdapter.js +9 -12
  117. package/src/table/TableHeader.js +10 -8
  118. package/src/table/TableHeader.less +1 -0
  119. package/src/table/TableHeaderMenu.js +3 -1
  120. package/src/table/TableHeaderMenu.less +7 -2
  121. package/src/table/TableHeaderMenuButton.js +2 -2
  122. package/src/table/TableLayout.js +6 -0
  123. package/src/table/columns/BooleanColumn.js +2 -2
  124. package/src/table/columns/Column.js +10 -7
  125. package/src/table/columns/ColumnOptimalWidthMeasurer.js +1 -1
  126. package/src/table/editor/CellEditorPopup.js +29 -15
  127. package/src/table/keystrokes/AbstractTableNavigationKeyStroke.js +1 -0
  128. package/src/table/keystrokes/TableCopyKeyStroke.js +1 -0
  129. package/src/table/keystrokes/TableNavigationCollapseKeyStroke.js +2 -2
  130. package/src/table/keystrokes/TableNavigationEndKeyStroke.js +2 -2
  131. package/src/table/keystrokes/TableNavigationExpandKeyStroke.js +2 -2
  132. package/src/table/keystrokes/TableNavigationHomeKeyStroke.js +2 -2
  133. package/src/table/keystrokes/TableNavigationPageDownKeyStroke.js +2 -2
  134. package/src/table/keystrokes/TableNavigationPageUpKeyStroke.js +2 -2
  135. package/src/table/keystrokes/TableNavigationUpKeyStroke.js +2 -2
  136. package/src/table/keystrokes/TableRefreshKeyStroke.js +2 -2
  137. package/src/table/keystrokes/TableSelectAllKeyStroke.js +3 -2
  138. package/src/table/keystrokes/TableStartCellEditKeyStroke.js +2 -2
  139. package/src/tagbar/TagBarOverflowPopupLayout.js +1 -1
  140. package/src/testing/index.js +1 -0
  141. package/src/testing/lookup/AbortableMicrotaskStaticLookupCall.js +50 -0
  142. package/src/tile/TileGrid.js +10 -12
  143. package/src/tile/TileGridLayout.js +2 -2
  144. package/src/tile/accordion/TileAccordion.js +16 -1
  145. package/src/tile/fields/FormFieldTile.less +18 -11
  146. package/src/tile/fields/button/ButtonTile.js +1 -1
  147. package/src/tile/fields/tablefield/TileTableField.less +19 -2
  148. package/src/tile/keystrokes/TileGridSelectKeyStroke.js +3 -2
  149. package/src/timepicker/TimePickerTouchPopup.js +8 -0
  150. package/src/tree/CompactTree.less +1 -1
  151. package/src/tree/LazyNodeFilter.js +4 -2
  152. package/src/tree/Tree.js +7 -5
  153. package/src/tree/Tree.less +13 -5
  154. package/src/tree/keystrokes/AbstractTreeNavigationKeyStroke.js +1 -0
  155. package/src/tree/keystrokes/TreeCollapseAllKeyStroke.js +2 -2
  156. package/src/tree/keystrokes/TreeExpandOrDrillDownKeyStroke.js +2 -2
  157. package/src/tree/keystrokes/TreeNavigationDownKeyStroke.js +2 -2
  158. package/src/tree/keystrokes/TreeNavigationEndKeyStroke.js +2 -2
  159. package/src/tree/keystrokes/TreeNavigationUpKeyStroke.js +2 -2
  160. package/src/util/Device.js +4 -4
  161. package/src/util/arrays.js +44 -2
  162. package/src/util/dragAndDrop.js +5 -4
  163. package/src/util/events.js +1 -1
  164. package/src/util/objects.js +4 -1
  165. package/src/widget/FilterSupport.js +1 -1
  166. package/src/widget/Widget.js +17 -7
@@ -1,9 +1,9 @@
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
6
- * http://www.eclipse.org/legal/epl-v10.html
6
+ * https://www.eclipse.org/legal/epl-v10.html
7
7
  *
8
8
  * Contributors:
9
9
  * BSI Business Systems Integration AG - initial API and implementation
@@ -56,6 +56,7 @@ export default class LoginBox extends Box {
56
56
  if (this.messageKey) {
57
57
  this.$message = $('<div>')
58
58
  .attr('id', 'message-box')
59
+ .addClass('message-box')
59
60
  .html(strings.nl2br(this.texts.get(this.messageKey)))
60
61
  .appendTo(this.$form);
61
62
  }
@@ -3,7 +3,7 @@
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
6
- * http://www.eclipse.org/legal/epl-v10.html
6
+ * https://www.eclipse.org/legal/epl-v10.html
7
7
  *
8
8
  * Contributors:
9
9
  * BSI Business Systems Integration AG - initial API and implementation
@@ -19,6 +19,11 @@
19
19
 
20
20
  & > .button {
21
21
  margin-top: 16px;
22
+ margin-bottom: 0;
23
+ }
24
+
25
+ & > .message-box {
26
+ margin: 0 20px 12px 20px;
22
27
  }
23
28
 
24
29
  & > input.alternative:-webkit-autofill {
@@ -53,18 +58,20 @@
53
58
  */
54
59
  .login-button.default {
55
60
 
56
- &.login-error {
57
- border-color: @palette-red-4;
58
- background-color: @palette-red-4;
61
+ &.login-error:not(.disabled) {
62
+ border-color: transparent;
63
+ background-color: @error-color;
59
64
 
60
65
  &:hover {
61
- background-color: @palette-red-4;
62
- border-color: @palette-red-4;
66
+ background-color: @error-default-button-background-hover-color;
63
67
  }
64
68
 
65
69
  &:active {
66
- border-color: @palette-red-4;
67
- background-color: darken(@palette-red-4, 5%);
70
+ background-color: @error-default-button-background-active-color;
71
+ }
72
+
73
+ &:focus {
74
+ #scout.focus-border(@box-shadow-color: @error-focus-box-shadow-color, @border-color: mix(@error-color, @error-focus-box-shadow-color, 25%));
68
75
  }
69
76
  }
70
77
 
@@ -91,3 +98,15 @@
91
98
  #scout.animation(nop 0.05s);
92
99
  }
93
100
  }
101
+
102
+ @media (max-width: @box-responsive-width) {
103
+ .login-box-content > form {
104
+ & > .message-box,
105
+ & > input,
106
+ & > .button {
107
+ width: 100%;
108
+ margin-left: 0;
109
+ margin-right: 0;
110
+ }
111
+ }
112
+ }
@@ -53,14 +53,21 @@
53
53
  &.selected {
54
54
  background-color: @item-selection-background-color;
55
55
 
56
+ &.has-popup {
57
+ color: @context-menu-item-color;
58
+
59
+ &.disabled {
60
+ color: @menu-item-disabled-color;
61
+ background-color: @item-selection-background-color;
62
+ }
63
+ }
64
+
56
65
  & > .submenu-icon {
57
66
  transform: none;
58
67
  }
59
68
  }
60
69
 
61
70
  &.expanded {
62
- color: @active-color;
63
-
64
71
  & > .submenu-icon {
65
72
  #scout.submenu-icon-open();
66
73
  }
@@ -86,6 +86,7 @@
86
86
 
87
87
  & > .text {
88
88
  #scout.overflow-ellipsis-nowrap();
89
+ margin-top: @text-margin-top;
89
90
  }
90
91
 
91
92
  & > .font-icon {
@@ -8,26 +8,12 @@
8
8
  * Contributors:
9
9
  * BSI Business Systems Integration AG - initial API and implementation
10
10
  */
11
- import {keys, KeyStroke} from '../index';
11
+ import {ActionExecKeyStroke} from '../index';
12
12
 
13
- export default class MenuExecKeyStroke extends KeyStroke {
13
+ export default class MenuExecKeyStroke extends ActionExecKeyStroke {
14
14
 
15
15
  constructor(menu) {
16
- super();
17
- this.field = menu;
18
- this.which = [keys.SPACE, keys.ENTER];
19
- this.stopPropagation = true;
20
-
16
+ super(menu);
21
17
  this.renderingHints.offset = 16;
22
- this.renderingHints.$drawingArea = function($drawingArea, event) {
23
- return this.field.$container;
24
- }.bind(this);
25
- }
26
-
27
- /**
28
- * @override KeyStroke.js
29
- */
30
- handle(event) {
31
- this.field.doAction();
32
18
  }
33
19
  }
@@ -15,6 +15,7 @@ export default class MenuNavigationKeyStroke extends KeyStroke {
15
15
  constructor(popup) {
16
16
  super();
17
17
  this.field = popup;
18
+ this.inheritAccessibility = false;
18
19
  }
19
20
 
20
21
  _accept(event) {
@@ -12,6 +12,7 @@ import {keys, KeyStroke} from '../../index';
12
12
 
13
13
  export default class MenuBarLeftKeyStroke extends KeyStroke {
14
14
 
15
+ // noinspection DuplicatedCode
15
16
  constructor(menuBar) {
16
17
  super();
17
18
  this.field = menuBar;
@@ -19,6 +20,7 @@ export default class MenuBarLeftKeyStroke extends KeyStroke {
19
20
  this.renderingHints.render = false;
20
21
  this.stopPropagation = true;
21
22
  this.keyStrokeMode = KeyStroke.Mode.DOWN;
23
+ this.inheritAccessibility = false;
22
24
  }
23
25
 
24
26
  handle(event) {
@@ -12,6 +12,7 @@ import {keys, KeyStroke} from '../../index';
12
12
 
13
13
  export default class MenuBarRightKeyStroke extends KeyStroke {
14
14
 
15
+ // noinspection DuplicatedCode
15
16
  constructor(menuBar) {
16
17
  super();
17
18
  this.field = menuBar;
@@ -19,6 +20,7 @@ export default class MenuBarRightKeyStroke extends KeyStroke {
19
20
  this.renderingHints.render = false;
20
21
  this.stopPropagation = true;
21
22
  this.keyStrokeMode = KeyStroke.Mode.DOWN;
23
+ this.inheritAccessibility = false;
22
24
  }
23
25
 
24
26
  handle(event) {
@@ -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
@@ -22,6 +22,22 @@
22
22
  border-radius: 0;
23
23
  }
24
24
 
25
+ &.full-width {
26
+ & > .messagebox-buttons {
27
+ padding-left: 10px;
28
+ padding-right: 10px;
29
+
30
+ & > .box-button {
31
+ min-width: 70px; /* less min width for buttons on small screens */
32
+ margin-right: 8px;
33
+
34
+ &:last-child {
35
+ margin-right: 0;
36
+ }
37
+ }
38
+ }
39
+ }
40
+
25
41
  .severity-button(@color, @hover-color: darken(@color, 6%), @active-color: darken(@color, 13%), @focus-color: @focus-box-shadow-color) {
26
42
  & > .box-buttons > .box-button {
27
43
  border-color: @color;
@@ -88,7 +104,7 @@
88
104
  }
89
105
  }
90
106
 
91
- .severity-button(@error-color, @focus-color: @error-focus-box-shadow-color);
107
+ .severity-button(@error-color, @error-default-button-background-hover-color, @error-default-button-background-active-color, @error-focus-box-shadow-color);
92
108
  }
93
109
 
94
110
  &.warning {
@@ -100,7 +116,7 @@
100
116
  }
101
117
  }
102
118
 
103
- .severity-button(@warning-color, @focus-color: @warning-focus-box-shadow-color);
119
+ .severity-button(@warning-color, @warning-default-button-background-hover-color, @warning-default-button-background-active-color, @warning-focus-box-shadow-color);
104
120
  }
105
121
 
106
122
  &.ok {
@@ -112,7 +128,7 @@
112
128
  }
113
129
  }
114
130
 
115
- .severity-button(@ok-color, @focus-color: @ok-focus-box-shadow-color);
131
+ .severity-button(@ok-color, @ok-default-button-background-hover-color, @ok-default-button-background-active-color, @ok-focus-box-shadow-color);
116
132
  }
117
133
 
118
134
  &.animate-open {
@@ -225,23 +241,7 @@
225
241
 
226
242
  @media (max-width: @messagebox-max-width) {
227
243
  .messagebox {
228
- /* reduce message box width on small screens */
229
- max-width: 330px;
230
244
  /* no need to have a margin on small screens */
231
245
  margin: 0;
232
-
233
- & > .messagebox-buttons {
234
- padding-left: 10px;
235
- padding-right: 10px;
236
-
237
- & > .box-button {
238
- min-width: 70px; /* less min width for buttons on small screens */
239
- margin-right: 8px;
240
-
241
- &:last-child {
242
- margin-right: 0;
243
- }
244
- }
245
- }
246
246
  }
247
247
  }
@@ -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
@@ -9,10 +9,14 @@
9
9
  * BSI Business Systems Integration AG - initial API and implementation
10
10
  */
11
11
  .mode {
12
- border: @mode-border-width solid @control-border-color;
12
+ --padding-x: @mode-padding-x;
13
+ --padding-y: @mode-padding-y;
14
+ --border-width: @mode-border-width;
15
+
16
+ border: var(--border-width) solid @control-border-color;
13
17
  border-radius: 0;
14
18
  flex: 1 1 0;
15
- padding: @mode-padding-y @mode-padding-x;
19
+ padding: var(--padding-y) var(--padding-x);
16
20
  #scout.overflow-ellipsis();
17
21
 
18
22
  &.first {
@@ -29,12 +33,12 @@
29
33
 
30
34
  &:not(.last):not(.selected) {
31
35
  border-right: none;
32
- padding-right: @mode-padding-x + @mode-border-width; /* account for the missing border, so that text does not jump */
36
+ padding-right: calc(var(--padding-x) + var(--border-width)); /* account for the missing border, so that text does not jump */
33
37
  }
34
38
 
35
39
  &.after-selected {
36
40
  border-left: none;
37
- padding-left: @mode-padding-x + @mode-border-width; /* account for the missing border, so that text does not jump */
41
+ padding-left: calc(var(--padding-x) + var(--border-width)); /* account for the missing border, so that text does not jump */
38
42
  }
39
43
 
40
44
  // override button (the selected mode cannot be clicked. therefore do not show hover and active colors)
@@ -68,28 +72,20 @@
68
72
  }
69
73
 
70
74
  .mode-selector.alternative {
71
- border: @mode-alternative-border-width solid transparent;
72
75
 
73
76
  & > .mode {
77
+ --border-width: 0px;
78
+
74
79
  color: @mode-color;
75
- border: none;
76
80
  background-color: transparent;
77
81
  border-radius: @button-border-radius;
78
82
 
79
- &:not(.last):not(.selected) {
80
- padding-right: @mode-padding-x;
81
- }
82
-
83
- &.after-selected {
84
- padding-left: @mode-padding-x;
85
- }
86
-
87
83
  &:hover {
88
- background-color: rgba(0, 0, 0, 0.05);
84
+ background-color: @mode-alternative-hover-background-color;
89
85
  }
90
86
 
91
87
  &:active {
92
- background-color: rgba(0, 0, 0, 0.1);
88
+ background-color: @mode-alternative-active-background-color;
93
89
  }
94
90
 
95
91
  &.selected {
@@ -120,26 +116,8 @@
120
116
  }
121
117
 
122
118
  .dense .mode-selector {
123
-
124
119
  & > .mode {
125
- padding: @mode-padding-dense;
126
-
127
- &:not(.last):not(.selected) {
128
- padding-right: @mode-padding-dense-x + @mode-border-width; /* account for the missing border, so that text does not jump */
129
- }
130
-
131
- &.after-selected {
132
- padding-left: @mode-padding-dense-x + @mode-border-width; /* account for the missing border, so that text does not jump */
133
- }
134
- }
135
-
136
- &.alternative > .mode {
137
- &:not(.last):not(.selected) {
138
- padding-right: @mode-padding-dense-x;
139
- }
140
-
141
- &.after-selected {
142
- padding-left: @mode-padding-dense-x;
143
- }
120
+ --padding-x: @mode-padding-dense-x;
121
+ --padding-y: @mode-padding-dense-y;
144
122
  }
145
123
  }
@@ -133,7 +133,7 @@ export default class ModeSelector extends Widget {
133
133
  let selectedModePosX = 0, selectedModeWidth = 0;
134
134
  if (this.selectedMode && this.selectedMode.$container) {
135
135
  selectedModePosX = graphics.position(this.selectedMode.$container).x;
136
- selectedModeWidth = graphics.size(this.selectedMode.$container).width;
136
+ selectedModeWidth = graphics.size(this.selectedMode.$container, {exact: true}).width;
137
137
  }
138
138
  this.$slider.cssLeft(selectedModePosX);
139
139
  this.$slider.cssWidth(selectedModeWidth);
@@ -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
@@ -22,6 +22,7 @@
22
22
  &.alternative {
23
23
  background-color: @mode-alternative-background-color;
24
24
  border-radius: @button-border-radius;
25
+ border: @mode-selector-alternative-border-width solid transparent;
25
26
 
26
27
  &:not(.disabled) > .mode-slider {
27
28
  display: block;
@@ -1533,6 +1533,8 @@ export default class Planner extends Widget {
1533
1533
  this._renderViewRange();
1534
1534
  this._rerenderActivities();
1535
1535
  this._renderSelectedActivity();
1536
+ this.validateLayoutTree(); // Layouting is required for adjusting the scroll position
1537
+ this._reconcileScrollPos();
1536
1538
  }
1537
1539
  }
1538
1540
 
@@ -97,7 +97,8 @@
97
97
  }
98
98
 
99
99
  .planner-mode {
100
- width: 65px;
100
+ padding: 0 8px;
101
+ min-width: 65px;
101
102
  text-align: center;
102
103
  border-top: 1px solid @control-border-color;
103
104
  border-bottom: 1px solid @control-border-color;
@@ -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
@@ -8,7 +8,7 @@
8
8
  * Contributors:
9
9
  * BSI Business Systems Integration AG - initial API and implementation
10
10
  */
11
- import {CloseKeyStroke, DialogLayout, Dimension, Event, FocusRule, GlassPaneRenderer, graphics, HtmlComponent, Insets, KeyStrokeContext, Point, PopupLayout, Rectangle, scout, scrollbars, strings, Widget} from '../index';
11
+ import {CloseKeyStroke, DialogLayout, Dimension, Event, FocusRule, GlassPaneRenderer, graphics, HtmlComponent, Insets, KeyStrokeContext, Point, PopupLayout, Rectangle, scout, scrollbars, strings, Widget, widgets} from '../index';
12
12
  import $ from 'jquery';
13
13
 
14
14
  export default class Popup extends Widget {
@@ -185,18 +185,17 @@ export default class Popup extends Widget {
185
185
 
186
186
  _openWithoutParent() {
187
187
  // resolve parent for entry-point (don't change the actual property)
188
- let parent = this.parent;
189
- if (parent.destroyed) {
188
+ if (this.parent.destroyed) {
190
189
  return;
191
190
  }
192
- if (parent.rendered || parent.rendering) {
193
- this.open(parent.entryPoint());
191
+ if (this.parent.rendered || this.parent.rendering) {
192
+ this.open(this._getDefaultOpen$Parent());
194
193
  return;
195
194
  }
196
195
 
197
196
  // This is important for popups rendered in another (native) browser window. The DOM in the popup window
198
197
  // is rendered later, so we must wait until that window is rendered and layouted. See popup-window.html.
199
- parent.one('render', () => {
198
+ this.parent.one('render', () => {
200
199
  this.session.layoutValidator.schedulePostValidateFunction(() => {
201
200
  if (this.destroyed || this.rendered) {
202
201
  return;
@@ -206,6 +205,14 @@ export default class Popup extends Widget {
206
205
  });
207
206
  }
208
207
 
208
+ /**
209
+ * Only called if parent.rendered or parent.rendering
210
+ * @return {$}
211
+ */
212
+ _getDefaultOpen$Parent() {
213
+ return this.parent.entryPoint();
214
+ }
215
+
209
216
  open($parent) {
210
217
  if (!$parent) {
211
218
  this._openWithoutParent();
@@ -442,6 +449,15 @@ export default class Popup extends Widget {
442
449
  return cssClass;
443
450
  }
444
451
 
452
+ _animateRemovalWhileRemovingParent() {
453
+ if (!this.$anchor) {
454
+ // Allow remove animations for popups without an anchor
455
+ return true;
456
+ }
457
+ // If parent is the anchor, prevent remove animation to ensure popup will be removed together with the anchor
458
+ return widgets.get(this.$anchor) !== this.parent;
459
+ }
460
+
445
461
  _isRemovalPrevented() {
446
462
  // 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.
447
463
  // However, if the popup itself is removed by an animation, removal should be prevented to ensure remove() won't run multiple times.
@@ -1037,7 +1053,7 @@ export default class Popup extends Widget {
1037
1053
 
1038
1054
  _handleGlassPanes() {
1039
1055
  let parentCoveredByGlassPane = this.session.focusManager.isElementCovertByGlassPane(this.parent.$container);
1040
- // 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
1056
+ // 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
1041
1057
  if (parentCoveredByGlassPane) {
1042
1058
  this.session.focusManager.rerenderGlassPanes();
1043
1059
  }
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2014-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
@@ -135,9 +135,6 @@ export default class PopupLayout extends AbstractLayout {
135
135
  * @returns {Dimension}
136
136
  */
137
137
  _calcMaxSize() {
138
- // Position the popup at the desired location before doing any calculations to consider the preferred bounds
139
- this._position(false);
140
-
141
138
  let maxWidth, maxHeight,
142
139
  htmlComp = this.popup.htmlComp,
143
140
  windowPaddingX = this.popup.windowPaddingX,
@@ -159,7 +156,7 @@ export default class PopupLayout extends AbstractLayout {
159
156
  horizontalAlignment = this.popup.horizontalAlignment,
160
157
  verticalAlignment = this.popup.verticalAlignment;
161
158
 
162
- // Decide whether the prefSize can be used or the popup needs to be shrinked so that it fits into the viewport
159
+ // Decide whether the prefSize can be used or the popup needs to be shrunken so that it fits into the viewport
163
160
  // The decision is based on the preferred opening direction
164
161
  // Example: The popup would like to be opened leftedge and bottom
165
162
  // If there is enough space on the right and on the bottom -> pref size is used
@@ -219,9 +216,6 @@ export default class PopupLayout extends AbstractLayout {
219
216
  * @returns {Insets}
220
217
  */
221
218
  _calcMaxSizeAroundAnchor() {
222
- // Position the popup at the desired location before doing any calculations because positioning adds CSS classes which might change margins
223
- this._position(false);
224
-
225
219
  let maxWidthLeft, maxWidthRight, maxHeightDown, maxHeightUp,
226
220
  htmlComp = this.popup.htmlComp,
227
221
  windowPaddingX = this.popup.windowPaddingX,
@@ -133,7 +133,7 @@
133
133
  transition: box-shadow 250ms;
134
134
  position: absolute;
135
135
  pointer-events: none;
136
- z-index: 1; // ensure shadow layout over elements having a z-index
136
+ z-index: 1; // ensure shadow lays over elements having a z-index
137
137
 
138
138
  #scout.scroll-shadow();
139
139
 
@@ -157,6 +157,13 @@
157
157
  --scroll-shadow-size: @scroll-shadow-size;
158
158
  --scroll-shadow-blur: @scroll-shadow-blur;
159
159
  --scroll-shadow-spread: @scroll-shadow-spread;
160
+
161
+ // Allow a widget to adjust the size of the shadow container
162
+ --scroll-shadow-inset-top: 0;
163
+ --scroll-shadow-inset-right: 0;
164
+ --scroll-shadow-inset-bottom: 0;
165
+ --scroll-shadow-inset-left: 0;
166
+
160
167
  @scroll-shadow-blur-spread-color: var(--scroll-shadow-blur) calc(-1 * var(--scroll-shadow-spread)) var(--scroll-shadow-color);
161
168
  @scroll-shadow-top: inset 0 var(--scroll-shadow-size) @scroll-shadow-blur-spread-color;
162
169
  @scroll-shadow-bottom: inset 0 calc(-1 * var(--scroll-shadow-size)) @scroll-shadow-blur-spread-color;
@@ -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
@@ -8,7 +8,7 @@
8
8
  * Contributors:
9
9
  * BSI Business Systems Integration AG - initial API and implementation
10
10
  */
11
- import {arrays, Device, graphics, HtmlComponent, objects, scout} from '../index';
11
+ import {arrays, Device, graphics, HtmlComponent, Insets, objects, scout} from '../index';
12
12
  import $ from 'jquery';
13
13
 
14
14
  /**
@@ -159,6 +159,17 @@ export function installScrollShadow($container, session, options) {
159
159
  _installMutationObserver(session);
160
160
  _installIntersectionObserver();
161
161
  intersectionObserver.observe($container[0]);
162
+
163
+ // this is required in addition to the intersection observer because the observer events are handled asynchronously later after all the setTimeout calls.
164
+ // Then the shadow might stay visible too long which has an impact on layout updates.
165
+ let containerElement = $container[0];
166
+ let visibleListener = e => {
167
+ if (e.target === containerElement) {
168
+ _onScrollableVisibleChange(containerElement, e.type === 'show');
169
+ }
170
+ };
171
+ $container.data('scroll-shadow-visible-listener', visibleListener);
172
+ $container.on('hide show', visibleListener);
162
173
  }
163
174
 
164
175
  export function uninstallScrollShadow($container, session) {
@@ -177,6 +188,10 @@ export function uninstallScrollShadow($container, session) {
177
188
  if (intersectionObserver) {
178
189
  intersectionObserver.unobserve($container[0]);
179
190
  }
191
+ let visibleListener = $container.data('scroll-shadow-visible-listener');
192
+ if (visibleListener) {
193
+ $container.off('hide show', visibleListener);
194
+ }
180
195
  let $scrollables = _$scrollables[session];
181
196
  if (!$scrollables || !$scrollables.some($scrollable => $scrollable.data('scroll-shadow'))) {
182
197
  _uninstallMutationObserver();
@@ -237,7 +252,7 @@ export function updateScrollShadow($container) {
237
252
  $shadow.toggleClass('bottom', !atBottom && style.indexOf('bottom') > -1);
238
253
  $shadow.toggleClass('left', !atLeft && style.indexOf('left') > -1);
239
254
  $shadow.toggleClass('right', !atRight && style.indexOf('right') > -1);
240
- graphics.setBounds($shadow, graphics.bounds($container, {exact: true}));
255
+ graphics.setBounds($shadow, graphics.bounds($container, {exact: true}).subtract(insets($shadow)));
241
256
  graphics.setMargins($shadow, graphics.margins($container));
242
257
  $shadow.css('border-radius', $container.css('border-radius'));
243
258
 
@@ -253,6 +268,13 @@ export function updateScrollShadow($container) {
253
268
  function atEnd(scrollPos, scrollSize, offsetSize) {
254
269
  return scrollPos + 1 >= scrollSize - offsetSize;
255
270
  }
271
+
272
+ function insets($shadow) {
273
+ return new Insets($shadow.cssPxValue('--scroll-shadow-inset-top'),
274
+ $shadow.cssPxValue('--scroll-shadow-inset-right'),
275
+ $shadow.cssPxValue('--scroll-shadow-inset-bottom'),
276
+ $shadow.cssPxValue('--scroll-shadow-inset-left'));
277
+ }
256
278
  }
257
279
 
258
280
  /**
@@ -726,7 +748,7 @@ export function scrollToBottom($scrollable, options) {
726
748
  /**
727
749
  * @param location object with x and y properties
728
750
  * @param $scrollables one or more scrollables to check against
729
- * @eturns {boolean} true if the location is visible in the current viewport of all the $scrollables, or if $scrollables is null
751
+ * @returns {boolean} true if the location is visible in the current viewport of all the $scrollables, or if $scrollables is null
730
752
  */
731
753
  export function isLocationInView(location, $scrollables) {
732
754
  if (!$scrollables || $scrollables.length === 0) {
@@ -8,7 +8,7 @@
8
8
  * Contributors:
9
9
  * BSI Business Systems Integration AG - initial API and implementation
10
10
  */
11
- import {AjaxCall, App, arrays, BackgroundJobPollingStatus, BackgroundJobPollingSupport, Device, EventSupport, FileInput, files as fileUtil, FocusManager, fonts, icons, LayoutValidator, Locale, MessageBox, ModelAdapter, NullWidget, ObjectFactory, objects, Reconnector, RemoteEvent, ResponseQueue, scout, Status, strings, TextMap, texts, TypeDescriptor, URL, UserAgent, webstorage} from '../index';
11
+ import {AjaxCall, App, arrays, BackgroundJobPollingStatus, BackgroundJobPollingSupport, Device, EventSupport, FileInput, files as fileUtil, FocusManager, fonts, icons, LayoutValidator, Locale, logging, MessageBox, ModelAdapter, NullWidget, ObjectFactory, objects, Reconnector, RemoteEvent, ResponseQueue, scout, Status, strings, TextMap, texts, TypeDescriptor, URL, UserAgent, webstorage} from '../index';
12
12
  import $ from 'jquery';
13
13
 
14
14
  export default class Session {
@@ -1364,13 +1364,16 @@ export default class Session {
1364
1364
  }
1365
1365
 
1366
1366
  /**
1367
- * Sends a request containing the error message for logging purpose.
1368
- * The request is sent immediately (does not await pending requests)
1367
+ * Sends a request containing the log message for logging purpose.
1368
+ * The request is sent immediately (does not await pending requests).
1369
+ * @param {string} message the log message
1370
+ * @param {logging.Level} [level] the log level used to log the message. Default is {@link logging.Level.ERROR}.
1369
1371
  */
1370
- sendLogRequest(message) {
1372
+ sendLogRequest(message, level) {
1371
1373
  let request = this._newRequest({
1372
1374
  log: true,
1373
- message: message
1375
+ message: message,
1376
+ level: scout.nvl(level, logging.Level.ERROR)
1374
1377
  });
1375
1378
  if (this.currentEvent) {
1376
1379
  request.event = {