@openui5/sap.ui.core 1.122.1 → 1.123.1

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 (534) hide show
  1. package/.dtsgenrc +7 -1
  2. package/.eslintrc.json +3 -0
  3. package/package.json +1 -1
  4. package/src/jquery.sap.global.js +1 -17
  5. package/src/jquery.sap.properties.js +1 -1
  6. package/src/jquery.sap.resources.js +1 -1
  7. package/src/jquery.sap.script.js +1 -1
  8. package/src/jquery.sap.storage.js +3 -3
  9. package/src/sap/base/Event.js +1 -1
  10. package/src/sap/base/Eventing.js +1 -1
  11. package/src/sap/base/config.js +1 -1
  12. package/src/sap/base/future.js +3 -1
  13. package/src/sap/base/i18n/Formatting.js +119 -94
  14. package/src/sap/base/i18n/LanguageTag.js +1 -1
  15. package/src/sap/base/i18n/date/TimezoneUtils.js +1 -1
  16. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  17. package/src/sap/base/util/restricted/_castArray.js +1 -1
  18. package/src/sap/base/util/restricted/_compact.js +1 -1
  19. package/src/sap/base/util/restricted/_curry.js +1 -1
  20. package/src/sap/base/util/restricted/_debounce.js +1 -1
  21. package/src/sap/base/util/restricted/_difference.js +1 -1
  22. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  23. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  24. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  25. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  26. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  27. package/src/sap/base/util/restricted/_flatten.js +1 -1
  28. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  29. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  30. package/src/sap/base/util/restricted/_intersection.js +1 -1
  31. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  32. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  33. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  34. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  35. package/src/sap/base/util/restricted/_isNil.js +1 -1
  36. package/src/sap/base/util/restricted/_max.js +1 -1
  37. package/src/sap/base/util/restricted/_merge.js +1 -1
  38. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  39. package/src/sap/base/util/restricted/_min.js +1 -1
  40. package/src/sap/base/util/restricted/_omit.js +1 -1
  41. package/src/sap/base/util/restricted/_pick.js +1 -1
  42. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  43. package/src/sap/base/util/restricted/_throttle.js +1 -1
  44. package/src/sap/base/util/restricted/_toArray.js +1 -1
  45. package/src/sap/base/util/restricted/_union.js +1 -1
  46. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  47. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  48. package/src/sap/base/util/restricted/_uniq.js +1 -1
  49. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  50. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  51. package/src/sap/base/util/restricted/_without.js +1 -1
  52. package/src/sap/base/util/restricted/_xor.js +1 -1
  53. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  54. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  55. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  56. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  57. package/src/sap/ui/Device.js +3 -3
  58. package/src/sap/ui/Global.js +7 -4
  59. package/src/sap/ui/base/BindingInfo.js +22 -0
  60. package/src/sap/ui/base/Event.js +1 -1
  61. package/src/sap/ui/base/EventProvider.js +1 -1
  62. package/src/sap/ui/base/Interface.js +1 -1
  63. package/src/sap/ui/base/ManagedObject.js +5 -14
  64. package/src/sap/ui/base/ManagedObjectMetadata.js +1 -1
  65. package/src/sap/ui/base/Metadata.js +15 -14
  66. package/src/sap/ui/base/Object.js +1 -1
  67. package/src/sap/ui/base/ObjectPool.js +1 -1
  68. package/src/sap/ui/core/.library +1 -1
  69. package/src/sap/ui/core/BusyIndicator.js +1 -1
  70. package/src/sap/ui/core/Component.js +17 -16
  71. package/src/sap/ui/core/ComponentContainer.js +1 -1
  72. package/src/sap/ui/core/ComponentMetadata.js +1 -1
  73. package/src/sap/ui/core/ComponentSupport.js +1 -1
  74. package/src/sap/ui/core/Configuration.js +53 -18
  75. package/src/sap/ui/core/Control.js +1 -1
  76. package/src/sap/ui/core/Core.js +58 -21
  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 +1 -1
  80. package/src/sap/ui/core/ElementMetadata.js +1 -1
  81. package/src/sap/ui/core/EnabledPropagator.js +1 -1
  82. package/src/sap/ui/core/EventBus.js +6 -2
  83. package/src/sap/ui/core/Fragment.js +10 -5
  84. package/src/sap/ui/core/HTML.js +1 -1
  85. package/src/sap/ui/core/History.js +1 -1
  86. package/src/sap/ui/core/Icon.js +1 -1
  87. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  88. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  89. package/src/sap/ui/core/InvisibleMessage.js +1 -1
  90. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  91. package/src/sap/ui/core/InvisibleText.js +1 -1
  92. package/src/sap/ui/core/Item.js +1 -1
  93. package/src/sap/ui/core/LabelEnablement.js +1 -1
  94. package/src/sap/ui/core/LayoutData.js +1 -1
  95. package/src/sap/ui/core/ListItem.js +1 -1
  96. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  97. package/src/sap/ui/core/Locale.js +1 -1
  98. package/src/sap/ui/core/LocaleData.js +37 -21
  99. package/src/sap/ui/core/Manifest.js +1 -1
  100. package/src/sap/ui/core/Message.js +1 -1
  101. package/src/sap/ui/core/RenderManager.js +7 -1
  102. package/src/sap/ui/core/Renderer.js +4 -1
  103. package/src/sap/ui/core/ResizeHandler.js +1 -1
  104. package/src/sap/ui/core/ScrollBar.js +2 -2
  105. package/src/sap/ui/core/SeparatorItem.js +1 -1
  106. package/src/sap/ui/core/Title.js +1 -1
  107. package/src/sap/ui/core/TooltipBase.js +1 -1
  108. package/src/sap/ui/core/UIArea.js +37 -47
  109. package/src/sap/ui/core/UIComponent.js +1 -1
  110. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  111. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  112. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  113. package/src/sap/ui/core/XMLComposite.js +1 -1
  114. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  115. package/src/sap/ui/core/XMLTemplateProcessor.js +12 -0
  116. package/src/sap/ui/core/_IconRegistry.js +1 -0
  117. package/src/sap/ui/core/date/UI5Date.js +1 -1
  118. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  119. package/src/sap/ui/core/delegate/ScrollEnablement.js +2 -2
  120. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  121. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  122. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  123. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  124. package/src/sap/ui/core/format/FormatUtils.js +1 -1
  125. package/src/sap/ui/core/format/NumberFormat.js +28 -3
  126. package/src/sap/ui/core/format/TimezoneUtil.js +1 -1
  127. package/src/sap/ui/core/getCompatibilityVersion.js +6 -2
  128. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  129. package/src/sap/ui/core/library.js +3 -3
  130. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  131. package/src/sap/ui/core/message/Message.js +1 -1
  132. package/src/sap/ui/core/message/MessageManager.js +1 -1
  133. package/src/sap/ui/core/message/MessageParser.js +1 -1
  134. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  135. package/src/sap/ui/core/mvc/HTMLView.js +1 -1
  136. package/src/sap/ui/core/mvc/JSONView.js +1 -1
  137. package/src/sap/ui/core/mvc/JSView.js +1 -1
  138. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  139. package/src/sap/ui/core/mvc/View.js +12 -7
  140. package/src/sap/ui/core/mvc/XMLView.js +1 -1
  141. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  142. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  143. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  144. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  145. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  146. package/src/sap/ui/core/rules/CoreHelper.support.js +2 -3
  147. package/src/sap/ui/core/rules/Misc.support.js +3 -12
  148. package/src/sap/ui/core/rules/Theming.support.js +5 -9
  149. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
  150. package/src/sap/ui/core/search/SearchProvider.js +1 -1
  151. package/src/sap/ui/core/service/Service.js +1 -1
  152. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  153. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  154. package/src/sap/ui/core/support/Plugin.js +1 -1
  155. package/src/sap/ui/core/support/Support.js +1 -20
  156. package/src/sap/ui/core/support/plugins/ControlTree.js +1 -1
  157. package/src/sap/ui/core/support/plugins/Interaction.js +1 -1
  158. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  159. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  160. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  161. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  162. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  163. package/src/sap/ui/core/support/plugins/ViewInfo.js +1 -1
  164. package/src/sap/ui/core/themes/base/.theming +3 -1
  165. package/src/sap/ui/core/themes/base/fonts/SAP-icons.ttf +0 -0
  166. package/src/sap/ui/core/themes/base/fonts/SAP-icons.woff2 +0 -0
  167. package/src/sap/ui/core/theming/Parameters.js +5 -1
  168. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  169. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  170. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  171. package/src/sap/ui/core/tmpl/Template.js +1 -1
  172. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  173. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  174. package/src/sap/ui/core/util/Export.js +2 -2
  175. package/src/sap/ui/core/util/ExportCell.js +2 -2
  176. package/src/sap/ui/core/util/ExportColumn.js +2 -2
  177. package/src/sap/ui/core/util/ExportRow.js +2 -2
  178. package/src/sap/ui/core/util/ExportType.js +2 -2
  179. package/src/sap/ui/core/util/ExportTypeCSV.js +2 -2
  180. package/src/sap/ui/core/util/File.js +1 -1
  181. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  182. package/src/sap/ui/core/util/MockServer.js +1 -1
  183. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  184. package/src/sap/ui/core/util/XMLPreprocessor.js +8 -13
  185. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  186. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  187. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  188. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  189. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  190. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  191. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  192. package/src/sap/ui/core/webc/WebComponent.js +1 -1
  193. package/src/sap/ui/core/webc/WebComponentMetadata.js +1 -1
  194. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  195. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  196. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  197. package/src/sap/ui/debug/ControlTree.js +1 -1
  198. package/src/sap/ui/debug/DebugEnv.js +1 -1
  199. package/src/sap/ui/debug/PropertyList.js +1 -1
  200. package/src/sap/ui/dom/jquery/Aria.js +19 -0
  201. package/src/sap/ui/events/jquery/EventExtension.js +4 -3
  202. package/src/sap/ui/model/ClientModel.js +1 -1
  203. package/src/sap/ui/model/CompositeDataState.js +1 -1
  204. package/src/sap/ui/model/CompositeType.js +4 -4
  205. package/src/sap/ui/model/DataState.js +2 -2
  206. package/src/sap/ui/model/ManagedObjectBindingSupport.js +22 -33
  207. package/src/sap/ui/model/MetaModel.js +1 -1
  208. package/src/sap/ui/model/Model.js +1 -1
  209. package/src/sap/ui/model/SelectionModel.js +1 -1
  210. package/src/sap/ui/model/SimpleType.js +1 -1
  211. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  212. package/src/sap/ui/model/Type.js +1 -1
  213. package/src/sap/ui/model/analytics/AnalyticalVersionInfo.js +1 -1
  214. package/src/sap/ui/model/controlhelper/TreeBindingProxy.js +7 -1
  215. package/src/sap/ui/model/json/JSONModel.js +1 -1
  216. package/src/sap/ui/model/message/MessageModel.js +1 -1
  217. package/src/sap/ui/model/odata/AnnotationHelper.js +11 -8
  218. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  219. package/src/sap/ui/model/odata/ODataExpressionAddons.js +21 -0
  220. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  221. package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
  222. package/src/sap/ui/model/odata/ODataMetadata.js +1 -1
  223. package/src/sap/ui/model/odata/ODataModel.js +1 -1
  224. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  225. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  226. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  227. package/src/sap/ui/model/odata/type/Date.js +1 -1
  228. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  229. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  230. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  231. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +1 -1
  232. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  233. package/src/sap/ui/model/odata/type/Double.js +1 -1
  234. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  235. package/src/sap/ui/model/odata/type/Int.js +1 -1
  236. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  237. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  238. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  239. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  240. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  241. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  242. package/src/sap/ui/model/odata/type/Single.js +1 -1
  243. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  244. package/src/sap/ui/model/odata/type/String.js +1 -1
  245. package/src/sap/ui/model/odata/type/Time.js +1 -1
  246. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  247. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  248. package/src/sap/ui/model/odata/v2/Context.js +1 -1
  249. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  250. package/src/sap/ui/model/odata/v2/ODataModel.js +17 -48
  251. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +1 -1
  252. package/src/sap/ui/model/odata/v4/AnnotationHelper.js +2 -0
  253. package/src/sap/ui/model/odata/v4/Context.js +66 -22
  254. package/src/sap/ui/model/odata/v4/ODataBinding.js +10 -11
  255. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +207 -180
  256. package/src/sap/ui/model/odata/v4/ODataListBinding.js +75 -52
  257. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +9 -11
  258. package/src/sap/ui/model/odata/v4/ODataModel.js +34 -35
  259. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +9 -9
  260. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +20 -8
  261. package/src/sap/ui/model/odata/v4/SubmitMode.js +1 -1
  262. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +126 -46
  263. package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +56 -11
  264. package/src/sap/ui/model/odata/v4/lib/_Cache.js +21 -34
  265. package/src/sap/ui/model/odata/v4/lib/_Helper.js +16 -27
  266. package/src/sap/ui/model/odata/v4/lib/_MetadataConverter.js +2 -6
  267. package/src/sap/ui/model/odata/v4/lib/_MinMaxHelper.js +1 -1
  268. package/src/sap/ui/model/odata/v4/lib/_Parser.js +6 -5
  269. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +49 -38
  270. package/src/sap/ui/model/odata/v4/lib/_TreeState.js +75 -24
  271. package/src/sap/ui/model/odata/v4/lib/_V2MetadataConverter.js +3 -4
  272. package/src/sap/ui/model/odata/v4/lib/_V2Requestor.js +4 -12
  273. package/src/sap/ui/model/odata/v4/lib/_V4MetadataConverter.js +1 -1
  274. package/src/sap/ui/model/resource/ResourceModel.js +1 -1
  275. package/src/sap/ui/model/type/Boolean.js +1 -1
  276. package/src/sap/ui/model/type/Currency.js +48 -4
  277. package/src/sap/ui/model/type/Date.js +1 -1
  278. package/src/sap/ui/model/type/DateInterval.js +1 -1
  279. package/src/sap/ui/model/type/DateTime.js +1 -1
  280. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  281. package/src/sap/ui/model/type/FileSize.js +1 -1
  282. package/src/sap/ui/model/type/Float.js +1 -1
  283. package/src/sap/ui/model/type/Integer.js +1 -1
  284. package/src/sap/ui/model/type/String.js +1 -1
  285. package/src/sap/ui/model/type/Time.js +1 -1
  286. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  287. package/src/sap/ui/model/type/Unit.js +5 -4
  288. package/src/sap/ui/model/xml/XMLModel.js +1 -1
  289. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  290. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +4 -1
  291. package/src/sap/ui/test/ModuleTracking.js +46 -0
  292. package/src/sap/ui/test/OpaBuilder.js +19 -19
  293. package/src/sap/ui/test/autowaiter/_jsAnimationWaiter.js +39 -6
  294. package/src/sap/ui/test/generic/TestBase.js +1 -1
  295. package/src/sap/ui/util/Storage.js +1 -1
  296. package/src/sap/ui/util/_enforceNoReturnValue.js +3 -1
  297. package/src/ui5loader-autoconfig.js +22 -16
  298. package/src/ui5loader.js +38 -1
  299. package/test/sap/ui/core/demokit/docuindex.json +17 -6
  300. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/BasicMessages/Component.js +1 -1
  301. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/BasicMessages/Controller.controller.js +30 -47
  302. package/test/sap/ui/core/demokit/sample/Messaging/BasicMessages/MessagePopover.fragment.xml +13 -0
  303. package/test/sap/ui/core/demokit/sample/Messaging/BasicMessages/View.view.xml +135 -0
  304. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/BasicMessages/manifest.json +2 -2
  305. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/BasicODataMessages/Component.js +1 -1
  306. package/test/sap/ui/core/demokit/sample/Messaging/BasicODataMessages/Controller.controller.js +58 -0
  307. package/test/sap/ui/core/demokit/sample/Messaging/BasicODataMessages/MessagePopover.fragment.xml +13 -0
  308. package/test/sap/ui/core/demokit/sample/Messaging/BasicODataMessages/View.view.xml +57 -0
  309. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/BasicODataMessages/localService/mockserver.js +11 -13
  310. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/BasicODataMessages/manifest.json +2 -2
  311. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/Component.js +1 -1
  312. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/manifest.json +2 -1
  313. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/package.json +1 -1
  314. package/test/sap/ui/core/demokit/sample/Messaging/ODataBackendMessagesComp/ui5.yaml +11 -0
  315. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/webapp/Component.js +2 -2
  316. package/test/sap/ui/core/demokit/sample/Messaging/ODataBackendMessagesComp/webapp/controller/App.controller.js +12 -0
  317. package/test/sap/ui/core/demokit/sample/Messaging/ODataBackendMessagesComp/webapp/controller/BaseController.js +41 -0
  318. package/test/sap/ui/core/demokit/sample/Messaging/ODataBackendMessagesComp/webapp/controller/Employee.controller.js +54 -0
  319. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/webapp/controller/NotFound.controller.js +9 -11
  320. package/test/sap/ui/core/demokit/sample/Messaging/ODataBackendMessagesComp/webapp/fragment/MessagePopover.fragment.xml +13 -0
  321. package/test/sap/ui/core/demokit/sample/Messaging/ODataBackendMessagesComp/webapp/i18n/i18n.properties +9 -0
  322. package/test/sap/ui/core/demokit/sample/Messaging/ODataBackendMessagesComp/webapp/index.html +20 -0
  323. package/test/sap/ui/core/demokit/sample/Messaging/ODataBackendMessagesComp/webapp/index.js +16 -0
  324. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/webapp/localService/mockserver.js +27 -27
  325. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/webapp/manifest.json +7 -4
  326. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/webapp/view/App.view.xml +1 -1
  327. package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/webapp/view/Employee.view.xml +6 -6
  328. package/test/sap/ui/core/demokit/sample/Messaging/ODataBackendMessagesComp/webapp/view/NotFound.view.xml +13 -0
  329. package/test/sap/ui/core/demokit/sample/ViewTemplate/types/Types.controller.js +1 -1
  330. package/test/sap/ui/core/demokit/sample/common/Helper.js +8 -9
  331. package/test/sap/ui/core/demokit/sample/common/SandboxModelHelper.js +1 -1
  332. package/test/sap/ui/core/demokit/sample/gherkin/GherkinWithOPA5/GherkinTestRunner.html +2 -2
  333. package/test/sap/ui/core/demokit/sample/gherkin/GherkinWithPageObjects/GherkinTestRunner.html +2 -2
  334. package/test/sap/ui/core/demokit/sample/gherkin/GherkinWithQUnit/GherkinTestRunner.html +2 -2
  335. package/test/sap/ui/core/demokit/sample/gherkin/GherkinWithQUnit/Steps.js +4 -5
  336. package/test/sap/ui/core/demokit/sample/gherkin/GherkinWithUIComponent/GherkinTestRunner.html +2 -2
  337. package/test/sap/ui/core/demokit/sample/matcher/BindingPath/ui5.yaml +1 -1
  338. package/test/sap/ui/core/demokit/sample/matcher/Descendant/ui5.yaml +1 -1
  339. package/test/sap/ui/core/demokit/sample/matcher/I18NText/ui5.yaml +1 -1
  340. package/test/sap/ui/core/demokit/sample/matcher/LabelFor/ui5.yaml +1 -1
  341. package/test/sap/ui/core/demokit/sample/odata/v2/AutoExpand/AutoExpand.view.xml +1 -0
  342. package/test/sap/ui/core/demokit/sample/odata/v4/ConsumeV2Service/Main.controller.js +1 -1
  343. package/test/sap/ui/core/demokit/sample/odata/v4/Draft/ObjectPage.controller.js +2 -2
  344. package/test/sap/ui/core/demokit/sample/odata/v4/FlatDataAggregation/FlatDataAggregation.controller.js +1 -1
  345. package/test/sap/ui/core/demokit/sample/odata/v4/FlexibleColumnLayout/Main.controller.js +1 -1
  346. package/test/sap/ui/core/demokit/sample/odata/v4/ListBinding/MIT.ListBinding.html +1 -1
  347. package/test/sap/ui/core/demokit/sample/odata/v4/ListBinding/Main.controller.js +5 -7
  348. package/test/sap/ui/core/demokit/sample/odata/v4/ListBinding/Main.view.xml +2 -2
  349. package/test/sap/ui/core/demokit/sample/odata/v4/ListBindingTemplate/MIT.ListBindingTemplate.html +1 -1
  350. package/test/sap/ui/core/demokit/sample/odata/v4/MultipleInlineCreationRowsGrid/Main.controller.js +3 -3
  351. package/test/sap/ui/core/demokit/sample/odata/v4/MultipleInlineCreationRowsGrid/Main.view.xml +6 -5
  352. package/test/sap/ui/core/demokit/sample/odata/v4/MusicArtists/ObjectPage.controller.js +5 -7
  353. package/test/sap/ui/core/demokit/sample/odata/v4/Products/MIT.Products.html +2 -2
  354. package/test/sap/ui/core/demokit/sample/odata/v4/Products/pages/Main.js +1 -1
  355. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/SandboxModel.js +27 -9
  356. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrderTP100_V2/MIT.SalesOrderTP100.html +1 -1
  357. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrderTP100_V4/MIT.SalesOrderTP100.html +1 -1
  358. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/MIT.Basics.html +1 -1
  359. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/MIT.SalesOrderAdditionalTargets.html +1 -1
  360. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/MIT.SalesOrderCreate.html +1 -1
  361. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/MIT.SalesOrderCreateMultiple.html +1 -1
  362. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/MIT.SalesOrderCreateRelative.html +1 -1
  363. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/MIT.SalesOrderMessageHandling.html +3 -3
  364. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/Main.controller.js +5 -5
  365. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/Main.view.xml +3 -3
  366. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/pages/Main.js +7 -9
  367. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/tests/MessageHandling.js +3 -3
  368. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrdersRTATest/MIT.RTA.html +2 -2
  369. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrdersTemplate/MIT.SalesOrdersTemplate.html +1 -1
  370. package/test/sap/ui/core/demokit/sample/odata/v4/Sticky/MIT.Sticky.html +3 -3
  371. package/test/sap/ui/core/demokit/sample/odata/v4/Sticky/Main.controller.js +3 -3
  372. package/test/sap/ui/core/demokit/sample/odata/v4/Sticky/pages/Main.js +1 -1
  373. package/test/sap/ui/core/demokit/tutorial/databinding/01/ui5.yaml +1 -1
  374. package/test/sap/ui/core/demokit/tutorial/databinding/02/ui5.yaml +1 -1
  375. package/test/sap/ui/core/demokit/tutorial/databinding/03/ui5.yaml +1 -1
  376. package/test/sap/ui/core/demokit/tutorial/databinding/04/ui5.yaml +1 -1
  377. package/test/sap/ui/core/demokit/tutorial/databinding/05/ui5.yaml +1 -1
  378. package/test/sap/ui/core/demokit/tutorial/databinding/06/ui5.yaml +1 -1
  379. package/test/sap/ui/core/demokit/tutorial/databinding/07/ui5.yaml +1 -1
  380. package/test/sap/ui/core/demokit/tutorial/databinding/08/ui5.yaml +1 -1
  381. package/test/sap/ui/core/demokit/tutorial/databinding/09/ui5.yaml +1 -1
  382. package/test/sap/ui/core/demokit/tutorial/databinding/10/ui5.yaml +1 -1
  383. package/test/sap/ui/core/demokit/tutorial/databinding/11/ui5.yaml +1 -1
  384. package/test/sap/ui/core/demokit/tutorial/databinding/12/ui5.yaml +1 -1
  385. package/test/sap/ui/core/demokit/tutorial/databinding/13/ui5.yaml +1 -1
  386. package/test/sap/ui/core/demokit/tutorial/databinding/14/ui5.yaml +1 -1
  387. package/test/sap/ui/core/demokit/tutorial/databinding/15/ui5.yaml +1 -1
  388. package/test/sap/ui/core/demokit/tutorial/mockserver/01/ui5.yaml +1 -1
  389. package/test/sap/ui/core/demokit/tutorial/mockserver/02/ui5.yaml +1 -1
  390. package/test/sap/ui/core/demokit/tutorial/mockserver/03/ui5.yaml +1 -1
  391. package/test/sap/ui/core/demokit/tutorial/mockserver/04/ui5.yaml +1 -1
  392. package/test/sap/ui/core/demokit/tutorial/navigation/01/ui5.yaml +1 -1
  393. package/test/sap/ui/core/demokit/tutorial/navigation/02/ui5.yaml +1 -1
  394. package/test/sap/ui/core/demokit/tutorial/navigation/03/ui5.yaml +1 -1
  395. package/test/sap/ui/core/demokit/tutorial/navigation/04/ui5.yaml +1 -1
  396. package/test/sap/ui/core/demokit/tutorial/navigation/05/ui5.yaml +1 -1
  397. package/test/sap/ui/core/demokit/tutorial/navigation/06/ui5.yaml +1 -1
  398. package/test/sap/ui/core/demokit/tutorial/navigation/07/ui5.yaml +1 -1
  399. package/test/sap/ui/core/demokit/tutorial/navigation/08/ui5.yaml +1 -1
  400. package/test/sap/ui/core/demokit/tutorial/navigation/09/ui5.yaml +1 -1
  401. package/test/sap/ui/core/demokit/tutorial/navigation/10/ui5.yaml +1 -1
  402. package/test/sap/ui/core/demokit/tutorial/navigation/11/ui5.yaml +1 -1
  403. package/test/sap/ui/core/demokit/tutorial/navigation/12/ui5.yaml +1 -1
  404. package/test/sap/ui/core/demokit/tutorial/navigation/13/ui5.yaml +1 -1
  405. package/test/sap/ui/core/demokit/tutorial/navigation/14/ui5.yaml +1 -1
  406. package/test/sap/ui/core/demokit/tutorial/navigation/15/ui5.yaml +1 -1
  407. package/test/sap/ui/core/demokit/tutorial/navigation/16/ui5.yaml +1 -1
  408. package/test/sap/ui/core/demokit/tutorial/navigation/17/ui5.yaml +1 -1
  409. package/test/sap/ui/core/demokit/tutorial/odatav4/01/ui5.yaml +1 -1
  410. package/test/sap/ui/core/demokit/tutorial/odatav4/02/ui5.yaml +1 -1
  411. package/test/sap/ui/core/demokit/tutorial/odatav4/03/ui5.yaml +1 -1
  412. package/test/sap/ui/core/demokit/tutorial/odatav4/04/ui5.yaml +1 -1
  413. package/test/sap/ui/core/demokit/tutorial/odatav4/05/ui5.yaml +1 -1
  414. package/test/sap/ui/core/demokit/tutorial/odatav4/06/ui5.yaml +1 -1
  415. package/test/sap/ui/core/demokit/tutorial/odatav4/06/webapp/localService/mockserver.js +1 -1
  416. package/test/sap/ui/core/demokit/tutorial/odatav4/07/ui5.yaml +1 -1
  417. package/test/sap/ui/core/demokit/tutorial/odatav4/07/webapp/localService/mockserver.js +1 -1
  418. package/test/sap/ui/core/demokit/tutorial/odatav4/08/ui5.yaml +1 -1
  419. package/test/sap/ui/core/demokit/tutorial/odatav4/08/webapp/controller/App.controller.js +1 -1
  420. package/test/sap/ui/core/demokit/tutorial/odatav4/08/webapp/localService/mockserver.js +1 -1
  421. package/test/sap/ui/core/demokit/tutorial/odatav4/09/ui5.yaml +1 -1
  422. package/test/sap/ui/core/demokit/tutorial/odatav4/09/webapp/controller/App.controller.js +1 -1
  423. package/test/sap/ui/core/demokit/tutorial/odatav4/09/webapp/localService/mockserver.js +1 -1
  424. package/test/sap/ui/core/demokit/tutorial/odatav4/10/ui5.yaml +1 -1
  425. package/test/sap/ui/core/demokit/tutorial/odatav4/10/webapp/controller/App.controller.js +1 -1
  426. package/test/sap/ui/core/demokit/tutorial/odatav4/10/webapp/localService/mockserver.js +1 -1
  427. package/test/sap/ui/core/demokit/tutorial/odatav4/11/ui5.yaml +1 -1
  428. package/test/sap/ui/core/demokit/tutorial/odatav4/11/webapp/controller/App.controller.js +1 -1
  429. package/test/sap/ui/core/demokit/tutorial/odatav4/11/webapp/localService/mockserver.js +1 -1
  430. package/test/sap/ui/core/demokit/tutorial/troubleshooting/01/ui5.yaml +1 -1
  431. package/test/sap/ui/core/internal/samples/odata/v2/Products/Main.view.xml +1 -1
  432. package/test/sap/ui/core/qunit/CustomStyleClassSupport.qunit.js +12 -3
  433. package/test/sap/ui/core/qunit/CustomThemeFallback.qunit.js +33 -38
  434. package/test/sap/ui/core/qunit/CustomThemeFallback_unavoidablySync.qunit.js +119 -0
  435. package/test/sap/ui/core/qunit/EventBus.qunit.js +15 -0
  436. package/test/sap/ui/core/qunit/Lib_terminologies.qunit.js +109 -0
  437. package/test/sap/ui/core/qunit/StashedControlSupport_unavoidablySync.qunit.js +19 -0
  438. package/test/sap/ui/core/qunit/StashedControlSupport_unavoidablySync.view.xml +27 -0
  439. package/test/sap/ui/core/qunit/app/ThemeClassParameters.qunit.js +105 -140
  440. package/test/sap/ui/core/qunit/app/testsuite.app.qunit.js +75 -2
  441. package/test/sap/ui/core/qunit/base/Config.qunit.js +6 -2
  442. package/test/sap/ui/core/qunit/base/Config_bootstrap.qunit.html +4 -1
  443. package/test/sap/ui/core/qunit/base/Config_bootstrap.qunit.js +6 -2
  444. package/test/sap/ui/core/qunit/base/Config_cascade.qunit.js +6 -3
  445. package/test/sap/ui/core/qunit/base/Config_global.qunit.html +5 -2
  446. package/test/sap/ui/core/qunit/base/Config_meta.qunit.html +5 -2
  447. package/test/sap/ui/core/qunit/base/Config_noUrl.qunit.html +5 -2
  448. package/test/sap/ui/core/qunit/base/Config_noUrl.qunit.js +5 -1
  449. package/test/sap/ui/core/qunit/base/Config_url.qunit.html +5 -2
  450. package/test/sap/ui/core/qunit/bootstrap/BootstrapWithNoJQuery-without-jquery-ui-position.qunit.html +2 -1
  451. package/test/sap/ui/core/qunit/bootstrap/BootstrapWithNoJQuery.qunit.html +2 -1
  452. package/test/sap/ui/core/qunit/bootstrap/DebugMode.beforeBootstrap.qunit.js +7 -0
  453. package/test/sap/ui/core/qunit/bootstrap/DebugModeAsync.qunit.html +10 -4
  454. package/test/sap/ui/core/qunit/bootstrap/testsuite.bootstrap.qunit.js +7 -0
  455. package/test/sap/ui/core/qunit/component/Component_keepAlive.qunit.js +9 -0
  456. package/test/sap/ui/core/qunit/gherkin/fixture/testHarnessAmbiguous.html +2 -2
  457. package/test/sap/ui/core/qunit/gherkin/fixture/testHarnessDuplicate.html +2 -2
  458. package/test/sap/ui/core/qunit/gherkin/fixture/testHarnessFailing.html +2 -2
  459. package/test/sap/ui/core/qunit/gherkin/opa5TestHarness.qunit.html +2 -2
  460. package/test/sap/ui/core/qunit/gherkin/qUnitTestHarness.qunit.html +2 -2
  461. package/test/sap/ui/core/qunit/gherkin/testHarnessTests.js +1 -1
  462. package/test/sap/ui/core/qunit/i18n/GenericLocaleData.qunit.js +1 -1
  463. package/test/sap/ui/core/qunit/i18n/LocaleData.qunit.js +15 -15
  464. package/test/sap/ui/core/qunit/i18n/testsuite.i18n.qunit.js +7 -1
  465. package/test/sap/ui/core/qunit/loader/config.qunit.js +14 -6
  466. package/test/sap/ui/core/qunit/model/PropertyBinding.qunit.js +288 -0
  467. package/test/sap/ui/core/qunit/model/controlhelper/TreeBindingProxy.qunit.js +12 -0
  468. package/test/sap/ui/core/qunit/mvc/Controller.qunit.js +7 -2
  469. package/test/sap/ui/core/qunit/odata/v2/ODataModel.integration.qunit.js +225 -40
  470. package/test/sap/ui/core/qunit/odata/v2/ODataPropertyBinding.qunit.js +78 -7
  471. package/test/sap/ui/core/qunit/odata/v4/Context.qunit.js +142 -17
  472. package/test/sap/ui/core/qunit/odata/v4/ODataContextBinding.qunit.js +93 -87
  473. package/test/sap/ui/core/qunit/odata/v4/ODataListBinding.qunit.js +116 -86
  474. package/test/sap/ui/core/qunit/odata/v4/ODataMetaModel.qunit.js +3 -3
  475. package/test/sap/ui/core/qunit/odata/v4/ODataModel.integration.qunit.js +1828 -548
  476. package/test/sap/ui/core/qunit/odata/v4/ODataModel.realOData.qunit.js +1 -1
  477. package/test/sap/ui/core/qunit/odata/v4/ODataParentBinding.qunit.js +1 -1
  478. package/test/sap/ui/core/qunit/odata/v4/ODataPropertyBinding.qunit.js +26 -23
  479. package/test/sap/ui/core/qunit/odata/v4/data/metadata_special_cases.xml +9 -0
  480. package/test/sap/ui/core/qunit/odata/v4/lib/_AggregationCache.qunit.js +251 -113
  481. package/test/sap/ui/core/qunit/odata/v4/lib/_AggregationHelper.qunit.js +50 -0
  482. package/test/sap/ui/core/qunit/odata/v4/lib/_Cache.qunit.js +3 -3
  483. package/test/sap/ui/core/qunit/odata/v4/lib/_Helper.qunit.js +31 -11
  484. package/test/sap/ui/core/qunit/odata/v4/lib/_Parser.qunit.js +8 -2
  485. package/test/sap/ui/core/qunit/odata/v4/lib/_Requestor.qunit.js +46 -31
  486. package/test/sap/ui/core/qunit/odata/v4/lib/_TreeState.qunit.js +144 -45
  487. package/test/sap/ui/core/qunit/odata/v4/lib/_V2Requestor.qunit.js +5 -5
  488. package/test/sap/ui/core/qunit/odata/v4/lib/data/v2/QM_INSP_PLAN_SRV/metadata.xml +3 -3
  489. package/test/sap/ui/core/qunit/odata/v4/lib/data/v2/QM_INSP_PLAN_SRV/metadata_only.xml +3 -3
  490. package/test/sap/ui/core/qunit/opa/autowaiter/_jsAnimationWaiter.js +82 -0
  491. package/test/sap/ui/core/qunit/testdata/libraries/terminologies/simple/i18n/i18n_fr.properties +1 -0
  492. package/test/sap/ui/core/qunit/testdata/libraries/terminologies/simple/i18n/terminologies/oil/i18n_fr.properties +2 -0
  493. package/test/sap/ui/core/qunit/testdata/libraries/terminologies/simple/library-preload.js +2 -2
  494. package/test/sap/ui/core/qunit/testdata/uilib-custom-theme-fallback/themes/sap_hcb/library.css +3 -0
  495. package/test/sap/ui/core/qunit/testsuite.core.framework.qunit.js +19 -1
  496. package/test/sap/ui/core/qunit/testsuites/testsuite.theming.qunit.js +14 -0
  497. package/test/sap/ui/core/qunit/types/NumberFormat.qunit.js +37 -20
  498. package/test/sap/ui/core/qunit/types/NumberFormatCurrencies.qunit.js +21 -0
  499. package/test/sap/ui/core/qunit/types/Types.qunit.js +126 -15
  500. package/test/sap/ui/core/qunit/ui5classes/ManagedObject.qunit.js +58 -4
  501. package/test/sap/ui/core/relnotes/changes-1.122.json +0 -22
  502. package/test/sap/ui/core/relnotes/changes-1.123.json +47 -0
  503. package/test/sap/ui/core/samples/databinding/DataBindingDeclarativeSyntax.js +55 -56
  504. package/test/sap/ui/core/samples/databinding/DatabindingDeclarativeSyntax.html +4 -4
  505. package/test/sap/ui/core/visual/images/ContextMenuSupport/windows/1600x1200/chrome/horizon/ltr/cozy/firstItem-contextMenu.ref.lnk +1 -1
  506. package/test/sap/ui/core/visual/images/ContextMenuSupport/windows/1600x1200/chrome/horizon/ltr/cozy/initial.ref.lnk +1 -1
  507. package/test/sap/ui/core/visual/images/ContextMenuSupport/windows/1600x1200/chrome/horizon/ltr/cozy/lastItem-contextMenu.ref.lnk +1 -1
  508. package/test/sap/ui/core/visual/images/ContextMenuSupport/windows/1600x1200/chrome/horizon/ltr/cozy/leftDownBtn-contextMenu.ref.lnk +1 -1
  509. package/test/sap/ui/core/visual/images/ContextMenuSupport/windows/1600x1200/chrome/horizon/ltr/cozy/myButtonSample-contextMenu.ref.lnk +1 -1
  510. package/test/sap/ui/core/visual/images/ContextMenuSupport/windows/1600x1200/chrome/horizon/ltr/cozy/rightDownBtn-contextMenu.ref.lnk +1 -1
  511. package/test/testsuite/js/testfwk.js +47 -64
  512. package/test/sap/ui/core/demokit/sample/MessageManager/BasicMessages/MessagePopover.fragment.xml +0 -13
  513. package/test/sap/ui/core/demokit/sample/MessageManager/BasicMessages/View.view.xml +0 -136
  514. package/test/sap/ui/core/demokit/sample/MessageManager/BasicODataMessages/Controller.controller.js +0 -74
  515. package/test/sap/ui/core/demokit/sample/MessageManager/BasicODataMessages/MessagePopover.fragment.xml +0 -13
  516. package/test/sap/ui/core/demokit/sample/MessageManager/BasicODataMessages/View.view.xml +0 -58
  517. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/ui5.yaml +0 -11
  518. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/webapp/controller/App.controller.js +0 -14
  519. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/webapp/controller/BaseController.js +0 -55
  520. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/webapp/controller/Employee.controller.js +0 -56
  521. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/webapp/fragment/MessagePopover.fragment.xml +0 -13
  522. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/webapp/i18n/i18n.properties +0 -5
  523. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/webapp/index.html +0 -42
  524. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/webapp/view/NotFound.view.xml +0 -11
  525. package/test/sap/ui/core/qunit/app/beforeBootstrap.js +0 -19
  526. package/test/sap/ui/core/qunit/base/i18n/Formatting.qunit.html +0 -24
  527. /package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/BasicODataMessages/localService/metadata.xml +0 -0
  528. /package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/BasicODataMessages/localService/mockdata/Employees.json +0 -0
  529. /package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/BasicODataMessages/localService/response/ODataErrorResponse.json +0 -0
  530. /package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/webapp/localService/metadata.xml +0 -0
  531. /package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/webapp/localService/mockdata/Employees.json +0 -0
  532. /package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/webapp/localService/mockdata/Employees_3.json +0 -0
  533. /package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/webapp/localService/response/ODataErrorResponseTemplate.json +0 -0
  534. /package/test/sap/ui/core/demokit/sample/{MessageManager → Messaging}/ODataBackendMessagesComp/webapp/localService/response/SAP-Message-Header.json +0 -0
@@ -131,7 +131,7 @@ sap.ui.define([
131
131
  throw new Error("Completed more PATCH requests than sent");
132
132
  }
133
133
  this.iPatchCounter -= 1;
134
- this.bPatchSuccess = this.bPatchSuccess && bSuccess;
134
+ this.bPatchSuccess &&= bSuccess;
135
135
  if (this.iPatchCounter === 0) {
136
136
  this.fireEvent("patchCompleted", {success : this.bPatchSuccess});
137
137
  this.bPatchSuccess = true;
@@ -296,10 +296,10 @@ sap.ui.define([
296
296
  }
297
297
  return true;
298
298
  case "$expand":
299
- mAggregatedQueryOptions.$expand = mAggregatedQueryOptions.$expand || {};
299
+ mAggregatedQueryOptions.$expand ??= {};
300
300
  return Object.keys(mQueryOptions0.$expand).every(mergeExpandPath);
301
301
  case "$select":
302
- mAggregatedQueryOptions.$select = mAggregatedQueryOptions.$select || [];
302
+ mAggregatedQueryOptions.$select ??= [];
303
303
  return mQueryOptions0.$select.every(mergeSelectPath);
304
304
  default:
305
305
  if (bAdd) {
@@ -398,8 +398,8 @@ sap.ui.define([
398
398
  sChangeReason = ChangeReason.Filter;
399
399
  } else if (sName === "$orderby" && sChangeReason !== ChangeReason.Filter) {
400
400
  sChangeReason = ChangeReason.Sort;
401
- } else if (!sChangeReason) {
402
- sChangeReason = ChangeReason.Change;
401
+ } else {
402
+ sChangeReason ??= ChangeReason.Change;
403
403
  }
404
404
  }
405
405
 
@@ -1069,7 +1069,7 @@ sap.ui.define([
1069
1069
  return _Helper.getQueryOptionsForPath(this.getQueryOptionsFromParameters(), sPath);
1070
1070
  }
1071
1071
 
1072
- oContext = oContext || this.oContext;
1072
+ oContext ??= this.oContext;
1073
1073
  // oContext is always set; as getQueryOptionsForPath is called only from ODLB#doCreateCache
1074
1074
  // binding has no parameters -> no own query options
1075
1075
  if (!this.bRelative || !oContext.getQueryOptionsForPath) {
@@ -1343,7 +1343,7 @@ sap.ui.define([
1343
1343
  };
1344
1344
 
1345
1345
  /**
1346
- * Resumes this binding. The binding can again fire change events and trigger data service
1346
+ * Resumes this binding. The binding can again fire change events and initiate data service
1347
1347
  * requests.
1348
1348
  *
1349
1349
  * @param {boolean} bAsPrerenderingTask
@@ -1390,7 +1390,7 @@ sap.ui.define([
1390
1390
  };
1391
1391
 
1392
1392
  /**
1393
- * Resumes this binding. The binding can then again fire change events and trigger data service
1393
+ * Resumes this binding. The binding can then again fire change events and initiate data service
1394
1394
  * requests.
1395
1395
  * Before 1.53.0, this method was not supported and threw an error.
1396
1396
  *
@@ -1452,7 +1452,7 @@ sap.ui.define([
1452
1452
  };
1453
1453
 
1454
1454
  /**
1455
- * Suspends this binding. A suspended binding does not fire change events nor does it trigger
1455
+ * Suspends this binding. A suspended binding does not fire change events nor does it initiate
1456
1456
  * data service requests. Call {@link #resume} to resume the binding. Before 1.53.0, this method
1457
1457
  * was not supported and threw an error. Since 1.97.0, pending changes are ignored if they
1458
1458
  * relate to a {@link sap.ui.model.odata.v4.Context#isKeepAlive kept-alive} context of this
@@ -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.122.1
45
+ * @version 1.123.1
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
@@ -226,7 +226,7 @@ sap.ui.define([
226
226
  * type information.
227
227
  * If the binding's path cannot be resolved or if reading the binding's value fails or if the
228
228
  * value read is invalid (e.g. not a primitive value), the binding's value is reset to
229
- * <code>undefined</code>. As described above, this may trigger a change event depending on the
229
+ * <code>undefined</code>. As described above, this may initiate a change event depending on the
230
230
  * previous value and the <code>bForceUpdate</code> parameter. In the end the data state is
231
231
  * checked (see {@link sap.ui.model.PropertyBinding#checkDataState}) even if there is no change
232
232
  * event. If there are multiple synchronous <code>checkUpdateInternal</code> calls the data
@@ -341,8 +341,7 @@ sap.ui.define([
341
341
  });
342
342
  if (bForceUpdate && vValue.isFulfilled()) {
343
343
  if (vType && vType.isFulfilled && vType.isFulfilled()) {
344
- PropertyBinding.prototype.setType
345
- .call(this, vType.getResult(), this.sInternalType);
344
+ this.doSetType(vType.getResult());
346
345
  }
347
346
  this.vValue = vValue.getResult();
348
347
  }
@@ -356,7 +355,7 @@ sap.ui.define([
356
355
 
357
356
  if (oCallToken === that.oCheckUpdateCallToken) { // latest call to checkUpdateInternal
358
357
  that.oCheckUpdateCallToken = undefined;
359
- PropertyBinding.prototype.setType.call(that, oType, that.sInternalType);
358
+ that.doSetType(oType);
360
359
  if (oCallToken.forceUpdate || that.vValue !== vValue) {
361
360
  that.bInitial = false;
362
361
  that.vValue = vValue;
@@ -423,6 +422,19 @@ sap.ui.define([
423
422
  return this.isRoot() ? this.mQueryOptions : undefined;
424
423
  };
425
424
 
425
+ /**
426
+ * Sets the given type for this binding while keeping its internal type.
427
+ *
428
+ * @param {sap.ui.model.Type} oType
429
+ * The type for this binding
430
+ *
431
+ * @private
432
+ * @see sap.ui.model.PropertyBinding#setType
433
+ */
434
+ ODataPropertyBinding.prototype.doSetType = function (oType) {
435
+ PropertyBinding.prototype.setType.call(this, oType, this.sInternalType);
436
+ };
437
+
426
438
  /**
427
439
  * @override
428
440
  * @see sap.ui.model.odata.v4.ODataBinding#getDependentBindings
@@ -673,7 +685,7 @@ sap.ui.define([
673
685
  };
674
686
 
675
687
  /**
676
- * Sets the (base) context if the binding path is relative. Triggers (@link #fetchCache) to
688
+ * Sets the (base) context if the binding path is relative. Invokes (@link #fetchCache) to
677
689
  * create a cache and {@link #checkUpdate} to check for the current value if the
678
690
  * context has changed. In case of absolute bindings nothing is done.
679
691
  *
@@ -695,7 +707,7 @@ sap.ui.define([
695
707
  // Note: this.oType => this.sReducedPath
696
708
  && _Helper.getMetaPath(this.oModel.resolve(this.sPath, oContext))
697
709
  !== _Helper.getMetaPath(this.sReducedPath)) {
698
- PropertyBinding.prototype.setType.call(this, undefined, this.sInternalType);
710
+ this.doSetType(undefined);
699
711
  }
700
712
  this.sReducedPath = undefined;
701
713
  }
@@ -746,7 +758,7 @@ sap.ui.define([
746
758
  * {@link sap.ui.model.odata.v4.ODataModel#event:propertyChange 'propertyChange'} event is
747
759
  * fired and provides a promise on the outcome of the asynchronous operation. Since 1.122.0
748
760
  * this method allows updates to the client-side annotation "@$ui5.context.isSelected". Note:
749
- * Changing the value of a client-side annotation never triggers a PATCH request, no matter
761
+ * Changing the value of a client-side annotation never initiates a PATCH request, no matter
750
762
  * which <code>sGroupId</code> is given. Thus, it cannot be reverted via {@link #resetChanges}.
751
763
  *
752
764
  * @param {any} vValue
@@ -25,7 +25,7 @@ sap.ui.define(function () {
25
25
  API : "API",
26
26
 
27
27
  /**
28
- * Requests associated with the group ID are sent in a batch request which is triggered
28
+ * Requests associated with the group ID are sent in a batch request which is initiated
29
29
  * automatically before rendering.
30
30
  * @public
31
31
  */
@@ -176,6 +176,7 @@ sap.ui.define([
176
176
  return SyncPromise.resolve(
177
177
  this.oRequestor.request("DELETE", sEditUrl, oGroupLock, {"If-Match" : oElement})
178
178
  ).then(() => {
179
+ this.oTreeState.delete(oElement);
179
180
  // the element might have moved due to parallel insert/delete
180
181
  iIndex = _Cache.getElementIndex(this.aElements, sPredicate, iIndex);
181
182
  // remove in parent cache
@@ -402,6 +403,7 @@ sap.ui.define([
402
403
  _Helper.getPrivateAnnotation(aElements[i], "transientPredicate")];
403
404
  }
404
405
  const aSpliced = aElements.splice(iIndex + 1, iCount);
406
+ aSpliced.$level = oGroupNode["@$ui5.node.level"];
405
407
  aSpliced.$rank = _Helper.getPrivateAnnotation(oGroupNode, "rank");
406
408
  _Helper.setPrivateAnnotation(oGroupNode, "spliced", aSpliced);
407
409
  aElements.$count -= iCount;
@@ -554,7 +556,7 @@ sap.ui.define([
554
556
  if (oCache === this.oFirstLevel && this.oAggregation.expandTo > 1) {
555
557
  const [iRank] = await Promise.all([
556
558
  this.requestRank(oEntityData, oGroupLock),
557
- this.requestNodeProperty(oEntityData, oGroupLock)
559
+ this.requestNodeProperty(oEntityData, oGroupLock, /*bDropFilter*/true)
558
560
  ]);
559
561
 
560
562
  oCache.removeElement(0, sTransientPredicate);
@@ -565,7 +567,7 @@ sap.ui.define([
565
567
  _Helper.setPrivateAnnotation(oEntityData, "rank", iRank);
566
568
  this.shiftRank(iIndex, +1);
567
569
  } else {
568
- await this.requestNodeProperty(oEntityData, oGroupLock);
570
+ await this.requestNodeProperty(oEntityData, oGroupLock, /*bDropFilter*/true);
569
571
  }
570
572
 
571
573
  return oEntityData;
@@ -588,7 +590,7 @@ sap.ui.define([
588
590
  _AggregationCache.prototype.createGroupLevelCache = function (oGroupNode, bHasConcatHelper) {
589
591
  var oAggregation = this.oAggregation,
590
592
  iLevel = oGroupNode ? oGroupNode["@$ui5.node.level"] + 1 : 1,
591
- aAllProperties, oCache, aGroupBy, bLeaf, mQueryOptions, bTotal;
593
+ aAllProperties, oCache, aGroupBy, bLeaf, sParentFilter, mQueryOptions, bTotal;
592
594
 
593
595
  if (oAggregation.hierarchyQualifier) {
594
596
  mQueryOptions = Object.assign({}, this.mQueryOptions);
@@ -605,8 +607,8 @@ sap.ui.define([
605
607
  });
606
608
  }
607
609
  if (oGroupNode) {
608
- const sParentFilter = _Helper.getPrivateAnnotation(oGroupNode, "filter")
609
- || _Helper.getKeyFilter(oGroupNode, oAggregation.$metaPath, this.getTypes());
610
+ sParentFilter = _Helper.getPrivateAnnotation(oGroupNode, "filter")
611
+ || _Helper.getKeyFilter(oGroupNode, this.sMetaPath, this.getTypes());
610
612
  // Note: parent filter is just eq/and, no need for parentheses, but
611
613
  // $$filterBeforeAggregate is a black box! Put specific filter 1st for performance!
612
614
  mQueryOptions.$$filterBeforeAggregate = sParentFilter
@@ -625,6 +627,9 @@ sap.ui.define([
625
627
  ? _AggregationCache.calculateKeyPredicateRH.bind(null, oGroupNode, oAggregation)
626
628
  : _AggregationCache.calculateKeyPredicate.bind(null, oGroupNode, aGroupBy,
627
629
  aAllProperties, bLeaf, bTotal);
630
+ if (sParentFilter) {
631
+ oCache.$parentFilter = sParentFilter;
632
+ }
628
633
 
629
634
  return oCache;
630
635
  };
@@ -672,7 +677,7 @@ sap.ui.define([
672
677
  this.aElements.$byPredicate = aOldElements.$byPredicate;
673
678
  iCount = aSpliced.length;
674
679
  this.aElements.$count = aOldElements.$count + iCount;
675
- const iLevelDiff = oGroupNode["@$ui5.node.level"] + 1 - aSpliced[0]["@$ui5.node.level"];
680
+ const iLevelDiff = oGroupNode["@$ui5.node.level"] - aSpliced.$level;
676
681
  const iRankDiff = _Helper.getPrivateAnnotation(oGroupNode, "rank") - aSpliced.$rank;
677
682
  aSpliced.forEach(function (oElement) {
678
683
  var sPredicate = _Helper.getPrivateAnnotation(oElement, "predicate");
@@ -825,7 +830,7 @@ sap.ui.define([
825
830
  return oPromise;
826
831
  }
827
832
 
828
- const sFilter = _Helper.getKeyFilter(oNode, this.oAggregation.$metaPath, this.getTypes());
833
+ const sFilter = _Helper.getKeyFilter(oNode, this.sMetaPath, this.getTypes());
829
834
  const mQueryOptions = Object.assign({}, this.mQueryOptions);
830
835
  mQueryOptions.$apply = "ancestors($root" + this.oAggregation.$path
831
836
  + "," + this.oAggregation.hierarchyQualifier + "," + this.oAggregation.$NodeProperty
@@ -853,7 +858,7 @@ sap.ui.define([
853
858
  const [iRank] = await Promise.all([
854
859
  this.requestRank(oParent, oGroupLock),
855
860
  this.requestProperties(oParent, aSelect, oGroupLock, true),
856
- this.requestNodeProperty(oParent, oGroupLock)
861
+ this.requestNodeProperty(oParent, oGroupLock, /*bDropFilter*/false)
857
862
  ]);
858
863
 
859
864
  // Note: overridden by _AggregationCache.calculateKeyPredicateRH
@@ -1108,14 +1113,27 @@ sap.ui.define([
1108
1113
  oRankResult.value.forEach((oNode) => {
1109
1114
  mPredicate2RankResult[getPredicate(oNode)] = oNode;
1110
1115
  });
1116
+ // all nodes are considered in place until they are found to still have the same parent
1117
+ const oPredicatesNowInPlace = new Set(this.oTreeState.getOutOfPlacePredicates());
1111
1118
 
1112
1119
  // import data
1113
1120
  aNodeResults.forEach((oNodeResult) => {
1114
1121
  oNodeResult.value.forEach((oNode) => {
1115
1122
  const sPredicate = getPredicate(oNode);
1123
+ oPredicatesNowInPlace.delete(sPredicate); // still the same parent
1116
1124
  if (this.aElements.$byPredicate[sPredicate]) {
1117
1125
  return; // already read with the in-place request
1118
1126
  }
1127
+ const sParentPredicate = this.oTreeState.getOutOfPlace(sPredicate).parentPredicate;
1128
+ const oParent = mPredicate2RankResult[sParentPredicate];
1129
+ if (oParent) { // parent has a rank
1130
+ const sDrillState = _Helper.drillDown(oParent, this.oAggregation.$DrillState);
1131
+ if (sDrillState === "collapsed") {
1132
+ return; // parent is collapsed -> do not insert
1133
+ }
1134
+ } else if (sParentPredicate) { // parent has no rank
1135
+ return; // do not insert
1136
+ } // else: no parent (root) -> insert
1119
1137
  _Helper.merge(oNode, mPredicate2RankResult[sPredicate]);
1120
1138
  // Note: overridden by _AggregationCache.calculateKeyPredicateRH
1121
1139
  this.oFirstLevel.calculateKeyPredicate(oNode, this.getTypes(), this.sMetaPath);
@@ -1124,6 +1142,8 @@ sap.ui.define([
1124
1142
  });
1125
1143
  });
1126
1144
 
1145
+ oPredicatesNowInPlace.forEach((sPredicate) => this.oTreeState.deleteOutOfPlace(sPredicate));
1146
+
1127
1147
  this.oTreeState.getOutOfPlaceGroupedByParent().forEach((oOutOfPlace) => {
1128
1148
  // move the out-of-place nodes in creation order
1129
1149
  const oParentRankResult = mPredicate2RankResult[oOutOfPlace.parentPredicate];
@@ -1285,25 +1305,17 @@ sap.ui.define([
1285
1305
  /*fnSubmit*/null, function fnCancel() { /*nothing to do*/ }),
1286
1306
  oReadPromise
1287
1307
  ]).then(([oPatchResult, iPreorderRank]) => {
1288
- const updateChildNode = () => {
1308
+ const updateChildNode = (oAdditional = {}) => {
1289
1309
  // update the cache with the PATCH response (Note: "@odata.etag" is optional!)
1290
1310
  _Helper.updateExisting(this.mChangeListeners, sChildPredicate, oChildNode, {
1291
1311
  "@odata.etag" : oPatchResult["@odata.etag"],
1292
- "@$ui5.node.level" : oParentNode ? oParentNode["@$ui5.node.level"] + 1 : 1
1312
+ "@$ui5.node.level" : oParentNode ? oParentNode["@$ui5.node.level"] + 1 : 1,
1313
+ ...oAdditional
1293
1314
  });
1294
1315
  };
1295
- const iOldIndex = this.aElements.indexOf(oChildNode);
1296
1316
  let iResult = 1;
1297
1317
 
1298
1318
  if (this.oAggregation.expandTo > 1) {
1299
- const iOffset = _Helper.getPrivateAnnotation(oChildNode, "descendants", 0) + 1;
1300
- this.adjustDescendantCount(oChildNode, iOldIndex, -iOffset);
1301
- this.shiftRank(iOldIndex, -iOffset);
1302
- this.aElements.splice(iOldIndex, 1);
1303
- this.oFirstLevel.move(_Helper.getPrivateAnnotation(oChildNode, "rank"),
1304
- iPreorderRank, iOffset);
1305
- updateChildNode();
1306
- _Helper.setPrivateAnnotation(oChildNode, "rank", iPreorderRank);
1307
1319
  switch (oParentNode ? oParentNode["@$ui5.node.isExpanded"] : true) {
1308
1320
  case false:
1309
1321
  iResult = this.expand(_GroupLock.$cached, sParentPredicate).unwrap() + 1;
@@ -1315,14 +1327,24 @@ sap.ui.define([
1315
1327
  _Helper.updateAll(this.mChangeListeners, sParentPredicate, oParentNode,
1316
1328
  {"@$ui5.node.isExpanded" : true}); // not a leaf anymore
1317
1329
  }
1318
- const iNewIndex = this.aElements.indexOf(oParentNode) + 1; // 0 w/o oParentNode :-)
1330
+ // Note: iOldIndex might be affected by #expand above
1331
+ const iOldIndex = this.aElements.indexOf(oChildNode);
1332
+ const iOffset = _Helper.getPrivateAnnotation(oChildNode, "descendants", 0) + 1;
1333
+ this.adjustDescendantCount(oChildNode, iOldIndex, -iOffset);
1334
+ this.aElements.splice(iOldIndex, 1);
1335
+ const iOldRank = _Helper.getPrivateAnnotation(oChildNode, "rank");
1336
+ this.shiftRankForMove(iOldRank, iOffset, iPreorderRank);
1337
+ this.oFirstLevel.move(iOldRank, iPreorderRank, iOffset);
1338
+ updateChildNode({"@$ui5.context.isTransient" : undefined});
1339
+ _Helper.setPrivateAnnotation(oChildNode, "rank", iPreorderRank);
1340
+ const iNewIndex = this.getArrayIndex(iPreorderRank);
1319
1341
  this.aElements.splice(iNewIndex, 0, oChildNode);
1320
- this.shiftRank(iNewIndex, +iOffset);
1321
1342
  this.adjustDescendantCount(oChildNode, iNewIndex, +iOffset);
1322
1343
 
1323
- return iResult;
1344
+ return [iResult, iNewIndex];
1324
1345
  }
1325
1346
 
1347
+ const iOldIndex = this.aElements.indexOf(oChildNode);
1326
1348
  // remove original element from its cache's collection
1327
1349
  const oOldParentCache = _Helper.getPrivateAnnotation(oChildNode, "parent");
1328
1350
  oOldParentCache.removeElement(_Helper.getPrivateAnnotation(oChildNode, "rank", 0),
@@ -1381,7 +1403,7 @@ sap.ui.define([
1381
1403
  }
1382
1404
  }
1383
1405
 
1384
- return iResult;
1406
+ return [iResult];
1385
1407
  });
1386
1408
  };
1387
1409
 
@@ -1403,9 +1425,18 @@ sap.ui.define([
1403
1425
  (oNode) => _Helper.getPrivateAnnotation(oNode, "rank") === iParentRank);
1404
1426
  aOutOfPlacePredicates.forEach((sNodePredicate) => {
1405
1427
  const oNode = this.aElements.$byPredicate[sNodePredicate];
1406
- const iNodeIndex = this.aElements.indexOf(oNode);
1407
- this.aElements.splice(iNodeIndex, 1);
1408
- this.aElements.splice(iParentIndex + 1, 0, oNode);
1428
+ if (oNode) {
1429
+ const bExpanded = oNode["@$ui5.node.isExpanded"];
1430
+ if (bExpanded) {
1431
+ this.collapse(sNodePredicate);
1432
+ }
1433
+ const iNodeIndex = this.aElements.indexOf(oNode);
1434
+ this.aElements.splice(iNodeIndex, 1);
1435
+ this.aElements.splice(iParentIndex + 1, 0, oNode);
1436
+ if (bExpanded) {
1437
+ this.expand(_GroupLock.$cached, sNodePredicate);
1438
+ }
1439
+ }
1409
1440
  });
1410
1441
  };
1411
1442
 
@@ -1625,7 +1656,7 @@ sap.ui.define([
1625
1656
  // "before the given range"
1626
1657
  // after a side-effects refresh out-of-place nodes may shift the visible range, we have
1627
1658
  // to read as many nodes before this range to be on the safe side
1628
- iPrefetchLength += this.oTreeState.getOutOfPlaceCount();
1659
+ iPrefetchLength = Math.max(iPrefetchLength, this.oTreeState.getOutOfPlaceCount());
1629
1660
  if (iStart > iPrefetchLength) {
1630
1661
  iLength += iPrefetchLength;
1631
1662
  iStart -= iPrefetchLength;
@@ -1634,9 +1665,13 @@ sap.ui.define([
1634
1665
  iStart = 0;
1635
1666
  }
1636
1667
 
1668
+ // Note: this.oFirstLevel.read changes this value
1669
+ const bSentRequest = this.oFirstLevel.bSentRequest;
1670
+
1637
1671
  return SyncPromise.all([
1638
1672
  this.oFirstLevel.read(iStart, iLength, 0, oGroupLock, fnDataRequested),
1639
- ...this.requestOutOfPlaceNodes(oGroupLock)
1673
+ // request out-of-place nodes only once
1674
+ ...(bSentRequest ? [] : this.requestOutOfPlaceNodes(oGroupLock))
1640
1675
  ]).then(function ([oResult, ...aOutOfPlaceResults]) {
1641
1676
  // Note: this code must be idempotent, it might well run twice!
1642
1677
  var oGrandTotal,
@@ -1674,13 +1709,11 @@ sap.ui.define([
1674
1709
 
1675
1710
  that.addElements(oResult.value, iStart + iOffset, that.oFirstLevel, iStart);
1676
1711
  for (j = 0; j < that.aElements.$count; j += 1) {
1677
- if (!that.aElements[j]) {
1678
- that.aElements[j] = _AggregationHelper.createPlaceholder(
1679
- that.oAggregation.expandTo > 1 || that.bUnifiedCache
1680
- ? /*don't know*/0
1681
- : 1,
1682
- j - iOffset, that.oFirstLevel);
1683
- }
1712
+ that.aElements[j] ??= _AggregationHelper.createPlaceholder(
1713
+ that.oAggregation.expandTo > 1 || that.bUnifiedCache
1714
+ ? /*don't know*/0
1715
+ : 1,
1716
+ j - iOffset, that.oFirstLevel);
1684
1717
  }
1685
1718
 
1686
1719
  that.handleOutOfPlaceNodes(aOutOfPlaceResults);
@@ -1799,18 +1832,23 @@ sap.ui.define([
1799
1832
  * @param {sap.ui.model.odata.v4.lib._GroupLock} oGroupLock
1800
1833
  * An original lock for the group ID to be used for the GET request, to be cloned via
1801
1834
  * {@link sap.ui.model.odata.v4.lib._GroupLock#getUnlockedCopy}
1835
+ * @param {boolean} [bDropFilter]
1836
+ * Whether to drop the list's filter from the request in order to support out-of-place nodes
1837
+ * outside the list's current collection
1802
1838
  * @returns {Promise<void>}
1803
1839
  * A promise which is resolved without a defined result in case of success, or
1804
1840
  * rejected in case of an error
1805
1841
  *
1806
1842
  * @private
1807
1843
  */
1808
- _AggregationCache.prototype.requestNodeProperty = async function (oElement, oGroupLock) {
1844
+ _AggregationCache.prototype.requestNodeProperty = async function (oElement, oGroupLock,
1845
+ bDropFilter) {
1809
1846
  if (_Helper.drillDown(oElement, this.oAggregation.$NodeProperty) !== undefined) {
1810
1847
  return; // already available
1811
1848
  }
1812
1849
 
1813
- await this.requestProperties(oElement, [this.oAggregation.$NodeProperty], oGroupLock, true);
1850
+ await this.requestProperties(oElement, [this.oAggregation.$NodeProperty], oGroupLock, true,
1851
+ bDropFilter);
1814
1852
  };
1815
1853
 
1816
1854
  /**
@@ -1864,6 +1902,9 @@ sap.ui.define([
1864
1902
  * {@link sap.ui.model.odata.v4.lib._GroupLock#getUnlockedCopy}
1865
1903
  * @param {boolean} [bInheritResult]
1866
1904
  * Whether the result is inherited in the given element
1905
+ * @param {boolean} [bDropFilter]
1906
+ * Whether to drop the list's filter from the request in order to support out-of-place nodes
1907
+ * outside the list's current collection
1867
1908
  * @returns {Promise<object|void>}
1868
1909
  * A promise which is resolved without a defined result in case <code>bInheritResult</code> is
1869
1910
  * set to <code>true</code>, or with the result object, or rejected in case of an error
@@ -1871,17 +1912,27 @@ sap.ui.define([
1871
1912
  * @private
1872
1913
  */
1873
1914
  _AggregationCache.prototype.requestProperties = async function (oElement, aSelect, oGroupLock,
1874
- bInheritResult) {
1875
- const sMetaPath = this.oAggregation.$metaPath;
1876
- const mQueryOptions = {
1877
- $apply : _Helper.getPrivateAnnotation(oElement, "parent").getQueryOptions().$apply,
1878
- $filter : _Helper.getKeyFilter(oElement, sMetaPath, this.getTypes())
1879
- };
1915
+ bInheritResult, bDropFilter) {
1916
+ function getApply(mQueryOptions) { // keep $apply and custom query options
1917
+ mQueryOptions = {...mQueryOptions};
1918
+ // Note: $filter is overwritten below, $orderby is part of $apply already
1919
+ delete mQueryOptions.$count;
1920
+ delete mQueryOptions.$expand;
1921
+ delete mQueryOptions.$select;
1922
+ return mQueryOptions;
1923
+ }
1924
+
1925
+ const oCache = _Helper.getPrivateAnnotation(oElement, "parent");
1926
+ const mQueryOptions = bDropFilter
1927
+ ? _AggregationHelper
1928
+ .dropFilter(this.oAggregation, this.mQueryOptions, oCache.$parentFilter)
1929
+ : getApply(oCache.getQueryOptions());
1930
+ mQueryOptions.$filter = _Helper.getKeyFilter(oElement, this.sMetaPath, this.getTypes());
1880
1931
  const sResourcePath = this.sResourcePath
1881
- + this.oRequestor.buildQueryString(sMetaPath, mQueryOptions, false, true);
1932
+ + this.oRequestor.buildQueryString(this.sMetaPath, mQueryOptions, false, true);
1882
1933
  const oResult = await this.oRequestor.request("GET", sResourcePath,
1883
- oGroupLock.getUnlockedCopy(), undefined, undefined, undefined, undefined, sMetaPath,
1884
- undefined, false, {$select : aSelect}, this);
1934
+ oGroupLock.getUnlockedCopy(), undefined, undefined, undefined, undefined,
1935
+ this.sMetaPath, undefined, false, {$select : aSelect}, this);
1885
1936
  const oRequestedProperties = oResult.value[0];
1886
1937
 
1887
1938
  if (bInheritResult) {
@@ -2031,6 +2082,35 @@ sap.ui.define([
2031
2082
  }
2032
2083
  };
2033
2084
 
2085
+ /**
2086
+ * Shifts the rank (aka. $skip index) of all other nodes or placeholders affected by the move of
2087
+ * a subtree of the given size from the given old to the given new rank. The subtree itself is
2088
+ * unaffected and may, but need not be present.
2089
+ *
2090
+ * @param {number} iOldRank - The old rank of the subtree's root node
2091
+ * @param {number} iSize - Size of subtree (number of moving elements)
2092
+ * @param {number} iNewRank - The new rank of the subtree's root node
2093
+ *
2094
+ * @private
2095
+ */
2096
+ _AggregationCache.prototype.shiftRankForMove = function (iOldRank, iSize, iNewRank) {
2097
+ if (iOldRank < iNewRank) {
2098
+ this.aElements.forEach((oElement) => {
2099
+ const iRank = _Helper.getPrivateAnnotation(oElement, "rank");
2100
+ if (iOldRank + iSize <= iRank && iRank < iNewRank + iSize) {
2101
+ _Helper.setPrivateAnnotation(oElement, "rank", iRank - iSize);
2102
+ }
2103
+ });
2104
+ } else if (iNewRank < iOldRank) {
2105
+ this.aElements.forEach((oElement) => {
2106
+ const iRank = _Helper.getPrivateAnnotation(oElement, "rank");
2107
+ if (iNewRank <= iRank && iRank < iOldRank) {
2108
+ _Helper.setPrivateAnnotation(oElement, "rank", iRank + iSize);
2109
+ }
2110
+ });
2111
+ } // iOldRank === iNewRank => nothing to do
2112
+ };
2113
+
2034
2114
  /**
2035
2115
  * Returns the cache's URL.
2036
2116
  *
@@ -296,12 +296,12 @@ sap.ui.define([
296
296
  }
297
297
 
298
298
  mQueryOptions = Object.assign({}, mQueryOptions);
299
- oAggregation.groupLevels = oAggregation.groupLevels || [];
299
+ oAggregation.groupLevels ??= [];
300
300
  bIsLeafLevel = !iLevel || iLevel > oAggregation.groupLevels.length;
301
301
 
302
- oAggregation.group = oAggregation.group || {};
302
+ oAggregation.group ??= {};
303
303
  oAggregation.groupLevels.forEach(function (sGroup) {
304
- oAggregation.group[sGroup] = oAggregation.group[sGroup] || {};
304
+ oAggregation.group[sGroup] ??= {};
305
305
  });
306
306
  aGroupBy = bIsLeafLevel
307
307
  ? Object.keys(oAggregation.group).sort().filter(function (sGroup) {
@@ -312,7 +312,7 @@ sap.ui.define([
312
312
  aGroupBy = oAggregation.groupLevels.concat(aGroupBy);
313
313
  }
314
314
 
315
- oAggregation.aggregate = oAggregation.aggregate || {};
315
+ oAggregation.aggregate ??= {};
316
316
  aAliases = Object.keys(oAggregation.aggregate).sort();
317
317
  if (iLevel === 1 && !bFollowUp) {
318
318
  aAliases.filter(function (sAlias) {
@@ -433,6 +433,9 @@ sap.ui.define([
433
433
  * into the search expression parameter of an "ancestors()" transformation
434
434
  * @param {object} [mQueryOptions={}]
435
435
  * A map of key-value pairs representing the query string; it is not modified
436
+ * @param {string} [mQueryOptions.$$filterBeforeAggregate]
437
+ * The value for a filter which identifies a parent node; it is removed from the returned
438
+ * map and turned into a "filter()" transformation
436
439
  * @param {string} [mQueryOptions.$filter]
437
440
  * The value for a "$filter" system query option; it is removed from the returned map and
438
441
  * turned into the filter expression parameter of an "ancestors()" transformation
@@ -458,12 +461,10 @@ sap.ui.define([
458
461
  if (mQueryOptions.$select) {
459
462
  let sPropertyPath = oAggregation["$" + sProperty];
460
463
  if (!sPropertyPath) {
461
- if (!mRecursiveHierarchy) {
462
- mRecursiveHierarchy = oAggregation.$fetchMetadata(oAggregation.$metaPath
463
- + "/@com.sap.vocabularies.Hierarchy.v1.RecursiveHierarchy#"
464
- + oAggregation.hierarchyQualifier
465
- ).getResult();
466
- }
464
+ mRecursiveHierarchy ??= oAggregation.$fetchMetadata(oAggregation.$metaPath
465
+ + "/@com.sap.vocabularies.Hierarchy.v1.RecursiveHierarchy#"
466
+ + oAggregation.hierarchyQualifier
467
+ ).getResult();
467
468
 
468
469
  sPropertyPath = oAggregation["$" + sProperty]
469
470
  = mRecursiveHierarchy[sProperty + "Property"]?.$PropertyPath
@@ -664,6 +665,50 @@ sap.ui.define([
664
665
  return oPlaceholder;
665
666
  },
666
667
 
668
+ /**
669
+ * Drops filter, search, and other stuff from the given query options and recursive
670
+ * hierarchy information, then adds the corresponding "$apply" system query option.
671
+ *
672
+ * @param {object} oAggregation
673
+ * An object holding the information needed for a recursive hierarchy; see
674
+ * {@link sap.ui.model.odata.v4.ODataListBinding#setAggregation}.
675
+ * @param {string} [oAggregation.search] - Ignored
676
+ * @param {object} mQueryOptions
677
+ * A map of key-value pairs representing the query string; it is not modified
678
+ * @param {string} [mQueryOptions.$$filterBeforeAggregate] - Removed from the returned map
679
+ * @param {string} [mQueryOptions.$apply] - Replaced in the returned map
680
+ * @param {string} [mQueryOptions.$count] - Removed from the returned map
681
+ * @param {string} [mQueryOptions.$expand] - Removed from the returned map
682
+ * @param {string} [mQueryOptions.$filter] - Removed from the returned map
683
+ * @param {string} [mQueryOptions.$orderby] - Removed from the returned map
684
+ * @param {string} [mQueryOptions.$select] - Removed from the returned map
685
+ * @param {string} [sFilterBeforeAggregate]
686
+ * The value for a filter which identifies a parent node; see
687
+ * {@link #buildApply4Hierarchy}
688
+ * @returns {object}
689
+ * A map of key-value pairs representing the query string, including a value for the
690
+ * "$apply" system query option; it is a modified copy of <code>mQueryOptions</code>, with
691
+ * values changed as described above
692
+ */
693
+ dropFilter : function (oAggregation, mQueryOptions, sFilterBeforeAggregate) {
694
+ oAggregation = {...oAggregation};
695
+ delete oAggregation.search;
696
+
697
+ mQueryOptions = {...mQueryOptions};
698
+ delete mQueryOptions.$count;
699
+ delete mQueryOptions.$expand;
700
+ delete mQueryOptions.$filter;
701
+ delete mQueryOptions.$orderby;
702
+ delete mQueryOptions.$select;
703
+ if (sFilterBeforeAggregate) {
704
+ mQueryOptions.$$filterBeforeAggregate = sFilterBeforeAggregate;
705
+ } else {
706
+ delete mQueryOptions.$$filterBeforeAggregate;
707
+ }
708
+
709
+ return _AggregationHelper.buildApply4Hierarchy(oAggregation, mQueryOptions);
710
+ },
711
+
667
712
  /**
668
713
  * Extract subtotals and their units from the given group node, so that they can be used
669
714
  * for an extra row showing subtotals at the bottom and also to restore them when
@@ -954,7 +999,7 @@ sap.ui.define([
954
999
  delete mQueryOptions.$filter;
955
1000
  delete mQueryOptions.$orderby;
956
1001
  mQueryOptions = _AggregationHelper.buildApply(oAggregation, mQueryOptions, 1);
957
- const aNodeFilters = oOutOfPlace.nodeFilters.toSorted();
1002
+ const aNodeFilters = oOutOfPlace.nodeFilters.slice().sort();
958
1003
  mQueryOptions.$filter = aNodeFilters.join(" or ");
959
1004
  mQueryOptions.$top = aNodeFilters.length;
960
1005
  const iDrillStateIndex = mQueryOptions.$select.indexOf(oAggregation.$DrillState);