@openui5/sap.ui.core 1.105.1 → 1.107.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/.reuse/dep5 +20 -17
  2. package/THIRDPARTY.txt +31 -21
  3. package/package.json +1 -1
  4. package/src/jquery.sap.dom.js +10 -10
  5. package/src/jquery.sap.global.js +24 -216
  6. package/src/jquery.sap.history.js +1 -1
  7. package/src/jquery.sap.properties.js +2 -2
  8. package/src/jquery.sap.resources.js +1 -1
  9. package/src/jquery.sap.script.js +1 -1
  10. package/src/jquery.sap.storage.js +4 -4
  11. package/src/jquery.sap.ui.js +5 -7
  12. package/src/sap/base/i18n/ResourceBundle.js +7 -11
  13. package/src/sap/base/util/LoaderExtensions.js +6 -6
  14. package/src/sap/base/util/ObjectPath.js +1 -1
  15. package/src/sap/base/util/Properties.js +1 -1
  16. package/src/sap/base/util/fetch.js +8 -10
  17. package/src/sap/base/util/mixedFetch.js +1 -1
  18. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  19. package/src/sap/base/util/restricted/_castArray.js +1 -1
  20. package/src/sap/base/util/restricted/_compact.js +1 -1
  21. package/src/sap/base/util/restricted/_curry.js +1 -1
  22. package/src/sap/base/util/restricted/_debounce.js +1 -1
  23. package/src/sap/base/util/restricted/_difference.js +1 -1
  24. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  25. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  26. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  27. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  28. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  29. package/src/sap/base/util/restricted/_flatten.js +1 -1
  30. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  31. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  32. package/src/sap/base/util/restricted/_intersection.js +1 -1
  33. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  34. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  35. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  36. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  37. package/src/sap/base/util/restricted/_isNil.js +1 -1
  38. package/src/sap/base/util/restricted/_max.js +1 -1
  39. package/src/sap/base/util/restricted/_merge.js +1 -1
  40. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  41. package/src/sap/base/util/restricted/_min.js +1 -1
  42. package/src/sap/base/util/restricted/_omit.js +1 -1
  43. package/src/sap/base/util/restricted/_pick.js +1 -1
  44. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  45. package/src/sap/base/util/restricted/_throttle.js +1 -1
  46. package/src/sap/base/util/restricted/_toArray.js +1 -1
  47. package/src/sap/base/util/restricted/_union.js +1 -1
  48. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  49. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  50. package/src/sap/base/util/restricted/_uniq.js +1 -1
  51. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  52. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  53. package/src/sap/base/util/restricted/_without.js +1 -1
  54. package/src/sap/base/util/restricted/_xor.js +1 -1
  55. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  56. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  57. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  58. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  59. package/src/sap/base/util/syncFetch.js +9 -16
  60. package/src/sap/ui/Device.js +3 -3
  61. package/src/sap/ui/Global.js +7 -14
  62. package/src/sap/ui/VersionInfo.js +57 -54
  63. package/src/sap/ui/base/BindingInfo.js +198 -0
  64. package/src/sap/ui/base/DataType.js +5 -5
  65. package/src/sap/ui/base/Event.js +2 -2
  66. package/src/sap/ui/base/EventProvider.js +2 -2
  67. package/src/sap/ui/base/Interface.js +1 -1
  68. package/src/sap/ui/base/ManagedObject.js +209 -979
  69. package/src/sap/ui/base/ManagedObjectMetadata.js +6 -6
  70. package/src/sap/ui/base/ManagedObjectRegistry.js +4 -3
  71. package/src/sap/ui/base/Metadata.js +1 -1
  72. package/src/sap/ui/base/Object.js +1 -1
  73. package/src/sap/ui/base/ObjectPool.js +1 -1
  74. package/src/sap/ui/core/.library +13 -9
  75. package/src/sap/ui/core/AppCacheBuster.js +3 -4
  76. package/src/sap/ui/core/BusyIndicator.js +1 -1
  77. package/src/sap/ui/core/BusyIndicatorUtils.js +5 -6
  78. package/src/sap/ui/core/CalendarType.js +0 -1
  79. package/src/sap/ui/core/Component.js +16 -14
  80. package/src/sap/ui/core/ComponentContainer.js +6 -5
  81. package/src/sap/ui/core/ComponentMetadata.js +5 -12
  82. package/src/sap/ui/core/ComponentSupport.js +1 -1
  83. package/src/sap/ui/core/Configuration.js +525 -336
  84. package/src/sap/ui/core/Control.js +7 -7
  85. package/src/sap/ui/core/Core.js +102 -422
  86. package/src/sap/ui/core/CustomData.js +1 -1
  87. package/src/sap/ui/core/DeclarativeSupport.js +1 -1
  88. package/src/sap/ui/core/Element.js +65 -9
  89. package/src/sap/ui/core/ElementMetadata.js +1 -1
  90. package/src/sap/ui/core/EnabledPropagator.js +1 -1
  91. package/src/sap/ui/core/EventBus.js +1 -1
  92. package/src/sap/ui/core/FocusHandler.js +79 -9
  93. package/src/sap/ui/core/Fragment.js +1 -1
  94. package/src/sap/ui/core/HTML.js +1 -2
  95. package/src/sap/ui/core/History.js +1 -1
  96. package/src/sap/ui/core/Icon.js +1 -2
  97. package/src/sap/ui/core/IconPool.js +8 -8
  98. package/src/sap/ui/core/IndicationColorSupport.js +2 -2
  99. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  100. package/src/sap/ui/core/InvisibleMessage.js +1 -2
  101. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  102. package/src/sap/ui/core/InvisibleText.js +5 -5
  103. package/src/sap/ui/core/Item.js +1 -2
  104. package/src/sap/ui/core/LabelEnablement.js +1 -1
  105. package/src/sap/ui/core/LayoutData.js +1 -2
  106. package/src/sap/ui/core/ListItem.js +1 -2
  107. package/src/sap/ui/core/LocalBusyIndicator.js +1 -2
  108. package/src/sap/ui/core/Locale.js +1 -1
  109. package/src/sap/ui/core/LocaleData.js +15 -13
  110. package/src/sap/ui/core/Manifest.js +8 -6
  111. package/src/sap/ui/core/Message.js +4 -6
  112. package/src/sap/ui/core/Popup.js +63 -6
  113. package/src/sap/ui/core/RenderManager.js +13 -5
  114. package/src/sap/ui/core/Renderer.js +5 -4
  115. package/src/sap/ui/core/Rendering.js +251 -0
  116. package/src/sap/ui/core/ResizeHandler.js +7 -7
  117. package/src/sap/ui/core/ScrollBar.js +6 -9
  118. package/src/sap/ui/core/ScrollBarRenderer.js +3 -3
  119. package/src/sap/ui/core/SeparatorItem.js +1 -2
  120. package/src/sap/ui/core/Title.js +1 -2
  121. package/src/sap/ui/core/TooltipBase.js +12 -14
  122. package/src/sap/ui/core/UIArea.js +396 -129
  123. package/src/sap/ui/core/UIComponent.js +3 -4
  124. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  125. package/src/sap/ui/core/ValueStateSupport.js +2 -2
  126. package/src/sap/ui/core/VariantLayoutData.js +1 -2
  127. package/src/sap/ui/core/XMLComposite.js +2 -2
  128. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  129. package/src/sap/ui/core/XMLTemplateProcessor.js +12 -10
  130. package/src/sap/ui/core/_ConfigurationProvider.js +187 -0
  131. package/src/sap/ui/core/cache/CacheManager.js +9 -8
  132. package/src/sap/ui/core/cache/LRUPersistentCache.js +4 -4
  133. package/src/sap/ui/core/cldr/es_BO.json +3 -3
  134. package/src/sap/ui/core/cldr/es_CL.json +3 -3
  135. package/src/sap/ui/core/cldr/es_MX.json +3 -3
  136. package/src/sap/ui/core/cldr/es_PE.json +3 -3
  137. package/src/sap/ui/core/cldr/es_UY.json +3 -3
  138. package/src/sap/ui/core/cldr/es_VE.json +2 -2
  139. package/src/sap/ui/core/date/Islamic.js +4 -4
  140. package/src/sap/ui/core/date/UniversalDate.js +8 -8
  141. package/src/sap/ui/core/date/UniversalDateUtils.js +3 -3
  142. package/src/sap/ui/core/delegate/ItemNavigation.js +5 -5
  143. package/src/sap/ui/core/delegate/ScrollEnablement.js +7 -6
  144. package/src/sap/ui/core/dnd/DragAndDrop.js +14 -9
  145. package/src/sap/ui/core/dnd/DragDropBase.js +1 -2
  146. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -2
  147. package/src/sap/ui/core/dnd/DragInfo.js +1 -2
  148. package/src/sap/ui/core/dnd/DropInfo.js +1 -2
  149. package/src/sap/ui/core/format/DateFormat.js +14 -7
  150. package/src/sap/ui/core/format/DateFormatTimezoneDisplay.js +0 -1
  151. package/src/sap/ui/core/format/FileSizeFormat.js +4 -3
  152. package/src/sap/ui/core/format/ListFormat.js +4 -3
  153. package/src/sap/ui/core/format/NumberFormat.js +7 -6
  154. package/src/sap/ui/core/format/TimezoneUtil.js +1 -1
  155. package/src/sap/ui/core/hyphenation/Hyphenation.js +7 -6
  156. package/src/sap/ui/core/library.js +3 -55
  157. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  158. package/src/sap/ui/core/message/Message.js +1 -1
  159. package/src/sap/ui/core/message/MessageManager.js +13 -23
  160. package/src/sap/ui/core/message/MessageParser.js +1 -1
  161. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  162. package/src/sap/ui/core/messagebundle_fr.properties +1 -1
  163. package/src/sap/ui/core/mvc/Controller.js +8 -3
  164. package/src/sap/ui/core/mvc/EventHandlerResolver.js +5 -3
  165. package/src/sap/ui/core/mvc/HTMLView.js +1 -2
  166. package/src/sap/ui/core/mvc/JSONView.js +1 -2
  167. package/src/sap/ui/core/mvc/JSView.js +2 -3
  168. package/src/sap/ui/core/mvc/TemplateView.js +1 -2
  169. package/src/sap/ui/core/mvc/View.js +21 -20
  170. package/src/sap/ui/core/mvc/ViewType.js +0 -1
  171. package/src/sap/ui/core/mvc/XMLView.js +18 -18
  172. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  173. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  174. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  175. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  176. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  177. package/src/sap/ui/core/routing/Router.js +1 -1
  178. package/src/sap/ui/core/routing/async/Target.js +4 -3
  179. package/src/sap/ui/core/rules/App.support.js +11 -13
  180. package/src/sap/ui/core/rules/Config.support.js +19 -17
  181. package/src/sap/ui/core/rules/CoreHelper.support.js +4 -4
  182. package/src/sap/ui/core/rules/Model.support.js +8 -8
  183. package/src/sap/ui/core/rules/Rendering.support.js +1 -1
  184. package/src/sap/ui/core/rules/Theming.support.js +8 -8
  185. package/src/sap/ui/core/rules/View.support.js +9 -9
  186. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -2
  187. package/src/sap/ui/core/search/SearchProvider.js +1 -3
  188. package/src/sap/ui/core/service/Service.js +1 -1
  189. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  190. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  191. package/src/sap/ui/core/support/Hotkeys.js +2 -3
  192. package/src/sap/ui/core/support/Plugin.js +1 -1
  193. package/src/sap/ui/core/support/Support.js +1 -1
  194. package/src/sap/ui/core/support/ToolsAPI.js +11 -13
  195. package/src/sap/ui/core/support/plugins/ControlTree.js +4 -4
  196. package/src/sap/ui/core/support/plugins/Debugging.js +3 -3
  197. package/src/sap/ui/core/support/plugins/Interaction.js +1 -1
  198. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  199. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  200. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  201. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  202. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  203. package/src/sap/ui/core/support/plugins/ViewInfo.js +2 -2
  204. package/src/sap/ui/core/support/support.html +1 -1
  205. package/src/sap/ui/core/support/techinfo/TechnicalInfo.js +10 -8
  206. package/src/sap/ui/core/theming/Parameters.js +8 -15
  207. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -2
  208. package/src/sap/ui/core/tmpl/DOMElement.js +1 -4
  209. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  210. package/src/sap/ui/core/tmpl/Template.js +6 -5
  211. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -2
  212. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  213. package/src/sap/ui/core/util/Export.js +1 -1
  214. package/src/sap/ui/core/util/ExportCell.js +1 -1
  215. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  216. package/src/sap/ui/core/util/ExportRow.js +1 -1
  217. package/src/sap/ui/core/util/ExportType.js +1 -1
  218. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  219. package/src/sap/ui/core/util/File.js +1 -1
  220. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  221. package/src/sap/ui/core/util/MockServer.js +48 -72
  222. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  223. package/src/sap/ui/core/util/ResponsivePaddingsEnablement.js +4 -3
  224. package/src/sap/ui/core/util/XMLPreprocessor.js +2 -2
  225. package/src/sap/ui/core/util/reflection/BaseTreeModifier.js +1 -1
  226. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  227. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  228. package/src/sap/ui/core/util/serializer/ViewSerializer.js +4 -4
  229. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  230. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  231. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  232. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  233. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  234. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  235. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  236. package/src/sap/ui/debug/ControlTree.js +3 -3
  237. package/src/sap/ui/debug/DebugEnv.js +4 -4
  238. package/src/sap/ui/debug/PropertyList.css +1 -31
  239. package/src/sap/ui/debug/PropertyList.js +6 -250
  240. package/src/sap/ui/dom/getScrollbarSize.js +1 -1
  241. package/src/sap/ui/dom/jquery/control.js +1 -0
  242. package/src/sap/ui/events/jquery/EventSimulation.js +4 -4
  243. package/src/sap/ui/model/ClientModel.js +1 -1
  244. package/src/sap/ui/model/ClientTreeBinding.js +3 -1
  245. package/src/sap/ui/model/CompositeDataState.js +1 -1
  246. package/src/sap/ui/model/CompositeType.js +1 -1
  247. package/src/sap/ui/model/Context.js +3 -0
  248. package/src/sap/ui/model/ContextBinding.js +1 -1
  249. package/src/sap/ui/model/DataState.js +2 -2
  250. package/src/sap/ui/model/ListBinding.js +2 -2
  251. package/src/sap/ui/model/ManagedObjectBindingSupport.js +871 -0
  252. package/src/sap/ui/model/MetaModel.js +1 -1
  253. package/src/sap/ui/model/Model.js +16 -5
  254. package/src/sap/ui/model/SelectionModel.js +1 -1
  255. package/src/sap/ui/model/SimpleType.js +2 -2
  256. package/src/sap/ui/model/Sorter.js +24 -19
  257. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  258. package/src/sap/ui/model/TreeBindingAdapter.js +3 -7
  259. package/src/sap/ui/model/Type.js +1 -1
  260. package/src/sap/ui/model/analytics/AnalyticalBinding.js +2 -0
  261. package/src/sap/ui/model/analytics/AnalyticalTreeBindingAdapter.js +5 -7
  262. package/src/sap/ui/model/json/JSONModel.js +9 -7
  263. package/src/sap/ui/model/message/MessageModel.js +1 -1
  264. package/src/sap/ui/model/odata/AnnotationHelper.js +4 -4
  265. package/src/sap/ui/model/odata/ODataAnnotations.js +5 -3
  266. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  267. package/src/sap/ui/model/odata/ODataMetaModel.js +10 -10
  268. package/src/sap/ui/model/odata/ODataMetadata.js +5 -4
  269. package/src/sap/ui/model/odata/ODataModel.js +6 -5
  270. package/src/sap/ui/model/odata/ODataTreeBindingFlat.js +0 -1
  271. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  272. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  273. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  274. package/src/sap/ui/model/odata/type/Date.js +1 -1
  275. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  276. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  277. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  278. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +1 -1
  279. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  280. package/src/sap/ui/model/odata/type/Double.js +1 -1
  281. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  282. package/src/sap/ui/model/odata/type/Int.js +1 -1
  283. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  284. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  285. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  286. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  287. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  288. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  289. package/src/sap/ui/model/odata/type/Single.js +1 -1
  290. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  291. package/src/sap/ui/model/odata/type/String.js +1 -1
  292. package/src/sap/ui/model/odata/type/Time.js +1 -1
  293. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  294. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  295. package/src/sap/ui/model/odata/v2/Context.js +5 -5
  296. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +4 -3
  297. package/src/sap/ui/model/odata/v2/ODataContextBinding.js +25 -16
  298. package/src/sap/ui/model/odata/v2/ODataListBinding.js +46 -28
  299. package/src/sap/ui/model/odata/v2/ODataModel.js +97 -39
  300. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +5 -5
  301. package/src/sap/ui/model/odata/v4/AnnotationHelper.js +3 -3
  302. package/src/sap/ui/model/odata/v4/Context.js +109 -71
  303. package/src/sap/ui/model/odata/v4/ODataBinding.js +50 -7
  304. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +88 -68
  305. package/src/sap/ui/model/odata/v4/ODataListBinding.js +116 -81
  306. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +23 -20
  307. package/src/sap/ui/model/odata/v4/ODataModel.js +350 -88
  308. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +35 -9
  309. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +15 -9
  310. package/src/sap/ui/model/odata/v4/ODataUtils.js +8 -5
  311. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +45 -33
  312. package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +40 -6
  313. package/src/sap/ui/model/odata/v4/lib/_Cache.js +135 -81
  314. package/src/sap/ui/model/odata/v4/lib/_ConcatHelper.js +2 -3
  315. package/src/sap/ui/model/odata/v4/lib/_Helper.js +179 -36
  316. package/src/sap/ui/model/odata/v4/lib/_MinMaxHelper.js +2 -3
  317. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +26 -7
  318. package/src/sap/ui/model/resource/ResourceModel.js +8 -7
  319. package/src/sap/ui/model/type/Boolean.js +1 -1
  320. package/src/sap/ui/model/type/Currency.js +2 -2
  321. package/src/sap/ui/model/type/Date.js +1 -1
  322. package/src/sap/ui/model/type/DateInterval.js +1 -1
  323. package/src/sap/ui/model/type/DateTime.js +1 -1
  324. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  325. package/src/sap/ui/model/type/FileSize.js +1 -1
  326. package/src/sap/ui/model/type/Float.js +1 -1
  327. package/src/sap/ui/model/type/Integer.js +1 -1
  328. package/src/sap/ui/model/type/String.js +2 -2
  329. package/src/sap/ui/model/type/Time.js +1 -1
  330. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  331. package/src/sap/ui/model/type/Unit.js +5 -4
  332. package/src/sap/ui/model/xml/XMLModel.js +8 -6
  333. package/src/sap/ui/performance/trace/Interaction.js +1 -1
  334. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  335. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  336. package/src/sap/ui/test/Opa.js +7 -5
  337. package/src/sap/ui/test/Opa5.js +9 -15
  338. package/src/sap/ui/test/OpaBuilder.js +1 -1
  339. package/src/sap/ui/test/RecorderHotkeyListener.js +1 -1
  340. package/src/sap/ui/test/TestUtils.js +83 -1
  341. package/src/sap/ui/test/autowaiter/_autoWaiter.js +9 -0
  342. package/src/sap/ui/test/autowaiter/_cssAnimationWaiter.js +114 -0
  343. package/src/sap/ui/test/autowaiter/_cssTransitionWaiter.js +99 -0
  344. package/src/sap/ui/test/autowaiter/_jsAnimationWaiter.js +70 -0
  345. package/src/sap/ui/test/autowaiter/_resourceWaiter.js +3 -12
  346. package/src/sap/ui/test/autowaiter/_utils.js +13 -1
  347. package/src/sap/ui/test/generic/TestBase.js +1 -1
  348. package/src/sap/ui/test/matchers/Ancestor.js +1 -0
  349. package/src/sap/ui/test/matchers/Descendant.js +1 -0
  350. package/src/sap/ui/test/matchers/Sibling.js +1 -0
  351. package/src/sap/ui/util/Storage.js +1 -1
@@ -15,7 +15,6 @@ sap.ui.define([
15
15
  "./lib/_Helper",
16
16
  "./lib/_Parser",
17
17
  "sap/base/Log",
18
- "sap/base/util/uid",
19
18
  "sap/ui/base/SyncPromise",
20
19
  "sap/ui/model/Binding",
21
20
  "sap/ui/model/ChangeReason",
@@ -27,7 +26,7 @@ sap.ui.define([
27
26
  "sap/ui/model/Sorter",
28
27
  "sap/ui/model/odata/OperationMode"
29
28
  ], function (Context, asODataParentBinding, _AggregationCache, _AggregationHelper, _Cache,
30
- _GroupLock, _Helper, _Parser, Log, uid, SyncPromise, Binding, ChangeReason, Filter,
29
+ _GroupLock, _Helper, _Parser, Log, SyncPromise, Binding, ChangeReason, Filter,
31
30
  FilterOperator, FilterProcessor, FilterType, ListBinding, Sorter, OperationMode) {
32
31
  "use strict";
33
32
 
@@ -58,7 +57,7 @@ sap.ui.define([
58
57
  * @mixes sap.ui.model.odata.v4.ODataParentBinding
59
58
  * @public
60
59
  * @since 1.37.0
61
- * @version 1.105.1
60
+ * @version 1.107.0
62
61
  * @borrows sap.ui.model.odata.v4.ODataBinding#getGroupId as #getGroupId
63
62
  * @borrows sap.ui.model.odata.v4.ODataBinding#getRootBinding as #getRootBinding
64
63
  * @borrows sap.ui.model.odata.v4.ODataBinding#getUpdateGroupId as #getUpdateGroupId
@@ -174,12 +173,13 @@ sap.ui.define([
174
173
  *
175
174
  * @param {function} fnFunction The function to call when the event occurs
176
175
  * @param {object} [oListener] Object on which to call the given function
176
+ * @returns {this} <code>this</code> to allow method chaining
177
177
  *
178
178
  * @public
179
179
  * @since 1.98.0
180
180
  */
181
181
  ODataListBinding.prototype.attachCreateActivate = function (fnFunction, oListener) {
182
- this.attachEvent("createActivate", fnFunction, oListener);
182
+ return this.attachEvent("createActivate", fnFunction, oListener);
183
183
  };
184
184
 
185
185
  /**
@@ -187,12 +187,13 @@ sap.ui.define([
187
187
  *
188
188
  * @param {function} fnFunction The function to call when the event occurs
189
189
  * @param {object} [oListener] Object on which to call the given function
190
+ * @returns {this} <code>this</code> to allow method chaining
190
191
  *
191
192
  * @public
192
193
  * @since 1.98.0
193
194
  */
194
195
  ODataListBinding.prototype.detachCreateActivate = function (fnFunction, oListener) {
195
- this.detachEvent("createActivate", fnFunction, oListener);
196
+ return this.detachEvent("createActivate", fnFunction, oListener);
196
197
  };
197
198
 
198
199
  /**
@@ -200,12 +201,13 @@ sap.ui.define([
200
201
  *
201
202
  * @param {function} fnFunction The function to call when the event occurs
202
203
  * @param {object} [oListener] Object on which to call the given function
204
+ * @returns {this} <code>this</code> to allow method chaining
203
205
  *
204
206
  * @public
205
207
  * @since 1.66.0
206
208
  */
207
209
  ODataListBinding.prototype.attachCreateCompleted = function (fnFunction, oListener) {
208
- this.attachEvent("createCompleted", fnFunction, oListener);
210
+ return this.attachEvent("createCompleted", fnFunction, oListener);
209
211
  };
210
212
 
211
213
  /**
@@ -214,12 +216,13 @@ sap.ui.define([
214
216
  *
215
217
  * @param {function} fnFunction The function to call when the event occurs
216
218
  * @param {object} [oListener] Object on which to call the given function
219
+ * @returns {this} <code>this</code> to allow method chaining
217
220
  *
218
221
  * @public
219
222
  * @since 1.66.0
220
223
  */
221
224
  ODataListBinding.prototype.detachCreateCompleted = function (fnFunction, oListener) {
222
- this.detachEvent("createCompleted", fnFunction, oListener);
225
+ return this.detachEvent("createCompleted", fnFunction, oListener);
223
226
  };
224
227
 
225
228
  /**
@@ -227,12 +230,13 @@ sap.ui.define([
227
230
  *
228
231
  * @param {function} fnFunction The function to call when the event occurs
229
232
  * @param {object} [oListener] Object on which to call the given function
233
+ * @returns {this} <code>this</code> to allow method chaining
230
234
  *
231
235
  * @public
232
236
  * @since 1.66.0
233
237
  */
234
238
  ODataListBinding.prototype.attachCreateSent = function (fnFunction, oListener) {
235
- this.attachEvent("createSent", fnFunction, oListener);
239
+ return this.attachEvent("createSent", fnFunction, oListener);
236
240
  };
237
241
 
238
242
  /**
@@ -241,12 +245,13 @@ sap.ui.define([
241
245
  *
242
246
  * @param {function} fnFunction The function to call when the event occurs
243
247
  * @param {object} [oListener] Object on which to call the given function
248
+ * @returns {this} <code>this</code> to allow method chaining
244
249
  *
245
250
  * @public
246
251
  * @since 1.66.0
247
252
  */
248
253
  ODataListBinding.prototype.detachCreateSent = function (fnFunction, oListener) {
249
- this.detachEvent("createSent", fnFunction, oListener);
254
+ return this.detachEvent("createSent", fnFunction, oListener);
250
255
  };
251
256
 
252
257
  /**
@@ -278,7 +283,11 @@ sap.ui.define([
278
283
  */
279
284
  ODataListBinding.prototype._delete = function (oGroupLock, sEditUrl, oContext, oETagEntity,
280
285
  bDoNotRequestCount) {
281
- var sPath = oContext.iIndex === undefined
286
+ // When deleting a context with negative index, iCreatedContexts et al. must be adjusted.
287
+ // However, when re-inserting, the context has lost its index. Beware: Do NOT use the
288
+ // created() promise, because doReplaceWith places a context w/o the promise here.
289
+ var bCreated = oContext.iIndex < 0,
290
+ sPath = oContext.iIndex === undefined
282
291
  // context is not in aContexts -> use the predicate
283
292
  ? _Helper.getRelativePath(oContext.getPath(), this.oHeaderContext.getPath())
284
293
  : String(oContext.iIndex),
@@ -295,8 +304,6 @@ sap.ui.define([
295
304
 
296
305
  return this.deleteFromCache(oGroupLock, sEditUrl, sPath, oETagEntity, bDoNotRequestCount,
297
306
  function (iIndex, iOffset) {
298
- var iContextIndex = oContext.iIndex;
299
-
300
307
  if (iIndex !== undefined) {
301
308
  // An entity can only be deleted when its key predicate is known. So we can be
302
309
  // sure to have key predicates and the contexts a related to entities and not
@@ -313,12 +320,9 @@ sap.ui.define([
313
320
  that._fireChange({reason : ChangeReason.Remove});
314
321
  });
315
322
  }
316
- if (iContextIndex < 0 || oContext.created()) {
323
+ if (bCreated) {
317
324
  that.iCreatedContexts += iOffset;
318
325
  that.iActiveContexts += iOffset;
319
- if (!that.iCreatedContexts) { //@see #destroyCreated
320
- that.bFirstCreateAtEnd = undefined;
321
- }
322
326
  } else {
323
327
  // iMaxLength is the number of server rows w/o the created entities
324
328
  that.iMaxLength += iOffset; // this doesn't change Infinity
@@ -335,6 +339,10 @@ sap.ui.define([
335
339
  var iOldMaxLength = that.iMaxLength;
336
340
 
337
341
  that.iDeletedContexts -= 1;
342
+ if (!that.iDeletedContexts && !that.iCreatedContexts) {
343
+ // all (created) contexts finally gone -> free to create at any end
344
+ that.bFirstCreateAtEnd = undefined;
345
+ }
338
346
  oContext.resetKeepAlive();
339
347
  if (bReadCount) {
340
348
  that.iMaxLength = that.fetchValue("$count", undefined, true).getResult()
@@ -558,7 +566,12 @@ sap.ui.define([
558
566
  * If a back-end request fails, the 'dataReceived' event provides an <code>Error</code> in the
559
567
  * 'error' event parameter.
560
568
  *
569
+ * Since 1.106 this event is bubbled up to the model, unless a listener calls
570
+ * {@link sap.ui.base.Event#cancelBubble oEvent.cancelBubble()}.
571
+ *
561
572
  * @param {sap.ui.base.Event} oEvent
573
+ * @param {function} oEvent.cancelBubble
574
+ * A callback function to prevent that the event is bubbled up to the model
562
575
  * @param {object} oEvent.getParameters()
563
576
  * @param {object} [oEvent.getParameters().data]
564
577
  * An empty data object if a back-end request succeeds
@@ -567,6 +580,7 @@ sap.ui.define([
567
580
  *
568
581
  * @event sap.ui.model.odata.v4.ODataListBinding#dataReceived
569
582
  * @public
583
+ * @see sap.ui.model.odata.v4.ODataModel#event:dataReceived
570
584
  * @since 1.37.0
571
585
  */
572
586
 
@@ -576,10 +590,16 @@ sap.ui.define([
576
590
  * for example to switch on a busy indicator. Registered event handlers are called without
577
591
  * parameters.
578
592
  *
593
+ * Since 1.106 this event is bubbled up to the model, unless a listener calls
594
+ * {@link sap.ui.base.Event#cancelBubble oEvent.cancelBubble()}.
595
+ *
579
596
  * @param {sap.ui.base.Event} oEvent
597
+ * @param {function} oEvent.cancelBubble
598
+ * A callback function to prevent that the event is bubbled up to the model
580
599
  *
581
600
  * @event sap.ui.model.odata.v4.ODataListBinding#dataRequested
582
601
  * @public
602
+ * @see sap.ui.model.odata.v4.ODataModel#event:dataRequested
583
603
  * @since 1.37.0
584
604
  */
585
605
 
@@ -829,7 +849,7 @@ sap.ui.define([
829
849
  sGroupId = this.getUpdateGroupId(),
830
850
  oGroupLock,
831
851
  sResolvedPath = this.getResolvedPath(),
832
- sTransientPredicate = "($uid=" + uid() + ")",
852
+ sTransientPredicate = "($uid=" + _Helper.uid() + ")",
833
853
  sTransientPath = sResolvedPath + sTransientPredicate,
834
854
  i,
835
855
  that = this;
@@ -868,7 +888,7 @@ sap.ui.define([
868
888
  return;
869
889
  }
870
890
 
871
- that.destroyCreated(oContext);
891
+ that.removeCreated(oContext);
872
892
  return Promise.resolve().then(function () {
873
893
  // Fire the change asynchronously so that Cache#delete is finished and #getContexts
874
894
  // can read the data synchronously. This is important for extended change detection.
@@ -1075,35 +1095,6 @@ sap.ui.define([
1075
1095
  ListBinding.prototype.destroy.call(this);
1076
1096
  };
1077
1097
 
1078
- /**
1079
- * Removes the given context for a created entity from the list of contexts and destroys it
1080
- * later so that the control has time to handle the context's dependent bindings before.
1081
- *
1082
- * @param {sap.ui.model.odata.v4.Context} oContext
1083
- * The context instance for the created entity to be destroyed
1084
- *
1085
- * @private
1086
- */
1087
- ODataListBinding.prototype.destroyCreated = function (oContext) {
1088
- var iIndex = oContext.getModelIndex(),
1089
- i;
1090
-
1091
- this.iCreatedContexts -= 1;
1092
- if (!oContext.isInactive()) {
1093
- this.iActiveContexts -= 1;
1094
- }
1095
- for (i = 0; i < iIndex; i += 1) {
1096
- this.aContexts[i].iIndex += 1;
1097
- }
1098
- if (!this.iCreatedContexts) {
1099
- this.bFirstCreateAtEnd = undefined;
1100
- }
1101
- this.aContexts.splice(iIndex, 1);
1102
- this.destroyLater(oContext);
1103
- // The path of all contexts in aContexts after the removed one is untouched, still points to
1104
- // the same data, hence no checkUpdate is needed.
1105
- };
1106
-
1107
1098
  /**
1108
1099
  * Destroys the given context later so that the control has time to handle the context's
1109
1100
  * dependent bindings before.
@@ -1190,7 +1181,7 @@ sap.ui.define([
1190
1181
  oCache = this.getCacheAndMoveKeepAliveContexts(sResourcePath, mQueryOptions)
1191
1182
  || _AggregationCache.create(this.oModel.oRequestor, sResourcePath, sDeepResourcePath,
1192
1183
  this.mParameters.$$aggregation, mQueryOptions, this.oModel.bAutoExpandSelect,
1193
- this.bSharedRequest);
1184
+ this.bSharedRequest, this.isGrouped());
1194
1185
  if (this.bSharedRequest) {
1195
1186
  oCache.registerChangeListener("", this);
1196
1187
  }
@@ -1250,11 +1241,11 @@ sap.ui.define([
1250
1241
  oResult = Context.create(this.oModel, this, sPath, oOldContext.iIndex);
1251
1242
  bNew = true;
1252
1243
  }
1253
- oOldContext.iIndex = undefined;
1254
- if (iModelIndex === undefined) {
1244
+ if (iModelIndex === undefined) { // => oOldContext.iIndex === undefined
1255
1245
  this.mPreviousContextsByPath[sPath] = oResult;
1256
1246
  this.oCache.addKeptElement(oElement);
1257
1247
  } else {
1248
+ oOldContext.iIndex = undefined;
1258
1249
  this.aContexts[iModelIndex] = oResult;
1259
1250
  this.oCache.doReplaceWith(iModelIndex, oElement);
1260
1251
  }
@@ -1268,7 +1259,7 @@ sap.ui.define([
1268
1259
  }
1269
1260
  oResult.setKeepAlive(true, fnOnBeforeDestroyClone);
1270
1261
  }
1271
- } else {
1262
+ } else { // Note: w/o a key predicate, oOldContext cannot be kept alive
1272
1263
  this.destroyLater(oOldContext);
1273
1264
  }
1274
1265
  this._fireChange({reason : ChangeReason.Change});
@@ -1770,7 +1761,7 @@ sap.ui.define([
1770
1761
  * If there are pending changes that cannot be ignored or if an unsupported operation mode is
1771
1762
  * used (see {@link sap.ui.model.odata.v4.ODataModel#bindList}). Since 1.97.0, pending changes
1772
1763
  * are ignored if they relate to a
1773
- * {@link sap.ui.model.odata.v4.Context#setKeepAlive kept-alive} context of this binding.
1764
+ * {@link sap.ui.model.odata.v4.Context#isKeepAlive kept-alive} context of this binding.
1774
1765
  * Since 1.98.0, {@link sap.ui.model.odata.v4.Context#isTransient transient} contexts
1775
1766
  * of a {@link #getRootBinding root binding} do not count as pending changes. Pending
1776
1767
  * {@link sap.ui.model.odata.v4.Context#delete deletions} lead to an error.
@@ -1843,8 +1834,9 @@ sap.ui.define([
1843
1834
  * {@link #getCurrentContexts}, this method does not request any data from a back end and does
1844
1835
  * not change the binding's state. In contrast to {@link #getCurrentContexts}, it does not only
1845
1836
  * return those contexts that were last requested by a control, but all contexts that are
1846
- * currently available in the binding, including kept-alive contexts. To filter out kept-alive
1847
- * contexts that are not part of the list, you could check whether the index is
1837
+ * currently available in the binding, including
1838
+ * {@link sap.ui.model.odata.v4.Context#isKeepAlive kept-alive} contexts. To filter out
1839
+ * kept-alive contexts that are not part of the list, you could check whether the index is
1848
1840
  * <code>undefined</code>, as described in {@link sap.ui.model.odata.v4.Context#getIndex}.
1849
1841
  *
1850
1842
  * @returns {sap.ui.model.odata.v4.Context[]}
@@ -1971,6 +1963,7 @@ sap.ui.define([
1971
1963
  bDataRequested = false,
1972
1964
  bFireChange = false,
1973
1965
  oGroupLock,
1966
+ bPreventBubbling,
1974
1967
  oPromise,
1975
1968
  bRefreshEvent = !!this.sChangeReason, // ignored for "*VirtualContext"
1976
1969
  sResolvedPath = this.getResolvedPath(),
@@ -2062,14 +2055,15 @@ sap.ui.define([
2062
2055
  oGroupLock = this.oReadGroupLock;
2063
2056
  this.oReadGroupLock = undefined;
2064
2057
  if (!this.oDiff) { // w/o E.C.D there won't be a diff
2058
+ // before fetchContexts needing it and resolveRefreshPromise destroying it
2059
+ bPreventBubbling = this.isRefreshWithoutBubbling();
2065
2060
  // make sure "refresh" is followed by async "change"
2066
2061
  oPromise = this.fetchContexts(iStart, iLength, iMaximumPrefetchSize, oGroupLock,
2067
2062
  /*bAsync*/bRefreshEvent, function () {
2068
2063
  bDataRequested = true;
2069
- that.fireDataRequested();
2064
+ that.fireDataRequested(bPreventBubbling);
2070
2065
  });
2071
- this.resolveRefreshPromise(oPromise);
2072
- oPromise.then(function (bChanged) {
2066
+ this.resolveRefreshPromise(oPromise).then(function (bChanged) {
2073
2067
  if (that.bUseExtendedChangeDetection) {
2074
2068
  that.oDiff = {
2075
2069
  aDiff : that.getDiff(iLength),
@@ -2084,12 +2078,13 @@ sap.ui.define([
2084
2078
  }
2085
2079
  }
2086
2080
  if (bDataRequested) {
2087
- that.fireDataReceived({data : {}});
2081
+ that.fireDataReceived({data : {}}, bPreventBubbling);
2088
2082
  }
2089
2083
  }, function (oError) {
2090
2084
  // cache shares promises for concurrent read
2091
2085
  if (bDataRequested) {
2092
- that.fireDataReceived(oError.canceled ? {data : {}} : {error : oError});
2086
+ that.fireDataReceived(oError.canceled ? {data : {}} : {error : oError},
2087
+ bPreventBubbling);
2093
2088
  }
2094
2089
  throw oError;
2095
2090
  }).catch(function (oError) {
@@ -2385,7 +2380,7 @@ sap.ui.define([
2385
2380
  /**
2386
2381
  * Returns the header context which allows binding to <code>$count</code>.
2387
2382
  *
2388
- * @returns {sap.ui.model.odata.v4.Context}
2383
+ * @returns {sap.ui.model.odata.v4.Context|null}
2389
2384
  * The header context or <code>null</code> if the binding is relative and has no context
2390
2385
  *
2391
2386
  * @public
@@ -2451,11 +2446,11 @@ sap.ui.define([
2451
2446
  || this.aContexts.find(function (oCandidate) {
2452
2447
  return oCandidate && oCandidate.getPath() === sPath;
2453
2448
  }),
2454
- iPredicateIndex = this.oModel.getPredicateIndex(sPath),
2449
+ iPredicateIndex = _Helper.getPredicateIndex(sPath),
2455
2450
  sResolvedPath = this.getResolvedPath();
2456
2451
 
2457
2452
  this.checkSuspended();
2458
- this.oModel.checkGroupId(sGroupId);
2453
+ _Helper.checkGroupId(sGroupId);
2459
2454
  if (!oContext) {
2460
2455
  if (!sResolvedPath) {
2461
2456
  throw new Error("Binding is unresolved: " + this);
@@ -2799,7 +2794,9 @@ sap.ui.define([
2799
2794
  bKeepCacheOnError ? sGroupId : undefined);
2800
2795
  oKeptElementsPromise = that.refreshKeptElements(sGroupId);
2801
2796
  if (that.iCurrentEnd > 0) {
2802
- oPromise = that.createRefreshPromise().catch(function (oError) {
2797
+ oPromise = that.createRefreshPromise(
2798
+ /*bPreventBubbling*/bKeepCacheOnError
2799
+ ).catch(function (oError) {
2803
2800
  if (!bKeepCacheOnError || oError.canceled) {
2804
2801
  throw oError;
2805
2802
  }
@@ -2870,7 +2867,7 @@ sap.ui.define([
2870
2867
  that.mPreviousContextsByPath[that.getResolvedPath() + sPredicate]
2871
2868
  .resetKeepAlive();
2872
2869
  } else { // Note: implies oContext.created()
2873
- that.destroyCreated(that.aContexts[iIndex]);
2870
+ that.removeCreated(that.aContexts[iIndex]);
2874
2871
  }
2875
2872
  });
2876
2873
  }).catch(function (oError) {
@@ -2894,8 +2891,9 @@ sap.ui.define([
2894
2891
  * destroyed, see {@link sap.ui.model.Context#destroy}.
2895
2892
  * Supported since 1.55.0
2896
2893
  *
2897
- * A removed context is destroyed unless it is kept alive
2898
- * (see {@link sap.ui.model.odata.v4.Context#isKeepAlive}) and still exists on the server.
2894
+ * A removed context is destroyed unless it is
2895
+ * {@link sap.ui.model.odata.v4.Context#isKeepAlive kept alive} and still exists on the
2896
+ * server.
2899
2897
  * @returns {sap.ui.base.SyncPromise}
2900
2898
  * A promise which resolves without a defined value when the entity is updated in the cache,
2901
2899
  * or rejects if the refresh failed.
@@ -2947,7 +2945,7 @@ sap.ui.define([
2947
2945
  i;
2948
2946
 
2949
2947
  if (oContext.iIndex < 0) {
2950
- that.destroyCreated(oContext);
2948
+ that.removeCreated(oContext);
2951
2949
  bDestroyed = true;
2952
2950
  } else {
2953
2951
  if (iIndex === undefined) { // -> bStillAlive === false
@@ -3020,6 +3018,38 @@ sap.ui.define([
3020
3018
  });
3021
3019
  };
3022
3020
 
3021
+ /**
3022
+ * Removes the given context for a created entity from the list of contexts and - unless it is
3023
+ * kept alive - destroys it later so that the control has time to handle the context's dependent
3024
+ * bindings before.
3025
+ *
3026
+ * @param {sap.ui.model.odata.v4.Context} oContext
3027
+ * The context instance for the created entity to be destroyed
3028
+ *
3029
+ * @private
3030
+ */
3031
+ ODataListBinding.prototype.removeCreated = function (oContext) {
3032
+ var iIndex = oContext.getModelIndex(),
3033
+ i;
3034
+
3035
+ this.iCreatedContexts -= 1;
3036
+ if (!oContext.isInactive()) {
3037
+ this.iActiveContexts -= 1;
3038
+ }
3039
+ for (i = 0; i < iIndex; i += 1) {
3040
+ this.aContexts[i].iIndex += 1;
3041
+ }
3042
+ if (!this.iCreatedContexts) {
3043
+ this.bFirstCreateAtEnd = undefined;
3044
+ }
3045
+ this.aContexts.splice(iIndex, 1);
3046
+ if (!oContext.isKeepAlive()) {
3047
+ this.destroyLater(oContext);
3048
+ }
3049
+ // The path of all contexts in aContexts after the removed one is untouched, still points to
3050
+ // the same data, hence no checkUpdate is needed.
3051
+ };
3052
+
3023
3053
  /**
3024
3054
  * Requests the entities for the given index range of the binding's collection and resolves with
3025
3055
  * the corresponding contexts.
@@ -3052,7 +3082,7 @@ sap.ui.define([
3052
3082
  throw new Error("Unresolved binding: " + this.sPath);
3053
3083
  }
3054
3084
  this.checkSuspended();
3055
- this.oModel.checkGroupId(sGroupId);
3085
+ _Helper.checkGroupId(sGroupId);
3056
3086
 
3057
3087
  iStart = iStart || 0;
3058
3088
  iLength = iLength || this.oModel.iSizeLimit;
@@ -3111,7 +3141,7 @@ sap.ui.define([
3111
3141
  * A callback function to filter only relevant messages. The callback returns whether the
3112
3142
  * given {@link sap.ui.core.message.Message} is considered. If no callback function is given,
3113
3143
  * all messages are considered.
3114
- * @returns {Promise<sap.ui.model.Filter>}
3144
+ * @returns {Promise<sap.ui.model.Filter|null>}
3115
3145
  * A Promise that resolves with a {@link sap.ui.model.Filter} representing the entries with
3116
3146
  * messages; it resolves with <code>null</code> if the binding is not resolved or if there is
3117
3147
  * no message for any entry
@@ -3181,7 +3211,7 @@ sap.ui.define([
3181
3211
  * cancellations.
3182
3212
  *
3183
3213
  * @param {Promise} oPromise - A promise
3184
- * @return {Promise} A promise including an error handler
3214
+ * @returns {Promise} A promise including an error handler
3185
3215
  */
3186
3216
  function reportError(oPromise) {
3187
3217
  return oPromise.catch(function (oError) {
@@ -3428,7 +3458,7 @@ sap.ui.define([
3428
3458
  *
3429
3459
  * @param {object} [oAggregation]
3430
3460
  * An object holding the information needed for data aggregation; see also
3431
- * <a href="http://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/">OData
3461
+ * <a href="https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/">OData
3432
3462
  * Extension for Data Aggregation Version 4.0</a>. Since 1.76.0, <code>undefined</code> can be
3433
3463
  * used to remove the data aggregation object, which allows to set <code>$apply</code>
3434
3464
  * explicitly afterwards. <code>null</code> is not supported.<br>
@@ -3448,6 +3478,7 @@ sap.ui.define([
3448
3478
  * <li> <code>grandTotal</code>: An optional boolean that tells whether a grand total for
3449
3479
  * this aggregatable property is needed (since 1.59.0); filtering by any aggregatable
3450
3480
  * property is not supported in this case (since 1.89.0) as is "$search" (since 1.93.0)
3481
+ * or the <code>vGroup</code> parameter of {@link sap.ui.model.Sorter} (since 1.107.0)
3451
3482
  * <li> <code>subtotals</code>: An optional boolean that tells whether subtotals for this
3452
3483
  * aggregatable property are needed
3453
3484
  * <li> <code>with</code>: An optional string that provides the name of the method (for
@@ -3481,17 +3512,20 @@ sap.ui.define([
3481
3512
  * @param {string[]} [oAggregation.groupLevels]
3482
3513
  * A list of groupable property names used to determine group levels. They may, but don't need
3483
3514
  * to, be repeated in <code>oAggregation.group</code>. Group levels cannot be combined with
3484
- * filtering for aggregated properties or (since 1.93.0) with "$search".
3515
+ * filtering for aggregated properties or (since 1.93.0) with "$search" or (since 1.107.0) the
3516
+ * <code>vGroup</code> parameter of {@link sap.ui.model.Sorter}.
3485
3517
  * @param {string} [oAggregation.hierarchyQualifier]
3486
3518
  * The qualifier for the pair of "Org.OData.Aggregation.V1.RecursiveHierarchy" and
3487
3519
  * "com.sap.vocabularies.Hierarchy.v1.RecursiveHierarchy" annotations at this binding's
3488
3520
  * entity type (@experimental as of version 1.105.0). If present, a recursive hierarchy
3489
- * without data aggregation is defined, and the only other supported property is
3490
- * <code>expandTo</code>.
3521
+ * without data aggregation is defined, and the only other supported properties are
3522
+ * <code>expandTo</code> and <code>search</code>. A recursive hierarchy cannot be combined
3523
+ * with "$search" or (since 1.107.0) the <code>vGroup</code> parameter of
3524
+ * {@link sap.ui.model.Sorter}.
3491
3525
  * @param {string} [oAggregation.search]
3492
- * Like the <a
3493
- * href="https://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part2-url-conventions.html">
3494
- * "5.1.7 System Query Option $search"</a>, but applied before data aggregation
3526
+ * Like the <a href=
3527
+ * "https://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part2-url-conventions.html#_Search_System_Query"
3528
+ * >"5.1.7 System Query Option $search"</a>, but applied before data aggregation
3495
3529
  * (since 1.93.0). Note that certain content will break the syntax of the system query option
3496
3530
  * <code>$apply</code> and result in an invalid request. If the OData service supports the
3497
3531
  * proposal <a href="https://issues.oasis-open.org/browse/ODATA-1452">ODATA-1452</a>, then
@@ -3507,7 +3541,8 @@ sap.ui.define([
3507
3541
  * <ul>
3508
3542
  * <li> the given data aggregation object is unsupported,
3509
3543
  * <li> the <code>$apply</code> system query option has been specified explicitly before,
3510
- * <li> the binding has a kept-alive context,
3544
+ * <li> the binding has a {@link sap.ui.model.odata.v4.Context#isKeepAlive kept-alive}
3545
+ * context,
3511
3546
  * <li> there are pending changes,
3512
3547
  * <li> a recursive hierarchy is requested, but the model does not use the
3513
3548
  * <code>autoExpandSelect</code> parameter.
@@ -3648,7 +3683,7 @@ sap.ui.define([
3648
3683
  * <li> an unsupported operation mode is used (see
3649
3684
  * {@link sap.ui.model.odata.v4.ODataModel#bindList}). Since 1.97.0, pending changes are
3650
3685
  * ignored if they relate to a
3651
- * {@link sap.ui.model.odata.v4.Context#setKeepAlive kept-alive} context of this binding.
3686
+ * {@link sap.ui.model.odata.v4.Context#isKeepAlive kept-alive} context of this binding.
3652
3687
  * Since 1.98.0, {@link sap.ui.model.odata.v4.Context#isTransient transient} contexts of a
3653
3688
  * {@link #getRootBinding root binding} do not count as pending changes.
3654
3689
  * <li> contexts are {@link sap.ui.model.data.v4.Context#delete deleted} on the client, but
@@ -3709,8 +3744,8 @@ sap.ui.define([
3709
3744
  *
3710
3745
  * @param {object[]} aAggregation
3711
3746
  * An array with objects holding the information needed for data aggregation; see also
3712
- * <a href="http://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/">OData Extension
3713
- * for Data Aggregation Version 4.0</a>
3747
+ * <a href="https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/">OData
3748
+ * Extension for Data Aggregation Version 4.0</a>
3714
3749
  * @param {string} aAggregation[].name
3715
3750
  * The name of an OData property. A property which is neither a dimension nor a measure, but
3716
3751
  * for instance a text property or in some cases a unit property, has no further details.
@@ -157,7 +157,7 @@ sap.ui.define([
157
157
  * @hideconstructor
158
158
  * @public
159
159
  * @since 1.37.0
160
- * @version 1.105.1
160
+ * @version 1.107.0
161
161
  */
162
162
  ODataMetaModel = MetaModel.extend("sap.ui.model.odata.v4.ODataMetaModel", {
163
163
  constructor : constructor
@@ -696,13 +696,16 @@ sap.ui.define([
696
696
  * Whether <code>&lt;edmx:Reference></code> and <code>&lt;edmx:Include></code> directives are
697
697
  * supported in order to load schemas on demand from other $metadata documents and include
698
698
  * them into the current service ("cross-service references").
699
+ * @param {string} [sLanguage]
700
+ * The "sap-language" URL parameter
699
701
  */
700
- function constructor(oRequestor, sUrl, vAnnotationUri, oModel, bSupportReferences) {
702
+ function constructor(oRequestor, sUrl, vAnnotationUri, oModel, bSupportReferences, sLanguage) {
701
703
  MetaModel.call(this);
702
704
  this.aAnnotationUris = vAnnotationUri && !Array.isArray(vAnnotationUri)
703
705
  ? [vAnnotationUri] : vAnnotationUri;
704
706
  this.sDefaultBindingMode = BindingMode.OneTime;
705
707
  this.mETags = {};
708
+ this.sLanguage = sLanguage;
706
709
  this.oLastModified = new Date(0);
707
710
  this.oMetadataPromise = null;
708
711
  this.oModel = oModel;
@@ -2221,7 +2224,7 @@ sap.ui.define([
2221
2224
  /**
2222
2225
  * Returns a map of entity tags for each $metadata or annotation file loaded so far.
2223
2226
  *
2224
- * @returns {object}
2227
+ * @returns {Object<string,string|null>}
2225
2228
  * A map which contains one entry for each $metadata or annotation file loaded so far: the key
2226
2229
  * is the file's URL as a <code>string</code> and the value is the <code>string</code> value
2227
2230
  * of the "ETag" response header for that file. Initially, the map is empty. If no "ETag"
@@ -2305,7 +2308,7 @@ sap.ui.define([
2305
2308
  * Optional (binding) parameters; if they are given, <code>oContext</code> cannot be omitted
2306
2309
  * @param {object} [mParameters.scope]
2307
2310
  * Optional scope for lookup of aliases for computed annotations (since 1.43.0)
2308
- * @returns {any}
2311
+ * @returns {any|undefined}
2309
2312
  * The requested metadata object if it is already available, or <code>undefined</code>
2310
2313
  *
2311
2314
  * @function
@@ -2345,6 +2348,7 @@ sap.ui.define([
2345
2348
  autoExpandSelect : bAutoExpandSelect,
2346
2349
  groupId : sGroupId,
2347
2350
  httpHeaders : this.oModel.getHttpHeaders(),
2351
+ metadataUrlParams : this.sLanguage && {"sap-language" : this.sLanguage},
2348
2352
  operationMode : OperationMode.Server,
2349
2353
  serviceUrl : sUrl,
2350
2354
  sharedRequests : true,
@@ -2555,24 +2559,20 @@ sap.ui.define([
2555
2559
 
2556
2560
  return this.requestObject("/@com.sap.vocabularies.CodeList.v1." + sTerm)
2557
2561
  .then(function (oCodeList) {
2558
- var sCacheKey,
2559
- oCodeListMetaModel,
2560
- oCodeListModel,
2561
- oPromise,
2562
- sTypePath;
2562
+ var sCacheKey, oCodeListMetaModel, oCodeListModel, oPromise, sTypePath, sUrl;
2563
2563
 
2564
2564
  if (!oCodeList) {
2565
2565
  return null;
2566
2566
  }
2567
2567
 
2568
- sCacheKey = that.getAbsoluteServiceUrl(oCodeList.Url)
2569
- + "#" + oCodeList.CollectionPath;
2568
+ sUrl = _Helper.setLanguage(oCodeList.Url, that.sLanguage);
2569
+ sCacheKey = that.getAbsoluteServiceUrl(sUrl) + "#" + oCodeList.CollectionPath;
2570
2570
  oPromise = mCodeListUrl2Promise.get(sCacheKey);
2571
2571
  if (oPromise) {
2572
2572
  return oPromise;
2573
2573
  }
2574
2574
 
2575
- oCodeListModel = that.getOrCreateSharedModel(oCodeList.Url, "$direct");
2575
+ oCodeListModel = that.getOrCreateSharedModel(sUrl, "$direct");
2576
2576
  oCodeListMetaModel = oCodeListModel.getMetaModel();
2577
2577
  sTypePath = "/" + oCodeList.CollectionPath + "/";
2578
2578
  oPromise = oCodeListMetaModel.requestObject(sTypePath).then(function (oType) {
@@ -2697,7 +2697,7 @@ sap.ui.define([
2697
2697
  * If present, it must point to this meta model's root entity container, that is,
2698
2698
  * <code>oDetails.context.getModel() === this</code> and
2699
2699
  * <code>oDetails.context.getPath() === "/"</code>
2700
- * @returns {Promise}
2700
+ * @returns {Promise<Object<string,{StandardCode: string, Text: string, UnitSpecificScale: string}>|null>}
2701
2701
  * A promise resolving with the currency customizing which is a map from currency key to an
2702
2702
  * object with the following properties:
2703
2703
  * <ul>
@@ -2773,9 +2773,11 @@ sap.ui.define([
2773
2773
  * &lt;/template:with>
2774
2774
  * </pre>
2775
2775
  *
2776
- * The basic idea is that every path described in "14.2.1 Attribute Target" in specification
2777
- * "OData Version 4.0 Part 3: Common Schema Definition Language" is a valid absolute path
2778
- * within the metadata model if a leading slash is added; for example
2776
+ * The basic idea is that every path described in <a href=
2777
+ * "https://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part3-csdl.html#_Attribute_Target"
2778
+ * >"14.2.1 Attribute Target"</a> in specification "OData Version 4.0 Part 3: Common Schema
2779
+ * Definition Language" is a valid absolute path within the metadata model if a leading slash is
2780
+ * added; for example
2779
2781
  * "/" + "MySchema.MyEntityContainer/MyEntitySet/MyComplexProperty/MyNavigationProperty". Also,
2780
2782
  * every path described in "14.5.2 Expression edm:AnnotationPath",
2781
2783
  * "14.5.11 Expression edm:NavigationPropertyPath", "14.5.12 Expression edm:Path", and
@@ -2850,8 +2852,9 @@ sap.ui.define([
2850
2852
  * "14.5.14.2 Element edm:PropertyValue" are addressed by segments like
2851
2853
  * "&lt;7.2.1 Attribute Property>@...", "$OnDelete@...", "&lt;10.2.1 Attribute Name>@..." and
2852
2854
  * "&lt;14.5.14.2.1 Attribute Property>@..." (where angle brackets denote a variable part and
2853
- * sections refer to specification "OData Version 4.0 Part 3: Common Schema Definition
2854
- * Language").
2855
+ * sections refer to specification <a href=
2856
+ * "https://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part3-csdl.htm"
2857
+ * >"OData Version 4.0 Part 3: Common Schema Definition Language"</a>).
2855
2858
  *
2856
2859
  * Annotations starting with "@@", for example
2857
2860
  * "@@sap.ui.model.odata.v4.AnnotationHelper.isMultiple" or "@@.AH.isMultiple" or
@@ -3030,7 +3033,7 @@ sap.ui.define([
3030
3033
  * If present, it must point to this meta model's root entity container, that is,
3031
3034
  * <code>oDetails.context.getModel() === this</code> and
3032
3035
  * <code>oDetails.context.getPath() === "/"</code>
3033
- * @returns {Promise}
3036
+ * @returns {Promise<Object<string,{StandardCode: string, Text: string, UnitSpecificScale: string}>|null>}
3034
3037
  * A promise resolving with the unit customizing which is a map from unit key to an object
3035
3038
  * with the following properties:
3036
3039
  * <ul>
@@ -3423,7 +3426,7 @@ sap.ui.define([
3423
3426
  * Returns a string representation of this object including the URL to the $metadata document of
3424
3427
  * the service.
3425
3428
  *
3426
- * @return {string} A string description of this model
3429
+ * @returns {string} A string description of this model
3427
3430
  *
3428
3431
  * @public
3429
3432
  * @since 1.37.0