@openui5/sap.ui.core 1.103.0 → 1.105.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 (360) hide show
  1. package/.reuse/dep5 +18 -1
  2. package/LICENSES/LicenseRef-tzdata-PublicDomain.txt +5 -0
  3. package/THIRDPARTY.txt +36 -3
  4. package/package.json +1 -1
  5. package/src/jquery.sap.global.js +1 -1
  6. package/src/jquery.sap.properties.js +1 -1
  7. package/src/jquery.sap.resources.js +1 -1
  8. package/src/jquery.sap.script.js +1 -1
  9. package/src/jquery.sap.storage.js +3 -3
  10. package/src/sap/base/util/LoaderExtensions.js +69 -61
  11. package/src/sap/base/util/fetch.js +230 -0
  12. package/src/sap/base/util/mixedFetch.js +69 -0
  13. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  14. package/src/sap/base/util/restricted/_castArray.js +1 -1
  15. package/src/sap/base/util/restricted/_compact.js +1 -1
  16. package/src/sap/base/util/restricted/_curry.js +1 -1
  17. package/src/sap/base/util/restricted/_debounce.js +1 -1
  18. package/src/sap/base/util/restricted/_difference.js +1 -1
  19. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  20. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  21. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  22. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  23. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  24. package/src/sap/base/util/restricted/_flatten.js +1 -1
  25. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  26. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  27. package/src/sap/base/util/restricted/_intersection.js +1 -1
  28. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  29. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  30. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  31. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  32. package/src/sap/base/util/restricted/_isNil.js +1 -1
  33. package/src/sap/base/util/restricted/_max.js +1 -1
  34. package/src/sap/base/util/restricted/_merge.js +1 -1
  35. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  36. package/src/sap/base/util/restricted/_min.js +1 -1
  37. package/src/sap/base/util/restricted/_omit.js +1 -1
  38. package/src/sap/base/util/restricted/_pick.js +1 -1
  39. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  40. package/src/sap/base/util/restricted/_throttle.js +1 -1
  41. package/src/sap/base/util/restricted/_toArray.js +1 -1
  42. package/src/sap/base/util/restricted/_union.js +1 -1
  43. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  44. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  45. package/src/sap/base/util/restricted/_uniq.js +1 -1
  46. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  47. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  48. package/src/sap/base/util/restricted/_without.js +1 -1
  49. package/src/sap/base/util/restricted/_xor.js +1 -1
  50. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  51. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  52. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  53. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  54. package/src/sap/base/util/syncFetch.js +73 -0
  55. package/src/sap/ui/Device.js +5 -5
  56. package/src/sap/ui/Global.js +4 -4
  57. package/src/sap/ui/base/Event.js +1 -1
  58. package/src/sap/ui/base/EventProvider.js +1 -1
  59. package/src/sap/ui/base/Interface.js +1 -1
  60. package/src/sap/ui/base/ManagedObject.js +1 -1
  61. package/src/sap/ui/base/ManagedObjectMetadata.js +1 -1
  62. package/src/sap/ui/base/ManagedObjectObserver.js +2 -2
  63. package/src/sap/ui/base/Metadata.js +1 -1
  64. package/src/sap/ui/base/Object.js +1 -1
  65. package/src/sap/ui/base/ObjectPool.js +1 -1
  66. package/src/sap/ui/core/.library +63 -45
  67. package/src/sap/ui/core/AccessKeysEnablement.js +173 -0
  68. package/src/sap/ui/core/AppCacheBuster.js +65 -51
  69. package/src/sap/ui/core/BusyIndicator.js +1 -1
  70. package/src/sap/ui/core/Component.js +48 -21
  71. package/src/sap/ui/core/ComponentContainer.js +1 -1
  72. package/src/sap/ui/core/ComponentMetadata.js +12 -12
  73. package/src/sap/ui/core/ComponentSupport.js +1 -1
  74. package/src/sap/ui/core/Configuration.js +77 -26
  75. package/src/sap/ui/core/Control.js +1 -1
  76. package/src/sap/ui/core/Core.js +49 -61
  77. package/src/sap/ui/core/CustomData.js +1 -1
  78. package/src/sap/ui/core/DeclarativeSupport.js +1 -1
  79. package/src/sap/ui/core/Element.js +9 -1
  80. package/src/sap/ui/core/ElementMetadata.js +6 -4
  81. package/src/sap/ui/core/EnabledPropagator.js +1 -1
  82. package/src/sap/ui/core/EventBus.js +1 -1
  83. package/src/sap/ui/core/ExtensionPoint.js +2 -2
  84. package/src/sap/ui/core/FocusHandler.js +56 -33
  85. package/src/sap/ui/core/Fragment.js +1 -1
  86. package/src/sap/ui/core/HTML.js +1 -1
  87. package/src/sap/ui/core/History.js +1 -1
  88. package/src/sap/ui/core/Icon.js +1 -1
  89. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  90. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  91. package/src/sap/ui/core/InvisibleMessage.js +1 -1
  92. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  93. package/src/sap/ui/core/InvisibleText.js +4 -1
  94. package/src/sap/ui/core/Item.js +1 -1
  95. package/src/sap/ui/core/LabelEnablement.js +1 -1
  96. package/src/sap/ui/core/LayoutData.js +1 -1
  97. package/src/sap/ui/core/ListItem.js +1 -1
  98. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  99. package/src/sap/ui/core/Locale.js +1 -1
  100. package/src/sap/ui/core/LocaleData.js +4 -47
  101. package/src/sap/ui/core/Manifest.js +3 -5
  102. package/src/sap/ui/core/Message.js +1 -1
  103. package/src/sap/ui/core/RenderManager.js +11 -21
  104. package/src/sap/ui/core/Renderer.js +1 -1
  105. package/src/sap/ui/core/ResizeHandler.js +22 -43
  106. package/src/sap/ui/core/ScrollBar.js +1 -1
  107. package/src/sap/ui/core/SeparatorItem.js +1 -1
  108. package/src/sap/ui/core/Title.js +1 -1
  109. package/src/sap/ui/core/TooltipBase.js +1 -1
  110. package/src/sap/ui/core/UIArea.js +6 -4
  111. package/src/sap/ui/core/UIComponent.js +1 -1
  112. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  113. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  114. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  115. package/src/sap/ui/core/XMLComposite.js +4 -1
  116. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  117. package/src/sap/ui/core/_IconRegistry.js +66 -55
  118. package/src/sap/ui/core/cache/CacheManager.js +18 -14
  119. package/src/sap/ui/core/cache/CacheManagerNOP.js +5 -2
  120. package/src/sap/ui/core/cache/LRUPersistentCache.js +15 -8
  121. package/src/sap/ui/core/cldr/en.json +0 -1
  122. package/src/sap/ui/core/date/Buddhist.js +15 -13
  123. package/src/sap/ui/core/date/Japanese.js +0 -6
  124. package/src/sap/ui/core/date/UniversalDate.js +144 -34
  125. package/src/sap/ui/core/delegate/ItemNavigation.js +2 -2
  126. package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
  127. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  128. package/src/sap/ui/core/dnd/DragDropInfo.js +3 -3
  129. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  130. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  131. package/src/sap/ui/core/format/DateFormat.js +31 -9
  132. package/src/sap/ui/core/format/NumberFormat.js +91 -25
  133. package/src/sap/ui/core/format/TimezoneUtil.js +2 -2
  134. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  135. package/src/sap/ui/core/library.js +44 -3
  136. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  137. package/src/sap/ui/core/message/Message.js +1 -1
  138. package/src/sap/ui/core/message/MessageManager.js +1 -1
  139. package/src/sap/ui/core/message/MessageParser.js +1 -1
  140. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  141. package/src/sap/ui/core/messagebundle.properties +2 -0
  142. package/src/sap/ui/core/messagebundle_ar.properties +54 -53
  143. package/src/sap/ui/core/messagebundle_bg.properties +54 -53
  144. package/src/sap/ui/core/messagebundle_ca.properties +28 -27
  145. package/src/sap/ui/core/messagebundle_cs.properties +37 -36
  146. package/src/sap/ui/core/messagebundle_cy.properties +57 -56
  147. package/src/sap/ui/core/messagebundle_da.properties +53 -52
  148. package/src/sap/ui/core/messagebundle_de.properties +54 -53
  149. package/src/sap/ui/core/messagebundle_el.properties +46 -45
  150. package/src/sap/ui/core/messagebundle_en.properties +57 -56
  151. package/src/sap/ui/core/messagebundle_en_GB.properties +57 -56
  152. package/src/sap/ui/core/messagebundle_en_US_sappsd.properties +1 -0
  153. package/src/sap/ui/core/messagebundle_en_US_saprigi.properties +1 -0
  154. package/src/sap/ui/core/messagebundle_en_US_saptrc.properties +1 -0
  155. package/src/sap/ui/core/messagebundle_es.properties +42 -41
  156. package/src/sap/ui/core/messagebundle_es_MX.properties +54 -53
  157. package/src/sap/ui/core/messagebundle_et.properties +51 -50
  158. package/src/sap/ui/core/messagebundle_fi.properties +48 -47
  159. package/src/sap/ui/core/messagebundle_fr.properties +37 -36
  160. package/src/sap/ui/core/messagebundle_fr_CA.properties +22 -21
  161. package/src/sap/ui/core/messagebundle_hi.properties +42 -41
  162. package/src/sap/ui/core/messagebundle_hr.properties +55 -54
  163. package/src/sap/ui/core/messagebundle_hu.properties +56 -55
  164. package/src/sap/ui/core/messagebundle_id.properties +55 -54
  165. package/src/sap/ui/core/messagebundle_it.properties +55 -54
  166. package/src/sap/ui/core/messagebundle_iw.properties +55 -54
  167. package/src/sap/ui/core/messagebundle_ja.properties +48 -47
  168. package/src/sap/ui/core/messagebundle_kk.properties +41 -40
  169. package/src/sap/ui/core/messagebundle_ko.properties +21 -20
  170. package/src/sap/ui/core/messagebundle_lt.properties +55 -54
  171. package/src/sap/ui/core/messagebundle_lv.properties +55 -54
  172. package/src/sap/ui/core/messagebundle_ms.properties +52 -51
  173. package/src/sap/ui/core/messagebundle_nl.properties +53 -52
  174. package/src/sap/ui/core/messagebundle_no.properties +53 -52
  175. package/src/sap/ui/core/messagebundle_pl.properties +52 -51
  176. package/src/sap/ui/core/messagebundle_pt.properties +54 -53
  177. package/src/sap/ui/core/messagebundle_pt_PT.properties +55 -54
  178. package/src/sap/ui/core/messagebundle_ro.properties +56 -55
  179. package/src/sap/ui/core/messagebundle_ru.properties +52 -51
  180. package/src/sap/ui/core/messagebundle_sh.properties +57 -56
  181. package/src/sap/ui/core/messagebundle_sk.properties +54 -53
  182. package/src/sap/ui/core/messagebundle_sl.properties +56 -55
  183. package/src/sap/ui/core/messagebundle_sv.properties +52 -51
  184. package/src/sap/ui/core/messagebundle_th.properties +25 -24
  185. package/src/sap/ui/core/messagebundle_tr.properties +56 -55
  186. package/src/sap/ui/core/messagebundle_uk.properties +55 -54
  187. package/src/sap/ui/core/messagebundle_vi.properties +56 -55
  188. package/src/sap/ui/core/messagebundle_zh_CN.properties +55 -54
  189. package/src/sap/ui/core/messagebundle_zh_TW.properties +55 -54
  190. package/src/sap/ui/core/mvc/Controller.js +12 -12
  191. package/src/sap/ui/core/mvc/HTMLView.js +1 -1
  192. package/src/sap/ui/core/mvc/JSONView.js +1 -1
  193. package/src/sap/ui/core/mvc/JSView.js +1 -1
  194. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  195. package/src/sap/ui/core/mvc/View.js +7 -7
  196. package/src/sap/ui/core/mvc/XMLView.js +1 -2
  197. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  198. package/src/sap/ui/core/plugin/LessSupport.js +16 -14
  199. package/src/sap/ui/core/plugin/TemplatingSupport.js +2 -1
  200. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  201. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  202. package/src/sap/ui/core/routing/Router.js +3 -3
  203. package/src/sap/ui/core/routing/async/TargetCache.js +4 -0
  204. package/src/sap/ui/core/rules/Config.support.js +1 -1
  205. package/src/sap/ui/core/rules/View.support.js +11 -4
  206. package/src/sap/ui/core/search/OpenSearchProvider.js +25 -12
  207. package/src/sap/ui/core/search/SearchProvider.js +2 -2
  208. package/src/sap/ui/core/service/Service.js +1 -1
  209. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  210. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  211. package/src/sap/ui/core/support/Plugin.js +1 -1
  212. package/src/sap/ui/core/support/Support.js +3 -4
  213. package/src/sap/ui/core/support/plugins/ControlTree.js +1 -1
  214. package/src/sap/ui/core/support/plugins/Debugging.js +1 -1
  215. package/src/sap/ui/core/support/plugins/Interaction.js +1 -1
  216. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  217. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  218. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  219. package/src/sap/ui/core/support/plugins/TechInfo.js +46 -33
  220. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  221. package/src/sap/ui/core/support/plugins/ViewInfo.js +2 -3
  222. package/src/sap/ui/core/themes/base/Icon.less +4 -0
  223. package/src/sap/ui/core/themes/base/LocalBusyIndicator.less +1 -1
  224. package/src/sap/ui/core/themes/base/base.less +26 -26
  225. package/src/sap/ui/core/themes/base/fonts/SAP-icons.woff2 +0 -0
  226. package/src/sap/ui/core/themes/base/global.less +5 -1
  227. package/src/sap/ui/core/theming/Parameters.js +45 -39
  228. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  229. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  230. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  231. package/src/sap/ui/core/tmpl/Template.js +2 -2
  232. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  233. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  234. package/src/sap/ui/core/util/Export.js +1 -1
  235. package/src/sap/ui/core/util/ExportCell.js +1 -1
  236. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  237. package/src/sap/ui/core/util/ExportRow.js +1 -1
  238. package/src/sap/ui/core/util/ExportType.js +1 -1
  239. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  240. package/src/sap/ui/core/util/File.js +1 -1
  241. package/src/sap/ui/core/util/LibraryInfo.js +61 -42
  242. package/src/sap/ui/core/util/MockServer.js +1 -1
  243. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  244. package/src/sap/ui/core/util/XMLPreprocessor.js +1 -1
  245. package/src/sap/ui/core/util/reflection/BaseTreeModifier.js +0 -3
  246. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  247. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  248. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  249. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  250. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  251. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  252. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  253. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  254. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  255. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  256. package/src/sap/ui/debug/ControlTree.js +1 -1
  257. package/src/sap/ui/debug/DebugEnv.js +1 -1
  258. package/src/sap/ui/debug/PropertyList.js +19 -9
  259. package/src/sap/ui/model/ClientModel.js +1 -1
  260. package/src/sap/ui/model/CompositeDataState.js +1 -1
  261. package/src/sap/ui/model/CompositeType.js +1 -1
  262. package/src/sap/ui/model/DataState.js +2 -2
  263. package/src/sap/ui/model/MetaModel.js +1 -1
  264. package/src/sap/ui/model/Model.js +1 -1
  265. package/src/sap/ui/model/SelectionModel.js +1 -1
  266. package/src/sap/ui/model/SimpleType.js +1 -1
  267. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  268. package/src/sap/ui/model/Type.js +1 -1
  269. package/src/sap/ui/model/_Helper.js +3 -1
  270. package/src/sap/ui/model/analytics/odata4analytics.js +2 -2
  271. package/src/sap/ui/model/base/ManagedObjectModel.js +2 -2
  272. package/src/sap/ui/model/json/JSONModel.js +1 -1
  273. package/src/sap/ui/model/message/MessageModel.js +1 -1
  274. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  275. package/src/sap/ui/model/odata/ODataMessageParser.js +4 -4
  276. package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
  277. package/src/sap/ui/model/odata/ODataMetadata.js +6 -3
  278. package/src/sap/ui/model/odata/ODataModel.js +1 -1
  279. package/src/sap/ui/model/odata/ODataTreeBindingFlat.js +437 -239
  280. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  281. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  282. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  283. package/src/sap/ui/model/odata/type/Date.js +1 -1
  284. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  285. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  286. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  287. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +1 -1
  288. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  289. package/src/sap/ui/model/odata/type/Double.js +1 -1
  290. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  291. package/src/sap/ui/model/odata/type/Int.js +1 -1
  292. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  293. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  294. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  295. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  296. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  297. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  298. package/src/sap/ui/model/odata/type/Single.js +1 -1
  299. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  300. package/src/sap/ui/model/odata/type/String.js +1 -1
  301. package/src/sap/ui/model/odata/type/Time.js +1 -1
  302. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  303. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  304. package/src/sap/ui/model/odata/v2/Context.js +1 -1
  305. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  306. package/src/sap/ui/model/odata/v2/ODataContextBinding.js +4 -1
  307. package/src/sap/ui/model/odata/v2/ODataListBinding.js +25 -0
  308. package/src/sap/ui/model/odata/v2/ODataModel.js +161 -122
  309. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +18 -2
  310. package/src/sap/ui/model/odata/v4/Context.js +86 -30
  311. package/src/sap/ui/model/odata/v4/ODataBinding.js +4 -8
  312. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +26 -27
  313. package/src/sap/ui/model/odata/v4/ODataListBinding.js +121 -93
  314. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +1 -1
  315. package/src/sap/ui/model/odata/v4/ODataModel.js +3 -2
  316. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +10 -13
  317. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +4 -4
  318. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +135 -28
  319. package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +133 -16
  320. package/src/sap/ui/model/odata/v4/lib/_Cache.js +341 -161
  321. package/src/sap/ui/model/odata/v4/lib/_Helper.js +73 -9
  322. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +8 -6
  323. package/src/sap/ui/model/resource/ResourceModel.js +1 -1
  324. package/src/sap/ui/model/type/Boolean.js +1 -1
  325. package/src/sap/ui/model/type/Currency.js +1 -1
  326. package/src/sap/ui/model/type/Date.js +1 -1
  327. package/src/sap/ui/model/type/DateInterval.js +1 -1
  328. package/src/sap/ui/model/type/DateTime.js +1 -1
  329. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  330. package/src/sap/ui/model/type/FileSize.js +1 -1
  331. package/src/sap/ui/model/type/Float.js +1 -1
  332. package/src/sap/ui/model/type/Integer.js +1 -1
  333. package/src/sap/ui/model/type/String.js +1 -1
  334. package/src/sap/ui/model/type/Time.js +1 -1
  335. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  336. package/src/sap/ui/model/type/Unit.js +1 -1
  337. package/src/sap/ui/model/xml/XMLModel.js +4 -2
  338. package/src/sap/ui/performance/trace/FESR.js +27 -24
  339. package/src/sap/ui/performance/trace/Interaction.js +66 -16
  340. package/src/sap/ui/qunit/sinon-qunit-bridge.js +1 -1
  341. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  342. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  343. package/src/sap/ui/test/Opa5.js +1 -1
  344. package/src/sap/ui/test/TestUtils.js +35 -2
  345. package/src/sap/ui/test/actions/Press.js +7 -0
  346. package/src/sap/ui/test/generic/TestBase.js +1 -1
  347. package/src/sap/ui/test/matchers/AggregationContainsPropertyEqual.js +2 -3
  348. package/src/sap/ui/test/matchers/AggregationFilled.js +2 -3
  349. package/src/sap/ui/test/matchers/AggregationLengthEquals.js +2 -3
  350. package/src/sap/ui/test/matchers/Matcher.js +9 -11
  351. package/src/sap/ui/test/opaQunit.js +15 -9
  352. package/src/sap/ui/test/pipelines/ActionPipeline.js +2 -3
  353. package/src/sap/ui/test/pipelines/MatcherPipeline.js +2 -3
  354. package/src/sap/ui/test/pipelines/PipelineFactory.js +2 -3
  355. package/src/sap/ui/thirdparty/IPv6.js +1 -1
  356. package/src/sap/ui/thirdparty/SecondLevelDomains.js +1 -1
  357. package/src/sap/ui/thirdparty/URI.js +8 -2
  358. package/src/sap/ui/thirdparty/URITemplate.js +1 -1
  359. package/src/sap/ui/util/Storage.js +1 -1
  360. package/src/sap/ui/util/XMLHelper.js +1 -1
@@ -58,7 +58,7 @@ sap.ui.define([
58
58
  * @mixes sap.ui.model.odata.v4.ODataParentBinding
59
59
  * @public
60
60
  * @since 1.37.0
61
- * @version 1.103.0
61
+ * @version 1.105.0
62
62
  * @borrows sap.ui.model.odata.v4.ODataBinding#getGroupId as #getGroupId
63
63
  * @borrows sap.ui.model.odata.v4.ODataBinding#getRootBinding as #getRootBinding
64
64
  * @borrows sap.ui.model.odata.v4.ODataBinding#getUpdateGroupId as #getUpdateGroupId
@@ -121,10 +121,13 @@ sap.ui.define([
121
121
  // number of active (client-side) created contexts in aContexts
122
122
  this.iActiveContexts = 0;
123
123
  this.aApplicationFilters = _Helper.toArray(vFilters);
124
- this.sChangeReason = oModel.bAutoExpandSelect && !mParameters.$$aggregation
124
+ this.sChangeReason = oModel.bAutoExpandSelect && !_Helper.isDataAggregation(mParameters)
125
125
  ? "AddVirtualContext"
126
126
  : undefined;
127
+ // BEWARE: #doReplaceWith can insert a context w/ negative index, but w/o #created promise
128
+ // into aContexts' area of "created contexts"!
127
129
  this.iCreatedContexts = 0; // number of (client-side) created contexts in aContexts
130
+ this.iDeletedContexts = 0; // number of (client-side) deleted contexts
128
131
  this.oDiff = undefined;
129
132
  this.aFilters = [];
130
133
  this.sGroupId = mParameters.$$groupId;
@@ -264,7 +267,7 @@ sap.ui.define([
264
267
  * Whether not to request the new count from the server; useful in case of
265
268
  * {@link sap.ui.model.odata.v4.Context#replaceWith} where it is known that the count remains
266
269
  * unchanged; w/o a lock this should be true
267
- * @returns {Promise}
270
+ * @returns {sap.ui.base.SyncPromise}
268
271
  * A promise which is resolved without a result in case of success, or rejected with an
269
272
  * instance of <code>Error</code> in case of failure.
270
273
  * @throws {Error}
@@ -274,70 +277,64 @@ sap.ui.define([
274
277
  */
275
278
  ODataListBinding.prototype._delete = function (oGroupLock, sEditUrl, oContext, oETagEntity,
276
279
  bDoNotRequestCount) {
277
- var bDestroy,
278
- bFireChange = false,
279
- sPath = oContext.iIndex === undefined
280
+ var sPath = oContext.iIndex === undefined
280
281
  // context is not in aContexts -> use the predicate
281
282
  ? _Helper.getRelativePath(oContext.getPath(), this.oHeaderContext.getPath())
282
283
  : String(oContext.iIndex),
283
284
  bReadCount = false,
284
285
  that = this;
285
286
 
287
+ if (oGroupLock && oContext.iIndex === undefined
288
+ && this.oModel.isApiGroup(oGroupLock.getGroupId())) {
289
+ throw new Error("Cannot delete a kept-alive context in an API group when it is not in"
290
+ + " the collection");
291
+ }
292
+
293
+ this.iDeletedContexts += 1;
294
+
286
295
  return this.deleteFromCache(oGroupLock, sEditUrl, sPath, oETagEntity, bDoNotRequestCount,
287
- function (iIndex, aEntities) {
288
- var sContextPath, sPredicate, sResolvedPath, i$skipIndex, i;
296
+ function (iIndex, iOffset) {
297
+ var iContextIndex = oContext.iIndex;
289
298
 
290
- if (oContext.isKeepAlive()) {
291
- oContext.resetKeepAlive(); // ensure that it is destroyed later
292
- bDestroy = true;
293
- }
294
- if (oContext.created()) {
295
- // happens only for a created context that is not transient anymore
296
- that.destroyCreated(oContext);
297
- bFireChange = true;
298
- } else if (iIndex >= 0) {
299
- // prepare all contexts for deletion
300
- for (i = iIndex; i < that.aContexts.length; i += 1) {
301
- oContext = that.aContexts[i];
302
- if (oContext) {
303
- that.mPreviousContextsByPath[oContext.getPath()] = oContext;
304
- }
299
+ if (iIndex !== undefined) {
300
+ // An entity can only be deleted when its key predicate is known. So we can be
301
+ // sure to have key predicates and the contexts a related to entities and not
302
+ // rows. -> Shift them and adjust the indexes
303
+ if (iOffset > 0) { // we're re-inserting
304
+ delete that.mPreviousContextsByPath[oContext.getPath()];
305
+ that.aContexts.splice(iIndex, 0, oContext);
306
+ } else { // we're deleting
307
+ that.mPreviousContextsByPath[oContext.getPath()] = oContext;
308
+ that.aContexts.splice(iIndex, 1);
309
+ oContext.iIndex = undefined;
310
+ // fire asynchronously so that multiple deletes only update the table once
311
+ Promise.resolve().then(function () {
312
+ that._fireChange({reason : ChangeReason.Remove});
313
+ });
305
314
  }
306
- sResolvedPath = that.getResolvedPath();
307
- that.aContexts.splice(iIndex, 1); // adjust the contexts array
308
- for (i = iIndex; i < that.aContexts.length; i += 1) {
309
- if (that.aContexts[i]) {
310
- i$skipIndex = i - that.iCreatedContexts;
311
- // calculate the context path and try to re-use the context for it
312
- sPredicate = _Helper.getPrivateAnnotation(aEntities[i], "predicate");
313
- sContextPath = sResolvedPath + (sPredicate || "/" + i$skipIndex);
314
- oContext = that.mPreviousContextsByPath[sContextPath];
315
- if (oContext) {
316
- delete that.mPreviousContextsByPath[sContextPath];
317
- if (oContext.iIndex === i$skipIndex) {
318
- oContext.checkUpdate(); // same row, but different data
319
- } else {
320
- oContext.iIndex = i$skipIndex; // same data, but different row
321
- }
322
- } else {
323
- oContext
324
- = Context.create(that.oModel, that, sContextPath, i$skipIndex);
325
- }
326
- that.aContexts[i] = oContext;
315
+ if (iContextIndex < 0 || oContext.created()) {
316
+ that.iCreatedContexts += iOffset;
317
+ that.iActiveContexts += iOffset;
318
+ if (!that.iCreatedContexts) { //@see #destroyCreated
319
+ that.bFirstCreateAtEnd = undefined;
327
320
  }
321
+ } else {
322
+ // iMaxLength is the number of server rows w/o the created entities
323
+ that.iMaxLength += iOffset; // this doesn't change Infinity
328
324
  }
329
- that.iMaxLength -= 1; // this doesn't change Infinity
330
- bFireChange = true;
325
+ that.aContexts.forEach(function (oContext0, i) {
326
+ oContext0.iIndex = i - that.iCreatedContexts;
327
+ });
331
328
  } else if (that.bLengthFinal) {
332
329
  // a kept-alive context is not in aContexts -> read the count afterwards
333
330
  bReadCount = true;
334
331
  }
335
- // Do not destroy the context immediately to avoid timing issues with dependent
336
- // bindings, keep it in mPreviousContextsByPath to destroy it later
337
332
  }
338
333
  ).then(function () {
339
334
  var iOldMaxLength = that.iMaxLength;
340
335
 
336
+ that.iDeletedContexts -= 1;
337
+ oContext.resetKeepAlive();
341
338
  if (bReadCount) {
342
339
  that.iMaxLength = that.fetchValue("$count", undefined, true).getResult()
343
340
  - that.iActiveContexts;
@@ -345,18 +342,17 @@ sap.ui.define([
345
342
  // Note: Although we know that oContext is not in aContexts, a "change" event needs
346
343
  // to be fired in order to notify the control about the new length, for example, to
347
344
  // update the 'More' button or the scrollbar.
348
- bFireChange = iOldMaxLength !== that.iMaxLength;
349
- }
350
- // Fire the change asynchronously so that Cache#delete is finished and #getContexts can
351
- // read the data synchronously. This is important for extended change detection.
352
- // Without change event there is no destroyPreviousContexts and a kept-alive context
353
- // must be destroyed here.
354
- if (bFireChange) {
355
- that._fireChange({reason : ChangeReason.Remove});
356
- } else if (bDestroy) {
357
- delete that.mPreviousContextsByPath[oContext.getPath()];
358
- oContext.destroy();
345
+ if (iOldMaxLength !== that.iMaxLength) {
346
+ that._fireChange({reason : ChangeReason.Remove});
347
+ }
359
348
  }
349
+ oContext.iIndex = Context.VIRTUAL; // prevent further cache access via this context
350
+ that.oModel.addPrerenderingTask(
351
+ that.destroyPreviousContexts.bind(that, [oContext.getPath()]));
352
+ }, function (oError) {
353
+ that.iDeletedContexts -= 1;
354
+ that._fireChange({reason : ChangeReason.Insert});
355
+ throw oError;
360
356
  });
361
357
  };
362
358
 
@@ -431,7 +427,10 @@ sap.ui.define([
431
427
  if ("$apply" in mParameters) {
432
428
  throw new Error("Cannot combine $$aggregation and $apply");
433
429
  }
434
- // Note: this validates mParameters.$$aggregation!
430
+ if (!sChangeReason) { // called from c'tor or #setAggregation
431
+ _AggregationHelper.validateAggregation(mParameters.$$aggregation, this.sPath,
432
+ this.oModel.oInterface.fetchMetadata, this.oModel.bAutoExpandSelect);
433
+ }
435
434
  sApply = _AggregationHelper.buildApply(mParameters.$$aggregation).$apply;
436
435
  }
437
436
  this.mQueryOptions = this.oModel.buildQueryOptions(mParameters, true);
@@ -1128,9 +1127,9 @@ sap.ui.define([
1128
1127
  * Removes and destroys contexts from mPreviousContextsByPath.
1129
1128
  *
1130
1129
  * @param {string[]} [aPathsToDelete]
1131
- * If given, only contexts with paths in this list except kept-alive ones are removed and
1132
- * destroyed (transient contexts are removed only); otherwise all contexts in the list are
1133
- * removed and destroyed
1130
+ * If given, only contexts with paths in this list except kept-alive and deleted ones are
1131
+ * removed and destroyed (transient contexts are removed only); otherwise all contexts in the
1132
+ * list are removed and destroyed
1134
1133
  *
1135
1134
  * @private
1136
1135
  */
@@ -1142,7 +1141,7 @@ sap.ui.define([
1142
1141
  var oContext = mPreviousContextsByPath[sPath];
1143
1142
 
1144
1143
  if (oContext) {
1145
- if (aPathsToDelete && oContext.isKeepAlive()) {
1144
+ if (aPathsToDelete && (oContext.isKeepAlive() || oContext.isDeleted())) {
1146
1145
  oContext.iIndex = undefined;
1147
1146
  } else {
1148
1147
  if (!oContext.isTransient()) {
@@ -1224,8 +1223,7 @@ sap.ui.define([
1224
1223
  * @private
1225
1224
  */
1226
1225
  ODataListBinding.prototype.doReplaceWith = function (oOldContext, oElement, sPredicate) {
1227
- var iIndex = oOldContext.iIndex,
1228
- bKeepAlive = oOldContext.isKeepAlive(),
1226
+ var iModelIndex = oOldContext.getModelIndex(),
1229
1227
  bNew,
1230
1228
  fnOnBeforeDestroy = oOldContext.fnOnBeforeDestroy,
1231
1229
  fnOnBeforeDestroyClone,
@@ -1239,21 +1237,21 @@ sap.ui.define([
1239
1237
  if (oResult.iIndex !== undefined) {
1240
1238
  throw new Error("Unexpected index: " + oResult);
1241
1239
  }
1242
- oResult.iIndex = iIndex;
1240
+ oResult.iIndex = oOldContext.iIndex;
1243
1241
  delete this.mPreviousContextsByPath[sPath];
1244
1242
  } else {
1245
- oResult = Context.create(this.oModel, this, sPath, iIndex);
1243
+ oResult = Context.create(this.oModel, this, sPath, oOldContext.iIndex);
1246
1244
  bNew = true;
1247
1245
  }
1248
1246
  oOldContext.iIndex = undefined;
1249
- if (iIndex === undefined) {
1247
+ if (iModelIndex === undefined) {
1250
1248
  this.mPreviousContextsByPath[sPath] = oResult;
1251
1249
  this.oCache.addKeptElement(oElement);
1252
1250
  } else {
1253
- this.aContexts[iIndex] = oResult;
1254
- this.oCache.doReplaceWith(iIndex, oElement);
1251
+ this.aContexts[iModelIndex] = oResult;
1252
+ this.oCache.doReplaceWith(iModelIndex, oElement);
1255
1253
  }
1256
- if (bKeepAlive) {
1254
+ if (oOldContext.isKeepAlive()) {
1257
1255
  this.mPreviousContextsByPath[oOldContext.getPath()] = oOldContext;
1258
1256
  if (bNew) {
1259
1257
  if (fnOnBeforeDestroy) {
@@ -1767,7 +1765,8 @@ sap.ui.define([
1767
1765
  * are ignored if they relate to a
1768
1766
  * {@link sap.ui.model.odata.v4.Context#setKeepAlive kept-alive} context of this binding.
1769
1767
  * Since 1.98.0, {@link sap.ui.model.odata.v4.Context#isTransient transient} contexts
1770
- * of a {@link #getRootBinding root binding} do not count as pending changes.
1768
+ * of a {@link #getRootBinding root binding} do not count as pending changes. Pending
1769
+ * {@link sap.ui.model.odata.v4.Context#delete deletions} lead to an error.
1771
1770
  *
1772
1771
  * @public
1773
1772
  * @see sap.ui.model.ListBinding#filter
@@ -1787,6 +1786,10 @@ sap.ui.define([
1787
1786
  return this;
1788
1787
  }
1789
1788
 
1789
+ if (this.iDeletedContexts) {
1790
+ throw new Error("Cannot filter when delete requests are pending");
1791
+ }
1792
+
1790
1793
  if (this.hasPendingChanges(true)) {
1791
1794
  throw new Error("Cannot filter due to pending changes");
1792
1795
  }
@@ -2014,6 +2017,7 @@ sap.ui.define([
2014
2017
  }
2015
2018
  if (!that.isRootBindingSuspended()) {
2016
2019
  // request data (before removing virtual context), but avoid E.C.D.
2020
+ // (see BCP: 2270085692 for some interesting discussions)
2017
2021
  that.bUseExtendedChangeDetection = false;
2018
2022
  that.getContexts(iStart, iLength, iMaximumPrefetchSize);
2019
2023
  that.bUseExtendedChangeDetection = bOld;
@@ -2724,6 +2728,10 @@ sap.ui.define([
2724
2728
  });
2725
2729
  }
2726
2730
 
2731
+ if (this.iDeletedContexts) {
2732
+ throw new Error("Cannot refresh when delete requests are pending");
2733
+ }
2734
+
2727
2735
  if (this.isRootBindingSuspended()) {
2728
2736
  // Note: side-effects (incl. refresh) are forbidden while suspended
2729
2737
  this.refreshSuspended(sGroupId);
@@ -2781,8 +2789,8 @@ sap.ui.define([
2781
2789
  }
2782
2790
  // Note: after reset the dependent bindings cannot be found any more
2783
2791
  aDependentBindings = that.getDependentBindings();
2784
- // this may reset that.oRefreshPromise
2785
- that.reset(ChangeReason.Refresh, bKeepCacheOnError ? false : undefined, sGroupId);
2792
+ that.reset(ChangeReason.Refresh, !oCache || (bKeepCacheOnError ? false : undefined),
2793
+ sGroupId); // this may reset that.oRefreshPromise
2786
2794
  return SyncPromise.all(
2787
2795
  refreshAll(aDependentBindings).concat(oPromise, oKeptElementsPromise)
2788
2796
  ).then(function () {
@@ -2891,7 +2899,7 @@ sap.ui.define([
2891
2899
  var iIndex = oContext.getModelIndex(),
2892
2900
  i;
2893
2901
 
2894
- if (oContext.created()) {
2902
+ if (oContext.iIndex < 0) {
2895
2903
  that.destroyCreated(oContext);
2896
2904
  bDestroyed = true;
2897
2905
  } else {
@@ -3114,9 +3122,6 @@ sap.ui.define([
3114
3122
  var aContexts,
3115
3123
  bMissingPredicate,
3116
3124
  oModel = this.oModel,
3117
- // Hash set of collection-valued navigation property meta paths (relative to the cache's
3118
- // root) which need to be refreshed, maps string to <code>true</code>
3119
- mNavigationPropertyPaths = {},
3120
3125
  aPredicates,
3121
3126
  aPromises,
3122
3127
  // since this is called from a context or a parent binding, the binding is resolved
@@ -3159,7 +3164,7 @@ sap.ui.define([
3159
3164
  aContexts = [oContext];
3160
3165
  } else {
3161
3166
  aContexts = this.getCurrentContexts().filter(function (oContext0) {
3162
- return !oContext0.isTransient();
3167
+ return oContext0 && !oContext0.isTransient();
3163
3168
  });
3164
3169
  // add kept-alive contexts outside collection
3165
3170
  Object.keys(this.mPreviousContextsByPath).forEach(function (sPath) {
@@ -3178,11 +3183,10 @@ sap.ui.define([
3178
3183
  });
3179
3184
  if (!bMissingPredicate) {
3180
3185
  aPromises = this.oCache
3181
- ? [this.oCache.requestSideEffects(this.lockGroup(sGroupId),
3182
- aPaths, mNavigationPropertyPaths, aPredicates, bSingle)]
3186
+ ? [this.oCache.requestSideEffects(this.lockGroup(sGroupId), aPaths, aPredicates,
3187
+ bSingle)]
3183
3188
  : []; // can happen if invoked via absolute side effect
3184
- this.visitSideEffects(sGroupId, aPaths, bSingle ? oContext : undefined,
3185
- mNavigationPropertyPaths, aPromises);
3189
+ this.visitSideEffects(sGroupId, aPaths, bSingle ? oContext : undefined, aPromises);
3186
3190
 
3187
3191
  return SyncPromise.all(aPromises.map(reportError)).then(function () {
3188
3192
  return that.refreshDependentListBindingsWithoutCache();
@@ -3375,7 +3379,11 @@ sap.ui.define([
3375
3379
  * used to turn on the handling of grand totals like in 1.84.0, using aggregates of aggregates
3376
3380
  * and thus allowing to filter by aggregated properties while grand totals are needed. Beware
3377
3381
  * that methods like "average" or "countdistinct" are not compatible with this approach, and
3378
- * it cannot be combined with group levels.
3382
+ * it cannot be combined with group levels.<br>
3383
+ * Since 1.105.0, either a recursive hierarchy or pure data aggregation is supported, but no
3384
+ * mix; <code>hierarchyQualifier</code> is the leading property that decides between those two
3385
+ * use cases - this is an <b>experimental API</b> and is only supported if the model uses the
3386
+ * <code>autoExpandSelect</code> parameter!
3379
3387
  * @param {object} [oAggregation.aggregate]
3380
3388
  * A map from aggregatable property names or aliases to objects containing the following
3381
3389
  * details:
@@ -3397,6 +3405,9 @@ sap.ui.define([
3397
3405
  * there is only one, or <code>null</code> otherwise ("multi-unit situation"). (SQL
3398
3406
  * suggestion: <code>CASE WHEN MIN(Unit) = MAX(Unit) THEN MIN(Unit) END</code>)
3399
3407
  * </ul>
3408
+ * @param {number} [oAggregation.expandTo=1]
3409
+ * The number of initially expanded levels as a positive integer (@experimental as of version
3410
+ * 1.105.0), supported only if a <code>hierarchyQualifier</code> is given.
3400
3411
  * @param {boolean} [oAggregation.grandTotalAtBottomOnly]
3401
3412
  * Tells whether the grand totals for aggregatable properties are displayed at the bottom only
3402
3413
  * (since 1.86.0); <code>true</code> for bottom only, <code>false</code> for top and bottom,
@@ -3414,6 +3425,12 @@ sap.ui.define([
3414
3425
  * A list of groupable property names used to determine group levels. They may, but don't need
3415
3426
  * to, be repeated in <code>oAggregation.group</code>. Group levels cannot be combined with
3416
3427
  * filtering for aggregated properties or (since 1.93.0) with "$search".
3428
+ * @param {string} [oAggregation.hierarchyQualifier]
3429
+ * The qualifier for the pair of "Org.OData.Aggregation.V1.RecursiveHierarchy" and
3430
+ * "com.sap.vocabularies.Hierarchy.v1.RecursiveHierarchy" annotations at this binding's
3431
+ * entity type (@experimental as of version 1.105.0). If present, a recursive hierarchy
3432
+ * without data aggregation is defined, and the only other supported property is
3433
+ * <code>expandTo</code>.
3417
3434
  * @param {string} [oAggregation.search]
3418
3435
  * Like the <a
3419
3436
  * href="https://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part2-url-conventions.html">
@@ -3434,7 +3451,9 @@ sap.ui.define([
3434
3451
  * <li> the given data aggregation object is unsupported,
3435
3452
  * <li> the <code>$apply</code> system query option has been specified explicitly before,
3436
3453
  * <li> the binding has a kept-alive context,
3437
- * <li> there are pending changes
3454
+ * <li> there are pending changes,
3455
+ * <li> a recursive hierarchy is requested, but the model does not use the
3456
+ * <code>autoExpandSelect</code> parameter.
3438
3457
  * </ul>
3439
3458
  * @example <caption>First group level is product category including subtotals for the net
3440
3459
  * amount in display currency. On leaf level, transaction currency is used as an additional
@@ -3566,13 +3585,18 @@ sap.ui.define([
3566
3585
  * the dynamic sorters.
3567
3586
  * @returns {this}
3568
3587
  * <code>this</code> to facilitate method chaining
3569
- * @throws {Error}
3570
- * If there are pending changes that cannot be ignored or if an unsupported operation mode is
3571
- * used (see {@link sap.ui.model.odata.v4.ODataModel#bindList}). Since 1.97.0, pending changes
3572
- * are ignored if they relate to a
3573
- * {@link sap.ui.model.odata.v4.Context#setKeepAlive kept-alive} context of this binding.
3574
- * Since 1.98.0, {@link sap.ui.model.odata.v4.Context#isTransient transient} contexts
3575
- * of a {@link #getRootBinding root binding} do not count as pending changes.
3588
+ * @throws {Error} If
3589
+ * <ul>
3590
+ * <li> there are pending changes that cannot be ignored,
3591
+ * <li> an unsupported operation mode is used (see
3592
+ * {@link sap.ui.model.odata.v4.ODataModel#bindList}). Since 1.97.0, pending changes are
3593
+ * ignored if they relate to a
3594
+ * {@link sap.ui.model.odata.v4.Context#setKeepAlive kept-alive} context of this binding.
3595
+ * Since 1.98.0, {@link sap.ui.model.odata.v4.Context#isTransient transient} contexts of a
3596
+ * {@link #getRootBinding root binding} do not count as pending changes.
3597
+ * <li> contexts are {@link sap.ui.model.data.v4.Context#delete deleted} on the client, but
3598
+ * the server request has not finished yet.
3599
+ * </ul>
3576
3600
  *
3577
3601
  * @public
3578
3602
  * @see sap.ui.model.ListBinding#sort
@@ -3590,6 +3614,10 @@ sap.ui.define([
3590
3614
  return this;
3591
3615
  }
3592
3616
 
3617
+ if (this.iDeletedContexts) {
3618
+ throw new Error("Cannot sort when delete requests are pending");
3619
+ }
3620
+
3593
3621
  if (this.hasPendingChanges(true)) {
3594
3622
  throw new Error("Cannot sort due to pending changes");
3595
3623
  }
@@ -157,7 +157,7 @@ sap.ui.define([
157
157
  * @hideconstructor
158
158
  * @public
159
159
  * @since 1.37.0
160
- * @version 1.103.0
160
+ * @version 1.105.0
161
161
  */
162
162
  ODataMetaModel = MetaModel.extend("sap.ui.model.odata.v4.ODataMetaModel", {
163
163
  constructor : constructor
@@ -214,7 +214,7 @@ sap.ui.define([
214
214
  * @extends sap.ui.model.Model
215
215
  * @public
216
216
  * @since 1.37.0
217
- * @version 1.103.0
217
+ * @version 1.105.0
218
218
  */
219
219
  ODataModel = Model.extend("sap.ui.model.odata.v4.ODataModel",
220
220
  /** @lends sap.ui.model.odata.v4.ODataModel.prototype */{
@@ -870,7 +870,7 @@ sap.ui.define([
870
870
  ODataModel.prototype.buildQueryOptions = function (mParameters, bSystemQueryOptionsAllowed,
871
871
  bSapAllowed) {
872
872
  var sParameterName,
873
- mTransformedOptions = _Helper.clone(mParameters) || {};
873
+ mTransformedOptions = Object.assign({}, mParameters); // shallow clone
874
874
 
875
875
  /*
876
876
  * Parses the query options for the given option name "sOptionName" in the given map of
@@ -897,6 +897,7 @@ sap.ui.define([
897
897
  mOptions[sOptionName] = vValue;
898
898
  }
899
899
  if (sOptionName === "$expand") {
900
+ vValue = mOptions[sOptionName] = _Helper.clone(vValue); // deep clone needed!
900
901
  for (sExpandPath in vValue) {
901
902
  mExpandOptions = vValue[sExpandPath];
902
903
  if (mExpandOptions === null || typeof mExpandOptions !== "object") {
@@ -599,11 +599,11 @@ sap.ui.define([
599
599
  * @param {boolean} [bDoNotRequestCount]
600
600
  * Whether not to request the new count from the server; useful in case of
601
601
  * {@link sap.ui.model.odata.v4.Context#replaceWith} where it is known that the count remains
602
- * unchanged; w/o a lock this should be true
603
- * @param {function} fnCallback
604
- * A function which is called after a transient entity has been deleted from the cache or
605
- * after the entity has been deleted from the server and from the cache; the index of the
606
- * entity and the entity list are both passed as parameter, or none of them
602
+ * unchanged; only relevant for the list binding
603
+ * @param {function} [fnCallback]
604
+ * A function which is called immediately when an entity has been deleted from the cache, or
605
+ * when it was re-inserted due to an error; only used in the list binding; the index of the
606
+ * entity and an offset (-1 for deletion, 1 for re-insertion) are passed as parameter
607
607
  * @returns {sap.ui.base.SyncPromise}
608
608
  * A promise which is resolved without a result in case of success, or rejected with an
609
609
  * instance of <code>Error</code> in case of failure; returns <code>undefined</code> if the
@@ -720,8 +720,8 @@ sap.ui.define([
720
720
 
721
721
  if (bDependsOnOperation && !sResolvedChildPath.includes("/$Parameter/")
722
722
  || this.getRootBinding().isSuspended()
723
- || this.mParameters && this.mParameters.$$aggregation) {
724
- // With $$aggregation, no auto-$expand/$select is needed, but the child may still use
723
+ || _Helper.isDataAggregation(this.mParameters)) {
724
+ // With data aggregation, no auto-$expand/$select is needed, but the child may still use
725
725
  // the parent's cache
726
726
  // Note: Operation bindings do not support auto-$expand/$select yet
727
727
  return SyncPromise.resolve(sResolvedChildPath);
@@ -1417,8 +1417,8 @@ sap.ui.define([
1417
1417
  * @override
1418
1418
  * @see sap.ui.model.odata.v4.ODataBinding#visitSideEffects
1419
1419
  */
1420
- ODataParentBinding.prototype.visitSideEffects = function (sGroupId, aPaths, oContext,
1421
- mNavigationPropertyPaths, aPromises, sPrefix) {
1420
+ ODataParentBinding.prototype.visitSideEffects = function (sGroupId, aPaths, oContext, aPromises,
1421
+ sPrefix) {
1422
1422
  var aDependentBindings = oContext
1423
1423
  ? this.oModel.getDependentBindings(oContext)
1424
1424
  : this.getDependentBindings();
@@ -1435,11 +1435,8 @@ sap.ui.define([
1435
1435
  aPromises.push(
1436
1436
  oDependentBinding.requestSideEffects(sGroupId, aStrippedPaths));
1437
1437
  }
1438
- } else if (mNavigationPropertyPaths[sPath]) {
1439
- aPromises.push(oDependentBinding.refreshInternal("", sGroupId));
1440
1438
  } else {
1441
- oDependentBinding.visitSideEffects(sGroupId, aPaths, null,
1442
- mNavigationPropertyPaths, aPromises, sPath);
1439
+ oDependentBinding.visitSideEffects(sGroupId, aPaths, null, aPromises, sPath);
1443
1440
  }
1444
1441
  });
1445
1442
  };
@@ -42,7 +42,7 @@ sap.ui.define([
42
42
  * @mixes sap.ui.model.odata.v4.ODataBinding
43
43
  * @public
44
44
  * @since 1.37.0
45
- * @version 1.103.0
45
+ * @version 1.105.0
46
46
  * @borrows sap.ui.model.odata.v4.ODataBinding#getGroupId as #getGroupId
47
47
  * @borrows sap.ui.model.odata.v4.ODataBinding#getRootBinding as #getRootBinding
48
48
  * @borrows sap.ui.model.odata.v4.ODataBinding#getUpdateGroupId as #getUpdateGroupId
@@ -365,7 +365,7 @@ sap.ui.define([
365
365
  *
366
366
  * @private
367
367
  */
368
- ODataPropertyBinding.prototype.deregisterChange = function () {
368
+ ODataPropertyBinding.prototype.deregisterChangeListener = function () {
369
369
  var that = this;
370
370
 
371
371
  this.withCache(function (_oCache, sPath, oBinding) {
@@ -383,7 +383,7 @@ sap.ui.define([
383
383
  */
384
384
  // @override sap.ui.model.Binding#destroy
385
385
  ODataPropertyBinding.prototype.destroy = function () {
386
- this.deregisterChange();
386
+ this.deregisterChangeListener();
387
387
  this.oModel.bindingDestroyed(this);
388
388
  this.oCheckUpdateCallToken = undefined;
389
389
  this.mQueryOptions = undefined;
@@ -672,7 +672,7 @@ sap.ui.define([
672
672
  if (this.oContext !== oContext) {
673
673
  if (this.bRelative) {
674
674
  this.checkSuspended(true);
675
- this.deregisterChange();
675
+ this.deregisterChangeListener();
676
676
  }
677
677
  this.oContext = oContext;
678
678
  this.sResumeChangeReason = undefined;