@openui5/sap.ui.core 1.84.23 → 1.84.26

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 (247) hide show
  1. package/LICENSE.txt +1 -1
  2. package/package.json +1 -1
  3. package/src/jquery.sap.global.js +1 -1
  4. package/src/jquery.sap.properties.js +1 -1
  5. package/src/jquery.sap.resources.js +1 -1
  6. package/src/jquery.sap.script.js +1 -1
  7. package/src/jquery.sap.storage.js +3 -3
  8. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  9. package/src/sap/base/util/restricted/_castArray.js +1 -1
  10. package/src/sap/base/util/restricted/_compact.js +1 -1
  11. package/src/sap/base/util/restricted/_curry.js +1 -1
  12. package/src/sap/base/util/restricted/_debounce.js +1 -1
  13. package/src/sap/base/util/restricted/_difference.js +1 -1
  14. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  15. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  16. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  17. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  18. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  19. package/src/sap/base/util/restricted/_flatten.js +1 -1
  20. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  21. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  22. package/src/sap/base/util/restricted/_intersection.js +1 -1
  23. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  24. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  25. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  26. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  27. package/src/sap/base/util/restricted/_isNil.js +1 -1
  28. package/src/sap/base/util/restricted/_max.js +1 -1
  29. package/src/sap/base/util/restricted/_merge.js +1 -1
  30. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  31. package/src/sap/base/util/restricted/_min.js +1 -1
  32. package/src/sap/base/util/restricted/_omit.js +1 -1
  33. package/src/sap/base/util/restricted/_pick.js +1 -1
  34. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  35. package/src/sap/base/util/restricted/_throttle.js +1 -1
  36. package/src/sap/base/util/restricted/_toArray.js +1 -1
  37. package/src/sap/base/util/restricted/_union.js +1 -1
  38. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  39. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  40. package/src/sap/base/util/restricted/_uniq.js +1 -1
  41. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  42. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  43. package/src/sap/base/util/restricted/_without.js +1 -1
  44. package/src/sap/base/util/restricted/_xor.js +1 -1
  45. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  46. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  47. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  48. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  49. package/src/sap/ui/Device.js +3 -3
  50. package/src/sap/ui/Global.js +4 -4
  51. package/src/sap/ui/base/Event.js +1 -1
  52. package/src/sap/ui/base/EventProvider.js +1 -1
  53. package/src/sap/ui/base/Interface.js +1 -1
  54. package/src/sap/ui/base/ManagedObject.js +1 -1
  55. package/src/sap/ui/base/ManagedObjectMetadata.js +1 -1
  56. package/src/sap/ui/base/Metadata.js +1 -1
  57. package/src/sap/ui/base/Object.js +1 -1
  58. package/src/sap/ui/base/ObjectPool.js +1 -1
  59. package/src/sap/ui/core/.library +1 -1
  60. package/src/sap/ui/core/BusyIndicator.js +1 -1
  61. package/src/sap/ui/core/Component.js +1 -1
  62. package/src/sap/ui/core/ComponentContainer.js +1 -1
  63. package/src/sap/ui/core/ComponentMetadata.js +1 -1
  64. package/src/sap/ui/core/ComponentSupport.js +1 -1
  65. package/src/sap/ui/core/Control.js +1 -1
  66. package/src/sap/ui/core/Core.js +1 -1
  67. package/src/sap/ui/core/CustomData.js +1 -1
  68. package/src/sap/ui/core/CustomizingConfiguration.js +1 -1
  69. package/src/sap/ui/core/DeclarativeSupport.js +1 -1
  70. package/src/sap/ui/core/Element.js +1 -1
  71. package/src/sap/ui/core/ElementMetadata.js +1 -1
  72. package/src/sap/ui/core/EnabledPropagator.js +1 -1
  73. package/src/sap/ui/core/EventBus.js +1 -1
  74. package/src/sap/ui/core/Fragment.js +1 -1
  75. package/src/sap/ui/core/HTML.js +1 -1
  76. package/src/sap/ui/core/History.js +1 -1
  77. package/src/sap/ui/core/Icon.js +1 -1
  78. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  79. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  80. package/src/sap/ui/core/InvisibleMessage.js +9 -1
  81. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  82. package/src/sap/ui/core/InvisibleText.js +1 -1
  83. package/src/sap/ui/core/Item.js +1 -1
  84. package/src/sap/ui/core/LabelEnablement.js +1 -1
  85. package/src/sap/ui/core/LayoutData.js +1 -1
  86. package/src/sap/ui/core/ListItem.js +1 -1
  87. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  88. package/src/sap/ui/core/Locale.js +1 -1
  89. package/src/sap/ui/core/LocaleData.js +1 -1
  90. package/src/sap/ui/core/Manifest.js +1 -1
  91. package/src/sap/ui/core/Message.js +1 -1
  92. package/src/sap/ui/core/Popup.js +240 -59
  93. package/src/sap/ui/core/RenderManager.js +1 -1
  94. package/src/sap/ui/core/Renderer.js +1 -1
  95. package/src/sap/ui/core/ResizeHandler.js +1 -1
  96. package/src/sap/ui/core/ScrollBar.js +1 -1
  97. package/src/sap/ui/core/SeparatorItem.js +1 -1
  98. package/src/sap/ui/core/Title.js +1 -1
  99. package/src/sap/ui/core/TooltipBase.js +1 -1
  100. package/src/sap/ui/core/UIArea.js +1 -1
  101. package/src/sap/ui/core/UIComponent.js +1 -1
  102. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  103. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  104. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  105. package/src/sap/ui/core/XMLComposite.js +1 -1
  106. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  107. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  108. package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
  109. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  110. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  111. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  112. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  113. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  114. package/src/sap/ui/core/library.js +3 -3
  115. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  116. package/src/sap/ui/core/message/Message.js +1 -1
  117. package/src/sap/ui/core/message/MessageManager.js +1 -1
  118. package/src/sap/ui/core/message/MessageParser.js +1 -1
  119. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  120. package/src/sap/ui/core/mvc/HTMLView.js +1 -1
  121. package/src/sap/ui/core/mvc/JSONView.js +1 -1
  122. package/src/sap/ui/core/mvc/JSView.js +1 -1
  123. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  124. package/src/sap/ui/core/mvc/View.js +1 -1
  125. package/src/sap/ui/core/mvc/XMLView.js +1 -1
  126. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  127. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  128. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  129. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  130. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  131. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
  132. package/src/sap/ui/core/search/SearchProvider.js +1 -1
  133. package/src/sap/ui/core/service/Service.js +1 -1
  134. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  135. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  136. package/src/sap/ui/core/support/Plugin.js +1 -1
  137. package/src/sap/ui/core/support/Support.js +1 -1
  138. package/src/sap/ui/core/support/plugins/ControlTree.js +1 -1
  139. package/src/sap/ui/core/support/plugins/Interaction.js +1 -1
  140. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  141. package/src/sap/ui/core/support/plugins/MessageTest.js +1 -1
  142. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  143. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  144. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  145. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  146. package/src/sap/ui/core/support/plugins/ViewInfo.js +1 -1
  147. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  148. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  149. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  150. package/src/sap/ui/core/tmpl/Template.js +1 -1
  151. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  152. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  153. package/src/sap/ui/core/util/Export.js +1 -1
  154. package/src/sap/ui/core/util/ExportCell.js +1 -1
  155. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  156. package/src/sap/ui/core/util/ExportRow.js +1 -1
  157. package/src/sap/ui/core/util/ExportType.js +1 -1
  158. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  159. package/src/sap/ui/core/util/File.js +1 -1
  160. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  161. package/src/sap/ui/core/util/MockServer.js +1 -1
  162. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  163. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  164. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  165. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  166. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  167. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  168. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  169. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  170. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  171. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  172. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  173. package/src/sap/ui/debug/ControlTree.js +1 -1
  174. package/src/sap/ui/debug/DebugEnv.js +1 -1
  175. package/src/sap/ui/debug/PropertyList.js +1 -1
  176. package/src/sap/ui/model/ClientModel.js +1 -1
  177. package/src/sap/ui/model/CompositeDataState.js +1 -1
  178. package/src/sap/ui/model/CompositeType.js +1 -1
  179. package/src/sap/ui/model/DataState.js +1 -1
  180. package/src/sap/ui/model/MetaModel.js +1 -1
  181. package/src/sap/ui/model/Model.js +1 -1
  182. package/src/sap/ui/model/SelectionModel.js +1 -1
  183. package/src/sap/ui/model/SimpleType.js +1 -1
  184. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  185. package/src/sap/ui/model/Type.js +1 -1
  186. package/src/sap/ui/model/json/JSONModel.js +1 -1
  187. package/src/sap/ui/model/message/MessageModel.js +1 -1
  188. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  189. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  190. package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
  191. package/src/sap/ui/model/odata/ODataMetadata.js +1 -1
  192. package/src/sap/ui/model/odata/ODataModel.js +1 -1
  193. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  194. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  195. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  196. package/src/sap/ui/model/odata/type/Date.js +1 -1
  197. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  198. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  199. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  200. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  201. package/src/sap/ui/model/odata/type/Double.js +1 -1
  202. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  203. package/src/sap/ui/model/odata/type/Int.js +1 -1
  204. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  205. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  206. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  207. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  208. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  209. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  210. package/src/sap/ui/model/odata/type/Single.js +1 -1
  211. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  212. package/src/sap/ui/model/odata/type/String.js +1 -1
  213. package/src/sap/ui/model/odata/type/Time.js +1 -1
  214. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  215. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  216. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  217. package/src/sap/ui/model/odata/v2/ODataContextBinding.js +4 -1
  218. package/src/sap/ui/model/odata/v2/ODataModel.js +5 -2
  219. package/src/sap/ui/model/odata/v4/Context.js +1 -1
  220. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +1 -1
  221. package/src/sap/ui/model/odata/v4/ODataListBinding.js +1 -1
  222. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +1 -1
  223. package/src/sap/ui/model/odata/v4/ODataModel.js +1 -1
  224. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +1 -1
  225. package/src/sap/ui/model/resource/ResourceModel.js +1 -1
  226. package/src/sap/ui/model/type/Boolean.js +1 -1
  227. package/src/sap/ui/model/type/Currency.js +1 -1
  228. package/src/sap/ui/model/type/Date.js +1 -1
  229. package/src/sap/ui/model/type/DateInterval.js +1 -1
  230. package/src/sap/ui/model/type/DateTime.js +1 -1
  231. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  232. package/src/sap/ui/model/type/FileSize.js +1 -1
  233. package/src/sap/ui/model/type/Float.js +1 -1
  234. package/src/sap/ui/model/type/Integer.js +1 -1
  235. package/src/sap/ui/model/type/String.js +1 -1
  236. package/src/sap/ui/model/type/Time.js +1 -1
  237. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  238. package/src/sap/ui/model/type/Unit.js +1 -1
  239. package/src/sap/ui/model/xml/XMLModel.js +1 -1
  240. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  241. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  242. package/src/sap/ui/thirdparty/IPv6.js +1 -1
  243. package/src/sap/ui/thirdparty/SecondLevelDomains.js +1 -1
  244. package/src/sap/ui/thirdparty/URI.js +8 -2
  245. package/src/sap/ui/thirdparty/URITemplate.js +1 -1
  246. package/src/sap/ui/util/Mobile.js +18 -19
  247. package/src/sap/ui/util/Storage.js +1 -1
@@ -60,7 +60,6 @@ sap.ui.define([
60
60
  ) {
61
61
  "use strict";
62
62
 
63
-
64
63
  // shortcut for sap.ui.core.CSSSize
65
64
  var CSSSize = library.CSSSize;
66
65
 
@@ -69,6 +68,36 @@ sap.ui.define([
69
68
 
70
69
  var oStaticUIArea;
71
70
 
71
+ var vGlobalWithinArea;
72
+
73
+ var oResizeObserver;
74
+ var sResizeHandlerIdAttribute = "sapUiPopupResize";
75
+
76
+ if (window.ResizeObserver) {
77
+ oResizeObserver = new window.ResizeObserver(function(aEntries){
78
+ adaptSizeAndPosition(jQuery("#sap-ui-blocklayer-popup"), aEntries[0].target);
79
+ });
80
+ } else {
81
+ oResizeObserver = {
82
+ observe: function(oElement) {
83
+ var sHandlerId = oElement.dataset[sResizeHandlerIdAttribute];
84
+ if (!sHandlerId) {
85
+ sHandlerId = ResizeHandler.register(oElement, function(oEvent) {
86
+ adaptSizeAndPosition(jQuery("#sap-ui-blocklayer-popup"), oEvent.target);
87
+ });
88
+ oElement.dataset[sResizeHandlerIdAttribute] = sHandlerId;
89
+ }
90
+ },
91
+ unobserve: function(oElement) {
92
+ var sHandlerId = oElement.dataset[sResizeHandlerIdAttribute];
93
+ if (sHandlerId) {
94
+ ResizeHandler.deregister(sHandlerId);
95
+ delete oElement.dataset[sResizeHandlerIdAttribute];
96
+ }
97
+ }
98
+ };
99
+ }
100
+
72
101
  function getStaticUIArea() {
73
102
  if (oStaticUIArea) {
74
103
  return oStaticUIArea;
@@ -94,6 +123,65 @@ sap.ui.define([
94
123
  return oStaticUIArea;
95
124
  }
96
125
 
126
+ /**
127
+ * Convert the different types of 'within' values to a DOM element or the window object.
128
+ *
129
+ * @param {string | sap.ui.core.Element | Element | Window} [vWithin] the given within
130
+ * @returns {Element | Window} the DOM element or Window object that represents the given within
131
+ * @private
132
+ */
133
+ function convertWithin(vWithin) {
134
+ var oWithin;
135
+
136
+ if (typeof vWithin === "string") {
137
+ oWithin = document.querySelector(vWithin);
138
+ } else if (vWithin instanceof Element) {
139
+ oWithin = vWithin.getDomRef();
140
+ } else {
141
+ oWithin = vWithin;
142
+ }
143
+
144
+ return oWithin || window;
145
+ }
146
+
147
+ /**
148
+ * Remove the size and position CSS properties from the blocklayer DOM element
149
+ *
150
+ * @param {jQuery} $BlockRef the block layer jQuery object
151
+ * @private
152
+ */
153
+ function clearSizeAndPosition($BlockRef) {
154
+ var aProperties = ["left", "top", "width", "height", "position"];
155
+
156
+ if ($BlockRef[0]) {
157
+ aProperties.forEach(function(sProperty) {
158
+ $BlockRef[0].style.removeProperty(sProperty);
159
+ });
160
+ }
161
+ }
162
+
163
+ /**
164
+ * Change the size and position of the blocklayer to the same values as for the given 'within'.
165
+ *
166
+ * @param {jQuery} $BlockRef the jQuery object that contains the blocklayer DOM element
167
+ * @param {Element} oWithin the DOM element of the given within
168
+ * @private
169
+ */
170
+ function adaptSizeAndPosition($BlockRef, oWithin) {
171
+ var oClientRect = oWithin.getBoundingClientRect();
172
+
173
+ $BlockRef.css({
174
+ width: oClientRect.width,
175
+ height: oClientRect.height,
176
+ display: "block",
177
+ position: "absolute"
178
+ }).position({
179
+ my: "left top",
180
+ at: "left top",
181
+ of: oWithin
182
+ });
183
+ }
184
+
97
185
  /**
98
186
  * Creates an instance of <code>sap.ui.core.Popup</code> that can be used to open controls as a Popup,
99
187
  * visually appearing in front of other controls.
@@ -697,8 +785,8 @@ sap.ui.define([
697
785
  * @param {sap.ui.core.Popup.Dock} [at=sap.ui.core.Popup.Dock.CenterCenter] the "of" element's reference point for docking to
698
786
  * @param {string | sap.ui.core.Element | Element | jQuery | jQuery.Event} [of=document] specifies the reference element to which the given content should dock to
699
787
  * @param {string} [offset='0 0'] the offset relative to the docking point, specified as a string with space-separated pixel values (e.g. "10 0" to move the popup 10 pixels to the right). If the docking of both "my" and "at" are both RTL-sensitive ("begin" or "end"), this offset is automatically mirrored in the RTL case as well.
700
- * @param {string} [collision='flip'] defines how the position of an element should be adjusted in case it overflows the window in some direction.
701
- * @param {boolean} [followOf=false] defines whether the popup should follow the dock reference when the reference changes its position.
788
+ * @param {string} [collision='flip'] defines how the position of an element should be adjusted in case it overflows the window or the within area that is set via {@link sap.ui.core.Popup.setWithinArea} in some direction.
789
+ * @param {boolean | function} [followOf=false] defines whether the popup should follow the dock reference when the reference changes its position.
702
790
  * @public
703
791
  */
704
792
  Popup.prototype.open = function(iDuration, my, at, of, offset, collision, followOf) {
@@ -709,6 +797,33 @@ sap.ui.define([
709
797
  return;
710
798
  }
711
799
 
800
+ // iDuration is optional... if not given:
801
+ if (typeof (iDuration) == "string") {
802
+ followOf = collision;
803
+ collision = offset;
804
+ offset = of;
805
+ of = at;
806
+ at = my;
807
+ my = iDuration;
808
+ iDuration = -1;
809
+ }
810
+
811
+ // if no arguments are passed iDuration has to be set to -1
812
+ if (iDuration === undefined) {
813
+ iDuration = -1;
814
+ }
815
+
816
+ // all other parameters must be given if any subsequent parameter is given, hence no more shifting
817
+ // now every parameter should be in the right variable
818
+
819
+ assert(iDuration === -1 || (typeof iDuration === "number" && iDuration % 1 == 0), "iDuration must be an integer (or omitted)"); // omitted results in -1
820
+ assert(my === undefined || typeof my === "string", "my must be a string or empty");
821
+ assert(at === undefined || typeof at === "string", "at must be a string or empty");
822
+ assert(!of || typeof of === "object" || typeof of === "function", "of must be empty or an object");
823
+ assert(!offset || typeof offset === "string", "offset must be empty or a string");
824
+ assert(!collision || typeof collision === "string", "collision must be empty or a string");
825
+ assert(!followOf || typeof followOf === "boolean" || typeof followOf === "function", "followOf must be either empty, or a boolean, or a function");
826
+
712
827
  this.eOpenState = OpenState.OPENING;
713
828
 
714
829
  var oStaticUIArea = getStaticUIArea(),
@@ -741,33 +856,6 @@ sap.ui.define([
741
856
  }
742
857
  }
743
858
 
744
-
745
- // iDuration is optional... if not given:
746
- if (typeof (iDuration) == "string") {
747
- followOf = collision;
748
- collision = offset;
749
- offset = of;
750
- of = at;
751
- at = my;
752
- my = iDuration;
753
- iDuration = -1;
754
- }
755
-
756
- // if no arguments are passed iDuration has to be set to -1
757
- if (iDuration === undefined) {
758
- iDuration = -1;
759
- }
760
-
761
- // all other parameters must be given if any subsequent parameter is given, hence no more shifting
762
- // now every parameter should be in the right variable
763
-
764
- assert(iDuration === -1 || (typeof iDuration === "number" && iDuration % 1 == 0), "iDuration must be an integer (or omitted)"); // omitted results in -1
765
- assert(my === undefined || typeof my === "string", "my must be a string or empty");
766
- assert(at === undefined || typeof at === "string", "at must be a string or empty");
767
- assert(!of || typeof of === "object" || typeof of === "function", "of must be empty or an object");
768
- assert(!offset || typeof offset === "string", "offset must be empty or a string");
769
- assert(!collision || typeof collision === "string", "collision must be empty or a string");
770
-
771
859
  // save current focused element to restore the focus after closing
772
860
  this._oPreviousFocus = Popup.getCurrentFocusInfo();
773
861
 
@@ -811,6 +899,9 @@ sap.ui.define([
811
899
  this._oPosition = _oPosition;
812
900
  } else {
813
901
  _oPosition = this._oPosition;
902
+ if (vGlobalWithinArea) {
903
+ this._oPosition.within = vGlobalWithinArea;
904
+ }
814
905
  }
815
906
  if (!_oPosition.of) {
816
907
  _oPosition.of = this._oPosition.of || document;
@@ -1564,7 +1655,7 @@ sap.ui.define([
1564
1655
  * @param {sap.ui.core.Popup.Dock | {left: sap.ui.core.CSSSize, top: sap.ui.core.CSSSize}} at specifies the point of the reference element to which the given Content should be aligned
1565
1656
  * @param {string | sap.ui.core.Element | Element | jQuery | jQuery.Event} [of=document] specifies the reference element to which the given content should be aligned as specified in the other parameters
1566
1657
  * @param {string} [offset='0 0'] the offset relative to the docking point, specified as a string with space-separated pixel values (e.g. "0 10" to move the popup 10 pixels to the right). If the docking of both "my" and "at" are both RTL-sensitive ("begin" or "end"), this offset is automatically mirrored in the RTL case as well.
1567
- * @param {string} [collision] defines how the position of an element should be adjusted in case it overflows the window in some direction. The valid values that refer to jQuery-UI's position parameters are "flip", "fit" and "none".
1658
+ * @param {string} [collision] defines how the position of an element should be adjusted in case it overflows the window or the within area that is set via {@link sap.ui.core.Popup.setWithinArea} in some direction. The valid values that refer to jQuery-UI's position parameters are "flip", "fit" and "none".
1568
1659
  * @return {sap.ui.core.Popup} <code>this</code> to allow method chaining
1569
1660
  * @public
1570
1661
  */
@@ -1585,8 +1676,8 @@ sap.ui.define([
1585
1676
  return this;
1586
1677
  };
1587
1678
 
1588
- Popup.prototype._createPosition = function(my, at, of, offset, collision) {
1589
1679
 
1680
+ Popup.prototype._createPosition = function(my, at, of, offset, collision) {
1590
1681
  // check if new jQuery-UI (>1.9) offset is used
1591
1682
  var bNewOffset = false;
1592
1683
  if (my && (my.indexOf("+") >= 0 || my.indexOf("-") >= 0)) {
@@ -1597,14 +1688,18 @@ sap.ui.define([
1597
1688
  offset = null;
1598
1689
  }
1599
1690
 
1600
- var oPosition = extend({},this._oDefaultPosition, {
1601
- "my": my || this._oDefaultPosition.my, // to use default my if empty string
1602
- "at": at || this._oDefaultPosition.at, // to use default at if empty string
1603
- "of": of,
1604
- "offset": offset,
1605
- "collision": collision
1691
+ var oPosition = extend({}, this._oDefaultPosition, {
1692
+ my: my || this._oDefaultPosition.my, // to use default my if empty string
1693
+ at: at || this._oDefaultPosition.at, // to use default at if empty string
1694
+ of: of,
1695
+ offset: offset,
1696
+ collision: collision
1606
1697
  });
1607
1698
 
1699
+ if (vGlobalWithinArea) {
1700
+ oPosition.within = vGlobalWithinArea;
1701
+ }
1702
+
1608
1703
  if ( !jQuery.ui.version) {
1609
1704
  // only jquery-ui-position.js loaded, not jquery-ui-core.js, so no version info available
1610
1705
  if ( Popup._bNewOffset == null ) {
@@ -1912,12 +2007,18 @@ sap.ui.define([
1912
2007
  * @private
1913
2008
  */
1914
2009
  Popup.prototype._resolveReference = function(oPosition) {
1915
- var oResult = oPosition;
1916
- if ( oPosition.of instanceof Element ) {
1917
- oResult = Object.assign({}, oPosition, { of : oPosition.of.getDomRef()});
1918
- }
1919
2010
 
1920
- return oResult;
2011
+ var oExtension,
2012
+ aProperties = ["of", "within"];
2013
+
2014
+ aProperties.forEach(function(sProperty) {
2015
+ if ( oPosition[sProperty] instanceof Element ) {
2016
+ oExtension = oExtension || {};
2017
+ oExtension[sProperty] = oPosition[sProperty].getDomRef();
2018
+ }
2019
+ });
2020
+
2021
+ return oExtension ? Object.assign({}, oPosition, oExtension) : oPosition;
1921
2022
  };
1922
2023
 
1923
2024
  /**
@@ -2666,12 +2767,34 @@ sap.ui.define([
2666
2767
  }
2667
2768
  };
2668
2769
 
2770
+
2771
+ function connectBlockLayerAndWithin($BlockRef, oWithinDOMRef) {
2772
+ if (oWithinDOMRef === window) {
2773
+ clearSizeAndPosition($BlockRef);
2774
+ document.documentElement.classList.add("sapUiBLyBack");
2775
+ } else {
2776
+ adaptSizeAndPosition($BlockRef, oWithinDOMRef);
2777
+ oWithinDOMRef.classList.add("sapUiBLyBack");
2778
+ oResizeObserver.observe(oWithinDOMRef);
2779
+ }
2780
+ }
2781
+
2782
+ function disconnectBlockLayerAndWithin(oWithinDOMRef) {
2783
+ if (oWithinDOMRef === window) {
2784
+ document.documentElement.classList.remove("sapUiBLyBack");
2785
+ } else {
2786
+ oWithinDOMRef.classList.remove("sapUiBLyBack");
2787
+ oResizeObserver.unobserve(oWithinDOMRef);
2788
+ }
2789
+ }
2790
+
2669
2791
  /**
2670
2792
  * @private
2671
2793
  */
2672
2794
  Popup.prototype._showBlockLayer = function() {
2673
2795
  var $BlockRef = jQuery("#sap-ui-blocklayer-popup"),
2674
- sClassName = "sapUiBLy" + (this._sModalCSSClass ? " " + this._sModalCSSClass : "");
2796
+ sClassName = "sapUiBLy" + (this._sModalCSSClass ? " " + this._sModalCSSClass : ""),
2797
+ oWithinDOMRef;
2675
2798
 
2676
2799
  if ($BlockRef.length === 0) {
2677
2800
  $BlockRef = jQuery('<div id="sap-ui-blocklayer-popup" tabindex="0" class="' + sClassName + '"></div>');
@@ -2680,6 +2803,16 @@ sap.ui.define([
2680
2803
  $BlockRef.removeClass().addClass(sClassName);
2681
2804
  }
2682
2805
 
2806
+ // unregister the resize handler for the within area of the currently top most popup
2807
+ var oLastPopupInfo = Popup.blStack[Popup.blStack.length - 1];
2808
+ if (oLastPopupInfo) {
2809
+ oWithinDOMRef = convertWithin(oLastPopupInfo.popup._oLastPosition.within);
2810
+ disconnectBlockLayerAndWithin(oWithinDOMRef);
2811
+ }
2812
+
2813
+ oWithinDOMRef = convertWithin(this._oLastPosition.within);
2814
+ connectBlockLayerAndWithin($BlockRef, oWithinDOMRef);
2815
+
2683
2816
  // push current z-index to stack
2684
2817
  Popup.blStack.push({
2685
2818
  zIndex: this._iZIndex - 2,
@@ -2687,13 +2820,10 @@ sap.ui.define([
2687
2820
  });
2688
2821
 
2689
2822
  $BlockRef.css({
2690
- "z-index" : this._iZIndex - 2,
2691
- "visibility" : "visible"
2823
+ "z-index": this._iZIndex - 2,
2824
+ "visibility": "visible"
2692
2825
  }).show();
2693
2826
 
2694
- // prevent HTML page from scrolling
2695
- jQuery("html").addClass("sapUiBLyBack");
2696
-
2697
2827
  if (Popup.blStack.length === 1) {
2698
2828
  _fireBlockLayerStateChange({
2699
2829
  visible: true,
@@ -2704,35 +2834,38 @@ sap.ui.define([
2704
2834
 
2705
2835
  Popup.prototype._hideBlockLayer = function() {
2706
2836
  // a dialog was closed so pop his z-index from the stack
2707
- var $oBlockLayer = jQuery("#sap-ui-blocklayer-popup"),
2837
+ var $BlockRef = jQuery("#sap-ui-blocklayer-popup"),
2838
+ oBlockLayerDomRef = $BlockRef[0],
2708
2839
  that = this,
2709
- oLastPopupInfo;
2840
+ oLastPopupInfo, oWithinDOMRef;
2710
2841
 
2711
- if ($oBlockLayer.length) {
2842
+ oWithinDOMRef = convertWithin(this._oLastPosition.within);
2843
+ disconnectBlockLayerAndWithin(oWithinDOMRef);
2844
+
2845
+ if ($BlockRef.length) {
2712
2846
  // if there are more z-indices this means there are more dialogs stacked
2713
2847
  // up. So redisplay the block layer (with new z-index) under the new
2714
2848
  // current dialog which should be displayed.
2715
- var oBlockLayerDomRef = $oBlockLayer.get(0);
2716
2849
 
2717
2850
  if (Popup.blStack.length > 1) {
2718
2851
  Popup.blStack = Popup.blStack.filter(function(oPopupInfo) {
2719
2852
  return oPopupInfo.popup !== that;
2720
2853
  });
2854
+ oLastPopupInfo = Popup.blStack[Popup.blStack.length - 1];
2721
2855
  // set the block layer z-index to the last z-index in the stack and show it
2722
- oBlockLayerDomRef.style.zIndex = Popup.blStack[Popup.blStack.length - 1].zIndex;
2856
+ oBlockLayerDomRef.style.zIndex = oLastPopupInfo.zIndex;
2857
+
2723
2858
  oBlockLayerDomRef.style.visibility = "visible";
2724
2859
  oBlockLayerDomRef.style.display = "block";
2860
+
2861
+ oWithinDOMRef = convertWithin(oLastPopupInfo.popup._oLastPosition.within);
2862
+ connectBlockLayerAndWithin($BlockRef, oWithinDOMRef);
2725
2863
  } else {
2726
2864
  oLastPopupInfo = Popup.blStack.pop();
2727
2865
  // the last dialog was closed so we can hide the block layer now
2728
2866
  oBlockLayerDomRef.style.visibility = "hidden";
2729
2867
  oBlockLayerDomRef.style.display = "none";
2730
2868
 
2731
- window.setTimeout(function() {
2732
- // Allow scrolling again in HTML page only if there is no BlockLayer left
2733
- jQuery("html").removeClass("sapUiBLyBack");
2734
- }, 0);
2735
-
2736
2869
  _fireBlockLayerStateChange({
2737
2870
  visible: false,
2738
2871
  zIndex: oLastPopupInfo.zIndex
@@ -3451,5 +3584,53 @@ sap.ui.define([
3451
3584
  });
3452
3585
  };
3453
3586
 
3587
+ /**
3588
+ * Sets a within area that is used as the area available for positioning the popup. It mainly affects the collision
3589
+ * detection. The position of the popup can then be further adapted depending on the "collision" parameter that is
3590
+ * set with {@link sap.ui.core.Popup#open} or {@link sap.ui.core.Popup#setPosition} when the popup overflows the
3591
+ * within area.
3592
+ *
3593
+ * If no within area is specified, all popups use the <code>window</code> as within area.
3594
+ *
3595
+ * When an {@link sap.ui.core.Element} is set as the within area, make sure that the control is rendered when the popup
3596
+ * opens, otherwise the <code>window</code> is used as the within area.
3597
+ *
3598
+ * @param {string|Element|sap.ui.core.Element|Window} vValue The within area
3599
+ * @public
3600
+ * @since 1.84.26
3601
+ */
3602
+ Popup.setWithinArea = function (vValue) {
3603
+ vGlobalWithinArea = vValue;
3604
+ };
3605
+
3606
+ /**
3607
+ * Returns the value that has been set by {@link sap.ui.core.Popup.setWithinArea}. When a DOM element that represents the
3608
+ * within area is needed, use {@link sap.ui.core.Popup.getWithinAreaDomRef} instead.
3609
+ *
3610
+ * If no within area is specified, <code>undefined</code> is returned.
3611
+ *
3612
+ * @returns {string|Element|sap.ui.core.Element|Window} The specified within area
3613
+ * @public
3614
+ * @since 1.84.26
3615
+ */
3616
+ Popup.getWithinArea = function () {
3617
+ return vGlobalWithinArea;
3618
+ };
3619
+
3620
+ /**
3621
+ * Returns the actual DOM element of the value that has been set by {@link sap.ui.core.Popup.setWithinArea}. It
3622
+ * returns <code>window</code> by default when no within area has been set using {@link sap.ui.core.Popup.setWithinArea}.
3623
+ *
3624
+ * When an {@link sap.ui.core.Element} is set as a within area, <code>document.documentElement</code> is returned before element is
3625
+ * rendered.
3626
+ *
3627
+ * @returns {Element | Window} The DOM Element or the window object
3628
+ * @public
3629
+ * @since 1.84.26
3630
+ */
3631
+ Popup.getWithinAreaDomRef = function () {
3632
+ return convertWithin(vGlobalWithinArea);
3633
+ };
3634
+
3454
3635
  return Popup;
3455
3636
  });
@@ -180,7 +180,7 @@ sap.ui.define([
180
180
  *
181
181
  * @extends Object
182
182
  * @author SAP SE
183
- * @version 1.84.23
183
+ * @version 1.84.26
184
184
  * @alias sap.ui.core.RenderManager
185
185
  * @public
186
186
  */
@@ -17,7 +17,7 @@ sap.ui.define([
17
17
  * @classdesc Base Class for a Renderer.
18
18
  *
19
19
  * @author SAP SE
20
- * @version 1.84.23
20
+ * @version 1.84.26
21
21
  * @namespace
22
22
  * @public
23
23
  * @alias sap.ui.core.Renderer
@@ -34,7 +34,7 @@ sap.ui.define([
34
34
  * @alias sap.ui.core.ResizeHandler
35
35
  * @extends sap.ui.base.Object
36
36
  * @author SAP SE
37
- * @version 1.84.23
37
+ * @version 1.84.26
38
38
  * @public
39
39
  */
40
40
 
@@ -44,7 +44,7 @@ sap.ui.define([
44
44
  * The ScrollBar control can be used for virtual scrolling of a certain area.
45
45
  * This means: to simulate a very large scrollable area when technically the area is small and the control takes care of displaying the respective part only. E.g. a Table control can take care of only rendering the currently visible rows and use this ScrollBar control to make the user think he actually scrolls through a long list.
46
46
  * @extends sap.ui.core.Control
47
- * @version 1.84.23
47
+ * @version 1.84.26
48
48
  *
49
49
  * @public
50
50
  * @deprecated as of version 1.56
@@ -23,7 +23,7 @@ sap.ui.define(['./Item', './library'],
23
23
  * @extends sap.ui.core.Item
24
24
  *
25
25
  * @author SAP SE
26
- * @version 1.84.23
26
+ * @version 1.84.26
27
27
  *
28
28
  * @public
29
29
  * @alias sap.ui.core.SeparatorItem
@@ -25,7 +25,7 @@ sap.ui.define(['./Element', './library'],
25
25
  * @extends sap.ui.core.Element
26
26
  *
27
27
  * @author SAP SE
28
- * @version 1.84.23
28
+ * @version 1.84.26
29
29
  *
30
30
  * @public
31
31
  * @since 1.16.0
@@ -31,7 +31,7 @@ sap.ui.define([
31
31
  * @class
32
32
  * Abstract class that can be extended in order to implement any extended tooltip. For example, RichTooltip Control is based on it. It provides the opening/closing behavior and the main "text" property.
33
33
  * @extends sap.ui.core.Control
34
- * @version 1.84.23
34
+ * @version 1.84.26
35
35
  *
36
36
  * @public
37
37
  * @alias sap.ui.core.TooltipBase
@@ -175,7 +175,7 @@ sap.ui.define([
175
175
  *
176
176
  * @extends sap.ui.base.ManagedObject
177
177
  * @author SAP SE
178
- * @version 1.84.23
178
+ * @version 1.84.26
179
179
  * @param {sap.ui.core.Core} oCore internal API of the <core>Core</code> that manages this UIArea
180
180
  * @param {object} [oRootNode] reference to the DOM element that should be 'hosting' the UI Area.
181
181
  * @public
@@ -57,7 +57,7 @@ sap.ui.define([
57
57
  * @extends sap.ui.core.Component
58
58
  * @abstract
59
59
  * @author SAP SE
60
- * @version 1.84.23
60
+ * @version 1.84.26
61
61
  * @alias sap.ui.core.UIComponent
62
62
  * @since 1.9.2
63
63
  * @ui5-metamodel This control/element also will be described in the UI5 (legacy) designtime metamodel
@@ -22,7 +22,7 @@ sap.ui.define(['./ComponentMetadata', './library'],
22
22
  * @experimental Since 1.15.1. The Component concept is still under construction, so some implementation details can be changed in future.
23
23
  * @class
24
24
  * @author SAP SE
25
- * @version 1.84.23
25
+ * @version 1.84.26
26
26
  * @since 1.15.1
27
27
  * @alias sap.ui.core.UIComponentMetadata
28
28
  * @extends sap.ui.core.ComponentMetadata
@@ -16,7 +16,7 @@ sap.ui.define(['./Element', './library', "sap/base/assert"],
16
16
  * Helper functionality for value state support.
17
17
  *
18
18
  * @author SAP SE
19
- * @version 1.84.23
19
+ * @version 1.84.26
20
20
  * @public
21
21
  * @namespace sap.ui.core.ValueStateSupport
22
22
  */
@@ -20,7 +20,7 @@ sap.ui.define(['./LayoutData', './library'],
20
20
  * @class
21
21
  * Allows to add multiple LayoutData to one control in case that an easy switch of layouts (e.g. in a Form) is needed.
22
22
  * @extends sap.ui.core.LayoutData
23
- * @version 1.84.23
23
+ * @version 1.84.26
24
24
  *
25
25
  * @public
26
26
  * @since 1.9.2
@@ -149,7 +149,7 @@ sap.ui.define([
149
149
  * @extends sap.ui.core.Control
150
150
  *
151
151
  * @author SAP SE
152
- * @version 1.84.23
152
+ * @version 1.84.26
153
153
  * @since 1.56.0
154
154
  * @alias sap.ui.core.XMLComposite
155
155
  * @see {@link topic:b83a4dcb7d0e46969027345b8d32fd44 XML Composite Controls}
@@ -30,7 +30,7 @@ sap.ui.define([
30
30
  * @param {object} oClassInfo static info to construct the metadata from
31
31
  *
32
32
  * @author SAP SE
33
- * @version 1.84.23
33
+ * @version 1.84.26
34
34
  * @since 1.50.0
35
35
  * @alias sap.ui.core.XMLCompositeMetadata
36
36
  * @extends sap.ui.core.ElementMetadata
@@ -82,7 +82,7 @@ sap.ui.define([
82
82
  * @param {Element[]} aItemDomRefs Array of DOM references representing the items for the navigation
83
83
  * @param {boolean} [bNotInTabChain=false] Whether the selected element should be in the tab chain or not
84
84
  *
85
- * @version 1.84.23
85
+ * @version 1.84.26
86
86
  * @alias sap.ui.core.delegate.ItemNavigation
87
87
  * @public
88
88
  */
@@ -56,7 +56,7 @@ sap.ui.define([
56
56
  *
57
57
  * @protected
58
58
  * @alias sap.ui.core.delegate.ScrollEnablement
59
- * @version 1.84.23
59
+ * @version 1.84.26
60
60
  * @author SAP SE
61
61
  */
62
62
  var ScrollEnablement = BaseObject.extend("sap.ui.core.delegate.ScrollEnablement", /** @lends sap.ui.core.delegate.ScrollEnablement.prototype */ {
@@ -37,7 +37,7 @@ sap.ui.define(['../Element', '../library', 'sap/base/Log', './DragAndDrop'],
37
37
  *
38
38
  * @extends sap.ui.core.Element
39
39
  * @author SAP SE
40
- * @version 1.84.23
40
+ * @version 1.84.26
41
41
  *
42
42
  * @public
43
43
  * @since 1.52
@@ -22,7 +22,7 @@ sap.ui.define(["./DragInfo", "./DropInfo", "sap/ui/Device", "sap/base/Log"],
22
22
  * @extends sap.ui.core.dnd.DropInfo
23
23
  *
24
24
  * @author SAP SE
25
- * @version 1.84.23
25
+ * @version 1.84.26
26
26
  *
27
27
  * @public
28
28
  * @since 1.52
@@ -22,7 +22,7 @@ sap.ui.define(["./DragDropBase"],
22
22
  * @extends sap.ui.core.dnd.DragDropBase
23
23
  *
24
24
  * @author SAP SE
25
- * @version 1.84.23
25
+ * @version 1.84.26
26
26
  *
27
27
  * @public
28
28
  * @since 1.56
@@ -21,7 +21,7 @@ sap.ui.define(["./DragDropBase"],
21
21
  * @extends sap.ui.core.dnd.DragDropBase
22
22
  *
23
23
  * @author SAP SE
24
- * @version 1.84.23
24
+ * @version 1.84.26
25
25
  *
26
26
  * @public
27
27
  * @since 1.56
@@ -469,7 +469,7 @@ sap.ui.define([
469
469
  * @see {@link topic:6322164936f047de941ec522b95d7b70 Hyphenation for Text Controls}
470
470
  * @extends sap.ui.base.ManagedObject
471
471
  * @author SAP SE
472
- * @version 1.84.23
472
+ * @version 1.84.26
473
473
  * @hideconstructor
474
474
  * @public
475
475
  * @since 1.60
@@ -14,7 +14,7 @@ sap.ui.define(['sap/ui/base/DataType', './CalendarType', './Core'],
14
14
  // delegate further initialization of this library to the Core
15
15
  sap.ui.getCore().initLibrary({
16
16
  name : "sap.ui.core",
17
- version: "1.84.23",
17
+ version: "1.84.26",
18
18
  designtime: "sap/ui/core/designtime/library.designtime",
19
19
  types: [
20
20
 
@@ -151,7 +151,7 @@ sap.ui.define(['sap/ui/base/DataType', './CalendarType', './Core'],
151
151
  * @namespace
152
152
  * @alias sap.ui.core
153
153
  * @author SAP SE
154
- * @version 1.84.23
154
+ * @version 1.84.26
155
155
  * @public
156
156
  */
157
157
  var thisLib = sap.ui.core;
@@ -1499,7 +1499,7 @@ sap.ui.define(['sap/ui/base/DataType', './CalendarType', './Core'],
1499
1499
  /**
1500
1500
  * Sort order of a column.
1501
1501
  *
1502
- * @version 1.84.23
1502
+ * @version 1.84.26
1503
1503
  * @enum {string}
1504
1504
  * @public
1505
1505
  * @since 1.61.0