@openui5/sap.ui.core 1.119.1 → 1.120.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 (968) hide show
  1. package/THIRDPARTY.txt +6 -6
  2. package/package.json +1 -1
  3. package/src/jquery.sap.global.js +40 -111
  4. package/src/jquery.sap.properties.js +7 -1
  5. package/src/jquery.sap.resources.js +1 -1
  6. package/src/jquery.sap.script.js +5 -3
  7. package/src/jquery.sap.storage.js +6 -3
  8. package/src/sap/base/Event.js +32 -78
  9. package/src/sap/base/Eventing.js +114 -271
  10. package/src/sap/base/Log.js +21 -1
  11. package/src/sap/base/config.js +14 -9
  12. package/src/sap/base/i18n/Formatting.js +400 -256
  13. package/src/sap/base/i18n/LanguageTag.js +64 -66
  14. package/src/sap/base/i18n/Localization.js +125 -87
  15. package/src/sap/base/i18n/ResourceBundle.js +1 -1
  16. package/src/sap/base/i18n/date/CalendarType.js +2 -2
  17. package/src/sap/base/i18n/date/CalendarWeekNumbering.js +2 -2
  18. package/src/sap/base/i18n/date/TimezoneUtils.js +43 -6
  19. package/src/sap/base/util/LoaderExtensions.js +8 -2
  20. package/src/sap/base/util/mixedFetch.js +1 -0
  21. package/src/sap/base/util/resolveReference.js +31 -13
  22. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  23. package/src/sap/base/util/restricted/_castArray.js +1 -1
  24. package/src/sap/base/util/restricted/_compact.js +1 -1
  25. package/src/sap/base/util/restricted/_curry.js +1 -1
  26. package/src/sap/base/util/restricted/_debounce.js +1 -1
  27. package/src/sap/base/util/restricted/_difference.js +1 -1
  28. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  29. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  30. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  31. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  32. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  33. package/src/sap/base/util/restricted/_flatten.js +1 -1
  34. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  35. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  36. package/src/sap/base/util/restricted/_intersection.js +1 -1
  37. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  38. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  39. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  40. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  41. package/src/sap/base/util/restricted/_isNil.js +1 -1
  42. package/src/sap/base/util/restricted/_max.js +1 -1
  43. package/src/sap/base/util/restricted/_merge.js +1 -1
  44. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  45. package/src/sap/base/util/restricted/_min.js +1 -1
  46. package/src/sap/base/util/restricted/_omit.js +1 -1
  47. package/src/sap/base/util/restricted/_pick.js +1 -1
  48. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  49. package/src/sap/base/util/restricted/_throttle.js +1 -1
  50. package/src/sap/base/util/restricted/_toArray.js +1 -1
  51. package/src/sap/base/util/restricted/_union.js +1 -1
  52. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  53. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  54. package/src/sap/base/util/restricted/_uniq.js +1 -1
  55. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  56. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  57. package/src/sap/base/util/restricted/_without.js +1 -1
  58. package/src/sap/base/util/restricted/_xor.js +1 -1
  59. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  60. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  61. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  62. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  63. package/src/sap/base/util/syncFetch.js +1 -0
  64. package/src/sap/ui/Device.js +3 -3
  65. package/src/sap/ui/Global.js +6 -7
  66. package/src/sap/ui/base/BindingInfo.js +3 -3
  67. package/src/sap/ui/base/BindingParser.js +5 -2
  68. package/src/sap/ui/base/DataType.js +57 -1
  69. package/src/sap/ui/base/DesignTime.js +69 -0
  70. package/src/sap/ui/base/Event.js +2 -2
  71. package/src/sap/ui/base/EventProvider.js +1 -1
  72. package/src/sap/ui/base/ExpressionParser.js +25 -4
  73. package/src/sap/ui/base/Interface.js +1 -1
  74. package/src/sap/ui/base/ManagedObject.js +102 -85
  75. package/src/sap/ui/base/ManagedObjectMetadata.js +53 -31
  76. package/src/sap/ui/base/ManagedObjectObserver.js +1 -0
  77. package/src/sap/ui/base/Metadata.js +3 -3
  78. package/src/sap/ui/base/Object.js +19 -1
  79. package/src/sap/ui/base/ObjectPool.js +1 -1
  80. package/src/sap/ui/core/.library +3 -3
  81. package/src/sap/ui/core/AnimationMode.js +2 -2
  82. package/src/sap/ui/core/AppCacheBuster.js +30 -18
  83. package/src/sap/ui/core/BusyIndicator.js +1 -1
  84. package/src/sap/ui/core/CalendarType.js +6 -0
  85. package/src/sap/ui/core/Component.js +175 -86
  86. package/src/sap/ui/core/ComponentContainer.js +6 -5
  87. package/src/sap/ui/core/ComponentMetadata.js +3 -4
  88. package/src/sap/ui/core/ComponentSupport.js +1 -1
  89. package/src/sap/ui/core/Configuration.js +395 -709
  90. package/src/sap/ui/core/Control.js +1 -1
  91. package/src/sap/ui/core/ControlBehavior.js +37 -28
  92. package/src/sap/ui/core/Core.js +338 -216
  93. package/src/sap/ui/core/CustomData.js +1 -1
  94. package/src/sap/ui/core/DeclarativeSupport.js +3 -1
  95. package/src/sap/ui/core/Element.js +24 -10
  96. package/src/sap/ui/core/ElementMetadata.js +1 -1
  97. package/src/sap/ui/core/EnabledPropagator.js +3 -2
  98. package/src/sap/ui/core/EventBus.js +1 -1
  99. package/src/sap/ui/core/Fragment.js +3 -3
  100. package/src/sap/ui/core/HTML.js +1 -1
  101. package/src/sap/ui/core/History.js +1 -1
  102. package/src/sap/ui/core/Icon.js +1 -1
  103. package/src/sap/ui/core/IndicationColorSupport.js +13 -1
  104. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  105. package/src/sap/ui/core/InvisibleMessage.js +2 -3
  106. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  107. package/src/sap/ui/core/InvisibleText.js +17 -1
  108. package/src/sap/ui/core/Item.js +1 -1
  109. package/src/sap/ui/core/LabelEnablement.js +8 -1
  110. package/src/sap/ui/core/LayoutData.js +1 -1
  111. package/src/sap/ui/core/Lib.js +253 -57
  112. package/src/sap/ui/core/ListItem.js +1 -1
  113. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  114. package/src/sap/ui/core/Locale.js +1 -1
  115. package/src/sap/ui/core/LocaleData.js +118 -32
  116. package/src/sap/ui/core/Manifest.js +4 -2
  117. package/src/sap/ui/core/Message.js +1 -1
  118. package/src/sap/ui/core/Placeholder.js +18 -0
  119. package/src/sap/ui/core/Popup.js +5 -0
  120. package/src/sap/ui/core/RenderManager.js +21 -17
  121. package/src/sap/ui/core/Renderer.js +1 -1
  122. package/src/sap/ui/core/Rendering.js +51 -47
  123. package/src/sap/ui/core/ResizeHandler.js +2 -2
  124. package/src/sap/ui/core/ScrollBar.js +1 -1
  125. package/src/sap/ui/core/SeparatorItem.js +1 -1
  126. package/src/sap/ui/core/Shortcut.js +5 -3
  127. package/src/sap/ui/core/Supportability.js +146 -0
  128. package/src/sap/ui/core/Theming.js +130 -88
  129. package/src/sap/ui/core/Title.js +1 -1
  130. package/src/sap/ui/core/TooltipBase.js +4 -3
  131. package/src/sap/ui/core/UIArea.js +5 -4
  132. package/src/sap/ui/core/UIComponent.js +38 -12
  133. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  134. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  135. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  136. package/src/sap/ui/core/XMLComposite.js +1 -1
  137. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  138. package/src/sap/ui/core/XMLTemplateProcessor.js +3 -3
  139. package/src/sap/ui/core/_IconRegistry.js +13 -6
  140. package/src/sap/ui/core/cldr/ar.json +143 -137
  141. package/src/sap/ui/core/cldr/ar_EG.json +143 -137
  142. package/src/sap/ui/core/cldr/ar_SA.json +143 -137
  143. package/src/sap/ui/core/cldr/bg.json +423 -423
  144. package/src/sap/ui/core/cldr/ca.json +541 -494
  145. package/src/sap/ui/core/cldr/cs.json +475 -364
  146. package/src/sap/ui/core/cldr/cy.json +656 -477
  147. package/src/sap/ui/core/cldr/da.json +334 -275
  148. package/src/sap/ui/core/cldr/de.json +388 -291
  149. package/src/sap/ui/core/cldr/de_AT.json +388 -291
  150. package/src/sap/ui/core/cldr/de_CH.json +394 -297
  151. package/src/sap/ui/core/cldr/el.json +169 -166
  152. package/src/sap/ui/core/cldr/el_CY.json +169 -166
  153. package/src/sap/ui/core/cldr/en.json +558 -521
  154. package/src/sap/ui/core/cldr/en_AU.json +558 -520
  155. package/src/sap/ui/core/cldr/en_GB.json +476 -439
  156. package/src/sap/ui/core/cldr/en_HK.json +520 -482
  157. package/src/sap/ui/core/cldr/en_IE.json +486 -448
  158. package/src/sap/ui/core/cldr/en_IN.json +466 -428
  159. package/src/sap/ui/core/cldr/en_NZ.json +506 -468
  160. package/src/sap/ui/core/cldr/en_PG.json +506 -468
  161. package/src/sap/ui/core/cldr/en_SG.json +506 -468
  162. package/src/sap/ui/core/cldr/en_ZA.json +486 -448
  163. package/src/sap/ui/core/cldr/es.json +473 -468
  164. package/src/sap/ui/core/cldr/es_AR.json +445 -440
  165. package/src/sap/ui/core/cldr/es_BO.json +479 -474
  166. package/src/sap/ui/core/cldr/es_CL.json +469 -464
  167. package/src/sap/ui/core/cldr/es_CO.json +387 -381
  168. package/src/sap/ui/core/cldr/es_MX.json +502 -497
  169. package/src/sap/ui/core/cldr/es_PE.json +455 -450
  170. package/src/sap/ui/core/cldr/es_UY.json +479 -474
  171. package/src/sap/ui/core/cldr/es_VE.json +499 -494
  172. package/src/sap/ui/core/cldr/et.json +378 -320
  173. package/src/sap/ui/core/cldr/fa.json +104 -104
  174. package/src/sap/ui/core/cldr/fi.json +401 -315
  175. package/src/sap/ui/core/cldr/fr.json +391 -385
  176. package/src/sap/ui/core/cldr/fr_BE.json +391 -385
  177. package/src/sap/ui/core/cldr/fr_CA.json +499 -493
  178. package/src/sap/ui/core/cldr/fr_CH.json +334 -328
  179. package/src/sap/ui/core/cldr/fr_LU.json +391 -385
  180. package/src/sap/ui/core/cldr/he.json +291 -159
  181. package/src/sap/ui/core/cldr/hi.json +157 -128
  182. package/src/sap/ui/core/cldr/hr.json +514 -461
  183. package/src/sap/ui/core/cldr/hu.json +287 -257
  184. package/src/sap/ui/core/cldr/id.json +463 -416
  185. package/src/sap/ui/core/cldr/it.json +468 -413
  186. package/src/sap/ui/core/cldr/it_CH.json +468 -413
  187. package/src/sap/ui/core/cldr/ja.json +98 -61
  188. package/src/sap/ui/core/cldr/kk.json +631 -571
  189. package/src/sap/ui/core/cldr/ko.json +79 -71
  190. package/src/sap/ui/core/cldr/lt.json +361 -270
  191. package/src/sap/ui/core/cldr/lv.json +234 -242
  192. package/src/sap/ui/core/cldr/ms.json +463 -408
  193. package/src/sap/ui/core/cldr/nb.json +176 -143
  194. package/src/sap/ui/core/cldr/nl.json +463 -393
  195. package/src/sap/ui/core/cldr/nl_BE.json +463 -393
  196. package/src/sap/ui/core/cldr/pl.json +633 -344
  197. package/src/sap/ui/core/cldr/pt.json +447 -336
  198. package/src/sap/ui/core/cldr/pt_PT.json +488 -449
  199. package/src/sap/ui/core/cldr/ro.json +477 -383
  200. package/src/sap/ui/core/cldr/ru.json +367 -332
  201. package/src/sap/ui/core/cldr/ru_UA.json +361 -326
  202. package/src/sap/ui/core/cldr/sk.json +502 -537
  203. package/src/sap/ui/core/cldr/sl.json +168 -161
  204. package/src/sap/ui/core/cldr/sr.json +276 -225
  205. package/src/sap/ui/core/cldr/sr_Latn.json +972 -907
  206. package/src/sap/ui/core/cldr/sv.json +420 -346
  207. package/src/sap/ui/core/cldr/th.json +117 -94
  208. package/src/sap/ui/core/cldr/tr.json +413 -359
  209. package/src/sap/ui/core/cldr/uk.json +395 -368
  210. package/src/sap/ui/core/cldr/vi.json +392 -379
  211. package/src/sap/ui/core/cldr/zh_CN.json +91 -33
  212. package/src/sap/ui/core/cldr/zh_HK.json +90 -32
  213. package/src/sap/ui/core/cldr/zh_SG.json +90 -32
  214. package/src/sap/ui/core/cldr/zh_TW.json +75 -51
  215. package/src/sap/ui/core/date/CalendarWeekNumbering.js +6 -0
  216. package/src/sap/ui/core/date/Islamic.js +4 -4
  217. package/src/sap/ui/core/date/UI5Date.js +1 -1
  218. package/src/sap/ui/core/date/_Calendars.js +5 -2
  219. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  220. package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
  221. package/src/sap/ui/core/dnd/DragAndDrop.js +3 -2
  222. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  223. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  224. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  225. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  226. package/src/sap/ui/core/format/DateFormat.js +33 -21
  227. package/src/sap/ui/core/format/NumberFormat.js +3 -2
  228. package/src/sap/ui/core/format/TimezoneUtil.js +1 -1
  229. package/src/sap/ui/core/getCompatibilityVersion.js +2 -2
  230. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  231. package/src/sap/ui/core/library.js +128 -8
  232. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  233. package/src/sap/ui/core/message/Message.js +2 -2
  234. package/src/sap/ui/core/message/MessageManager.js +1 -1
  235. package/src/sap/ui/core/message/MessageParser.js +1 -1
  236. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  237. package/src/sap/ui/core/message/MessageType.js +2 -1
  238. package/src/sap/ui/core/messagebundle.properties +24 -0
  239. package/src/sap/ui/core/messagebundle_ar.properties +15 -3
  240. package/src/sap/ui/core/messagebundle_bg.properties +14 -2
  241. package/src/sap/ui/core/messagebundle_ca.properties +13 -1
  242. package/src/sap/ui/core/messagebundle_cs.properties +15 -3
  243. package/src/sap/ui/core/messagebundle_cy.properties +16 -4
  244. package/src/sap/ui/core/messagebundle_da.properties +15 -3
  245. package/src/sap/ui/core/messagebundle_de.properties +15 -3
  246. package/src/sap/ui/core/messagebundle_el.properties +16 -4
  247. package/src/sap/ui/core/messagebundle_en.properties +12 -0
  248. package/src/sap/ui/core/messagebundle_en_GB.properties +16 -4
  249. package/src/sap/ui/core/messagebundle_es.properties +15 -3
  250. package/src/sap/ui/core/messagebundle_es_MX.properties +15 -3
  251. package/src/sap/ui/core/messagebundle_et.properties +15 -3
  252. package/src/sap/ui/core/messagebundle_fi.properties +15 -3
  253. package/src/sap/ui/core/messagebundle_fr.properties +15 -3
  254. package/src/sap/ui/core/messagebundle_fr_CA.properties +14 -2
  255. package/src/sap/ui/core/messagebundle_hi.properties +16 -4
  256. package/src/sap/ui/core/messagebundle_hr.properties +14 -2
  257. package/src/sap/ui/core/messagebundle_hu.properties +16 -4
  258. package/src/sap/ui/core/messagebundle_id.properties +15 -3
  259. package/src/sap/ui/core/messagebundle_it.properties +17 -5
  260. package/src/sap/ui/core/messagebundle_iw.properties +15 -3
  261. package/src/sap/ui/core/messagebundle_ja.properties +25 -13
  262. package/src/sap/ui/core/messagebundle_kk.properties +15 -3
  263. package/src/sap/ui/core/messagebundle_ko.properties +14 -2
  264. package/src/sap/ui/core/messagebundle_lt.properties +15 -3
  265. package/src/sap/ui/core/messagebundle_lv.properties +15 -3
  266. package/src/sap/ui/core/messagebundle_mk.properties +352 -0
  267. package/src/sap/ui/core/messagebundle_ms.properties +15 -3
  268. package/src/sap/ui/core/messagebundle_nl.properties +15 -3
  269. package/src/sap/ui/core/messagebundle_no.properties +14 -2
  270. package/src/sap/ui/core/messagebundle_pl.properties +15 -3
  271. package/src/sap/ui/core/messagebundle_pt.properties +15 -3
  272. package/src/sap/ui/core/messagebundle_pt_PT.properties +14 -2
  273. package/src/sap/ui/core/messagebundle_ro.properties +15 -3
  274. package/src/sap/ui/core/messagebundle_ru.properties +15 -3
  275. package/src/sap/ui/core/messagebundle_sh.properties +43 -31
  276. package/src/sap/ui/core/messagebundle_sk.properties +16 -4
  277. package/src/sap/ui/core/messagebundle_sl.properties +15 -3
  278. package/src/sap/ui/core/messagebundle_sv.properties +22 -10
  279. package/src/sap/ui/core/messagebundle_th.properties +15 -3
  280. package/src/sap/ui/core/messagebundle_tr.properties +15 -3
  281. package/src/sap/ui/core/messagebundle_uk.properties +18 -6
  282. package/src/sap/ui/core/messagebundle_vi.properties +18 -6
  283. package/src/sap/ui/core/messagebundle_zh_CN.properties +15 -3
  284. package/src/sap/ui/core/messagebundle_zh_TW.properties +15 -3
  285. package/src/sap/ui/core/mvc/Controller.js +22 -16
  286. package/src/sap/ui/core/mvc/ControllerExtensionProvider.js +1 -1
  287. package/src/sap/ui/core/mvc/EventHandlerResolver.js +5 -15
  288. package/src/sap/ui/core/mvc/HTMLView.js +2 -2
  289. package/src/sap/ui/core/mvc/JSONView.js +4 -1
  290. package/src/sap/ui/core/mvc/JSONViewRenderer.js +1 -0
  291. package/src/sap/ui/core/mvc/JSView.js +1 -1
  292. package/src/sap/ui/core/mvc/OverrideExecution.js +4 -4
  293. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  294. package/src/sap/ui/core/mvc/View.js +25 -15
  295. package/src/sap/ui/core/mvc/ViewType.js +2 -0
  296. package/src/sap/ui/core/mvc/XMLView.js +1 -1
  297. package/src/sap/ui/core/plugin/DeclarativeSupport.js +2 -1
  298. package/src/sap/ui/core/plugin/LessSupport.js +3 -1
  299. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  300. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  301. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  302. package/src/sap/ui/core/routing/Router.js +2 -4
  303. package/src/sap/ui/core/routing/Target.js +1 -3
  304. package/src/sap/ui/core/routing/Targets.js +2 -3
  305. package/src/sap/ui/core/routing/Views.js +2 -3
  306. package/src/sap/ui/core/routing/async/Target.js +1 -1
  307. package/src/sap/ui/core/rules/Config.support.js +11 -17
  308. package/src/sap/ui/core/search/OpenSearchProvider.js +2 -1
  309. package/src/sap/ui/core/search/SearchProvider.js +2 -1
  310. package/src/sap/ui/core/service/Service.js +1 -1
  311. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  312. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  313. package/src/sap/ui/core/support/Hotkeys.js +5 -3
  314. package/src/sap/ui/core/support/Plugin.js +1 -1
  315. package/src/sap/ui/core/support/RuleEngineOpaExtension.js +1 -3
  316. package/src/sap/ui/core/support/Support.js +3 -5
  317. package/src/sap/ui/core/support/ToolsAPI.js +15 -11
  318. package/src/sap/ui/core/support/plugins/ControlTree.js +2 -2
  319. package/src/sap/ui/core/support/plugins/Interaction.js +4 -4
  320. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  321. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  322. package/src/sap/ui/core/support/plugins/Selector.js +7 -5
  323. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  324. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  325. package/src/sap/ui/core/support/plugins/ViewInfo.js +1 -1
  326. package/src/sap/ui/core/support/techinfo/TechnicalInfo.js +3 -1
  327. package/src/sap/ui/core/syncStyleClass.js +2 -2
  328. package/src/sap/ui/core/themes/base/fonts/SAP-icons.ttf +0 -0
  329. package/src/sap/ui/core/themes/base/fonts/SAP-icons.woff2 +0 -0
  330. package/src/sap/ui/core/themes/base/global.less +9 -9
  331. package/src/sap/ui/core/theming/Parameters.js +18 -19
  332. package/src/sap/ui/core/theming/ThemeManager.js +23 -4
  333. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  334. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  335. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  336. package/src/sap/ui/core/tmpl/Template.js +1 -1
  337. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  338. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  339. package/src/sap/ui/core/util/Export.js +1 -1
  340. package/src/sap/ui/core/util/ExportCell.js +1 -1
  341. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  342. package/src/sap/ui/core/util/ExportRow.js +1 -1
  343. package/src/sap/ui/core/util/ExportType.js +1 -1
  344. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  345. package/src/sap/ui/core/util/File.js +1 -1
  346. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  347. package/src/sap/ui/core/util/MockServer.js +1 -1
  348. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  349. package/src/sap/ui/core/util/XMLPreprocessor.js +3 -0
  350. package/src/sap/ui/core/util/_LocalizationHelper.js +122 -0
  351. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  352. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  353. package/src/sap/ui/core/util/serializer/ViewSerializer.js +4 -4
  354. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  355. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  356. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  357. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  358. package/src/sap/ui/core/webc/WebComponent.js +1 -1
  359. package/src/sap/ui/core/webc/WebComponentMetadata.js +1 -1
  360. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  361. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  362. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  363. package/src/sap/ui/debug/ControlTree.js +1 -1
  364. package/src/sap/ui/debug/DebugEnv.js +29 -7
  365. package/src/sap/ui/debug/PropertyList.js +1 -1
  366. package/src/sap/ui/model/ClientListBinding.js +9 -4
  367. package/src/sap/ui/model/ClientModel.js +1 -1
  368. package/src/sap/ui/model/ClientTreeBinding.js +9 -4
  369. package/src/sap/ui/model/CompositeDataState.js +1 -1
  370. package/src/sap/ui/model/CompositeType.js +1 -1
  371. package/src/sap/ui/model/DataState.js +2 -2
  372. package/src/sap/ui/model/Filter.js +39 -1
  373. package/src/sap/ui/model/FilterProcessor.js +15 -5
  374. package/src/sap/ui/model/ListBinding.js +5 -0
  375. package/src/sap/ui/model/ManagedObjectBindingSupport.js +4 -4
  376. package/src/sap/ui/model/MetaModel.js +1 -1
  377. package/src/sap/ui/model/Model.js +14 -8
  378. package/src/sap/ui/model/SelectionModel.js +1 -1
  379. package/src/sap/ui/model/SimpleType.js +1 -1
  380. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  381. package/src/sap/ui/model/TreeBinding.js +3 -0
  382. package/src/sap/ui/model/Type.js +1 -1
  383. package/src/sap/ui/model/analytics/AnalyticalBinding.js +3 -1
  384. package/src/sap/ui/model/json/JSONListBinding.js +3 -1
  385. package/src/sap/ui/model/json/JSONModel.js +1 -1
  386. package/src/sap/ui/model/json/JSONTreeBinding.js +3 -2
  387. package/src/sap/ui/model/message/MessageListBinding.js +3 -0
  388. package/src/sap/ui/model/message/MessageModel.js +1 -1
  389. package/src/sap/ui/model/odata/AnnotationHelper.js +9 -3
  390. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  391. package/src/sap/ui/model/odata/ODataListBinding.js +8 -2
  392. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  393. package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
  394. package/src/sap/ui/model/odata/ODataMetadata.js +1 -1
  395. package/src/sap/ui/model/odata/ODataModel.js +9 -5
  396. package/src/sap/ui/model/odata/ODataPropertyBinding.js +1 -2
  397. package/src/sap/ui/model/odata/ODataTreeBinding.js +2 -0
  398. package/src/sap/ui/model/odata/ODataTreeBindingFlat.js +9 -14
  399. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  400. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  401. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  402. package/src/sap/ui/model/odata/type/Date.js +1 -1
  403. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  404. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  405. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  406. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +1 -1
  407. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  408. package/src/sap/ui/model/odata/type/Double.js +1 -1
  409. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  410. package/src/sap/ui/model/odata/type/Int.js +1 -1
  411. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  412. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  413. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  414. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  415. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  416. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  417. package/src/sap/ui/model/odata/type/Single.js +1 -1
  418. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  419. package/src/sap/ui/model/odata/type/String.js +1 -1
  420. package/src/sap/ui/model/odata/type/Time.js +1 -1
  421. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  422. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  423. package/src/sap/ui/model/odata/v2/Context.js +1 -1
  424. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  425. package/src/sap/ui/model/odata/v2/ODataListBinding.js +40 -15
  426. package/src/sap/ui/model/odata/v2/ODataModel.js +26 -62
  427. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +38 -4
  428. package/src/sap/ui/model/odata/v4/Context.js +81 -7
  429. package/src/sap/ui/model/odata/v4/ODataBinding.js +3 -0
  430. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +1 -1
  431. package/src/sap/ui/model/odata/v4/ODataListBinding.js +217 -75
  432. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +2 -2
  433. package/src/sap/ui/model/odata/v4/ODataModel.js +6 -6
  434. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +1 -1
  435. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +406 -199
  436. package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +12 -7
  437. package/src/sap/ui/model/odata/v4/lib/_Cache.js +53 -30
  438. package/src/sap/ui/model/odata/v4/lib/_Helper.js +6 -4
  439. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +6 -6
  440. package/src/sap/ui/model/resource/ResourceModel.js +5 -6
  441. package/src/sap/ui/model/type/Boolean.js +1 -1
  442. package/src/sap/ui/model/type/Currency.js +1 -1
  443. package/src/sap/ui/model/type/Date.js +1 -1
  444. package/src/sap/ui/model/type/DateInterval.js +1 -1
  445. package/src/sap/ui/model/type/DateTime.js +1 -1
  446. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  447. package/src/sap/ui/model/type/FileSize.js +1 -1
  448. package/src/sap/ui/model/type/Float.js +1 -1
  449. package/src/sap/ui/model/type/Integer.js +1 -1
  450. package/src/sap/ui/model/type/String.js +1 -1
  451. package/src/sap/ui/model/type/Time.js +1 -1
  452. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  453. package/src/sap/ui/model/type/Unit.js +1 -1
  454. package/src/sap/ui/model/xml/XMLListBinding.js +3 -0
  455. package/src/sap/ui/model/xml/XMLModel.js +1 -1
  456. package/src/sap/ui/model/xml/XMLTreeBinding.js +3 -0
  457. package/src/sap/ui/performance/BeaconRequest.js +2 -2
  458. package/src/sap/ui/performance/trace/Interaction.js +20 -16
  459. package/src/sap/ui/qunit/QUnitUtils.js +64 -45
  460. package/src/sap/ui/qunit/qunit-coverage.js +6 -0
  461. package/src/sap/ui/qunit/utils/ControlIterator.js +31 -1
  462. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  463. package/src/sap/ui/security/Security.js +128 -0
  464. package/src/sap/ui/test/BlanketReporter.js +2 -3
  465. package/src/sap/ui/test/BlanketReporterUI.view.xml +1 -1
  466. package/src/sap/ui/test/BranchTracking.js +2 -3
  467. package/src/sap/ui/test/ModuleTracking.js +48 -20
  468. package/src/sap/ui/test/OpaExtension.js +3 -3
  469. package/src/sap/ui/test/OpaPlugin.js +16 -6
  470. package/src/sap/ui/test/TestUtils.js +7 -4
  471. package/src/sap/ui/test/_BrowserLogCollector.js +1 -0
  472. package/src/sap/ui/test/_ControlFinder.js +3 -2
  473. package/src/sap/ui/test/_LogCollector.js +1 -0
  474. package/src/sap/ui/test/_UsageReport.js +115 -114
  475. package/src/sap/ui/test/actions/EnterText.js +24 -2
  476. package/src/sap/ui/test/autowaiter/WaiterBase.js +1 -0
  477. package/src/sap/ui/test/autowaiter/_moduleWaiter.js +1 -2
  478. package/src/sap/ui/test/autowaiter/_timeoutWaiter.js +1 -1
  479. package/src/sap/ui/test/generic/GenericTestCollection.js +5 -0
  480. package/src/sap/ui/test/generic/TestBase.js +1 -1
  481. package/src/sap/ui/test/generic/Utils.js +1 -1
  482. package/src/sap/ui/test/matchers/LabelFor.js +2 -12
  483. package/src/sap/ui/test/matchers/Matcher.js +1 -1
  484. package/src/sap/ui/test/pipelines/PipelineFactory.js +1 -0
  485. package/src/sap/ui/test/selectors/_Selector.js +1 -1
  486. package/src/sap/ui/util/Storage.js +1 -1
  487. package/src/ui5loader-autoconfig.js +84 -11
  488. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/manifest.json +3 -10
  489. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/package.json +13 -0
  490. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/ui5.yaml +11 -0
  491. package/test/sap/ui/core/demokit/sample/RoutingNestedComponent/localService/mockserver.js +3 -4
  492. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/ChartAnnotation.fragment.xml +7 -7
  493. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/Component.js +2 -3
  494. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/Detail.view.xml +12 -13
  495. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/Facets.fragment.xml +4 -4
  496. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/Field.fragment.xml +8 -8
  497. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/FormFacet.fragment.xml +3 -5
  498. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/LabeledField.fragment.xml +3 -3
  499. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/Table.fragment.xml +10 -10
  500. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/TableFacet.fragment.xml +3 -3
  501. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/extension/HeaderInfo.fragment.xml +1 -1
  502. package/test/sap/ui/core/demokit/sample/ViewTemplate/tiny/Field.fragment.xml +2 -2
  503. package/test/sap/ui/core/demokit/sample/ViewTemplate/tiny/Template.view.xml +19 -21
  504. package/test/sap/ui/core/demokit/sample/ViewTemplate/types/TemplateV4.view.xml +2 -2
  505. package/test/sap/ui/core/demokit/sample/ViewTemplate/valuelist/Component.js +2 -3
  506. package/test/sap/ui/core/demokit/sample/common/SandboxModelHelper.js +2 -3
  507. package/test/sap/ui/core/demokit/sample/common/ValueHelp.js +2 -3
  508. package/test/sap/ui/core/demokit/sample/common/pages/Any.js +7 -8
  509. package/test/sap/ui/core/demokit/sample/matcher/BindingPath/manifest.json +3 -11
  510. package/test/sap/ui/core/demokit/sample/matcher/BindingPath/package.json +13 -0
  511. package/test/sap/ui/core/demokit/sample/matcher/BindingPath/ui5.yaml +11 -0
  512. package/test/sap/ui/core/demokit/sample/matcher/Descendant/Component.js +1 -1
  513. package/test/sap/ui/core/demokit/sample/matcher/Descendant/manifest.json +3 -11
  514. package/test/sap/ui/core/demokit/sample/matcher/Descendant/package.json +13 -0
  515. package/test/sap/ui/core/demokit/sample/matcher/Descendant/ui5.yaml +11 -0
  516. package/test/sap/ui/core/demokit/sample/matcher/I18NText/manifest.json +3 -11
  517. package/test/sap/ui/core/demokit/sample/matcher/I18NText/package.json +13 -0
  518. package/test/sap/ui/core/demokit/sample/matcher/I18NText/ui5.yaml +11 -0
  519. package/test/sap/ui/core/demokit/sample/matcher/LabelFor/manifest.json +3 -11
  520. package/test/sap/ui/core/demokit/sample/matcher/LabelFor/package.json +13 -0
  521. package/test/sap/ui/core/demokit/sample/matcher/LabelFor/ui5.yaml +11 -0
  522. package/test/sap/ui/core/demokit/sample/odata/v4/Ancestry/Main.controller.js +15 -6
  523. package/test/sap/ui/core/demokit/sample/odata/v4/DataAggregation/DataAggregation.controller.js +2 -3
  524. package/test/sap/ui/core/demokit/sample/odata/v4/FlatDataAggregation/FlatDataAggregation.controller.js +3 -4
  525. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/Main.controller.js +39 -16
  526. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/Main.view.xml +18 -21
  527. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/data/all.json +509 -395
  528. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/data/metadata.xml +586 -422
  529. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/manifest.json +1 -1
  530. package/test/sap/ui/core/demokit/sample/odata/v4/LateProperties/Main.controller.js +2 -3
  531. package/test/sap/ui/core/demokit/sample/odata/v4/ListBindingTemplate/Facets.fragment.xml +22 -23
  532. package/test/sap/ui/core/demokit/sample/odata/v4/ListBindingTemplate/FormattedText.fragment.xml +2 -3
  533. package/test/sap/ui/core/demokit/sample/odata/v4/ListBindingTemplate/Main.view.xml +7 -7
  534. package/test/sap/ui/core/demokit/sample/odata/v4/MultipleInlineCreationRowsGrid/Main.controller.js +0 -3
  535. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/RecursiveHierarchy.controller.js +54 -9
  536. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/RecursiveHierarchy.view.xml +34 -9
  537. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/SandboxModel.js +156 -23
  538. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/Main.view.xml +3 -2
  539. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrdersTemplate/Facets.fragment.xml +22 -23
  540. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrdersTemplate/FormattedText.fragment.xml +2 -3
  541. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrdersTemplate/Main.view.xml +5 -5
  542. package/test/sap/ui/core/demokit/sample/odata/v4/ServerDrivenPaging/Main.controller.js +2 -3
  543. package/test/sap/ui/core/demokit/tutorial/databinding/01/Component.js +9 -25
  544. package/test/sap/ui/core/demokit/tutorial/databinding/01/manifest.json +20 -0
  545. package/test/sap/ui/core/demokit/tutorial/databinding/01/ui5.yaml +2 -2
  546. package/test/sap/ui/core/demokit/tutorial/databinding/01/webapp/manifest.json +5 -0
  547. package/test/sap/ui/core/demokit/tutorial/databinding/02/Component.js +9 -25
  548. package/test/sap/ui/core/demokit/tutorial/databinding/02/manifest.json +20 -0
  549. package/test/sap/ui/core/demokit/tutorial/databinding/02/ui5.yaml +2 -2
  550. package/test/sap/ui/core/demokit/tutorial/databinding/02/webapp/manifest.json +5 -0
  551. package/test/sap/ui/core/demokit/tutorial/databinding/03/Component.js +9 -25
  552. package/test/sap/ui/core/demokit/tutorial/databinding/03/manifest.json +20 -0
  553. package/test/sap/ui/core/demokit/tutorial/databinding/03/ui5.yaml +2 -2
  554. package/test/sap/ui/core/demokit/tutorial/databinding/03/webapp/manifest.json +5 -0
  555. package/test/sap/ui/core/demokit/tutorial/databinding/04/Component.js +9 -26
  556. package/test/sap/ui/core/demokit/tutorial/databinding/04/manifest.json +21 -0
  557. package/test/sap/ui/core/demokit/tutorial/databinding/04/ui5.yaml +2 -2
  558. package/test/sap/ui/core/demokit/tutorial/databinding/04/webapp/manifest.json +5 -0
  559. package/test/sap/ui/core/demokit/tutorial/databinding/05/Component.js +9 -26
  560. package/test/sap/ui/core/demokit/tutorial/databinding/05/manifest.json +21 -0
  561. package/test/sap/ui/core/demokit/tutorial/databinding/05/ui5.yaml +2 -2
  562. package/test/sap/ui/core/demokit/tutorial/databinding/05/webapp/manifest.json +5 -0
  563. package/test/sap/ui/core/demokit/tutorial/databinding/06/Component.js +9 -27
  564. package/test/sap/ui/core/demokit/tutorial/databinding/06/manifest.json +22 -0
  565. package/test/sap/ui/core/demokit/tutorial/databinding/06/ui5.yaml +2 -2
  566. package/test/sap/ui/core/demokit/tutorial/databinding/06/webapp/manifest.json +5 -0
  567. package/test/sap/ui/core/demokit/tutorial/databinding/07/Component.js +9 -28
  568. package/test/sap/ui/core/demokit/tutorial/databinding/07/manifest.json +23 -0
  569. package/test/sap/ui/core/demokit/tutorial/databinding/07/ui5.yaml +2 -2
  570. package/test/sap/ui/core/demokit/tutorial/databinding/07/webapp/manifest.json +5 -0
  571. package/test/sap/ui/core/demokit/tutorial/databinding/08/Component.js +9 -28
  572. package/test/sap/ui/core/demokit/tutorial/databinding/08/manifest.json +23 -0
  573. package/test/sap/ui/core/demokit/tutorial/databinding/08/ui5.yaml +2 -2
  574. package/test/sap/ui/core/demokit/tutorial/databinding/08/webapp/manifest.json +5 -0
  575. package/test/sap/ui/core/demokit/tutorial/databinding/09/Component.js +9 -29
  576. package/test/sap/ui/core/demokit/tutorial/databinding/09/manifest.json +24 -0
  577. package/test/sap/ui/core/demokit/tutorial/databinding/09/ui5.yaml +2 -2
  578. package/test/sap/ui/core/demokit/tutorial/databinding/09/webapp/manifest.json +5 -0
  579. package/test/sap/ui/core/demokit/tutorial/databinding/10/Component.js +9 -29
  580. package/test/sap/ui/core/demokit/tutorial/databinding/10/manifest.json +24 -0
  581. package/test/sap/ui/core/demokit/tutorial/databinding/10/ui5.yaml +2 -2
  582. package/test/sap/ui/core/demokit/tutorial/databinding/10/webapp/manifest.json +5 -0
  583. package/test/sap/ui/core/demokit/tutorial/databinding/11/Component.js +9 -29
  584. package/test/sap/ui/core/demokit/tutorial/databinding/11/manifest.json +24 -0
  585. package/test/sap/ui/core/demokit/tutorial/databinding/11/ui5.yaml +2 -2
  586. package/test/sap/ui/core/demokit/tutorial/databinding/11/webapp/manifest.json +5 -0
  587. package/test/sap/ui/core/demokit/tutorial/databinding/12/Component.js +9 -30
  588. package/test/sap/ui/core/demokit/tutorial/databinding/12/manifest.json +25 -0
  589. package/test/sap/ui/core/demokit/tutorial/databinding/12/ui5.yaml +2 -2
  590. package/test/sap/ui/core/demokit/tutorial/databinding/12/webapp/manifest.json +5 -0
  591. package/test/sap/ui/core/demokit/tutorial/databinding/13/Component.js +9 -30
  592. package/test/sap/ui/core/demokit/tutorial/databinding/13/manifest.json +25 -0
  593. package/test/sap/ui/core/demokit/tutorial/databinding/13/ui5.yaml +2 -2
  594. package/test/sap/ui/core/demokit/tutorial/databinding/13/webapp/manifest.json +5 -0
  595. package/test/sap/ui/core/demokit/tutorial/databinding/14/Component.js +9 -30
  596. package/test/sap/ui/core/demokit/tutorial/databinding/14/manifest.json +25 -0
  597. package/test/sap/ui/core/demokit/tutorial/databinding/14/ui5.yaml +2 -2
  598. package/test/sap/ui/core/demokit/tutorial/databinding/14/webapp/manifest.json +5 -0
  599. package/test/sap/ui/core/demokit/tutorial/databinding/15/Component.js +9 -32
  600. package/test/sap/ui/core/demokit/tutorial/databinding/15/manifest.json +27 -0
  601. package/test/sap/ui/core/demokit/tutorial/databinding/15/ui5.yaml +2 -2
  602. package/test/sap/ui/core/demokit/tutorial/databinding/15/webapp/manifest.json +5 -0
  603. package/test/sap/ui/core/demokit/tutorial/mockserver/01/Component.js +9 -30
  604. package/test/sap/ui/core/demokit/tutorial/mockserver/01/manifest.json +24 -0
  605. package/test/sap/ui/core/demokit/tutorial/mockserver/01/ui5.yaml +2 -2
  606. package/test/sap/ui/core/demokit/tutorial/mockserver/02/Component.js +9 -33
  607. package/test/sap/ui/core/demokit/tutorial/mockserver/02/manifest.json +27 -0
  608. package/test/sap/ui/core/demokit/tutorial/mockserver/02/ui5.yaml +2 -2
  609. package/test/sap/ui/core/demokit/tutorial/mockserver/03/Component.js +9 -33
  610. package/test/sap/ui/core/demokit/tutorial/mockserver/03/manifest.json +27 -0
  611. package/test/sap/ui/core/demokit/tutorial/mockserver/03/ui5.yaml +2 -2
  612. package/test/sap/ui/core/demokit/tutorial/mockserver/04/Component.js +9 -33
  613. package/test/sap/ui/core/demokit/tutorial/mockserver/04/manifest.json +27 -0
  614. package/test/sap/ui/core/demokit/tutorial/mockserver/04/ui5.yaml +2 -2
  615. package/test/sap/ui/core/demokit/tutorial/navigation/01/Component.js +9 -33
  616. package/test/sap/ui/core/demokit/tutorial/navigation/01/manifest.json +28 -0
  617. package/test/sap/ui/core/demokit/tutorial/navigation/01/ui5.yaml +2 -2
  618. package/test/sap/ui/core/demokit/tutorial/navigation/02/Component.js +9 -35
  619. package/test/sap/ui/core/demokit/tutorial/navigation/02/manifest.json +30 -0
  620. package/test/sap/ui/core/demokit/tutorial/navigation/02/ui5.yaml +2 -2
  621. package/test/sap/ui/core/demokit/tutorial/navigation/03/Component.js +9 -37
  622. package/test/sap/ui/core/demokit/tutorial/navigation/03/manifest.json +32 -0
  623. package/test/sap/ui/core/demokit/tutorial/navigation/03/ui5.yaml +2 -2
  624. package/test/sap/ui/core/demokit/tutorial/navigation/04/Component.js +9 -38
  625. package/test/sap/ui/core/demokit/tutorial/navigation/04/manifest.json +33 -0
  626. package/test/sap/ui/core/demokit/tutorial/navigation/04/ui5.yaml +2 -2
  627. package/test/sap/ui/core/demokit/tutorial/navigation/05/Component.js +9 -38
  628. package/test/sap/ui/core/demokit/tutorial/navigation/05/manifest.json +33 -0
  629. package/test/sap/ui/core/demokit/tutorial/navigation/05/ui5.yaml +2 -2
  630. package/test/sap/ui/core/demokit/tutorial/navigation/06/Component.js +9 -40
  631. package/test/sap/ui/core/demokit/tutorial/navigation/06/manifest.json +35 -0
  632. package/test/sap/ui/core/demokit/tutorial/navigation/06/ui5.yaml +2 -2
  633. package/test/sap/ui/core/demokit/tutorial/navigation/07/Component.js +9 -42
  634. package/test/sap/ui/core/demokit/tutorial/navigation/07/manifest.json +37 -0
  635. package/test/sap/ui/core/demokit/tutorial/navigation/07/ui5.yaml +2 -2
  636. package/test/sap/ui/core/demokit/tutorial/navigation/08/Component.js +9 -45
  637. package/test/sap/ui/core/demokit/tutorial/navigation/08/manifest.json +40 -0
  638. package/test/sap/ui/core/demokit/tutorial/navigation/08/ui5.yaml +2 -2
  639. package/test/sap/ui/core/demokit/tutorial/navigation/09/Component.js +9 -45
  640. package/test/sap/ui/core/demokit/tutorial/navigation/09/manifest.json +40 -0
  641. package/test/sap/ui/core/demokit/tutorial/navigation/09/ui5.yaml +2 -2
  642. package/test/sap/ui/core/demokit/tutorial/navigation/10/Component.js +9 -47
  643. package/test/sap/ui/core/demokit/tutorial/navigation/10/manifest.json +42 -0
  644. package/test/sap/ui/core/demokit/tutorial/navigation/10/ui5.yaml +2 -2
  645. package/test/sap/ui/core/demokit/tutorial/navigation/11/Component.js +9 -52
  646. package/test/sap/ui/core/demokit/tutorial/navigation/11/manifest.json +47 -0
  647. package/test/sap/ui/core/demokit/tutorial/navigation/11/ui5.yaml +2 -2
  648. package/test/sap/ui/core/demokit/tutorial/navigation/12/Component.js +9 -52
  649. package/test/sap/ui/core/demokit/tutorial/navigation/12/manifest.json +47 -0
  650. package/test/sap/ui/core/demokit/tutorial/navigation/12/ui5.yaml +2 -2
  651. package/test/sap/ui/core/demokit/tutorial/navigation/13/Component.js +9 -52
  652. package/test/sap/ui/core/demokit/tutorial/navigation/13/manifest.json +47 -0
  653. package/test/sap/ui/core/demokit/tutorial/navigation/13/ui5.yaml +2 -2
  654. package/test/sap/ui/core/demokit/tutorial/navigation/14/Component.js +9 -52
  655. package/test/sap/ui/core/demokit/tutorial/navigation/14/manifest.json +47 -0
  656. package/test/sap/ui/core/demokit/tutorial/navigation/14/ui5.yaml +2 -2
  657. package/test/sap/ui/core/demokit/tutorial/navigation/15/Component.js +9 -52
  658. package/test/sap/ui/core/demokit/tutorial/navigation/15/manifest.json +47 -0
  659. package/test/sap/ui/core/demokit/tutorial/navigation/15/ui5.yaml +2 -2
  660. package/test/sap/ui/core/demokit/tutorial/navigation/16/Component.js +9 -52
  661. package/test/sap/ui/core/demokit/tutorial/navigation/16/manifest.json +47 -0
  662. package/test/sap/ui/core/demokit/tutorial/navigation/16/ui5.yaml +2 -2
  663. package/test/sap/ui/core/demokit/tutorial/navigation/17/Component.js +9 -52
  664. package/test/sap/ui/core/demokit/tutorial/navigation/17/manifest.json +47 -0
  665. package/test/sap/ui/core/demokit/tutorial/navigation/17/ui5.yaml +2 -2
  666. package/test/sap/ui/core/demokit/tutorial/odatav4/01/Component.js +3 -27
  667. package/test/sap/ui/core/demokit/tutorial/odatav4/01/manifest.json +28 -0
  668. package/test/sap/ui/core/demokit/tutorial/odatav4/01/ui5.yaml +2 -2
  669. package/test/sap/ui/core/demokit/tutorial/odatav4/02/Component.js +3 -27
  670. package/test/sap/ui/core/demokit/tutorial/odatav4/02/manifest.json +28 -0
  671. package/test/sap/ui/core/demokit/tutorial/odatav4/02/ui5.yaml +2 -2
  672. package/test/sap/ui/core/demokit/tutorial/odatav4/03/Component.js +3 -27
  673. package/test/sap/ui/core/demokit/tutorial/odatav4/03/manifest.json +28 -0
  674. package/test/sap/ui/core/demokit/tutorial/odatav4/03/ui5.yaml +2 -2
  675. package/test/sap/ui/core/demokit/tutorial/odatav4/04/Component.js +3 -27
  676. package/test/sap/ui/core/demokit/tutorial/odatav4/04/manifest.json +28 -0
  677. package/test/sap/ui/core/demokit/tutorial/odatav4/04/ui5.yaml +2 -2
  678. package/test/sap/ui/core/demokit/tutorial/odatav4/05/Component.js +3 -27
  679. package/test/sap/ui/core/demokit/tutorial/odatav4/05/manifest.json +28 -0
  680. package/test/sap/ui/core/demokit/tutorial/odatav4/05/ui5.yaml +2 -2
  681. package/test/sap/ui/core/demokit/tutorial/odatav4/06/Component.js +3 -27
  682. package/test/sap/ui/core/demokit/tutorial/odatav4/06/manifest.json +28 -0
  683. package/test/sap/ui/core/demokit/tutorial/odatav4/06/ui5.yaml +2 -2
  684. package/test/sap/ui/core/demokit/tutorial/odatav4/07/Component.js +3 -27
  685. package/test/sap/ui/core/demokit/tutorial/odatav4/07/manifest.json +28 -0
  686. package/test/sap/ui/core/demokit/tutorial/odatav4/07/ui5.yaml +2 -2
  687. package/test/sap/ui/core/demokit/tutorial/odatav4/08/Component.js +3 -27
  688. package/test/sap/ui/core/demokit/tutorial/odatav4/08/manifest.json +28 -0
  689. package/test/sap/ui/core/demokit/tutorial/odatav4/08/ui5.yaml +2 -2
  690. package/test/sap/ui/core/demokit/tutorial/odatav4/09/Component.js +3 -27
  691. package/test/sap/ui/core/demokit/tutorial/odatav4/09/manifest.json +28 -0
  692. package/test/sap/ui/core/demokit/tutorial/odatav4/09/ui5.yaml +2 -2
  693. package/test/sap/ui/core/demokit/tutorial/odatav4/10/Component.js +3 -27
  694. package/test/sap/ui/core/demokit/tutorial/odatav4/10/manifest.json +28 -0
  695. package/test/sap/ui/core/demokit/tutorial/odatav4/10/ui5.yaml +2 -2
  696. package/test/sap/ui/core/demokit/tutorial/odatav4/11/Component.js +3 -27
  697. package/test/sap/ui/core/demokit/tutorial/odatav4/11/manifest.json +28 -0
  698. package/test/sap/ui/core/demokit/tutorial/odatav4/11/ui5.yaml +2 -2
  699. package/test/sap/ui/core/demokit/tutorial/troubleshooting/01/Component.js +9 -29
  700. package/test/sap/ui/core/demokit/tutorial/troubleshooting/01/manifest.json +25 -0
  701. package/test/sap/ui/core/demokit/tutorial/troubleshooting/01/ui5.yaml +2 -2
  702. package/test/sap/ui/core/internal/samples/odata/v2/SalesOrders/Component.js +2 -3
  703. package/test/sap/ui/core/internal/samples/odata/v2/SalesOrders/Main.view.xml +1 -1
  704. package/test/sap/ui/core/internal/samples/odata/v2/SalesOrders/SandboxModel.js +2 -3
  705. package/test/sap/ui/core/qunit/ClientModel.qunit.js +28 -28
  706. package/test/sap/ui/core/qunit/CompositeBinding.qunit.js +18 -0
  707. package/test/sap/ui/core/qunit/ControlRenderer.qunit.js +4 -3
  708. package/test/sap/ui/core/qunit/Core.qunit.js +5 -14
  709. package/test/sap/ui/core/qunit/Core_libraryPreloadFiles.qunit.js +4 -4
  710. package/test/sap/ui/core/qunit/Core_libraryPreloadFiles_unavoidablyUsingEval.qunit.js +6 -6
  711. package/test/sap/ui/core/qunit/Core_unavoidablyUsingEval.qunit.js +31 -30
  712. package/test/sap/ui/core/qunit/DataState.qunit.js +7 -4
  713. package/test/sap/ui/core/qunit/DuplicateIds.qunit.js +3 -0
  714. package/test/sap/ui/core/qunit/DuplicateIds_noError.qunit.js +4 -0
  715. package/test/sap/ui/core/qunit/Element_metadata_renderer.qunit.js +6 -0
  716. package/test/sap/ui/core/qunit/ExpressionParser.qunit.js +144 -85
  717. package/test/sap/ui/core/qunit/HTML.qunit.js +87 -84
  718. package/test/sap/ui/core/qunit/InvisibleText.qunit.js +22 -1
  719. package/test/sap/ui/core/qunit/LRUPersistentCache.qunit.js +4 -4
  720. package/test/sap/ui/core/qunit/Lib.qunit.js +64 -1
  721. package/test/sap/ui/core/qunit/ListBinding.qunit.js +14 -1
  722. package/test/sap/ui/core/qunit/ManagedObject.qunit.js +90 -4
  723. package/test/sap/ui/core/qunit/ManagedObjectMetadata.qunit.js +41 -40
  724. package/test/sap/ui/core/qunit/ManagedObjectModel.qunit.js +2 -1
  725. package/test/sap/ui/core/qunit/{ManagedObject_noBoot.qunit.js → ManagedObject_BindingParser.qunit.js} +10 -9
  726. package/test/sap/ui/core/qunit/Object.qunit.js +36 -0
  727. package/test/sap/ui/core/qunit/RenderManager.qunit.js +86 -94
  728. package/test/sap/ui/core/qunit/ShortcutHints.qunit.js +11 -97
  729. package/test/sap/ui/core/qunit/StaticBinding.qunit.js +3 -0
  730. package/test/sap/ui/core/qunit/UIArea.qunit.js +34 -35
  731. package/test/sap/ui/core/qunit/analytics/AnalyticalTreeBindingAdapter.qunit.js +3 -0
  732. package/test/sap/ui/core/qunit/analytics/ODataModelAdapter.qunit.js +3 -0
  733. package/test/sap/ui/core/qunit/analytics/odata4analytics.qunit.js +3 -0
  734. package/test/sap/ui/core/qunit/app/DesignMode_controllerDeactivated.qunit.js +5 -6
  735. package/test/sap/ui/core/qunit/app/DesignMode_suppressedDeactivation.qunit.js +5 -6
  736. package/test/sap/ui/core/qunit/app/MessageListBinding.qunit.js +3 -0
  737. package/test/sap/ui/core/qunit/app/_createDesignModeTests_legacyAPIs.qunit.js +8 -10
  738. package/test/sap/ui/core/qunit/base/Config_cascade.qunit.js +2 -2
  739. package/test/sap/ui/core/qunit/base/i18n/Formatting.qunit.js +49 -30
  740. package/test/sap/ui/core/qunit/base/i18n/ResourceBundle.qunit.js +123 -10
  741. package/test/sap/ui/core/qunit/base/util/resolveReference.qunit.js +9 -0
  742. package/test/sap/ui/core/qunit/base/util/testdata/MyModule.js +5 -0
  743. package/test/sap/ui/core/qunit/bootstrap/BootstrapCustomBootTaskPreloadCss.beforeBootstrap.qunit.js +4 -2
  744. package/test/sap/ui/core/qunit/bootstrap/BootstrapMinimal.qunit.html +1 -0
  745. package/test/sap/ui/core/qunit/bootstrap/BootstrapPreload.qunit.js +9 -10
  746. package/test/sap/ui/core/qunit/bootstrap/BootstrapPreload_legacyAPIs.qunit.js +0 -2
  747. package/test/sap/ui/core/qunit/bootstrap/BootstrapWithinBody.qunit.html +2 -1
  748. package/test/sap/ui/core/qunit/bootstrap/BootstrapWithinHead.qunit.html +2 -1
  749. package/test/sap/ui/core/qunit/bootstrap/Configuration.qunit.js +122 -266
  750. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibConfigured.qunit.html +22 -0
  751. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibConfigured.qunit.js +22 -0
  752. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibLoaded.qunit.html +22 -0
  753. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibLoaded.qunit.js +16 -0
  754. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibNotLoaded.qunit.html +22 -0
  755. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibNotLoaded.qunit.js +14 -0
  756. package/test/sap/ui/core/qunit/bootstrap/ControlBehavior.qunit.js +110 -0
  757. package/test/sap/ui/core/qunit/bootstrap/PreloadCfg.qunit.js +4 -3
  758. package/test/sap/ui/core/qunit/bootstrap/ResourceRoot_ResourcesURL_Standard.qunit.html +1 -1
  759. package/test/sap/ui/core/qunit/bootstrap/ThemeVersion.beforeBootstrap.qunit.js +2 -3
  760. package/test/sap/ui/core/qunit/bootstrap/_checkCoreAndLibraryBooted.qunit.js +39 -34
  761. package/test/sap/ui/core/qunit/bootstrap/_checkCoreAndLibraryBooted_legacyAPIs.qunit.js +5 -1
  762. package/test/sap/ui/core/qunit/bootstrap/testsuite.bootstrap.qunit.js +51 -15
  763. package/test/sap/ui/core/qunit/compat_legacyAPIs/jquery-compat.qunit.html +23 -0
  764. package/test/sap/ui/core/qunit/compat_legacyAPIs/jquery-compat.qunit.js +1 -1
  765. package/test/sap/ui/core/qunit/compat_legacyAPIs/jquery.sap.stubs.qunit.js +16 -20
  766. package/test/sap/ui/core/qunit/compat_legacyAPIs/testsuite.compat.qunit.js +1 -4
  767. package/test/sap/ui/core/qunit/component/Component.qunit.js +100 -7
  768. package/test/sap/ui/core/qunit/component/Models.qunit.js +3 -1
  769. package/test/sap/ui/core/qunit/component/Preloading.qunit.js +8 -12
  770. package/test/sap/ui/core/qunit/component/UIComponent.qunit.js +8 -2
  771. package/test/sap/ui/core/qunit/component/testdata/routerPreloading/Component.js +23 -0
  772. package/test/sap/ui/core/qunit/component/testdata/routerPreloading/Main.view.xml +8 -0
  773. package/test/sap/ui/core/qunit/component/testdata/routerPreloading/manifest.json +34 -0
  774. package/test/sap/ui/core/qunit/component/testdata/targetsPreloading/Component.js +23 -0
  775. package/test/sap/ui/core/qunit/component/testdata/targetsPreloading/Main.view.xml +8 -0
  776. package/test/sap/ui/core/qunit/component/testdata/targetsPreloading/manifest.json +28 -0
  777. package/test/sap/ui/core/qunit/date/_Calendars.qunit.js +52 -0
  778. package/test/sap/ui/core/qunit/generic/legacy/ControlMemoryLeaks.qunit.js +18 -0
  779. package/test/sap/ui/core/qunit/generic/legacy/ControlMemoryLeaksUsingIterator.qunit.js +3 -4
  780. package/test/sap/ui/core/qunit/generic/legacy/DuplicateIdCheck.qunit.js +18 -0
  781. package/test/sap/ui/core/qunit/generic/legacy/SettersContextReturn.qunit.js +15 -0
  782. package/test/sap/ui/core/qunit/generic/testsuite.generic.qunit.js +21 -0
  783. package/test/sap/ui/core/qunit/gherkin/fixture/testHarnessAmbiguous.js +2 -3
  784. package/test/sap/ui/core/qunit/gherkin/fixture/testHarnessDuplicate.js +2 -3
  785. package/test/sap/ui/core/qunit/gherkin/fixture/testHarnessFailing.js +2 -3
  786. package/test/sap/ui/core/qunit/gherkin/opa5TestHarness.qunit.html +16 -0
  787. package/test/sap/ui/core/qunit/gherkin/opa5TestHarness.qunit.js +1 -1
  788. package/test/sap/ui/core/qunit/gherkin/qUnitTestHarness.qunit.html +16 -0
  789. package/test/sap/ui/core/qunit/gherkin/qUnitTestHarness.qunit.js +1 -1
  790. package/test/sap/ui/core/qunit/gherkin/testsuite.gherkin.qunit.js +3 -2
  791. package/test/sap/ui/core/qunit/i18n/Buddhist.qunit.js +3 -0
  792. package/test/sap/ui/core/qunit/i18n/GenericLocaleData.qunit.js +217 -114
  793. package/test/sap/ui/core/qunit/i18n/Islamic.qunit.js +7 -4
  794. package/test/sap/ui/core/qunit/i18n/Japanese.qunit.js +3 -0
  795. package/test/sap/ui/core/qunit/i18n/LocaleData.qunit.js +341 -7
  796. package/test/sap/ui/core/qunit/i18n/Persian.qunit.js +3 -0
  797. package/test/sap/ui/core/qunit/i18n/UniversalDate.qunit.js +3 -0
  798. package/test/sap/ui/core/qunit/i18n/UniversalDateUtils.qunit.js +10 -1
  799. package/test/sap/ui/core/qunit/i18n/helper/_timezones.js +17 -11
  800. package/test/sap/ui/core/qunit/i18n/testsuite.i18n.qunit.js +7 -1
  801. package/test/sap/ui/core/qunit/internal/1Ring.qunit.html +5 -1
  802. package/test/sap/ui/core/qunit/internal/1RingModels.qunit.html +2 -2
  803. package/test/sap/ui/core/qunit/internal/1RingModels.qunit.js +1 -0
  804. package/test/sap/ui/core/qunit/internal/AnnotationParser.qunit.html +1 -2
  805. package/test/sap/ui/core/qunit/internal/ODataV4.qunit.html +6 -1
  806. package/test/sap/ui/core/qunit/internal/testsuite.feature-odata-v4.qunit.js +2 -1
  807. package/test/sap/ui/core/qunit/jquery.sap.global-config.qunit.html +24 -0
  808. package/test/sap/ui/core/qunit/jquery.sap.global-config.qunit.js +12 -6
  809. package/test/sap/ui/core/qunit/jquery.sap.global-config_beforeBootstrap.qunit.js +1 -1
  810. package/test/sap/ui/core/qunit/json/JSONListBinding.qunit.js +30 -0
  811. package/test/sap/ui/core/qunit/loader/exposeAsAMDLoader.qunit.html +1 -0
  812. package/test/sap/ui/core/qunit/model/Binding.qunit.js +3 -0
  813. package/test/sap/ui/core/qunit/model/ClientListBinding.qunit.js +5 -2
  814. package/test/sap/ui/core/qunit/model/ClientPropertyBinding.qunit.js +3 -0
  815. package/test/sap/ui/core/qunit/model/ClientTreeBinding.qunit.js +5 -2
  816. package/test/sap/ui/core/qunit/model/ClientTreeBindingAdapter.qunit.js +6 -0
  817. package/test/sap/ui/core/qunit/model/CompositeDataState.qunit.js +3 -0
  818. package/test/sap/ui/core/qunit/model/Context.qunit.js +3 -0
  819. package/test/sap/ui/core/qunit/model/ContextBinding.qunit.js +3 -0
  820. package/test/sap/ui/core/qunit/model/Filter.qunit.js +49 -0
  821. package/test/sap/ui/core/qunit/model/FilterProcessor.qunit.js +68 -1
  822. package/test/sap/ui/core/qunit/model/ListBinding.qunit.js +23 -5
  823. package/test/sap/ui/core/qunit/model/Model.qunit.js +46 -2
  824. package/test/sap/ui/core/qunit/model/PropertyBinding.qunit.js +3 -0
  825. package/test/sap/ui/core/qunit/model/Sorter.qunit.js +3 -0
  826. package/test/sap/ui/core/qunit/model/TreeBinding.qunit.js +43 -3
  827. package/test/sap/ui/core/qunit/model/TreeBindingAdapter.qunit.js +3 -0
  828. package/test/sap/ui/core/qunit/mvc/Controller.qunit.js +107 -93
  829. package/test/sap/ui/core/qunit/mvc/View.qunit.js +3 -0
  830. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessor.qunit.js +17 -14
  831. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessorAsync.qunit.js +23 -12
  832. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessorRequireXML.qunit.js +29 -82
  833. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessorRequireXML_unavoidablySync.qunit.js +123 -0
  834. package/test/sap/ui/core/qunit/mvc/extensions/Controllerextensions.qunit.js +4 -0
  835. package/test/sap/ui/core/qunit/mvc/extensions/Controllerextensions_legacy.qunit.js +4 -0
  836. package/test/sap/ui/core/qunit/mvc/testsuite.mvc.qunit.js +16 -0
  837. package/test/sap/ui/core/qunit/mvc/viewprocessing/ViewProcessing.qunit.js +408 -419
  838. package/test/sap/ui/core/qunit/odata/AnnotationHelper.qunit.js +6 -4
  839. package/test/sap/ui/core/qunit/odata/ODataAnnotations.qunit.js +16 -0
  840. package/test/sap/ui/core/qunit/odata/ODataMetaModel.qunit.js +8 -1
  841. package/test/sap/ui/core/qunit/odata/ODataModel_legacyAPIs.qunit.js +22 -22
  842. package/test/sap/ui/core/qunit/odata/ODataTreeBindingAdapter.qunit.js +1 -1
  843. package/test/sap/ui/core/qunit/odata/ODataUtils.qunit.js +5 -1
  844. package/test/sap/ui/core/qunit/odata/type/DateTimeBase.qunit.js +4 -4
  845. package/test/sap/ui/core/qunit/odata/type/DateTimeWithTimezone.qunit.js +6 -6
  846. package/test/sap/ui/core/qunit/odata/type/Time.qunit.js +3 -4
  847. package/test/sap/ui/core/qunit/odata/type/TimeOfDay.qunit.js +4 -4
  848. package/test/sap/ui/core/qunit/odata/v2/ODataListBindingNoFakeService.qunit.js +52 -29
  849. package/test/sap/ui/core/qunit/odata/v2/ODataModel.integration.qunit.js +952 -292
  850. package/test/sap/ui/core/qunit/odata/v2/ODataModelNoFakeService.qunit.js +8 -15
  851. package/test/sap/ui/core/qunit/odata/v2/ODataPropertyBindingNoFakeService.qunit.js +6 -7
  852. package/test/sap/ui/core/qunit/odata/v2/ODataTreeBindingFlatNoFakeService.qunit.js +215 -1
  853. package/test/sap/ui/core/qunit/odata/v2/ODataTreeBindingNoFakeService.qunit.js +211 -20
  854. package/test/sap/ui/core/qunit/odata/v2/ODataV2Model.qunit.js +32 -36
  855. package/test/sap/ui/core/qunit/odata/v2/V2ODataModelDataState.qunit.js +3 -2
  856. package/test/sap/ui/core/qunit/odata/v4/Context.qunit.js +69 -2
  857. package/test/sap/ui/core/qunit/odata/v4/ODataBinding.qunit.js +19 -9
  858. package/test/sap/ui/core/qunit/odata/v4/ODataListBinding.qunit.js +601 -99
  859. package/test/sap/ui/core/qunit/odata/v4/ODataMetaModel.qunit.js +5 -5
  860. package/test/sap/ui/core/qunit/odata/v4/ODataModel.integration.qunit.js +1896 -407
  861. package/test/sap/ui/core/qunit/odata/v4/ODataModel.qunit.js +7 -5
  862. package/test/sap/ui/core/qunit/odata/v4/ODataModel.realOData.qunit.js +4 -4
  863. package/test/sap/ui/core/qunit/odata/v4/lib/_AggregationCache.qunit.js +909 -422
  864. package/test/sap/ui/core/qunit/odata/v4/lib/_AggregationHelper.qunit.js +21 -6
  865. package/test/sap/ui/core/qunit/odata/v4/lib/_Cache.qunit.js +104 -33
  866. package/test/sap/ui/core/qunit/odata/v4/lib/_Helper.qunit.js +8 -0
  867. package/test/sap/ui/core/qunit/odata/v4/lib/_MetadataRequestor.qunit.js +4 -4
  868. package/test/sap/ui/core/qunit/odata/v4/lib/_Requestor.qunit.js +9 -9
  869. package/test/sap/ui/core/qunit/odata/v4/lib/_V2MetadataConverter.qunit.js +3 -3
  870. package/test/sap/ui/core/qunit/odata/v4/lib/_V4MetadataConverter.qunit.js +3 -3
  871. package/test/sap/ui/core/qunit/opa/OpaPlugin.qunit.js +16 -0
  872. package/test/sap/ui/core/qunit/opa/_LogCollector.qunit.js +17 -9
  873. package/test/sap/ui/core/qunit/opa/actions/EnterText.qunit.js +66 -3
  874. package/test/sap/ui/core/qunit/opa/autowaiter/_cssAnimationWaiter.js +3 -3
  875. package/test/sap/ui/core/qunit/opa/autowaiter/_cssTransitionWaiter.js +3 -3
  876. package/test/sap/ui/core/qunit/opa/autowaiter/_jsAnimationWaiter.js +3 -3
  877. package/test/sap/ui/core/qunit/opa/autowaiter/_timeoutWaiter.js +11 -0
  878. package/test/sap/ui/core/qunit/opa/fixture/miniUI5Site.js +14 -8
  879. package/test/sap/ui/core/qunit/opa/fixture/uncaughtError.js +18 -12
  880. package/test/sap/ui/core/qunit/performance/BeaconRequest.qunit.js +18 -2
  881. package/test/sap/ui/core/qunit/performance/trace/FESR.qunit.js +11 -2
  882. package/test/sap/ui/core/qunit/performance/trace/Interaction.qunit.js +4 -7
  883. package/test/sap/ui/core/qunit/resource/ResourceBinding.qunit.js +1 -0
  884. package/test/sap/ui/core/qunit/resource/ResourceModel.qunit.js +5 -4
  885. package/test/sap/ui/core/qunit/routing/async/Target.qunit.js +20 -18
  886. package/test/sap/ui/core/qunit/routing/async/Targets.qunit.js +1 -4
  887. package/test/sap/ui/core/qunit/routing/fixture/routingConfig/Component.js +2 -25
  888. package/test/sap/ui/core/qunit/routing/fixture/routingConfig/manifest.json +28 -0
  889. package/test/sap/ui/core/qunit/rule/misc/silentEventBus.qunit.js +1 -2
  890. package/test/sap/ui/core/qunit/testdata/libraries/scenario11/lib1/library.js +11 -0
  891. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib1/library-preload.js +3 -1
  892. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib1/library.js +3 -1
  893. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib2/library-preload.js +3 -1
  894. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib2/library.js +3 -1
  895. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib3/library-preload.js +2 -1
  896. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib3/library.js +2 -1
  897. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib5/library-preload.js +2 -1
  898. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib5/library.js +2 -1
  899. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib6/library-preload.js +2 -1
  900. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib6/library.js +2 -1
  901. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib8/library-preload.js +2 -1
  902. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib8/library.js +2 -1
  903. package/test/sap/ui/core/qunit/testdata/libraries/terminologies/integration/lib/library-preload.js +1 -1
  904. package/test/sap/ui/core/qunit/testdata/shortcutHints/Component.js +9 -0
  905. package/test/sap/ui/core/qunit/testdata/shortcutHints/RootView.controller.js +8 -0
  906. package/test/sap/ui/core/qunit/testdata/shortcutHints/RootView.view.xml +16 -0
  907. package/test/sap/ui/core/qunit/testdata/shortcutHints/lib/MyControl.js +27 -0
  908. package/test/sap/ui/core/qunit/testdata/shortcutHints/manifest.json +26 -0
  909. package/test/sap/ui/core/qunit/testdata/uilib-custom-theme-fallback/library.js +4 -5
  910. package/test/sap/ui/core/qunit/testdata/uilib-failing-css-import/library.js +5 -6
  911. package/test/sap/ui/core/qunit/testdata/xml-require/view/XMLTemplateProcessorAsync_require_expression.controller.js +2 -1
  912. package/test/sap/ui/core/qunit/testdata/xml-require/view/XMLTemplateProcessorAsync_require_expression.view.xml +18 -1
  913. package/test/sap/ui/core/qunit/testsuite.core.framework.qunit.js +3 -0
  914. package/test/sap/ui/core/qunit/testsuites/testsuite.control.framework.qunit.js +0 -4
  915. package/test/sap/ui/core/qunit/testsuites/testsuite.foundation.enablement.qunit.js +6 -1
  916. package/test/sap/ui/core/qunit/testsuites/testsuite.managed.object.qunit.js +4 -1
  917. package/test/sap/ui/core/qunit/testsuites/testsuite.modular.core.qunit.js +1 -1
  918. package/test/sap/ui/core/qunit/testsuites/testsuite.security.qunit.js +3 -9
  919. package/test/sap/ui/core/qunit/types/DataType.qunit.js +14 -3
  920. package/test/sap/ui/core/qunit/types/Date.qunit.js +3 -0
  921. package/test/sap/ui/core/qunit/types/DateFormat.qunit.js +391 -147
  922. package/test/sap/ui/core/qunit/types/DateFormatTimezones.qunit.js +32 -29
  923. package/test/sap/ui/core/qunit/types/DateInterval.qunit.js +7 -4
  924. package/test/sap/ui/core/qunit/types/FileSizeFormat.qunit.js +5 -1
  925. package/test/sap/ui/core/qunit/types/ListFormat.qunit.js +3 -0
  926. package/test/sap/ui/core/qunit/types/NumberFormat.qunit.js +4 -3
  927. package/test/sap/ui/core/qunit/types/NumberFormatCurrencies.qunit.js +5 -4
  928. package/test/sap/ui/core/qunit/types/NumberFormatCurrenciesTrailing.qunit.js +4 -3
  929. package/test/sap/ui/core/qunit/types/SimpleType.qunit.js +3 -0
  930. package/test/sap/ui/core/qunit/types/TimezoneUtil.qunit.js +23 -0
  931. package/test/sap/ui/core/qunit/types/Types.qunit.js +44 -10
  932. package/test/sap/ui/core/qunit/types/testsuite.types.qunit.js +3 -0
  933. package/test/sap/ui/core/qunit/util/InvisibleMessage.qunit.js +4 -4
  934. package/test/sap/ui/core/qunit/util/XMLPreprocessor.qunit.js +592 -83
  935. package/test/sap/ui/core/qunit/util/beforeBootstrap/jQuery.sap.FrameOptions-allowlist.js +7 -0
  936. package/test/sap/ui/core/qunit/util/beforeBootstrap/jQuery.sap.FrameOptions-frameOptions.js +7 -0
  937. package/test/sap/ui/core/qunit/{bootstrap/CfgFromGlobalObject.qunit.html → util/jQuery.sap.FrameOptions-meta-tag-override-mode.qunit.html} +7 -11
  938. package/test/sap/ui/core/qunit/util/jQuery.sap.FrameOptions-meta-tag-override-mode.qunit.js +3 -4
  939. package/test/sap/ui/core/qunit/util/jQuery.sap.FrameOptions-meta-tag-override-service.qunit.html +26 -0
  940. package/test/sap/ui/core/qunit/util/jQuery.sap.FrameOptions-meta-tag-override-service.qunit.js +3 -4
  941. package/test/sap/ui/core/qunit/{bootstrap/CfgDefaults.qunit.html → util/jQuery.sap.FrameOptions-meta-tag.qunit.html} +5 -8
  942. package/test/sap/ui/core/qunit/util/jQuery.sap.FrameOptions-meta-tag.qunit.js +3 -4
  943. package/test/sap/ui/core/qunit/util/jQuery.sap.Version.qunit.js +10 -10
  944. package/test/sap/ui/core/qunit/util/jquery.sap.logger.qunit.html +18 -0
  945. package/test/sap/ui/core/qunit/util/jquery.sap.resources.qunit.js +1 -1
  946. package/test/sap/ui/core/qunit/util/testsuite.util.qunit.js +1 -3
  947. package/test/sap/ui/core/qunit/xml/XMLListBinding.qunit.js +3 -0
  948. package/test/sap/ui/core/qunit/xml/XMLModel.qunit.js +3 -0
  949. package/test/sap/ui/core/qunit/xml/XMLPropertyBinding.qunit.js +3 -0
  950. package/test/sap/ui/core/qunit/xml/XMLTreeBinding.qunit.js +3 -0
  951. package/test/sap/ui/core/relnotes/changes-1.119.json +1 -12
  952. package/test/sap/ui/core/relnotes/changes-1.120.json +442 -0
  953. package/test/sap/ui/core/terminologies/App.controller.js +2 -3
  954. package/test/sap/ui/core/terminologies/main.js +2 -3
  955. package/test/sap/ui/test/qunit/TestUtils.qunit.js +3 -3
  956. package/src/sap/ui/core/ConfigTest.js +0 -17
  957. package/src/sap/ui/core/_ConfigurationProvider.js +0 -187
  958. package/test/sap/ui/core/ComponentExtensibility_CustomizingDisabled.html +0 -57
  959. package/test/sap/ui/core/qunit/bootstrap/CfgDefaults.qunit.js +0 -71
  960. package/test/sap/ui/core/qunit/bootstrap/CfgFromConfigAttribute.qunit.html +0 -29
  961. package/test/sap/ui/core/qunit/bootstrap/CfgFromConfigAttribute.qunit.js +0 -40
  962. package/test/sap/ui/core/qunit/bootstrap/CfgFromGlobalObject.beforeBootstrap.qunit.js +0 -20
  963. package/test/sap/ui/core/qunit/bootstrap/CfgFromGlobalObject.qunit.js +0 -40
  964. package/test/sap/ui/core/qunit/bootstrap/CfgFromTagAttributes.qunit.html +0 -42
  965. package/test/sap/ui/core/qunit/bootstrap/CfgFromTagAttributes.qunit.js +0 -49
  966. package/test/sap/ui/core/qunit/util/BusyIndicatorNoCore.qunit.js +0 -96
  967. package/test/sap/ui/core/qunit/util/beforeBootstrap/jQuery.sap.FrameOptions-meta-tag.js +0 -10
  968. package/test/sap/ui/core/samples/mvc/JSONView.html +0 -65
@@ -131,70 +131,70 @@ sap.ui.define([
131
131
  * The entity's edit URL to be used for the DELETE request
132
132
  * @param {string} sIndex
133
133
  * The entity's index
134
- * @param {object} [oETagEntity]
135
- * An entity with the ETag of the binding for which the deletion was requested. This is
136
- * provided if the deletion is delegated from a context binding with empty path to a list
137
- * binding
134
+ * @param {object} [_oETagEntity]
135
+ * An entity with the ETag of the binding for which the deletion was requested. Not used and
136
+ * should always be undefined
138
137
  * @param {function(number,number):void} fnCallback
139
138
  * A function which is called immediately when an entity has been deleted from the cache, or
140
139
  * when it was re-inserted; the index of the entity and an offset (-1 for deletion, 1 for
141
140
  * re-insertion) are passed as parameter
142
- * @returns {sap.ui.base.SyncPromise}
141
+ * @returns {sap.ui.base.SyncPromise<void>}
143
142
  * A promise which is resolved without a result in case of success, or rejected with an
144
143
  * instance of <code>Error</code> in case of failure
145
- * @throws {Error} If the cache is shared, <code>this.oAggregation.expandTo > 1</code>, or
146
- * <code>sIndex</code> is not a number.
144
+ * @throws {Error} If the cache is shared, <code>sIndex</code> is not a number, or the node
145
+ * at the given index is expanded.
147
146
  *
148
147
  * @public
149
148
  */
150
149
  // @override sap.ui.model.odata.v4.lib._Cache#_delete
151
- _AggregationCache.prototype._delete = function (oGroupLock, sEditUrl, sIndex, oETagEntity,
150
+ _AggregationCache.prototype._delete = function (oGroupLock, sEditUrl, sIndex, _oETagEntity,
152
151
  fnCallback) {
153
- if (this.oAggregation.expandTo > 1) {
154
- throw new Error("Unsupported expandTo: " + this.oAggregation.expandTo);
152
+ let iIndex = parseInt(sIndex);
153
+ if (isNaN(iIndex)) {
154
+ throw new Error(`Unsupported kept-alive entity: ${this.sResourcePath}${sIndex}`);
155
155
  }
156
156
 
157
- let iFlatIndex = parseInt(sIndex);
158
- if (isNaN(iFlatIndex)) {
159
- throw new Error(`Unsupported kept-alive entity: ${this.sResourcePath}${sIndex}`);
157
+ const oElement = this.aElements[iIndex];
158
+ const sPredicate = _Helper.getPrivateAnnotation(oElement, "predicate");
159
+ if (oElement["@$ui5.node.isExpanded"]) {
160
+ throw new Error(`Unsupported expanded node: ${this.sResourcePath}${sPredicate}`);
160
161
  }
161
162
 
162
- const oElement = this.aElements[iFlatIndex];
163
- const oLevelCache = _Helper.getPrivateAnnotation(oElement, "parent");
164
- const iLevelIndex = _Helper.getPrivateAnnotation(oElement, "index");
165
- let iParentIndex = iFlatIndex - iLevelIndex - 1;
166
- const oParent = this.aElements[iParentIndex];
167
- return oLevelCache._delete(oGroupLock, sEditUrl, iLevelIndex.toString(), oETagEntity,
168
- (iIndex, iOffset) => {
169
- if (iOffset < 0) { // deleting
170
- this.shiftIndex(iFlatIndex, iOffset);
171
- this.removeElement(this.aElements, iFlatIndex,
172
- _Helper.getPrivateAnnotation(oElement, "predicate"), "");
173
- if (oParent && !oLevelCache.getValue("$count")) {
174
- _Helper.updateAll(this.mChangeListeners,
175
- _Helper.getPrivateAnnotation(oParent, "predicate"), oParent,
176
- {"@$ui5.node.isExpanded" : undefined});
177
- // _Helper.updateAll only sets it to undefined
178
- delete oParent["@$ui5.node.isExpanded"];
179
- }
180
- } else { // reinserting
181
- if (oParent) {
182
- if (oParent !== this.aElements[iParentIndex]) { // parent moved
183
- iParentIndex = this.aElements.indexOf(oParent);
184
- }
185
- if (oLevelCache.getValue("$count") === 1) {
186
- _Helper.updateAll(this.mChangeListeners,
187
- _Helper.getPrivateAnnotation(oParent, "predicate"), oParent,
188
- {"@$ui5.node.isExpanded" : true});
189
- }
190
- }
191
- iFlatIndex = iParentIndex + iIndex + 1;
192
- this.restoreElement(this.aElements, iFlatIndex, oElement, "");
193
- this.shiftIndex(iFlatIndex, iOffset);
194
- _Helper.setPrivateAnnotation(oElement, "index", iIndex);
195
- }
196
- fnCallback(iFlatIndex, iOffset);
197
- });
163
+ const oParentCache = _Helper.getPrivateAnnotation(oElement, "parent");
164
+ if (oElement["@$ui5.context.isTransient"]) {
165
+ // cancel the create (no callback function necessary)
166
+ return oParentCache._delete(oGroupLock, sEditUrl,
167
+ _Helper.getPrivateAnnotation(oElement, "transientPredicate"));
168
+ }
169
+
170
+ return SyncPromise.resolve(
171
+ this.oRequestor.request("DELETE", sEditUrl, oGroupLock, {"If-Match" : oElement})
172
+ ).then(() => {
173
+ // the element might have moved due to parallel insert/delete
174
+ iIndex = _Cache.getElementIndex(this.aElements, sPredicate, iIndex);
175
+ // remove in parent cache
176
+ const iIndexInParentCache = oParentCache.removeElement(
177
+ _Helper.getPrivateAnnotation(oElement, "index", 0), sPredicate);
178
+ // remove the descendants in the parent cache (if any)
179
+ const iDescendants = _Helper.getPrivateAnnotation(oElement, "descendants", 0);
180
+ for (let i = 0; i < iDescendants; i += 1) {
181
+ oParentCache.removeElement(iIndexInParentCache);
182
+ }
183
+ const iOffset = iDescendants + 1;
184
+ if (oParentCache === this.oFirstLevel) {
185
+ this.adjustDescendantCount(oElement, iIndex, -iOffset);
186
+ } else if (!oParentCache.getValue("$count")) {
187
+ // make parent a leaf (the direct predecessor)
188
+ this.makeLeaf(this.aElements[iIndex - 1]);
189
+ }
190
+ if (!("@$ui5.context.isTransient" in oElement)) {
191
+ this.shiftIndex(iIndex, -iOffset);
192
+ }
193
+ // remove in this cache
194
+ this.removeElement(iIndex, sPredicate);
195
+ // notify caller
196
+ fnCallback(iIndex, -1);
197
+ });
198
198
  };
199
199
 
200
200
  /**
@@ -208,8 +208,8 @@ sap.ui.define([
208
208
  * The group level cache which the given elements have been read from; omit it only for grand
209
209
  * totals or separate subtotals
210
210
  * @param {number} [iStart]
211
- * The index of the first element within the cache's collection; omit it only if no group
212
- * level cache is given
211
+ * The $skip index of the first given element within the cache's collection; omit it only if
212
+ * no group level cache is given or for a single created element (where it is always unknown)
213
213
  * @throws {Error}
214
214
  * In case an unexpected element or placeholder would be overwritten, if the given offset is
215
215
  * negative, if a resulting array index is out of bounds, in case of a duplicate predicate, or
@@ -226,15 +226,15 @@ sap.ui.define([
226
226
  function addElement(oElement, i) {
227
227
  var oOldElement = aElements[iOffset + i],
228
228
  oKeptElement,
229
- sPredicate = _Helper.getPrivateAnnotation(oElement, "transientPredicate")
230
- || _Helper.getPrivateAnnotation(oElement, "predicate");
229
+ sPredicate = _Helper.getPrivateAnnotation(oElement, "predicate"),
230
+ sTransientPredicate = _Helper.getPrivateAnnotation(oElement, "transientPredicate");
231
231
 
232
232
  if (oOldElement) { // check before overwriting
233
233
  if (oOldElement === oElement) {
234
234
  return;
235
235
  }
236
236
  _AggregationHelper.beforeOverwritePlaceholder(oOldElement, oElement, oCache,
237
- iStart + i, sNodeProperty);
237
+ iStart === undefined ? undefined : iStart + i, sNodeProperty);
238
238
  } else if (iOffset + i >= aElements.length) {
239
239
  throw new Error("Array index out of bounds: " + (iOffset + i));
240
240
  }
@@ -254,13 +254,24 @@ sap.ui.define([
254
254
  } // else: ETag changed, ignore kept element!
255
255
  }
256
256
 
257
- aElements.$byPredicate[sPredicate] = aElements[iOffset + i] = oElement;
257
+ if (sPredicate) {
258
+ aElements.$byPredicate[sPredicate] = oElement;
259
+ }
260
+ if (sTransientPredicate) {
261
+ aElements.$byPredicate[sTransientPredicate] = oElement;
262
+ }
263
+ aElements[iOffset + i] = oElement;
258
264
 
265
+ // remember index & parent for #requestSideEffects
259
266
  if (oCache) {
260
- // remember index & parent for #requestSideEffects
261
- _Helper.setPrivateAnnotation(oElement, "index", iStart + i);
262
267
  _Helper.setPrivateAnnotation(oElement, "parent", oCache);
263
268
  }
269
+
270
+ if (sTransientPredicate) { // created
271
+ iStart -= 1; // "shift" index of non-created elements behind this one
272
+ } else {
273
+ _Helper.setPrivateAnnotation(oElement, "index", iStart + i);
274
+ }
264
275
  }
265
276
 
266
277
  if (iOffset < 0) {
@@ -273,6 +284,47 @@ sap.ui.define([
273
284
  }
274
285
  };
275
286
 
287
+ /**
288
+ * Adjusts the (limited) descendant count at all ancestors of the given element which must be
289
+ * part of <code>this.oFirstLevel</code>, handles placeholders. Makes the parent a leaf if its
290
+ * descendant count becomes 0.
291
+ *
292
+ * @param {object} oElement - The element
293
+ * @param {number} iIndex - Its index
294
+ * @param {number} iOffset - The offset
295
+ *
296
+ * @private
297
+ */
298
+ _AggregationCache.prototype.adjustDescendantCount = function (oElement, iIndex, iOffset) {
299
+ let iLevel = oElement["@$ui5.node.level"];
300
+ let bInitialPlaceholderFound = false;
301
+
302
+ for (let iCandidateIndex = iIndex - 1; iCandidateIndex >= 0 && iLevel > 1;
303
+ iCandidateIndex -= 1) {
304
+ const oCandidate = this.aElements[iCandidateIndex];
305
+ const iCandidateLevel = oCandidate["@$ui5.node.level"];
306
+ if (iCandidateLevel === 0) {
307
+ // Note: level 0 means "don't know" for initial *placeholders* of 1st level cache!
308
+ bInitialPlaceholderFound = true;
309
+ } else if (iCandidateLevel < iLevel) {
310
+ if (!bInitialPlaceholderFound || this.isAncestorOf(iCandidateIndex, iIndex)) {
311
+ const iCount
312
+ = _Helper.getPrivateAnnotation(oCandidate, "descendants") + iOffset;
313
+ _Helper.setPrivateAnnotation(oCandidate, "descendants", iCount);
314
+ if (iCount === 0) {
315
+ this.makeLeaf(oCandidate);
316
+ }
317
+ // the next candidate must be an ancestor of this node
318
+ iIndex = iCandidateIndex;
319
+ bInitialPlaceholderFound = false;
320
+ }
321
+ // we have a node or placeholder at this level => there can only be ancestors at
322
+ // lower levels
323
+ iLevel = iCandidateLevel;
324
+ }
325
+ }
326
+ };
327
+
276
328
  /**
277
329
  * Deletes the "$apply" system query option before side effects are requested and adds the
278
330
  * NodeProperty path to the "$select" system query option (if not already present).
@@ -322,32 +374,58 @@ sap.ui.define([
322
374
  * @see #expand
323
375
  */
324
376
  _AggregationCache.prototype.collapse = function (sGroupNodePath) {
325
- var oCollapsed,
326
- iCount = 0,
327
- iDescendants,
328
- aElements = this.aElements,
329
- oGroupNode = this.getValue(sGroupNodePath),
330
- iGroupNodeLevel = oGroupNode["@$ui5.node.level"],
331
- iIndex = aElements.indexOf(oGroupNode),
332
- i = iIndex + 1;
333
-
334
- function collapse(j) {
335
- delete aElements.$byPredicate[_Helper.getPrivateAnnotation(aElements[j], "predicate")];
377
+ const oGroupNode = this.getValue(sGroupNodePath);
378
+ const oCollapsed = _AggregationHelper.getCollapsedObject(oGroupNode);
379
+ _Helper.updateAll(this.mChangeListeners, sGroupNodePath, oGroupNode, oCollapsed);
380
+
381
+ const aElements = this.aElements;
382
+ const iIndex = aElements.indexOf(oGroupNode);
383
+ let iCount = this.countDescendants(oGroupNode, iIndex);
384
+ if (this.oAggregation.subtotalsAtBottomOnly !== undefined
385
+ // Note: there is at least one key for "@$ui5.node.isExpanded"; there are more keys
386
+ // if and only if subtotals are actually being requested and (also) shown at the
387
+ // bottom
388
+ && Object.keys(oCollapsed).length > 1) {
389
+ iCount += 1; // collapse subtotals at bottom
390
+ }
391
+
392
+ for (let i = iIndex + 1; i < iIndex + 1 + iCount; i += 1) {
393
+ delete aElements.$byPredicate[_Helper.getPrivateAnnotation(aElements[i], "predicate")];
336
394
  delete aElements.$byPredicate[
337
- _Helper.getPrivateAnnotation(aElements[j], "transientPredicate")];
338
- iCount += 1;
395
+ _Helper.getPrivateAnnotation(aElements[i], "transientPredicate")];
339
396
  }
397
+ const aSpliced = aElements.splice(iIndex + 1, iCount);
398
+ aSpliced.$index = _Helper.getPrivateAnnotation(oGroupNode, "index");
399
+ _Helper.setPrivateAnnotation(oGroupNode, "spliced", aSpliced);
400
+ aElements.$count -= iCount;
340
401
 
341
- oCollapsed = _AggregationHelper.getCollapsedObject(oGroupNode);
342
- _Helper.updateAll(this.mChangeListeners, sGroupNodePath, oGroupNode, oCollapsed);
402
+ return iCount;
403
+ };
343
404
 
344
- iDescendants = _Helper.getPrivateAnnotation(oGroupNode, "descendants");
405
+ /**
406
+ * Virtually collapses the given group node at the given index, counting the number of
407
+ * descendant nodes that would be affected.
408
+ *
409
+ * @param {object} oGroupNode - An expanded(!) group node
410
+ * @param {number} iIndex - Its index
411
+ * @returns {number} The number of descendant nodes that would be affected
412
+ *
413
+ * @private
414
+ * @see #collapse
415
+ * @see #isAncestorOf
416
+ */
417
+ _AggregationCache.prototype.countDescendants = function (oGroupNode, iIndex) {
418
+ var i;
419
+
420
+ let iGroupNodeLevel = oGroupNode["@$ui5.node.level"];
421
+ let iDescendants = _Helper.getPrivateAnnotation(oGroupNode, "descendants");
345
422
  if (iDescendants) { // => this.oAggregation.expandTo > 1
346
423
  // Note: "descendants" refers to LimitedDescendantCountProperty and counts descendants
347
424
  // within "top pyramid" only!
348
425
  iGroupNodeLevel = this.oAggregation.expandTo;
349
426
  }
350
- while (i < aElements.length) {
427
+ const aElements = this.aElements;
428
+ for (i = iIndex + 1; i < aElements.length; i += 1) {
351
429
  if (aElements[i]["@$ui5.node.level"] <= iGroupNodeLevel) {
352
430
  // Note: level 0 or 1 is used for initial placeholders of 1st level cache!
353
431
  if (!iDescendants) {
@@ -356,23 +434,12 @@ sap.ui.define([
356
434
  iDescendants -= 1;
357
435
  if (aElements[i]["@$ui5.node.isExpanded"] === false) {
358
436
  // skip descendants of manually collapsed node
359
- iDescendants -= _Helper.getPrivateAnnotation(aElements[i], "descendants") || 0;
437
+ iDescendants -= _Helper.getPrivateAnnotation(aElements[i], "descendants", 0);
360
438
  }
361
439
  }
362
- collapse(i);
363
- i += 1;
364
440
  }
365
- if (this.oAggregation.subtotalsAtBottomOnly !== undefined
366
- // Note: there is at least one key for "@$ui5.node.isExpanded"; there are more keys
367
- // if and only if subtotals are actually being requested and (also) shown at the
368
- // bottom
369
- && Object.keys(oCollapsed).length > 1) {
370
- collapse(i); // collapse subtotals at bottom
371
- }
372
- _Helper.setPrivateAnnotation(oGroupNode, "spliced", aElements.splice(iIndex + 1, iCount));
373
- aElements.$count -= iCount;
374
441
 
375
- return iCount;
442
+ return i - (iIndex + 1);
376
443
  };
377
444
 
378
445
  /**
@@ -390,7 +457,8 @@ sap.ui.define([
390
457
  * A (temporary) key predicate for the transient entity: "($uid=...)"
391
458
  * @param {object} oEntityData
392
459
  * The initial entity data, already cloned and cleaned of client-side annotations (except
393
- * "@$ui5.node.parent" which contains the OData ID string needed for "...@odata.bind")
460
+ * "@$ui5.node.parent" which contains the optional OData ID string needed for
461
+ * "...@odata.bind")
394
462
  * @param {boolean} bAtEndOfCreated
395
463
  * Whether the newly created entity should be inserted after previously created entities or at
396
464
  * the front of the list.
@@ -403,31 +471,32 @@ sap.ui.define([
403
471
  * A promise which is resolved with the created entity when the POST request has been
404
472
  * successfully sent and the entity has been marked as non-transient
405
473
  * @throws {Error}
406
- * If <code>this.oAggregation.expandTo > 1</code>, <code>bAtEndOfCreated</code> is set, or the
407
- * parent is collapsed
474
+ * If <code>bAtEndOfCreated</code> is set or the parent is collapsed
408
475
  *
409
476
  * @public
410
477
  */
411
478
  // @override sap.ui.model.odata.v4.lib._Cache#create
412
479
  _AggregationCache.prototype.create = function (oGroupLock, oPostPathPromise, sPath,
413
480
  sTransientPredicate, oEntityData, bAtEndOfCreated, fnErrorCallback, fnSubmitCallback) {
414
- if (this.oAggregation.expandTo > 1) {
415
- throw new Error("Unsupported expandTo: " + this.oAggregation.expandTo);
416
- }
417
481
  if (bAtEndOfCreated) {
418
482
  throw new Error("Unsupported bAtEndOfCreated");
419
483
  }
420
484
 
421
- const aElements = this.aElements;
422
485
  const sParentPath = oEntityData["@$ui5.node.parent"];
423
- const sParentPredicate = sParentPath.slice(sParentPath.indexOf("("));
486
+ delete oEntityData["@$ui5.node.parent"];
487
+ const sParentPredicate = sParentPath?.slice(sParentPath.indexOf("("));
488
+ const aElements = this.aElements;
424
489
  const oParentNode = aElements.$byPredicate[sParentPredicate];
425
- if (oParentNode["@$ui5.node.isExpanded"] === false) {
490
+ if (oParentNode?.["@$ui5.node.isExpanded"] === false) {
426
491
  throw new Error("Unsupported collapsed parent: " + sParentPath);
427
492
  }
428
- const iIndex = aElements.indexOf(oParentNode) + 1;
429
493
 
430
- let oCache = _Helper.getPrivateAnnotation(oParentNode, "cache");
494
+ const iLevel = oParentNode
495
+ ? oParentNode["@$ui5.node.level"] + 1
496
+ : 1;
497
+ let oCache = iLevel > (this.oAggregation.expandTo || 1)
498
+ ? _Helper.getPrivateAnnotation(oParentNode, "cache")
499
+ : this.oFirstLevel;
431
500
  if (!oCache) {
432
501
  oCache = this.createGroupLevelCache(oParentNode);
433
502
  oCache.setEmpty();
@@ -436,32 +505,37 @@ sap.ui.define([
436
505
  {"@$ui5.node.isExpanded" : true}); // not a leaf anymore
437
506
  }
438
507
 
439
- delete oEntityData["@$ui5.node.parent"];
440
- const oResult = oCache.create(oGroupLock, oPostPathPromise, sPath, sTransientPredicate,
441
- oEntityData, bAtEndOfCreated, fnErrorCallback, fnSubmitCallback, function onCancel() {
442
- this.shiftIndex(iIndex, -1);
508
+ const iIndex = aElements.indexOf(oParentNode) + 1; // 0 w/o oParentNode :-)
509
+ const oPromise = oCache.create(oGroupLock, oPostPathPromise, sPath, sTransientPredicate,
510
+ oEntityData, bAtEndOfCreated, fnErrorCallback, fnSubmitCallback, /*onCancel*/() => {
511
+ if (oCache === this.oFirstLevel) {
512
+ this.adjustDescendantCount(oEntityData, iIndex, -1);
513
+ }
443
514
  aElements.$count -= 1;
444
515
  delete aElements.$byPredicate[
445
516
  _Helper.getPrivateAnnotation(oEntityData, "transientPredicate")];
446
- aElements.splice(aElements.indexOf(oEntityData), 1);
447
- }.bind(this));
517
+ aElements.splice(iIndex, 1);
518
+ });
448
519
 
449
- // add @odata.bind to POST body only
450
- _Helper.getPrivateAnnotation(oEntityData, "postBody")
451
- [this.oAggregation.$ParentNavigationProperty + "@odata.bind"]
452
- = _Helper.makeRelativeUrl("/" + sParentPath, "/" + this.sResourcePath);
453
- oEntityData["@$ui5.node.level"] = oParentNode["@$ui5.node.level"] + 1;
520
+ if (sParentPath) { // add @odata.bind to POST body only
521
+ _Helper.getPrivateAnnotation(oEntityData, "postBody")
522
+ [this.oAggregation.$ParentNavigationProperty + "@odata.bind"]
523
+ = _Helper.makeRelativeUrl("/" + sParentPath, "/" + this.sResourcePath);
524
+ }
525
+ oEntityData["@$ui5.node.level"] = iLevel; // do not send via POST!
454
526
 
455
527
  aElements.splice(iIndex, 0, null); // create a gap
456
- this.addElements(oEntityData, iIndex, oCache, 0);
528
+ this.addElements(oEntityData, iIndex, oCache); // $skip index is undefined!
457
529
  aElements.$count += 1;
458
- // increase "index" for all children of oCache;
459
- // oParentNode is expanded, thus all such nodes or placeholders are inside aElements
460
- this.shiftIndex(iIndex, +1);
530
+ if (oCache === this.oFirstLevel) {
531
+ this.adjustDescendantCount(oEntityData, iIndex, +1);
532
+ }
461
533
 
462
- return oResult.then(function () {
534
+ return oPromise.then(function () {
463
535
  aElements.$byPredicate[_Helper.getPrivateAnnotation(oEntityData, "predicate")]
464
536
  = oEntityData;
537
+ // Note: #calculateKeyPredicateRH doesn't know better :-(
538
+ oEntityData["@$ui5.node.level"] = iLevel;
465
539
 
466
540
  return oEntityData;
467
541
  });
@@ -564,16 +638,28 @@ sap.ui.define([
564
638
  this.aElements.$byPredicate = aOldElements.$byPredicate;
565
639
  iCount = aSpliced.length;
566
640
  this.aElements.$count = aOldElements.$count + iCount;
567
- const iDiff = oGroupNode["@$ui5.node.level"] + 1 - aSpliced[0]["@$ui5.node.level"];
641
+ const iLevelDiff = oGroupNode["@$ui5.node.level"] + 1 - aSpliced[0]["@$ui5.node.level"];
642
+ const iIndexDiff = _Helper.getPrivateAnnotation(oGroupNode, "index") - aSpliced.$index;
568
643
  aSpliced.forEach(function (oElement) {
569
644
  var sPredicate = _Helper.getPrivateAnnotation(oElement, "predicate");
570
645
 
571
- oElement["@$ui5.node.level"] += iDiff;
646
+ oElement["@$ui5.node.level"] += iLevelDiff;
647
+ if (_Helper.getPrivateAnnotation(oElement, "parent") === that.oFirstLevel) {
648
+ const iIndex = _Helper.getPrivateAnnotation(oElement, "index");
649
+ if (iIndex !== undefined) {
650
+ _Helper.setPrivateAnnotation(oElement, "index", iIndex + iIndexDiff);
651
+ }
652
+ }
572
653
  if (!_Helper.hasPrivateAnnotation(oElement, "placeholder")) {
573
654
  if (aSpliced.$stale) {
574
655
  that.turnIntoPlaceholder(oElement, sPredicate);
575
656
  } else {
576
657
  that.aElements.$byPredicate[sPredicate] = oElement;
658
+ const sTransientPredicate
659
+ = _Helper.getPrivateAnnotation(oElement, "transientPredicate");
660
+ if (sTransientPredicate) {
661
+ that.aElements.$byPredicate[sTransientPredicate] = oElement;
662
+ }
577
663
  if (_Helper.hasPrivateAnnotation(oElement, "expanding")) {
578
664
  _Helper.deletePrivateAnnotation(oElement, "expanding");
579
665
  iCount += that.expand(_GroupLock.$cached, oElement).getResult();
@@ -778,6 +864,36 @@ sap.ui.define([
778
864
  return this.sDownloadUrl;
779
865
  };
780
866
 
867
+ /**
868
+ * Returns the index of a parent node
869
+ *
870
+ * @param {number} iIndex
871
+ * The index of the child node
872
+ * @returns {number|null}
873
+ * The parent node's index, or -1 if the given node is a root node and thus has
874
+ * no parent
875
+ * @throws {Error}
876
+ * If the index of a parent cannot be found
877
+ *
878
+ *
879
+ * @public
880
+ */
881
+ _AggregationCache.prototype.getParentIndex = function (iIndex) {
882
+ const iLevel = this.aElements[iIndex]["@$ui5.node.level"];
883
+
884
+ if (iLevel <= 1) {
885
+ return -1; // a root has no parent
886
+ }
887
+
888
+ for (; iIndex >= 0; iIndex -= 1) {
889
+ if (this.aElements[iIndex]["@$ui5.node.level"] < iLevel) {
890
+ return iIndex;
891
+ }
892
+ }
893
+
894
+ throw new Error("Unexpected error");
895
+ };
896
+
781
897
  /**
782
898
  * @override
783
899
  * @see sap.ui.model.odata.v4.lib._Cache#getValue
@@ -792,6 +908,31 @@ sap.ui.define([
792
908
  oSyncPromise.caught();
793
909
  };
794
910
 
911
+ /**
912
+ * Tells whether the first given node is an ancestor of (or the same as) the second given node
913
+ * (in case of a recursive hierarchy).
914
+ *
915
+ * @param {number} iAncestor - Index of some node which may be an ancestor
916
+ * @param {number} iDescendant - Index of some node which may be a descendant
917
+ * @returns {boolean} Whether the assumed ancestor relation holds
918
+ *
919
+ * @public
920
+ */
921
+ _AggregationCache.prototype.isAncestorOf = function (iAncestor, iDescendant) {
922
+ if (iDescendant === iAncestor) { // "or the same as"
923
+ return true;
924
+ }
925
+ if (iDescendant < iAncestor
926
+ || !this.aElements[iAncestor]["@$ui5.node.isExpanded"]
927
+ || this.aElements[iAncestor]["@$ui5.node.level"]
928
+ >= this.aElements[iDescendant]["@$ui5.node.level"]) { // impossible
929
+ return false;
930
+ }
931
+
932
+ return iDescendant
933
+ <= iAncestor + this.countDescendants(this.aElements[iAncestor], iAncestor);
934
+ };
935
+
795
936
  /**
796
937
  * @override
797
938
  * @see sap.ui.model.odata.v4.lib._Cache#isDeletingInOtherGroup
@@ -802,7 +943,7 @@ sap.ui.define([
802
943
 
803
944
  /**
804
945
  * Determines the list of elements determined by the given predicates. All other elements are
805
- * turned into placeholders (lazily).
946
+ * turned into placeholders (lazily), except transient ones.
806
947
  *
807
948
  * @param {string[]} aPredicates
808
949
  * The key predicates of the elements to request side effects for
@@ -824,6 +965,10 @@ sap.ui.define([
824
965
  return this.aElements.filter(function (oElement) {
825
966
  var sPredicate = _Helper.getPrivateAnnotation(oElement, "predicate");
826
967
 
968
+ if (!sPredicate) {
969
+ return; // keep transient elements "as is"
970
+ }
971
+
827
972
  if (mPredicates[sPredicate]) {
828
973
  _AggregationHelper.markSplicedStale(oElement);
829
974
  return true; // keep and request
@@ -833,9 +978,25 @@ sap.ui.define([
833
978
  });
834
979
  };
835
980
 
981
+ /**
982
+ * Makes the given element a leaf.
983
+ *
984
+ * @param {object} oElement - The element
985
+ *
986
+ * @private
987
+ */
988
+ _AggregationCache.prototype.makeLeaf = function (oElement) {
989
+ _Helper.updateAll(this.mChangeListeners,
990
+ _Helper.getPrivateAnnotation(oElement, "predicate"), oElement,
991
+ {"@$ui5.node.isExpanded" : undefined});
992
+ // _Helper.updateAll only sets it to undefined
993
+ delete oElement["@$ui5.node.isExpanded"];
994
+ };
995
+
836
996
  /**
837
997
  * Moves the (child) node with the given path to the parent node with the given path by sending
838
- * a PATCH request for "<parent navigation>@odata.bind".
998
+ * a PATCH request for "<parent navigation>@odata.bind". The (child) node may be a leaf or a
999
+ * collapsed node, but not expanded!
839
1000
  *
840
1001
  * @param {sap.ui.model.odata.v4.lib._GroupLock} oGroupLock
841
1002
  * A lock for the group to associate the requests with
@@ -843,58 +1004,79 @@ sap.ui.define([
843
1004
  * The (child) node's path relative to the cache
844
1005
  * @param {string} sParentPath
845
1006
  * The parent node's path relative to the cache
846
- * @returns {sap.ui.base.SyncPromise<void>}
847
- * A promise which is resolved without a defined result when the move is finished, or
848
- * rejected in case of an error
1007
+ * @returns {sap.ui.base.SyncPromise<number>}
1008
+ * A promise which is resolved with the number of child nodes added (normally one, but maybe
1009
+ * more in case parent node was collapsed before) when the move is finished, or rejected in
1010
+ * case of an error
849
1011
  *
850
1012
  * @public
851
1013
  */
852
1014
  _AggregationCache.prototype.move = function (oGroupLock, sChildPath, sParentPath) {
1015
+ const sTransientPredicate = "($uid=" + _Helper.uid() + ")";
1016
+
853
1017
  const sChildPredicate = sChildPath.slice(sChildPath.indexOf("("));
854
1018
  const oChildNode = this.aElements.$byPredicate[sChildPredicate];
1019
+ const sParentPredicate = sParentPath.slice(sParentPath.indexOf("("));
1020
+ const oParentNode = this.aElements.$byPredicate[sParentPredicate];
855
1021
 
856
- return this.oRequestor.request("PATCH", sChildPath, oGroupLock, {
1022
+ let oReadPromise;
1023
+ let oCache = _Helper.getPrivateAnnotation(oParentNode, "cache");
1024
+ if (!oCache && oParentNode["@$ui5.node.isExpanded"] === false) {
1025
+ oCache = this.createGroupLevelCache(oParentNode);
1026
+ // @see #getExclusiveFilter
1027
+ oCache.restoreElement(undefined, 0, oChildNode, "", undefined, sTransientPredicate);
1028
+ // prefetch from the group level cache
1029
+ oReadPromise = oCache.read(0, this.iReadLength, 0, oGroupLock.getUnlockedCopy());
1030
+ }
1031
+
1032
+ return SyncPromise.all([
1033
+ this.oRequestor.request("PATCH", sChildPath, oGroupLock, {
857
1034
  "If-Match" : oChildNode,
858
1035
  Prefer : "return=minimal"
859
1036
  }, {[this.oAggregation.$ParentNavigationProperty + "@odata.bind"] : sParentPath},
860
- /*fnSubmit*/null, function fnCancel() { /*nothing to do*/ })
861
- .then((oPatchResult) => {
862
- // update the cache with the PATCH response (Note: "@odata.etag" is optional!)
863
- _Helper.updateExisting(this.mChangeListeners, sChildPredicate, oChildNode,
864
- {"@odata.etag" : oPatchResult["@odata.etag"]});
865
-
866
- const iOldIndex = this.aElements.indexOf(oChildNode);
867
- this.shiftIndex(iOldIndex, -1);
868
- this.aElements.splice(iOldIndex, 1);
869
-
870
- // remove original element from its cache's collection
871
- const oOldParentCache = _Helper.getPrivateAnnotation(oChildNode, "parent");
872
- oOldParentCache.removeElement(undefined,
873
- _Helper.getPrivateAnnotation(oChildNode, "index"), sChildPredicate, "");
874
- if (oOldParentCache.getValue("$count") === 0) { // last child has gone
875
- const oOldParent = this.aElements[iOldIndex - 1];
876
- _Helper.updateAll(this.mChangeListeners,
877
- _Helper.getPrivateAnnotation(oOldParent, "predicate"),
878
- oOldParent, {"@$ui5.node.isExpanded" : undefined}); // a leaf now
879
- // _Helper.updateAll only sets it to undefined
880
- delete oOldParent["@$ui5.node.isExpanded"];
881
- _Helper.deletePrivateAnnotation(oOldParent, "cache");
882
- oOldParentCache.setActive(false);
883
- }
1037
+ /*fnSubmit*/null, function fnCancel() { /*nothing to do*/ }),
1038
+ oReadPromise
1039
+ ]).then(([oPatchResult, _oReadResult]) => {
1040
+ const iOldIndex = this.aElements.indexOf(oChildNode);
1041
+ // update the cache with the PATCH response (Note: "@odata.etag" is optional!)
1042
+ _Helper.updateExisting(this.mChangeListeners, sChildPredicate, oChildNode, {
1043
+ "@odata.etag" : oPatchResult["@odata.etag"],
1044
+ "@$ui5.node.level" : oParentNode["@$ui5.node.level"] + 1
1045
+ });
884
1046
 
885
- // once oChildNode has moved, it should look 'created' because of its new position
886
- if (!_Helper.hasPrivateAnnotation(oChildNode, "transientPredicate")) {
887
- const sTransientPredicate = "($uid=" + _Helper.uid() + ")";
888
- _Helper.setPrivateAnnotation(oChildNode, "transientPredicate",
889
- sTransientPredicate);
890
- this.aElements.$byPredicate[sTransientPredicate] = oChildNode;
891
- _Helper.updateAll(this.mChangeListeners, sChildPredicate, oChildNode,
892
- {"@$ui5.context.isTransient" : false});
893
- }
1047
+ // remove original element from its cache's collection
1048
+ const oOldParentCache = _Helper.getPrivateAnnotation(oChildNode, "parent");
1049
+ oOldParentCache.removeElement(_Helper.getPrivateAnnotation(oChildNode, "index", 0),
1050
+ sChildPredicate);
1051
+ if (oOldParentCache.getValue("$count") === 0) { // last child has gone
1052
+ const oOldParent = this.aElements[iOldIndex - 1];
1053
+ this.makeLeaf(oOldParent);
1054
+ _Helper.deletePrivateAnnotation(oOldParent, "cache");
1055
+ oOldParentCache.setActive(false);
1056
+ }
894
1057
 
895
- const sParentPredicate = sParentPath.slice(sParentPath.indexOf("("));
896
- const oParentNode = this.aElements.$byPredicate[sParentPredicate];
897
- let oCache = _Helper.getPrivateAnnotation(oParentNode, "cache");
1058
+ // once oChildNode has moved, it should look 'created' because of its new position
1059
+ _Helper.deletePrivateAnnotation(oChildNode, "index");
1060
+ if (!_Helper.hasPrivateAnnotation(oChildNode, "transientPredicate")) {
1061
+ _Helper.setPrivateAnnotation(oChildNode, "transientPredicate",
1062
+ sTransientPredicate);
1063
+ this.aElements.$byPredicate[sTransientPredicate] = oChildNode;
1064
+ _Helper.updateAll(this.mChangeListeners, sChildPredicate, oChildNode,
1065
+ {"@$ui5.context.isTransient" : false});
1066
+ this.shiftIndex(iOldIndex, -1); // only shift indices after non-created ones
1067
+ }
1068
+ this.aElements.splice(iOldIndex, 1);
1069
+
1070
+ let iResult = 1;
1071
+ if (oReadPromise) {
1072
+ _Helper.setPrivateAnnotation(oChildNode, "parent", oCache);
1073
+ _Helper.setPrivateAnnotation(oParentNode, "cache", oCache);
1074
+ // Note: "@$ui5.node.level" will be created by #expand for oChildNode's siblings
1075
+ // Note: oChildNode already belongs to oCache!
1076
+ this.aElements.$count -= 1; // #expand adjusts $count incl. oChildNode!
1077
+ iResult = this.expand(_GroupLock.$cached, sParentPredicate).unwrap();
1078
+ // Note: "index" created OK by #expand for oChildNode's siblings
1079
+ } else {
898
1080
  if (!oCache) {
899
1081
  oCache = this.createGroupLevelCache(oParentNode);
900
1082
  oCache.setEmpty();
@@ -902,16 +1084,24 @@ sap.ui.define([
902
1084
  _Helper.updateAll(this.mChangeListeners, sParentPredicate, oParentNode,
903
1085
  {"@$ui5.node.isExpanded" : true}); // not a leaf anymore
904
1086
  }
905
- oCache.restoreElement(undefined, 0, oChildNode, "");
906
- _Helper.setPrivateAnnotation(oChildNode, "index", 0);
907
1087
  _Helper.setPrivateAnnotation(oChildNode, "parent", oCache);
1088
+ oCache.restoreElement(undefined, 0, oChildNode, "");
908
1089
 
909
- _Helper.updateAll(this.mChangeListeners, sChildPredicate, oChildNode,
910
- {"@$ui5.node.level" : oParentNode["@$ui5.node.level"] + 1});
911
1090
  const iNewIndex = this.aElements.indexOf(oParentNode) + 1;
912
- this.aElements.splice(iNewIndex, 0, oChildNode);
913
- this.shiftIndex(iNewIndex, +1); // relies on "parent" & "@$ui5.node.level"!
914
- });
1091
+ const aSpliced = _Helper.getPrivateAnnotation(oParentNode, "spliced");
1092
+ if (aSpliced) {
1093
+ // Note: "@$ui5.node.level" will be adjusted by #expand for aSpliced!
1094
+ oChildNode["@$ui5.node.level"] = aSpliced[0]["@$ui5.node.level"];
1095
+ aSpliced.unshift(oChildNode);
1096
+ this.aElements.$count -= 1; // #expand adjusts $count incl. oChildNode!
1097
+ iResult = this.expand(_GroupLock.$cached, sParentPredicate).unwrap();
1098
+ } else {
1099
+ this.aElements.splice(iNewIndex, 0, oChildNode);
1100
+ }
1101
+ }
1102
+
1103
+ return iResult;
1104
+ });
915
1105
  };
916
1106
 
917
1107
  /**
@@ -1014,6 +1204,7 @@ sap.ui.define([
1014
1204
  && _Helper.getPrivateAnnotation(oElement, "index")
1015
1205
  !== _Helper.getPrivateAnnotation(this.aElements[i - 1], "index") + 1) {
1016
1206
  // Note: w/ side effect, indices might not be consecutive => split gap
1207
+ // Note: an undefined "index" causes a split gap, which is important!
1017
1208
  readGap(iGapStart, i);
1018
1209
  iGapStart = i;
1019
1210
  }
@@ -1156,7 +1347,8 @@ sap.ui.define([
1156
1347
  };
1157
1348
 
1158
1349
  /**
1159
- * Reads the given gap from the given cache and replaces the gap with the read's result.
1350
+ * Reads the given gap from the given cache and replaces the gap with the read's result. This
1351
+ * method may be used for single created persisted elements in order to refresh them.
1160
1352
  *
1161
1353
  * @param {sap.ui.model.odata.v4.lib._CollectionCache} oCache
1162
1354
  * The collection cache to read data from
@@ -1172,40 +1364,51 @@ sap.ui.define([
1172
1364
  * @returns {sap.ui.base.SyncPromise}
1173
1365
  * A promise which is resolved without a defined result when the read is finished, or
1174
1366
  * rejected in case of an error
1175
- * @throws {Error} If index of placeholder at start of gap is less than 0, or if end of gap is
1176
- * before start
1367
+ * @throws {Error} If index of placeholder at start of gap is less than 0, if end of gap is
1368
+ * before start, or if more than a single created persisted element is read
1177
1369
  *
1178
1370
  * @private
1179
1371
  */
1180
1372
  _AggregationCache.prototype.readGap = function (oCache, iStart, iEnd, oGroupLock,
1181
1373
  fnDataRequested) {
1182
- var sPredicate,
1183
- oPromise,
1184
- mQueryOptions = oCache.getQueryOptions(),
1185
- iIndex = _Helper.getPrivateAnnotation(this.aElements[iStart], "index"),
1186
- oStartElement = this.aElements[iStart],
1187
- i,
1188
- that = this;
1374
+ const oStartElement = this.aElements[iStart];
1375
+ const iIndex = _Helper.getPrivateAnnotation(oStartElement, "index");
1376
+ if (iIndex === undefined) {
1377
+ if (iEnd - iStart !== 1) {
1378
+ throw new Error("Not just a single created persisted");
1379
+ }
1380
+ const sPredicate = _Helper.getPrivateAnnotation(oStartElement, "predicate");
1381
+ const oPromise = oCache.refreshSingle(oGroupLock, "", -1, sPredicate,
1382
+ /*bKeepAlive*/true, false, fnDataRequested)
1383
+ .then((oElement) => {
1384
+ // make sure that ODLB reuses the same context instance
1385
+ _Helper.copyPrivateAnnotation(oStartElement, "context", oElement);
1386
+ this.addElements(oElement, iStart, oCache); // $skip index is undefined!
1387
+ });
1388
+ this.aElements.$byPredicate[sPredicate] = oPromise;
1389
+ return oPromise;
1390
+ }
1189
1391
 
1392
+ const mQueryOptions = oCache.getQueryOptions();
1190
1393
  if (mQueryOptions.$count) { // $count not needed anymore, 1st read was done by #expand
1191
1394
  delete mQueryOptions.$count;
1192
1395
  oCache.setQueryOptions(mQueryOptions, true);
1193
1396
  }
1194
1397
 
1195
- oPromise = oCache.read(iIndex, iEnd - iStart, 0, oGroupLock, fnDataRequested)
1196
- .then(function (oResult) {
1398
+ const oPromise = oCache.read(iIndex, iEnd - iStart, 0, oGroupLock, fnDataRequested, true)
1399
+ .then((oResult) => {
1197
1400
  // Note: this code must be idempotent, it might well run twice!
1198
1401
  var bGapHasMoved = false,
1199
1402
  oError;
1200
1403
 
1201
1404
  // Note: aElements[iGapStart] may have changed by a parallel operation
1202
- if (oStartElement !== that.aElements[iStart]
1203
- && oResult.value[0] !== that.aElements[iStart]) {
1405
+ if (oStartElement !== this.aElements[iStart]
1406
+ && oResult.value[0] !== this.aElements[iStart]) {
1204
1407
  // start of the gap has moved meanwhile
1205
1408
  bGapHasMoved = true;
1206
- iStart = that.aElements.indexOf(oStartElement);
1409
+ iStart = this.aElements.indexOf(oStartElement);
1207
1410
  if (iStart < 0) {
1208
- iStart = that.aElements.indexOf(oResult.value[0]);
1411
+ iStart = this.aElements.indexOf(oResult.value[0]);
1209
1412
  if (iStart < 0) {
1210
1413
  oError = new Error("Collapse before read has finished");
1211
1414
  oError.canceled = true;
@@ -1214,7 +1417,7 @@ sap.ui.define([
1214
1417
  }
1215
1418
  }
1216
1419
 
1217
- that.addElements(oResult.value, iStart, oCache, iIndex);
1420
+ this.addElements(oResult.value, iStart, oCache, iIndex);
1218
1421
 
1219
1422
  if (bGapHasMoved) {
1220
1423
  oError = new Error("Collapse or expand before read has finished");
@@ -1223,8 +1426,8 @@ sap.ui.define([
1223
1426
  }
1224
1427
  });
1225
1428
  if (oPromise.isPending()) {
1226
- for (i = iStart; i < iEnd; i += 1) {
1227
- sPredicate = _Helper.getPrivateAnnotation(this.aElements[i], "predicate");
1429
+ for (let i = iStart; i < iEnd; i += 1) {
1430
+ const sPredicate = _Helper.getPrivateAnnotation(this.aElements[i], "predicate");
1228
1431
 
1229
1432
  if (sPredicate) {
1230
1433
  this.aElements.$byPredicate[sPredicate] = oPromise;
@@ -1309,13 +1512,14 @@ sap.ui.define([
1309
1512
  };
1310
1513
 
1311
1514
  /**
1312
- * Shifts the "index" of all siblings (nodes or placeholders) after the node at the given index
1313
- * by the given offset.
1515
+ * Shifts the $skip "index" of all siblings (nodes or placeholders) after the node at the given
1516
+ * index by the given offset, except for created elements (where it is always
1517
+ * <code>undefined</code>).
1314
1518
  *
1315
1519
  * @param {number} iIndex
1316
- * Index in <code>this.aElements</code> of a node which is inserted (+1) or removed (-1)
1520
+ * Index in <code>this.aElements</code> of a node
1317
1521
  * @param {number} iOffset
1318
- * Offset (either -1 or +1) to add to "index"
1522
+ * Offset to add to "index"
1319
1523
  *
1320
1524
  * @private
1321
1525
  */
@@ -1326,14 +1530,15 @@ sap.ui.define([
1326
1530
  for (let i = iIndex + 1; i < aElements.length; i += 1) {
1327
1531
  const oSibling = aElements[i];
1328
1532
  if (_Helper.getPrivateAnnotation(oSibling, "parent") === oCache) {
1329
- _Helper.setPrivateAnnotation(oSibling, "index",
1330
- _Helper.getPrivateAnnotation(oSibling, "index") + iOffset);
1533
+ const iIndex = _Helper.getPrivateAnnotation(oSibling, "index");
1534
+ if (iIndex !== undefined) {
1535
+ _Helper.setPrivateAnnotation(oSibling, "index", iIndex + iOffset);
1536
+ }
1331
1537
  }
1332
- if (oSibling["@$ui5.node.level"] < oNode["@$ui5.node.level"]
1333
- && !_Helper.hasPrivateAnnotation(oSibling, "placeholder")) {
1334
- // Note: level 0 means "don't know" for initial *placeholders* of 1st level cache!
1335
- // Note: oCache !== this.oFirstLevel, thus "descendants" should not matter
1336
- break;
1538
+ if (oCache !== this.oFirstLevel
1539
+ && oSibling["@$ui5.node.level"] < oNode["@$ui5.node.level"]) {
1540
+ // Note: placeholders with level 0 only exist in 1st level cache!
1541
+ break; // no use in searching further
1337
1542
  }
1338
1543
  }
1339
1544
  };
@@ -1354,8 +1559,8 @@ sap.ui.define([
1354
1559
  /**
1355
1560
  * Turns the given element, which has the given predicate, into a placeholder which keeps all
1356
1561
  * private annotations plus the hierarchy node value. The original element is removed from its
1357
- * corresponding cache and must not be used any longer. Created persisted elements loose their
1358
- * special treatment!
1562
+ * corresponding cache and must not be used any longer. Created persisted elements do not lose
1563
+ * their special treatment!
1359
1564
  *
1360
1565
  * @param {object} oElement - An element
1361
1566
  * @param {string} sPredicate - Its predicate
@@ -1371,8 +1576,10 @@ sap.ui.define([
1371
1576
  _AggregationHelper.markSplicedStale(oElement);
1372
1577
  delete this.aElements.$byPredicate[sPredicate];
1373
1578
  // drop original element from its cache's collection
1374
- _Helper.getPrivateAnnotation(oElement, "parent")
1375
- .drop(_Helper.getPrivateAnnotation(oElement, "index"), sPredicate);
1579
+ const iIndex = _Helper.getPrivateAnnotation(oElement, "index");
1580
+ if (iIndex !== undefined) {
1581
+ _Helper.getPrivateAnnotation(oElement, "parent").drop(iIndex, sPredicate, true);
1582
+ } // else: special handling inside #readGap
1376
1583
  };
1377
1584
 
1378
1585
  //*********************************************************************************************