@openui5/sap.uxap 1.102.2 → 1.104.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.
package/.eslintrc.json CHANGED
@@ -1,14 +1,13 @@
1
1
  {
2
2
  "overrides": [
3
3
  /*
4
- * Productive code, sample and unit test code of sap.uxap has been cleaned up.
4
+ * Productive code and test code of sap.uxap has been cleaned up.
5
5
  * No more references to the global jQuery allowed
6
6
  */
7
7
  {
8
8
  "files": [
9
9
  "src/**/*.js",
10
- "test/sap/uxap/demokit/**/*.js",
11
- "test/sap/uxap/qunit/**/*.js"
10
+ "test/**/*.js"
12
11
  ],
13
12
  "globals": {
14
13
  "jQuery": "off"
package/.reuse/dep5 CHANGED
@@ -137,6 +137,11 @@ Copyright: jQuery Foundation and other contributors
137
137
  License: MIT
138
138
  Comment: these files belong to: QUnit 2
139
139
 
140
+ Files: src/sap.ui.core/test/sap/ui/core/qunit/thirdparty/qunit-2.18.*
141
+ Copyright: jQuery Foundation and other contributors
142
+ License: MIT
143
+ Comment: these files belong to: QUnit 2.18
144
+
140
145
  Files: src/sap.ui.core/src/sap/ui/thirdparty/jquery-compat.js
141
146
  Copyright: OpenJS Foundation and other contributors
142
147
  License: MIT
@@ -234,6 +239,11 @@ Copyright: 2010-2017, Christian Johansen, christian@cjohansen.no
234
239
  License: BSD-3-Clause
235
240
  Comment: these files belong to: SinonJS
236
241
 
242
+ Files: src/sap.ui.core/test/sap/ui/core/qunit/thirdparty/sinon-14.0.*
243
+ Copyright: 2010-2022, Christian Johansen, christian@cjohansen.no
244
+ License: BSD-3-Clause
245
+ Comment: these files belong to: SinonJS 14
246
+
237
247
  Files: src/sap.ui.core/src/sap/ui/thirdparty/sinon-qunit.js
238
248
  Copyright: 2010-2011, Christian Johansen
239
249
  License: BSD-3-Clause
@@ -339,6 +349,13 @@ Copyright:
339
349
  License: Apache-2.0 and ISC
340
350
  Comment: these files contain content from SAP and node-lru-cache: LRUPersistentCache.js is overall written by SAP, but portions ('Least Recently Used' logic) are taken from the node-lru-cache project (see https://github.com/isaacs/node-lru-cache/blob/v2.7.3/README.md) and modified.
341
351
 
352
+ Files: src/sap.ui.core/test/sap/ui/core/qunit/i18n/helper/_timezones.js
353
+ Copyright:
354
+ 2009-2022 SAP SE or an SAP affiliate company and OpenUI5 contributors
355
+ Arthur David Olson, Paul Eggert and other contributors
356
+ License: Apache-2.0 and LicenseRef-tzdata-PublicDomain
357
+ Comment: these files contain content from SAP and Time Zone Database: _timezones.js is overall written by SAP, but the list of IANA timezone IDs is taken from the Timezone Database
358
+
342
359
 
343
360
  # Library: sap.ui.documentation:
344
361
 
@@ -0,0 +1,5 @@
1
+ Unless specified below, all files in the tz code and data (including
2
+ this LICENSE file) are in the public domain.
3
+
4
+ If the files date.c, newstrftime.3, and strftime.c are present, they
5
+ contain material derived from BSD and use the BSD 3-clause license.
package/THIRDPARTY.txt CHANGED
@@ -76,6 +76,12 @@ License: MIT
76
76
  License Text: https://github.com/SAP/openui5/blob/master/LICENSES/MIT.txt
77
77
  Contained in: src/sap.ui.core/src/sap/ui/thirdparty/qunit-2.*
78
78
 
79
+ Component: QUnit 2.18, version: 2.18.0
80
+ Copyright: jQuery Foundation and other contributors
81
+ License: MIT
82
+ License Text: https://github.com/SAP/openui5/blob/master/LICENSES/MIT.txt
83
+ Contained in: src/sap.ui.core/test/sap/ui/core/qunit/thirdparty/qunit-2.18.*
84
+
79
85
  Component: jQuery-Migrate, version: 3.3.1
80
86
  Copyright: OpenJS Foundation and other contributors
81
87
  License: MIT
@@ -191,13 +197,19 @@ License: BSD-3-Clause
191
197
  License Text: https://github.com/SAP/openui5/blob/master/LICENSES/BSD-3-Clause.txt
192
198
  Contained in: src/sap.ui.core/src/sap/ui/thirdparty/sinon-4.js
193
199
 
200
+ Component: SinonJS 14, version: 14.0.0
201
+ Copyright: 2010-2022, Christian Johansen, christian@cjohansen.no
202
+ License: BSD-3-Clause
203
+ License Text: https://github.com/SAP/openui5/blob/master/LICENSES/BSD-3-Clause.txt
204
+ Contained in: src/sap.ui.core/test/sap/ui/core/qunit/thirdparty/sinon-14.0.*
205
+
194
206
  Component: Sinon-qunit, version: 2.0.0
195
207
  Copyright: 2010-2011, Christian Johansen
196
208
  License: BSD-3-Clause
197
209
  License Text: https://github.com/SAP/openui5/blob/master/LICENSES/BSD-3-Clause.txt
198
210
  Contained in: src/sap.ui.core/src/sap/ui/thirdparty/sinon-qunit.js
199
211
 
200
- Component: URI.js, version: 1.19.10
212
+ Component: URI.js, version: 1.19.11
201
213
  Copyright: Rodney Rehm
202
214
  License: MIT
203
215
  License Text: https://github.com/SAP/openui5/blob/master/LICENSES/MIT.txt
@@ -315,6 +327,12 @@ License: ISC
315
327
  License Text: https://github.com/SAP/openui5/blob/master/LICENSES/ISC.txt
316
328
  Contained in: src/sap.ui.core/src/sap/ui/core/cache/LRUPersistentCache.js
317
329
 
330
+ Component: Time Zone Database, version: 2022a
331
+ Copyright: Arthur David Olson, Paul Eggert and other contributors
332
+ License: LicenseRef-tzdata-PublicDomain
333
+ License Text: https://github.com/SAP/openui5/blob/master/LICENSES/LicenseRef-tzdata-PublicDomain.txt
334
+ Contained in: src/sap.ui.core/test/sap/ui/core/qunit/i18n/helper/_timezones.js
335
+
318
336
 
319
337
  Library: sap.ui.documentation:
320
338
 
@@ -450,7 +468,7 @@ License: Apache-2.0
450
468
  License Text: https://github.com/SAP/openui5/blob/master/LICENSES/Apache-2.0.txt
451
469
  Contained in: lib/jsdoc/ui5/plugin.js
452
470
 
453
- Component: SAP Theming Base Content, version: 11.1.39
471
+ Component: SAP Theming Base Content, version: 11.1.40
454
472
  Copyright: SAP SE or an SAP affiliate company and Theming Base Content contributors
455
473
  License: Apache-2.0
456
474
  License Text: https://github.com/SAP/openui5/blob/master/LICENSES/Apache-2.0.txt
@@ -980,6 +998,21 @@ END of license: LicenseRef-JSONinJSPublicDomain
980
998
  =================================
981
999
 
982
1000
 
1001
+ =================================
1002
+ BEGIN of license: LicenseRef-tzdata-PublicDomain
1003
+ =================================
1004
+
1005
+ Unless specified below, all files in the tz code and data (including
1006
+ this LICENSE file) are in the public domain.
1007
+
1008
+ If the files date.c, newstrftime.3, and strftime.c are present, they
1009
+ contain material derived from BSD and use the BSD 3-clause license.
1010
+
1011
+ =================================
1012
+ END of license: LicenseRef-tzdata-PublicDomain
1013
+ =================================
1014
+
1015
+
983
1016
  =================================
984
1017
  BEGIN of license: MIT
985
1018
  =================================
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openui5/sap.uxap",
3
- "version": "1.102.2",
3
+ "version": "1.104.0",
4
4
  "description": "OpenUI5 UI Library sap.uxap",
5
5
  "author": "SAP SE (https://www.sap.com)",
6
6
  "license": "Apache-2.0",
@@ -14,9 +14,9 @@
14
14
  "url": "https://github.com/SAP/openui5.git"
15
15
  },
16
16
  "dependencies": {
17
- "@openui5/sap.f": "1.102.2",
18
- "@openui5/sap.m": "1.102.2",
19
- "@openui5/sap.ui.core": "1.102.2",
20
- "@openui5/sap.ui.layout": "1.102.2"
17
+ "@openui5/sap.f": "1.104.0",
18
+ "@openui5/sap.m": "1.104.0",
19
+ "@openui5/sap.ui.core": "1.104.0",
20
+ "@openui5/sap.ui.layout": "1.104.0"
21
21
  }
22
22
  }
@@ -3,7 +3,7 @@
3
3
 
4
4
  <name>sap.uxap</name>
5
5
  <vendor>SAP SE</vendor>
6
- <version>1.102.2</version>
6
+ <version>1.104.0</version>
7
7
  <copyright>OpenUI5
8
8
  * (c) Copyright 2009-2022 SAP SE or an SAP affiliate company.
9
9
  * Licensed under the Apache License, Version 2.0 - see LICENSE.txt.</copyright>
@@ -489,7 +489,7 @@ sap.ui.define([
489
489
  AnchorBar.prototype._applyHierarchicalSelectMode = function () {
490
490
 
491
491
  if (this._sHierarchicalSelectMode === AnchorBarRenderer._AnchorBarHierarchicalSelectMode.Icon) {
492
- this._bHideScrollContainer = false;
492
+ this.$().find(".sapUxAPAnchorBarScrollContainer").show();
493
493
 
494
494
  this._oSelect.setWidth("auto");
495
495
  this._oSelect.setAutoAdjustWidth(true);
@@ -497,7 +497,7 @@ sap.ui.define([
497
497
  this._computeBarSectionsInfo();
498
498
 
499
499
  } else {
500
- this._bHideScrollContainer = true;
500
+ this.$().find(".sapUxAPAnchorBarScrollContainer").hide();
501
501
 
502
502
  this._oSelect.setWidth("100%");
503
503
  this._oSelect.setAutoAdjustWidth(false);
@@ -505,8 +505,6 @@ sap.ui.define([
505
505
  }
506
506
 
507
507
  this.$().toggleClass("sapUxAPAnchorBarOverflow", this._sHierarchicalSelectMode === AnchorBarRenderer._AnchorBarHierarchicalSelectMode.Icon);
508
-
509
- this.invalidate();
510
508
  };
511
509
 
512
510
  AnchorBar.prototype._adjustSize = function (oEvent) {
@@ -27,9 +27,6 @@ sap.ui.define(["sap/m/ToolbarRenderer", "sap/ui/core/Renderer", "sap/m/BarInPage
27
27
  rm.renderControl(oToolbar._getScrollArrowLeft());
28
28
 
29
29
  rm.openStart("div", oToolbar.getId() + "-scrollContainer");
30
- if (oToolbar._bHideScrollContainer) {
31
- rm.style("display", "none");
32
- }
33
30
  // ARIA attributes
34
31
  rm.class("sapUxAPAnchorBarScrollContainer")
35
32
  .openEnd();
@@ -40,9 +37,7 @@ sap.ui.define(["sap/m/ToolbarRenderer", "sap/ui/core/Renderer", "sap/m/BarInPage
40
37
  .attr("aria-label", sap.ui.getCore().getLibraryResourceBundle("sap.uxap").getText("ANCHOR_BAR_ARIA_LABEL"))
41
38
  .openEnd();
42
39
 
43
- if (!oToolbar._bHideScrollContainer) {
44
- AnchorBarRenderer.renderBarItems(rm, oToolbar);
45
- }
40
+ AnchorBarRenderer.renderBarItems(rm, oToolbar);
46
41
 
47
42
  rm.close("div");
48
43
 
@@ -21,7 +21,7 @@ sap.ui.define([
21
21
  *
22
22
  * @class
23
23
  * @author SAP SE
24
- * @version 1.102.2
24
+ * @version 1.104.0
25
25
  * @since 1.26
26
26
  * @alias sap.uxap.BlockBaseMetadata
27
27
  * @extends sap.ui.core.ElementMetadata
@@ -22,7 +22,7 @@ sap.ui.define(['sap/ui/core/Element', './library'],
22
22
  * @extends sap.ui.core.Element
23
23
  *
24
24
  * @author SAP SE
25
- * @version 1.102.2
25
+ * @version 1.104.0
26
26
  *
27
27
  * @constructor
28
28
  * @public
@@ -41,7 +41,7 @@ sap.ui.define([
41
41
  * @implements sap.uxap.IHeaderContent
42
42
  *
43
43
  * @author SAP SE
44
- * @version 1.102.2
44
+ * @version 1.104.0
45
45
  *
46
46
  * @constructor
47
47
  * @public
@@ -42,7 +42,7 @@ sap.ui.define([
42
42
  * @implements sap.uxap.IHeaderTitle
43
43
  *
44
44
  * @author SAP SE
45
- * @version 1.102.2
45
+ * @version 1.104.0
46
46
  *
47
47
  * @constructor
48
48
  * @public
@@ -21,7 +21,6 @@ sap.ui.define([
21
21
  "./LazyLoading",
22
22
  "./ObjectPageLayoutABHelper",
23
23
  "./ThrottledTaskHelper",
24
- "sap/m/ScrollBar",
25
24
  "sap/ui/core/library",
26
25
  "./library",
27
26
  "./ObjectPageLayoutRenderer",
@@ -51,7 +50,6 @@ sap.ui.define([
51
50
  LazyLoading,
52
51
  ABHelper,
53
52
  ThrottledTask,
54
- ScrollBar,
55
53
  coreLibrary,
56
54
  library,
57
55
  ObjectPageLayoutRenderer,
@@ -411,9 +409,7 @@ sap.ui.define([
411
409
  /**
412
410
  * Internal aggregation to hold the reference to the IHeaderContent implementation.
413
411
  */
414
- _headerContent: {type: "sap.uxap.IHeaderContent", multiple: false, visibility: "hidden"},
415
-
416
- _customScrollBar: {type: "sap.ui.core.Control", multiple: false, visibility: "hidden"}
412
+ _headerContent: {type: "sap.uxap.IHeaderContent", multiple: false, visibility: "hidden"}
417
413
  },
418
414
  events: {
419
415
 
@@ -682,6 +678,7 @@ sap.ui.define([
682
678
  bPinnable;
683
679
 
684
680
  this._deregisterScreenSizeListener();
681
+ this._deregisterTitleSizeListener();
685
682
 
686
683
  if (this._oLazyLoading) {
687
684
  this._oLazyLoading.destroy();
@@ -907,6 +904,7 @@ sap.ui.define([
907
904
  this._moveHeaderToContentArea();
908
905
  this._scrollTo(0, 0, 0);
909
906
  this._bHeaderExpanded = true;
907
+ this._adjustHeaderHeights(); // call synchonously (before resize notification) to avoid visual flickering
910
908
  this._updateToggleHeaderVisualIndicators();
911
909
 
912
910
  if (this._isHeaderPinnable()) {
@@ -1012,7 +1010,7 @@ sap.ui.define([
1012
1010
  /**
1013
1011
  * Retrieves the list of sections to render initially
1014
1012
  * (the list includes the sections to be loaded lazily, as these are empty in the beginning, only their skeleton will be rendered)
1015
- * @returns the sections list
1013
+ * @returns {sap.uxap.ObjectPageSection[]} the sections list
1016
1014
  */
1017
1015
  ObjectPageLayout.prototype._getSectionsToRender = function () {
1018
1016
  this._adjustSelectedSectionByUXRules();
@@ -1057,7 +1055,7 @@ sap.ui.define([
1057
1055
  * (1) the currently <code>selectedSection</code>
1058
1056
  * (2) the static configuration for the count of items to preload in <code>sap.uxap._helpers.LazyLoading</code>
1059
1057
  *
1060
- * @returns the subSections list
1058
+ * @returns {sap.uxap.ObjectPageSubSection[]} the subSections list
1061
1059
  */
1062
1060
  ObjectPageLayout.prototype._getSectionsToPreloadOnBeforeFirstRendering = function () {
1063
1061
  var aSectionBases,
@@ -1131,12 +1129,13 @@ sap.ui.define([
1131
1129
 
1132
1130
  this._bInvalidatedAndNotRerendered = false;
1133
1131
 
1134
- this._iResizeId = ResizeHandler.register(this, this._onUpdateScreenSize.bind(this));
1135
-
1136
1132
  this._ensureCorrectParentHeight();
1137
1133
 
1138
1134
  this._cacheDomElements();
1139
1135
 
1136
+ this._iResizeId = ResizeHandler.register(this, this._onUpdateScreenSize.bind(this));
1137
+ this._iTitleResizeId = ResizeHandler.register(this._$titleArea.get(0), this._adjustTitlePositioning.bind(this));
1138
+
1140
1139
  if (this._hasDynamicTitle()) {
1141
1140
  this.addStyleClass("sapUxAPObjectPageHasDynamicTitle");
1142
1141
  }
@@ -1207,10 +1206,6 @@ sap.ui.define([
1207
1206
  // (to avoid any scrollbar appearing even for an instance while we snap/unsnap header)
1208
1207
  this._toggleScrolling(!this._bAllContentFitsContainer);
1209
1208
 
1210
- if (Device.system.desktop) {
1211
- this._$opWrapper.on("scroll.OPL", this.onWrapperScroll.bind(this));
1212
- }
1213
-
1214
1209
  this._registerOnContentResize();
1215
1210
 
1216
1211
  this.getHeaderTitle() && this._shiftHeaderTitle();
@@ -1310,6 +1305,7 @@ sap.ui.define([
1310
1305
  }
1311
1306
 
1312
1307
  this._deregisterScreenSizeListener();
1308
+ this._deregisterTitleSizeListener();
1313
1309
 
1314
1310
  if (this._iContentResizeId) {
1315
1311
  ResizeHandler.deregister(this._iContentResizeId);
@@ -1333,46 +1329,6 @@ sap.ui.define([
1333
1329
  this._oFirstVisibleSubSection = null;
1334
1330
  };
1335
1331
 
1336
- ObjectPageLayout.prototype._getCustomScrollBar = function () {
1337
-
1338
- if (!this.getAggregation("_customScrollBar")) {
1339
- var oVSB = new ScrollBar(this.getId() + "-vertSB", {
1340
- scrollPosition: 0,
1341
- scroll: this.onCustomScrollerScroll.bind(this),
1342
- visible: false
1343
- });
1344
- this.setAggregation("_customScrollBar", oVSB, true);
1345
- }
1346
-
1347
- return this.getAggregation("_customScrollBar");
1348
- };
1349
-
1350
- ObjectPageLayout.prototype.onWrapperScroll = function (oEvent) {
1351
- var iScrollTop = Math.max(oEvent.target.scrollTop, 0);
1352
-
1353
- if (this._getCustomScrollBar()) {
1354
- if (this.allowCustomScroll === true) {
1355
- this.allowCustomScroll = false;
1356
- return;
1357
- }
1358
- this.allowInnerDiv = true;
1359
-
1360
- this._getCustomScrollBar().setScrollPosition(iScrollTop);
1361
- }
1362
- };
1363
-
1364
- ObjectPageLayout.prototype.onCustomScrollerScroll = function (oEvent) {
1365
- var iScrollTop = Math.max(this._getCustomScrollBar().getScrollPosition(), 0); // top of the visible page
1366
-
1367
- if (this.allowInnerDiv === true) {
1368
- this.allowInnerDiv = false;
1369
- return;
1370
- }
1371
- this.allowCustomScroll = true;
1372
-
1373
- jQuery(this._$opWrapper).scrollTop(iScrollTop);
1374
- };
1375
-
1376
1332
  ObjectPageLayout.prototype.setShowOnlyHighImportance = function (bValue) {
1377
1333
  var bOldValue = this.getShowOnlyHighImportance();
1378
1334
 
@@ -1420,43 +1376,33 @@ sap.ui.define([
1420
1376
  };
1421
1377
 
1422
1378
  /**
1423
- * Callback for the end of the scroll triggered from <code>scrollToElement</code>
1424
- * of <code>sap.ui.core.delegate.ScrollEnablement</code>.
1379
+ * Offsets to the required scroll position.
1380
+ * The offset is the offset of the scroll container from the top of the content container.
1425
1381
  *
1426
- * Required for Safari and IE11 (where there is no browser automatic scroll adjustment,
1427
- * see <code>overflow-anchor</code> CSS property).
1428
- *
1429
- * The execution of <code>scrollToElement</code> changes the current scroll position,
1430
- * so we check if the new scroll position entails subsequent change of the scroll
1431
- * container of our page(namely: snapping of the header, which involves removal
1432
- * of the anchorBar from the top of the scroll container and placing it
1433
- * in the title area above the scroll container instead).
1434
- *
1435
- * If such a change (namely, removal of the anchorBar from the top of the scroll container)
1436
- * should occur, then the content bellow the removed anchorBar will became offset with X pixels,
1437
- * where X is the anchorBar height => the element [provided to <code>scrollToElement </code>]
1438
- * will be misplaced as a result.
1439
- *
1440
- * Therefore here we synchronously call the listener to the "scroll" event to check if
1441
- * it entails the above snapping and subsequent misplacement => if it entails it,
1442
- * then we adjust back the scroll position to correct the misplacement of the scrolled element.
1382
+ * This is required because <code>sap.ui.code>ScrollEnablement.prototype.scrollToElement</code>
1383
+ * scrolls the element to the very top of the scroll container, regardless of the scroll container top-padding.
1443
1384
  *
1444
1385
  * @private
1445
1386
  */
1446
1387
  ObjectPageLayout.prototype._onAfterScrollToElement = function () {
1447
1388
  var iScrollTop = this._$opWrapper.scrollTop(),
1448
- bStickyAnchorBarBefore = this._bStickyAnchorBar;
1389
+ bStickyAnchorBarBefore = this._bStickyAnchorBar,
1390
+ iOffset;
1449
1391
 
1450
1392
  // synchronously call the listener for the "scroll" event, to trigger any pending toggling of the header
1451
1393
  this._onScroll({ target: { scrollTop: iScrollTop}});
1452
1394
 
1453
- // if the anchorBar was sticked (removed from the topmost part of the scrollable area) =>
1454
- // all elements bellow it became offset with X pixels, where X is the anchorBar height =>
1455
- // the element (target of <code>scrollToElement</code>) was offset respectively =>
1456
- // adjust the scroll position to ensure the element is back visible (outside scroll overflow)
1395
+ // the <code>this._$contentContainer</code> is offset from the top of the scroll container
1396
+ // with padding, in order to make space for the elements in the title area
1397
+ iOffset = this._$contentContainer.get(0).offsetTop;
1398
+
1457
1399
  if (this._bStickyAnchorBar && !bStickyAnchorBarBefore && this._$opWrapper.scrollTop() === iScrollTop) {
1458
- this._$opWrapper.scrollTop(iScrollTop - this.iAnchorBarHeight);
1400
+ // the offset in sticky mode is different from the offset in expanded mode
1401
+ // where the difference is obtained from <code>this._getTitleHeightDelta()</code>
1402
+ iOffset -= this._getTitleHeightDelta();
1459
1403
  }
1404
+
1405
+ this._$opWrapper.scrollTop(iScrollTop - iOffset);
1460
1406
  };
1461
1407
 
1462
1408
  /**
@@ -2201,8 +2147,6 @@ sap.ui.define([
2201
2147
 
2202
2148
  this._preloadSectionsOnBeforeScroll(oSection);
2203
2149
 
2204
- this.getHeaderTitle() && this._shiftHeaderTitle();
2205
-
2206
2150
  iScrollTo += iOffset;
2207
2151
 
2208
2152
  if (!this._bStickyAnchorBar && this._shouldSnapHeaderOnScroll(iScrollTo)) {
@@ -2289,7 +2233,7 @@ sap.ui.define([
2289
2233
  * @param {object} oTargetSection the section
2290
2234
  * @private
2291
2235
  */
2292
- ObjectPageLayout.prototype._preloadSectionsOnBeforeScroll = function (oTargetSection) {
2236
+ ObjectPageLayout.prototype._preloadSectionsOnBeforeScroll = function (oTargetSection) {
2293
2237
 
2294
2238
  var sId = oTargetSection.getId(),
2295
2239
  aToLoad;
@@ -2308,22 +2252,28 @@ sap.ui.define([
2308
2252
  //on desktop we delay the call to have the preload done during the scrolling animation
2309
2253
  setTimeout(function () {
2310
2254
  this._connectModelsForSections(aToLoad);
2255
+
2256
+ this._fireSubSectionEnteredViewPortEvent(aToLoad);
2311
2257
  }.bind(this), 50);
2312
2258
  } else {
2313
2259
  //on device, do the preload first then scroll.
2314
2260
  //doing anything during the scrolling animation may
2315
2261
  //trouble animation and lazy loading on slow devices.
2316
2262
  this._connectModelsForSections(aToLoad);
2317
- }
2318
2263
 
2319
- aToLoad.forEach(function (subSection) {
2320
- this.fireEvent("subSectionEnteredViewPort", {
2321
- subSection: subSection
2322
- });
2323
- }, this);
2264
+ this._fireSubSectionEnteredViewPortEvent(aToLoad);
2265
+ }
2324
2266
  }
2325
2267
  };
2326
2268
 
2269
+ ObjectPageLayout.prototype._fireSubSectionEnteredViewPortEvent = function (aToLoad) {
2270
+ aToLoad.forEach(function (oSubSection) {
2271
+ this.fireEvent("subSectionEnteredViewPort", {
2272
+ subSection: oSubSection
2273
+ });
2274
+ }, this);
2275
+ };
2276
+
2327
2277
  /**
2328
2278
  * Returns the UI5 ID of the Section that is currently being scrolled.
2329
2279
  *
@@ -2632,7 +2582,7 @@ sap.ui.define([
2632
2582
  });
2633
2583
  }
2634
2584
 
2635
- this._updateCustomScrollerHeight(bStickyTitleMode);
2585
+ this._adjustTitlePositioning();
2636
2586
 
2637
2587
  this._setSectionInfoIsDirty(false);
2638
2588
 
@@ -2678,27 +2628,6 @@ sap.ui.define([
2678
2628
  return iSectionsContainerHeight + "px";
2679
2629
  };
2680
2630
 
2681
- ObjectPageLayout.prototype._updateCustomScrollerHeight = function(bRequiresSnap) {
2682
-
2683
- if (Device.system.desktop && this.getAggregation("_customScrollBar")) {
2684
-
2685
- // update content size
2686
- var iScrollableContentSize = this._computeScrollableContentSize(bRequiresSnap);
2687
- iScrollableContentSize += this._getStickyAreaHeight(bRequiresSnap);
2688
- this._getCustomScrollBar().setContentSize(iScrollableContentSize + "px");
2689
-
2690
-
2691
- // update visibility
2692
- var bShouldBeVisible = (iScrollableContentSize > Math.ceil(this.iScreenHeight)),
2693
- bVisibilityChange = (bShouldBeVisible !== this._getCustomScrollBar().getVisible());
2694
-
2695
- if (bVisibilityChange) {
2696
- this._getCustomScrollBar().setVisible(bShouldBeVisible);
2697
- this.getHeaderTitle() && this._shiftHeaderTitle();
2698
- }
2699
- }
2700
- };
2701
-
2702
2631
  ObjectPageLayout.prototype._computeScrollableContentSize = function(bShouldStick) {
2703
2632
 
2704
2633
  var iScrollableContentHeight = 0;
@@ -3004,6 +2933,34 @@ sap.ui.define([
3004
2933
  || (this._$contentContainer.length && this._$contentContainer.get(0).offsetHeight !== this.iContentHeight);
3005
2934
  };
3006
2935
 
2936
+ ObjectPageLayout.prototype._adjustTitlePositioning = function (oEvent) {
2937
+ if (!this._$titleArea.length || !this._$opWrapper.length) {
2938
+ return;
2939
+ }
2940
+
2941
+ var oWrapperElement = this._$opWrapper.get(0),
2942
+ oTitleElement = this._$titleArea.get(0),
2943
+ iTitleHeight = oTitleElement.getBoundingClientRect().height,
2944
+ iTitleWidth = oTitleElement.getBoundingClientRect().width;
2945
+
2946
+ // the top area of the scroll container is reserved for showing the title element,
2947
+ // (where the title element is positioned absolutely on top of the scroll container),
2948
+ // therefore
2949
+
2950
+ // (1) add top padding for the area underneath the title element
2951
+ // so that the title does not overlap the content of the scroll container
2952
+ oWrapperElement.style.paddingTop = iTitleHeight + "px";
2953
+
2954
+ // (2) also make the area underneath the title invisible (using clip-path)
2955
+ // to allow usage of *transparent background* of the title element
2956
+ // (otherwise content from the scroll *overflow* will show underneath the transparent title element)
2957
+ oWrapperElement.style.clipPath = 'polygon(0px ' + iTitleHeight + 'px, '
2958
+ + Math.floor(iTitleWidth) + 'px ' + iTitleHeight + 'px, '
2959
+ + Math.floor(iTitleWidth) + 'px 0, 100% 0, 100% 100%, 0 100%)';
2960
+
2961
+ this.getHeaderTitle() && this._shiftHeaderTitle();
2962
+ };
2963
+
3007
2964
  /**
3008
2965
  * called when the screen is resize by users. Updates the screen height
3009
2966
  * @param oEvent
@@ -3146,7 +3103,7 @@ sap.ui.define([
3146
3103
  var iReachableScrollTop;
3147
3104
  iExtraSpaceLength = iExtraSpaceLength || 0;
3148
3105
 
3149
- iReachableScrollTop = this._oScrollContainerLastState.iScrollableContentLength + iExtraSpaceLength - this._oScrollContainerLastState.iScrollableViewportHeight;
3106
+ iReachableScrollTop = this._oScrollContainerLastState.iScrollableContentLength + iExtraSpaceLength + this._$contentContainer.get(0).offsetTop - this._oScrollContainerLastState.iScrollableViewportHeight;
3150
3107
  return iReachableScrollTop >= oRequiredScrollTop;
3151
3108
  };
3152
3109
 
@@ -3172,6 +3129,17 @@ sap.ui.define([
3172
3129
  }
3173
3130
  };
3174
3131
 
3132
+ /**
3133
+ * removes listener for title-area resize
3134
+ * @private
3135
+ */
3136
+ ObjectPageLayout.prototype._deregisterTitleSizeListener = function () {
3137
+ if (this._iTitleResizeId) {
3138
+ ResizeHandler.deregister(this._iTitleResizeId);
3139
+ this._iTitleResizeId = null;
3140
+ }
3141
+ };
3142
+
3175
3143
  /**
3176
3144
  * called when the user scrolls on the page
3177
3145
  * @param oEvent
@@ -3785,6 +3753,7 @@ sap.ui.define([
3785
3753
  }
3786
3754
 
3787
3755
  this._adjustHeaderBackgroundSize();
3756
+ this._adjustTitlePositioning();
3788
3757
 
3789
3758
  Log.info("ObjectPageLayout :: adjustHeaderHeight", "headerTitleHeight: " + this.iHeaderTitleHeight + " - headerTitleStickiedHeight: " + this.iHeaderTitleHeightStickied + " - headerContentHeight: " + this.iHeaderContentHeight);
3790
3759
  } else {
@@ -3892,6 +3861,7 @@ sap.ui.define([
3892
3861
  * Retrieve the current header design that was defined in the headerTitle if available
3893
3862
  *
3894
3863
  * @private
3864
+ * @returns {sap.uxap.ObjectPageHeaderDesign}
3895
3865
  */
3896
3866
  ObjectPageLayout.prototype._getHeaderDesign = function () {
3897
3867
  var oHeader = this.getHeaderTitle(),
@@ -3907,6 +3877,7 @@ sap.ui.define([
3907
3877
  * Gets only the visible sections
3908
3878
  *
3909
3879
  * @private
3880
+ * @returns {sap.uxap.ObjectPageSection[]}
3910
3881
  */
3911
3882
 
3912
3883
  ObjectPageLayout.prototype._getVisibleSections = function () {
@@ -4066,6 +4037,7 @@ sap.ui.define([
4066
4037
  * Lazy loading of the _headerContent aggregation
4067
4038
  *
4068
4039
  * @private
4040
+ * @returns {sap.uxap.IHeaderContent}
4069
4041
  */
4070
4042
  ObjectPageLayout.prototype._getHeaderContent = function () {
4071
4043
  return this.getAggregation("_headerContent");
@@ -4116,7 +4088,8 @@ sap.ui.define([
4116
4088
  };
4117
4089
 
4118
4090
  ObjectPageLayout.prototype._hasVerticalScrollBar = function () {
4119
- return (this._getCustomScrollBar().getVisible() === true);
4091
+ var oWrapperElement = this._$opWrapper.length && this._$opWrapper.get(0);
4092
+ return oWrapperElement && (oWrapperElement.scrollHeight > oWrapperElement.offsetHeight);
4120
4093
  };
4121
4094
 
4122
4095
  ObjectPageLayout.prototype._shiftHeaderTitle = function () {
@@ -4124,7 +4097,7 @@ sap.ui.define([
4124
4097
  var oShiftOffsetParams = this._calculateShiftOffset(),
4125
4098
  sDirection = oShiftOffsetParams.sStyleAttribute,
4126
4099
  sPixels = oShiftOffsetParams.iMarginalsOffset;
4127
- this.$().find(".sapUxAPObjectPageHeaderTitle").css("padding-" + sDirection, sPixels + "px");
4100
+ this.$().find(".sapUxAPObjectPageHeaderTitle").css(sDirection, sPixels + "px");
4128
4101
  };
4129
4102
 
4130
4103
  /**
@@ -26,7 +26,7 @@ sap.ui.define(["sap/ui/Device"],
26
26
  var aSections,
27
27
  oHeader = oControl.getHeaderTitle(),
28
28
  oAnchorBar = null,
29
- oRb = sap.uxap.ObjectPageLayout._getLibraryResourceBundle(),
29
+ oRb = sap.ui.getCore().getLibraryResourceBundle("sap.uxap"),
30
30
  bIsHeaderContentVisible = oControl.getHeaderContent() && oControl.getHeaderContent().length > 0 && oControl.getShowHeaderContent(),
31
31
  bIsTitleInHeaderContent = oControl.getShowTitleInHeaderContent() && oControl.getShowHeaderContent(),
32
32
  bRenderHeaderContent = bIsHeaderContentVisible || bIsTitleInHeaderContent,
@@ -73,11 +73,6 @@ sap.ui.define(["sap/ui/Device"],
73
73
  oRm.accessibilityState(oControl, oControl._formatLandmarkInfo(oLandmarkInfo, "Root"));
74
74
  oRm.openEnd();
75
75
 
76
- // custom scrollbar
77
- if (Device.system.desktop) {
78
- oRm.renderControl(oControl._getCustomScrollBar());
79
- }
80
-
81
76
  // Header
82
77
  oRm.openStart(sHeaderTag, oControl.getId() + "-headerTitle");
83
78
  if (!bHeaderRoleSet) {
@@ -37,7 +37,7 @@ sap.ui.define([
37
37
  * @extends sap.ui.core.Element
38
38
  *
39
39
  * @author SAP SE
40
- * @version 1.102.2
40
+ * @version 1.104.0
41
41
  *
42
42
  * @constructor
43
43
  * @public
@@ -172,15 +172,12 @@ sap.ui.define([
172
172
  */
173
173
  ObjectPageSectionBase.prototype.setInvisibleTextLabelValue = function (sValue) {
174
174
  var oAriaLabelledBy = this.getAggregation("ariaLabelledBy"),
175
- sSectionText = this.getSectionText(),
176
175
  sLabel = "";
177
176
 
178
- if (sValue) {
179
- sLabel = sValue + " ";
180
- }
177
+ sLabel = sValue || this.getSectionText();
181
178
 
182
179
  if (oAriaLabelledBy) {
183
- sap.ui.getCore().byId(oAriaLabelledBy.getId()).setText(sLabel + sSectionText);
180
+ sap.ui.getCore().byId(oAriaLabelledBy.getId()).setText(sLabel);
184
181
  }
185
182
 
186
183
  return this;
@@ -193,17 +190,12 @@ sap.ui.define([
193
190
  */
194
191
  ObjectPageSectionBase.prototype._getAriaLabelledBy = function () {
195
192
  // Each section should be labelled as:
196
- // 'titleName Section' - if the section has a title
193
+ // 'titleName' - if the section has a title
197
194
  // 'Section' - if it does not have a title
198
195
 
199
- var sLabel = "",
200
- sTitle = this._getTitle();
201
-
202
- if (sTitle) {
203
- sLabel += sTitle + " ";
204
- }
196
+ var sLabel = "";
205
197
 
206
- sLabel += this.getSectionText();
198
+ sLabel = this._getTitle() || this.getSectionText();
207
199
 
208
200
  return new InvisibleText({
209
201
  text: sLabel
@@ -25,7 +25,7 @@ sap.ui.define([
25
25
  * @constructor
26
26
  * @alias sap.uxap.changeHandler.AddIFrameObjectPageLayout
27
27
  * @author SAP SE
28
- * @version 1.102.2
28
+ * @version 1.104.0
29
29
  * @since 1.75
30
30
  * @experimental Since 1.75
31
31
  */
@@ -13,7 +13,7 @@ sap.ui.define(["sap/ui/fl/changeHandler/MoveControls", "sap/ui/core/Core", "sap/
13
13
  * @constructor
14
14
  * @alias sap.uxap.changeHandler.MoveObjectPageSection
15
15
  * @author SAP SE
16
- * @version 1.102.2
16
+ * @version 1.104.0
17
17
  * @experimental Since 1.54
18
18
  */
19
19
 
@@ -21,7 +21,7 @@ sap.ui.define([
21
21
  * @constructor
22
22
  * @alias sap.uxap.changeHandler.RenameObjectPageSection
23
23
  * @author SAP SE
24
- * @version 1.102.2
24
+ * @version 1.104.0
25
25
  * @experimental Since 1.50
26
26
  */
27
27
 
@@ -10,16 +10,18 @@ sap.ui.define([
10
10
  "sap/ui/base/ManagedObject",
11
11
  "sap/ui/core/mvc/Controller",
12
12
  "sap/base/Log",
13
- "sap/base/util/ObjectPath",
14
- "sap/ui/thirdparty/jquery"
13
+ "sap/base/util/each",
14
+ "sap/base/util/isEmptyObject",
15
+ "sap/base/util/ObjectPath"
15
16
  ], function(
16
17
  BindingMode,
17
18
  Context,
18
19
  ManagedObject,
19
20
  Controller,
20
21
  Log,
21
- ObjectPath,
22
- jQuery
22
+ each,
23
+ isEmptyObject,
24
+ ObjectPath
23
25
  ) {
24
26
  "use strict";
25
27
 
@@ -27,16 +29,16 @@ sap.ui.define([
27
29
 
28
30
  /**
29
31
  * injects the header based on configuration
30
- * @param {object} oModel model instanse
32
+ * @param {object} oModel model instance
31
33
  */
32
34
  connectToComponent: function (oModel) {
33
35
 
34
- var bHasPendingRequest = jQuery.isEmptyObject(oModel.getData());
36
+ var bHasPendingRequest = isEmptyObject(oModel.getData());
35
37
 
36
38
  //ensure a 1 way binding otherwise it cause any block property change to update the entire subSections
37
39
  oModel.setDefaultBindingMode(BindingMode.OneWay);
38
40
 
39
- var fnHeaderFactory = jQuery.proxy(function () {
41
+ var fnHeaderFactory = function () {
40
42
 
41
43
  if (bHasPendingRequest) {
42
44
  oModel.detachRequestCompleted(fnHeaderFactory);
@@ -56,7 +58,7 @@ sap.ui.define([
56
58
  }
57
59
  }
58
60
 
59
- }, this);
61
+ }.bind(this);
60
62
 
61
63
  //if data are not there yet, we wait for them
62
64
  if (bHasPendingRequest) {
@@ -82,21 +84,21 @@ sap.ui.define([
82
84
  oControlMetadata = oControlClass.getMetadata();
83
85
 
84
86
  //pre-processing: substitute event handler as strings by their function instance
85
- jQuery.each(oControlMetadata._mAllEvents, jQuery.proxy(function (sEventName, oEventProperties) {
87
+ each(oControlMetadata._mAllEvents, function (sEventName, oEventProperties) {
86
88
  if (typeof oControlInfo[sEventName] == "string") {
87
89
  oControlInfo[sEventName] = this.convertEventHandler(oControlInfo[sEventName]);
88
90
  }
89
- }, this));
91
+ }.bind(this));
90
92
 
91
93
  //creates the control with control info = create with provided properties
92
94
  oControl = ManagedObject.create(oControlInfo);
93
95
 
94
96
  //post-processing: bind properties on the objectPageLayoutMetadata model
95
- jQuery.each(oControlMetadata._mAllProperties, jQuery.proxy(function (sPropertyName, oProperty) {
97
+ each(oControlMetadata._mAllProperties, function (sPropertyName, oProperty) {
96
98
  if (oControlInfo[sPropertyName]) {
97
99
  oControl.bindProperty(sPropertyName, "objectPageLayoutMetadata>" + oBindingContext.getPath() + "/" + sPropertyName);
98
100
  }
99
- }, this));
101
+ });
100
102
  } catch (sError) {
101
103
  Log.error("ObjectPageLayoutFactory :: error in control creation from config: " + sError);
102
104
  }
@@ -114,7 +116,7 @@ sap.ui.define([
114
116
  var fnNameSpace = window, aNameSpaceParts = sStaticHandlerName.split('.');
115
117
 
116
118
  try {
117
- jQuery.each(aNameSpaceParts, function (iIndex, sNameSpacePart) {
119
+ each(aNameSpaceParts, function (iIndex, sNameSpacePart) {
118
120
  fnNameSpace = fnNameSpace[sNameSpacePart];
119
121
  });
120
122
  } catch (sError) {
@@ -195,10 +195,6 @@ function(
195
195
  return ["sections", "_anchorBar", "headerContent"];
196
196
  }
197
197
  }
198
- }, {
199
- domRef : function(oElement) {
200
- return oElement.$("vertSB-sb").get(0);
201
- }
202
198
  }],
203
199
  templates: {
204
200
  create: "sap/uxap/designtime/ObjectPageLayout.create.fragment.xml"
@@ -25,7 +25,7 @@ sap.ui.define([
25
25
  * @namespace
26
26
  * @alias sap.uxap
27
27
  * @author SAP SE
28
- * @version 1.102.2
28
+ * @version 1.104.0
29
29
  * @since 1.36
30
30
  * @public
31
31
  */
@@ -68,7 +68,7 @@ sap.ui.define([
68
68
  "sap.uxap.ObjectPageHeaderLayoutData",
69
69
  "sap.uxap.ObjectPageLazyLoader"
70
70
  ],
71
- version: "1.102.2",
71
+ version: "1.104.0",
72
72
  extensions: {
73
73
  flChangeHandlers: {
74
74
  "sap.uxap.ObjectPageHeader": "sap/uxap/flexibility/ObjectPageHeader",
@@ -1,7 +1,7 @@
1
1
 
2
- SHOW_MORE=\uC790\uC138\uD788 \uD45C\uC2DC
2
+ SHOW_MORE=\uC790\uC138\uD788 \uBCF4\uAE30
3
3
 
4
- SHOW_LESS=\uAC04\uB2E8\uD788 \uD45C\uC2DC
4
+ SHOW_LESS=\uAC04\uB2E8\uD788 \uBCF4\uAE30
5
5
 
6
6
  ANCHOR_BAR_ARIA_LABEL=\uC575\uCEE4
7
7
 
@@ -13,7 +13,7 @@ BREADCRUMB_TRAIL_LABEL=\uD0D0\uC0C9 \uACBD\uB85C \uCD94\uC801
13
13
 
14
14
  SHOW_ALL=\uBAA8\uB450 \uD45C\uC2DC
15
15
 
16
- HIDE_ALL=\uAC04\uB2E8\uD788 \uD45C\uC2DC
16
+ HIDE_ALL=\uAC04\uB2E8\uD788 \uBCF4\uAE30
17
17
 
18
18
  SHOW=\uD3BC\uCE58\uAE30
19
19
 
@@ -233,6 +233,15 @@ html[data-sap-ui-browser^=ie] .sapUxAPObjectPageHeaderObjectImageContainerSub >
233
233
  padding-bottom: 0;
234
234
  }
235
235
 
236
+ .sapUxAPObjectPageHeaderTitle {
237
+ position: absolute;
238
+ padding-right: 0px;
239
+ top: 0;
240
+ right: 0;
241
+ left: 0;
242
+ z-index: 2;
243
+ }
244
+
236
245
  .sapUxAPObjectPageHeaderTitleArrow {
237
246
  vertical-align: top;
238
247
  white-space: nowrap;