@openui5/sap.ui.core 1.96.2 → 1.98.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 (700) hide show
  1. package/.eslintrc.json +62 -3
  2. package/.reuse/dep5 +26 -31
  3. package/THIRDPARTY.txt +15 -21
  4. package/package.json +1 -1
  5. package/src/jquery.sap.act.js +1 -1
  6. package/src/jquery.sap.dom.js +1 -1
  7. package/src/jquery.sap.encoder.js +1 -1
  8. package/src/jquery.sap.events.js +1 -1
  9. package/src/jquery.sap.global.js +2 -2
  10. package/src/jquery.sap.history.js +1 -1
  11. package/src/jquery.sap.keycodes.js +1 -1
  12. package/src/jquery.sap.mobile.js +1 -9
  13. package/src/jquery.sap.promise.js +1 -1
  14. package/src/jquery.sap.properties.js +2 -2
  15. package/src/jquery.sap.resources.js +3 -3
  16. package/src/jquery.sap.script.js +2 -2
  17. package/src/jquery.sap.sjax.js +1 -1
  18. package/src/jquery.sap.storage.js +4 -4
  19. package/src/jquery.sap.strings.js +1 -1
  20. package/src/jquery.sap.stubs.js +1 -1
  21. package/src/jquery.sap.trace.js +1 -1
  22. package/src/jquery.sap.ui.js +1 -1
  23. package/src/jquery.sap.xml.js +1 -1
  24. package/src/sap/base/Log.js +1 -1
  25. package/src/sap/base/assert.js +1 -1
  26. package/src/sap/base/i18n/ResourceBundle.js +1 -1
  27. package/src/sap/base/security/URLListValidator.js +1 -1
  28. package/src/sap/base/security/URLWhitelist.js +1 -1
  29. package/src/sap/base/security/encodeCSS.js +1 -1
  30. package/src/sap/base/security/encodeJS.js +1 -1
  31. package/src/sap/base/security/encodeURL.js +1 -1
  32. package/src/sap/base/security/encodeURLParameters.js +1 -1
  33. package/src/sap/base/security/encodeXML.js +1 -1
  34. package/src/sap/base/security/sanitizeHTML.js +1 -1
  35. package/src/sap/base/strings/camelize.js +1 -1
  36. package/src/sap/base/strings/capitalize.js +1 -1
  37. package/src/sap/base/strings/escapeRegExp.js +1 -1
  38. package/src/sap/base/strings/formatMessage.js +1 -1
  39. package/src/sap/base/strings/hash.js +1 -1
  40. package/src/sap/base/strings/hyphenate.js +1 -1
  41. package/src/sap/base/strings/toHex.js +1 -1
  42. package/src/sap/base/strings/whitespaceReplacer.js +1 -1
  43. package/src/sap/base/util/Deferred.js +1 -1
  44. package/src/sap/base/util/JSTokenizer.js +1 -1
  45. package/src/sap/base/util/LoaderExtensions.js +1 -1
  46. package/src/sap/base/util/ObjectPath.js +1 -1
  47. package/src/sap/base/util/Properties.js +1 -1
  48. package/src/sap/base/util/UriParameters.js +1 -1
  49. package/src/sap/base/util/Version.js +1 -1
  50. package/src/sap/base/util/_merge.js +1 -1
  51. package/src/sap/base/util/array/diff.js +1 -1
  52. package/src/sap/base/util/array/uniqueSort.js +1 -1
  53. package/src/sap/base/util/deepClone.js +1 -1
  54. package/src/sap/base/util/deepEqual.js +1 -1
  55. package/src/sap/base/util/deepExtend.js +1 -1
  56. package/src/sap/base/util/defineCoupledProperty.js +1 -1
  57. package/src/sap/base/util/defineLazyProperty.js +1 -1
  58. package/src/sap/base/util/each.js +1 -1
  59. package/src/sap/base/util/extend.js +1 -1
  60. package/src/sap/base/util/includes.js +1 -1
  61. package/src/sap/base/util/isEmptyObject.js +1 -1
  62. package/src/sap/base/util/isPlainObject.js +1 -1
  63. package/src/sap/base/util/merge.js +1 -1
  64. package/src/sap/base/util/now.js +1 -1
  65. package/src/sap/base/util/resolveReference.js +1 -1
  66. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  67. package/src/sap/base/util/restricted/_castArray.js +2 -2
  68. package/src/sap/base/util/restricted/_compact.js +2 -2
  69. package/src/sap/base/util/restricted/_curry.js +2 -2
  70. package/src/sap/base/util/restricted/_debounce.js +2 -2
  71. package/src/sap/base/util/restricted/_difference.js +2 -2
  72. package/src/sap/base/util/restricted/_differenceBy.js +2 -2
  73. package/src/sap/base/util/restricted/_differenceWith.js +2 -2
  74. package/src/sap/base/util/restricted/_flatMap.js +2 -2
  75. package/src/sap/base/util/restricted/_flatMapDeep.js +2 -2
  76. package/src/sap/base/util/restricted/_flatMapDepth.js +2 -2
  77. package/src/sap/base/util/restricted/_flatten.js +2 -2
  78. package/src/sap/base/util/restricted/_flattenDeep.js +2 -2
  79. package/src/sap/base/util/restricted/_flattenDepth.js +2 -2
  80. package/src/sap/base/util/restricted/_intersection.js +2 -2
  81. package/src/sap/base/util/restricted/_intersectionBy.js +2 -2
  82. package/src/sap/base/util/restricted/_intersectionWith.js +2 -2
  83. package/src/sap/base/util/restricted/_isEqual.js +2 -2
  84. package/src/sap/base/util/restricted/_isEqualWith.js +2 -2
  85. package/src/sap/base/util/restricted/_isNil.js +2 -2
  86. package/src/sap/base/util/restricted/_max.js +2 -2
  87. package/src/sap/base/util/restricted/_merge.js +2 -2
  88. package/src/sap/base/util/restricted/_mergeWith.js +2 -2
  89. package/src/sap/base/util/restricted/_min.js +2 -2
  90. package/src/sap/base/util/restricted/_omit.js +2 -2
  91. package/src/sap/base/util/restricted/_pick.js +2 -2
  92. package/src/sap/base/util/restricted/_pickBy.js +2 -2
  93. package/src/sap/base/util/restricted/_throttle.js +2 -2
  94. package/src/sap/base/util/restricted/_toArray.js +2 -2
  95. package/src/sap/base/util/restricted/_union.js +2 -2
  96. package/src/sap/base/util/restricted/_unionBy.js +2 -2
  97. package/src/sap/base/util/restricted/_unionWith.js +2 -2
  98. package/src/sap/base/util/restricted/_uniq.js +2 -2
  99. package/src/sap/base/util/restricted/_uniqBy.js +2 -2
  100. package/src/sap/base/util/restricted/_uniqWith.js +2 -2
  101. package/src/sap/base/util/restricted/_without.js +2 -2
  102. package/src/sap/base/util/restricted/_xor.js +2 -2
  103. package/src/sap/base/util/restricted/_xorBy.js +2 -2
  104. package/src/sap/base/util/restricted/_xorWith.js +2 -2
  105. package/src/sap/base/util/restricted/_zipObject.js +2 -2
  106. package/src/sap/base/util/restricted/_zipObjectDeep.js +2 -2
  107. package/src/sap/base/util/uid.js +1 -1
  108. package/src/sap/base/util/values.js +1 -1
  109. package/src/sap/ui/Device.js +82 -170
  110. package/src/sap/ui/Global.js +12 -17
  111. package/src/sap/ui/VersionInfo.js +1 -1
  112. package/src/sap/ui/base/BindingParser.js +1 -1
  113. package/src/sap/ui/base/DataType.js +1 -1
  114. package/src/sap/ui/base/Event.js +2 -2
  115. package/src/sap/ui/base/EventProvider.js +2 -2
  116. package/src/sap/ui/base/Exception.js +1 -1
  117. package/src/sap/ui/base/ExpressionParser.js +1 -1
  118. package/src/sap/ui/base/Interface.js +2 -2
  119. package/src/sap/ui/base/ManagedObject.js +20 -9
  120. package/src/sap/ui/base/ManagedObjectMetadata.js +2 -2
  121. package/src/sap/ui/base/ManagedObjectObserver.js +1 -1
  122. package/src/sap/ui/base/ManagedObjectRegistry.js +1 -1
  123. package/src/sap/ui/base/Metadata.js +2 -4
  124. package/src/sap/ui/base/Object.js +2 -2
  125. package/src/sap/ui/base/ObjectPool.js +2 -2
  126. package/src/sap/ui/base/SyncPromise.js +1 -1
  127. package/src/sap/ui/base/syncXHRFix.js +1 -1
  128. package/src/sap/ui/core/.library +2 -28
  129. package/src/sap/ui/core/AppCacheBuster.js +5 -5
  130. package/src/sap/ui/core/BlockLayerUtils.js +1 -1
  131. package/src/sap/ui/core/BusyIndicator.js +2 -2
  132. package/src/sap/ui/core/BusyIndicatorUtils.js +2 -2
  133. package/src/sap/ui/core/CalendarType.js +1 -1
  134. package/src/sap/ui/core/CommandExecution.js +1 -1
  135. package/src/sap/ui/core/Component.js +32 -10
  136. package/src/sap/ui/core/ComponentContainer.js +2 -2
  137. package/src/sap/ui/core/ComponentContainerRenderer.js +1 -1
  138. package/src/sap/ui/core/ComponentMetadata.js +2 -2
  139. package/src/sap/ui/core/ComponentSupport.js +2 -2
  140. package/src/sap/ui/core/Configuration.js +3 -5
  141. package/src/sap/ui/core/ContextMenuSupport.js +1 -1
  142. package/src/sap/ui/core/Control.js +4 -4
  143. package/src/sap/ui/core/Core.js +3 -6
  144. package/src/sap/ui/core/CustomData.js +2 -2
  145. package/src/sap/ui/core/CustomStyleClassSupport.js +1 -1
  146. package/src/sap/ui/core/DeclarativeSupport.js +2 -2
  147. package/src/sap/ui/core/Element.js +4 -7
  148. package/src/sap/ui/core/ElementMetadata.js +2 -2
  149. package/src/sap/ui/core/EnabledPropagator.js +2 -2
  150. package/src/sap/ui/core/EventBus.js +2 -2
  151. package/src/sap/ui/core/ExtensionPoint.js +1 -1
  152. package/src/sap/ui/core/FocusHandler.js +1 -1
  153. package/src/sap/ui/core/Fragment.js +2 -2
  154. package/src/sap/ui/core/HTML.js +4 -4
  155. package/src/sap/ui/core/HTMLRenderer.js +1 -1
  156. package/src/sap/ui/core/History.js +2 -2
  157. package/src/sap/ui/core/Icon.js +3 -4
  158. package/src/sap/ui/core/IconPool.js +1 -1
  159. package/src/sap/ui/core/IconRenderer.js +1 -1
  160. package/src/sap/ui/core/IndicationColorSupport.js +2 -2
  161. package/src/sap/ui/core/IntervalTrigger.js +2 -2
  162. package/src/sap/ui/core/InvisibleMessage.js +2 -2
  163. package/src/sap/ui/core/InvisibleRenderer.js +2 -2
  164. package/src/sap/ui/core/InvisibleText.js +2 -2
  165. package/src/sap/ui/core/Item.js +2 -2
  166. package/src/sap/ui/core/LabelEnablement.js +2 -2
  167. package/src/sap/ui/core/LayoutData.js +2 -2
  168. package/src/sap/ui/core/ListItem.js +2 -2
  169. package/src/sap/ui/core/LocalBusyIndicator.js +2 -2
  170. package/src/sap/ui/core/LocalBusyIndicatorRenderer.js +1 -1
  171. package/src/sap/ui/core/LocalBusyIndicatorSupport.js +2 -2
  172. package/src/sap/ui/core/Locale.js +2 -2
  173. package/src/sap/ui/core/LocaleData.js +4 -4
  174. package/src/sap/ui/core/Manifest.js +2 -2
  175. package/src/sap/ui/core/Message.js +2 -2
  176. package/src/sap/ui/core/Patcher.js +1 -1
  177. package/src/sap/ui/core/Placeholder.js +29 -29
  178. package/src/sap/ui/core/Popup.js +2 -2
  179. package/src/sap/ui/core/RenderManager.js +4 -4
  180. package/src/sap/ui/core/Renderer.js +2 -2
  181. package/src/sap/ui/core/ResizeHandler.js +2 -2
  182. package/src/sap/ui/core/ScrollBar.js +5 -4
  183. package/src/sap/ui/core/ScrollBarRenderer.js +1 -1
  184. package/src/sap/ui/core/SeparatorItem.js +2 -2
  185. package/src/sap/ui/core/Shortcut.js +1 -1
  186. package/src/sap/ui/core/ShortcutHint.js +1 -1
  187. package/src/sap/ui/core/ShortcutHintsMixin.js +1 -1
  188. package/src/sap/ui/core/StashedControlSupport.js +1 -1
  189. package/src/sap/ui/core/ThemeCheck.js +3 -3
  190. package/src/sap/ui/core/Title.js +2 -2
  191. package/src/sap/ui/core/TooltipBase.js +3 -3
  192. package/src/sap/ui/core/UIArea.js +4 -4
  193. package/src/sap/ui/core/UIComponent.js +2 -2
  194. package/src/sap/ui/core/UIComponentMetadata.js +2 -2
  195. package/src/sap/ui/core/ValueStateSupport.js +2 -2
  196. package/src/sap/ui/core/VariantLayoutData.js +2 -2
  197. package/src/sap/ui/core/XMLComposite.js +2 -2
  198. package/src/sap/ui/core/XMLCompositeMetadata.js +2 -2
  199. package/src/sap/ui/core/XMLTemplateProcessor.js +27 -6
  200. package/src/sap/ui/core/_IconRegistry.js +1 -1
  201. package/src/sap/ui/core/cache/CacheManager.js +1 -1
  202. package/src/sap/ui/core/cache/CacheManagerNOP.js +1 -1
  203. package/src/sap/ui/core/cache/LRUPersistentCache.js +5 -3
  204. package/src/sap/ui/core/date/Buddhist.js +1 -1
  205. package/src/sap/ui/core/date/Gregorian.js +1 -1
  206. package/src/sap/ui/core/date/Islamic.js +1 -1
  207. package/src/sap/ui/core/date/Japanese.js +1 -1
  208. package/src/sap/ui/core/date/Persian.js +1 -1
  209. package/src/sap/ui/core/date/UniversalDate.js +1 -1
  210. package/src/sap/ui/core/date/UniversalDateUtils.js +206 -3
  211. package/src/sap/ui/core/date/_Calendars.js +1 -1
  212. package/src/sap/ui/core/delegate/ItemNavigation.js +2 -2
  213. package/src/sap/ui/core/delegate/ScrollEnablement.js +2 -2
  214. package/src/sap/ui/core/designtime/ComponentContainer.designtime.js +1 -1
  215. package/src/sap/ui/core/designtime/CustomData.designtime.js +1 -1
  216. package/src/sap/ui/core/designtime/Icon.designtime.js +1 -1
  217. package/src/sap/ui/core/designtime/UIComponent.designtime.js +1 -1
  218. package/src/sap/ui/core/designtime/library.designtime.js +1 -1
  219. package/src/sap/ui/core/designtime/mvc/ControllerExtensionTemplate.js +1 -1
  220. package/src/sap/ui/core/designtime/mvc/View.designtime.js +1 -1
  221. package/src/sap/ui/core/designtime/mvc/XMLView.designtime.js +1 -1
  222. package/src/sap/ui/core/dnd/DragAndDrop.js +3 -3
  223. package/src/sap/ui/core/dnd/DragDropBase.js +2 -2
  224. package/src/sap/ui/core/dnd/DragDropInfo.js +2 -2
  225. package/src/sap/ui/core/dnd/DragInfo.js +2 -2
  226. package/src/sap/ui/core/dnd/DropInfo.js +2 -2
  227. package/src/sap/ui/core/format/DateFormat.js +45 -9
  228. package/src/sap/ui/core/format/FileSizeFormat.js +1 -1
  229. package/src/sap/ui/core/format/ListFormat.js +1 -1
  230. package/src/sap/ui/core/format/NumberFormat.js +1 -1
  231. package/src/sap/ui/core/hyphenation/Hyphenation.js +2 -2
  232. package/src/sap/ui/core/hyphenation/HyphenationTestingWords.js +1 -1
  233. package/src/sap/ui/core/library.js +46 -9
  234. package/src/sap/ui/core/library.support.js +1 -1
  235. package/src/sap/ui/core/message/ControlMessageProcessor.js +6 -6
  236. package/src/sap/ui/core/message/Message.js +2 -2
  237. package/src/sap/ui/core/message/MessageManager.js +2 -2
  238. package/src/sap/ui/core/message/MessageMixin.js +3 -2
  239. package/src/sap/ui/core/message/MessageParser.js +2 -2
  240. package/src/sap/ui/core/message/MessageProcessor.js +23 -13
  241. package/src/sap/ui/core/messagebundle_fr.properties +7 -7
  242. package/src/sap/ui/core/messagebundle_it.properties +1 -1
  243. package/src/sap/ui/core/messagebundle_no.properties +4 -4
  244. package/src/sap/ui/core/messagebundle_ru.properties +21 -21
  245. package/src/sap/ui/core/mvc/Controller.js +5 -5
  246. package/src/sap/ui/core/mvc/ControllerExtension.js +1 -1
  247. package/src/sap/ui/core/mvc/ControllerExtensionProvider.js +1 -1
  248. package/src/sap/ui/core/mvc/ControllerMetadata.js +1 -1
  249. package/src/sap/ui/core/mvc/EventHandlerResolver.js +1 -1
  250. package/src/sap/ui/core/mvc/HTMLView.js +2 -2
  251. package/src/sap/ui/core/mvc/HTMLViewRenderer.js +1 -1
  252. package/src/sap/ui/core/mvc/JSONView.js +3 -2
  253. package/src/sap/ui/core/mvc/JSONViewRenderer.js +1 -1
  254. package/src/sap/ui/core/mvc/JSView.js +2 -2
  255. package/src/sap/ui/core/mvc/JSViewRenderer.js +1 -1
  256. package/src/sap/ui/core/mvc/OverrideExecution.js +1 -1
  257. package/src/sap/ui/core/mvc/TemplateView.js +2 -2
  258. package/src/sap/ui/core/mvc/TemplateViewRenderer.js +1 -1
  259. package/src/sap/ui/core/mvc/View.js +3 -2
  260. package/src/sap/ui/core/mvc/ViewRenderer.js +1 -1
  261. package/src/sap/ui/core/mvc/ViewType.js +1 -1
  262. package/src/sap/ui/core/mvc/XMLProcessingMode.js +1 -1
  263. package/src/sap/ui/core/mvc/XMLView.js +17 -4
  264. package/src/sap/ui/core/mvc/XMLViewRenderer.js +1 -1
  265. package/src/sap/ui/core/plugin/DeclarativeSupport.js +2 -2
  266. package/src/sap/ui/core/plugin/LessSupport.js +2 -2
  267. package/src/sap/ui/core/plugin/TemplatingSupport.js +2 -2
  268. package/src/sap/ui/core/postmessage/Bus.js +2 -2
  269. package/src/sap/ui/core/postmessage/confirmationDialog.js +2 -2
  270. package/src/sap/ui/core/routing/HashChanger.js +1 -1
  271. package/src/sap/ui/core/routing/HashChangerBase.js +1 -1
  272. package/src/sap/ui/core/routing/History.js +1 -1
  273. package/src/sap/ui/core/routing/Route.js +7 -7
  274. package/src/sap/ui/core/routing/Router.js +4 -3
  275. package/src/sap/ui/core/routing/RouterHashChanger.js +1 -1
  276. package/src/sap/ui/core/routing/Target.js +1 -1
  277. package/src/sap/ui/core/routing/TargetCache.js +1 -1
  278. package/src/sap/ui/core/routing/Targets.js +18 -14
  279. package/src/sap/ui/core/routing/Views.js +1 -1
  280. package/src/sap/ui/core/routing/async/Route.js +1 -1
  281. package/src/sap/ui/core/routing/async/Target.js +1 -1
  282. package/src/sap/ui/core/routing/async/TargetCache.js +1 -1
  283. package/src/sap/ui/core/routing/async/Targets.js +1 -1
  284. package/src/sap/ui/core/routing/sync/Route.js +1 -1
  285. package/src/sap/ui/core/routing/sync/Target.js +1 -1
  286. package/src/sap/ui/core/routing/sync/TargetCache.js +1 -1
  287. package/src/sap/ui/core/routing/sync/Targets.js +1 -1
  288. package/src/sap/ui/core/rules/App.support.js +1 -1
  289. package/src/sap/ui/core/rules/Config.support.js +1 -1
  290. package/src/sap/ui/core/rules/CoreHelper.support.js +1 -1
  291. package/src/sap/ui/core/rules/Misc.support.js +52 -2
  292. package/src/sap/ui/core/rules/Model.support.js +96 -9
  293. package/src/sap/ui/core/rules/Rendering.support.js +2 -5
  294. package/src/sap/ui/core/rules/Theming.support.js +1 -1
  295. package/src/sap/ui/core/rules/View.support.js +15 -47
  296. package/src/sap/ui/core/search/OpenSearchProvider.js +2 -2
  297. package/src/sap/ui/core/search/SearchProvider.js +2 -2
  298. package/src/sap/ui/core/service/Service.js +2 -2
  299. package/src/sap/ui/core/service/ServiceFactory.js +2 -2
  300. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +2 -2
  301. package/src/sap/ui/core/support/BootSupportTool.js +1 -1
  302. package/src/sap/ui/core/support/Hotkeys.js +1 -1
  303. package/src/sap/ui/core/support/Plugin.js +3 -3
  304. package/src/sap/ui/core/support/RuleEngineOpaExtension.js +1 -2
  305. package/src/sap/ui/core/support/Support.js +2 -2
  306. package/src/sap/ui/core/support/ToolsAPI.js +1 -1
  307. package/src/sap/ui/core/support/bootstrapFallback.js +1 -1
  308. package/src/sap/ui/core/support/controls/InteractionSlider.js +1 -1
  309. package/src/sap/ui/core/support/controls/InteractionTree.js +1 -1
  310. package/src/sap/ui/core/support/controls/ObjectViewer.js +1 -1
  311. package/src/sap/ui/core/support/controls/TimelineOverview.js +1 -1
  312. package/src/sap/ui/core/support/controls/TreeViewer.js +2 -2
  313. package/src/sap/ui/core/support/debugReboot.js +1 -1
  314. package/src/sap/ui/core/support/plugins/Breakpoint.js +1 -1
  315. package/src/sap/ui/core/support/plugins/ControlTree.js +2 -2
  316. package/src/sap/ui/core/support/plugins/Debugging.js +1 -1
  317. package/src/sap/ui/core/support/plugins/Interaction.js +2 -2
  318. package/src/sap/ui/core/support/plugins/LocalStorage.js +2 -2
  319. package/src/sap/ui/core/support/plugins/Performance.js +2 -3
  320. package/src/sap/ui/core/support/plugins/Selector.js +2 -2
  321. package/src/sap/ui/core/support/plugins/TechInfo.js +2 -2
  322. package/src/sap/ui/core/support/plugins/Trace.js +2 -2
  323. package/src/sap/ui/core/support/plugins/ViewInfo.js +2 -2
  324. package/src/sap/ui/core/support/techinfo/TechnicalInfo.js +3 -7
  325. package/src/sap/ui/core/support/techinfo/moduleTreeHelper.js +1 -1
  326. package/src/sap/ui/core/support/trace/E2eTraceLib.js +4 -4
  327. package/src/sap/ui/core/support/trace/EppLib.js +1 -1
  328. package/src/sap/ui/core/support/usage/EventBroadcaster.js +1 -1
  329. package/src/sap/ui/core/syncStyleClass.js +1 -1
  330. package/src/sap/ui/core/themes/base/library.source.less +1 -1
  331. package/src/sap/ui/core/themes/base/parameterClasses.less +21 -21
  332. package/src/sap/ui/core/themes/sap_hcb/library.source.less +1 -1
  333. package/src/sap/ui/core/theming/Parameters.js +23 -143
  334. package/src/sap/ui/core/theming/ThemeHelper.js +27 -38
  335. package/src/sap/ui/core/tmpl/DOMAttribute.js +2 -2
  336. package/src/sap/ui/core/tmpl/DOMElement.js +2 -2
  337. package/src/sap/ui/core/tmpl/DOMElementRenderer.js +1 -1
  338. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +2 -2
  339. package/src/sap/ui/core/tmpl/Template.js +2 -2
  340. package/src/sap/ui/core/tmpl/TemplateControl.js +2 -2
  341. package/src/sap/ui/core/tmpl/TemplateControlRenderer.js +1 -1
  342. package/src/sap/ui/core/tmpl/_parsePath.js +1 -1
  343. package/src/sap/ui/core/util/AsyncHintsHelper.js +2 -2
  344. package/src/sap/ui/core/util/DraftEnabledMockServer.js +22 -17
  345. package/src/sap/ui/core/util/Export.js +2 -2
  346. package/src/sap/ui/core/util/ExportCell.js +2 -2
  347. package/src/sap/ui/core/util/ExportColumn.js +2 -2
  348. package/src/sap/ui/core/util/ExportRow.js +2 -2
  349. package/src/sap/ui/core/util/ExportType.js +2 -2
  350. package/src/sap/ui/core/util/ExportTypeCSV.js +2 -2
  351. package/src/sap/ui/core/util/File.js +2 -2
  352. package/src/sap/ui/core/util/LibraryInfo.js +2 -2
  353. package/src/sap/ui/core/util/MockServer.js +140 -43
  354. package/src/sap/ui/core/util/MockServerAnnotationsHandler.js +1 -1
  355. package/src/sap/ui/core/util/PasteHelper.js +2 -2
  356. package/src/sap/ui/core/util/ResponsivePaddingsEnablement.js +1 -1
  357. package/src/sap/ui/core/util/ShortcutHelper.js +1 -1
  358. package/src/sap/ui/core/util/XMLPreprocessor.js +1 -1
  359. package/src/sap/ui/core/util/reflection/BaseTreeModifier.js +5 -1
  360. package/src/sap/ui/core/util/reflection/JsControlTreeModifier.js +31 -21
  361. package/src/sap/ui/core/util/reflection/XmlTreeModifier.js +1 -1
  362. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +2 -2
  363. package/src/sap/ui/core/util/serializer/Serializer.js +2 -2
  364. package/src/sap/ui/core/util/serializer/ViewSerializer.js +2 -2
  365. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +2 -2
  366. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +2 -2
  367. package/src/sap/ui/core/util/serializer/delegate/HTML.js +2 -2
  368. package/src/sap/ui/core/util/serializer/delegate/XML.js +2 -2
  369. package/src/sap/ui/core/ws/ReadyState.js +2 -2
  370. package/src/sap/ui/core/ws/SapPcpWebSocket.js +2 -2
  371. package/src/sap/ui/core/ws/WebSocket.js +2 -2
  372. package/src/sap/ui/debug/ControlTree.js +2 -2
  373. package/src/sap/ui/debug/DebugEnv.js +2 -2
  374. package/src/sap/ui/debug/Highlighter.js +1 -1
  375. package/src/sap/ui/debug/LogViewer.js +1 -1
  376. package/src/sap/ui/debug/PropertyList.js +2 -2
  377. package/src/sap/ui/dom/containsOrEquals.js +1 -1
  378. package/src/sap/ui/dom/denormalizeScrollBeginRTL.js +1 -1
  379. package/src/sap/ui/dom/denormalizeScrollLeftRTL.js +1 -1
  380. package/src/sap/ui/dom/getComputedStyleFix.js +1 -1
  381. package/src/sap/ui/dom/getFirstEditableInput.js +1 -1
  382. package/src/sap/ui/dom/getOwnerWindow.js +1 -1
  383. package/src/sap/ui/dom/getScrollbarSize.js +1 -1
  384. package/src/sap/ui/dom/includeScript.js +1 -1
  385. package/src/sap/ui/dom/includeStylesheet.js +1 -1
  386. package/src/sap/ui/dom/isHidden.js +1 -1
  387. package/src/sap/ui/dom/jquery/Aria.js +1 -1
  388. package/src/sap/ui/dom/jquery/Focusable.js +1 -1
  389. package/src/sap/ui/dom/jquery/Selection.js +1 -1
  390. package/src/sap/ui/dom/jquery/Selectors.js +1 -1
  391. package/src/sap/ui/dom/jquery/control.js +1 -1
  392. package/src/sap/ui/dom/jquery/cursorPos.js +1 -1
  393. package/src/sap/ui/dom/jquery/getSelectedText.js +1 -1
  394. package/src/sap/ui/dom/jquery/hasTabIndex.js +1 -1
  395. package/src/sap/ui/dom/jquery/parentByAttribute.js +1 -1
  396. package/src/sap/ui/dom/jquery/rect.js +1 -1
  397. package/src/sap/ui/dom/jquery/rectContains.js +1 -1
  398. package/src/sap/ui/dom/jquery/scrollLeftRTL.js +1 -1
  399. package/src/sap/ui/dom/jquery/scrollRightRTL.js +1 -1
  400. package/src/sap/ui/dom/jquery/selectText.js +1 -1
  401. package/src/sap/ui/dom/jquery/zIndex.js +1 -1
  402. package/src/sap/ui/dom/units/Rem.js +1 -1
  403. package/src/sap/ui/events/ControlEvents.js +1 -1
  404. package/src/sap/ui/events/F6Navigation.js +1 -1
  405. package/src/sap/ui/events/KeyCodes.js +1 -1
  406. package/src/sap/ui/events/PasteEventFix.js +1 -1
  407. package/src/sap/ui/events/PseudoEvents.js +1 -1
  408. package/src/sap/ui/events/TouchToMouseMapping.js +1 -1
  409. package/src/sap/ui/events/checkMouseEnterOrLeave.js +1 -1
  410. package/src/sap/ui/events/isMouseEventDelayed.js +1 -1
  411. package/src/sap/ui/events/isSpecialKey.js +1 -1
  412. package/src/sap/ui/events/jquery/EventExtension.js +1 -1
  413. package/src/sap/ui/events/jquery/EventSimulation.js +4 -14
  414. package/src/sap/ui/events/jquery/EventTriggerHook.js +1 -1
  415. package/src/sap/ui/model/Binding.js +1 -1
  416. package/src/sap/ui/model/BindingMode.js +1 -1
  417. package/src/sap/ui/model/ChangeReason.js +2 -2
  418. package/src/sap/ui/model/ClientContextBinding.js +1 -1
  419. package/src/sap/ui/model/ClientListBinding.js +8 -1
  420. package/src/sap/ui/model/ClientModel.js +7 -6
  421. package/src/sap/ui/model/ClientPropertyBinding.js +1 -1
  422. package/src/sap/ui/model/ClientTreeBinding.js +1 -1
  423. package/src/sap/ui/model/ClientTreeBindingAdapter.js +2 -2
  424. package/src/sap/ui/model/CompositeBinding.js +1 -1
  425. package/src/sap/ui/model/CompositeDataState.js +27 -5
  426. package/src/sap/ui/model/CompositeType.js +2 -2
  427. package/src/sap/ui/model/Context.js +1 -1
  428. package/src/sap/ui/model/ContextBinding.js +1 -1
  429. package/src/sap/ui/model/DataState.js +28 -7
  430. package/src/sap/ui/model/Filter.js +1 -1
  431. package/src/sap/ui/model/FilterOperator.js +1 -1
  432. package/src/sap/ui/model/FilterProcessor.js +1 -1
  433. package/src/sap/ui/model/FilterType.js +1 -1
  434. package/src/sap/ui/model/FormatException.js +1 -1
  435. package/src/sap/ui/model/ListBinding.js +25 -6
  436. package/src/sap/ui/model/MetaModel.js +3 -3
  437. package/src/sap/ui/model/Model.js +7 -12
  438. package/src/sap/ui/model/ParseException.js +1 -1
  439. package/src/sap/ui/model/PropertyBinding.js +1 -1
  440. package/src/sap/ui/model/SelectionModel.js +2 -2
  441. package/src/sap/ui/model/SimpleType.js +2 -2
  442. package/src/sap/ui/model/Sorter.js +1 -1
  443. package/src/sap/ui/model/SorterProcessor.js +1 -1
  444. package/src/sap/ui/model/StaticBinding.js +1 -1
  445. package/src/sap/ui/model/TreeAutoExpandMode.js +2 -2
  446. package/src/sap/ui/model/TreeBinding.js +1 -1
  447. package/src/sap/ui/model/TreeBindingAdapter.js +1 -3
  448. package/src/sap/ui/model/TreeBindingCompatibilityAdapter.js +1 -1
  449. package/src/sap/ui/model/TreeBindingUtils.js +3 -1
  450. package/src/sap/ui/model/Type.js +2 -2
  451. package/src/sap/ui/model/ValidateException.js +1 -1
  452. package/src/sap/ui/model/analytics/AnalyticalBinding.js +52 -35
  453. package/src/sap/ui/model/analytics/AnalyticalTreeBindingAdapter.js +17 -19
  454. package/src/sap/ui/model/analytics/AnalyticalVersionInfo.js +1 -1
  455. package/src/sap/ui/model/analytics/BatchResponseCollector.js +1 -1
  456. package/src/sap/ui/model/analytics/ODataModelAdapter.js +3 -16
  457. package/src/sap/ui/model/analytics/odata4analytics.js +1 -1
  458. package/src/sap/ui/model/base/ManagedObjectModel.js +1 -1
  459. package/src/sap/ui/model/json/JSONListBinding.js +1 -1
  460. package/src/sap/ui/model/json/JSONModel.js +8 -8
  461. package/src/sap/ui/model/json/JSONPropertyBinding.js +2 -2
  462. package/src/sap/ui/model/json/JSONTreeBinding.js +1 -1
  463. package/src/sap/ui/model/message/MessageListBinding.js +1 -1
  464. package/src/sap/ui/model/message/MessageModel.js +4 -4
  465. package/src/sap/ui/model/message/MessagePropertyBinding.js +2 -2
  466. package/src/sap/ui/model/odata/AnnotationHelper.js +3 -3
  467. package/src/sap/ui/model/odata/AnnotationParser.js +5 -3
  468. package/src/sap/ui/model/odata/CountMode.js +1 -1
  469. package/src/sap/ui/model/odata/Filter.js +1 -1
  470. package/src/sap/ui/model/odata/MessageScope.js +1 -1
  471. package/src/sap/ui/model/odata/ODataAnnotations.js +2 -2
  472. package/src/sap/ui/model/odata/ODataContextBinding.js +1 -1
  473. package/src/sap/ui/model/odata/ODataListBinding.js +62 -39
  474. package/src/sap/ui/model/odata/ODataMessageParser.js +3 -3
  475. package/src/sap/ui/model/odata/ODataMetaModel.js +4 -4
  476. package/src/sap/ui/model/odata/ODataMetadata.js +137 -86
  477. package/src/sap/ui/model/odata/ODataModel.js +443 -216
  478. package/src/sap/ui/model/odata/ODataPropertyBinding.js +8 -6
  479. package/src/sap/ui/model/odata/ODataTreeBinding.js +1 -1
  480. package/src/sap/ui/model/odata/ODataTreeBindingAdapter.js +28 -18
  481. package/src/sap/ui/model/odata/ODataTreeBindingFlat.js +441 -261
  482. package/src/sap/ui/model/odata/ODataUtils.js +25 -10
  483. package/src/sap/ui/model/odata/OperationMode.js +1 -1
  484. package/src/sap/ui/model/odata/UpdateMethod.js +1 -1
  485. package/src/sap/ui/model/odata/_AnnotationHelperBasics.js +4 -3
  486. package/src/sap/ui/model/odata/_AnnotationHelperExpression.js +12 -10
  487. package/src/sap/ui/model/odata/_ODataMetaModelUtils.js +8 -6
  488. package/src/sap/ui/model/odata/type/Boolean.js +2 -2
  489. package/src/sap/ui/model/odata/type/Byte.js +2 -2
  490. package/src/sap/ui/model/odata/type/Currency.js +2 -2
  491. package/src/sap/ui/model/odata/type/Date.js +2 -2
  492. package/src/sap/ui/model/odata/type/DateTime.js +2 -2
  493. package/src/sap/ui/model/odata/type/DateTimeBase.js +2 -2
  494. package/src/sap/ui/model/odata/type/DateTimeOffset.js +2 -2
  495. package/src/sap/ui/model/odata/type/Decimal.js +6 -2
  496. package/src/sap/ui/model/odata/type/Double.js +2 -2
  497. package/src/sap/ui/model/odata/type/Guid.js +2 -2
  498. package/src/sap/ui/model/odata/type/Int.js +2 -2
  499. package/src/sap/ui/model/odata/type/Int16.js +2 -2
  500. package/src/sap/ui/model/odata/type/Int32.js +2 -2
  501. package/src/sap/ui/model/odata/type/Int64.js +2 -2
  502. package/src/sap/ui/model/odata/type/ODataType.js +2 -2
  503. package/src/sap/ui/model/odata/type/Raw.js +2 -2
  504. package/src/sap/ui/model/odata/type/SByte.js +2 -2
  505. package/src/sap/ui/model/odata/type/Single.js +2 -2
  506. package/src/sap/ui/model/odata/type/Stream.js +2 -2
  507. package/src/sap/ui/model/odata/type/String.js +2 -2
  508. package/src/sap/ui/model/odata/type/Time.js +2 -2
  509. package/src/sap/ui/model/odata/type/TimeOfDay.js +2 -2
  510. package/src/sap/ui/model/odata/type/Unit.js +2 -2
  511. package/src/sap/ui/model/odata/type/UnitMixin.js +2 -3
  512. package/src/sap/ui/model/odata/v2/BatchMode.js +1 -1
  513. package/src/sap/ui/model/odata/v2/Context.js +99 -15
  514. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +2 -2
  515. package/src/sap/ui/model/odata/v2/ODataContextBinding.js +1 -1
  516. package/src/sap/ui/model/odata/v2/ODataListBinding.js +389 -149
  517. package/src/sap/ui/model/odata/v2/ODataModel.js +233 -134
  518. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +163 -90
  519. package/src/sap/ui/model/odata/v2/_CreatedContextsCache.js +118 -8
  520. package/src/sap/ui/model/odata/v4/AnnotationHelper.js +6 -6
  521. package/src/sap/ui/model/odata/v4/Context.js +164 -36
  522. package/src/sap/ui/model/odata/v4/ODataBinding.js +91 -41
  523. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +184 -61
  524. package/src/sap/ui/model/odata/v4/ODataListBinding.js +398 -129
  525. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +44 -41
  526. package/src/sap/ui/model/odata/v4/ODataModel.js +28 -12
  527. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +70 -80
  528. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +26 -23
  529. package/src/sap/ui/model/odata/v4/ODataUtils.js +6 -6
  530. package/src/sap/ui/model/odata/v4/SubmitMode.js +1 -2
  531. package/src/sap/ui/model/odata/v4/ValueListType.js +1 -2
  532. package/src/sap/ui/model/odata/v4/_AnnotationHelperExpression.js +19 -20
  533. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +4 -6
  534. package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +6 -5
  535. package/src/sap/ui/model/odata/v4/lib/_Batch.js +22 -21
  536. package/src/sap/ui/model/odata/v4/lib/_Cache.js +247 -103
  537. package/src/sap/ui/model/odata/v4/lib/_ConcatHelper.js +1 -1
  538. package/src/sap/ui/model/odata/v4/lib/_GroupLock.js +2 -2
  539. package/src/sap/ui/model/odata/v4/lib/_Helper.js +50 -20
  540. package/src/sap/ui/model/odata/v4/lib/_MetadataConverter.js +61 -60
  541. package/src/sap/ui/model/odata/v4/lib/_MetadataRequestor.js +2 -2
  542. package/src/sap/ui/model/odata/v4/lib/_MinMaxHelper.js +1 -1
  543. package/src/sap/ui/model/odata/v4/lib/_Parser.js +53 -44
  544. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +42 -24
  545. package/src/sap/ui/model/odata/v4/lib/_V2MetadataConverter.js +148 -148
  546. package/src/sap/ui/model/odata/v4/lib/_V2Requestor.js +14 -13
  547. package/src/sap/ui/model/odata/v4/lib/_V4MetadataConverter.js +67 -68
  548. package/src/sap/ui/model/resource/ResourceModel.js +2 -2
  549. package/src/sap/ui/model/resource/ResourcePropertyBinding.js +1 -1
  550. package/src/sap/ui/model/type/Boolean.js +2 -2
  551. package/src/sap/ui/model/type/Currency.js +2 -2
  552. package/src/sap/ui/model/type/Date.js +2 -2
  553. package/src/sap/ui/model/type/DateInterval.js +2 -2
  554. package/src/sap/ui/model/type/DateTime.js +2 -2
  555. package/src/sap/ui/model/type/DateTimeInterval.js +2 -2
  556. package/src/sap/ui/model/type/FileSize.js +2 -2
  557. package/src/sap/ui/model/type/Float.js +2 -2
  558. package/src/sap/ui/model/type/Integer.js +2 -2
  559. package/src/sap/ui/model/type/String.js +2 -2
  560. package/src/sap/ui/model/type/Time.js +2 -2
  561. package/src/sap/ui/model/type/TimeInterval.js +2 -2
  562. package/src/sap/ui/model/type/Unit.js +2 -2
  563. package/src/sap/ui/model/xml/XMLListBinding.js +1 -1
  564. package/src/sap/ui/model/xml/XMLModel.js +6 -6
  565. package/src/sap/ui/model/xml/XMLPropertyBinding.js +2 -2
  566. package/src/sap/ui/model/xml/XMLTreeBinding.js +1 -1
  567. package/src/sap/ui/performance/BeaconRequest.js +1 -1
  568. package/src/sap/ui/performance/Measurement.js +1 -1
  569. package/src/sap/ui/performance/XHRInterceptor.js +1 -1
  570. package/src/sap/ui/performance/trace/FESR.js +1 -1
  571. package/src/sap/ui/performance/trace/Interaction.js +1 -1
  572. package/src/sap/ui/performance/trace/Passport.js +1 -1
  573. package/src/sap/ui/performance/trace/initTraces.js +1 -1
  574. package/src/sap/ui/qunit/QUnitUtils.js +1 -1
  575. package/src/sap/ui/qunit/qunit-2-css.js +1 -1
  576. package/src/sap/ui/qunit/qunit-coverage.js +1 -1
  577. package/src/sap/ui/qunit/qunit-css.js +1 -1
  578. package/src/sap/ui/qunit/qunit-junit.js +1 -1
  579. package/src/sap/ui/qunit/qunit-redirect.js +1 -1
  580. package/src/sap/ui/qunit/sinon-qunit-bridge.js +1 -1
  581. package/src/sap/ui/qunit/utils/ControlIterator.js +2 -2
  582. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +2 -2
  583. package/src/sap/ui/qunit/utils/createAndAppendDiv.js +1 -1
  584. package/src/sap/ui/qunit/utils/waitForThemeApplied.js +1 -1
  585. package/src/sap/ui/security/FrameOptions.js +1 -1
  586. package/src/sap/ui/test/BlanketReporter.js +2 -2
  587. package/src/sap/ui/test/BranchTracking.js +1 -1
  588. package/src/sap/ui/test/Opa.js +1 -1
  589. package/src/sap/ui/test/Opa5.js +1 -1
  590. package/src/sap/ui/test/OpaBuilder.js +1 -1
  591. package/src/sap/ui/test/OpaExtension.js +1 -1
  592. package/src/sap/ui/test/OpaPlugin.js +1 -1
  593. package/src/sap/ui/test/PageObjectFactory.js +1 -1
  594. package/src/sap/ui/test/RecordReplay.js +1 -1
  595. package/src/sap/ui/test/RecorderHotkeyListener.js +1 -1
  596. package/src/sap/ui/test/TestUtils.js +3 -3
  597. package/src/sap/ui/test/_BrowserLogCollector.js +1 -1
  598. package/src/sap/ui/test/_ControlFinder.js +1 -1
  599. package/src/sap/ui/test/_LogCollector.js +2 -2
  600. package/src/sap/ui/test/_OpaLogger.js +1 -1
  601. package/src/sap/ui/test/_OpaUriParameterParser.js +1 -1
  602. package/src/sap/ui/test/_ParameterValidator.js +1 -1
  603. package/src/sap/ui/test/_UsageReport.js +1 -1
  604. package/src/sap/ui/test/_ValidationParameters.js +1 -1
  605. package/src/sap/ui/test/actions/Action.js +12 -3
  606. package/src/sap/ui/test/actions/Drag.js +1 -1
  607. package/src/sap/ui/test/actions/Drop.js +1 -1
  608. package/src/sap/ui/test/actions/EnterText.js +1 -1
  609. package/src/sap/ui/test/actions/Press.js +80 -4
  610. package/src/sap/ui/test/actions/Scroll.js +1 -1
  611. package/src/sap/ui/test/autowaiter/WaiterBase.js +1 -1
  612. package/src/sap/ui/test/autowaiter/_UIUpdatesWaiter.js +1 -1
  613. package/src/sap/ui/test/autowaiter/_XHRWaiter.js +2 -2
  614. package/src/sap/ui/test/autowaiter/_autoWaiter.js +1 -1
  615. package/src/sap/ui/test/autowaiter/_autoWaiterAsync.js +1 -1
  616. package/src/sap/ui/test/autowaiter/_moduleWaiter.js +1 -1
  617. package/src/sap/ui/test/autowaiter/_navigationContainerWaiter.js +1 -1
  618. package/src/sap/ui/test/autowaiter/_promiseWaiter.js +1 -1
  619. package/src/sap/ui/test/autowaiter/_resourceWaiter.js +1 -1
  620. package/src/sap/ui/test/autowaiter/_timeoutWaiter.js +1 -1
  621. package/src/sap/ui/test/autowaiter/_utils.js +1 -1
  622. package/src/sap/ui/test/generic/_EnforceSemanticRendering.js +111 -0
  623. package/src/sap/ui/test/gherkin/GherkinTestGenerator.js +1 -1
  624. package/src/sap/ui/test/gherkin/StepDefinitions.js +1 -1
  625. package/src/sap/ui/test/gherkin/dataTableUtils.js +1 -1
  626. package/src/sap/ui/test/gherkin/opa5TestHarness.js +1 -1
  627. package/src/sap/ui/test/gherkin/qUnitTestHarness.js +1 -1
  628. package/src/sap/ui/test/gherkin/simpleGherkinParser.js +1 -1
  629. package/src/sap/ui/test/launchers/componentLauncher.js +1 -1
  630. package/src/sap/ui/test/launchers/iFrameLauncher.js +1 -1
  631. package/src/sap/ui/test/matchers/AggregationContainsPropertyEqual.js +1 -1
  632. package/src/sap/ui/test/matchers/AggregationEmpty.js +1 -1
  633. package/src/sap/ui/test/matchers/AggregationFilled.js +1 -1
  634. package/src/sap/ui/test/matchers/AggregationLengthEquals.js +1 -1
  635. package/src/sap/ui/test/matchers/Ancestor.js +1 -1
  636. package/src/sap/ui/test/matchers/BindingPath.js +1 -1
  637. package/src/sap/ui/test/matchers/Descendant.js +1 -1
  638. package/src/sap/ui/test/matchers/I18NText.js +1 -1
  639. package/src/sap/ui/test/matchers/Interactable.js +1 -1
  640. package/src/sap/ui/test/matchers/LabelFor.js +1 -1
  641. package/src/sap/ui/test/matchers/Matcher.js +1 -1
  642. package/src/sap/ui/test/matchers/MatcherFactory.js +1 -1
  643. package/src/sap/ui/test/matchers/Properties.js +1 -1
  644. package/src/sap/ui/test/matchers/PropertyStrictEquals.js +1 -1
  645. package/src/sap/ui/test/matchers/Sibling.js +1 -1
  646. package/src/sap/ui/test/matchers/Visible.js +1 -1
  647. package/src/sap/ui/test/matchers/_Busy.js +1 -1
  648. package/src/sap/ui/test/matchers/_Editable.js +1 -1
  649. package/src/sap/ui/test/matchers/_Enabled.js +1 -1
  650. package/src/sap/ui/test/matchers/_Visitor.js +1 -1
  651. package/src/sap/ui/test/matchers/matchers.js +1 -1
  652. package/src/sap/ui/test/opaQunit.js +1 -1
  653. package/src/sap/ui/test/pipelines/ActionPipeline.js +1 -1
  654. package/src/sap/ui/test/pipelines/MatcherPipeline.js +1 -1
  655. package/src/sap/ui/test/pipelines/PipelineFactory.js +1 -1
  656. package/src/sap/ui/test/qunitPause.js +1 -1
  657. package/src/sap/ui/test/selectors/_BindingPath.js +1 -1
  658. package/src/sap/ui/test/selectors/_ControlSelectorGenerator.js +1 -1
  659. package/src/sap/ui/test/selectors/_ControlSelectorValidator.js +1 -1
  660. package/src/sap/ui/test/selectors/_ControlType.js +1 -1
  661. package/src/sap/ui/test/selectors/_DropdownItem.js +1 -1
  662. package/src/sap/ui/test/selectors/_GlobalID.js +1 -1
  663. package/src/sap/ui/test/selectors/_LabelFor.js +1 -1
  664. package/src/sap/ui/test/selectors/_Properties.js +1 -1
  665. package/src/sap/ui/test/selectors/_Selector.js +1 -1
  666. package/src/sap/ui/test/selectors/_TableRowItem.js +1 -1
  667. package/src/sap/ui/test/selectors/_ViewID.js +1 -1
  668. package/src/sap/ui/test/selectors/_selectors.js +1 -1
  669. package/src/sap/ui/test/starter/_configureLoader.js +1 -1
  670. package/src/sap/ui/test/starter/_setupAndStart.js +1 -1
  671. package/src/sap/ui/test/starter/_utils.js +1 -1
  672. package/src/sap/ui/test/starter/createSuite.js +4 -4
  673. package/src/sap/ui/test/starter/runTest.js +1 -1
  674. package/src/sap/ui/thirdparty/RequestRecorder.js +1 -1
  675. package/src/sap/ui/thirdparty/caja-html-sanitizer.js +1 -1
  676. package/src/sap/ui/thirdparty/jquery-mobile-custom.js +3 -6
  677. package/src/sap/ui/util/ActivityDetection.js +1 -1
  678. package/src/sap/ui/util/Mobile.js +29 -40
  679. package/src/sap/ui/util/Storage.js +2 -2
  680. package/src/sap/ui/util/XMLHelper.js +54 -31
  681. package/src/sap/ui/util/_FeatureDetection.js +1 -1
  682. package/src/sap/ui/util/defaultLinkTypes.js +1 -1
  683. package/src/sap/ui/util/isCrossOriginURL.js +1 -1
  684. package/src/sap/ui/util/openWindow.js +1 -1
  685. package/src/sap-ui-boot.js +1 -1
  686. package/src/sap-ui-core-nojQuery.js +1 -1
  687. package/src/sap-ui-core.js +1 -1
  688. package/src/sap-ui-debug.js +1 -1
  689. package/src/ui5loader-autoconfig.js +1 -1
  690. package/src/ui5loader.js +10 -10
  691. package/ui5.yaml +244 -1
  692. package/src/sap/ui/core/CustomizingConfiguration.js +0 -47
  693. package/src/sap/ui/thirdparty/baseuri.js +0 -1
  694. package/src/sap/ui/thirdparty/es6-object-assign.js +0 -1
  695. package/src/sap/ui/thirdparty/es6-promise.js +0 -1
  696. package/src/sap/ui/thirdparty/es6-shim-nopromise.js +0 -1
  697. package/src/sap/ui/thirdparty/es6-string-methods.js +0 -1
  698. package/src/sap/ui/thirdparty/flexie.js +0 -1
  699. package/src/sap/ui/thirdparty/unorm.js +0 -1
  700. package/src/sap/ui/thirdparty/unormdata.js +0 -1
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * OpenUI5
3
- * (c) Copyright 2009-2021 SAP SE or an SAP affiliate company.
3
+ * (c) Copyright 2009-2022 SAP SE or an SAP affiliate company.
4
4
  * Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
5
5
  */
6
6
 
@@ -35,6 +35,7 @@ sap.ui.define([
35
35
  mSupportedEvents = {
36
36
  AggregatedDataStateChange : true,
37
37
  change : true,
38
+ createActivate : true,
38
39
  createCompleted : true,
39
40
  createSent : true,
40
41
  dataReceived : true,
@@ -68,15 +69,15 @@ sap.ui.define([
68
69
  * @author SAP SE
69
70
  * @class List binding for an OData V4 model.
70
71
  * An event handler can only be attached to this binding for the following events:
71
- * 'AggregatedDataStateChange', 'change', 'createCompleted', 'createSent', 'dataReceived',
72
- * 'dataRequested', 'DataStateChange', 'patchCompleted', 'patchSent', and 'refresh'. For
73
- * other events, an error is thrown.
72
+ * 'AggregatedDataStateChange', 'change', 'createActivate', 'createCompleted', 'createSent',
73
+ * 'dataReceived', 'dataRequested', 'DataStateChange', 'patchCompleted', 'patchSent', and
74
+ * 'refresh'. For other events, an error is thrown.
74
75
  * @extends sap.ui.model.ListBinding
75
76
  * @hideconstructor
76
77
  * @mixes sap.ui.model.odata.v4.ODataParentBinding
77
78
  * @public
78
79
  * @since 1.37.0
79
- * @version 1.96.2
80
+ * @version 1.98.0
80
81
  * @borrows sap.ui.model.odata.v4.ODataBinding#getGroupId as #getGroupId
81
82
  * @borrows sap.ui.model.odata.v4.ODataBinding#getRootBinding as #getRootBinding
82
83
  * @borrows sap.ui.model.odata.v4.ODataBinding#getUpdateGroupId as #getUpdateGroupId
@@ -110,10 +111,13 @@ sap.ui.define([
110
111
  this.checkBindingParameters(mParameters, ["$$aggregation", "$$canonicalPath",
111
112
  "$$groupId", "$$operationMode", "$$ownRequest", "$$patchWithoutSideEffects",
112
113
  "$$sharedRequest", "$$updateGroupId"]);
114
+ // number of active (client-side) created contexts in aContexts
115
+ this.iActiveContexts = 0;
113
116
  this.aApplicationFilters = _Helper.toArray(vFilters);
114
117
  this.sChangeReason = oModel.bAutoExpandSelect && !mParameters.$$aggregation
115
118
  ? "AddVirtualContext"
116
119
  : undefined;
120
+ this.iCreatedContexts = 0; // number of (client-side) created contexts in aContexts
117
121
  this.oDiff = undefined;
118
122
  this.aFilters = [];
119
123
  this.sGroupId = mParameters.$$groupId;
@@ -122,6 +126,14 @@ sap.ui.define([
122
126
  ? null
123
127
  : Context.createNewContext(oModel, this, sPath);
124
128
  this.sOperationMode = mParameters.$$operationMode || oModel.sOperationMode;
129
+ // map<string,sap.ui.model.odata.v4.Context>
130
+ // Maps a string path to a v4.Context with that path. A context may either be
131
+ // - an element of this.aContexts (then it knows its index) or
132
+ // - a value of this.mPreviousContextsByPath.
133
+ // Contexts which have previously been part of this.aContexts are parked here for
134
+ // reuse (and thus still remember their index) and get destroyed by
135
+ // #destroyPreviousContexts after the next call to #createContexts.
136
+ // A kept-alive context may be parked here for a longer time, with undefined index.
125
137
  this.mPreviousContextsByPath = {};
126
138
  this.aPreviousData = [];
127
139
  this.bSharedRequest = mParameters.$$sharedRequest || oModel.bSharedRequests;
@@ -147,6 +159,32 @@ sap.ui.define([
147
159
 
148
160
  asODataParentBinding(ODataListBinding.prototype);
149
161
 
162
+ /**
163
+ * Attach event handler <code>fnFunction</code> to the 'createActivate' event of this binding.
164
+ *
165
+ * @param {function} fnFunction The function to call when the event occurs
166
+ * @param {object} [oListener] Object on which to call the given function
167
+ *
168
+ * @public
169
+ * @since 1.98.0
170
+ */
171
+ ODataListBinding.prototype.attachCreateActivate = function (fnFunction, oListener) {
172
+ this.attachEvent("createActivate", fnFunction, oListener);
173
+ };
174
+
175
+ /**
176
+ * Detach event handler <code>fnFunction</code> from the 'createActivate' event of this binding.
177
+ *
178
+ * @param {function} fnFunction The function to call when the event occurs
179
+ * @param {object} [oListener] Object on which to call the given function
180
+ *
181
+ * @public
182
+ * @since 1.98.0
183
+ */
184
+ ODataListBinding.prototype.detachCreateActivate = function (fnFunction, oListener) {
185
+ this.detachEvent("createActivate", fnFunction, oListener);
186
+ };
187
+
150
188
  /**
151
189
  * Attach event handler <code>fnFunction</code> to the 'createCompleted' event of this binding.
152
190
  *
@@ -204,24 +242,32 @@ sap.ui.define([
204
242
  /**
205
243
  * Deletes the entity identified by the edit URL.
206
244
  *
207
- * @param {sap.ui.model.odata.v4.lib._GroupLock} oGroupLock
208
- * A lock for the group ID to be used for the DELETE request; if no group ID is specified, it
209
- * defaults to <code>getUpdateGroupId()</code>()
245
+ * @param {sap.ui.model.odata.v4.lib._GroupLock} [oGroupLock]
246
+ * A lock for the group ID to be used for the DELETE request; w/o a lock, no DELETE is sent.
247
+ * For a transient entity, the lock is ignored (use NULL)!
210
248
  * @param {string} sEditUrl
211
- * The edit URL to be used for the DELETE request
249
+ * The entity's edit URL to be used for the DELETE request; w/o a lock, this is mostly
250
+ * ignored.
212
251
  * @param {sap.ui.model.odata.v4.Context} oContext
213
252
  * The context to be deleted
214
253
  * @param {object} [oETagEntity]
215
254
  * An entity with the ETag of the binding for which the deletion was requested. This is
216
255
  * provided if the deletion is delegated from a context binding with empty path to a list
217
- * binding.
256
+ * binding. W/o a lock, this is ignored.
257
+ * @param {boolean} [bDoNotRequestCount]
258
+ * Whether not to request the new count from the server; useful in case of
259
+ * {@link sap.ui.model.odata.v4.Context#replaceWith} where it is known that the count remains
260
+ * unchanged; w/o a lock this should be true
218
261
  * @returns {Promise}
219
262
  * A promise which is resolved without a result in case of success, or rejected with an
220
263
  * instance of <code>Error</code> in case of failure.
264
+ * @throws {Error}
265
+ * If the cache promise for this binding is not yet fulfilled, or if the cache is shared
221
266
  *
222
267
  * @private
223
268
  */
224
- ODataListBinding.prototype._delete = function (oGroupLock, sEditUrl, oContext, oETagEntity) {
269
+ ODataListBinding.prototype._delete = function (oGroupLock, sEditUrl, oContext, oETagEntity,
270
+ bDoNotRequestCount) {
225
271
  var bDestroy,
226
272
  bFireChange = false,
227
273
  sPath = oContext.iIndex === undefined
@@ -231,7 +277,7 @@ sap.ui.define([
231
277
  bReadCount = false,
232
278
  that = this;
233
279
 
234
- return this.deleteFromCache(oGroupLock, sEditUrl, sPath, oETagEntity,
280
+ return this.deleteFromCache(oGroupLock, sEditUrl, sPath, oETagEntity, bDoNotRequestCount,
235
281
  function (iIndex, aEntities) {
236
282
  var sContextPath, sPredicate, sResolvedPath, i$skipIndex, i;
237
283
 
@@ -241,7 +287,7 @@ sap.ui.define([
241
287
  }
242
288
  if (oContext.created()) {
243
289
  // happens only for a created context that is not transient anymore
244
- that.destroyCreated(oContext, true);
290
+ that.destroyCreated(oContext);
245
291
  bFireChange = true;
246
292
  } else if (iIndex >= 0) {
247
293
  // prepare all contexts for deletion
@@ -288,7 +334,8 @@ sap.ui.define([
288
334
 
289
335
  if (bReadCount) {
290
336
  that.iMaxLength = that.fetchValue("$count", undefined, true).getResult()
291
- - that.iCreatedContexts;
337
+ - that.iActiveContexts;
338
+
292
339
  // Note: Although we know that oContext is not in aContexts, a "change" event needs
293
340
  // to be fired in order to notify the control about the new length, for example, to
294
341
  // update the 'More' button or the scrollbar.
@@ -437,6 +484,18 @@ sap.ui.define([
437
484
  * @since 1.37.0
438
485
  */
439
486
 
487
+ /**
488
+ * The 'createActivate' event is fired when a property is changed on a context in an 'inactive'
489
+ * state (see {@link #create}). The context then changes its state to 'transient'.
490
+ *
491
+ * @param {sap.ui.base.Event} oEvent The event object
492
+ * @param {sap.ui.model.odata.v4.ODataListBinding} oEvent.getSource() This binding
493
+ *
494
+ * @event sap.ui.model.odata.v4.ODataListBinding#createActivate
495
+ * @public
496
+ * @since 1.98.0
497
+ */
498
+
440
499
  /**
441
500
  * The 'createCompleted' event is fired when the back end has responded to a POST request
442
501
  * triggered for a {@link #create} on this binding. For each 'createSent' event, a
@@ -627,6 +686,9 @@ sap.ui.define([
627
686
  if (this.mParameters.$$aggregation) {
628
687
  throw new Error("Unsupported $$aggregation at " + this);
629
688
  }
689
+ if (this.bSharedRequest) {
690
+ throw new Error("Unsupported $$sharedRequest at " + this);
691
+ }
630
692
  };
631
693
 
632
694
  /**
@@ -645,7 +707,8 @@ sap.ui.define([
645
707
  iCount = this.oCache.collapse(
646
708
  _Helper.getRelativePath(oContext.getPath(), this.oHeaderContext.getPath())),
647
709
  iModelIndex = oContext.getModelIndex(),
648
- i, that = this;
710
+ i,
711
+ that = this;
649
712
 
650
713
  if (iCount > 0) {
651
714
  aContexts.splice(iModelIndex + 1, iCount).forEach(function (oContext) {
@@ -719,22 +782,36 @@ sap.ui.define([
719
782
  * @param {boolean} [bAtEnd]
720
783
  * Whether the entity is inserted at the end of the list. When creating multiple entities,
721
784
  * this parameter must have the same value for each entity. Supported since 1.66.0
785
+ * @param {boolean} [bInactive]
786
+ * Create an inactive context. Such a context will only be sent to the server after the first
787
+ * property update. From then on it behaves like any other created context. This parameter is
788
+ * experimental and its implementation may still change. Do not use it in productive code yet.
789
+ * Supported since 1.97.0
722
790
  * @returns {sap.ui.model.odata.v4.Context}
723
791
  * The context object for the created entity; its method
724
792
  * {@link sap.ui.model.odata.v4.Context#created} returns a promise that is resolved when the
725
793
  * creation is finished
726
- * @throws {Error}
727
- * If the binding's root binding is suspended, if a relative binding is unresolved, if
728
- * entities are created both at the start and at the end, or if <code>bAtEnd</code> is
729
- * <code>true</code> and the binding does not know the final length.
730
- *
794
+ * @throws {Error} If
795
+ * <ul>
796
+ * <li> the binding's root binding is suspended,
797
+ * <li> a relative binding is unresolved,
798
+ * <li> entities are created both at the start and at the end,
799
+ * <li> <code>bAtEnd</code> is <code>true</code> and the binding does not know the final
800
+ * length,
801
+ * <li> <code>bInactive</code> is <code>true</code> and the update group ID does not have
802
+ * {@link sap.ui.model.odata.v4.SubmitMode.Auto}.
803
+ * <li> <code>bInactive</code> is <code>true</code>, the list binding is relative and does
804
+ * not use the <code>$$ownRequest</code> parameter
805
+ * (see {@link sap.ui.model.odata.v4.ODataModel#bindList})
806
+ * </ul>
731
807
  * @public
732
808
  * @since 1.43.0
733
809
  */
734
- ODataListBinding.prototype.create = function (oInitialData, bSkipRefresh, bAtEnd) {
810
+ ODataListBinding.prototype.create = function (oInitialData, bSkipRefresh, bAtEnd, bInactive) {
735
811
  var oContext,
736
812
  oCreatePathPromise = this.fetchResourcePath(),
737
813
  oCreatePromise,
814
+ sGroupId = this.getUpdateGroupId(),
738
815
  oGroupLock,
739
816
  sResolvedPath = this.getResolvedPath(),
740
817
  sTransientPredicate = "($uid=" + uid() + ")",
@@ -755,11 +832,25 @@ sap.ui.define([
755
832
  if (this.bCreatedAtEnd !== undefined && this.bCreatedAtEnd !== bAtEnd) {
756
833
  throw new Error("Creating entities at the start and at the end is not supported.");
757
834
  }
835
+
836
+ if (bInactive) {
837
+ if (this.isRelative() && !this.mParameters.$$ownRequest) {
838
+ throw new Error("Missing $$ownRequest at " + this);
839
+ }
840
+ if (!this.oModel.isAutoGroup(sGroupId)) {
841
+ throw new Error("bInactive only supported for update group with SubmitMode.Auto: "
842
+ + this);
843
+ }
844
+ sGroupId = "$inactive." + sGroupId;
845
+ } else {
846
+ this.iActiveContexts += 1;
847
+ }
848
+
758
849
  this.bCreatedAtEnd = bAtEnd;
759
850
 
760
851
  // only for createInCache
761
- oGroupLock = this.lockGroup(undefined, true, true, function () {
762
- that.destroyCreated(oContext, true);
852
+ oGroupLock = this.lockGroup(sGroupId, true, true, function () {
853
+ that.destroyCreated(oContext);
763
854
  return Promise.resolve().then(function () {
764
855
  // Fire the change asynchronously so that Cache#delete is finished and #getContexts
765
856
  // can read the data synchronously. This is important for extended change detection.
@@ -806,7 +897,7 @@ sap.ui.define([
806
897
 
807
898
  this.iCreatedContexts += 1;
808
899
  oContext = Context.create(this.oModel, this, sTransientPath, -this.iCreatedContexts,
809
- oCreatePromise);
900
+ oCreatePromise, bInactive);
810
901
  this.aContexts.unshift(oContext);
811
902
  this._fireChange({reason : ChangeReason.Add});
812
903
 
@@ -840,7 +931,8 @@ sap.ui.define([
840
931
  sPredicate,
841
932
  aPreviousPaths,
842
933
  bStartBeyondRange = iStart > this.aContexts.length,
843
- i, that = this;
934
+ i,
935
+ that = this;
844
936
 
845
937
  /*
846
938
  * Shrinks contexts to the new length, destroys unneeded contexts
@@ -877,7 +969,9 @@ sap.ui.define([
877
969
  // reuse the previous context, unless it is created and persisted
878
970
  delete this.mPreviousContextsByPath[sContextPath];
879
971
  if (oContext.isTransient() && !this.iCreatedContexts) {
880
- this.iCreatedContexts = -oContext.iIndex;
972
+ // this can only happen in bindings w/o cache, where all created contexts
973
+ // are active
974
+ this.iCreatedContexts = this.iActiveContexts = -oContext.iIndex;
881
975
  } else {
882
976
  oContext.iIndex = i$skipIndex;
883
977
  }
@@ -895,7 +989,7 @@ sap.ui.define([
895
989
  }
896
990
  if (iCount !== undefined) { // server count is available or "non-empty short read"
897
991
  this.bLengthFinal = true;
898
- this.iMaxLength = iCount - this.iCreatedContexts;
992
+ this.iMaxLength = iCount - this.iActiveContexts;
899
993
  shrinkContexts();
900
994
  } else {
901
995
  if (!aResults.length) { // "empty short read"
@@ -955,21 +1049,22 @@ sap.ui.define([
955
1049
  };
956
1050
 
957
1051
  /**
958
- * Removes the given context for a created entity from the list of contexts and destroys it.
1052
+ * Removes the given context for a created entity from the list of contexts and destroys it
1053
+ * later so that the control has time to handle the context's dependent bindings before.
959
1054
  *
960
1055
  * @param {sap.ui.model.odata.v4.Context} oContext
961
1056
  * The context instance for the created entity to be destroyed
962
- * @param {boolean} bDestroyLater
963
- * Whether to destroy the context later so that the control has time to handle the context's
964
- * dependent bindings before.
965
1057
  *
966
1058
  * @private
967
1059
  */
968
- ODataListBinding.prototype.destroyCreated = function (oContext, bDestroyLater) {
1060
+ ODataListBinding.prototype.destroyCreated = function (oContext) {
969
1061
  var iIndex = oContext.getModelIndex(),
970
1062
  i;
971
1063
 
972
1064
  this.iCreatedContexts -= 1;
1065
+ if (!oContext.isInactive()) {
1066
+ this.iActiveContexts -= 1;
1067
+ }
973
1068
  for (i = 0; i < iIndex; i += 1) {
974
1069
  this.aContexts[i].iIndex += 1;
975
1070
  }
@@ -977,7 +1072,22 @@ sap.ui.define([
977
1072
  this.bCreatedAtEnd = undefined;
978
1073
  }
979
1074
  this.aContexts.splice(iIndex, 1);
980
- if (bDestroyLater && this.iCurrentEnd) {
1075
+ this.destroyLater(oContext);
1076
+ // The path of all contexts in aContexts after the removed one is untouched, still points to
1077
+ // the same data, hence no checkUpdate is needed.
1078
+ };
1079
+
1080
+ /**
1081
+ * Destroys the given context later so that the control has time to handle the context's
1082
+ * dependent bindings before.
1083
+ *
1084
+ * @param {sap.ui.model.odata.v4.Context} oContext
1085
+ * The context instance to be destroyed
1086
+ *
1087
+ * @private
1088
+ */
1089
+ ODataListBinding.prototype.destroyLater = function (oContext) {
1090
+ if (this.iCurrentEnd) {
981
1091
  // Add the context to mPreviousContextsByPath although it definitely won't be reused.
982
1092
  // Then it is destroyed later, but only if there is a listener (iCurrentEnd is set by
983
1093
  // getContexts and mPreviousContextsByPath is only cleared when getContexts is called)
@@ -985,8 +1095,6 @@ sap.ui.define([
985
1095
  } else {
986
1096
  oContext.destroy();
987
1097
  }
988
- // The path of all contexts in aContexts after the removed one is untouched, still points to
989
- // the same data, hence no checkUpdate is needed.
990
1098
  };
991
1099
 
992
1100
  /**
@@ -1022,10 +1130,45 @@ sap.ui.define([
1022
1130
  * @see sap.ui.model.odata.v4.ODataBinding#doCreateCache
1023
1131
  */
1024
1132
  ODataListBinding.prototype.doCreateCache = function (sResourcePath, mQueryOptions, oContext,
1025
- sDeepResourcePath) {
1026
- return _AggregationCache.create(this.oModel.oRequestor, sResourcePath, sDeepResourcePath,
1133
+ sDeepResourcePath, bOldCacheReadOnly, oOldCache) {
1134
+ var sBindingPath,
1135
+ aKeptElementPaths,
1136
+ oCache,
1137
+ that = this;
1138
+
1139
+ if (oOldCache && oOldCache.getResourcePath() === sResourcePath
1140
+ && oOldCache.$deepResourcePath === sDeepResourcePath) {
1141
+ sBindingPath = this.oHeaderContext.getPath();
1142
+ aKeptElementPaths = Object.keys(this.mPreviousContextsByPath).filter(function (sPath) {
1143
+ return that.mPreviousContextsByPath[sPath].isKeepAlive();
1144
+ });
1145
+
1146
+ if (!bOldCacheReadOnly && (aKeptElementPaths.length || this.iCreatedContexts)) {
1147
+ oOldCache.reset(aKeptElementPaths.map(function (sPath) {
1148
+ return _Helper.getRelativePath(sPath, sBindingPath);
1149
+ }));
1150
+ // Note: #inheritQueryOptions as called below should not matter in case of own
1151
+ // requests, which are a precondition for kept-alive elements
1152
+ oOldCache.setQueryOptions(mQueryOptions, true);
1153
+
1154
+ return oOldCache;
1155
+ }
1156
+ }
1157
+
1158
+ oCache = _AggregationCache.create(this.oModel.oRequestor, sResourcePath, sDeepResourcePath,
1027
1159
  this.mParameters.$$aggregation, this.inheritQueryOptions(mQueryOptions, oContext),
1028
1160
  this.oModel.bAutoExpandSelect, this.bSharedRequest);
1161
+
1162
+ if (aKeptElementPaths && aKeptElementPaths.length) {
1163
+ oCache.setLateQueryOptions(oOldCache.getLateQueryOptions());
1164
+ aKeptElementPaths.forEach(function (sPath) {
1165
+ oCache.addKeptElement(
1166
+ oOldCache.getValue(_Helper.getRelativePath(sPath, sBindingPath)));
1167
+ that.mPreviousContextsByPath[sPath].checkUpdate(); // add change listeners
1168
+ });
1169
+ }
1170
+
1171
+ return oCache;
1029
1172
  };
1030
1173
 
1031
1174
  /**
@@ -1043,6 +1186,65 @@ sap.ui.define([
1043
1186
  });
1044
1187
  };
1045
1188
 
1189
+ /**
1190
+ * Replaces the given old context with a new one for the given element and key predicate,
1191
+ * placing the new one at the same index and returning it. If a context for the given key
1192
+ * predicate already exists, it is reused. A newly created context will be kept-alive if the old
1193
+ * context was, and then it will share the <code>fnOnBeforeDestroy</code> method - but it will
1194
+ * be called with the new context as first argument.
1195
+ *
1196
+ * @param {sap.ui.model.odata.v4.Context} oOldContext - The old context
1197
+ * @param {object} oElement - The element data
1198
+ * @param {string} sPredicate - The key predicate
1199
+ * @returns {sap.ui.model.odata.v4.Context} - The new context
1200
+ * @throws {Error} If a reused context is already part of the collection (has an index), except
1201
+ * if it is the same instance as the given old context
1202
+ *
1203
+ * @private
1204
+ */
1205
+ ODataListBinding.prototype.doReplaceWith = function (oOldContext, oElement, sPredicate) {
1206
+ var iIndex = oOldContext.iIndex,
1207
+ bKeepAlive = oOldContext.isKeepAlive(),
1208
+ bNew,
1209
+ fnOnBeforeDestroy = oOldContext.fnOnBeforeDestroy,
1210
+ fnOnBeforeDestroyClone,
1211
+ sPath = this.oHeaderContext.getPath() + sPredicate,
1212
+ oResult = this.mPreviousContextsByPath[sPath];
1213
+
1214
+ if (oResult) {
1215
+ if (oResult === oOldContext) {
1216
+ return oResult; // shortcut
1217
+ }
1218
+ if (oResult.iIndex !== undefined) {
1219
+ throw new Error("Unexpected index: " + oResult);
1220
+ }
1221
+ oResult.iIndex = iIndex;
1222
+ delete this.mPreviousContextsByPath[sPath];
1223
+ } else {
1224
+ oResult = Context.create(this.oModel, this, sPath, iIndex);
1225
+ bNew = true;
1226
+ }
1227
+ oOldContext.iIndex = undefined;
1228
+ this.aContexts[iIndex] = oResult;
1229
+ this.oCache.doReplaceWith(iIndex, oElement);
1230
+ if (bKeepAlive) {
1231
+ this.mPreviousContextsByPath[oOldContext.getPath()] = oOldContext;
1232
+ if (bNew) {
1233
+ if (fnOnBeforeDestroy) {
1234
+ fnOnBeforeDestroyClone
1235
+ = (fnOnBeforeDestroy.$original || fnOnBeforeDestroy).bind(null, oResult);
1236
+ fnOnBeforeDestroyClone.$original = fnOnBeforeDestroy;
1237
+ }
1238
+ oResult.setKeepAlive(true, fnOnBeforeDestroyClone);
1239
+ }
1240
+ } else {
1241
+ this.destroyLater(oOldContext);
1242
+ }
1243
+ this._fireChange({reason : ChangeReason.Change});
1244
+
1245
+ return oResult;
1246
+ };
1247
+
1046
1248
  /**
1047
1249
  * @override
1048
1250
  * @see sap.ui.model.odata.v4.ODataParentBinding#doSetProperty
@@ -1055,7 +1257,7 @@ sap.ui.define([
1055
1257
  * @param {sap.ui.model.odata.v4.Context} oContext
1056
1258
  * The context corresponding to the group node
1057
1259
  * @returns {sap.ui.base.SyncPromise}
1058
- * A promise that is resolved when the expand is succesful and rejected when it fails
1260
+ * A promise that is resolved when the expand is successful and rejected when it fails
1059
1261
  * @throws {Error}
1060
1262
  * If the binding's root binding is suspended
1061
1263
  *
@@ -1107,43 +1309,6 @@ sap.ui.define([
1107
1309
  });
1108
1310
  };
1109
1311
 
1110
- /**
1111
- * Creates a cache for this binding if a cache is needed and updates <code>oCachePromise</code>.
1112
- * Copies the data for kept-alive contexts and the late query options from the old cache to the
1113
- * new one.
1114
- *
1115
- * @private
1116
- */
1117
- // @override sap.ui.model.odata.v4.ODataBinding#fetchCache
1118
- ODataListBinding.prototype.fetchCache = function () {
1119
- var oOldCache = this.oCache,
1120
- sBindingPath = this.getResolvedPath(),
1121
- bKeptDataAdded,
1122
- that = this;
1123
-
1124
- asODataParentBinding.prototype.fetchCache.apply(this, arguments);
1125
-
1126
- if (oOldCache) {
1127
- this.oCachePromise.then(function (oCache) {
1128
- Object.keys(that.mPreviousContextsByPath).forEach(function (sPath) {
1129
- var oContext = that.mPreviousContextsByPath[sPath];
1130
-
1131
- if (oContext.isKeepAlive()) {
1132
- // either absolute or $$ownRequest === true
1133
- // ->has own cache, see #checkKeepAlive
1134
- oCache.addKeptElement(
1135
- oOldCache.getValue(_Helper.getRelativePath(sPath, sBindingPath)));
1136
- oContext.checkUpdate(); // add change listeners
1137
- bKeptDataAdded = true;
1138
- }
1139
- });
1140
- if (bKeptDataAdded) {
1141
- oCache.setLateQueryOptions(oOldCache.getLateQueryOptions());
1142
- }
1143
- }); // no catch; if the new cache can't be created, data for kept-alive contexts is lost
1144
- }
1145
- };
1146
-
1147
1312
  /**
1148
1313
  * Fetches the data and creates contexts for the given range.
1149
1314
  *
@@ -1325,32 +1490,32 @@ sap.ui.define([
1325
1490
  sValue = setCase(_Helper.formatLiteral(oFilter.oValue1, sEdmType));
1326
1491
 
1327
1492
  switch (oFilter.sOperator) {
1328
- case FilterOperator.BT :
1493
+ case FilterOperator.BT:
1329
1494
  sFilter = sFilterPath + " ge " + sValue + " and " + sFilterPath + " le "
1330
1495
  + setCase(_Helper.formatLiteral(oFilter.oValue2, sEdmType));
1331
1496
  break;
1332
- case FilterOperator.NB :
1497
+ case FilterOperator.NB:
1333
1498
  sFilter = wrap(sFilterPath + " lt " + sValue + " or " + sFilterPath + " gt "
1334
1499
  + setCase(_Helper.formatLiteral(oFilter.oValue2, sEdmType)), bWithinAnd);
1335
1500
  break;
1336
- case FilterOperator.EQ :
1337
- case FilterOperator.GE :
1338
- case FilterOperator.GT :
1339
- case FilterOperator.LE :
1340
- case FilterOperator.LT :
1341
- case FilterOperator.NE :
1501
+ case FilterOperator.EQ:
1502
+ case FilterOperator.GE:
1503
+ case FilterOperator.GT:
1504
+ case FilterOperator.LE:
1505
+ case FilterOperator.LT:
1506
+ case FilterOperator.NE:
1342
1507
  sFilter = sFilterPath + " " + oFilter.sOperator.toLowerCase() + " " + sValue;
1343
1508
  break;
1344
- case FilterOperator.Contains :
1345
- case FilterOperator.EndsWith :
1346
- case FilterOperator.NotContains :
1347
- case FilterOperator.NotEndsWith :
1348
- case FilterOperator.NotStartsWith :
1349
- case FilterOperator.StartsWith :
1509
+ case FilterOperator.Contains:
1510
+ case FilterOperator.EndsWith:
1511
+ case FilterOperator.NotContains:
1512
+ case FilterOperator.NotEndsWith:
1513
+ case FilterOperator.NotStartsWith:
1514
+ case FilterOperator.StartsWith:
1350
1515
  sFilter = oFilter.sOperator.toLowerCase().replace("not", "not ")
1351
1516
  + "(" + sFilterPath + "," + sValue + ")";
1352
1517
  break;
1353
- default :
1518
+ default:
1354
1519
  throw new Error("Unsupported operator: " + oFilter.sOperator);
1355
1520
  }
1356
1521
  return sFilter;
@@ -1499,10 +1664,11 @@ sap.ui.define([
1499
1664
  };
1500
1665
 
1501
1666
  /**
1502
- * Filters the list with the given filters.
1667
+ * Filters the list with the given filters. Since 1.97.0, if filters are unchanged, no request
1668
+ * is sent, regardless of pending changes.
1503
1669
  *
1504
- * If there are pending changes an error is thrown. Use {@link #hasPendingChanges} to check if
1505
- * there are pending changes. If there are changes, call
1670
+ * If there are pending changes that cannot be ignored, an error is thrown. Use
1671
+ * {@link #hasPendingChanges} to check if there are such pending changes. If there are, call
1506
1672
  * {@link sap.ui.model.odata.v4.ODataModel#submitBatch} to submit the changes or
1507
1673
  * {@link sap.ui.model.odata.v4.ODataModel#resetChanges} to reset the changes before calling
1508
1674
  * {@link #filter}.
@@ -1543,8 +1709,10 @@ sap.ui.define([
1543
1709
  * @returns {this}
1544
1710
  * <code>this</code> to facilitate method chaining
1545
1711
  * @throws {Error}
1546
- * If there are pending changes or if an unsupported operation mode is used (see
1547
- * {@link sap.ui.model.odata.v4.ODataModel#bindList})
1712
+ * If there are pending changes that cannot be ignored or if an unsupported operation mode is
1713
+ * used (see {@link sap.ui.model.odata.v4.ODataModel#bindList}). Since 1.97.0, pending changes
1714
+ * are ignored if they relate to a
1715
+ * {@link sap.ui.model.odata.v4.Context#setKeepAlive kept-alive} context of this binding.
1548
1716
  *
1549
1717
  * @public
1550
1718
  * @see sap.ui.model.ListBinding#filter
@@ -1553,17 +1721,25 @@ sap.ui.define([
1553
1721
  */
1554
1722
  // @override sap.ui.model.ListBinding#filter
1555
1723
  ODataListBinding.prototype.filter = function (vFilters, sFilterType) {
1724
+ var aFilters = _Helper.toArray(vFilters);
1725
+
1556
1726
  if (this.sOperationMode !== OperationMode.Server) {
1557
1727
  throw new Error("Operation mode has to be sap.ui.model.odata.OperationMode.Server");
1558
1728
  }
1559
- if (this.hasPendingChanges()) {
1729
+
1730
+ if (sFilterType === FilterType.Control && _Helper.deepEqual(aFilters, this.aFilters)
1731
+ || _Helper.deepEqual(aFilters, this.aApplicationFilters)) {
1732
+ return this;
1733
+ }
1734
+
1735
+ if (this.hasPendingChanges(true)) {
1560
1736
  throw new Error("Cannot filter due to pending changes");
1561
1737
  }
1562
1738
 
1563
1739
  if (sFilterType === FilterType.Control) {
1564
- this.aFilters = _Helper.toArray(vFilters);
1740
+ this.aFilters = aFilters;
1565
1741
  } else {
1566
- this.aApplicationFilters = _Helper.toArray(vFilters);
1742
+ this.aApplicationFilters = aFilters;
1567
1743
  }
1568
1744
 
1569
1745
  if (this.isRootBindingSuspended()) {
@@ -1583,6 +1759,40 @@ sap.ui.define([
1583
1759
  return this;
1584
1760
  };
1585
1761
 
1762
+ /**
1763
+ * Fires the 'createActivate' event.
1764
+ *
1765
+ * @param {sap.ui.model.odata.v4.Context} _oContext
1766
+ * The context being activated
1767
+ *
1768
+ * @private
1769
+ */
1770
+ ODataListBinding.prototype.fireCreateActivate = function (_oContext) {
1771
+ this.iActiveContexts += 1;
1772
+ this.fireEvent("createActivate");
1773
+ };
1774
+
1775
+ /**
1776
+ * Returns all current contexts of this list binding in no special order. Just like
1777
+ * {@link #getCurrentContexts}, this method does not request any data from a back end and does
1778
+ * not change the binding's state. In contrast to {@link #getCurrentContexts}, it does not only
1779
+ * return those contexts that were last requested by a control, but all contexts that are
1780
+ * currently available in the binding, including kept-alive contexts. To filter out kept-alive
1781
+ * contexts that are not part of the list, you could check whether the index is
1782
+ * <code>undefined</code>, as described in {@link sap.ui.model.odata.v4.Context#getIndex}.
1783
+ *
1784
+ * @returns {sap.ui.model.odata.v4.Context[]}
1785
+ * All current contexts of this list binding, in no special order
1786
+ *
1787
+ * @public
1788
+ * @since 1.98.0
1789
+ */
1790
+ ODataListBinding.prototype.getAllCurrentContexts = function () {
1791
+ return this.aContexts.filter(function (oContext) {
1792
+ return oContext;
1793
+ }).concat(Object.values(this.mPreviousContextsByPath));
1794
+ };
1795
+
1586
1796
  /**
1587
1797
  * Returns already created binding contexts for all entities in this list binding for the range
1588
1798
  * determined by the given start index <code>iStart</code> and <code>iLength</code>.
@@ -2112,7 +2322,7 @@ sap.ui.define([
2112
2322
  if (sOrderbyQueryOption) {
2113
2323
  aOrderbyOptions.push(sOrderbyQueryOption);
2114
2324
  }
2115
- return aOrderbyOptions.join(',');
2325
+ return aOrderbyOptions.join(",");
2116
2326
  };
2117
2327
 
2118
2328
  /**
@@ -2169,7 +2379,7 @@ sap.ui.define([
2169
2379
  if (this.oCache === undefined) {
2170
2380
  // as long as cache is not yet known there can be only changes caused by created
2171
2381
  // entities; sPath does not matter
2172
- return this.iCreatedContexts > 0;
2382
+ return this.iActiveContexts > 0;
2173
2383
  }
2174
2384
  return asODataParentBinding.prototype.hasPendingChangesForPath.apply(this, arguments);
2175
2385
  };
@@ -2298,7 +2508,8 @@ sap.ui.define([
2298
2508
  }
2299
2509
 
2300
2510
  // add the context binding's query options as late query options
2301
- if (!this.aggregateQueryOptions(mEntityQueryOptions, "", /*bImmutable*/true)) {
2511
+ if (!this.aggregateQueryOptions(mEntityQueryOptions, _Helper.getMetaPath(sEntityPath),
2512
+ /*bImmutable*/true)) {
2302
2513
  throw new Error(oEntityContext + ": could not move the entity. Probably a list binding"
2303
2514
  + " w/o $$ownRequest depends on it");
2304
2515
  }
@@ -2310,7 +2521,7 @@ sap.ui.define([
2310
2521
  oCache.addKeptElement(oEntity);
2311
2522
  // setKeepAlive looks into the cache, so this had to wait
2312
2523
  oEntityContext.setKeepAlive(true);
2313
- oEntityContext.checkUpdate(); // create listeners in this binding's cache
2524
+ oEntityContext.checkUpdate(); // create listeners in this binding's cache
2314
2525
  });
2315
2526
  };
2316
2527
 
@@ -2324,6 +2535,7 @@ sap.ui.define([
2324
2535
 
2325
2536
  function onRemove(sPredicate) {
2326
2537
  var sPath = that.getResolvedPath();
2538
+
2327
2539
  that.mPreviousContextsByPath[sPath + sPredicate].resetKeepAlive();
2328
2540
  }
2329
2541
 
@@ -2350,16 +2562,21 @@ sap.ui.define([
2350
2562
 
2351
2563
  this.createReadGroupLock(sGroupId, this.isRoot());
2352
2564
  return this.oCachePromise.then(function (oCache) {
2353
- var iCreatedContexts = that.iCreatedContexts,
2565
+ var iActiveContexts = that.iActiveContexts,
2566
+ iCreatedContexts = that.iCreatedContexts,
2354
2567
  aDependentBindings,
2355
2568
  oKeptElementsPromise,
2356
2569
  oPromise = that.oRefreshPromise;
2357
2570
 
2358
2571
  if (oCache && !oPromise) { // do not refresh twice
2359
2572
  that.removeCachesAndMessages(sResourcePathPrefix);
2360
- that.fetchCache(that.oContext, false, /*bKeepQueryOptions*/true);
2573
+ that.fetchCache(that.oContext, false, /*bKeepQueryOptions*/true, bKeepCacheOnError);
2361
2574
  oKeptElementsPromise = that.oCachePromise.then(function (oNewCache) {
2362
2575
  return oNewCache.refreshKeptElements(that.lockGroup(sGroupId), onRemove);
2576
+ }).catch(function (oError) {
2577
+ that.oModel.reportError("Failed to refresh kept-alive elements", sClassName,
2578
+ oError);
2579
+ throw oError;
2363
2580
  });
2364
2581
  if (that.iCurrentEnd > 0) {
2365
2582
  oPromise = that.createRefreshPromise().catch(function (oError) {
@@ -2370,6 +2587,7 @@ sap.ui.define([
2370
2587
  if (!that.bRelative || oCache.getResourcePath() === sResourcePath) {
2371
2588
  that.oCache = oCache;
2372
2589
  that.oCachePromise = SyncPromise.resolve(oCache);
2590
+ that.iActiveContexts = iActiveContexts;
2373
2591
  that.iCreatedContexts = iCreatedContexts;
2374
2592
  oCache.setActive(true);
2375
2593
  that._fireChange({reason : ChangeReason.Change});
@@ -2381,7 +2599,7 @@ sap.ui.define([
2381
2599
  }
2382
2600
  // Note: after reset the dependent bindings cannot be found any more
2383
2601
  aDependentBindings = that.getDependentBindings();
2384
- that.reset(ChangeReason.Refresh); // this may reset that.oRefreshPromise
2602
+ that.reset(ChangeReason.Refresh, true); // this may reset that.oRefreshPromise
2385
2603
  return SyncPromise.all(
2386
2604
  refreshAll(aDependentBindings).concat(oPromise, oKeptElementsPromise,
2387
2605
  // Update after refresh event, otherwise $count is fetched before the request
@@ -2498,7 +2716,7 @@ sap.ui.define([
2498
2716
  fireDataReceived({data : {}});
2499
2717
  oBinding.assertSameCache(oCache);
2500
2718
  if (!bDestroyed) { // do not update destroyed context
2501
- aUpdatePromises.push(oContext.checkUpdate());
2719
+ aUpdatePromises.push(oContext.checkUpdateInternal());
2502
2720
  if (bAllowRemoval) {
2503
2721
  aUpdatePromises.push(
2504
2722
  oContext.refreshDependentBindings(sResourcePathPrefix,
@@ -2653,7 +2871,7 @@ sap.ui.define([
2653
2871
  oMessage.getTargets().forEach(function (sTarget) {
2654
2872
  var sPredicate = sTarget.slice(sResolvedPath.length).split("/")[0];
2655
2873
 
2656
- if (!sPredicate.startsWith("($uid=")) {
2874
+ if (sPredicate && !sPredicate.startsWith("($uid=")) {
2657
2875
  mPredicates[sPredicate] = true;
2658
2876
  }
2659
2877
  });
@@ -2772,23 +2990,49 @@ sap.ui.define([
2772
2990
  * A change reason; if given, a refresh event with this reason is fired and the next
2773
2991
  * getContexts() fires a change event with this reason. Change reason "change" is ignored
2774
2992
  * as long as the binding is still empty.
2993
+ * @param {boolean} [bDropTransient]
2994
+ * Whether transient contexts shall also be dropped, not just created persisted ones
2775
2995
  *
2776
2996
  * @private
2777
2997
  */
2778
- ODataListBinding.prototype.reset = function (sChangeReason) {
2779
- var bEmpty = this.iCurrentEnd === 0,
2998
+ ODataListBinding.prototype.reset = function (sChangeReason, bDropTransient) {
2999
+ var oContext,
3000
+ bEmpty = this.iCurrentEnd === 0,
3001
+ iTransient = 0,
3002
+ i,
2780
3003
  that = this;
2781
3004
 
3005
+ if (bDropTransient) {
3006
+ this.iActiveContexts = 0;
3007
+ this.iCreatedContexts = 0;
3008
+ }
2782
3009
  if (this.aContexts) { // allow initial call from c'tor via #applyParameters
2783
- this.aContexts.forEach(function (oContext) {
3010
+ this.aContexts.slice(this.iCreatedContexts).forEach(function (oContext) {
2784
3011
  that.mPreviousContextsByPath[oContext.getPath()] = oContext;
2785
3012
  });
3013
+ for (i = 0; i < this.iCreatedContexts; i += 1) {
3014
+ oContext = this.aContexts[i];
3015
+ if (oContext.isTransient()) {
3016
+ this.aContexts[iTransient] = oContext;
3017
+ iTransient += 1;
3018
+ } else { // Note: "created persisted" elements must be active
3019
+ this.iActiveContexts -= 1;
3020
+ this.mPreviousContextsByPath[oContext.getPath()] = oContext;
3021
+ }
3022
+ }
3023
+ for (i = 0; i < iTransient; i += 1) {
3024
+ this.aContexts[i].iIndex = i - iTransient;
3025
+ }
3026
+ // Note: no strict need to keep the reference here
3027
+ this.aContexts.length = this.iCreatedContexts = iTransient;
3028
+ } else {
3029
+ this.aContexts = [];
3030
+ }
3031
+ if (!this.iCreatedContexts) {
3032
+ // true if contexts have been created at the end, false if contexts have been created at
3033
+ // the start, undefined if there are no created contexts
3034
+ this.bCreatedAtEnd = undefined;
2786
3035
  }
2787
- this.aContexts = [];
2788
- this.iCreatedContexts = 0; // number of (client-side) created contexts in aContexts
2789
- // true if contexts have been created at the end, false if contexts have been created at the
2790
- // start, undefined if there are no created contexts
2791
- this.bCreatedAtEnd = undefined;
2792
3036
  // the range of array indices for getCurrentContexts
2793
3037
  this.iCurrentBegin = this.iCurrentEnd = 0;
2794
3038
  // upper boundary for server-side list length (based on observations so far)
@@ -2846,7 +3090,8 @@ sap.ui.define([
2846
3090
  aBindings.forEach(function (oDependentBinding) {
2847
3091
  // do not call checkUpdate in dependent property bindings if the cache of this
2848
3092
  // binding is reset and the binding has not yet fired a change event
2849
- oDependentBinding.resumeInternal(!bRefresh, !!sResumeChangeReason);
3093
+ oDependentBinding.resumeInternal(!bRefresh,
3094
+ !!sResumeChangeReason && !oDependentBinding.oContext.isKeepAlive());
2850
3095
  });
2851
3096
  if (this.sChangeReason === "AddVirtualContext") {
2852
3097
  // In a refresh event the table would ignore the result -> no virtual context -> no
@@ -2931,10 +3176,13 @@ sap.ui.define([
2931
3176
  * separate row after all children, when a group level node is expanded (since 1.86.0);
2932
3177
  * <code>true</code> for bottom only, <code>false</code> for top and bottom, the default is
2933
3178
  * top only (that is, as part of the group level node)
2934
- * @throws {Error}
2935
- * If the given data aggregation object is unsupported, if the system query option
2936
- * <code>$apply</code> has been specified explicitly before, or if there are pending changes
2937
- *
3179
+ * @throws {Error} If
3180
+ * <ul>
3181
+ * <li> the given data aggregation object is unsupported,
3182
+ * <li> the <code>$apply</code> system query option has been specified explicitly before,
3183
+ * <li> the binding has a kept-alive context,
3184
+ * <li> there are pending changes
3185
+ * </ul>
2938
3186
  * @example <caption>First group level is product category including subtotals for the net
2939
3187
  * amount in display currency. On leaf level, transaction currency is used as an additional
2940
3188
  * dimension and the net amount is averaged.</caption>
@@ -2960,9 +3208,19 @@ sap.ui.define([
2960
3208
  ODataListBinding.prototype.setAggregation = function (oAggregation) {
2961
3209
  var mParameters;
2962
3210
 
3211
+ function hasKeptAliveContext(aContexts) {
3212
+ return aContexts.some(function (oContext) {
3213
+ return oContext && oContext.isKeepAlive();
3214
+ });
3215
+ }
3216
+
2963
3217
  if (this.hasPendingChanges()) {
2964
3218
  throw new Error("Cannot set $$aggregation due to pending changes");
2965
3219
  }
3220
+ if (hasKeptAliveContext(this.aContexts)
3221
+ || hasKeptAliveContext(Object.values(this.mPreviousContextsByPath))) {
3222
+ throw new Error("Cannot set $$aggregation due to a kept-alive context");
3223
+ }
2966
3224
 
2967
3225
  mParameters = Object.assign({}, this.mParameters);
2968
3226
  if (oAggregation === undefined) {
@@ -2989,7 +3247,8 @@ sap.ui.define([
2989
3247
  // @override sap.ui.model.Binding#setContext
2990
3248
  ODataListBinding.prototype.setContext = function (oContext) {
2991
3249
  var sResolvedPath,
2992
- i, that = this;
3250
+ i,
3251
+ that = this;
2993
3252
 
2994
3253
  if (this.oContext !== oContext) {
2995
3254
  if (this.bRelative) {
@@ -3048,10 +3307,11 @@ sap.ui.define([
3048
3307
  /**
3049
3308
  * Sort the entries represented by this list binding according to the given sorters.
3050
3309
  * The sorters are stored at this list binding and they are used for each following data
3051
- * request.
3310
+ * request. Since 1.97.0, if sorters are unchanged, no request is sent, regardless of pending
3311
+ * changes.
3052
3312
  *
3053
- * If there are pending changes an error is thrown. Use {@link #hasPendingChanges} to check if
3054
- * there are pending changes. If there are changes, call
3313
+ * If there are pending changes that cannot be ignored, an error is thrown. Use
3314
+ * {@link #hasPendingChanges} to check if there are such pending changes. If there are, call
3055
3315
  * {@link sap.ui.model.odata.v4.ODataModel#submitBatch} to submit the changes or
3056
3316
  * {@link sap.ui.model.odata.v4.ODataModel#resetChanges} to reset the changes before calling
3057
3317
  * {@link #sort}.
@@ -3064,8 +3324,10 @@ sap.ui.define([
3064
3324
  * @returns {this}
3065
3325
  * <code>this</code> to facilitate method chaining
3066
3326
  * @throws {Error}
3067
- * If there are pending changes or if an unsupported operation mode is used (see
3068
- * {@link sap.ui.model.odata.v4.ODataModel#bindList}).
3327
+ * If there are pending changes that cannot be ignored or if an unsupported operation mode is
3328
+ * used (see {@link sap.ui.model.odata.v4.ODataModel#bindList}). Since 1.97.0, pending changes
3329
+ * are ignored if they relate to a
3330
+ * {@link sap.ui.model.odata.v4.Context#setKeepAlive kept-alive} context of this binding.
3069
3331
  *
3070
3332
  * @public
3071
3333
  * @see sap.ui.model.ListBinding#sort
@@ -3073,14 +3335,21 @@ sap.ui.define([
3073
3335
  */
3074
3336
  // @override sap.ui.model.ListBinding#sort
3075
3337
  ODataListBinding.prototype.sort = function (vSorters) {
3338
+ var aSorters = _Helper.toArray(vSorters);
3339
+
3076
3340
  if (this.sOperationMode !== OperationMode.Server) {
3077
3341
  throw new Error("Operation mode has to be sap.ui.model.odata.OperationMode.Server");
3078
3342
  }
3079
- if (this.hasPendingChanges()) {
3343
+
3344
+ if (_Helper.deepEqual(aSorters, this.aSorters)) {
3345
+ return this;
3346
+ }
3347
+
3348
+ if (this.hasPendingChanges(true)) {
3080
3349
  throw new Error("Cannot sort due to pending changes");
3081
3350
  }
3082
3351
 
3083
- this.aSorters = _Helper.toArray(vSorters);
3352
+ this.aSorters = aSorters;
3084
3353
 
3085
3354
  if (this.isRootBindingSuspended()) {
3086
3355
  this.setResumeChangeReason(ChangeReason.Sort);
@@ -3138,7 +3407,7 @@ sap.ui.define([
3138
3407
  * @param {string} [aAggregation[].as]
3139
3408
  * Measures only: The alias, that is the name of the dynamic property used for aggregation of
3140
3409
  * this measure; see "3.1.1 Keyword as" (since 1.55.0)
3141
- * @returns {object}
3410
+ * @returns {object|undefined}
3142
3411
  * The return object contains a property <code>measureRangePromise</code> if and only if at
3143
3412
  * least one measure has requested a minimum or maximum value; its value is a
3144
3413
  * promise which resolves with the measure range map as soon as data has been received; the