@openui5/sap.ui.core 1.130.0 → 1.131.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 (317) hide show
  1. package/THIRDPARTY.txt +1 -1
  2. package/package.json +1 -1
  3. package/src/jquery.sap.global.js +1 -1
  4. package/src/jquery.sap.properties.js +1 -1
  5. package/src/jquery.sap.resources.js +1 -1
  6. package/src/jquery.sap.script.js +1 -1
  7. package/src/jquery.sap.storage.js +3 -3
  8. package/src/sap/base/Event.js +1 -1
  9. package/src/sap/base/Eventing.js +3 -2
  10. package/src/sap/base/config.js +1 -1
  11. package/src/sap/base/i18n/LanguageTag.js +1 -1
  12. package/src/sap/base/i18n/date/CalendarType.js +3 -1
  13. package/src/sap/base/i18n/date/CalendarWeekNumbering.js +3 -1
  14. package/src/sap/base/i18n/date/TimezoneUtils.js +1 -1
  15. package/src/sap/base/i18n/date/_EnumHelper.js +43 -0
  16. package/src/sap/base/util/clamp.js +26 -0
  17. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  18. package/src/sap/base/util/restricted/_castArray.js +1 -1
  19. package/src/sap/base/util/restricted/_compact.js +1 -1
  20. package/src/sap/base/util/restricted/_curry.js +1 -1
  21. package/src/sap/base/util/restricted/_debounce.js +1 -1
  22. package/src/sap/base/util/restricted/_difference.js +1 -1
  23. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  24. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  25. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  26. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  27. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  28. package/src/sap/base/util/restricted/_flatten.js +1 -1
  29. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  30. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  31. package/src/sap/base/util/restricted/_intersection.js +1 -1
  32. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  33. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  34. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  35. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  36. package/src/sap/base/util/restricted/_isNil.js +1 -1
  37. package/src/sap/base/util/restricted/_max.js +1 -1
  38. package/src/sap/base/util/restricted/_merge.js +1 -1
  39. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  40. package/src/sap/base/util/restricted/_min.js +1 -1
  41. package/src/sap/base/util/restricted/_omit.js +1 -1
  42. package/src/sap/base/util/restricted/_pick.js +1 -1
  43. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  44. package/src/sap/base/util/restricted/_throttle.js +1 -1
  45. package/src/sap/base/util/restricted/_toArray.js +1 -1
  46. package/src/sap/base/util/restricted/_union.js +1 -1
  47. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  48. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  49. package/src/sap/base/util/restricted/_uniq.js +1 -1
  50. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  51. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  52. package/src/sap/base/util/restricted/_without.js +1 -1
  53. package/src/sap/base/util/restricted/_xor.js +1 -1
  54. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  55. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  56. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  57. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  58. package/src/sap/ui/Device.js +11 -8
  59. package/src/sap/ui/Global.js +3 -3
  60. package/src/sap/ui/base/BindingInfo.js +4 -2
  61. package/src/sap/ui/base/DataType.js +7 -2
  62. package/src/sap/ui/base/Event.js +1 -1
  63. package/src/sap/ui/base/EventProvider.js +1 -1
  64. package/src/sap/ui/base/Interface.js +1 -1
  65. package/src/sap/ui/base/ManagedObject.js +1 -1
  66. package/src/sap/ui/base/ManagedObjectMetadata.js +1 -1
  67. package/src/sap/ui/base/Metadata.js +1 -1
  68. package/src/sap/ui/base/Object.js +1 -1
  69. package/src/sap/ui/base/ObjectPool.js +1 -1
  70. package/src/sap/ui/core/.library +3 -3
  71. package/src/sap/ui/core/BlockLayerUtils.js +17 -29
  72. package/src/sap/ui/core/BusyIndicator.js +2 -15
  73. package/src/sap/ui/core/BusyIndicatorUtils.js +34 -3
  74. package/src/sap/ui/core/Component.js +1 -1
  75. package/src/sap/ui/core/ComponentContainer.js +1 -1
  76. package/src/sap/ui/core/ComponentMetadata.js +1 -1
  77. package/src/sap/ui/core/ComponentSupport.js +1 -1
  78. package/src/sap/ui/core/Configuration.js +1 -1
  79. package/src/sap/ui/core/ContextMenuSupport.js +2 -1
  80. package/src/sap/ui/core/Control.js +46 -10
  81. package/src/sap/ui/core/ControlBehavior.js +14 -18
  82. package/src/sap/ui/core/Core.js +2 -2
  83. package/src/sap/ui/core/CustomData.js +1 -1
  84. package/src/sap/ui/core/DeclarativeSupport.js +1 -1
  85. package/src/sap/ui/core/Element.js +230 -32
  86. package/src/sap/ui/core/ElementMetadata.js +1 -1
  87. package/src/sap/ui/core/EnabledPropagator.js +4 -4
  88. package/src/sap/ui/core/EventBus.js +1 -1
  89. package/src/sap/ui/core/FocusMode.js +28 -0
  90. package/src/sap/ui/core/Fragment.js +1 -1
  91. package/src/sap/ui/core/HTML.js +1 -1
  92. package/src/sap/ui/core/History.js +1 -1
  93. package/src/sap/ui/core/Icon.js +1 -1
  94. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  95. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  96. package/src/sap/ui/core/InvisibleMessage.js +1 -1
  97. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  98. package/src/sap/ui/core/InvisibleText.js +1 -1
  99. package/src/sap/ui/core/Item.js +1 -1
  100. package/src/sap/ui/core/LabelEnablement.js +1 -1
  101. package/src/sap/ui/core/LayoutData.js +1 -1
  102. package/src/sap/ui/core/ListItem.js +1 -1
  103. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  104. package/src/sap/ui/core/Locale.js +1 -1
  105. package/src/sap/ui/core/LocaleData.js +3 -3
  106. package/src/sap/ui/core/Manifest.js +2 -2
  107. package/src/sap/ui/core/Message.js +1 -1
  108. package/src/sap/ui/core/Popup.js +12 -0
  109. package/src/sap/ui/core/RenderManager.js +4 -1
  110. package/src/sap/ui/core/Renderer.js +1 -1
  111. package/src/sap/ui/core/ResizeHandler.js +1 -1
  112. package/src/sap/ui/core/ScrollBar.js +1 -1
  113. package/src/sap/ui/core/SeparatorItem.js +1 -1
  114. package/src/sap/ui/core/Title.js +1 -1
  115. package/src/sap/ui/core/TooltipBase.js +1 -1
  116. package/src/sap/ui/core/UIArea.js +1 -1
  117. package/src/sap/ui/core/UIComponent.js +1 -1
  118. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  119. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  120. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  121. package/src/sap/ui/core/XMLComposite.js +1 -1
  122. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  123. package/src/sap/ui/core/_IconRegistry.js +1 -0
  124. package/src/sap/ui/core/cldr/ca.json +1 -1
  125. package/src/sap/ui/core/cldr/cs.json +1 -1
  126. package/src/sap/ui/core/cldr/es.json +2 -2
  127. package/src/sap/ui/core/cldr/es_AR.json +2 -2
  128. package/src/sap/ui/core/cldr/es_BO.json +2 -2
  129. package/src/sap/ui/core/cldr/es_CL.json +2 -2
  130. package/src/sap/ui/core/cldr/es_CO.json +2 -2
  131. package/src/sap/ui/core/cldr/es_PE.json +2 -2
  132. package/src/sap/ui/core/cldr/es_UY.json +2 -2
  133. package/src/sap/ui/core/cldr/es_VE.json +2 -2
  134. package/src/sap/ui/core/cldr/fi.json +1 -1
  135. package/src/sap/ui/core/cldr/hu.json +1 -1
  136. package/src/sap/ui/core/cldr/id.json +2 -2
  137. package/src/sap/ui/core/cldr/mk.json +2 -2
  138. package/src/sap/ui/core/cldr/tr.json +1 -1
  139. package/src/sap/ui/core/cldr/vi.json +2 -2
  140. package/src/sap/ui/core/date/CalendarWeekNumbering.js +1 -1
  141. package/src/sap/ui/core/date/UI5Date.js +1 -1
  142. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  143. package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
  144. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  145. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  146. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  147. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  148. package/src/sap/ui/core/fieldhelp/FieldHelpCustomData.js +5 -1
  149. package/src/sap/ui/core/format/FormatUtils.js +1 -1
  150. package/src/sap/ui/core/format/NumberFormat.js +38 -17
  151. package/src/sap/ui/core/format/TimezoneUtil.js +1 -1
  152. package/src/sap/ui/core/getCompatibilityVersion.js +1 -1
  153. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  154. package/src/sap/ui/core/library.js +23 -19
  155. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  156. package/src/sap/ui/core/message/Message.js +1 -1
  157. package/src/sap/ui/core/message/MessageManager.js +1 -1
  158. package/src/sap/ui/core/message/MessageMixin.js +5 -2
  159. package/src/sap/ui/core/message/MessageParser.js +1 -1
  160. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  161. package/src/sap/ui/core/messagebundle_no.properties +1 -1
  162. package/src/sap/ui/core/mvc/HTMLView.js +1 -1
  163. package/src/sap/ui/core/mvc/JSONView.js +1 -1
  164. package/src/sap/ui/core/mvc/JSView.js +1 -1
  165. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  166. package/src/sap/ui/core/mvc/View.js +1 -1
  167. package/src/sap/ui/core/mvc/XMLView.js +1 -1
  168. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  169. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  170. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  171. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  172. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  173. package/src/sap/ui/core/routing/Target.js +5 -5
  174. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
  175. package/src/sap/ui/core/search/SearchProvider.js +1 -1
  176. package/src/sap/ui/core/service/Service.js +1 -1
  177. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  178. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  179. package/src/sap/ui/core/support/Plugin.js +1 -1
  180. package/src/sap/ui/core/support/Support.js +1 -1
  181. package/src/sap/ui/core/support/bootstrapFallback.js +1 -0
  182. package/src/sap/ui/core/support/plugins/ControlTree.js +1 -1
  183. package/src/sap/ui/core/support/plugins/Interaction.js +1 -1
  184. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  185. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  186. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  187. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  188. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  189. package/src/sap/ui/core/support/plugins/ViewInfo.js +1 -1
  190. package/src/sap/ui/core/themes/base/LocalBusyIndicator.less +1 -0
  191. package/src/sap/ui/core/themes/base/base.less +1353 -247
  192. package/src/sap/ui/core/themes/base/fonts/SAP-icons.ttf +0 -0
  193. package/src/sap/ui/core/themes/base/fonts/SAP-icons.woff2 +0 -0
  194. package/src/sap/ui/core/themes/base/global.less +32 -0
  195. package/src/sap/ui/core/themes/base/skeleton.less +93 -3
  196. package/src/sap/ui/core/theming/ThemeManager.js +2 -2
  197. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  198. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  199. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  200. package/src/sap/ui/core/tmpl/Template.js +1 -1
  201. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  202. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  203. package/src/sap/ui/core/util/Export.js +1 -1
  204. package/src/sap/ui/core/util/ExportCell.js +1 -1
  205. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  206. package/src/sap/ui/core/util/ExportRow.js +1 -1
  207. package/src/sap/ui/core/util/ExportType.js +1 -1
  208. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  209. package/src/sap/ui/core/util/File.js +1 -1
  210. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  211. package/src/sap/ui/core/util/MockServer.js +1 -1
  212. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  213. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  214. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  215. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  216. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  217. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  218. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  219. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  220. package/src/sap/ui/core/webc/WebComponent.js +1 -1
  221. package/src/sap/ui/core/webc/WebComponentMetadata.js +1 -1
  222. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  223. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  224. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  225. package/src/sap/ui/debug/ControlTree.js +1 -1
  226. package/src/sap/ui/debug/DebugEnv.js +1 -1
  227. package/src/sap/ui/debug/PropertyList.js +1 -1
  228. package/src/sap/ui/model/ClientModel.js +1 -1
  229. package/src/sap/ui/model/ClientTreeBinding.js +32 -19
  230. package/src/sap/ui/model/CompositeDataState.js +1 -1
  231. package/src/sap/ui/model/CompositeType.js +1 -1
  232. package/src/sap/ui/model/DataState.js +1 -1
  233. package/src/sap/ui/model/Filter.js +2 -1
  234. package/src/sap/ui/model/MetaModel.js +1 -1
  235. package/src/sap/ui/model/Model.js +1 -1
  236. package/src/sap/ui/model/SelectionModel.js +1 -1
  237. package/src/sap/ui/model/SimpleType.js +1 -1
  238. package/src/sap/ui/model/Sorter.js +61 -31
  239. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  240. package/src/sap/ui/model/TreeBinding.js +21 -17
  241. package/src/sap/ui/model/Type.js +1 -1
  242. package/src/sap/ui/model/analytics/AnalyticalBinding.js +13 -7
  243. package/src/sap/ui/model/base/ManagedObjectModel.js +1 -1
  244. package/src/sap/ui/model/json/JSONModel.js +1 -1
  245. package/src/sap/ui/model/message/MessageModel.js +1 -1
  246. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  247. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  248. package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
  249. package/src/sap/ui/model/odata/ODataMetadata.js +16 -6
  250. package/src/sap/ui/model/odata/ODataModel.js +1 -1
  251. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  252. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  253. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  254. package/src/sap/ui/model/odata/type/Date.js +1 -1
  255. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  256. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  257. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  258. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +1 -1
  259. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  260. package/src/sap/ui/model/odata/type/Double.js +1 -1
  261. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  262. package/src/sap/ui/model/odata/type/Int.js +1 -1
  263. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  264. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  265. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  266. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  267. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  268. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  269. package/src/sap/ui/model/odata/type/Single.js +1 -1
  270. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  271. package/src/sap/ui/model/odata/type/String.js +1 -1
  272. package/src/sap/ui/model/odata/type/Time.js +1 -1
  273. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  274. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  275. package/src/sap/ui/model/odata/v2/Context.js +1 -1
  276. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  277. package/src/sap/ui/model/odata/v2/ODataListBinding.js +7 -4
  278. package/src/sap/ui/model/odata/v2/ODataModel.js +14 -10
  279. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +1 -1
  280. package/src/sap/ui/model/odata/v4/Context.js +1 -1
  281. package/src/sap/ui/model/odata/v4/ODataBinding.js +1 -0
  282. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +6 -1
  283. package/src/sap/ui/model/odata/v4/ODataListBinding.js +74 -11
  284. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +93 -19
  285. package/src/sap/ui/model/odata/v4/ODataModel.js +49 -8
  286. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +3 -1
  287. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +2 -1
  288. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +12 -1
  289. package/src/sap/ui/model/odata/v4/lib/_Cache.js +51 -30
  290. package/src/sap/ui/model/odata/v4/lib/_MetadataRequestor.js +49 -31
  291. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +8 -26
  292. package/src/sap/ui/model/resource/ResourceModel.js +1 -1
  293. package/src/sap/ui/model/type/Boolean.js +1 -1
  294. package/src/sap/ui/model/type/Currency.js +1 -1
  295. package/src/sap/ui/model/type/Date.js +1 -1
  296. package/src/sap/ui/model/type/DateInterval.js +1 -1
  297. package/src/sap/ui/model/type/DateTime.js +1 -1
  298. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  299. package/src/sap/ui/model/type/FileSize.js +1 -1
  300. package/src/sap/ui/model/type/Float.js +1 -1
  301. package/src/sap/ui/model/type/Integer.js +1 -1
  302. package/src/sap/ui/model/type/String.js +1 -1
  303. package/src/sap/ui/model/type/Time.js +1 -1
  304. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  305. package/src/sap/ui/model/type/Unit.js +1 -1
  306. package/src/sap/ui/model/xml/XMLModel.js +1 -1
  307. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  308. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  309. package/src/sap/ui/test/OpaBuilder.js +1 -1
  310. package/src/sap/ui/test/autowaiter/_promiseWaiter.js +21 -0
  311. package/src/sap/ui/test/generic/TestBase.js +1 -1
  312. package/src/sap/ui/test/starter/_utils.js +8 -1
  313. package/src/sap/ui/test/starter/createSuite.js +1 -1
  314. package/src/sap/ui/thirdparty/less.js +23 -72
  315. package/src/sap/ui/util/Storage.js +1 -1
  316. package/src/ui5loader.js +9 -4
  317. package/test/sap/ui/qunit/TestRunner.js +2 -0
@@ -15,6 +15,7 @@ sap.ui.define([
15
15
  "./lib/_Helper",
16
16
  "sap/base/Log",
17
17
  "sap/ui/base/SyncPromise",
18
+ "sap/ui/core/Messaging",
18
19
  "sap/ui/model/Binding",
19
20
  "sap/ui/model/ChangeReason",
20
21
  "sap/ui/model/Filter",
@@ -25,8 +26,8 @@ sap.ui.define([
25
26
  "sap/ui/model/Sorter",
26
27
  "sap/ui/model/odata/OperationMode"
27
28
  ], function (Context, asODataParentBinding, _AggregationCache, _AggregationHelper, _Cache,
28
- _GroupLock, _Helper, Log, SyncPromise, Binding, ChangeReason, Filter, FilterOperator,
29
- FilterProcessor, FilterType, ListBinding, Sorter, OperationMode) {
29
+ _GroupLock, _Helper, Log, SyncPromise, Messaging, Binding, ChangeReason, Filter,
30
+ FilterOperator, FilterProcessor, FilterType, ListBinding, Sorter, OperationMode) {
30
31
  "use strict";
31
32
 
32
33
  var sClassName = "sap.ui.model.odata.v4.ODataListBinding",
@@ -42,7 +43,8 @@ sap.ui.define([
42
43
  patchCompleted : true,
43
44
  patchSent : true,
44
45
  refresh : true,
45
- selectionChanged : true
46
+ selectionChanged : true,
47
+ separateReceived : true
46
48
  },
47
49
  /**
48
50
  * @alias sap.ui.model.odata.v4.ODataListBinding
@@ -57,7 +59,7 @@ sap.ui.define([
57
59
  * @mixes sap.ui.model.odata.v4.ODataParentBinding
58
60
  * @public
59
61
  * @since 1.37.0
60
- * @version 1.130.0
62
+ * @version 1.131.0
61
63
  * @borrows sap.ui.model.odata.v4.ODataBinding#getGroupId as #getGroupId
62
64
  * @borrows sap.ui.model.odata.v4.ODataBinding#getRootBinding as #getRootBinding
63
65
  * @borrows sap.ui.model.odata.v4.ODataBinding#getUpdateGroupId as #getUpdateGroupId
@@ -565,6 +567,36 @@ sap.ui.define([
565
567
  * @since 1.130.0
566
568
  */
567
569
 
570
+ /**
571
+ * The 'separateReceived' event is fired when a separate property request (see '$$separate'
572
+ * binding parameter of {@link sap.ui.model.odata.v4.ODataModel#bindList}) is completed. The
573
+ * <code>start</code> and <code>length</code> parameters can be used to retrieve the received
574
+ * data via {@link #requestContexts}.
575
+ *
576
+ * If the request fails, the <code>errorMessage</code> is a UI5 message containing the back-end
577
+ * error. It is reported to the message model by default unless
578
+ * {@link sap.ui.base.Event#preventDefault} is called.
579
+ *
580
+ * @param {sap.ui.base.Event} oEvent
581
+ * The event object
582
+ * @param {sap.ui.model.odata.v4.ODataListBinding} oEvent.getSource()
583
+ * This binding
584
+ * @param {function():Object<any>} oEvent.getParameters
585
+ * Function which returns an object containing all event parameters
586
+ * @param {string} oEvent.getParameters.property
587
+ * The requested property name
588
+ * @param {number} oEvent.getParameters.start
589
+ * The start index of the requested range
590
+ * @param {number} oEvent.getParameters.length
591
+ * The length of the requested range
592
+ * @param {sap.ui.core.message.Message} [oEvent.getParameters.errorMessage]
593
+ * A UI5 message of type {@link module:sap/ui/core/message/MessageType MessageType.Error}
594
+ *
595
+ * @event sap.ui.model.odata.v4.ODataListBinding#separateReceived
596
+ * @experimental As of version 1.131.0
597
+ * @public
598
+ */
599
+
568
600
  /**
569
601
  * Attach event handler <code>fnFunction</code> to the 'createActivate' event of this binding.
570
602
  *
@@ -1334,7 +1366,7 @@ sap.ui.define([
1334
1366
  this.oDiff = undefined;
1335
1367
  this.aFilters = undefined;
1336
1368
  this.oHeaderContext = undefined;
1337
- // this.mParameters = undefined;
1369
+ this.mParameters = undefined;
1338
1370
  this.mPreviousContextsByPath = undefined;
1339
1371
  this.aPreviousData = undefined;
1340
1372
  this.mQueryOptions = undefined;
@@ -1787,7 +1819,7 @@ sap.ui.define([
1787
1819
  }
1788
1820
 
1789
1821
  return oCache.read(iIndex, iLength, iMaximumPrefetchSize, oGroupLock,
1790
- fnDataRequested
1822
+ fnDataRequested, undefined, that.fireSeparateReceived.bind(that)
1791
1823
  ).then(function (oResult) {
1792
1824
  oResult.$checkStillValid = that.checkSameCache.bind(that, oCache);
1793
1825
 
@@ -2388,6 +2420,34 @@ sap.ui.define([
2388
2420
  this.fireEvent("selectionChanged", {context : oContext});
2389
2421
  };
2390
2422
 
2423
+ /**
2424
+ * Fires the 'separateReceived' event.
2425
+ *
2426
+ * @param {string} sProperty - The requested property name
2427
+ * @param {number} iStart - The start index of the requested range
2428
+ * @param {number} iEnd - The index after the requested range
2429
+ * @param {Error} [oError] - A back-end error
2430
+ *
2431
+ * @private
2432
+ */
2433
+ ODataListBinding.prototype.fireSeparateReceived = function (sProperty, iStart, iEnd, oError) {
2434
+ const oParameters = {
2435
+ property : sProperty,
2436
+ start : iStart,
2437
+ length : iEnd - iStart
2438
+ };
2439
+ if (oError) {
2440
+ oParameters.errorMessage = this.oModel.reportTransitionMessages(
2441
+ _Helper.extractMessages(oError), oError.resourcePath, /*bSilent*/true)[0];
2442
+ }
2443
+
2444
+ const bDefaultAction = this.fireEvent("separateReceived", oParameters, true);
2445
+
2446
+ if (oError && bDefaultAction) {
2447
+ Messaging.updateMessages(undefined, [oParameters.errorMessage]);
2448
+ }
2449
+ };
2450
+
2391
2451
  /**
2392
2452
  * Returns the current object holding the information needed for data aggregation, see
2393
2453
  * {@link #setAggregation}.
@@ -2557,8 +2617,8 @@ sap.ui.define([
2557
2617
  bKeepCurrent) {
2558
2618
  var sChangeReason,
2559
2619
  aContexts,
2560
- bDataRequested = false,
2561
2620
  bFireChange = false,
2621
+ bFireDataReceived,
2562
2622
  bPreventBubbling,
2563
2623
  oPromise,
2564
2624
  bRefreshEvent = !!this.sChangeReason, // ignored for "*VirtualContext"
@@ -2650,8 +2710,10 @@ sap.ui.define([
2650
2710
  // make sure "refresh" is followed by async "change"
2651
2711
  oPromise = this.fetchContexts(iStart, iLength, iMaximumPrefetchSize, undefined,
2652
2712
  /*bAsync*/bRefreshEvent, function () {
2653
- bDataRequested = true;
2654
- that.fireDataRequested(bPreventBubbling);
2713
+ if (bFireDataReceived === undefined) {
2714
+ bFireDataReceived = true;
2715
+ that.fireDataRequested(bPreventBubbling);
2716
+ }
2655
2717
  });
2656
2718
  if (!bRefreshEvent && oPromise.isPending()) {
2657
2719
  this.createContextsForCachedData(iStart, iLength);
@@ -2670,12 +2732,13 @@ sap.ui.define([
2670
2732
  that.oDiff = undefined;
2671
2733
  }
2672
2734
  }
2673
- if (bDataRequested) {
2735
+ if (bFireDataReceived) {
2674
2736
  that.fireDataReceived({data : {}}, bPreventBubbling);
2675
2737
  }
2738
+ bFireDataReceived = false; // no subsequent #fireDataRequested allowed
2676
2739
  }, function (oError) {
2677
2740
  // cache shares promises for concurrent read
2678
- if (bDataRequested) {
2741
+ if (bFireDataReceived) {
2679
2742
  that.fireDataReceived(oError.canceled ? {data : {}} : {error : oError},
2680
2743
  bPreventBubbling);
2681
2744
  }
@@ -158,7 +158,7 @@ sap.ui.define([
158
158
  * @hideconstructor
159
159
  * @public
160
160
  * @since 1.37.0
161
- * @version 1.130.0
161
+ * @version 1.131.0
162
162
  */
163
163
  ODataMetaModel = MetaModel.extend("sap.ui.model.odata.v4.ODataMetaModel", {
164
164
  constructor : constructor
@@ -537,6 +537,7 @@ sap.ui.define([
537
537
  // no need to use UI5Date.getInstance as only the timestamp is relevant
538
538
  this.oLastModified = new Date(0);
539
539
  this.oMetadataPromise = null;
540
+ this.oMetaModelForAnnotations = null; // see #_copyAnnotations
540
541
  this.oModel = oModel;
541
542
  this.mMetadataUrl2Promise = {};
542
543
  this.oRequestor = oRequestor;
@@ -602,37 +603,73 @@ sap.ui.define([
602
603
  };
603
604
 
604
605
  /**
605
- * Changes the given map of annotations by applying the current array of change objects defining
606
- * a metamodel path (pointing to an annotation) and a value to be set for that annotation.
606
+ * Changes the given scope's map of annotations by applying the current array of change objects
607
+ * defining a metamodel path (pointing to an annotation) and a value to be set for that
608
+ * annotation.
607
609
  *
608
- * @param {object} mAnnotations
609
- * the root scope's $Annotations
610
+ * Additionally imports annotations for all own schemas from
611
+ * <code>oMetaModelForAnnotations</code>.
612
+ *
613
+ * @param {object} mScope
614
+ * The $metadata "JSON" of the root service
610
615
  *
611
616
  * @private
617
+ * @see #_copyAnnotations
612
618
  */
613
- ODataMetaModel.prototype._changeAnnotations = function (mAnnotations) {
619
+ ODataMetaModel.prototype._changeAnnotations = function (mScope) {
620
+ if (this.oMetaModelForAnnotations) {
621
+ Object.keys(mScope).forEach((sElement) => {
622
+ if (mScope[sElement].$kind === "Schema") {
623
+ this._doMergeAnnotations({
624
+ $Annotations
625
+ : this.oMetaModelForAnnotations._getAnnotationsForSchema(sElement)
626
+ }, mScope.$Annotations, true);
627
+ }
628
+ });
629
+ }
630
+
614
631
  this.aAnnotationChanges?.forEach(({path : sPath, value : vValue}) => {
615
632
  const iIndexOfAt = sPath.indexOf("@");
616
633
  const sTarget = this.getObject(sPath.slice(0, iIndexOfAt) + "@$ui5.target");
617
634
  if (sTarget) {
618
- mAnnotations[sTarget] ??= {};
619
- mAnnotations[sTarget][sPath.slice(iIndexOfAt)] = vValue;
635
+ mScope.$Annotations[sTarget] ??= {};
636
+ mScope.$Annotations[sTarget][sPath.slice(iIndexOfAt)] = vValue;
620
637
  }
621
638
  });
622
639
  };
623
640
 
641
+ /**
642
+ * Saves the meta model delivering annotations that have to be merged later.
643
+ *
644
+ * @param {sap.ui.model.odata.v4.ODataMetaModel} oMetaModel
645
+ * The meta model delivering annotations
646
+ * @throws {Error}
647
+ * If there are local annotation files
648
+ *
649
+ * @private
650
+ * @see #_changeAnnotations
651
+ * @see #_getAnnotationsForSchema
652
+ */
653
+ ODataMetaModel.prototype._copyAnnotations = function (oMetaModel) {
654
+ if (this.aAnnotationUris) {
655
+ throw new Error("Must not copy annotations when there are local annotation files");
656
+ }
657
+
658
+ this.oMetaModelForAnnotations = oMetaModel;
659
+ };
660
+
624
661
  /**
625
662
  * Merges the given schema's annotations into the root scope's $Annotations.
626
663
  *
627
664
  * @param {object} oSchema
628
- * a schema; schema children are ignored because they do not contain $Annotations
665
+ * A schema; schema children are ignored because they do not contain $Annotations
629
666
  * @param {object} mAnnotations
630
- * the root scope's $Annotations
667
+ * The root scope's $Annotations
631
668
  * @param {boolean} [bPrivileged]
632
- * whether the schema has been loaded from a privileged source and thus may overwrite
669
+ * Whether the schema has been loaded from a privileged source and thus may overwrite
633
670
  * existing annotations
634
671
  * @returns {boolean}
635
- * whether at least one annotation has been merged
672
+ * Whether at least one annotation has been merged
636
673
  *
637
674
  * @private
638
675
  */
@@ -657,9 +694,7 @@ sap.ui.define([
657
694
  }
658
695
 
659
696
  for (const sTarget in oSchema.$Annotations) {
660
- if (!(sTarget in mAnnotations)) {
661
- mAnnotations[sTarget] = {};
662
- }
697
+ mAnnotations[sTarget] ??= {};
663
698
  extend(mAnnotations[sTarget], oSchema.$Annotations[sTarget]);
664
699
  }
665
700
  delete oSchema.$Annotations;
@@ -667,6 +702,31 @@ sap.ui.define([
667
702
  return bMerged;
668
703
  };
669
704
 
705
+ /**
706
+ * Gets all annotations targeting the given schema. The function expects that the metadata and
707
+ * the local annotation files have already been loaded.
708
+ *
709
+ * @param {string} sSchema
710
+ * A namespace, for example "foo.bar.", of a schema
711
+ * @returns {object}
712
+ * All annotations targeting the given schema
713
+ *
714
+ * @private
715
+ * @see #_changeAnnotations
716
+ * @see #_copyAnnotations
717
+ */
718
+ ODataMetaModel.prototype._getAnnotationsForSchema = function (sSchema) {
719
+ const mAnnotations = {};
720
+ const mScope = this.fetchEntityContainer().getResult();
721
+ Object.keys(mScope.$Annotations).forEach((sTarget) => {
722
+ if (sTarget.startsWith(sSchema)) {
723
+ mAnnotations[sTarget] = mScope.$Annotations[sTarget];
724
+ }
725
+ });
726
+
727
+ return mAnnotations;
728
+ };
729
+
670
730
  /**
671
731
  * Returns the schema with the given namespace, or a promise which is resolved as soon as the
672
732
  * schema has been included, or <code>undefined</code> in case the schema is neither present nor
@@ -675,7 +735,7 @@ sap.ui.define([
675
735
  * @param {object} mScope
676
736
  * The $metadata "JSON" of the root service
677
737
  * @param {string} sSchema
678
- * A namespace, for example "foo.bar.", of a schema.
738
+ * A namespace, for example "foo.bar.", of a schema
679
739
  * @param {function} fnLog
680
740
  * The log function
681
741
  * @returns {object|sap.ui.base.SyncPromise|undefined}
@@ -715,7 +775,7 @@ sap.ui.define([
715
775
  }
716
776
  }
717
777
  if (bMerged) {
718
- that._changeAnnotations(mScope.$Annotations);
778
+ that._changeAnnotations(mScope);
719
779
  }
720
780
  }
721
781
 
@@ -942,6 +1002,17 @@ sap.ui.define([
942
1002
  throw new Error("Unsupported operation: v4.ODataMetaModel#bindTree");
943
1003
  };
944
1004
 
1005
+ /**
1006
+ * Destroys this meta model.
1007
+ *
1008
+ * @private
1009
+ */
1010
+ ODataMetaModel.prototype.destroy = function () {
1011
+ this.oMetaModelForAnnotations = undefined;
1012
+
1013
+ MetaModel.prototype.destroy.apply(this);
1014
+ };
1015
+
945
1016
  /**
946
1017
  * Returns a promise for an absolute data binding path of a "4.3.1 Canonical URL" for the given
947
1018
  * context.
@@ -1028,7 +1099,7 @@ sap.ui.define([
1028
1099
  // apply annotation changes before anyone else has access, but after the promise has
1029
1100
  // already resolved (else #fetchObject cannot really be used)
1030
1101
  this.oMetadataPromise.then(
1031
- (mScope) => this._changeAnnotations(mScope.$Annotations),
1102
+ (mScope) => this._changeAnnotations(mScope),
1032
1103
  () => { /* avoid "Uncaught (in promise)" */ });
1033
1104
  }
1034
1105
  }
@@ -2422,7 +2493,8 @@ sap.ui.define([
2422
2493
  /**
2423
2494
  * Creates an OData model for the given URL, normalizes the path, caches it, and retrieves it
2424
2495
  * from the cache upon further requests. The model is read-only ("OneWay") and can, thus, safely
2425
- * be shared. It shares this meta model's security token.
2496
+ * be shared. It shares this meta model's security token. The function expects that the metadata
2497
+ * and the local annotation files have already been loaded.
2426
2498
  *
2427
2499
  * @param {string} sUrl
2428
2500
  * The (relative) $metadata URL, for example "../ValueListService/$metadata"
@@ -2452,6 +2524,8 @@ sap.ui.define([
2452
2524
  serviceUrl : sUrl,
2453
2525
  sharedRequests : true
2454
2526
  });
2527
+ oSharedModel.getMetaModel()._copyAnnotations(this.oMetaModelForAnnotations ?? this);
2528
+
2455
2529
  mSharedModelByUrl.set(sCacheKey, oSharedModel);
2456
2530
  }
2457
2531
  return oSharedModel;
@@ -240,7 +240,7 @@ sap.ui.define([
240
240
  * @extends sap.ui.model.Model
241
241
  * @public
242
242
  * @since 1.37.0
243
- * @version 1.130.0
243
+ * @version 1.131.0
244
244
  */
245
245
  ODataModel = Model.extend("sap.ui.model.odata.v4.ODataModel",
246
246
  /** @lends sap.ui.model.odata.v4.ODataModel.prototype */{
@@ -357,10 +357,11 @@ sap.ui.define([
357
357
  this.mMetadataHeaders = {"Accept-Language" : sLanguageTag};
358
358
 
359
359
  mQueryParams = Object.assign({}, mUriParameters, mParameters.metadataUrlParams);
360
+ const fnGetOrCreateRetryAfterPromise = this.getOrCreateRetryAfterPromise.bind(this);
360
361
  this.oMetaModel = new ODataMetaModel(
361
362
  _MetadataRequestor.create(this.mMetadataHeaders, sODataVersion,
362
363
  mParameters.ignoreAnnotationsFromMetadata, mQueryParams,
363
- mParameters.withCredentials),
364
+ mParameters.withCredentials, fnGetOrCreateRetryAfterPromise),
364
365
  this.sServiceUrl + "$metadata", mParameters.annotationURI, this,
365
366
  mParameters.supportReferences, mQueryParams["sap-language"]);
366
367
  this.oInterface = {
@@ -374,10 +375,8 @@ sap.ui.define([
374
375
  getGroupProperty : this.getGroupProperty.bind(this),
375
376
  getMessagesByPath : this.getMessagesByPath.bind(this),
376
377
  getOptimisticBatchEnabler : this.getOptimisticBatchEnabler.bind(this),
378
+ getOrCreateRetryAfterPromise : fnGetOrCreateRetryAfterPromise,
377
379
  getReporter : this.getReporter.bind(this),
378
- getRetryAfterHandler : function () {
379
- return that.fnRetryAfter;
380
- },
381
380
  isIgnoreETag : function () {
382
381
  return that.bIgnoreETag;
383
382
  },
@@ -430,6 +429,7 @@ sap.ui.define([
430
429
  // ensure the events are respectively fired once for a GET request
431
430
  this.mPath2DataRequestedCount = {};
432
431
  this.fnRetryAfter = null;
432
+ this.oRetryAfterPromise = null;
433
433
  }
434
434
 
435
435
  /**
@@ -1644,6 +1644,8 @@ sap.ui.define([
1644
1644
  this.oRequestor.destroy();
1645
1645
  this.mHeaders = undefined;
1646
1646
  this.mMetadataHeaders = undefined;
1647
+ this.oRetryAfterPromise = undefined;
1648
+
1647
1649
  return Model.prototype.destroy.apply(this, arguments);
1648
1650
  };
1649
1651
 
@@ -2094,6 +2096,35 @@ sap.ui.define([
2094
2096
  return this.fnOptimisticBatchEnabler;
2095
2097
  };
2096
2098
 
2099
+ /**
2100
+ * Returns the promise that is currently being used for "Retry-After" handling. Returns
2101
+ * <code>null</code> if no "Retry-After" is currently known. Creates a new promise if there is
2102
+ * none, an error is given, and a {@link #setRetryAfterHandler handler} is known.
2103
+ *
2104
+ * @param {Error} [oRetryAfterError] - A "Retry-After" error from a back-end call
2105
+ * @returns {Promise|null} The current "Retry-After" promise
2106
+ *
2107
+ * @private
2108
+ */
2109
+ ODataModel.prototype.getOrCreateRetryAfterPromise = function (oRetryAfterError) {
2110
+ if (!this.oRetryAfterPromise && this.fnRetryAfter && oRetryAfterError) {
2111
+ this.oRetryAfterPromise = this.fnRetryAfter(oRetryAfterError);
2112
+ this.oRetryAfterPromise.finally(() => {
2113
+ this.oRetryAfterPromise = null;
2114
+ }).catch(() => { /* catch is only needed due to finally */ });
2115
+ this.oRetryAfterPromise.catch((oError) => {
2116
+ // own error reason is not reported to the message model
2117
+ if (oError === oRetryAfterError) {
2118
+ this.reportError(oError.message, sClassName, oError);
2119
+ } else {
2120
+ oError.$reported = true;
2121
+ }
2122
+ });
2123
+ }
2124
+
2125
+ return this.oRetryAfterPromise;
2126
+ };
2127
+
2097
2128
  /**
2098
2129
  * Method not supported
2099
2130
  *
@@ -2594,10 +2625,15 @@ sap.ui.define([
2594
2625
  * The resource path of the cache that saw the messages; used to resolve the longtext URL and
2595
2626
  * for adjusting a message target in case it is an operation parameter, except the binding
2596
2627
  * parameter
2628
+ * @param {boolean} [bSilent]
2629
+ * Whether the created UI5 messages should only be returned without reporting them
2630
+ * @returns {sap.ui.core.message.Message[]|undefined}
2631
+ * An array of <code>aMessages</code> transformed to UI5 message instances, or
2632
+ * <code>undefined</code> in case there are no messages
2597
2633
  *
2598
2634
  * @private
2599
2635
  */
2600
- ODataModel.prototype.reportTransitionMessages = function (aMessages, sResourcePath) {
2636
+ ODataModel.prototype.reportTransitionMessages = function (aMessages, sResourcePath, bSilent) {
2601
2637
  var sContextPath, oOperationMetadata;
2602
2638
 
2603
2639
  if (!aMessages.length) {
@@ -2617,7 +2653,7 @@ sap.ui.define([
2617
2653
  }
2618
2654
  }
2619
2655
 
2620
- Messaging.updateMessages(undefined, aMessages.map((oMessage) => {
2656
+ const aUI5Messages = aMessages.map((oMessage) => {
2621
2657
  const oOriginalMessage = oMessage;
2622
2658
  if (oOperationMetadata) {
2623
2659
  oMessage = _Helper.clone(oMessage);
@@ -2627,7 +2663,12 @@ sap.ui.define([
2627
2663
  oMessage.transition = true;
2628
2664
 
2629
2665
  return this.createUI5Message(oMessage, sResourcePath, undefined, oOriginalMessage);
2630
- }));
2666
+ });
2667
+ if (!bSilent) {
2668
+ Messaging.updateMessages(undefined, aUI5Messages);
2669
+ }
2670
+
2671
+ return aUI5Messages;
2631
2672
  };
2632
2673
 
2633
2674
  /**
@@ -644,10 +644,12 @@ sap.ui.define([
644
644
  * @since 1.61
645
645
  */
646
646
  ODataParentBinding.prototype.destroy = function () {
647
- // this.mAggregatedQueryOptions = undefined;
647
+ this.mAggregatedQueryOptions = undefined;
648
648
  this.aChildCanUseCachePromises = [];
649
649
  this.removeReadGroupLock();
650
+ this.oRefreshPromise = undefined;
650
651
  this.oResumePromise = undefined;
652
+ this.mCanUseCachePromiseByChildPath = undefined;
651
653
 
652
654
  asODataBinding.prototype.destroy.call(this);
653
655
  };
@@ -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.130.0
45
+ * @version 1.131.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
@@ -388,6 +388,7 @@ sap.ui.define([
388
388
  this.oModel.bindingDestroyed(this);
389
389
  this.oCheckUpdateCallToken = undefined;
390
390
  this.mQueryOptions = undefined;
391
+ this.mScope = undefined;
391
392
  this.vValue = undefined;
392
393
 
393
394
  asODataBinding.prototype.destroy.call(this);
@@ -408,6 +408,9 @@ sap.ui.define([
408
408
  let iRemaining = iCount; // with bAll this is the count of the direct children in the end
409
409
  for (let i = iIndex + 1; i < iIndex + 1 + iRemaining; i += 1) {
410
410
  const oElement = aElements[i];
411
+ if (_Helper.hasPrivateAnnotation(oElement, "placeholder")) {
412
+ continue;
413
+ }
411
414
  if (bAll && oElement["@$ui5.node.isExpanded"]) {
412
415
  iRemaining -= this.collapse(
413
416
  _Helper.getPrivateAnnotation(oElement, "predicate"), oGroupLock, true);
@@ -1881,10 +1884,11 @@ sap.ui.define([
1881
1884
 
1882
1885
  iLength += iPrefetchLength; // "after the given range"
1883
1886
 
1887
+ const iOutOfPlaceCount = this.oTreeState.getOutOfPlaceCount();
1884
1888
  // "before the given range"
1885
1889
  // after a side-effects refresh out-of-place nodes may shift the visible range, we have
1886
1890
  // to read as many nodes before this range to be on the safe side
1887
- iPrefetchLength = Math.max(iPrefetchLength, this.oTreeState.getOutOfPlaceCount());
1891
+ iPrefetchLength = Math.max(iPrefetchLength, iOutOfPlaceCount);
1888
1892
  if (iStart > iPrefetchLength) {
1889
1893
  iLength += iPrefetchLength;
1890
1894
  iStart -= iPrefetchLength;
@@ -1895,12 +1899,19 @@ sap.ui.define([
1895
1899
 
1896
1900
  // Note: this.oFirstLevel.read changes this value
1897
1901
  const bSentRequest = this.oFirstLevel.bSentRequest;
1902
+ if (bSentRequest && iOutOfPlaceCount) { // cannot handle result below, avoid new request
1903
+ oGroupLock = _GroupLock.$cached;
1904
+ }
1898
1905
 
1899
1906
  return SyncPromise.all([
1900
1907
  this.oFirstLevel.read(iStart, iLength, 0, oGroupLock, fnDataRequested),
1901
1908
  // request out-of-place nodes only once
1902
1909
  ...(bSentRequest ? [] : this.requestOutOfPlaceNodes(oGroupLock))
1903
1910
  ]).then(function ([oResult, ...aOutOfPlaceResults]) {
1911
+ if (bSentRequest && iOutOfPlaceCount) {
1912
+ return; // not idempotent due to previous #handleOutOfPlaceNodes
1913
+ }
1914
+
1904
1915
  // Note: this code must be idempotent, it might well run twice!
1905
1916
  var oGrandTotal,
1906
1917
  oGrandTotalCopy,