@openui5/sap.ui.core 1.120.0 → 1.120.2

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 (625) hide show
  1. package/.reuse/dep5 +1 -1
  2. package/THIRDPARTY.txt +1 -1
  3. package/package.json +1 -1
  4. package/src/jquery.sap.global.js +1 -1
  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 +2 -2
  10. package/src/sap/base/Eventing.js +1 -1
  11. package/src/sap/base/config.js +1 -1
  12. package/src/sap/base/i18n/Formatting.js +30 -14
  13. package/src/sap/base/i18n/LanguageTag.js +1 -1
  14. package/src/sap/base/i18n/Localization.js +1 -2
  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 +4 -4
  59. package/src/sap/ui/base/BindingParser.js +4 -4
  60. package/src/sap/ui/base/DataType.js +5 -5
  61. package/src/sap/ui/base/Event.js +1 -1
  62. package/src/sap/ui/base/EventProvider.js +1 -1
  63. package/src/sap/ui/base/Interface.js +1 -1
  64. package/src/sap/ui/base/ManagedObject.js +9 -65
  65. package/src/sap/ui/base/ManagedObjectMetadata.js +25 -1
  66. package/src/sap/ui/base/ManagedObjectRegistry.js +186 -169
  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/BusyIndicator.js +1 -1
  72. package/src/sap/ui/core/Component.js +55 -150
  73. package/src/sap/ui/core/ComponentContainer.js +5 -5
  74. package/src/sap/ui/core/ComponentMetadata.js +1 -1
  75. package/src/sap/ui/core/ComponentRegistry.js +153 -0
  76. package/src/sap/ui/core/ComponentSupport.js +3 -3
  77. package/src/sap/ui/core/Configuration.js +9 -7
  78. package/src/sap/ui/core/Control.js +6 -4
  79. package/src/sap/ui/core/Core.js +19 -71
  80. package/src/sap/ui/core/CustomData.js +1 -1
  81. package/src/sap/ui/core/DeclarativeSupport.js +1 -1
  82. package/src/sap/ui/core/Element.js +30 -142
  83. package/src/sap/ui/core/ElementMetadata.js +1 -1
  84. package/src/sap/ui/core/ElementRegistry.js +159 -0
  85. package/src/sap/ui/core/EnabledPropagator.js +1 -1
  86. package/src/sap/ui/core/EventBus.js +1 -1
  87. package/src/sap/ui/core/ExtensionPoint.js +5 -5
  88. package/src/sap/ui/core/FocusHandler.js +3 -2
  89. package/src/sap/ui/core/Fragment.js +7 -7
  90. package/src/sap/ui/core/HTML.js +1 -1
  91. package/src/sap/ui/core/History.js +1 -1
  92. package/src/sap/ui/core/Icon.js +1 -1
  93. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  94. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  95. package/src/sap/ui/core/InvisibleMessage.js +1 -1
  96. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  97. package/src/sap/ui/core/InvisibleText.js +1 -1
  98. package/src/sap/ui/core/Item.js +1 -1
  99. package/src/sap/ui/core/LabelEnablement.js +1 -1
  100. package/src/sap/ui/core/LayoutData.js +1 -1
  101. package/src/sap/ui/core/Lib.js +62 -32
  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 +55 -11
  106. package/src/sap/ui/core/Manifest.js +4 -5
  107. package/src/sap/ui/core/Message.js +2 -1
  108. package/src/sap/ui/core/Messaging.js +2 -2
  109. package/src/sap/ui/core/RenderManager.js +1 -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/Shortcut.js +15 -9
  115. package/src/sap/ui/core/StaticArea.js +4 -1
  116. package/src/sap/ui/core/Theming.js +3 -3
  117. package/src/sap/ui/core/Title.js +1 -1
  118. package/src/sap/ui/core/TooltipBase.js +1 -1
  119. package/src/sap/ui/core/UIArea.js +54 -12
  120. package/src/sap/ui/core/UIAreaRegistry.js +150 -0
  121. package/src/sap/ui/core/UIComponent.js +3 -3
  122. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  123. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  124. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  125. package/src/sap/ui/core/XMLComposite.js +1 -1
  126. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  127. package/src/sap/ui/core/XMLTemplateProcessor.js +95 -76
  128. package/src/sap/ui/core/cldr/Unicode-Data-Files-LICENSE.txt +1 -1
  129. package/src/sap/ui/core/cldr/cy.json +12 -3
  130. package/src/sap/ui/core/cldr/en_AU.json +48 -12
  131. package/src/sap/ui/core/cldr/en_GB.json +24 -6
  132. package/src/sap/ui/core/cldr/en_HK.json +24 -6
  133. package/src/sap/ui/core/cldr/en_IE.json +24 -6
  134. package/src/sap/ui/core/cldr/en_IN.json +24 -6
  135. package/src/sap/ui/core/cldr/en_NZ.json +24 -6
  136. package/src/sap/ui/core/cldr/en_PG.json +24 -6
  137. package/src/sap/ui/core/cldr/en_SG.json +24 -6
  138. package/src/sap/ui/core/cldr/en_ZA.json +24 -6
  139. package/src/sap/ui/core/cldr/es.json +288 -72
  140. package/src/sap/ui/core/cldr/es_AR.json +288 -72
  141. package/src/sap/ui/core/cldr/es_BO.json +288 -72
  142. package/src/sap/ui/core/cldr/es_CL.json +144 -36
  143. package/src/sap/ui/core/cldr/es_CO.json +144 -36
  144. package/src/sap/ui/core/cldr/es_MX.json +288 -72
  145. package/src/sap/ui/core/cldr/fa.json +48 -12
  146. package/src/sap/ui/core/cldr/id.json +56 -14
  147. package/src/sap/ui/core/cldr/kk.json +184 -46
  148. package/src/sap/ui/core/cldr/ms.json +56 -14
  149. package/src/sap/ui/core/cldr/nb.json +36 -9
  150. package/src/sap/ui/core/cldr/nl.json +264 -66
  151. package/src/sap/ui/core/cldr/nl_BE.json +264 -66
  152. package/src/sap/ui/core/cldr/pt.json +288 -72
  153. package/src/sap/ui/core/cldr/pt_PT.json +288 -72
  154. package/src/sap/ui/core/cldr/sr.json +96 -24
  155. package/src/sap/ui/core/cldr/sr_Latn.json +72 -18
  156. package/src/sap/ui/core/date/Islamic.js +4 -4
  157. package/src/sap/ui/core/date/UI5Date.js +1 -1
  158. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  159. package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
  160. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  161. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  162. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  163. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  164. package/src/sap/ui/core/format/DateFormat.js +25 -13
  165. package/src/sap/ui/core/format/TimezoneUtil.js +1 -1
  166. package/src/sap/ui/core/getCompatibilityVersion.js +1 -1
  167. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  168. package/src/sap/ui/core/library.js +9 -3
  169. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  170. package/src/sap/ui/core/message/Message.js +7 -7
  171. package/src/sap/ui/core/message/MessageManager.js +1 -1
  172. package/src/sap/ui/core/message/MessageParser.js +1 -1
  173. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  174. package/src/sap/ui/core/message/MessageType.js +1 -1
  175. package/src/sap/ui/core/mvc/Controller.js +15 -13
  176. package/src/sap/ui/core/mvc/ControllerExtension.js +7 -5
  177. package/src/sap/ui/core/mvc/ControllerExtensionProvider.js +2 -2
  178. package/src/sap/ui/core/mvc/ControllerMetadata.js +1 -1
  179. package/src/sap/ui/core/mvc/EventHandlerResolver.js +4 -4
  180. package/src/sap/ui/core/mvc/HTMLView.js +1 -1
  181. package/src/sap/ui/core/mvc/JSONView.js +1 -1
  182. package/src/sap/ui/core/mvc/JSView.js +1 -1
  183. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  184. package/src/sap/ui/core/mvc/View.js +21 -10
  185. package/src/sap/ui/core/mvc/XMLView.js +8 -2
  186. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  187. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  188. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  189. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  190. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  191. package/src/sap/ui/core/routing/History.js +1 -1
  192. package/src/sap/ui/core/routing/Route.js +6 -6
  193. package/src/sap/ui/core/routing/Router.js +6 -6
  194. package/src/sap/ui/core/routing/Targets.js +3 -3
  195. package/src/sap/ui/core/routing/async/Target.js +2 -2
  196. package/src/sap/ui/core/routing/async/Targets.js +1 -1
  197. package/src/sap/ui/core/rules/Misc.support.js +3 -3
  198. package/src/sap/ui/core/search/OpenSearchProvider.js +2 -1
  199. package/src/sap/ui/core/search/SearchProvider.js +2 -1
  200. package/src/sap/ui/core/service/Service.js +1 -1
  201. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  202. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  203. package/src/sap/ui/core/support/Plugin.js +1 -1
  204. package/src/sap/ui/core/support/Support.js +1 -1
  205. package/src/sap/ui/core/support/plugins/ControlTree.js +7 -5
  206. package/src/sap/ui/core/support/plugins/Interaction.js +1 -1
  207. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  208. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  209. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  210. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  211. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  212. package/src/sap/ui/core/support/plugins/ViewInfo.js +1 -1
  213. package/src/sap/ui/core/theming/Parameters.js +7 -7
  214. package/src/sap/ui/core/theming/ThemeHelper.js +2 -2
  215. package/src/sap/ui/core/theming/ThemeManager.js +2 -2
  216. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  217. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  218. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  219. package/src/sap/ui/core/tmpl/Template.js +1 -1
  220. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  221. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  222. package/src/sap/ui/core/util/Export.js +1 -1
  223. package/src/sap/ui/core/util/ExportCell.js +1 -1
  224. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  225. package/src/sap/ui/core/util/ExportRow.js +1 -1
  226. package/src/sap/ui/core/util/ExportType.js +1 -1
  227. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  228. package/src/sap/ui/core/util/File.js +1 -1
  229. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  230. package/src/sap/ui/core/util/MockServer.js +34 -3
  231. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  232. package/src/sap/ui/core/util/_LocalizationHelper.js +122 -0
  233. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  234. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  235. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  236. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  237. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  238. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  239. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  240. package/src/sap/ui/core/webc/WebComponent.js +1 -1
  241. package/src/sap/ui/core/webc/WebComponentMetadata.js +1 -1
  242. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  243. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  244. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  245. package/src/sap/ui/debug/ControlTree.js +1 -1
  246. package/src/sap/ui/debug/DebugEnv.js +1 -1
  247. package/src/sap/ui/debug/PropertyList.js +1 -1
  248. package/src/sap/ui/model/Binding.js +2 -2
  249. package/src/sap/ui/model/ClientListBinding.js +6 -3
  250. package/src/sap/ui/model/ClientModel.js +1 -1
  251. package/src/sap/ui/model/ClientTreeBinding.js +6 -3
  252. package/src/sap/ui/model/CompositeDataState.js +5 -5
  253. package/src/sap/ui/model/CompositeType.js +1 -1
  254. package/src/sap/ui/model/DataState.js +10 -10
  255. package/src/sap/ui/model/FilterProcessor.js +19 -16
  256. package/src/sap/ui/model/ManagedObjectBindingSupport.js +2 -2
  257. package/src/sap/ui/model/MetaModel.js +1 -1
  258. package/src/sap/ui/model/Model.js +10 -8
  259. package/src/sap/ui/model/SelectionModel.js +1 -1
  260. package/src/sap/ui/model/SimpleType.js +1 -1
  261. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  262. package/src/sap/ui/model/Type.js +1 -1
  263. package/src/sap/ui/model/analytics/odata4analytics.js +6 -6
  264. package/src/sap/ui/model/json/JSONModel.js +1 -1
  265. package/src/sap/ui/model/message/MessageModel.js +1 -1
  266. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  267. package/src/sap/ui/model/odata/ODataListBinding.js +5 -2
  268. package/src/sap/ui/model/odata/ODataMessageParser.js +3 -3
  269. package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
  270. package/src/sap/ui/model/odata/ODataMetadata.js +1 -1
  271. package/src/sap/ui/model/odata/ODataModel.js +1 -1
  272. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  273. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  274. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  275. package/src/sap/ui/model/odata/type/Date.js +1 -1
  276. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  277. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  278. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  279. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +1 -1
  280. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  281. package/src/sap/ui/model/odata/type/Double.js +1 -1
  282. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  283. package/src/sap/ui/model/odata/type/Int.js +1 -1
  284. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  285. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  286. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  287. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  288. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  289. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  290. package/src/sap/ui/model/odata/type/Single.js +1 -1
  291. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  292. package/src/sap/ui/model/odata/type/String.js +1 -1
  293. package/src/sap/ui/model/odata/type/Time.js +1 -1
  294. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  295. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  296. package/src/sap/ui/model/odata/v2/Context.js +1 -1
  297. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  298. package/src/sap/ui/model/odata/v2/ODataListBinding.js +5 -2
  299. package/src/sap/ui/model/odata/v2/ODataModel.js +9 -58
  300. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +6 -3
  301. package/src/sap/ui/model/odata/v4/Context.js +32 -27
  302. package/src/sap/ui/model/odata/v4/ODataBinding.js +3 -0
  303. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +1 -1
  304. package/src/sap/ui/model/odata/v4/ODataListBinding.js +198 -155
  305. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +2 -2
  306. package/src/sap/ui/model/odata/v4/ODataModel.js +9 -4
  307. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +9 -6
  308. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +1 -1
  309. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +220 -85
  310. package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +33 -20
  311. package/src/sap/ui/model/odata/v4/lib/_Cache.js +70 -18
  312. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +9 -5
  313. package/src/sap/ui/model/resource/ResourceModel.js +1 -1
  314. package/src/sap/ui/model/type/Boolean.js +1 -1
  315. package/src/sap/ui/model/type/Currency.js +1 -1
  316. package/src/sap/ui/model/type/Date.js +1 -1
  317. package/src/sap/ui/model/type/DateInterval.js +1 -1
  318. package/src/sap/ui/model/type/DateTime.js +1 -1
  319. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  320. package/src/sap/ui/model/type/FileSize.js +1 -1
  321. package/src/sap/ui/model/type/Float.js +1 -1
  322. package/src/sap/ui/model/type/Integer.js +1 -1
  323. package/src/sap/ui/model/type/String.js +1 -1
  324. package/src/sap/ui/model/type/Time.js +1 -1
  325. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  326. package/src/sap/ui/model/type/Unit.js +1 -1
  327. package/src/sap/ui/model/xml/XMLModel.js +1 -1
  328. package/src/sap/ui/performance/trace/Interaction.js +20 -16
  329. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  330. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +5 -5
  331. package/src/sap/ui/test/BranchTracking.js +4 -0
  332. package/src/sap/ui/test/actions/EnterText.js +1 -1
  333. package/src/sap/ui/test/generic/GenericTestCollection.js +1 -0
  334. package/src/sap/ui/test/generic/TestBase.js +4 -4
  335. package/src/sap/ui/test/generic/Utils.js +3 -2
  336. package/src/sap/ui/util/Storage.js +1 -1
  337. package/src/ui5loader-autoconfig.js +23 -15
  338. package/src/ui5loader.js +9 -4
  339. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/manifest.json +3 -10
  340. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/package.json +13 -0
  341. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/ui5.yaml +11 -0
  342. package/test/sap/ui/core/demokit/sample/ViewTemplate/types/Template.controller.js +3 -3
  343. package/test/sap/ui/core/demokit/sample/common/Controller.js +0 -1
  344. package/test/sap/ui/core/demokit/sample/matcher/BindingPath/manifest.json +3 -11
  345. package/test/sap/ui/core/demokit/sample/matcher/BindingPath/package.json +13 -0
  346. package/test/sap/ui/core/demokit/sample/matcher/BindingPath/ui5.yaml +11 -0
  347. package/test/sap/ui/core/demokit/sample/matcher/Descendant/Component.js +1 -1
  348. package/test/sap/ui/core/demokit/sample/matcher/Descendant/manifest.json +3 -11
  349. package/test/sap/ui/core/demokit/sample/matcher/Descendant/package.json +13 -0
  350. package/test/sap/ui/core/demokit/sample/matcher/Descendant/ui5.yaml +11 -0
  351. package/test/sap/ui/core/demokit/sample/matcher/I18NText/manifest.json +3 -11
  352. package/test/sap/ui/core/demokit/sample/matcher/I18NText/package.json +13 -0
  353. package/test/sap/ui/core/demokit/sample/matcher/I18NText/ui5.yaml +11 -0
  354. package/test/sap/ui/core/demokit/sample/matcher/LabelFor/manifest.json +3 -11
  355. package/test/sap/ui/core/demokit/sample/matcher/LabelFor/package.json +13 -0
  356. package/test/sap/ui/core/demokit/sample/matcher/LabelFor/ui5.yaml +11 -0
  357. package/test/sap/ui/core/demokit/sample/odata/v4/Ancestry/Main.controller.js +1 -1
  358. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/Main.controller.js +14 -1
  359. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/Main.view.xml +6 -0
  360. package/test/sap/ui/core/demokit/sample/odata/v4/MultipleInlineCreationRowsGrid/MIT.MultipleInlineCreationRowsGrid.html +5 -0
  361. package/test/sap/ui/core/demokit/sample/odata/v4/MultipleInlineCreationRowsGrid/Main.view.xml +9 -2
  362. package/test/sap/ui/core/demokit/sample/odata/v4/MultipleInlineCreationRowsGrid/Opa.qunit.js +23 -0
  363. package/test/sap/ui/core/demokit/sample/odata/v4/MultipleInlineCreationRowsGrid/pages/Main.js +58 -1
  364. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/RecursiveHierarchy.controller.js +75 -30
  365. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/RecursiveHierarchy.view.xml +19 -1
  366. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/SandboxModel.js +84 -28
  367. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/data/metadata.xml +3 -3
  368. package/test/sap/ui/core/demokit/tutorial/databinding/01/Component.js +9 -25
  369. package/test/sap/ui/core/demokit/tutorial/databinding/01/manifest.json +20 -0
  370. package/test/sap/ui/core/demokit/tutorial/databinding/01/ui5.yaml +1 -1
  371. package/test/sap/ui/core/demokit/tutorial/databinding/01/webapp/manifest.json +5 -0
  372. package/test/sap/ui/core/demokit/tutorial/databinding/02/Component.js +9 -25
  373. package/test/sap/ui/core/demokit/tutorial/databinding/02/manifest.json +20 -0
  374. package/test/sap/ui/core/demokit/tutorial/databinding/02/ui5.yaml +1 -1
  375. package/test/sap/ui/core/demokit/tutorial/databinding/02/webapp/manifest.json +5 -0
  376. package/test/sap/ui/core/demokit/tutorial/databinding/03/Component.js +9 -25
  377. package/test/sap/ui/core/demokit/tutorial/databinding/03/manifest.json +20 -0
  378. package/test/sap/ui/core/demokit/tutorial/databinding/03/ui5.yaml +1 -1
  379. package/test/sap/ui/core/demokit/tutorial/databinding/03/webapp/manifest.json +5 -0
  380. package/test/sap/ui/core/demokit/tutorial/databinding/04/Component.js +9 -26
  381. package/test/sap/ui/core/demokit/tutorial/databinding/04/manifest.json +21 -0
  382. package/test/sap/ui/core/demokit/tutorial/databinding/04/ui5.yaml +1 -1
  383. package/test/sap/ui/core/demokit/tutorial/databinding/04/webapp/manifest.json +5 -0
  384. package/test/sap/ui/core/demokit/tutorial/databinding/05/Component.js +9 -26
  385. package/test/sap/ui/core/demokit/tutorial/databinding/05/manifest.json +21 -0
  386. package/test/sap/ui/core/demokit/tutorial/databinding/05/ui5.yaml +1 -1
  387. package/test/sap/ui/core/demokit/tutorial/databinding/05/webapp/manifest.json +5 -0
  388. package/test/sap/ui/core/demokit/tutorial/databinding/06/Component.js +9 -27
  389. package/test/sap/ui/core/demokit/tutorial/databinding/06/manifest.json +22 -0
  390. package/test/sap/ui/core/demokit/tutorial/databinding/06/ui5.yaml +1 -1
  391. package/test/sap/ui/core/demokit/tutorial/databinding/06/webapp/manifest.json +5 -0
  392. package/test/sap/ui/core/demokit/tutorial/databinding/07/Component.js +9 -28
  393. package/test/sap/ui/core/demokit/tutorial/databinding/07/manifest.json +23 -0
  394. package/test/sap/ui/core/demokit/tutorial/databinding/07/ui5.yaml +1 -1
  395. package/test/sap/ui/core/demokit/tutorial/databinding/07/webapp/manifest.json +5 -0
  396. package/test/sap/ui/core/demokit/tutorial/databinding/08/Component.js +9 -28
  397. package/test/sap/ui/core/demokit/tutorial/databinding/08/manifest.json +23 -0
  398. package/test/sap/ui/core/demokit/tutorial/databinding/08/ui5.yaml +1 -1
  399. package/test/sap/ui/core/demokit/tutorial/databinding/08/webapp/manifest.json +5 -0
  400. package/test/sap/ui/core/demokit/tutorial/databinding/09/Component.js +9 -29
  401. package/test/sap/ui/core/demokit/tutorial/databinding/09/manifest.json +24 -0
  402. package/test/sap/ui/core/demokit/tutorial/databinding/09/ui5.yaml +1 -1
  403. package/test/sap/ui/core/demokit/tutorial/databinding/09/webapp/manifest.json +5 -0
  404. package/test/sap/ui/core/demokit/tutorial/databinding/10/Component.js +9 -29
  405. package/test/sap/ui/core/demokit/tutorial/databinding/10/manifest.json +24 -0
  406. package/test/sap/ui/core/demokit/tutorial/databinding/10/ui5.yaml +1 -1
  407. package/test/sap/ui/core/demokit/tutorial/databinding/10/webapp/manifest.json +5 -0
  408. package/test/sap/ui/core/demokit/tutorial/databinding/11/Component.js +9 -29
  409. package/test/sap/ui/core/demokit/tutorial/databinding/11/manifest.json +24 -0
  410. package/test/sap/ui/core/demokit/tutorial/databinding/11/ui5.yaml +1 -1
  411. package/test/sap/ui/core/demokit/tutorial/databinding/11/webapp/manifest.json +5 -0
  412. package/test/sap/ui/core/demokit/tutorial/databinding/12/Component.js +9 -30
  413. package/test/sap/ui/core/demokit/tutorial/databinding/12/manifest.json +25 -0
  414. package/test/sap/ui/core/demokit/tutorial/databinding/12/ui5.yaml +1 -1
  415. package/test/sap/ui/core/demokit/tutorial/databinding/12/webapp/manifest.json +5 -0
  416. package/test/sap/ui/core/demokit/tutorial/databinding/13/Component.js +9 -30
  417. package/test/sap/ui/core/demokit/tutorial/databinding/13/manifest.json +25 -0
  418. package/test/sap/ui/core/demokit/tutorial/databinding/13/ui5.yaml +1 -1
  419. package/test/sap/ui/core/demokit/tutorial/databinding/13/webapp/manifest.json +5 -0
  420. package/test/sap/ui/core/demokit/tutorial/databinding/14/Component.js +9 -30
  421. package/test/sap/ui/core/demokit/tutorial/databinding/14/manifest.json +25 -0
  422. package/test/sap/ui/core/demokit/tutorial/databinding/14/ui5.yaml +1 -1
  423. package/test/sap/ui/core/demokit/tutorial/databinding/14/webapp/manifest.json +5 -0
  424. package/test/sap/ui/core/demokit/tutorial/databinding/15/Component.js +9 -32
  425. package/test/sap/ui/core/demokit/tutorial/databinding/15/manifest.json +27 -0
  426. package/test/sap/ui/core/demokit/tutorial/databinding/15/ui5.yaml +1 -1
  427. package/test/sap/ui/core/demokit/tutorial/databinding/15/webapp/manifest.json +5 -0
  428. package/test/sap/ui/core/demokit/tutorial/mockserver/01/Component.js +9 -30
  429. package/test/sap/ui/core/demokit/tutorial/mockserver/01/manifest.json +24 -0
  430. package/test/sap/ui/core/demokit/tutorial/mockserver/01/ui5.yaml +1 -1
  431. package/test/sap/ui/core/demokit/tutorial/mockserver/02/Component.js +9 -33
  432. package/test/sap/ui/core/demokit/tutorial/mockserver/02/manifest.json +27 -0
  433. package/test/sap/ui/core/demokit/tutorial/mockserver/02/ui5.yaml +1 -1
  434. package/test/sap/ui/core/demokit/tutorial/mockserver/03/Component.js +9 -33
  435. package/test/sap/ui/core/demokit/tutorial/mockserver/03/manifest.json +27 -0
  436. package/test/sap/ui/core/demokit/tutorial/mockserver/03/ui5.yaml +1 -1
  437. package/test/sap/ui/core/demokit/tutorial/mockserver/04/Component.js +9 -33
  438. package/test/sap/ui/core/demokit/tutorial/mockserver/04/manifest.json +27 -0
  439. package/test/sap/ui/core/demokit/tutorial/mockserver/04/ui5.yaml +1 -1
  440. package/test/sap/ui/core/demokit/tutorial/navigation/01/Component.js +9 -33
  441. package/test/sap/ui/core/demokit/tutorial/navigation/01/manifest.json +28 -0
  442. package/test/sap/ui/core/demokit/tutorial/navigation/01/ui5.yaml +1 -1
  443. package/test/sap/ui/core/demokit/tutorial/navigation/02/Component.js +9 -35
  444. package/test/sap/ui/core/demokit/tutorial/navigation/02/manifest.json +30 -0
  445. package/test/sap/ui/core/demokit/tutorial/navigation/02/ui5.yaml +1 -1
  446. package/test/sap/ui/core/demokit/tutorial/navigation/03/Component.js +9 -37
  447. package/test/sap/ui/core/demokit/tutorial/navigation/03/manifest.json +32 -0
  448. package/test/sap/ui/core/demokit/tutorial/navigation/03/ui5.yaml +1 -1
  449. package/test/sap/ui/core/demokit/tutorial/navigation/04/Component.js +9 -38
  450. package/test/sap/ui/core/demokit/tutorial/navigation/04/manifest.json +33 -0
  451. package/test/sap/ui/core/demokit/tutorial/navigation/04/ui5.yaml +1 -1
  452. package/test/sap/ui/core/demokit/tutorial/navigation/05/Component.js +9 -38
  453. package/test/sap/ui/core/demokit/tutorial/navigation/05/manifest.json +33 -0
  454. package/test/sap/ui/core/demokit/tutorial/navigation/05/ui5.yaml +1 -1
  455. package/test/sap/ui/core/demokit/tutorial/navigation/06/Component.js +9 -40
  456. package/test/sap/ui/core/demokit/tutorial/navigation/06/manifest.json +35 -0
  457. package/test/sap/ui/core/demokit/tutorial/navigation/06/ui5.yaml +1 -1
  458. package/test/sap/ui/core/demokit/tutorial/navigation/07/Component.js +9 -42
  459. package/test/sap/ui/core/demokit/tutorial/navigation/07/manifest.json +37 -0
  460. package/test/sap/ui/core/demokit/tutorial/navigation/07/ui5.yaml +1 -1
  461. package/test/sap/ui/core/demokit/tutorial/navigation/08/Component.js +9 -45
  462. package/test/sap/ui/core/demokit/tutorial/navigation/08/manifest.json +40 -0
  463. package/test/sap/ui/core/demokit/tutorial/navigation/08/ui5.yaml +1 -1
  464. package/test/sap/ui/core/demokit/tutorial/navigation/09/Component.js +9 -45
  465. package/test/sap/ui/core/demokit/tutorial/navigation/09/manifest.json +40 -0
  466. package/test/sap/ui/core/demokit/tutorial/navigation/09/ui5.yaml +1 -1
  467. package/test/sap/ui/core/demokit/tutorial/navigation/10/Component.js +9 -47
  468. package/test/sap/ui/core/demokit/tutorial/navigation/10/manifest.json +42 -0
  469. package/test/sap/ui/core/demokit/tutorial/navigation/10/ui5.yaml +1 -1
  470. package/test/sap/ui/core/demokit/tutorial/navigation/11/Component.js +9 -52
  471. package/test/sap/ui/core/demokit/tutorial/navigation/11/manifest.json +47 -0
  472. package/test/sap/ui/core/demokit/tutorial/navigation/11/ui5.yaml +1 -1
  473. package/test/sap/ui/core/demokit/tutorial/navigation/12/Component.js +9 -52
  474. package/test/sap/ui/core/demokit/tutorial/navigation/12/manifest.json +47 -0
  475. package/test/sap/ui/core/demokit/tutorial/navigation/12/ui5.yaml +1 -1
  476. package/test/sap/ui/core/demokit/tutorial/navigation/13/Component.js +9 -52
  477. package/test/sap/ui/core/demokit/tutorial/navigation/13/manifest.json +47 -0
  478. package/test/sap/ui/core/demokit/tutorial/navigation/13/ui5.yaml +1 -1
  479. package/test/sap/ui/core/demokit/tutorial/navigation/14/Component.js +9 -52
  480. package/test/sap/ui/core/demokit/tutorial/navigation/14/manifest.json +47 -0
  481. package/test/sap/ui/core/demokit/tutorial/navigation/14/ui5.yaml +1 -1
  482. package/test/sap/ui/core/demokit/tutorial/navigation/15/Component.js +9 -52
  483. package/test/sap/ui/core/demokit/tutorial/navigation/15/manifest.json +47 -0
  484. package/test/sap/ui/core/demokit/tutorial/navigation/15/ui5.yaml +1 -1
  485. package/test/sap/ui/core/demokit/tutorial/navigation/16/Component.js +9 -52
  486. package/test/sap/ui/core/demokit/tutorial/navigation/16/manifest.json +47 -0
  487. package/test/sap/ui/core/demokit/tutorial/navigation/16/ui5.yaml +1 -1
  488. package/test/sap/ui/core/demokit/tutorial/navigation/17/Component.js +9 -52
  489. package/test/sap/ui/core/demokit/tutorial/navigation/17/manifest.json +47 -0
  490. package/test/sap/ui/core/demokit/tutorial/navigation/17/ui5.yaml +1 -1
  491. package/test/sap/ui/core/demokit/tutorial/odatav4/01/Component.js +3 -27
  492. package/test/sap/ui/core/demokit/tutorial/odatav4/01/manifest.json +28 -0
  493. package/test/sap/ui/core/demokit/tutorial/odatav4/01/ui5.yaml +1 -1
  494. package/test/sap/ui/core/demokit/tutorial/odatav4/02/Component.js +3 -27
  495. package/test/sap/ui/core/demokit/tutorial/odatav4/02/manifest.json +28 -0
  496. package/test/sap/ui/core/demokit/tutorial/odatav4/02/ui5.yaml +1 -1
  497. package/test/sap/ui/core/demokit/tutorial/odatav4/03/Component.js +3 -27
  498. package/test/sap/ui/core/demokit/tutorial/odatav4/03/manifest.json +28 -0
  499. package/test/sap/ui/core/demokit/tutorial/odatav4/03/ui5.yaml +1 -1
  500. package/test/sap/ui/core/demokit/tutorial/odatav4/04/Component.js +3 -27
  501. package/test/sap/ui/core/demokit/tutorial/odatav4/04/manifest.json +28 -0
  502. package/test/sap/ui/core/demokit/tutorial/odatav4/04/ui5.yaml +1 -1
  503. package/test/sap/ui/core/demokit/tutorial/odatav4/05/Component.js +3 -27
  504. package/test/sap/ui/core/demokit/tutorial/odatav4/05/manifest.json +28 -0
  505. package/test/sap/ui/core/demokit/tutorial/odatav4/05/ui5.yaml +1 -1
  506. package/test/sap/ui/core/demokit/tutorial/odatav4/06/Component.js +3 -27
  507. package/test/sap/ui/core/demokit/tutorial/odatav4/06/manifest.json +28 -0
  508. package/test/sap/ui/core/demokit/tutorial/odatav4/06/ui5.yaml +1 -1
  509. package/test/sap/ui/core/demokit/tutorial/odatav4/07/Component.js +3 -27
  510. package/test/sap/ui/core/demokit/tutorial/odatav4/07/manifest.json +28 -0
  511. package/test/sap/ui/core/demokit/tutorial/odatav4/07/ui5.yaml +1 -1
  512. package/test/sap/ui/core/demokit/tutorial/odatav4/08/Component.js +3 -27
  513. package/test/sap/ui/core/demokit/tutorial/odatav4/08/manifest.json +28 -0
  514. package/test/sap/ui/core/demokit/tutorial/odatav4/08/ui5.yaml +1 -1
  515. package/test/sap/ui/core/demokit/tutorial/odatav4/09/Component.js +3 -27
  516. package/test/sap/ui/core/demokit/tutorial/odatav4/09/manifest.json +28 -0
  517. package/test/sap/ui/core/demokit/tutorial/odatav4/09/ui5.yaml +1 -1
  518. package/test/sap/ui/core/demokit/tutorial/odatav4/10/Component.js +3 -27
  519. package/test/sap/ui/core/demokit/tutorial/odatav4/10/manifest.json +28 -0
  520. package/test/sap/ui/core/demokit/tutorial/odatav4/10/ui5.yaml +1 -1
  521. package/test/sap/ui/core/demokit/tutorial/odatav4/11/Component.js +3 -27
  522. package/test/sap/ui/core/demokit/tutorial/odatav4/11/manifest.json +28 -0
  523. package/test/sap/ui/core/demokit/tutorial/odatav4/11/ui5.yaml +1 -1
  524. package/test/sap/ui/core/demokit/tutorial/troubleshooting/01/Component.js +9 -29
  525. package/test/sap/ui/core/demokit/tutorial/troubleshooting/01/manifest.json +25 -0
  526. package/test/sap/ui/core/demokit/tutorial/troubleshooting/01/ui5.yaml +1 -1
  527. package/test/sap/ui/core/qunit/BindingParser.qunit.js +4 -4
  528. package/test/sap/ui/core/qunit/ClientModel.qunit.js +28 -28
  529. package/test/sap/ui/core/qunit/CommandExecution.qunit.js +3 -1
  530. package/test/sap/ui/core/qunit/Core.qunit.js +1 -1
  531. package/test/sap/ui/core/qunit/DataBinding.qunit.js +6 -6
  532. package/test/sap/ui/core/qunit/Declarative.qunit.js +6 -6
  533. package/test/sap/ui/core/qunit/Element_base.qunit.js +8 -7
  534. package/test/sap/ui/core/qunit/Element_base_legacyAPIs.qunit.js +48 -0
  535. package/test/sap/ui/core/qunit/Element_closestTo.qunit.js +1 -1
  536. package/test/sap/ui/core/qunit/Fragment.qunit.js +63 -13
  537. package/test/sap/ui/core/qunit/HTML.qunit.js +5 -5
  538. package/test/sap/ui/core/qunit/Lib.qunit.js +59 -0
  539. package/test/sap/ui/core/qunit/ManagedObject.qunit.js +86 -3
  540. package/test/sap/ui/core/qunit/PlaceAt.qunit.js +6 -6
  541. package/test/sap/ui/core/qunit/Shortcut.qunit.js +9 -1
  542. package/test/sap/ui/core/qunit/UIArea.qunit.js +7 -6
  543. package/test/sap/ui/core/qunit/analytics/odata4analytics.qunit.js +41 -0
  544. package/test/sap/ui/core/qunit/base/Config_cascade.qunit.html +7 -5
  545. package/test/sap/ui/core/qunit/base/Config_cascade.qunit.js +46 -7
  546. package/test/sap/ui/core/qunit/base/config/GlobalConfigForCascade.js +24 -21
  547. package/test/sap/ui/core/qunit/base/i18n/Formatting.qunit.js +19 -0
  548. package/test/sap/ui/core/qunit/component/Component.qunit.js +35 -11
  549. package/test/sap/ui/core/qunit/component/ComponentContainer.qunit.js +1 -1
  550. package/test/sap/ui/core/qunit/component/Models.qunit.js +29 -30
  551. package/test/sap/ui/core/qunit/component/UIComponent.qunit.js +3 -3
  552. package/test/sap/ui/core/qunit/generic/ControlMemoryLeaks.qunit.js +4 -3
  553. package/test/sap/ui/core/qunit/generic/legacy/ControlMemoryLeaks.qunit.js +6 -7
  554. package/test/sap/ui/core/qunit/generic/legacy/DuplicateIdCheck.qunit.js +3 -2
  555. package/test/sap/ui/core/qunit/generic/legacy/testsuite.generic.qunit.js +3 -0
  556. package/test/sap/ui/core/qunit/i18n/Islamic.qunit.js +4 -4
  557. package/test/sap/ui/core/qunit/i18n/LocaleData.qunit.js +65 -0
  558. package/test/sap/ui/core/qunit/jquery.sap.ui.qunit.js +12 -12
  559. package/test/sap/ui/core/qunit/loader/syncMode_unavoidablySync.qunit.js +54 -1
  560. package/test/sap/ui/core/qunit/messages/messagesGeneral.qunit.js +3 -1
  561. package/test/sap/ui/core/qunit/mockserver/testdata/shopping/Products.json +1 -1
  562. package/test/sap/ui/core/qunit/model/ClientListBinding.qunit.js +2 -2
  563. package/test/sap/ui/core/qunit/model/ClientTreeBinding.qunit.js +2 -2
  564. package/test/sap/ui/core/qunit/model/FilterProcessor.qunit.js +58 -16
  565. package/test/sap/ui/core/qunit/model/Model.qunit.js +43 -2
  566. package/test/sap/ui/core/qunit/mvc/AnyView.qunit.js +3 -0
  567. package/test/sap/ui/core/qunit/mvc/Controller.qunit.js +3 -2
  568. package/test/sap/ui/core/qunit/mvc/EventHandlerResolver.qunit.js +2 -2
  569. package/test/sap/ui/core/qunit/mvc/View.qunit.js +38 -35
  570. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessor.qunit.js +1 -1
  571. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessorAsync.qunit.js +1 -1
  572. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessorRequireXML.qunit.js +5 -5
  573. package/test/sap/ui/core/qunit/mvc/XMLView.qunit.js +1 -1
  574. package/test/sap/ui/core/qunit/mvc/extensions/ControllerMetadata.qunit.js +6 -2
  575. package/test/sap/ui/core/qunit/mvc/extensions/Controllerextensions.qunit.js +12 -0
  576. package/test/sap/ui/core/qunit/mvc/extensions/Controllerextensions_legacy.qunit.js +12 -0
  577. package/test/sap/ui/core/qunit/mvc/extensions/testdata/AnotherMain.controller.js +3 -1
  578. package/test/sap/ui/core/qunit/mvc/testdata/XMLViewEmbeddingTypedViews.view.xml +1 -1
  579. package/test/sap/ui/core/qunit/mvc/viewprocessing/ViewProcessing.qunit.js +26 -7
  580. package/test/sap/ui/core/qunit/mvc_legacyAPIs/XMLTemplateProcessorRequireXML_legacyAPIs.qunit.js +5 -5
  581. package/test/sap/ui/core/qunit/mvc_legacyAPIs/XMLView_legacyAPIs.qunit.js +2 -2
  582. package/test/sap/ui/core/qunit/odata/ODataMessageParserNoFakeService.qunit.js +36 -34
  583. package/test/sap/ui/core/qunit/odata/ODataModel_legacyAPIs.qunit.js +22 -22
  584. package/test/sap/ui/core/qunit/odata/ODataTreeBindingAdapter.qunit.js +1 -1
  585. package/test/sap/ui/core/qunit/odata/v2/ODataListBindingNoFakeService.qunit.js +16 -16
  586. package/test/sap/ui/core/qunit/odata/v2/ODataModel.integration.qunit.js +69 -0
  587. package/test/sap/ui/core/qunit/odata/v2/ODataModelNoFakeService.qunit.js +2 -11
  588. package/test/sap/ui/core/qunit/odata/v2/ODataTreeBindingNoFakeService.qunit.js +17 -17
  589. package/test/sap/ui/core/qunit/odata/v2/ODataV2Model.qunit.js +32 -36
  590. package/test/sap/ui/core/qunit/odata/v4/Context.qunit.js +43 -22
  591. package/test/sap/ui/core/qunit/odata/v4/ODataBinding.qunit.js +19 -9
  592. package/test/sap/ui/core/qunit/odata/v4/ODataListBinding.qunit.js +318 -217
  593. package/test/sap/ui/core/qunit/odata/v4/ODataMetaModel.qunit.js +5 -5
  594. package/test/sap/ui/core/qunit/odata/v4/ODataModel.integration.qunit.js +2148 -124
  595. package/test/sap/ui/core/qunit/odata/v4/ODataParentBinding.qunit.js +43 -35
  596. package/test/sap/ui/core/qunit/odata/v4/data/metadata_special_cases.xml +20 -2
  597. package/test/sap/ui/core/qunit/odata/v4/lib/_AggregationCache.qunit.js +453 -125
  598. package/test/sap/ui/core/qunit/odata/v4/lib/_AggregationHelper.qunit.js +70 -33
  599. package/test/sap/ui/core/qunit/odata/v4/lib/_Cache.qunit.js +256 -8
  600. package/test/sap/ui/core/qunit/odata/v4/lib/_Requestor.qunit.js +10 -2
  601. package/test/sap/ui/core/qunit/opa/actions/EnterText.qunit.js +40 -1
  602. package/test/sap/ui/core/qunit/performance/trace/FESR.qunit.js +11 -2
  603. package/test/sap/ui/core/qunit/performance/trace/Interaction.qunit.js +4 -7
  604. package/test/sap/ui/core/qunit/routing/async/Router.qunit.js +102 -52
  605. package/test/sap/ui/core/qunit/routing/async/Target.qunit.js +1 -1
  606. package/test/sap/ui/core/qunit/routing/async/Targets.qunit.js +4 -5
  607. package/test/sap/ui/core/qunit/routing/async/TitleHistory.qunit.js +1 -1
  608. package/test/sap/ui/core/qunit/routing/fixture/router/component/parentRoute/Child/Component.js +1 -0
  609. package/test/sap/ui/core/qunit/routing/fixture/router/component/parentRoute/Child/manifest.json +1 -5
  610. package/test/sap/ui/core/qunit/routing/fixture/router/component/parentRoute/Parent/Component.js +1 -0
  611. package/test/sap/ui/core/qunit/routing/fixture/router/component/parentRoute/Parent/manifest.json +1 -5
  612. package/test/sap/ui/core/qunit/routing/fixture/router/component/parentRoute/ParentExtended/Component.js +15 -0
  613. package/test/sap/ui/core/qunit/routing/fixture/router/component/parentRoute/ParentExtended/manifest.json +8 -0
  614. package/test/sap/ui/core/qunit/routing/sync/Router.qunit.js +2 -2
  615. package/test/sap/ui/core/qunit/routing/sync/Targets.qunit.js +2 -3
  616. package/test/sap/ui/core/qunit/testdata/fragments/XMLTestFragmentWithXMLView.fragment.xml +5 -0
  617. package/test/sap/ui/core/qunit/testsuites/testsuite.base.configuration.qunit.js +1 -1
  618. package/test/sap/ui/core/qunit/testsuites/testsuite.control.framework.qunit.js +4 -0
  619. package/test/sap/ui/core/qunit/types/DateFormat.qunit.js +190 -0
  620. package/test/sap/ui/core/qunit/types/DateInterval.qunit.js +2 -2
  621. package/test/sap/ui/core/qunit/ui5classes/ManagedObjectRegistry.qunit.js +161 -0
  622. package/test/sap/ui/core/qunit/ui5classes/ManagedObjectRegistry_legacyAPIs.qunit.js +150 -0
  623. package/test/sap/ui/core/qunit/ui5classes/testsuite.ui5classes.qunit.js +84 -0
  624. package/test/sap/ui/core/qunit/util/ViewSerializer.qunit.js +4 -3
  625. package/test/sap/ui/core/relnotes/changes-1.120.json +307 -0
@@ -57,7 +57,7 @@ sap.ui.define([
57
57
  * @mixes sap.ui.model.odata.v4.ODataParentBinding
58
58
  * @public
59
59
  * @since 1.37.0
60
- * @version 1.120.0
60
+ * @version 1.120.2
61
61
  * @borrows sap.ui.model.odata.v4.ODataBinding#getGroupId as #getGroupId
62
62
  * @borrows sap.ui.model.odata.v4.ODataBinding#getRootBinding as #getRootBinding
63
63
  * @borrows sap.ui.model.odata.v4.ODataBinding#getUpdateGroupId as #getUpdateGroupId
@@ -117,9 +117,13 @@ sap.ui.define([
117
117
  this.checkBindingParameters(mParameters, ["$$aggregation", "$$canonicalPath",
118
118
  "$$getKeepAliveContext", "$$groupId", "$$operationMode", "$$ownRequest",
119
119
  "$$patchWithoutSideEffects", "$$sharedRequest", "$$updateGroupId"]);
120
+ const aFilters = _Helper.toArray(vFilters);
121
+ if (mParameters.$$aggregation && aFilters[0] === Filter.NONE) {
122
+ throw new Error("Cannot combine Filter.NONE with $$aggregation");
123
+ }
120
124
  // number of active (client-side) created contexts in aContexts
121
125
  this.iActiveContexts = 0;
122
- this.aApplicationFilters = _Helper.toArray(vFilters);
126
+ this.aApplicationFilters = aFilters;
123
127
  this.sChangeReason = oModel.bAutoExpandSelect && !_Helper.isDataAggregation(mParameters)
124
128
  ? "AddVirtualContext"
125
129
  : undefined;
@@ -433,7 +437,7 @@ sap.ui.define([
433
437
  * The context for the created entity
434
438
  * @param {boolean} oEvent.getParameters.success
435
439
  * Whether the POST was successfully processed; in case of an error, the error is already
436
- * reported to the {@link sap.ui.core.message.MessageManager}
440
+ * reported to {@link sap.ui.core.Messaging}
437
441
  *
438
442
  * @event sap.ui.model.odata.v4.ODataListBinding#createCompleted
439
443
  * @public
@@ -748,7 +752,7 @@ sap.ui.define([
748
752
  * method then adds a transient entity to the parent's navigation property, which is sent with
749
753
  * the payload of the parent entity. Such a nested context cannot be inactive.
750
754
  *
751
- * <b>Note:</b> After a succesful creation of the main entity the context returned for a
755
+ * <b>Note:</b> After a successful creation of the main entity the context returned for a
752
756
  * nested entity is no longer valid. Do not use the
753
757
  * {@link sap.ui.model.odata.v4.Context#created created} promise of such a context! New contexts
754
758
  * are created for the nested collection because it is not possible to reliably assign the
@@ -1075,6 +1079,8 @@ sap.ui.define([
1075
1079
  // created persisted contexts can be restored from their data, for example in
1076
1080
  // case of Recursive Hierarchy maintenance
1077
1081
  oContext = _Helper.getPrivateAnnotation(aResults[i], "context");
1082
+ oContext.iIndex = i$skipIndex;
1083
+ // oContext.checkUpdate(); // Note: no changes expected here
1078
1084
  } else {
1079
1085
  oContext = Context.create(oModel, this, sContextPath, i$skipIndex);
1080
1086
  }
@@ -1526,7 +1532,8 @@ sap.ui.define([
1526
1532
  * @param {number} iMaximumPrefetchSize
1527
1533
  * The maximum number of rows to read before and after the given range
1528
1534
  * @param {sap.ui.model.odata.v4.lib._GroupLock} [oGroupLock]
1529
- * A lock for the group ID to be used, defaults to the binding's group ID
1535
+ * A lock for the group ID to be used; if not given, the read group lock or a lock to the
1536
+ * binding's group ID are used
1530
1537
  * @param {boolean} [bAsync]
1531
1538
  * Whether the function must be async even if the data is available synchronously
1532
1539
  * @param {function} [fnDataRequested]
@@ -1550,7 +1557,10 @@ sap.ui.define([
1550
1557
  // estimated length.
1551
1558
  iStart += this.iCreatedContexts;
1552
1559
  }
1553
- oGroupLock = oGroupLock || this.lockGroup();
1560
+ if (!oGroupLock) {
1561
+ oGroupLock = this.oReadGroupLock || this.lockGroup();
1562
+ this.oReadGroupLock = undefined;
1563
+ }
1554
1564
  oPromise = this.fetchData(iStart, iLength, iMaximumPrefetchSize, oGroupLock,
1555
1565
  fnDataRequested);
1556
1566
  if (bAsync) {
@@ -1610,7 +1620,8 @@ sap.ui.define([
1610
1620
  }
1611
1621
 
1612
1622
  if (oCache) {
1613
- if (!oCache.hasSentRequest() && ODataListBinding.isBelowCreated(oContext)) {
1623
+ if (!oCache.hasSentRequest() && that.isRelative()
1624
+ && ODataListBinding.isBelowCreated(oContext)) {
1614
1625
  aElements = oContext.getAndRemoveCollection(that.sPath);
1615
1626
  if (aElements) { // there is a collection from a finished deep create
1616
1627
  // copy the created elements into the newly created cache
@@ -1645,13 +1656,14 @@ sap.ui.define([
1645
1656
  /**
1646
1657
  * Returns a URL by which the complete content of the list can be downloaded in JSON format. The
1647
1658
  * request delivers all entities considering the binding's query options (such as filters or
1648
- * sorters).
1659
+ * sorters). Returns <code>null</code> if the binding's filter is
1660
+ * {@link sap.ui.filter.Filter.NONE}.
1649
1661
  *
1650
- * @returns {sap.ui.base.SyncPromise<string>}
1651
- * A promise that is resolved with the download URL.
1662
+ * @returns {sap.ui.base.SyncPromise<string|null>}
1663
+ * A promise that is resolved with the download URL or <code>null</code>
1652
1664
  * @throws {Error}
1653
1665
  * If the binding is unresolved or is {@link #isTransient transient} (part of a
1654
- * {@link sap.ui.model.odata.v4.ODataListBinding#create deep create}),
1666
+ * {@link sap.ui.model.odata.v4.ODataListBinding#create deep create})
1655
1667
  *
1656
1668
  * @private
1657
1669
  */
@@ -1662,14 +1674,20 @@ sap.ui.define([
1662
1674
  if (!this.isResolved()) {
1663
1675
  throw new Error("Binding is unresolved");
1664
1676
  }
1677
+ if (this.hasFilterNone()) {
1678
+ return SyncPromise.resolve(null);
1679
+ }
1680
+
1665
1681
  return this.withCache(function (oCache, sPath) {
1666
1682
  return oCache.getDownloadUrl(sPath, mUriParameters);
1667
1683
  });
1668
1684
  };
1669
1685
 
1670
1686
  /**
1671
- * Requests a $filter query option value for the this binding; the value is computed from the
1672
- * given arrays of dynamic application and control filters and the given static filter.
1687
+ * Requests a $filter query option value for this binding; the value is computed from the
1688
+ * given arrays of dynamic application and control filters and the given static filter. If
1689
+ * {@link sap.ui.filter.Filter.NONE} is set as any of the dynamic filters, it will override
1690
+ * all static filters.
1673
1691
  *
1674
1692
  * @param {sap.ui.model.Context} oContext
1675
1693
  * The context instance to be used; it is given as a parameter and this.oContext is unused
@@ -1678,7 +1696,7 @@ sap.ui.define([
1678
1696
  * @param {string} sStaticFilter
1679
1697
  * The static filter value
1680
1698
  * @returns {sap.ui.base.SyncPromise} A promise which resolves with an array that consists of
1681
- * two filters, the first one ("$filter") has to be be applied after and the second one
1699
+ * two filters, the first one ("$filter") has to be applied after and the second one
1682
1700
  * ("$$filterBeforeAggregate") has to be applied before aggregating the data.
1683
1701
  * Both can be <code>undefined</code>. It rejects with an error if a filter has an unknown
1684
1702
  * operator or an invalid path.
@@ -1830,6 +1848,9 @@ sap.ui.define([
1830
1848
  if (!oCombinedFilter) {
1831
1849
  return SyncPromise.resolve([sStaticFilter]);
1832
1850
  }
1851
+ if (oCombinedFilter === Filter.NONE) {
1852
+ return SyncPromise.resolve(["false"]);
1853
+ }
1833
1854
  aFilters = _AggregationHelper.splitFilter(oCombinedFilter, this.mParameters.$$aggregation);
1834
1855
  oMetaModel = this.oModel.getMetaModel();
1835
1856
  oMetaContext = oMetaModel.getMetaContext(this.oModel.resolve(this.sPath, oContext));
@@ -1844,6 +1865,59 @@ sap.ui.define([
1844
1865
  ]);
1845
1866
  };
1846
1867
 
1868
+ /**
1869
+ * Fetches (<code>bAllowRequest</code> must be set to <code>true</code>) or gets the parent node
1870
+ * of a given child node (in case of a recursive hierarchy; see {@link #setAggregation}).
1871
+ *
1872
+ * @param {sap.ui.model.odata.v4.Context} oNode
1873
+ * Some node which could have a parent
1874
+ * @param {boolean} [bAllowRequest]
1875
+ * Whether it is allowed to send a GET request to fetch the parent node's data
1876
+ * @returns {sap.ui.model.odata.v4.Context|null|undefined|
1877
+ * Promise<sap.ui.model.odata.v4.Context>|sap.ui.base.SyncPromise}
1878
+ * <ul>
1879
+ * <li> The parent node if already known,
1880
+ * <li> <code>null</code> if the given node is a root node and thus has no parent,
1881
+ * <li> <code>undefined</code> if the parent node hasn't been read yet and it is not
1882
+ * allowed to send a request (see <code>bAllowRequest</code>),
1883
+ * <li> a promise (if a request was sent) which resolves with the parent node or rejects
1884
+ * with an <code>Error</code> instance.
1885
+ * </ul>
1886
+ * @throws {Error} If the given node is not part of a recursive hierarchy
1887
+ *
1888
+ * @private
1889
+ */
1890
+ ODataListBinding.prototype.fetchOrGetParent = function (oNode, bAllowRequest) {
1891
+ const oAggregation = this.mParameters.$$aggregation;
1892
+
1893
+ if (!oAggregation || !oAggregation.hierarchyQualifier) {
1894
+ throw new Error("Missing recursive hierarchy");
1895
+ }
1896
+ if (this.aContexts[oNode.iIndex] !== oNode) {
1897
+ throw new Error("Not currently part of a recursive hierarchy: " + oNode);
1898
+ }
1899
+
1900
+ const iParentIndex = this.oCache.getParentIndex(oNode.iIndex);
1901
+ if (iParentIndex < 0) {
1902
+ return null;
1903
+ }
1904
+
1905
+ if (iParentIndex === undefined && bAllowRequest) {
1906
+ return this.oCache.fetchParent(oNode.iIndex, this.lockGroup()).then((oResult) => {
1907
+ const sPath = this.getResolvedPath()
1908
+ + _Helper.getPrivateAnnotation(oResult, "predicate");
1909
+ const oParentContext = Context.create(this.oModel, this, sPath);
1910
+ this.mPreviousContextsByPath[sPath] = oParentContext;
1911
+
1912
+ return oParentContext;
1913
+ });
1914
+ }
1915
+
1916
+ return bAllowRequest
1917
+ ? this.requestContexts(iParentIndex, 1).then((aResult) => aResult[0])
1918
+ : this.aContexts[iParentIndex];
1919
+ };
1920
+
1847
1921
  /**
1848
1922
  * Requests the value for the given path and index; the value is requested from this binding's
1849
1923
  * cache or from its context in case it has no cache.
@@ -1958,7 +2032,10 @@ sap.ui.define([
1958
2032
  * <li> the binding is {@link #isTransient transient} (part of a
1959
2033
  * {@link sap.ui.model.odata.v4.ODataListBinding#create deep create}),
1960
2034
  * <li> an unsupported operation mode is used (see
1961
- * {@link sap.ui.model.odata.v4.ODataModel#bindList}).
2035
+ * {@link sap.ui.model.odata.v4.ODataModel#bindList}),
2036
+ * <li> the {@link sap.ui.model.Filter.NONE} filter instance is contained in
2037
+ * <code>vFilters</code> together with other filters,
2038
+ * <li> {@link sap.ui.model.Filter.NONE} is applied to a binding with $$aggregation
1962
2039
  * </ul>
1963
2040
  * The following pending changes are ignored:
1964
2041
  * <ul>
@@ -1979,6 +2056,10 @@ sap.ui.define([
1979
2056
  var aFilters = _Helper.toArray(vFilters);
1980
2057
 
1981
2058
  this.checkTransient();
2059
+ Filter.checkFilterNone(aFilters);
2060
+ if (aFilters[0] === Filter.NONE && this.mParameters.$$aggregation) {
2061
+ throw new Error("Cannot combine Filter.NONE with $$aggregation");
2062
+ }
1982
2063
  if (this.sOperationMode !== OperationMode.Server) {
1983
2064
  throw new Error("Operation mode has to be sap.ui.model.odata.OperationMode.Server");
1984
2065
  }
@@ -2050,10 +2131,10 @@ sap.ui.define([
2050
2131
  * entity type, identified via the <code>hierarchyQualifier</code> given to
2051
2132
  * {@link #setAggregation}.
2052
2133
  * <ul>
2053
- * <li> "$DistanceFromRootProperty" holds the path to the property which provides the raw
2134
+ * <li> "$DistanceFromRoot" holds the path to the property which provides the raw
2054
2135
  * value for "@$ui5.node.level" (minus one) and should be used only to interpret the
2055
2136
  * response retrieved via {@link #getDownloadUrl}.
2056
- * <li> "$DrillStateProperty" holds the path to the property which provides the raw value
2137
+ * <li> "$DrillState" holds the path to the property which provides the raw value
2057
2138
  * for "@$ui5.node.isExpanded" and should be used only to interpret the response retrieved
2058
2139
  * via {@link #getDownloadUrl}.
2059
2140
  * <li> "$NodeProperty" holds the path to the property which provides the hierarchy node
@@ -2069,7 +2150,7 @@ sap.ui.define([
2069
2150
  ODataListBinding.prototype.getAggregation = function (bVerbose) {
2070
2151
  return _Helper.clone(this.mParameters.$$aggregation, function (sKey, vValue) {
2071
2152
  return sKey[0] === "$"
2072
- && !(bVerbose && ["$DistanceFromRootProperty", "$DrillStateProperty",
2153
+ && !(bVerbose && ["$DistanceFromRoot", "$DrillState",
2073
2154
  "$NodeProperty"].includes(sKey))
2074
2155
  ? undefined
2075
2156
  : vValue;
@@ -2209,7 +2290,6 @@ sap.ui.define([
2209
2290
  aContexts,
2210
2291
  bDataRequested = false,
2211
2292
  bFireChange = false,
2212
- oGroupLock,
2213
2293
  bPreventBubbling,
2214
2294
  oPromise,
2215
2295
  bRefreshEvent = !!this.sChangeReason, // ignored for "*VirtualContext"
@@ -2296,13 +2376,11 @@ sap.ui.define([
2296
2376
  iMaximumPrefetchSize = 0;
2297
2377
  }
2298
2378
 
2299
- oGroupLock = this.oReadGroupLock;
2300
- this.oReadGroupLock = undefined;
2301
2379
  if (!this.oDiff) { // w/o E.C.D there won't be a diff
2302
2380
  // before fetchContexts needing it and resolveRefreshPromise destroying it
2303
2381
  bPreventBubbling = this.isRefreshWithoutBubbling();
2304
2382
  // make sure "refresh" is followed by async "change"
2305
- oPromise = this.fetchContexts(iStart, iLength, iMaximumPrefetchSize, oGroupLock,
2383
+ oPromise = this.fetchContexts(iStart, iLength, iMaximumPrefetchSize, undefined,
2306
2384
  /*bAsync*/bRefreshEvent, function () {
2307
2385
  bDataRequested = true;
2308
2386
  that.fireDataRequested(bPreventBubbling);
@@ -2339,11 +2417,6 @@ sap.ui.define([
2339
2417
  });
2340
2418
  // in case of asynchronous processing ensure to fire a change event
2341
2419
  bFireChange = true;
2342
- } else if (oGroupLock) { // unexpected oReadGroupLock and oDiff
2343
- if (oGroupLock.isLocked()) {
2344
- throw new Error("Unexpected: " + oGroupLock);
2345
- }
2346
- Log.error("Unexpected", oGroupLock, sClassName);
2347
2420
  }
2348
2421
  if (!bKeepCurrent) {
2349
2422
  this.iCurrentBegin = iStart;
@@ -2523,8 +2596,9 @@ sap.ui.define([
2523
2596
  /**
2524
2597
  * Returns a URL by which the complete content of the list can be downloaded in JSON format. The
2525
2598
  * request delivers all entities considering the binding's query options (such as filters or
2526
- * sorters).
2527
- *
2599
+ * sorters). Returns <code>null</code> if the binding's filter is
2600
+ * {@link sap.ui.filter.Filter.NONE}.
2601
+
2528
2602
  * The returned URL does not specify <code>$skip</code> and <code>$top</code> and leaves it up
2529
2603
  * to the server how many rows it delivers. Many servers tend to choose a small limit without
2530
2604
  * <code>$skip</code> and <code>$top</code>, so it might be wise to add an appropriate value for
@@ -2536,14 +2610,14 @@ sap.ui.define([
2536
2610
  * The URL cannot be determined synchronously in all cases; use {@link #requestDownloadUrl} to
2537
2611
  * allow for asynchronous determination then.
2538
2612
  *
2539
- * @returns {string}
2540
- * The download URL
2613
+ * @returns {string|null}
2614
+ * The download URL or <code>null</code>
2541
2615
  * @throws {Error}
2542
2616
  * If the binding is unresolved or if the URL cannot be determined synchronously (either due
2543
2617
  * to a pending metadata request or because the <code>autoExpandSelect</code> parameter at the
2544
2618
  * {@link sap.ui.model.odata.v4.ODataModel#constructor model} is used and the binding has been
2545
2619
  * newly created and is thus still automatically generating its $select and $expand system
2546
- * query options from the binding hierarchy)
2620
+ * query options from the binding hierarchy).
2547
2621
  *
2548
2622
  * @function
2549
2623
  * @public
@@ -2822,42 +2896,6 @@ sap.ui.define([
2822
2896
  return aOrderbyOptions.join(",");
2823
2897
  };
2824
2898
 
2825
- /**
2826
- * Returns the parent node of a given child node (in case of a recursive hierarchy, see
2827
- * {@link sap.ui.model.odata.v4.ODataListBinding#setAggregation}, where
2828
- * <code>oAggregation.expandTo</code> must be equal to one).
2829
- *
2830
- * @param {sap.ui.model.odata.v4.Context} oNode
2831
- * Some node which could have a parent
2832
- * @returns {sap.ui.model.odata.v4.Context|null}
2833
- * The parent node, or <code>null</code> if the given node is a root node and thus has no
2834
- * parent
2835
- * @throws {Error} If
2836
- * <ul>
2837
- * <li> the given node is not part of a recursive hierarchy,
2838
- * <li> <code>oAggregation.expandTo</code> is greater than one.
2839
- * </ul>
2840
- *
2841
- * @private
2842
- * @see #requestParent
2843
- */
2844
- ODataListBinding.prototype.getParent = function (oNode) {
2845
- const oAggregation = this.mParameters.$$aggregation;
2846
-
2847
- if (!oAggregation || !oAggregation.hierarchyQualifier) {
2848
- throw new Error("Missing recursive hierarchy");
2849
- }
2850
- if (oAggregation.expandTo > 1) {
2851
- throw new Error("Unsupported $$aggregation.expandTo: " + oAggregation.expandTo);
2852
- }
2853
- if (this.aContexts[oNode.iIndex] !== oNode) {
2854
- throw new Error("Not currently part of a recursive hierarchy: " + oNode);
2855
- }
2856
- const iParentIndex = this.oCache.getParentIndex(oNode.iIndex);
2857
-
2858
- return iParentIndex < 0 ? null : this.aContexts[iParentIndex];
2859
- };
2860
-
2861
2899
  /**
2862
2900
  * Returns the query options of the binding.
2863
2901
  *
@@ -2904,6 +2942,17 @@ sap.ui.define([
2904
2942
  return this.mQueryOptions;
2905
2943
  };
2906
2944
 
2945
+ /**
2946
+ * Returns true if the binding has {@link sap.ui.model.Filter.NONE} in its filters.
2947
+ *
2948
+ * @returns {boolean} Whether there is a {@link sap.ui.model.Filter.NONE}
2949
+ *
2950
+ * @private
2951
+ */
2952
+ ODataListBinding.prototype.hasFilterNone = function () {
2953
+ return this.aFilters[0] === Filter.NONE || this.aApplicationFilters[0] === Filter.NONE;
2954
+ };
2955
+
2907
2956
  /**
2908
2957
  * @override
2909
2958
  * @see sap.ui.model.odata.v4.ODataBinding#hasPendingChangesForPath
@@ -3012,7 +3061,7 @@ sap.ui.define([
3012
3061
  * (in case of a recursive hierarchy).
3013
3062
  *
3014
3063
  * @param {sap.ui.model.odata.v4.Context} oAncestor - Some node which may be an ancestor
3015
- * @param {sap.ui.model.odata.v4.Context} oDescendant - Some node which may be a descendant
3064
+ * @param {sap.ui.model.odata.v4.Context} [oDescendant] - Some node which may be a descendant
3016
3065
  * @returns {boolean} Whether the assumed ancestor relation holds
3017
3066
  * @throws {Error} If either context does not represent a node in a recursive hierarchy
3018
3067
  * according to its current expansion state
@@ -3023,6 +3072,9 @@ sap.ui.define([
3023
3072
  if (!this.mParameters.$$aggregation || !this.mParameters.$$aggregation.hierarchyQualifier) {
3024
3073
  throw new Error("Missing recursive hierarchy");
3025
3074
  }
3075
+ if (!oDescendant) {
3076
+ return false;
3077
+ }
3026
3078
  [oAncestor, oDescendant].forEach((oNode) => {
3027
3079
  if (this.aContexts[oNode.iIndex] !== oNode) {
3028
3080
  throw new Error("Not currently part of a recursive hierarchy: " + oNode);
@@ -3085,6 +3137,8 @@ sap.ui.define([
3085
3137
  */
3086
3138
  ODataListBinding.prototype.isUnchangedParameter = function (sName, vOtherValue) {
3087
3139
  if (sName === "$$aggregation") {
3140
+ // Note: $fetchMetadata is lost here, but never mind - $apply does not matter, only
3141
+ // normalization is needed
3088
3142
  vOtherValue = _Helper.clone(vOtherValue); // avoid modification due to normalization
3089
3143
  _AggregationHelper.buildApply(vOtherValue);
3090
3144
 
@@ -3106,51 +3160,54 @@ sap.ui.define([
3106
3160
  * @see #getCurrentContexts
3107
3161
  */
3108
3162
  ODataListBinding.prototype.keepOnlyVisibleContexts = function () {
3109
- var aCreatedContexts = this.aContexts.slice(0, this.iCreatedContexts),
3110
- aContexts = aCreatedContexts.concat(
3111
- this.getCurrentContexts().filter(function (oContext) {
3112
- // avoid duplicates for created contexts
3113
- // Note: avoid #created or #isTransient because there may be created contexts
3114
- // outside aContexts' area of "created contexts" (via "keep alive" or selection)
3115
- return oContext && !aCreatedContexts.includes(oContext);
3116
- })
3117
- ),
3118
- that = this;
3163
+ const aCreatedContexts = this.aContexts.slice(0, this.iCreatedContexts);
3164
+ const aContexts = aCreatedContexts.concat(
3165
+ this.getCurrentContexts().filter((oContext) => {
3166
+ // avoid duplicates for created contexts
3167
+ // Note: avoid #created or #isTransient because there may be created contexts
3168
+ // outside aContexts' area of "created contexts" (via "keep alive" or selection)
3169
+ return oContext && !aCreatedContexts.includes(oContext);
3170
+ })
3171
+ );
3172
+
3173
+ // add kept-alive contexts outside collection
3174
+ Object.keys(this.mPreviousContextsByPath).forEach((sPath) => {
3175
+ var oContext = this.mPreviousContextsByPath[sPath];
3176
+
3177
+ if (oContext.isEffectivelyKeptAlive()) {
3178
+ aContexts.push(oContext);
3179
+ }
3180
+ });
3181
+
3182
+ let iNewLength = 0;
3119
3183
 
3120
3184
  /**
3121
3185
  * Keeps and requests created contexts, destroys others.
3122
3186
  *
3187
+ * @param {number} iBase - A base index
3123
3188
  * @param {sap.ui.model.odata.v4.Context} oContext0 - A context, maybe created
3189
+ * @param {number} iIndex - A relative index
3124
3190
  */
3125
- function keepOrDestroy(oContext0) {
3191
+ function keepOrDestroy(iBase, oContext0, iIndex) {
3126
3192
  if (oContext0.created()) { // e.g. Recursive Hierarchy maintenance
3127
3193
  aContexts.push(oContext0);
3194
+ iNewLength = iBase + iIndex + 1;
3128
3195
  } else {
3129
- that.destroyLater(oContext0);
3196
+ delete this.aContexts[iBase + iIndex];
3197
+ this.destroyLater(oContext0);
3130
3198
  }
3131
3199
  }
3132
3200
 
3133
- // add kept-alive contexts outside collection
3134
- Object.keys(this.mPreviousContextsByPath).forEach(function (sPath) {
3135
- var oContext = that.mPreviousContextsByPath[sPath];
3136
-
3137
- if (oContext.isEffectivelyKeptAlive()) {
3138
- aContexts.push(oContext);
3139
- }
3140
- });
3141
-
3142
3201
  // remove and later destroy others
3143
3202
  this.aContexts.slice(this.iCreatedContexts, this.iCurrentBegin)
3144
- .forEach(function (oContext0, i) {
3145
- delete that.aContexts[that.iCreatedContexts + i];
3146
- keepOrDestroy(oContext0);
3147
- });
3203
+ .forEach(keepOrDestroy.bind(this, this.iCreatedContexts));
3148
3204
  if (this.aContexts.length > this.iCurrentEnd && this.iCurrentEnd >= this.iCreatedContexts) {
3149
- this.aContexts.slice(this.iCurrentEnd).forEach(keepOrDestroy);
3150
- this.aContexts.length = this.iCurrentEnd;
3205
+ this.aContexts.slice(this.iCurrentEnd)
3206
+ .forEach(keepOrDestroy.bind(this, this.iCurrentEnd));
3207
+ this.aContexts.length = Math.max(iNewLength, this.iCurrentEnd);
3151
3208
  }
3152
3209
 
3153
- return aContexts.filter(function (oContext) {
3210
+ return aContexts.filter((oContext) => {
3154
3211
  // cannot request side effects for transient contexts
3155
3212
  // Note: do not use #isTransient because #created() may not be resolved yet,
3156
3213
  // although already persisted (timing issue, see caller)
@@ -3162,12 +3219,16 @@ sap.ui.define([
3162
3219
  * Moves the given (child) node to the given parent. An expanded (child) node is silently
3163
3220
  * collapsed before and expanded after the move. A collapsed parent is automatically expanded;
3164
3221
  * so is a leaf. The (child) node is added as the parent's 1st child (created persisted).
3222
+ * Omitting a new parent turns the child into a root.
3165
3223
  *
3166
3224
  * @param {sap.ui.model.odata.v4.Context} oChildContext - The (child) node to be moved
3167
- * @param {sap.ui.model.odata.v4.Context} oParentContext - The new parent's context
3225
+ * @param {sap.ui.model.odata.v4.Context} [oParentContext] - The new parent's context
3168
3226
  * @returns {sap.ui.base.SyncPromise<void>}
3169
3227
  * A promise which is resolved without a defined result when the move is finished, or
3170
3228
  * rejected in case of an error
3229
+ * @throws {Error}
3230
+ * If <code>oAggregation.expandTo</code> is unsupported (neither one nor at least
3231
+ * <code>Number.MAX_SAFE_INTEGER</code>).
3171
3232
  *
3172
3233
  * @private
3173
3234
  */
@@ -3186,13 +3247,21 @@ sap.ui.define([
3186
3247
  }
3187
3248
  };
3188
3249
 
3250
+ const oAggregation = this.mParameters.$$aggregation;
3251
+ if (!oAggregation || !oAggregation.hierarchyQualifier) {
3252
+ throw new Error("Missing recursive hierarchy");
3253
+ }
3254
+ if (oAggregation.expandTo > 1 && oAggregation.expandTo < 999) {
3255
+ throw new Error("Unsupported $$aggregation.expandTo: " + oAggregation.expandTo);
3256
+ } // Note: undefined is well allowed!
3257
+
3189
3258
  const bExpanded = oChildContext.isExpanded();
3190
3259
  if (bExpanded) {
3191
3260
  this.collapse(oChildContext, /*bSilent*/true);
3192
3261
  }
3193
3262
 
3194
3263
  const sChildPath = oChildContext.getCanonicalPath().slice(1);
3195
- const sParentPath = oParentContext.getCanonicalPath().slice(1); // before #lockGroup!
3264
+ const sParentPath = oParentContext?.getCanonicalPath().slice(1); // before #lockGroup!
3196
3265
  const oGroupLock = this.lockGroup(this.getUpdateGroupId(), true, true);
3197
3266
 
3198
3267
  return this.oCache.move(oGroupLock, sChildPath, sParentPath).then((iCount) => {
@@ -3202,6 +3271,7 @@ sap.ui.define([
3202
3271
  }
3203
3272
 
3204
3273
  const iChildIndex = this.aContexts.indexOf(oChildContext);
3274
+ // Note: w/o oParentContext, iParentIndex === -1 and iParentIndex + 1 === 0 :-)
3205
3275
  const iParentIndex = this.aContexts.indexOf(oParentContext); // Note: !== iChildIndex
3206
3276
  if (iChildIndex < iParentIndex) {
3207
3277
  this.aContexts.splice(iParentIndex + 1, 0, oChildContext);
@@ -3212,9 +3282,11 @@ sap.ui.define([
3212
3282
  this.aContexts.splice(iParentIndex + 1, 0, oChildContext);
3213
3283
  setIndices(iParentIndex + 1, iChildIndex);
3214
3284
  } // else: iChildIndex === iParentIndex + 1 => nothing to do
3215
- if (!oChildContext.created()) {
3285
+
3286
+ if (!oChildContext.created() && !(oAggregation.expandTo > 1)) {
3216
3287
  oChildContext.setCreatedPersisted();
3217
3288
  }
3289
+
3218
3290
  if (bExpanded) {
3219
3291
  this.expand(oChildContext).unwrap(); // guaranteed to be sync! incl. _fireChange
3220
3292
  } else {
@@ -3721,8 +3793,9 @@ sap.ui.define([
3721
3793
 
3722
3794
  iStart = iStart || 0;
3723
3795
  iLength = iLength || this.oModel.iSizeLimit;
3796
+ const oGroupLock = sGroupId && this.lockGroup(sGroupId, true);
3724
3797
  return Promise.resolve(
3725
- this.fetchContexts(iStart, iLength, 0, this.lockGroup(sGroupId, true))
3798
+ this.fetchContexts(iStart, iLength, 0, oGroupLock)
3726
3799
  ).then(function (bChanged) {
3727
3800
  if (bChanged) {
3728
3801
  that._fireChange({reason : ChangeReason.Change});
@@ -3739,9 +3812,10 @@ sap.ui.define([
3739
3812
  };
3740
3813
 
3741
3814
  /**
3742
- * Returns a URL by which the complete content of the list can be downloaded in JSON format. The
3743
- * request delivers all entities considering the binding's query options (such as filters or
3744
- * sorters).
3815
+ * Resolves with a URL by which the complete content of the list can be downloaded in JSON
3816
+ * format. The request delivers all entities considering the binding's query options (such as
3817
+ * filters or sorters). Resolves with <code>null</code> if the binding's filter is
3818
+ * {@link sap.ui.filter.Filter.NONE}.
3745
3819
  *
3746
3820
  * The returned URL does not specify <code>$skip</code> and <code>$top</code> and leaves it up
3747
3821
  * to the server how many rows it delivers. Many servers tend to choose a small limit without
@@ -3751,8 +3825,8 @@ sap.ui.define([
3751
3825
  * Additionally, you must be aware of server-driven paging and be ready to send a follow-up
3752
3826
  * request if the response contains <code>@odata.nextlink</code>.
3753
3827
  *
3754
- * @returns {Promise<string>}
3755
- * A promise that is resolved with the download URL
3828
+ * @returns {Promise<string|null>}
3829
+ * A promise that is resolved with the download URL or <code>null</code>
3756
3830
  * @throws {Error}
3757
3831
  * If the binding is unresolved
3758
3832
  *
@@ -3772,6 +3846,9 @@ sap.ui.define([
3772
3846
  * binding in its constructor or in its {@link #filter} method; add filters which you want to
3773
3847
  * keep with the "and" conjunction to the resulting filter before calling {@link #filter}.
3774
3848
  *
3849
+ * If there are only messages for transient entries, the method returns
3850
+ * {@link sap.ui.model.Filter.NONE}. Take care not to combine this filter with other filters.
3851
+ *
3775
3852
  * @param {function(sap.ui.core.message.Message):boolean} [fnFilter]
3776
3853
  * A callback function to filter only relevant messages. The callback returns whether the
3777
3854
  * given {@link sap.ui.core.message.Message} is considered. If no callback function is given,
@@ -3803,7 +3880,8 @@ sap.ui.define([
3803
3880
  sMetaPath = _Helper.getMetaPath(sResolvedPath);
3804
3881
  return oMetaModel.requestObject(sMetaPath + "/").then(function (oEntityType) {
3805
3882
  var aFilters,
3806
- mPredicates = {};
3883
+ mPredicates = {},
3884
+ bTransientMatched = false;
3807
3885
 
3808
3886
  that.oModel.getMessagesByPath(sResolvedPath, true).filter(function (oMessage) {
3809
3887
  return !fnFilter || fnFilter(oMessage);
@@ -3811,8 +3889,12 @@ sap.ui.define([
3811
3889
  oMessage.getTargets().forEach(function (sTarget) {
3812
3890
  var sPredicate = sTarget.slice(sResolvedPath.length).split("/")[0];
3813
3891
 
3814
- if (sPredicate && !sPredicate.startsWith("($uid=")) {
3815
- mPredicates[sPredicate] = true;
3892
+ if (sPredicate) {
3893
+ if (sPredicate.startsWith("($uid=")) {
3894
+ bTransientMatched = true;
3895
+ } else {
3896
+ mPredicates[sPredicate] = true;
3897
+ }
3816
3898
  }
3817
3899
  });
3818
3900
  });
@@ -3823,57 +3905,13 @@ sap.ui.define([
3823
3905
  });
3824
3906
 
3825
3907
  if (aFilters.length === 0) {
3826
- return null;
3908
+ return bTransientMatched ? Filter.NONE : null;
3827
3909
  }
3828
3910
 
3829
3911
  return aFilters.length === 1 ? aFilters[0] : new Filter({filters : aFilters});
3830
3912
  });
3831
3913
  };
3832
3914
 
3833
- /**
3834
- * Requests the parent node of a given child node (in case of a recursive hierarchy, see
3835
- * {@link sap.ui.model.odata.v4.ODataListBinding#setAggregation}, where
3836
- * <code>oAggregation.expandTo</code> must be equal to one).
3837
- *
3838
- * @param {sap.ui.model.odata.v4.Context} oNode
3839
- * Some node which could have a parent
3840
- * @returns {Promise<sap.ui.model.odata.v4.Context|null>} A promise which:
3841
- * <ul>
3842
- * <li> Resolves if successful with either the parent node or <code>null</code> for a root
3843
- * node that has no parent</li>
3844
- * <li> Rejects with an <code>Error</code> instance otherwise</li>
3845
- * </ul>
3846
- * @throws {Error} If
3847
- * <ul>
3848
- * <li> the given node is not part of a recursive hierarchy,
3849
- * <li> <code>oAggregation.expandTo</code> is greater than one.
3850
- * </ul>
3851
- *
3852
- * @private
3853
- * @see #getParent
3854
- */
3855
- ODataListBinding.prototype.requestParent = function (oNode) {
3856
- const oAggregation = this.mParameters.$$aggregation;
3857
-
3858
- if (!oAggregation || !oAggregation.hierarchyQualifier) {
3859
- throw new Error("Missing recursive hierarchy");
3860
- }
3861
- if (oAggregation.expandTo > 1) {
3862
- throw new Error("Unsupported $$aggregation.expandTo: " + oAggregation.expandTo);
3863
- }
3864
- if (this.aContexts[oNode.iIndex] !== oNode) {
3865
- throw new Error("Not currently part of a recursive hierarchy: " + oNode);
3866
- }
3867
-
3868
- const iParentIndex = this.oCache.getParentIndex(oNode.iIndex);
3869
- if (iParentIndex < 0) {
3870
- return Promise.resolve(null);
3871
- }
3872
- return this.requestContexts(iParentIndex, 1).then(function (aResult) {
3873
- return aResult[0];
3874
- });
3875
- };
3876
-
3877
3915
  /**
3878
3916
  * @override
3879
3917
  * @see sap.ui.model.odata.v4.ODataParentBinding#requestSideEffects
@@ -4178,7 +4216,8 @@ sap.ui.define([
4178
4216
  * available for read-only hierarchies since 1.117.0), supported only if a
4179
4217
  * <code>hierarchyQualifier</code> is given. Root nodes are on the first level. By default,
4180
4218
  * only root nodes are available; they are not yet expanded. Since 1.120.0,
4181
- * <code>Number.MAX_SAFE_INTEGER</code> can be used to expand all levels.
4219
+ * <code>expandTo >= Number.MAX_SAFE_INTEGER</code> can be used to expand all levels
4220
+ * (<code>1E16</code> is recommended inside XML views for simplicity).
4182
4221
  * @param {boolean} [oAggregation.grandTotalAtBottomOnly]
4183
4222
  * Tells whether the grand totals for aggregatable properties are displayed at the bottom only
4184
4223
  * (since 1.86.0); <code>true</code> for bottom only, <code>false</code> for top and bottom,
@@ -4240,6 +4279,7 @@ sap.ui.define([
4240
4279
  * <code>autoExpandSelect</code> parameter,
4241
4280
  * <li> the binding is {@link #isTransient transient} (part of a
4242
4281
  * {@link sap.ui.model.odata.v4.ODataListBinding#create deep create}),
4282
+ * <li> the binding has {@link sap.ui.model.Filter.NONE}
4243
4283
  * </ul>
4244
4284
  *
4245
4285
  * @example <caption>First group level is product category including subtotals for the net
@@ -4282,6 +4322,9 @@ sap.ui.define([
4282
4322
  }
4283
4323
 
4284
4324
  this.checkTransient();
4325
+ if (this.hasFilterNone()) {
4326
+ throw new Error("Cannot combine Filter.NONE with $$aggregation");
4327
+ }
4285
4328
  if (this.hasPendingChanges()) {
4286
4329
  throw new Error("Cannot set $$aggregation due to pending changes");
4287
4330
  }