@eclipse-scout/core 22.0.0-beta.1 → 22.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/eclipse-scout-core-theme-dark.css +135 -46
  2. package/dist/eclipse-scout-core-theme-dark.css.map +1 -1
  3. package/dist/eclipse-scout-core-theme.css +134 -45
  4. package/dist/eclipse-scout-core-theme.css.map +1 -1
  5. package/dist/eclipse-scout-core.js +744 -640
  6. package/dist/eclipse-scout-core.js.map +1 -1
  7. package/package.json +2 -2
  8. package/src/App.js +86 -17
  9. package/src/RemoteApp.js +1 -0
  10. package/src/desktop/Desktop.js +3 -3
  11. package/src/desktop/desktoptab/DesktopTab.less +14 -0
  12. package/src/desktop/notification/DesktopNotification.js +33 -8
  13. package/src/desktop/outline/Outline.js +2 -32
  14. package/src/desktop/outline/Outline.less +14 -6
  15. package/src/desktop/outline/OutlineViewButton.js +1 -0
  16. package/src/desktop/viewbutton/ViewButtonBox.js +2 -2
  17. package/src/filechooser/FileChooser.js +2 -1
  18. package/src/form/Form.js +11 -3
  19. package/src/form/fields/groupbox/GroupBox.less +3 -1
  20. package/src/glasspane/DeferredGlassPaneTarget.js +2 -2
  21. package/src/index.js +2 -1
  22. package/src/login/LoginBox.less +8 -1
  23. package/src/main.less +1 -1
  24. package/src/menu/ComboMenu.js +22 -17
  25. package/src/menu/ComboMenu.less +71 -26
  26. package/src/menu/ContextMenuPopup.js +3 -2
  27. package/src/menu/ContextMenuPopup.less +1 -1
  28. package/src/menu/EllipsisMenu.js +4 -0
  29. package/src/menu/Menu.js +24 -11
  30. package/src/menu/menubar/MenuBar.js +2 -19
  31. package/src/menu/menubar/MenuBarBox.js +3 -34
  32. package/src/menu/menubar/MenuBarLayout.js +6 -19
  33. package/src/menu/menubox/MenuBoxLayout.js +1 -1
  34. package/src/menu/menus.js +4 -10
  35. package/src/messagebox/MessageBox.js +3 -22
  36. package/src/modeselector/ModeSelectorLayout.js +11 -6
  37. package/src/notification/Notification.js +15 -14
  38. package/src/popup/Popup.js +3 -20
  39. package/src/session/BusyIndicator.js +2 -1
  40. package/src/session/Session.js +4 -63
  41. package/src/status/Status.js +2 -1
  42. package/src/style/colors-dark.less +3 -1
  43. package/src/style/colors.less +2 -0
  44. package/src/style/sizes.less +5 -3
  45. package/src/table/Table.js +7 -3
  46. package/src/table/Table.less +13 -3
  47. package/src/table/columns/Column.js +4 -0
  48. package/src/tile/fields/htmlfield/TileHtmlField.js +28 -0
  49. package/src/tooltip/Tooltip.less +7 -5
  50. package/src/tree/LazyNodeFilter.js +24 -15
  51. package/src/tree/Tree.js +112 -143
  52. package/src/tree/Tree.less +2 -2
  53. package/src/tree/TreeLayout.js +1 -1
  54. package/src/tree/TreeNode.js +2 -2
  55. package/src/util/Device.js +6 -2
  56. package/src/widget/FilterSupport.js +6 -4
  57. package/src/widget/FilterSupport.less +38 -9
  58. package/src/widget/LoadingSupport.js +1 -1
  59. package/src/widget/Widget.js +41 -36
  60. package/src/widget/WidgetSupport.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-scout/core",
3
- "version": "22.0.0-beta.1",
3
+ "version": "22.0.0",
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.1",
29
+ "@eclipse-scout/cli": "22.0.0",
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
@@ -38,6 +38,7 @@ export default class App {
38
38
  this.events = this._createEventSupport();
39
39
  this.initialized = false;
40
40
  this.sessions = [];
41
+ this._loadingTimeoutId = null;
41
42
 
42
43
  // register the listeners which were added to scout before the app is created
43
44
  listeners.forEach(function(listener) {
@@ -195,8 +196,11 @@ export default class App {
195
196
  */
196
197
  _init(options) {
197
198
  options = options || {};
198
- if (!this._checkBrowserCompatibility(options)) {
199
- return;
199
+ this.setLoading(true);
200
+ let compatibilityPromise = this._checkBrowserCompatibility(options);
201
+ if (compatibilityPromise) {
202
+ this.setLoading(false);
203
+ return compatibilityPromise.then(newOptions => this._init(newOptions));
200
204
  }
201
205
 
202
206
  this._initVersion(options);
@@ -220,27 +224,82 @@ export default class App {
220
224
 
221
225
  _checkBrowserCompatibility(options) {
222
226
  let device = Device.get();
223
- let app = this;
224
227
  $.log.isInfoEnabled() && $.log.info('Detected browser ' + device.browser + ' version ' + device.browserVersion);
225
228
  if (!scout.nvl(options.checkBrowserCompatibility, true) || device.isSupportedBrowser()) {
226
229
  // No check requested or browser is supported
227
- return true;
230
+ return;
228
231
  }
229
232
 
233
+ let deferred = $.Deferred();
234
+ let newOptions = objects.valueCopy(options);
235
+ newOptions.checkBrowserCompatibility = false;
230
236
  $('.scout').each(function() {
231
- let $entryPoint = $(this),
232
- $box = $entryPoint.appendDiv(),
233
- newOptions = objects.valueCopy(options);
237
+ let $entryPoint = $(this);
238
+ let $box = $entryPoint.appendDiv();
234
239
 
235
- newOptions.checkBrowserCompatibility = false;
236
240
  $box.load('unsupported-browser.html', () => {
237
241
  $box.find('button').on('click', () => {
238
242
  $box.remove();
239
- app._init(newOptions);
243
+ deferred.resolve(newOptions);
240
244
  });
241
245
  });
242
246
  });
243
- return false;
247
+ return deferred.promise();
248
+ }
249
+
250
+ setLoading(loading) {
251
+ if (loading) {
252
+ this._loadingTimeoutId = setTimeout(() => {
253
+ // Don't start loading if a desktop is already rendered to prevent flickering when the loading will be set to false after app initialization finishes
254
+ if (!this.sessions.some(session => session.desktop && session.desktop.rendered)) {
255
+ this._renderLoading();
256
+ }
257
+ }, 200);
258
+ } else {
259
+ clearTimeout(this._loadingTimeoutId);
260
+ this._loadingTimeoutId = null;
261
+ this._removeLoading();
262
+ }
263
+ }
264
+
265
+ _renderLoading() {
266
+ let $body = $('body'),
267
+ $loadingRoot = $body.children('.application-loading-root');
268
+ if (!$loadingRoot.length) {
269
+ $loadingRoot = $body.appendDiv('application-loading-root')
270
+ .addClass('application-loading-root')
271
+ .fadeIn();
272
+ }
273
+ this._renderLoadingElement($loadingRoot, 'application-loading01');
274
+ this._renderLoadingElement($loadingRoot, 'application-loading02');
275
+ this._renderLoadingElement($loadingRoot, 'application-loading03');
276
+ }
277
+
278
+ _renderLoadingElement($loadingRoot, cssClass) {
279
+ if ($loadingRoot.children('.' + cssClass).length) {
280
+ return;
281
+ }
282
+ // noinspection JSValidateTypes
283
+ $loadingRoot.appendDiv(cssClass).hide()
284
+ .fadeIn();
285
+ }
286
+
287
+ _removeLoading() {
288
+ let $loadingRoot = $('body').children('.application-loading-root');
289
+ // the fadeout animation only contains a to-value and no from-value
290
+ // therefore set the current value to the elements style
291
+ $loadingRoot.css('opacity', $loadingRoot.css('opacity'));
292
+ // Add animation listener before adding the classes to ensure the listener will always be triggered even while debugging
293
+ $loadingRoot.oneAnimationEnd(() => $loadingRoot.remove());
294
+ if ($loadingRoot.css('opacity') == 1) {
295
+ $loadingRoot.addClass('fadeout and-more');
296
+ } else {
297
+ $loadingRoot.addClass('fadeout');
298
+ }
299
+ if (!Device.get().supportsCssAnimation()) {
300
+ // fallback for old browsers that do not support the animation-end event
301
+ $loadingRoot.remove();
302
+ }
244
303
  }
245
304
 
246
305
  _initVersion(options) {
@@ -340,9 +399,7 @@ export default class App {
340
399
 
341
400
  // TODO [7.0] cgu improve this, start must not be executed because it currently does a server request
342
401
  let desktop = this._createDesktop(session.root);
343
- this.trigger('desktopReady', {
344
- desktop: desktop
345
- });
402
+ this._triggerDesktopReady(desktop);
346
403
  session.render(() => {
347
404
  session._renderDesktop();
348
405
 
@@ -351,14 +408,24 @@ export default class App {
351
408
  session.focusManager.validateFocus();
352
409
 
353
410
  session.ready = true;
354
- this.trigger('sessionReady', {
355
- session: session
356
- });
411
+ this._triggerSessionReady(session);
357
412
  $.log.isInfoEnabled() && $.log.info('Session initialized. Detected ' + Device.get());
358
413
  });
359
414
  return $.resolvedPromise();
360
415
  }
361
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
+
362
429
  _createSession(options) {
363
430
  return scout.create('Session', options, {
364
431
  ensureUniqueId: false
@@ -380,6 +447,7 @@ export default class App {
380
447
 
381
448
  _initDone(options) {
382
449
  this.initialized = true;
450
+ this.setLoading(false);
383
451
  this.trigger('init', {
384
452
  options: options
385
453
  });
@@ -388,6 +456,7 @@ export default class App {
388
456
 
389
457
  _fail(options, error, ...args) {
390
458
  $.log.error('App initialization failed.');
459
+ this.setLoading(false);
391
460
 
392
461
  return this.errorHandler.handle(error, ...args)
393
462
  .then(errorInfo => {
package/src/RemoteApp.js CHANGED
@@ -50,6 +50,7 @@ export default class RemoteApp extends App {
50
50
 
51
51
  _fail(options, error, ...args) {
52
52
  $.log.error('App initialization failed', error);
53
+ this.setLoading(false);
53
54
  // Session.js already handled the error -> don't show a message here
54
55
  // Reject with original rejection arguments
55
56
  return $.rejectedPromise(error, ...args);
@@ -895,11 +895,11 @@ export default class Desktop extends Widget {
895
895
  }
896
896
 
897
897
  /**
898
- * Destroys every popup which is a descendant of the given widget.
898
+ * Removes every popup which is a descendant of the given widget.
899
899
  */
900
- destroyPopupsFor(widget) {
900
+ removePopupsFor(widget) {
901
901
  this.getPopupsFor(widget).forEach(popup => {
902
- popup.destroy();
902
+ popup.remove();
903
903
  });
904
904
  }
905
905
 
@@ -85,6 +85,20 @@
85
85
  }
86
86
  }
87
87
 
88
+ &.glasspane-parent {
89
+ // Modality highlight does not work with pointer-events: none because mouse down is ignored on the glass pane completely by the browser
90
+ // -> we need to disable the hover effect manually
91
+ pointer-events: unset;
92
+
93
+ &:not(.disabled):not(.selected):hover {
94
+ background-color: @desktop-tab-background-color;
95
+ }
96
+
97
+ &:not(.selected):hover > .closer {
98
+ display: none;
99
+ }
100
+ }
101
+
88
102
  &.disabled {
89
103
  background-color: transparent;
90
104
 
@@ -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 {Device, Notification as ScoutNotification, strings} from '../../index';
11
+ import {Device, Notification as ScoutNotification, scout, Status, strings} from '../../index';
12
12
 
13
13
  export default class DesktopNotification extends ScoutNotification {
14
14
 
@@ -20,7 +20,7 @@ export default class DesktopNotification extends ScoutNotification {
20
20
  this._removing = false;
21
21
  this.nativeOnly = false;
22
22
  this.nativeNotificationTitle = null;
23
- this.nativeNotificationIconId = null;
23
+ this.nativeNotificationStatus = null; // holds native message & native icon
24
24
  this.nativeNotificationVisibility = DesktopNotification.NativeNotificationVisibility.NONE;
25
25
  this.nativeNotification = null;
26
26
  this.nativeNotificationShown = false;
@@ -58,7 +58,13 @@ export default class DesktopNotification extends ScoutNotification {
58
58
  let defaults = this.session.desktop.nativeNotificationDefaults;
59
59
  if (defaults) {
60
60
  this.nativeNotificationTitle = model.nativeNotificationTitle !== undefined ? model.nativeNotificationTitle : defaults.title;
61
- this.nativeNotificationIconId = model.nativeNotificationIconId !== undefined ? model.nativeNotificationIconId : defaults.iconId;
61
+ if (this.nativeNotificationStatus) {
62
+ this.nativeNotificationStatus.iconId = this.nativeNotificationStatus.iconId !== undefined ? this.nativeNotificationStatus.iconId : defaults.iconId;
63
+ } else {
64
+ this.nativeNotificationStatus = new Status({
65
+ iconId: defaults.iconId
66
+ });
67
+ }
62
68
  this.nativeNotificationVisibility = scout.nvl(model.nativeNotificationVisibility !== undefined ? model.nativeNotificationVisibility : defaults.visibility, DesktopNotification.NativeNotificationVisibility.NONE);
63
69
  }
64
70
  this.resolveTextKeys(['nativeNotificationTitle']);
@@ -108,10 +114,24 @@ export default class DesktopNotification extends ScoutNotification {
108
114
  return;
109
115
  }
110
116
  let title = scout.nvl(this.nativeNotificationTitle, '');
111
- let body = scout.nvl(strings.nl2br(this.status.message), '');
117
+ let body = (this.nativeNotificationStatus || {}).message;
118
+ if (strings.empty(body)) {
119
+ body = (this.status || {}).message;
120
+ }
121
+ if (!body) {
122
+ body = '';
123
+ }
124
+ if (this.htmlEnabled) {
125
+ body = strings.plainText(body, {removeFontIcons: true});
126
+ }
127
+ let iconId = (this.nativeNotificationStatus || {}).iconId;
128
+ if (strings.empty(iconId)) {
129
+ // icon must not be null or empty. If no icon it must be undefined
130
+ iconId = undefined;
131
+ }
112
132
  this.nativeNotification = new Notification(title, {
113
133
  body: body,
114
- icon: this.nativeNotificationIconId
134
+ icon: iconId
115
135
  });
116
136
 
117
137
  this.nativeNotification.addEventListener('show', event => {
@@ -240,8 +260,13 @@ export default class DesktopNotification extends ScoutNotification {
240
260
  this.setProperty('nativeNotificationTitle', title);
241
261
  }
242
262
 
243
- setNativeNotificationIconId(iconId) {
244
- this.setProperty('nativeNotificationIconId', iconId);
263
+ setNativeNotificationStatus(status) {
264
+ this.setProperty('nativeNotificationStatus', status);
265
+ }
266
+
267
+ _setNativeNotificationStatus(status) {
268
+ status = Status.ensure(status);
269
+ this._setProperty('nativeNotificationStatus', status);
245
270
  }
246
271
 
247
272
  setNativeNotificationVisibility(visibility) {
@@ -1064,10 +1064,10 @@ export default class Outline extends Tree {
1064
1064
  this.setProperty('nodeMenuBarVisible', visible);
1065
1065
  }
1066
1066
 
1067
- glassPaneTargets() {
1067
+ glassPaneTargets(element) {
1068
1068
  // MessageBoxes are often created with Outlines as displayParent. The default implementation of this function
1069
1069
  // would not render any glass panes when the outline is collapsed, thus we need to override this behavior.
1070
- return this._glassPaneTargets();
1070
+ return this._glassPaneTargets(element);
1071
1071
  }
1072
1072
 
1073
1073
  _glassPaneTargets(element) {
@@ -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) {
@@ -9,12 +9,6 @@
9
9
  * BSI Business Systems Integration AG - initial API and implementation
10
10
  */
11
11
  .outline.tree {
12
-
13
- &.in-background > .tree-data > .tree-node.selected {
14
- background-color: @outline-in-background-selection-background-color;
15
- color: @outline-in-background-selection-color;
16
- }
17
-
18
12
  & > .tree-data {
19
13
  padding-top: @outline-data-padding-top;
20
14
 
@@ -91,6 +85,20 @@
91
85
  }
92
86
  }
93
87
  }
88
+
89
+ &.in-background > .tree-data {
90
+ & > .tree-node,
91
+ & > .animation-wrapper > .tree-node {
92
+ &.group {
93
+ background-color: @outline-in-background-group-background-color;
94
+ }
95
+
96
+ &.selected {
97
+ background-color: @outline-in-background-selection-background-color;
98
+ color: @outline-in-background-selection-color;
99
+ }
100
+ }
101
+ }
94
102
  }
95
103
 
96
104
  .outline-title {
@@ -14,6 +14,7 @@ export default class OutlineViewButton extends ViewButton {
14
14
 
15
15
  constructor() {
16
16
  super();
17
+ this.outline = null;
17
18
  this._addWidgetProperties('outline');
18
19
  this._addPreserveOnPropertyChangeProperties(['outline']);
19
20
  this._addCloneProperties(['outline']);
@@ -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
 
@@ -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
@@ -21,6 +21,7 @@ export default class FileChooser extends Widget {
21
21
  this.boxButtons = null;
22
22
  this.uploadButton = null;
23
23
  this.cancelButton = null;
24
+ this.inheritAccessibility = false; // inherit not necessary. if the FileChooser can be opened, it must be editable. Opening a disabled chooser makes no sense.
24
25
  this._addWidgetProperties(['boxButtons', 'uploadButton', 'cancelButton']);
25
26
  }
26
27
 
package/src/form/Form.js CHANGED
@@ -294,7 +294,9 @@ export default class Form extends Widget {
294
294
  }
295
295
 
296
296
  /**
297
- * Method may be implemented to load the data. By default, the provided this.data is returned.
297
+ * Method may be implemented to load the data. <br>
298
+ * By default, a resolved promise containing the provided this.data is returned.
299
+ * @returns {Promise}
298
300
  */
299
301
  _load() {
300
302
  return $.resolvedPromise().then(() => {
@@ -319,6 +321,9 @@ export default class Form extends Widget {
319
321
  return $.resolvedPromise();
320
322
  }
321
323
 
324
+ /**
325
+ * @param {any} data
326
+ */
322
327
  setData(data) {
323
328
  this.setProperty('data', data);
324
329
  }
@@ -327,8 +332,11 @@ export default class Form extends Widget {
327
332
  // NOP
328
333
  }
329
334
 
335
+ /**
336
+ * @returns {any}
337
+ */
330
338
  exportData() {
331
- // NOP
339
+ return null;
332
340
  }
333
341
 
334
342
  /**
@@ -382,7 +390,7 @@ export default class Form extends Widget {
382
390
 
383
391
  /**
384
392
  * This function is called by the lifecycle, when the 'save' function is called.<p>
385
- * The data given to this function is the result of 'exportData' which was called in advance.
393
+ * The data given to this function is the result of {@link exportData} which was called in advance.
386
394
  *
387
395
  * @returns {Promise} promise which may contain a Status specifying if the save operation was successful. The promise may be empty which means the save operation was successful.
388
396
  */
@@ -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
@@ -119,6 +119,7 @@
119
119
  display: inline-block;
120
120
  vertical-align: middle;
121
121
  padding: @group-box-title-padding-top 0 @group-box-title-padding-bottom 0;
122
+ max-width: 100%;
122
123
 
123
124
  .group-box.has-sub-label > & {
124
125
  padding-bottom: @group-box-title-with-sub-label-padding-bottom;
@@ -135,6 +136,7 @@
135
136
  font-size: @sub-title-font-size;
136
137
  letter-spacing: @sub-title-letter-spacing;
137
138
  color: @sub-title-color;
139
+ #scout.overflow-ellipsis();
138
140
  }
139
141
  }
140
142
 
@@ -14,8 +14,8 @@
14
14
  */
15
15
  export default class DeferredGlassPaneTarget {
16
16
  constructor() {
17
- this.$glassPaneTargets;
18
- this.glassPaneRenderer;
17
+ this.$glassPaneTargets = null;
18
+ this.glassPaneRenderer = null;
19
19
  }
20
20
 
21
21
  ready($glassPaneTargets) {
package/src/index.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
@@ -605,6 +605,7 @@ export {default as FormFieldTile} from './tile/fields/FormFieldTile';
605
605
  export {default as FormFieldTileAdapter} from './tile/fields/FormFieldTileAdapter';
606
606
  export {default as ButtonTile} from './tile/fields/button/ButtonTile';
607
607
  export {default as TileButton} from './tile/fields/button/TileButton';
608
+ export {default as TileHtmlField} from './tile/fields/htmlfield/TileHtmlField';
608
609
  export {default as TileTableField} from './tile/fields/tablefield/TileTableField';
609
610
  export {default as SimpleTab} from './tabbox/SimpleTab';
610
611
  export {default as SimpleTabArea} from './tabbox/SimpleTabArea';
@@ -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
@@ -84,3 +84,10 @@
84
84
  height: 18px;
85
85
  vertical-align: middle;
86
86
  }
87
+
88
+ .login-body,
89
+ .logout-body {
90
+ & > .box-background-elements.box-background-elements-fadeout {
91
+ #scout.animation(nop 0.05s);
92
+ }
93
+ }
package/src/main.less CHANGED
@@ -408,7 +408,7 @@ button::-moz-focus-inner {
408
408
  pointer-events: none;
409
409
 
410
410
  &.fadeout {
411
- #scout.animation(application-loading-fade-out @loading-fade-duration linear 1);
411
+ #scout.animation(application-loading-fade-out @loading-fade-duration linear 1 forwards);
412
412
  }
413
413
  }
414
414
 
@@ -8,21 +8,13 @@
8
8
  * Contributors:
9
9
  * BSI Business Systems Integration AG - initial API and implementation
10
10
  */
11
- import {HtmlComponent, Menu} from '../index';
11
+ import {HtmlComponent, Menu, widgets} from '../index';
12
12
 
13
13
  export default class ComboMenu extends Menu {
14
14
 
15
15
  constructor() {
16
16
  super();
17
- this.childSelected = false;
18
- this._childSelectedHandler = this._onChildSelected.bind(this);
19
- }
20
-
21
- _setChildActions(childActions) {
22
- this.childActions.forEach(child => child.off('propertyChange:selected', this._childSelectedHandler));
23
- super._setChildActions(childActions);
24
- this.childActions.forEach(child => child.on('propertyChange:selected', this._childSelectedHandler));
25
- this._updateChildSelected();
17
+ this._childVisibleChangeHandler = this._onChildVisibleChange.bind(this);
26
18
  }
27
19
 
28
20
  _render() {
@@ -36,10 +28,15 @@ export default class ComboMenu extends Menu {
36
28
 
37
29
  _renderProperties() {
38
30
  super._renderProperties();
39
- this._renderChildSelected();
40
31
  this._renderChildActions();
41
32
  }
42
33
 
34
+ _setChildActions(childActions) {
35
+ this.childActions.forEach(child => child.off('propertyChange:visible', this._childVisibleChangeHandler));
36
+ super._setChildActions(childActions);
37
+ this.childActions.forEach(child => child.on('propertyChange:visible', this._childVisibleChangeHandler));
38
+ }
39
+
43
40
  _renderChildActions() {
44
41
  super._renderChildActions();
45
42
 
@@ -47,6 +44,7 @@ export default class ComboMenu extends Menu {
47
44
  childAction.addCssClass('combo-menu-child');
48
45
  childAction.render();
49
46
  });
47
+ widgets.updateFirstLastMarker(this.childActions);
50
48
  }
51
49
 
52
50
  // @override
@@ -54,15 +52,22 @@ export default class ComboMenu extends Menu {
54
52
  return false;
55
53
  }
56
54
 
57
- _onChildSelected(event) {
58
- this._updateChildSelected();
55
+ _onChildVisibleChange(event) {
56
+ if (this.rendered) {
57
+ widgets.updateFirstLastMarker(this.childActions);
58
+ }
59
59
  }
60
60
 
61
- _updateChildSelected() {
62
- this.setProperty('childSelected', this.childActions.some(child => child.selected));
61
+ _doActionTogglesPopup() {
62
+ return false;
63
63
  }
64
64
 
65
- _renderChildSelected() {
66
- this.$container.toggleClass('child-selected', this.childSelected);
65
+ isToggleAction() {
66
+ return false;
67
+ }
68
+
69
+ isTabTarget() {
70
+ // To make children tabbable, combo menu must never be a tab target, even if its a default menu
71
+ return false;
67
72
  }
68
73
  }