@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,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
@@ -30,32 +30,37 @@ export default class TabAreaLayout extends AbstractLayout {
30
30
  }
31
31
 
32
32
  layout($container) {
33
- let ellipsis = this.tabArea.ellipsis,
34
- htmlContainer = HtmlComponent.get($container),
33
+ let htmlContainer = HtmlComponent.get($container),
35
34
  containerSize = htmlContainer.availableSize().subtract(htmlContainer.insets());
36
35
 
37
36
  // compute visible and overflown tabs
38
37
  this.preferredLayoutSize($container, {
39
38
  widthHint: containerSize.width
40
39
  });
40
+ this._layoutSelectionMarker();
41
+ }
41
42
 
42
- if (this.overflowTabs.length > 0) {
43
- ellipsis.setHidden(false);
44
- }
45
-
46
- this.visibleTabs.forEach(tabItem => {
47
- tabItem.setOverflown(false);
48
- });
49
-
50
- this.overflowTabs.forEach(tabItem => {
51
- tabItem.setOverflown(true);
52
- });
43
+ _layoutSelectionMarker() {
44
+ let $selectionMarker = this.tabArea.$selectionMarker,
45
+ selectedTab = this.tabArea.selectedTab,
46
+ selectedItemBounds;
53
47
 
54
- if (this.overflowTabs.length === 0) {
55
- ellipsis.setHidden(true);
48
+ if (selectedTab) {
49
+ $selectionMarker.setVisible(true);
50
+ selectedItemBounds = graphics.bounds(selectedTab.$container);
51
+ $selectionMarker.cssLeft(selectedItemBounds.x);
52
+ $selectionMarker.cssWidth(selectedItemBounds.width);
53
+ } else {
54
+ $selectionMarker.setVisible(false);
56
55
  }
56
+ }
57
57
 
58
+ _updateEllipsis() {
59
+ let ellipsis = this.tabArea.ellipsis;
60
+ ellipsis.setHidden(this.overflowTabs.length < 1);
58
61
  ellipsis.setText(this.overflowTabs.length + '');
62
+ this.visibleTabs.forEach(tabItem => tabItem.setOverflown(false));
63
+ this.overflowTabs.forEach(tabItem => tabItem.setOverflown(true));
59
64
 
60
65
  ellipsis.setChildActions(this.overflowTabs.map(tab => {
61
66
  let menu = scout.create('Menu', {
@@ -73,73 +78,54 @@ export default class TabAreaLayout extends AbstractLayout {
73
78
  });
74
79
  return menu;
75
80
  }, this));
76
-
77
- this._layoutSelectionMarker();
78
- }
79
-
80
- _layoutSelectionMarker() {
81
- let $selectionMarker = this.tabArea.$selectionMarker,
82
- selectedTab = this.tabArea.selectedTab,
83
- selectedItemBounds;
84
-
85
- if (selectedTab) {
86
- $selectionMarker.setVisible(true);
87
- selectedItemBounds = graphics.bounds(selectedTab.$container);
88
- $selectionMarker.cssLeft(selectedItemBounds.x);
89
- $selectionMarker.cssWidth(selectedItemBounds.width);
90
- } else {
91
- $selectionMarker.setVisible(false);
92
- }
93
81
  }
94
82
 
95
83
  preferredLayoutSize($container, options) {
96
84
  let htmlComp = HtmlComponent.get($container),
97
85
  prefSize = new Dimension(0, 0),
98
- prefWidth = Number.MAX_VALUE,
99
- visibleTabItems = this.tabArea.visibleTabs(),
100
- overflowableIndexes = visibleTabItems.map((tabItem, index) => {
101
- if (tabItem.selected) {
102
- return -1;
103
- }
104
- return index;
105
- }).filter(index => index >= 0);
86
+ prefWidth = Number.MAX_VALUE;
87
+ this.visibleTabs = this.tabArea.visibleTabs();
88
+ let overflowableIndexes = this.visibleTabs.map((tabItem, index) => {
89
+ if (tabItem.selected) {
90
+ return -1;
91
+ }
92
+ return index;
93
+ }).filter(index => index >= 0);
106
94
 
107
95
  this.overflowTabs = [];
108
96
 
109
- // consider avoid falsy 0 in tabboxes a 0 withHint will be used to calculate the minimum width
97
+ // consider avoid falsy 0 in tab-boxes a 0 withHint will be used to calculate the minimum width
110
98
  if (options.widthHint === 0 || options.widthHint) {
111
99
  prefWidth = options.widthHint - htmlComp.insets().horizontal();
112
100
  }
113
101
 
114
102
  // shortcut for minimum size.
115
103
  if (prefWidth <= 0) {
116
- return this._minSize(visibleTabItems).add(htmlComp.insets());
104
+ return this._minSize(this.visibleTabs).add(htmlComp.insets());
117
105
  }
118
106
 
119
- let overflowIndex = -1;
120
- this._setFirstLastMarker(visibleTabItems);
121
- prefSize = this._prefSize(visibleTabItems);
107
+ this._setFirstLastMarker(this.visibleTabs);
108
+ this._updateEllipsis();
109
+ prefSize = this._prefSize(this.visibleTabs);
110
+
122
111
  while (prefSize.width > prefWidth && overflowableIndexes.length > 0) {
123
- overflowIndex = overflowableIndexes.splice(-1)[0];
124
- this.overflowTabs.splice(0, 0, visibleTabItems[overflowIndex]);
125
- visibleTabItems.splice(overflowIndex, 1);
126
- this._setFirstLastMarker(visibleTabItems);
127
- prefSize = this._prefSize(visibleTabItems);
112
+ let overflowIndex = overflowableIndexes.splice(-1)[0];
113
+ this.overflowTabs.splice(0, 0, this.visibleTabs[overflowIndex]);
114
+ this.visibleTabs.splice(overflowIndex, 1);
115
+ this._setFirstLastMarker(this.visibleTabs);
116
+ this._updateEllipsis(); // update ellipsis here already so that the prefSize on the next line is correct
117
+ prefSize = this._prefSize(this.visibleTabs);
128
118
  }
129
119
 
130
- this.visibleTabs = visibleTabItems;
131
-
132
120
  // Use the total available space if spreading tabs evenly.
133
121
  if (this.tabArea.displayStyle === TabArea.DisplayStyle.SPREAD_EVEN) {
134
122
  return graphics.prefSize($container, options);
135
123
  }
136
-
137
124
  return graphics.exactPrefSize(prefSize.add(htmlComp.insets()), options);
138
125
  }
139
126
 
140
127
  _minSize(tabItems) {
141
- let visibleTabItems = [],
142
- prefSize;
128
+ let visibleTabItems = [];
143
129
  this.overflowTabs = tabItems.filter(tabItem => {
144
130
  if (tabItem.selected) {
145
131
  visibleTabItems.push(tabItem);
@@ -150,23 +136,21 @@ export default class TabAreaLayout extends AbstractLayout {
150
136
 
151
137
  this.visibleTabs = visibleTabItems;
152
138
  this._setFirstLastMarker(visibleTabItems);
153
- prefSize = this._prefSize(visibleTabItems);
154
-
155
- return prefSize;
139
+ return this._prefSize(visibleTabItems);
156
140
  }
157
141
 
158
142
  _prefSize(tabItems, considerEllipsis) {
159
- let prefSize = tabItems.map(tabItem => this._tabItemSize(tabItem.htmlComp)
160
- ).reduce((prefSize, itemSize) => {
143
+ let prefSize = tabItems
144
+ .map(tabItem => this._tabItemSize(tabItem))
145
+ .reduce((prefSize, itemSize) => {
161
146
  prefSize.height = Math.max(prefSize.height, itemSize.height);
162
147
  prefSize.width += itemSize.width;
163
148
  return prefSize;
164
- }, new Dimension(0, 0)),
165
- ellipsisSize = new Dimension(0, 0);
149
+ }, new Dimension(0, 0));
166
150
 
167
151
  considerEllipsis = scout.nvl(considerEllipsis, this.overflowTabs.length > 0);
168
152
  if (considerEllipsis) {
169
- ellipsisSize = this._tabItemSize(this.tabArea.ellipsis.htmlComp);
153
+ let ellipsisSize = this._tabItemSize(this.tabArea.ellipsis);
170
154
  prefSize.height = Math.max(prefSize.height, ellipsisSize.height);
171
155
  prefSize.width += ellipsisSize.width;
172
156
  }
@@ -193,8 +177,8 @@ export default class TabAreaLayout extends AbstractLayout {
193
177
  }
194
178
  }
195
179
 
196
- _tabItemSize(htmlComp) {
197
- let prefSize,
180
+ _tabItemSize(item) {
181
+ let htmlComp = item.htmlComp, prefSize,
198
182
  classList = htmlComp.$comp.attr('class');
199
183
 
200
184
  // temporarily revert display style to default. otherwise the pref size of the tab item will be the size of the container.
@@ -208,6 +192,19 @@ export default class TabAreaLayout extends AbstractLayout {
208
192
  prefSize = htmlComp.prefSize({
209
193
  exact: true
210
194
  }).add(graphics.margins(htmlComp.$comp));
195
+ if (item.fieldStatus && item.fieldStatus.htmlComp) {
196
+ let statusOverflownAndHidden = item.overflown && !item.fieldStatus.visible;
197
+ if (statusOverflownAndHidden) {
198
+ // overflown tabs have no fieldStatus: explicitly set to visible so that the real consumed space can be computed
199
+ item.fieldStatus.setVisible(true);
200
+ }
201
+ let statusWidth = item.fieldStatus.htmlComp.prefSize({includeMargin: true}).width;
202
+ if (statusOverflownAndHidden) {
203
+ // restore
204
+ item.fieldStatus.setVisible(false);
205
+ }
206
+ prefSize.width += statusWidth;
207
+ }
211
208
 
212
209
  htmlComp.$comp.attrOrRemove('class', classList);
213
210
 
@@ -12,6 +12,7 @@ import {keys, KeyStroke} from '../../../index';
12
12
 
13
13
  export default class TabAreaLeftKeyStroke extends KeyStroke {
14
14
 
15
+ // noinspection DuplicatedCode
15
16
  constructor(tabArea) {
16
17
  super();
17
18
  this.field = tabArea;
@@ -19,6 +20,7 @@ export default class TabAreaLeftKeyStroke 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 TabAreaRightKeyStroke extends KeyStroke {
14
14
 
15
+ // noinspection DuplicatedCode
15
16
  constructor(tabArea) {
16
17
  super();
17
18
  this.field = tabArea;
@@ -19,6 +20,7 @@ export default class TabAreaRightKeyStroke 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) {
@@ -32,7 +32,6 @@ export default class TabBox extends CompositeField {
32
32
  this._addPreserveOnPropertyChangeProperties(['selectedTab']);
33
33
 
34
34
  this._tabBoxHeaderPropertyChangeHander = this._onTabBoxHeaderPropertyChange.bind(this);
35
- this._selectedTabScrollTopChangeHandler = this._updateScrollShadow.bind(this);
36
35
  }
37
36
 
38
37
  /**
@@ -173,16 +172,17 @@ export default class TabBox extends CompositeField {
173
172
  _renderSelectedTab() {
174
173
  if (this.selectedTab) {
175
174
  this.selectedTab.render(this._$tabContent);
176
- this.selectedTab.on('propertyChange:scrollTop', this._selectedTabScrollTopChangeHandler);
175
+ this.selectedTab.get$Scrollable().data('scroll-shadow-customizer', this._updateScrollShadow.bind(this));
177
176
  }
178
177
  if (this.rendered) {
178
+ this._updateScrollShadow();
179
179
  HtmlComponent.get(this._$tabContent).invalidateLayoutTree();
180
180
  }
181
181
  }
182
182
 
183
183
  _removeSelectedTab() {
184
184
  if (this.selectedTab) {
185
- this.selectedTab.off('propertyChange:scrollTop', this._selectedTabScrollTopChangeHandler);
185
+ this.selectedTab.get$Scrollable().removeData('scroll-shadow-customizer');
186
186
  this.selectedTab.remove();
187
187
  }
188
188
  }
@@ -195,14 +195,11 @@ export default class TabBox extends CompositeField {
195
195
  let oldHasScrollShadowTop = this.$container.hasClass('has-scroll-shadow-top');
196
196
  this.$container.toggleClass('has-scroll-shadow-top', hasScrollShadowTop);
197
197
  if (oldHasScrollShadowTop !== hasScrollShadowTop) {
198
- this.invalidateLayout();
198
+ this.invalidateLayoutTree(false);
199
199
  }
200
200
 
201
201
  // Enlarge header line if there is a shadow, but only if there is a header (controlled by labelVisible)
202
202
  fields.adjustStatusPositionForScrollShadow(this, () => hasScrollShadowTop && this.labelVisible);
203
-
204
- // Prevent flickering of status icon
205
- this.validateLayout();
206
203
  }
207
204
 
208
205
  setTabAreaStyle(tabAreaStyle) {
@@ -293,6 +290,10 @@ export default class TabBox extends CompositeField {
293
290
  this.header.focusTabItem(tabItem);
294
291
  }
295
292
 
293
+ getTabForItem(tabItem) {
294
+ return this.header.getTabForItem(tabItem);
295
+ }
296
+
296
297
  _onTabBoxHeaderPropertyChange(event) {
297
298
  if (event.propertyName === 'selectedTabItem') {
298
299
  this.setSelectedTab(event.newValue);
@@ -74,7 +74,7 @@
74
74
  & > .menubar {
75
75
  position: absolute;
76
76
  #scout.menubar-background-color-inherit();
77
- border-bottom-color: transparent;
77
+ border-bottom: none;
78
78
  }
79
79
 
80
80
  & > .status {
@@ -163,6 +163,7 @@
163
163
  display: inline-block;
164
164
  vertical-align: middle;
165
165
  padding: @tab-item-title-padding-top 0 @tab-item-title-padding-bottom;
166
+ margin-top: @text-margin-top;
166
167
 
167
168
  .tab-area.has-sub-label > & {
168
169
  padding-bottom: @group-box-title-with-sub-label-padding-bottom;
@@ -89,6 +89,10 @@ export default class TabBoxHeader extends Widget {
89
89
  this.tabArea.focusTabItem(tabItem);
90
90
  }
91
91
 
92
+ getTabForItem(tabItem) {
93
+ return this.tabArea.getTabForItem(tabItem);
94
+ }
95
+
92
96
  _onTabBoxPropertyChange(event) {
93
97
  if (event.propertyName === 'menus') {
94
98
  this.menuBar.setMenuItems(this.tabBox.menus);
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2014-2017 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
@@ -34,14 +34,14 @@ export default class TabBoxHeaderLayout extends AbstractLayout {
34
34
  this.tabBoxHeader.invalidateLayoutTree();
35
35
  }
36
36
 
37
- layout($container) { //
37
+ layout($container) {
38
38
  let htmlContainer = HtmlComponent.get($container),
39
39
  tabArea = this.tabBoxHeader.tabArea,
40
40
  tabAreaMargins = tabArea.htmlComp.margins(),
41
41
  tabAreaPrefSize,
42
42
  menuBar = this.tabBoxHeader.menuBar,
43
43
  menuBarMargins = menuBar.htmlComp.margins(),
44
- menuBarMinumumSize,
44
+ menuBarMinimumSize,
45
45
  $status = this.tabBoxHeader.tabBox.$status,
46
46
  statusSizeLarge = new Dimension(),
47
47
  insets = htmlContainer.insets(),
@@ -49,7 +49,7 @@ export default class TabBoxHeaderLayout extends AbstractLayout {
49
49
  exact: true
50
50
  }).subtract(htmlContainer.insets());
51
51
 
52
- menuBarMinumumSize = menuBar.htmlComp.prefSize({
52
+ menuBarMinimumSize = menuBar.htmlComp.prefSize({
53
53
  widthHint: 0
54
54
  });
55
55
 
@@ -59,7 +59,7 @@ export default class TabBoxHeaderLayout extends AbstractLayout {
59
59
  }
60
60
 
61
61
  tabAreaPrefSize = tabArea.htmlComp.prefSize({
62
- widthHint: containerSize.width - menuBarMinumumSize.width - menuBarMargins.horizontal() - statusSizeLarge.width,
62
+ widthHint: containerSize.width - menuBarMinimumSize.width - menuBarMargins.horizontal() - statusSizeLarge.width,
63
63
  exact: false
64
64
  });
65
65
 
@@ -74,4 +74,8 @@ export default class TabItem extends GroupBox {
74
74
  this.parent.setSelectedTab(this);
75
75
  }
76
76
  }
77
+
78
+ getTab() {
79
+ return this.parent.getTabForItem(this);
80
+ }
77
81
  }
@@ -1,9 +1,9 @@
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
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
@@ -193,12 +193,13 @@ export default class TreeBox extends LookupBox {
193
193
  if (lookupRow.enabled === false) {
194
194
  node.enabled = false;
195
195
  }
196
- if (lookupRow.active === false) {
197
- node.active = false;
198
- }
199
196
  if (lookupRow.cssClass) {
200
197
  node.cssClass = lookupRow.cssClass;
201
198
  }
199
+ if (lookupRow.active === false) {
200
+ node.active = false;
201
+ node.cssClass = (node.cssClass ? (node.cssClass + ' ') : '') + 'inactive';
202
+ }
202
203
 
203
204
  return node;
204
205
  }
@@ -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 {scout, Widget} from '../index';
11
+ import {Widget} from '../index';
12
12
  import $ from 'jquery';
13
13
 
14
14
  export default class GlassPane extends Widget {
@@ -24,7 +24,7 @@ export default class GlassPane extends Widget {
24
24
 
25
25
  this.$parent.addClass('glasspane-parent');
26
26
  let cssPosition = this.$parent.css('position');
27
- if (!scout.isOneOf(cssPosition, 'relative', 'absolute')) {
27
+ if (cssPosition === 'static') {
28
28
  this.$parent.css('position', 'relative');
29
29
  }
30
30
 
@@ -44,7 +44,7 @@
44
44
  #scout.overflow-ellipsis-nowrap();
45
45
 
46
46
  .group-header:focus > & {
47
- color: @active-color;
47
+ color: @focus-color;
48
48
  text-decoration: underline;
49
49
  }
50
50
  }
package/src/index.js CHANGED
@@ -181,6 +181,7 @@ export {default as tooltips} from './tooltip/tooltips';
181
181
  export {default as WidgetTooltip} from './tooltip/WidgetTooltip';
182
182
  export {default as Action} from './action/Action';
183
183
  export {default as ActionAdapter} from './action/ActionAdapter';
184
+ export {default as ActionExecKeyStroke} from './action/ActionExecKeyStroke';
184
185
  export {default as ActionKeyStroke} from './action/ActionKeyStroke';
185
186
  export {default as Box} from './box/Box';
186
187
  export {default as Label} from './label/Label';
@@ -308,7 +309,6 @@ export {default as TableHeaderMenu} from './table/TableHeaderMenu';
308
309
  export {default as TableHeaderMenuLayout} from './table/TableHeaderMenuLayout';
309
310
  export {default as TableHeaderMenuGroup} from './table/TableHeaderMenuGroup';
310
311
  export {default as TableHeaderMenuButton} from './table/TableHeaderMenuButton';
311
- export {default as TableHeaderMenuButtonKeyStroke} from './table/TableHeaderMenuButtonKeyStroke';
312
312
  export {default as TableLayout} from './table/TableLayout';
313
313
  export {default as TableSelectionHandler} from './table/TableSelectionHandler';
314
314
  export {default as TableTileGridMediator} from './table/TableTileGridMediator';
package/src/index.less CHANGED
@@ -144,5 +144,6 @@
144
144
  @import "tile/fields/tablefield/TileTableField";
145
145
  @import "widget/FilterSupport";
146
146
  @import "login/LoginBox";
147
+ @import "form/fields/breadcrumbbarfield/BreadcrumbBarField";
147
148
  @import "breadcrumbbar/BreadcrumbBar";
148
149
  @import "breadcrumbbar/BreadcrumbItem";
@@ -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
@@ -834,10 +834,22 @@ $.fn.isDisplayNone = function() {
834
834
  return this.css('display') === 'none';
835
835
  };
836
836
 
837
+ /**
838
+ * @param {boolean} tabbable true, to make the component tabbable. False, to make it neither tabbable nor focusable.
839
+ * @returns {$}
840
+ */
837
841
  $.fn.setTabbable = function(tabbable) {
838
842
  return this.attr('tabIndex', tabbable ? 0 : null);
839
843
  };
840
844
 
845
+ /**
846
+ * @param {boolean} tabbable true, to make the component tabbable. False, to make it not tabbable but focusable, so the user can focus it with the mouse but not with the keyboard.
847
+ * @returns {$}
848
+ */
849
+ $.fn.setTabbableOrFocusable = function(tabbable) {
850
+ return this.attr('tabIndex', tabbable ? 0 : -1);
851
+ };
852
+
841
853
  $.fn.isTabbable = function() {
842
854
  return this.attr('tabIndex') >= 0;
843
855
  };
@@ -1049,16 +1061,17 @@ $.fn.oneAnimationEnd = function(handler) {
1049
1061
  if (!handler) {
1050
1062
  return this;
1051
1063
  }
1052
- return this.on('animationend webkitAnimationEnd', event => {
1064
+ let oneHandler = event => {
1053
1065
  if (event.target !== this[0]) {
1054
1066
  // Ignore events that bubble up from child elements
1055
1067
  return;
1056
1068
  }
1057
1069
  // Unregister listener to implement "one" semantics
1058
- this.off(event);
1070
+ this.off('animationend webkitAnimationEnd', oneHandler);
1059
1071
  // Notify actual event handler
1060
1072
  handler(event);
1061
- });
1073
+ };
1074
+ return this.on('animationend webkitAnimationEnd', oneHandler);
1062
1075
  };
1063
1076
 
1064
1077
  $.fn.hasAnimationClass = function() {
@@ -22,6 +22,7 @@ export default class CloseKeyStroke extends KeyStroke {
22
22
  render: !!$drawingArea,
23
23
  $drawingArea: $drawingArea
24
24
  };
25
+ this.inheritAccessibility = false;
25
26
  }
26
27
 
27
28
  handle(event) {
@@ -24,6 +24,7 @@ export default class ContextMenuKeyStroke extends KeyStroke {
24
24
  this.ctrl = false;
25
25
  this.shift = false;
26
26
  this.stopPropagation = true;
27
+ this.inheritAccessibility = false;
27
28
  }
28
29
 
29
30
  /**
@@ -30,6 +30,7 @@ export default class FocusFilterFieldKeyStroke extends KeyStroke {
30
30
  this.preventDefault = false; // false so that the key is inserted into the search field.
31
31
  this.keyStrokeMode = KeyStroke.Mode.DOWN;
32
32
  this.stopPropagation = true;
33
+ this.inheritAccessibility = false;
33
34
  }
34
35
 
35
36
  /**
@@ -18,6 +18,7 @@ export default class KeyStroke {
18
18
 
19
19
  this.which = []; // keys which this keystroke is bound to. Typically, this is a single key, but may be multiple keys if handling the same action (e.g. ENTER and SPACE on a button).
20
20
  this.ctrl = false;
21
+ this.inheritAccessibility = true;
21
22
  this.alt = false;
22
23
  this.shift = false;
23
24
  this.preventDefault = true;
@@ -138,9 +139,16 @@ export default class KeyStroke {
138
139
  if (this.field.visible !== undefined && !this.field.visible) {
139
140
  return false;
140
141
  }
141
- // Check enabled state
142
- if (this.field.enabled !== undefined && !this.field.enabled) {
143
- return false;
142
+ // Check enabled state (if inheritAccessibility is true)
143
+ if (!this.inheritAccessibility) {
144
+ return true;
145
+ }
146
+ if (this.field.enabledComputed !== undefined) {
147
+ return this.field.enabledComputed;
148
+ }
149
+ if (this.field.enabled !== undefined) {
150
+ // This should actually not happen because this.field should always be a hypothetical case if this.field is not a widget
151
+ return this.field.enabled;
144
152
  }
145
153
  }
146
154
  return true;
@@ -19,15 +19,18 @@ export default class TabItemKeyStroke extends KeyStroke {
19
19
 
20
20
  this.renderingHints.offset = 16;
21
21
  this.renderingHints.hAlign = HAlign.RIGHT;
22
- this.renderingHints.$drawingArea = function($drawingArea, event) {
23
- return this.field.$tabContainer;
24
- }.bind(this);
22
+ this.renderingHints.render = () => {
23
+ let tab = this.field.getTab();
24
+ return tab && tab.rendered;
25
+ };
26
+ this.renderingHints.$drawingArea = ($drawingArea, event) => this.field.getTab().$container;
27
+ this.inheritAccessibility = false;
25
28
  }
26
29
 
27
30
  /**
28
- * @override KeyStroke.js
31
+ * @override
29
32
  */
30
33
  handle(event) {
31
- this.field.parent.setSelectedTab(this.field);
34
+ this.field.select();
32
35
  }
33
36
  }
@@ -12,9 +12,16 @@ import {NullLogger, scout, URL} from '../index';
12
12
  import $ from 'jquery';
13
13
  import strings from '../util/strings';
14
14
 
15
- /* global log4javascript */
15
+ const Level = {
16
+ TRACE: 'trace',
17
+ DEBUG: 'debug',
18
+ INFO: 'info',
19
+ WARN: 'warn',
20
+ ERROR: 'error',
21
+ FATAL: 'fatal'
22
+ };
16
23
 
17
- const DEFAULT_LEVEL = 'trace';
24
+ const DEFAULT_LEVEL = Level.TRACE;
18
25
  let initialized = false;
19
26
  let _appendersToAdd = [];
20
27
  let showStackTraces = true;
@@ -85,17 +92,17 @@ export function parseLevel(level) {
85
92
  }
86
93
  level = level.toLowerCase();
87
94
  switch (level) {
88
- case 'trace':
95
+ case Level.TRACE:
89
96
  return log4javascript.Level.TRACE;
90
- case 'debug':
97
+ case Level.DEBUG:
91
98
  return log4javascript.Level.DEBUG;
92
- case 'info':
99
+ case Level.INFO:
93
100
  return log4javascript.Level.INFO;
94
- case 'warn':
101
+ case Level.WARN:
95
102
  return log4javascript.Level.WARN;
96
- case 'error':
103
+ case Level.ERROR:
97
104
  return log4javascript.Level.ERROR;
98
- case 'fatal':
105
+ case Level.FATAL:
99
106
  return log4javascript.Level.FATAL;
100
107
  }
101
108
  }
@@ -115,6 +122,7 @@ export function addAppender(factoryName, options) {
115
122
 
116
123
  export default {
117
124
  DEFAULT_LEVEL,
125
+ Level,
118
126
  addAppender,
119
127
  bootstrap,
120
128
  initLog4Javascript,