@eclipse-scout/core 22.0.1 → 22.0.11

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 (156) 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 +517 -361
  6. package/dist/eclipse-scout-core-theme-dark.css.map +1 -1
  7. package/dist/eclipse-scout-core-theme.css +300 -144
  8. package/dist/eclipse-scout-core-theme.css.map +1 -1
  9. package/dist/eclipse-scout-core.js +1150 -766
  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/ErrorHandler.js +66 -28
  16. package/src/{table/TableHeaderMenuButtonKeyStroke.js → action/ActionExecKeyStroke.js} +4 -5
  17. package/src/action/Button.less +1 -0
  18. package/src/box/Box.less +10 -6
  19. package/src/breadcrumbbar/BreadcrumbItem.less +3 -6
  20. package/src/calendar/Calendar.js +40 -58
  21. package/src/calendar/Calendar.less +10 -10
  22. package/src/calendar/CalendarLayout.js +3 -1
  23. package/src/checkbox/CheckBox.less +3 -1
  24. package/src/datepicker/DatePicker.less +1 -0
  25. package/src/datepicker/DatePickerTouchPopup.js +8 -0
  26. package/src/desktop/DisableBrowserF5ReloadKeyStroke.js +1 -0
  27. package/src/desktop/bench/DesktopTabSelectKeyStroke.js +2 -1
  28. package/src/desktop/desktoptab/DesktopTab.less +5 -2
  29. package/src/desktop/desktoptab/DesktopTabArea.less +7 -3
  30. package/src/desktop/desktoptab/DisableBrowserTabSwitchingKeyStroke.js +1 -0
  31. package/src/desktop/navigation/DesktopNavigation.less +4 -0
  32. package/src/desktop/navigation/EnlargeNavigationKeyStroke.js +1 -0
  33. package/src/desktop/navigation/ShrinkNavigationKeyStroke.js +1 -0
  34. package/src/desktop/notification/DesktopNotification.js +11 -4
  35. package/src/desktop/notification/DesktopNotification.less +5 -3
  36. package/src/desktop/outline/Outline.less +4 -4
  37. package/src/desktop/viewbutton/ViewButton.less +13 -9
  38. package/src/desktop/viewbutton/ViewMenuPopupEnterKeyStroke.js +2 -1
  39. package/src/desktop/viewbutton/ViewMenuTab.less +3 -2
  40. package/src/filechooser/FileChooser.js +1 -1
  41. package/src/filechooser/FileChooser.less +16 -11
  42. package/src/focus/FocusContext.js +11 -8
  43. package/src/focus/FocusManager.js +24 -5
  44. package/src/form/Form.less +1 -0
  45. package/src/form/fields/LookupBox.js +5 -2
  46. package/src/form/fields/LookupBox.less +28 -2
  47. package/src/form/fields/TextFieldIcon.less +2 -2
  48. package/src/form/fields/ValueField.js +11 -2
  49. package/src/form/fields/breadcrumbbarfield/BreadcrumbBarField.less +20 -0
  50. package/src/form/fields/button/ButtonKeyStroke.js +0 -3
  51. package/src/form/fields/datefield/DateField.js +31 -47
  52. package/src/form/fields/filechooserfield/FileChooserFieldBrowseKeyStroke.js +1 -3
  53. package/src/form/fields/filechooserfield/FileChooserFieldDeleteKeyStroke.js +1 -3
  54. package/src/form/fields/groupbox/GroupBox.js +14 -9
  55. package/src/form/fields/groupbox/GroupBox.less +1 -0
  56. package/src/form/fields/htmlfield/HtmlField.less +0 -1
  57. package/src/form/fields/listbox/ListBox.js +13 -7
  58. package/src/form/fields/lookupfield/lookupField.js +6 -5
  59. package/src/form/fields/smartfield/ProposalField.js +2 -1
  60. package/src/form/fields/smartfield/ProposalTreeNode.js +4 -8
  61. package/src/form/fields/smartfield/SmartField.js +4 -20
  62. package/src/form/fields/smartfield/SmartField.less +24 -11
  63. package/src/form/fields/splitbox/SplitBoxCollapseKeyStroke.js +1 -0
  64. package/src/form/fields/splitbox/SplitBoxFirstCollapseKeyStroke.js +1 -0
  65. package/src/form/fields/splitbox/SplitBoxSecondCollapseKeyStroke.js +1 -0
  66. package/src/form/fields/tabbox/TabAreaLayout.js +63 -66
  67. package/src/form/fields/tabbox/TabAreaLeftKeyStroke.js +2 -0
  68. package/src/form/fields/tabbox/TabAreaRightKeyStroke.js +2 -0
  69. package/src/form/fields/tabbox/TabBox.js +8 -7
  70. package/src/form/fields/tabbox/TabBox.less +2 -1
  71. package/src/form/fields/tabbox/TabBoxHeader.js +4 -0
  72. package/src/form/fields/tabbox/TabBoxHeaderLayout.js +5 -5
  73. package/src/form/fields/tabbox/TabItem.js +4 -0
  74. package/src/form/fields/treebox/TreeBox.js +6 -5
  75. package/src/glasspane/GlassPane.js +3 -3
  76. package/src/group/Group.less +1 -1
  77. package/src/index.js +1 -1
  78. package/src/index.less +1 -0
  79. package/src/jquery/jquery-scout.js +17 -4
  80. package/src/keystroke/CloseKeyStroke.js +1 -0
  81. package/src/keystroke/ContextMenuKeyStroke.js +1 -0
  82. package/src/keystroke/FocusFilterFieldKeyStroke.js +1 -0
  83. package/src/keystroke/KeyStroke.js +11 -3
  84. package/src/keystroke/TabItemKeyStroke.js +8 -5
  85. package/src/logging/logging.js +16 -8
  86. package/src/login/LoginBox.js +3 -2
  87. package/src/login/LoginBox.less +18 -1
  88. package/src/menu/ContextMenuPopup.less +9 -2
  89. package/src/menu/Menu.less +1 -0
  90. package/src/menu/MenuExecKeyStroke.js +3 -17
  91. package/src/menu/MenuNavigationKeyStroke.js +1 -0
  92. package/src/menu/menubar/MenuBarLeftKeyStroke.js +2 -0
  93. package/src/menu/menubar/MenuBarRightKeyStroke.js +2 -0
  94. package/src/messagebox/MessageBox.less +17 -17
  95. package/src/modeselector/Mode.less +15 -37
  96. package/src/modeselector/ModeSelector.js +1 -1
  97. package/src/modeselector/ModeSelector.less +2 -1
  98. package/src/planner/Planner.js +2 -0
  99. package/src/planner/PlannerHeader.less +2 -1
  100. package/src/popup/Popup.js +24 -8
  101. package/src/popup/PopupLayout.js +2 -8
  102. package/src/scrollbar/Scrollbar.less +8 -1
  103. package/src/scrollbar/scrollbars.js +26 -4
  104. package/src/session/Session.js +8 -5
  105. package/src/style/colors-dark.less +17 -10
  106. package/src/style/colors.less +11 -3
  107. package/src/style/fonts.less +10 -1
  108. package/src/style/mixins.less +16 -12
  109. package/src/style/sizes-dark.less +4 -1
  110. package/src/style/sizes.less +17 -9
  111. package/src/table/Table.js +62 -48
  112. package/src/table/Table.less +50 -20
  113. package/src/table/TableAdapter.js +9 -12
  114. package/src/table/TableHeader.js +10 -8
  115. package/src/table/TableHeader.less +1 -0
  116. package/src/table/TableHeaderMenu.js +3 -1
  117. package/src/table/TableHeaderMenu.less +7 -2
  118. package/src/table/TableHeaderMenuButton.js +2 -2
  119. package/src/table/TableLayout.js +6 -0
  120. package/src/table/columns/BooleanColumn.js +2 -2
  121. package/src/table/columns/Column.js +10 -7
  122. package/src/table/editor/CellEditorPopup.js +29 -15
  123. package/src/table/keystrokes/AbstractTableNavigationKeyStroke.js +1 -0
  124. package/src/table/keystrokes/TableCopyKeyStroke.js +1 -0
  125. package/src/table/keystrokes/TableNavigationCollapseKeyStroke.js +2 -2
  126. package/src/table/keystrokes/TableNavigationEndKeyStroke.js +2 -2
  127. package/src/table/keystrokes/TableNavigationExpandKeyStroke.js +2 -2
  128. package/src/table/keystrokes/TableNavigationHomeKeyStroke.js +2 -2
  129. package/src/table/keystrokes/TableNavigationPageDownKeyStroke.js +2 -2
  130. package/src/table/keystrokes/TableNavigationPageUpKeyStroke.js +2 -2
  131. package/src/table/keystrokes/TableNavigationUpKeyStroke.js +2 -2
  132. package/src/table/keystrokes/TableRefreshKeyStroke.js +2 -2
  133. package/src/table/keystrokes/TableSelectAllKeyStroke.js +3 -2
  134. package/src/table/keystrokes/TableStartCellEditKeyStroke.js +2 -2
  135. package/src/testing/index.js +1 -0
  136. package/src/testing/lookup/AbortableMicrotaskStaticLookupCall.js +50 -0
  137. package/src/tile/TileGrid.js +10 -12
  138. package/src/tile/TileGridLayout.js +2 -2
  139. package/src/tile/accordion/TileAccordion.js +16 -1
  140. package/src/tile/fields/FormFieldTile.less +18 -11
  141. package/src/tile/fields/tablefield/TileTableField.less +19 -2
  142. package/src/tile/keystrokes/TileGridSelectKeyStroke.js +3 -2
  143. package/src/timepicker/TimePickerTouchPopup.js +8 -0
  144. package/src/tree/CompactTree.less +1 -1
  145. package/src/tree/Tree.js +4 -4
  146. package/src/tree/Tree.less +13 -5
  147. package/src/tree/keystrokes/AbstractTreeNavigationKeyStroke.js +1 -0
  148. package/src/tree/keystrokes/TreeCollapseAllKeyStroke.js +2 -2
  149. package/src/tree/keystrokes/TreeExpandOrDrillDownKeyStroke.js +2 -2
  150. package/src/tree/keystrokes/TreeNavigationDownKeyStroke.js +2 -2
  151. package/src/tree/keystrokes/TreeNavigationEndKeyStroke.js +2 -2
  152. package/src/tree/keystrokes/TreeNavigationUpKeyStroke.js +2 -2
  153. package/src/util/Device.js +4 -4
  154. package/src/util/arrays.js +44 -2
  155. package/src/util/objects.js +4 -1
  156. package/src/widget/Widget.js +17 -7
@@ -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
@@ -64,6 +64,13 @@
64
64
  & > .animation-wrapper > .tree-node {
65
65
  cursor: pointer;
66
66
  }
67
+
68
+ &.disabled > .tree-node,
69
+ &.disabled > .animation-wrapper > .tree-node,
70
+ & > .tree-node.disabled,
71
+ & > .animation-wrapper > .tree-node.disabled {
72
+ cursor: default;
73
+ }
67
74
  }
68
75
  }
69
76
 
@@ -95,12 +102,14 @@
95
102
  color: @disabled-color;
96
103
  }
97
104
 
105
+ .disabled > .animation-wrapper > &,
98
106
  .disabled > & {
99
107
  /* Whole tree is disabled -> use darker disabled color */
100
108
  color: @text-disabled-color;
101
109
  }
102
110
 
103
- .disabled.read-only > .tree-data > & {
111
+ .disabled.read-only > .animation-wrapper > &,
112
+ .disabled.read-only > & {
104
113
  color: @read-only-color;
105
114
  }
106
115
 
@@ -132,6 +141,7 @@
132
141
  &.font-icon {
133
142
  /* Necessary to align with the text, depends on the used font size */
134
143
  line-height: @tree-node-font-icon-line-height;
144
+ font-size: @tree-node-font-icon-size;
135
145
  }
136
146
  }
137
147
  }
@@ -216,18 +226,16 @@
216
226
 
217
227
  .tree-node.lazy > & {
218
228
  font-family: @font-default-family;
219
- font-size: @font-size-normal;
220
229
  content: '+';
221
230
  /* Move to left because '+' sign is not as wide as 'arrow-down' */
222
231
  margin-left: -2px;
223
232
  }
224
233
 
225
234
  .tree-node.expanded > & {
226
- /* This "imprecise" angle is a workround for firefox to prevent shifting the div a little when the animation finishes. */
235
+ /* This "imprecise" angle is a workaround for firefox to prevent shifting the div a little when the animation finishes. */
227
236
  /* See https://bugzilla.mozilla.org/show_bug.cgi?id=739176 */
228
237
  #scout.transform(rotate(89.99deg));
229
238
  }
230
-
231
239
  }
232
240
 
233
241
  &:hover {
@@ -24,6 +24,7 @@ export default class AbstractTreeNavigationKeyStroke extends KeyStroke {
24
24
  this.alt = keyStrokeModifier.isAlt(modifierBitMask);
25
25
 
26
26
  this.keyStrokeMode = KeyStroke.Mode.DOWN;
27
+ this.inheritAccessibility = false;
27
28
  }
28
29
 
29
30
  _accept(event) {
@@ -16,11 +16,11 @@ export default class TreeCollapseAllKeyStroke extends AbstractTreeNavigationKeyS
16
16
  super(tree, keyStrokeModifier);
17
17
  this.which = [keys.HOME];
18
18
  this.renderingHints.hAlign = HAlign.RIGHT;
19
- this.renderingHints.$drawingArea = function($drawingArea, event) {
19
+ this.renderingHints.$drawingArea = ($drawingArea, event) => {
20
20
  if (this.field.visibleNodesFlat.length > 0) {
21
21
  return this.field.visibleNodesFlat[0].$node;
22
22
  }
23
- }.bind(this);
23
+ };
24
24
  }
25
25
 
26
26
  handle(event) {
@@ -16,14 +16,14 @@ export default class TreeExpandOrDrillDownKeyStroke extends AbstractTreeNavigati
16
16
  super(tree, modifierBitMask);
17
17
  this.which = [keys.ADD];
18
18
  this.renderingHints.text = '+';
19
- this.renderingHints.$drawingArea = function($drawingArea, event) {
19
+ this.renderingHints.$drawingArea = ($drawingArea, event) => {
20
20
  let currentNode = event._treeCurrentNode;
21
21
  if (this.isNodeExpandable(currentNode)) {
22
22
  return currentNode.$node;
23
23
  } else if (currentNode.childNodes.length > 0) {
24
24
  return currentNode.childNodes[0].$node;
25
25
  }
26
- }.bind(this);
26
+ };
27
27
  }
28
28
 
29
29
  _accept(event) {
@@ -16,12 +16,12 @@ export default class TreeNavigationDownKeyStroke extends AbstractTreeNavigationK
16
16
  super(tree, modifierBitMask);
17
17
  this.which = [keys.DOWN];
18
18
  this.renderingHints.text = '↓';
19
- this.renderingHints.$drawingArea = function($drawingArea, event) {
19
+ this.renderingHints.$drawingArea = ($drawingArea, event) => {
20
20
  let newSelectedNode = this._computeNewSelection(event._treeCurrentNode);
21
21
  if (newSelectedNode) {
22
22
  return newSelectedNode.$node;
23
23
  }
24
- }.bind(this);
24
+ };
25
25
  }
26
26
 
27
27
  _computeNewSelection(currentNode) {
@@ -15,12 +15,12 @@ export default class TreeNavigationEndKeyStroke extends AbstractTreeNavigationKe
15
15
  constructor(tree, modifierBitMask) {
16
16
  super(tree, modifierBitMask);
17
17
  this.which = [keys.END];
18
- this.renderingHints.$drawingArea = function($drawingArea, event) {
18
+ this.renderingHints.$drawingArea = ($drawingArea, event) => {
19
19
  let newSelectedNode = this._computeNewSelection(event._treeCurrentNode);
20
20
  if (newSelectedNode) {
21
21
  return newSelectedNode.$node;
22
22
  }
23
- }.bind(this);
23
+ };
24
24
  }
25
25
 
26
26
  handle(event) {
@@ -16,12 +16,12 @@ export default class TreeNavigationUpKeyStroke extends AbstractTreeNavigationKey
16
16
  super(tree, modifierBitMask);
17
17
  this.which = [keys.UP];
18
18
  this.renderingHints.text = '↑';
19
- this.renderingHints.$drawingArea = function($drawingArea, event) {
19
+ this.renderingHints.$drawingArea = ($drawingArea, event) => {
20
20
  let newSelectedNode = this._computeNewSelection(event._treeCurrentNode);
21
21
  if (newSelectedNode) {
22
22
  return newSelectedNode.$node;
23
23
  }
24
- }.bind(this);
24
+ };
25
25
  }
26
26
 
27
27
  _computeNewSelection(currentNode) {
@@ -259,15 +259,15 @@ export default class Device {
259
259
 
260
260
  /**
261
261
  * This method returns false for all browsers that are known to be unsupported, all others (e.g. unknown engines) are allowed by default.
262
- * The supported browser versions are mainly determined by the features needed by Scout (e.g. class syntax, Array.flatMap, IntersectionObserver, Custom CSS Properties, CSS flex-box).
262
+ * The supported browser versions are mainly determined by the features needed by Scout (e.g. class syntax, Array.flatMap, IntersectionObserver, Custom CSS Properties, CSS flex-box, queueMicrotask).
263
263
  */
264
264
  isSupportedBrowser(browser, version) {
265
265
  browser = scout.nvl(browser, this.browser);
266
266
  version = scout.nvl(version, this.browserVersion);
267
267
  let browsers = Device.Browser;
268
- return (browser === browsers.CHROME && version >= 69)
269
- || (browser === browsers.FIREFOX && version >= 62)
270
- || (browser === browsers.SAFARI && version >= 12);
268
+ return (browser === browsers.CHROME && version >= 71)
269
+ || (browser === browsers.FIREFOX && version >= 69)
270
+ || (browser === browsers.SAFARI && version >= 12.1);
271
271
  }
272
272
 
273
273
  /**
@@ -206,6 +206,11 @@ export function containsAll(haystack, needles) {
206
206
  });
207
207
  }
208
208
 
209
+ /**
210
+ * @template T
211
+ * @param {T[]} arr
212
+ * @return {T}
213
+ */
209
214
  export function first(arr) {
210
215
  if (Array.isArray(arr)) {
211
216
  return arr[0];
@@ -213,6 +218,11 @@ export function first(arr) {
213
218
  return arr;
214
219
  }
215
220
 
221
+ /**
222
+ * @template T
223
+ * @param {T[]} arr
224
+ * @return {T}
225
+ */
216
226
  export function last(arr) {
217
227
  if (Array.isArray(arr)) {
218
228
  return arr[arr.length - 1];
@@ -285,8 +295,8 @@ export function union(array1, array2) {
285
295
  return result;
286
296
  }
287
297
 
288
- // noinspection DuplicatedCode
289
298
  export function equalsIgnoreOrder(arr, arr2) {
299
+ // noinspection DuplicatedCode
290
300
  if (arr === arr2) {
291
301
  return true;
292
302
  }
@@ -302,8 +312,8 @@ export function equalsIgnoreOrder(arr, arr2) {
302
312
  return containsAll(arr, arr2);
303
313
  }
304
314
 
305
- // noinspection DuplicatedCode
306
315
  export function equals(arr, arr2) {
316
+ // noinspection DuplicatedCode
307
317
  if (arr === arr2) {
308
318
  return true;
309
319
  }
@@ -600,9 +610,40 @@ export function toMap(array, keyMapper = (el => el), valueMapper = (el => el)) {
600
610
  }, {}));
601
611
  }
602
612
 
613
+ /**
614
+ * If the argument is an empty array, null is returned. Otherwise, the argument is returned unchanged.
615
+ *
616
+ * @template T
617
+ * @param {T[]} array
618
+ * @return {T[]|null}
619
+ */
620
+ export function nullIfEmpty(array) {
621
+ return empty(array) ? null : array;
622
+ }
623
+
624
+ /**
625
+ * Clears the content of an array <i>in-place</i>. All elements are removed from the array and the
626
+ * length will be set to 0. If the given argument is not an array, nothing happens.
627
+ *
628
+ * This is a more readable version of `array.splice(0, a.length)`.
629
+ *
630
+ * The return value is an array of all deleted elements (never null).
631
+ *
632
+ * @template T
633
+ * @param {T[]} array
634
+ * @return {T[]}
635
+ */
636
+ export function clear(array) {
637
+ if (Array.isArray(array)) {
638
+ return array.splice(0, array.length);
639
+ }
640
+ return [];
641
+ }
642
+
603
643
  export default {
604
644
  $indexOf,
605
645
  $remove,
646
+ clear,
606
647
  contains,
607
648
  containsAll,
608
649
  containsAny,
@@ -638,6 +679,7 @@ export default {
638
679
  max,
639
680
  min,
640
681
  move,
682
+ nullIfEmpty,
641
683
  pushAll,
642
684
  pushIfDefined,
643
685
  pushSet,
@@ -693,11 +693,14 @@ export function resolveConstProperty(object, config) {
693
693
  /**
694
694
  * @param {object} obj
695
695
  * @returns {Boolean|undefined}
696
- * - true if the obj is empty
696
+ * - true if the obj is empty, null or undefined
697
697
  * - false if the obj is not empty
698
698
  * - nothing if the obj is not an object
699
699
  */
700
700
  export function isEmpty(obj) {
701
+ if (isNullOrUndefined(obj)) {
702
+ return true;
703
+ }
701
704
  if (!isPlainObject(obj)) {
702
705
  return;
703
706
  }
@@ -524,7 +524,8 @@ export default class Widget {
524
524
  * After the animation is executed, the element gets removed using this._removeInternal.
525
525
  */
526
526
  _removeAnimated() {
527
- if (!Device.get().supportsCssAnimation() || !this.$container || this.$container.isDisplayNone()) {
527
+ let animateRemovalWhileRemovingParent = this._animateRemovalWhileRemovingParent();
528
+ if ((this.parent.removing && !animateRemovalWhileRemovingParent) || !Device.get().supportsCssAnimation() || !this.$container || this.$container.isDisplayNone()) {
528
529
  // Cannot remove animated, remove regularly
529
530
  this._removeInternal();
530
531
  return;
@@ -544,7 +545,7 @@ export default class Widget {
544
545
  if (!this.animateRemovalClass) {
545
546
  throw new Error('Missing animate removal class. Cannot remove animated.');
546
547
  }
547
- if (!this.$container.isVisible() || !this.$container.isEveryParentVisible()) {
548
+ if (!this.$container.isVisible() || !this.$container.isEveryParentVisible() || !this.$container.isAttached()) {
548
549
  // If element is not visible, animationEnd would never fire -> remove it immediately
549
550
  this._removeInternal();
550
551
  return;
@@ -557,7 +558,14 @@ export default class Widget {
557
558
 
558
559
  // If the parent is being removed while the animation is running, the animationEnd event will never fire
559
560
  // -> Make sure remove is called nevertheless. Important: remove it before the parent is removed to maintain the regular remove order
560
- this.parent.one('removing', this._parentRemovingWhileAnimatingHandler);
561
+ if (!animateRemovalWhileRemovingParent) {
562
+ this.parent.one('removing', this._parentRemovingWhileAnimatingHandler);
563
+ }
564
+ }
565
+
566
+ _animateRemovalWhileRemovingParent() {
567
+ // By default, remove animation is prevented when parent is being removed
568
+ return false;
561
569
  }
562
570
 
563
571
  _onParentRemovingWhileAnimating() {
@@ -2062,15 +2070,17 @@ export default class Widget {
2062
2070
  * Tries to set the focus on the widget.
2063
2071
  * <p>
2064
2072
  * By default the focus is set on the container but this may vary from widget to widget.
2073
+ *
2074
+ * @param {object} [options]
2075
+ * @param {boolean} [options.preventScroll] prevents scrolling to new focused element (defaults to false)
2065
2076
  * @returns {boolean} true if the element could be focused, false if not
2066
2077
  */
2067
- focus() {
2078
+ focus(options) {
2068
2079
  if (!this.rendered) {
2069
- this.session.layoutValidator.schedulePostValidateFunction(this.focus.bind(this));
2080
+ this.session.layoutValidator.schedulePostValidateFunction(this.focus.bind(this, options));
2070
2081
  return false;
2071
2082
  }
2072
-
2073
- return this.session.focusManager.requestFocus(this.getFocusableElement());
2083
+ return this.session.focusManager.requestFocus(this.getFocusableElement(), null, options);
2074
2084
  }
2075
2085
 
2076
2086
  /**