@openui5/sap.ui.core 1.136.1 → 1.138.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/.eslintrc.json +3 -3
  2. package/REUSE.toml +0 -28
  3. package/THIRDPARTY.txt +1 -25
  4. package/package.json +1 -1
  5. package/src/jquery.sap.global.js +1 -1
  6. package/src/jquery.sap.properties.js +1 -1
  7. package/src/jquery.sap.resources.js +1 -1
  8. package/src/jquery.sap.script.js +1 -1
  9. package/src/jquery.sap.storage.js +3 -3
  10. package/src/sap/base/Event.js +1 -1
  11. package/src/sap/base/Eventing.js +1 -1
  12. package/src/sap/base/config.js +1 -1
  13. package/src/sap/base/i18n/LanguageTag.js +1 -1
  14. package/src/sap/base/i18n/date/TimezoneUtils.js +1 -1
  15. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  16. package/src/sap/base/util/restricted/_castArray.js +1 -1
  17. package/src/sap/base/util/restricted/_compact.js +1 -1
  18. package/src/sap/base/util/restricted/_curry.js +1 -1
  19. package/src/sap/base/util/restricted/_debounce.js +1 -1
  20. package/src/sap/base/util/restricted/_difference.js +1 -1
  21. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  22. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  23. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  24. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  25. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  26. package/src/sap/base/util/restricted/_flatten.js +1 -1
  27. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  28. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  29. package/src/sap/base/util/restricted/_intersection.js +1 -1
  30. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  31. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  32. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  33. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  34. package/src/sap/base/util/restricted/_isNil.js +1 -1
  35. package/src/sap/base/util/restricted/_max.js +1 -1
  36. package/src/sap/base/util/restricted/_merge.js +1 -1
  37. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  38. package/src/sap/base/util/restricted/_min.js +1 -1
  39. package/src/sap/base/util/restricted/_omit.js +1 -1
  40. package/src/sap/base/util/restricted/_pick.js +1 -1
  41. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  42. package/src/sap/base/util/restricted/_throttle.js +1 -1
  43. package/src/sap/base/util/restricted/_toArray.js +1 -1
  44. package/src/sap/base/util/restricted/_union.js +1 -1
  45. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  46. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  47. package/src/sap/base/util/restricted/_uniq.js +1 -1
  48. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  49. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  50. package/src/sap/base/util/restricted/_without.js +1 -1
  51. package/src/sap/base/util/restricted/_xor.js +1 -1
  52. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  53. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  54. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  55. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  56. package/src/sap/ui/Device.js +3 -3
  57. package/src/sap/ui/Global.js +3 -3
  58. package/src/sap/ui/base/BindingInfo.js +12 -8
  59. package/src/sap/ui/base/BindingParser.js +14 -7
  60. package/src/sap/ui/base/Event.js +1 -1
  61. package/src/sap/ui/base/EventProvider.js +1 -8
  62. package/src/sap/ui/base/Interface.js +1 -1
  63. package/src/sap/ui/base/ManagedObject.js +15 -42
  64. package/src/sap/ui/base/ManagedObjectMetadata.js +1 -1
  65. package/src/sap/ui/base/Metadata.js +1 -1
  66. package/src/sap/ui/base/Object.js +1 -1
  67. package/src/sap/ui/base/ObjectPool.js +1 -1
  68. package/src/sap/ui/base/_runWithOwner.js +43 -0
  69. package/src/sap/ui/core/.library +3 -30
  70. package/src/sap/ui/core/BusyIndicator.js +8 -8
  71. package/src/sap/ui/core/Component.js +61 -73
  72. package/src/sap/ui/core/ComponentContainer.js +22 -2
  73. package/src/sap/ui/core/ComponentMetadata.js +1 -1
  74. package/src/sap/ui/core/ComponentSupport.js +1 -1
  75. package/src/sap/ui/core/Configuration.js +1 -1
  76. package/src/sap/ui/core/Control.js +1 -1
  77. package/src/sap/ui/core/Core.js +2 -2
  78. package/src/sap/ui/core/CustomData.js +1 -1
  79. package/src/sap/ui/core/DeclarativeSupport.js +13 -11
  80. package/src/sap/ui/core/Element.js +1 -3
  81. package/src/sap/ui/core/ElementMetadata.js +1 -1
  82. package/src/sap/ui/core/EnabledPropagator.js +1 -1
  83. package/src/sap/ui/core/EventBus.js +1 -1
  84. package/src/sap/ui/core/ExtensionPoint.js +4 -4
  85. package/src/sap/ui/core/Fragment.js +4 -2
  86. package/src/sap/ui/core/HTML.js +1 -1
  87. package/src/sap/ui/core/History.js +1 -1
  88. package/src/sap/ui/core/Icon.js +1 -1
  89. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  90. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  91. package/src/sap/ui/core/InvisibleMessage.js +1 -1
  92. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  93. package/src/sap/ui/core/InvisibleText.js +1 -1
  94. package/src/sap/ui/core/Item.js +1 -1
  95. package/src/sap/ui/core/LabelEnablement.js +1 -1
  96. package/src/sap/ui/core/LayoutData.js +1 -1
  97. package/src/sap/ui/core/ListItem.js +1 -1
  98. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  99. package/src/sap/ui/core/Locale.js +1 -1
  100. package/src/sap/ui/core/LocaleData.js +1 -1
  101. package/src/sap/ui/core/Manifest.js +1 -1
  102. package/src/sap/ui/core/Message.js +1 -1
  103. package/src/sap/ui/core/Popup.js +65 -180
  104. package/src/sap/ui/core/RenderManager.js +1 -1
  105. package/src/sap/ui/core/Renderer.js +1 -1
  106. package/src/sap/ui/core/ResizeHandler.js +1 -1
  107. package/src/sap/ui/core/ScrollBar.js +1 -1
  108. package/src/sap/ui/core/SeparatorItem.js +1 -1
  109. package/src/sap/ui/core/Theming.js +2 -2
  110. package/src/sap/ui/core/Title.js +1 -1
  111. package/src/sap/ui/core/TooltipBase.js +1 -1
  112. package/src/sap/ui/core/UIArea.js +1 -1
  113. package/src/sap/ui/core/UIComponent.js +11 -56
  114. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  115. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  116. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  117. package/src/sap/ui/core/XMLComposite.js +1 -1
  118. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  119. package/src/sap/ui/core/XMLTemplateProcessor.js +5 -1
  120. package/src/sap/ui/core/_IconRegistry.js +2 -0
  121. package/src/sap/ui/core/date/UI5Date.js +1 -1
  122. package/src/sap/ui/core/delegate/ItemNavigation.js +2 -2
  123. package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
  124. package/src/sap/ui/core/dnd/DragDropBase.js +12 -2
  125. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  126. package/src/sap/ui/core/dnd/DragInfo.js +5 -3
  127. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  128. package/src/sap/ui/core/format/FormatUtils.js +1 -1
  129. package/src/sap/ui/core/format/TimezoneUtil.js +1 -1
  130. package/src/sap/ui/core/getCompatibilityVersion.js +1 -1
  131. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  132. package/src/sap/ui/core/i18n/interaction_ar.xml +27 -0
  133. package/src/sap/ui/core/i18n/interaction_bg.xml +27 -0
  134. package/src/sap/ui/core/i18n/interaction_ca.xml +27 -0
  135. package/src/sap/ui/core/i18n/interaction_cnr.xml +27 -0
  136. package/src/sap/ui/core/i18n/interaction_cs.xml +27 -0
  137. package/src/sap/ui/core/i18n/interaction_cy.xml +27 -0
  138. package/src/sap/ui/core/i18n/interaction_da.xml +27 -0
  139. package/src/sap/ui/core/i18n/interaction_de.xml +27 -0
  140. package/src/sap/ui/core/i18n/interaction_el.xml +27 -0
  141. package/src/sap/ui/core/i18n/interaction_en.xml +27 -0
  142. package/src/sap/ui/core/i18n/interaction_en_GB.xml +27 -0
  143. package/src/sap/ui/core/i18n/interaction_en_US_saprigi.xml +27 -0
  144. package/src/sap/ui/core/i18n/interaction_es.xml +27 -0
  145. package/src/sap/ui/core/i18n/interaction_es_MX.xml +27 -0
  146. package/src/sap/ui/core/i18n/interaction_et.xml +27 -0
  147. package/src/sap/ui/core/i18n/interaction_fi.xml +27 -0
  148. package/src/sap/ui/core/i18n/interaction_fr.xml +27 -0
  149. package/src/sap/ui/core/i18n/interaction_fr_CA.xml +27 -0
  150. package/src/sap/ui/core/i18n/interaction_hi.xml +27 -0
  151. package/src/sap/ui/core/i18n/interaction_hr.xml +27 -0
  152. package/src/sap/ui/core/i18n/interaction_hu.xml +27 -0
  153. package/src/sap/ui/core/i18n/interaction_id.xml +27 -0
  154. package/src/sap/ui/core/i18n/interaction_it.xml +27 -0
  155. package/src/sap/ui/core/i18n/interaction_iw.xml +27 -0
  156. package/src/sap/ui/core/i18n/interaction_ja.xml +27 -0
  157. package/src/sap/ui/core/i18n/interaction_kk.xml +27 -0
  158. package/src/sap/ui/core/i18n/interaction_ko.xml +27 -0
  159. package/src/sap/ui/core/i18n/interaction_lt.xml +27 -0
  160. package/src/sap/ui/core/i18n/interaction_lv.xml +27 -0
  161. package/src/sap/ui/core/i18n/interaction_mk.xml +27 -0
  162. package/src/sap/ui/core/i18n/interaction_ms.xml +27 -0
  163. package/src/sap/ui/core/i18n/interaction_nl.xml +27 -0
  164. package/src/sap/ui/core/i18n/interaction_no.xml +27 -0
  165. package/src/sap/ui/core/i18n/interaction_pl.xml +27 -0
  166. package/src/sap/ui/core/i18n/interaction_pt.xml +27 -0
  167. package/src/sap/ui/core/i18n/interaction_pt_PT.xml +27 -0
  168. package/src/sap/ui/core/i18n/interaction_ro.xml +27 -0
  169. package/src/sap/ui/core/i18n/interaction_ru.xml +27 -0
  170. package/src/sap/ui/core/i18n/interaction_sh.xml +27 -0
  171. package/src/sap/ui/core/i18n/interaction_sk.xml +27 -0
  172. package/src/sap/ui/core/i18n/interaction_sl.xml +27 -0
  173. package/src/sap/ui/core/i18n/interaction_sr.xml +27 -0
  174. package/src/sap/ui/core/i18n/interaction_sv.xml +27 -0
  175. package/src/sap/ui/core/i18n/interaction_th.xml +27 -0
  176. package/src/sap/ui/core/i18n/interaction_tr.xml +27 -0
  177. package/src/sap/ui/core/i18n/interaction_uk.xml +27 -0
  178. package/src/sap/ui/core/i18n/interaction_vi.xml +27 -0
  179. package/src/sap/ui/core/i18n/interaction_zh_CN.xml +27 -0
  180. package/src/sap/ui/core/i18n/interaction_zh_TW.xml +27 -0
  181. package/src/sap/ui/core/interaction/KeyboardInteractionDisplay.js +43 -7
  182. package/src/sap/ui/core/library.js +3 -3
  183. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  184. package/src/sap/ui/core/message/Message.js +1 -1
  185. package/src/sap/ui/core/message/MessageManager.js +1 -1
  186. package/src/sap/ui/core/message/MessageParser.js +1 -1
  187. package/src/sap/ui/core/message/MessageProcessor.js +6 -6
  188. package/src/sap/ui/core/messagebundle_ar.properties +21 -1
  189. package/src/sap/ui/core/messagebundle_bg.properties +21 -1
  190. package/src/sap/ui/core/messagebundle_ca.properties +21 -1
  191. package/src/sap/ui/core/messagebundle_cnr.properties +21 -1
  192. package/src/sap/ui/core/messagebundle_cs.properties +21 -1
  193. package/src/sap/ui/core/messagebundle_cy.properties +21 -1
  194. package/src/sap/ui/core/messagebundle_da.properties +21 -1
  195. package/src/sap/ui/core/messagebundle_de.properties +22 -2
  196. package/src/sap/ui/core/messagebundle_el.properties +21 -1
  197. package/src/sap/ui/core/messagebundle_en.properties +21 -1
  198. package/src/sap/ui/core/messagebundle_en_GB.properties +21 -1
  199. package/src/sap/ui/core/messagebundle_en_US_saprigi.properties +21 -1
  200. package/src/sap/ui/core/messagebundle_es.properties +23 -3
  201. package/src/sap/ui/core/messagebundle_es_MX.properties +21 -1
  202. package/src/sap/ui/core/messagebundle_et.properties +21 -1
  203. package/src/sap/ui/core/messagebundle_fi.properties +22 -2
  204. package/src/sap/ui/core/messagebundle_fr.properties +21 -1
  205. package/src/sap/ui/core/messagebundle_fr_CA.properties +21 -1
  206. package/src/sap/ui/core/messagebundle_hi.properties +21 -1
  207. package/src/sap/ui/core/messagebundle_hr.properties +21 -1
  208. package/src/sap/ui/core/messagebundle_hu.properties +21 -1
  209. package/src/sap/ui/core/messagebundle_id.properties +23 -3
  210. package/src/sap/ui/core/messagebundle_it.properties +21 -1
  211. package/src/sap/ui/core/messagebundle_iw.properties +21 -1
  212. package/src/sap/ui/core/messagebundle_ja.properties +21 -1
  213. package/src/sap/ui/core/messagebundle_kk.properties +23 -3
  214. package/src/sap/ui/core/messagebundle_ko.properties +21 -1
  215. package/src/sap/ui/core/messagebundle_lt.properties +21 -1
  216. package/src/sap/ui/core/messagebundle_lv.properties +21 -1
  217. package/src/sap/ui/core/messagebundle_mk.properties +24 -4
  218. package/src/sap/ui/core/messagebundle_ms.properties +21 -1
  219. package/src/sap/ui/core/messagebundle_nl.properties +21 -1
  220. package/src/sap/ui/core/messagebundle_no.properties +21 -1
  221. package/src/sap/ui/core/messagebundle_pl.properties +21 -1
  222. package/src/sap/ui/core/messagebundle_pt.properties +21 -1
  223. package/src/sap/ui/core/messagebundle_pt_PT.properties +21 -1
  224. package/src/sap/ui/core/messagebundle_ro.properties +21 -1
  225. package/src/sap/ui/core/messagebundle_ru.properties +23 -3
  226. package/src/sap/ui/core/messagebundle_sh.properties +21 -1
  227. package/src/sap/ui/core/messagebundle_sk.properties +21 -1
  228. package/src/sap/ui/core/messagebundle_sl.properties +23 -3
  229. package/src/sap/ui/core/messagebundle_sr.properties +21 -1
  230. package/src/sap/ui/core/messagebundle_sv.properties +21 -1
  231. package/src/sap/ui/core/messagebundle_th.properties +21 -1
  232. package/src/sap/ui/core/messagebundle_tr.properties +21 -1
  233. package/src/sap/ui/core/messagebundle_uk.properties +22 -2
  234. package/src/sap/ui/core/messagebundle_vi.properties +21 -1
  235. package/src/sap/ui/core/messagebundle_zh_CN.properties +21 -1
  236. package/src/sap/ui/core/messagebundle_zh_TW.properties +23 -3
  237. package/src/sap/ui/core/mvc/Controller.js +3 -1
  238. package/src/sap/ui/core/mvc/HTMLView.js +1 -1
  239. package/src/sap/ui/core/mvc/JSONView.js +1 -1
  240. package/src/sap/ui/core/mvc/JSView.js +1 -1
  241. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  242. package/src/sap/ui/core/mvc/View.js +12 -181
  243. package/src/sap/ui/core/mvc/XMLView.js +2 -1
  244. package/src/sap/ui/core/mvc/_ViewFactory.js +192 -0
  245. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  246. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  247. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  248. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  249. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  250. package/src/sap/ui/core/routing/Route.js +197 -13
  251. package/src/sap/ui/core/routing/Router.js +19 -8
  252. package/src/sap/ui/core/routing/RouterHashChanger.js +12 -3
  253. package/src/sap/ui/core/routing/Target.js +714 -61
  254. package/src/sap/ui/core/routing/TargetCache.js +205 -25
  255. package/src/sap/ui/core/routing/Targets.js +162 -67
  256. package/src/sap/ui/core/routing/Views.js +1 -0
  257. package/src/sap/ui/core/routing/sync/Route.js +1 -1
  258. package/src/sap/ui/core/routing/sync/Target.js +11 -1
  259. package/src/sap/ui/core/routing/sync/TargetCache.js +3 -3
  260. package/src/sap/ui/core/routing/sync/Targets.js +1 -1
  261. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
  262. package/src/sap/ui/core/search/SearchProvider.js +1 -1
  263. package/src/sap/ui/core/service/Service.js +1 -48
  264. package/src/sap/ui/core/service/ServiceFactory.js +44 -4
  265. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  266. package/src/sap/ui/core/support/Plugin.js +1 -1
  267. package/src/sap/ui/core/support/Support.js +356 -353
  268. package/src/sap/ui/core/support/plugins/ControlTree.js +1 -1
  269. package/src/sap/ui/core/support/plugins/Interaction.js +1 -1
  270. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  271. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  272. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  273. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  274. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  275. package/src/sap/ui/core/support/plugins/ViewInfo.js +4 -2
  276. package/src/sap/ui/core/themes/base/base.less +71 -29
  277. package/src/sap/ui/core/themes/base/fonts/SAP-icons.ttf +0 -0
  278. package/src/sap/ui/core/themes/base/fonts/SAP-icons.woff2 +0 -0
  279. package/src/sap/ui/core/themes/base/global.less +4 -0
  280. package/src/sap/ui/core/themes/base/skeleton.less +9 -4
  281. package/src/sap/ui/core/theming/ThemeHelper.js +1 -18
  282. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  283. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  284. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +4 -4
  285. package/src/sap/ui/core/tmpl/Template.js +1 -1
  286. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  287. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  288. package/src/sap/ui/core/util/Export.js +1 -1
  289. package/src/sap/ui/core/util/ExportCell.js +1 -1
  290. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  291. package/src/sap/ui/core/util/ExportRow.js +1 -1
  292. package/src/sap/ui/core/util/ExportType.js +1 -1
  293. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  294. package/src/sap/ui/core/util/File.js +1 -1
  295. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  296. package/src/sap/ui/core/util/MockServer.js +1 -1
  297. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  298. package/src/sap/ui/core/util/XMLPreprocessor.js +8 -1
  299. package/src/sap/ui/core/util/reflection/XmlTreeModifier.js +4 -4
  300. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  301. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  302. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  303. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  304. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  305. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  306. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  307. package/src/sap/ui/core/webc/WebComponent.js +71 -3
  308. package/src/sap/ui/core/webc/WebComponentMetadata.js +2 -3
  309. package/src/sap/ui/core/webc/WebComponentRenderer.js +1 -1
  310. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  311. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  312. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  313. package/src/sap/ui/debug/ControlTree.js +1 -1
  314. package/src/sap/ui/debug/DebugEnv.js +1 -1
  315. package/src/sap/ui/debug/PropertyList.js +1 -1
  316. package/src/sap/ui/model/ClientModel.js +1 -1
  317. package/src/sap/ui/model/CompositeDataState.js +1 -1
  318. package/src/sap/ui/model/CompositeType.js +1 -1
  319. package/src/sap/ui/model/DataState.js +1 -1
  320. package/src/sap/ui/model/MetaModel.js +1 -1
  321. package/src/sap/ui/model/Model.js +1 -1
  322. package/src/sap/ui/model/SelectionModel.js +1 -1
  323. package/src/sap/ui/model/SimpleType.js +1 -1
  324. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  325. package/src/sap/ui/model/Type.js +1 -1
  326. package/src/sap/ui/model/analytics/AnalyticalBinding.js +2 -1
  327. package/src/sap/ui/model/analytics/AnalyticalTreeBindingAdapter.js +2 -1
  328. package/src/sap/ui/model/analytics/ODataModelAdapter.js +2 -1
  329. package/src/sap/ui/model/analytics/odata4analytics.js +2 -1
  330. package/src/sap/ui/model/json/JSONModel.js +1 -1
  331. package/src/sap/ui/model/message/MessageModel.js +1 -1
  332. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  333. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  334. package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
  335. package/src/sap/ui/model/odata/ODataMetadata.js +1 -1
  336. package/src/sap/ui/model/odata/ODataModel.js +1 -1
  337. package/src/sap/ui/model/odata/ODataTreeBindingAdapter.js +2 -1
  338. package/src/sap/ui/model/odata/_AnnotationHelperExpression.js +3 -3
  339. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  340. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  341. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  342. package/src/sap/ui/model/odata/type/Date.js +1 -1
  343. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  344. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  345. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  346. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +1 -1
  347. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  348. package/src/sap/ui/model/odata/type/Double.js +1 -1
  349. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  350. package/src/sap/ui/model/odata/type/Int.js +1 -1
  351. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  352. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  353. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  354. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  355. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  356. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  357. package/src/sap/ui/model/odata/type/Single.js +1 -1
  358. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  359. package/src/sap/ui/model/odata/type/String.js +1 -1
  360. package/src/sap/ui/model/odata/type/Time.js +1 -1
  361. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  362. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  363. package/src/sap/ui/model/odata/v2/Context.js +1 -1
  364. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  365. package/src/sap/ui/model/odata/v2/ODataModel.js +1 -1
  366. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +1 -1
  367. package/src/sap/ui/model/odata/v4/Context.js +4 -7
  368. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +1 -1
  369. package/src/sap/ui/model/odata/v4/ODataListBinding.js +9 -9
  370. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +57 -19
  371. package/src/sap/ui/model/odata/v4/ODataModel.js +8 -7
  372. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +1 -1
  373. package/src/sap/ui/model/odata/v4/_AnnotationHelperExpression.js +3 -3
  374. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +118 -90
  375. package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +29 -0
  376. package/src/sap/ui/model/odata/v4/lib/_Cache.js +33 -12
  377. package/src/sap/ui/model/odata/v4/lib/_GroupLock.js +10 -4
  378. package/src/sap/ui/model/odata/v4/lib/_Helper.js +5 -3
  379. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +47 -16
  380. package/src/sap/ui/model/resource/ResourceModel.js +1 -1
  381. package/src/sap/ui/model/type/Boolean.js +1 -1
  382. package/src/sap/ui/model/type/Currency.js +1 -1
  383. package/src/sap/ui/model/type/Date.js +1 -1
  384. package/src/sap/ui/model/type/DateInterval.js +1 -1
  385. package/src/sap/ui/model/type/DateTime.js +1 -1
  386. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  387. package/src/sap/ui/model/type/FileSize.js +1 -1
  388. package/src/sap/ui/model/type/Float.js +1 -1
  389. package/src/sap/ui/model/type/Integer.js +1 -1
  390. package/src/sap/ui/model/type/String.js +1 -1
  391. package/src/sap/ui/model/type/Time.js +1 -1
  392. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  393. package/src/sap/ui/model/type/Unit.js +1 -1
  394. package/src/sap/ui/model/xml/XMLModel.js +1 -1
  395. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  396. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  397. package/src/sap/ui/test/Opa.js +14 -2
  398. package/src/sap/ui/test/Opa5.js +61 -10
  399. package/src/sap/ui/test/TestUtils.js +6 -2
  400. package/src/sap/ui/test/generic/TestBase.js +1 -1
  401. package/src/sap/ui/thirdparty/datajs.js +13 -10
  402. package/src/sap/ui/util/Storage.js +1 -1
  403. package/src/ui5loader-autoconfig.js +1 -18
  404. package/src/ui5loader.js +1 -1
  405. package/src/sap/ui/core/routing/async/Route.js +0 -186
  406. package/src/sap/ui/core/routing/async/Target.js +0 -712
  407. package/src/sap/ui/core/routing/async/TargetCache.js +0 -196
  408. package/src/sap/ui/core/routing/async/Targets.js +0 -130
  409. package/src/sap/ui/thirdparty/iscroll-lite.js +0 -603
  410. package/src/sap/ui/thirdparty/iscroll.js +0 -1104
  411. package/src/sap/ui/thirdparty/mobiscroll/css/mobiscroll-core.css +0 -416
  412. package/src/sap/ui/thirdparty/mobiscroll/js/mobiscroll-core.js +0 -127
  413. package/src/sap/ui/thirdparty/mobiscroll/js/mobiscroll-datetime.js +0 -818
  414. package/src/sap/ui/thirdparty/mobiscroll/js/mobiscroll-scroller.js +0 -1264
  415. package/src/sap/ui/thirdparty/swipe-view.js +0 -560
@@ -52,79 +52,23 @@ sap.ui.define([
52
52
  */
53
53
  function _AggregationCache(oRequestor, sResourcePath, oAggregation, mQueryOptions,
54
54
  bHasGrandTotal) {
55
- var fnCount = function () {}, // no specific handling needed for "UI5__count" here
56
- fnLeaves = null,
57
- fnResolve,
58
- that = this;
59
-
60
55
  _Cache.call(this, oRequestor, sResourcePath, mQueryOptions, true);
61
56
 
62
- this.oAggregation = oAggregation;
63
- // #getDownloadUrl must be called early (for recursive hierarchy to determine
64
- // $DistanceFromRoot and for data aggregation before adding $$leaves)
65
- this.sToString = this.getDownloadUrl("");
66
57
  this.aElements = [];
67
58
  this.aElements.$byPredicate = {};
68
59
  this.aElements.$count = undefined;
69
60
  this.aElements.$created = 0; // required for _Cache#drillDown (see _Cache.from$skip)
70
- this.oCountPromise = undefined;
71
- if (mQueryOptions.$count) {
72
- if (oAggregation.hierarchyQualifier) {
73
- this.oCountPromise = new SyncPromise(function (resolve) {
74
- fnResolve = resolve;
75
- });
76
- this.oCountPromise.$resolve = fnResolve;
77
- } else if (oAggregation.groupLevels.length) {
78
- mQueryOptions.$$leaves = true; // do this after #getDownloadUrl
79
- this.oCountPromise = new SyncPromise(function (resolve) {
80
- fnLeaves = function (oLeaves) {
81
- // Note: count has type Edm.Int64, represented as string in OData responses;
82
- // $count should be a number and the loss of precision is acceptable
83
- resolve(parseInt(oLeaves.UI5__leaves));
84
- };
85
- });
86
- }
87
- }
88
- this.oFirstLevel = this.createGroupLevelCache(null, bHasGrandTotal || !!fnLeaves);
61
+ // Whether this cache is a unified cache, using oFirstLevel with ExpandLevels instead of
62
+ // separate group level caches
63
+ this.bUnifiedCache = oAggregation.expandTo >= Number.MAX_SAFE_INTEGER
64
+ || !!oAggregation.createInPlace;
65
+
66
+ this.doReset(oAggregation, mQueryOptions, bHasGrandTotal);
89
67
  this.addKeptElement = this.oFirstLevel.addKeptElement; // @borrows ...
90
68
  this.removeKeptElement = this.oFirstLevel.removeKeptElement; // @borrows ...
91
69
  this.requestSideEffects = this.oFirstLevel.requestSideEffects; // @borrows ...
92
- this.oGrandTotalPromise = undefined;
93
- if (bHasGrandTotal) {
94
- this.oGrandTotalPromise = new SyncPromise(function (resolve) {
95
- _ConcatHelper.enhanceCache(that.oFirstLevel, oAggregation, [fnLeaves,
96
- function (oGrandTotal) {
97
- var oGrandTotalCopy;
98
-
99
- if (oAggregation["grandTotal like 1.84"]) { // rename measures
100
- _AggregationHelper.removeUI5grand__(oGrandTotal);
101
- }
102
- _AggregationHelper.setAnnotations(oGrandTotal, true, true, 0,
103
- _AggregationHelper.getAllProperties(oAggregation));
104
-
105
- if (oAggregation.grandTotalAtBottomOnly === false) {
106
- // Note: make shallow copy *before* there are private annotations!
107
- oGrandTotalCopy = Object.assign({}, oGrandTotal, {
108
- "@$ui5.node.isExpanded" : undefined // treat copy as a leaf
109
- });
110
- _Helper.setPrivateAnnotation(oGrandTotal, "copy", oGrandTotalCopy);
111
- _Helper.setPrivateAnnotation(oGrandTotalCopy, "predicate",
112
- "($isTotal=true)");
113
- }
114
- _Helper.setPrivateAnnotation(oGrandTotal, "predicate", "()");
115
-
116
- resolve(oGrandTotal);
117
- }, fnCount]);
118
- });
119
- } else if (fnLeaves) {
120
- _ConcatHelper.enhanceCache(that.oFirstLevel, oAggregation, [fnLeaves, fnCount]);
121
- }
122
70
  this.oTreeState = new _TreeState(oAggregation.$NodeProperty,
123
71
  (oNode) => _Helper.getKeyFilter(oNode, this.sMetaPath, this.getTypes()));
124
- // Whether this cache is a unified cache, using oFirstLevel with ExpandLevels instead of
125
- // separate group level caches
126
- this.bUnifiedCache = this.oAggregation.expandTo >= Number.MAX_SAFE_INTEGER
127
- || !!this.oAggregation.createInPlace;
128
72
  }
129
73
 
130
74
  // make _AggregationCache a _Cache, but actively disinherit some critical methods
@@ -228,7 +172,6 @@ sap.ui.define([
228
172
  */
229
173
  _AggregationCache.prototype.addElements = function (vReadElements, iOffset, oCache, iStart) {
230
174
  var aElements = this.aElements,
231
- sHierarchyQualifier = this.oAggregation.hierarchyQualifier,
232
175
  sNodeProperty = this.oAggregation.$NodeProperty,
233
176
  that = this;
234
177
 
@@ -250,7 +193,7 @@ sap.ui.define([
250
193
  oKeptElement = aElements.$byPredicate[sPredicate];
251
194
  if (oKeptElement && oKeptElement !== oElement
252
195
  && !(oKeptElement instanceof SyncPromise)) {
253
- if (!sHierarchyQualifier || aElements.includes(oKeptElement)) {
196
+ if (aElements.includes(oKeptElement)) {
254
197
  const sNewPredicate = oCache.fixDuplicatePredicate(oElement, sPredicate);
255
198
  if (sNewPredicate) {
256
199
  sPredicate = sNewPredicate;
@@ -426,7 +369,7 @@ sap.ui.define([
426
369
  iRemaining -= this.collapse(
427
370
  _Helper.getPrivateAnnotation(oElement, "predicate"), oGroupLock, bSilent, true);
428
371
  }
429
- // exceptions of selection are effectively kept alive (with recursive hierarchy)
372
+ // exceptions of selection are effectively kept alive
430
373
  if (!this.isSelectionDifferent(oElement)) {
431
374
  delete aElements.$byPredicate[_Helper.getPrivateAnnotation(oElement, "predicate")];
432
375
  delete aElements.$byPredicate[
@@ -719,6 +662,67 @@ sap.ui.define([
719
662
  return oCache;
720
663
  };
721
664
 
665
+ /**
666
+ * Hook method for both {@link #constructor} and {@link #reset}. Creates the promises needed
667
+ * for the leaf count and grand total, if applicable. Creates a first level cache and
668
+ * calculates the result of {@link #toString}. Remembers <code>oAggregation</code>, enhancing
669
+ * it with "$NodeProperty" etc. in case of a recursive hierarchy (see
670
+ * {@link sap.ui.model.odata.v4.lib._AggregationHelper.buildApply4Hierarchy} for details).
671
+ *
672
+ * @param {object} oAggregation
673
+ * An object holding the information needed for data aggregation; see also "OData Extension
674
+ * for Data Aggregation Version 4.0"; must already be normalized by
675
+ * {@link _AggregationHelper.buildApply} - it's MODIFIED here!
676
+ * @param {object} mQueryOptions
677
+ * A map of key-value pairs representing the query string - it's MODIFIED here!
678
+ * @param {boolean} bHasGrandTotal
679
+ * Whether a grand total is needed
680
+ *
681
+ * @private
682
+ */
683
+ _AggregationCache.prototype.doReset = function (oAggregation, mQueryOptions, bHasGrandTotal) {
684
+ this.oAggregation = oAggregation;
685
+ // early call of _AggregationHelper.buildApply to determine $NodeProperty etc.
686
+ this.sToString = this.getDownloadUrl("");
687
+
688
+ const aAdditionalRowHandlers = [];
689
+ this.oCountPromise = undefined;
690
+ if (mQueryOptions.$count) {
691
+ if (oAggregation.hierarchyQualifier) {
692
+ let fnResolve;
693
+ this.oCountPromise = new SyncPromise(function (resolve) {
694
+ fnResolve = resolve;
695
+ });
696
+ this.oCountPromise.$resolve = fnResolve;
697
+ } else if (oAggregation.groupLevels.length) {
698
+ mQueryOptions.$$leaves = true;
699
+ this.oCountPromise = new SyncPromise(function (resolve) {
700
+ aAdditionalRowHandlers.push((oLeaves) => {
701
+ // Note: count has type Edm.Int64, represented as string in OData responses;
702
+ // $count should be a number and the loss of precision is acceptable
703
+ resolve(parseInt(oLeaves.UI5__leaves));
704
+ });
705
+ });
706
+ }
707
+ }
708
+ this.oGrandTotalPromise = bHasGrandTotal
709
+ ? new SyncPromise((resolve) => {
710
+ aAdditionalRowHandlers.push((oGrandTotal) => {
711
+ _AggregationHelper.handleGrandTotal(oAggregation, oGrandTotal);
712
+ resolve(oGrandTotal);
713
+ });
714
+ })
715
+ : undefined;
716
+
717
+ const bHasConcatHelper = aAdditionalRowHandlers.length > 0;
718
+ this.oFirstLevel = this.createGroupLevelCache(null, bHasConcatHelper);
719
+ if (bHasConcatHelper) {
720
+ // no specific handling needed for "UI5__count" here
721
+ aAdditionalRowHandlers.push(function () {});
722
+ _ConcatHelper.enhanceCache(this.oFirstLevel, oAggregation, aAdditionalRowHandlers);
723
+ }
724
+ };
725
+
722
726
  /**
723
727
  * Expands the given group node by the given number of levels.
724
728
  *
@@ -1261,6 +1265,24 @@ sap.ui.define([
1261
1265
  } // else: iSiblingRank === undefined => return undefined;
1262
1266
  };
1263
1267
 
1268
+ /**
1269
+ * @override
1270
+ * @see sap.ui.model.odata.v4.lib._Cache#getQueryOptions4Single
1271
+ */
1272
+ _AggregationCache.prototype.getQueryOptions4Single = function (sPath) {
1273
+ if (sPath !== "") {
1274
+ throw new Error("Unsupported path: " + sPath);
1275
+ }
1276
+
1277
+ const mQueryOptions = _Helper.clone(this.mLateQueryOptions ?? this.mQueryOptions);
1278
+ const iIndex = mQueryOptions.$select.indexOf(this.oAggregation.$NodeProperty);
1279
+ if (iIndex >= 0) {
1280
+ mQueryOptions.$select.splice(iIndex, 1);
1281
+ }
1282
+
1283
+ return mQueryOptions;
1284
+ };
1285
+
1264
1286
  /**
1265
1287
  * @override
1266
1288
  * @see sap.ui.model.odata.v4.lib._Cache#getValue
@@ -1411,18 +1433,15 @@ sap.ui.define([
1411
1433
 
1412
1434
  /**
1413
1435
  * Determines if the "@$ui5.context.isSelected" annotation of the given element differs from the
1414
- * annotation at the collection. Only relevant in case of a recursive hierarchy. Note: A missing
1415
- * annotation is treated as <code>false</code>.
1436
+ * annotation at the collection. Note: A missing annotation is treated as <code>false</code>.
1416
1437
  *
1417
1438
  * @param {object} oElement - The element
1418
- * @returns {boolean} Whether recursive hierarchy is used and the selection state of the element
1419
- * differs from the collection
1439
+ * @returns {boolean} Whether the selection state of the element differs from the collection
1420
1440
  *
1421
1441
  * @private
1422
1442
  */
1423
1443
  _AggregationCache.prototype.isSelectionDifferent = function (oElement) {
1424
- return this.oAggregation.hierarchyQualifier
1425
- && (oElement["@$ui5.context.isSelected"] ?? false)
1444
+ return (oElement["@$ui5.context.isSelected"] ?? false)
1426
1445
  !== (this.aElements["@$ui5.context.isSelected"] ?? false);
1427
1446
  };
1428
1447
 
@@ -1955,7 +1974,7 @@ sap.ui.define([
1955
1974
 
1956
1975
  that.aElements.length = that.aElements.$count = oResult.value.$count;
1957
1976
 
1958
- if (that.oGrandTotalPromise) {
1977
+ if (that.aElements.length && that.oGrandTotalPromise) {
1959
1978
  that.aElements.$count += 1;
1960
1979
  that.aElements.length += 1;
1961
1980
  oGrandTotal = that.oGrandTotalPromise.getResult();
@@ -2092,12 +2111,30 @@ sap.ui.define([
2092
2111
  */
2093
2112
  _AggregationCache.prototype.refreshKeptElements = function (oGroupLock, fnOnRemove,
2094
2113
  bIgnorePendingChanges, _bDropApply) {
2114
+ if (!this.oAggregation.hierarchyQualifier) {
2115
+ return; // no own request for data aggregation
2116
+ }
2117
+
2095
2118
  // "super" call (like @borrows ...)
2096
2119
  const fnSuper = this.oFirstLevel.refreshKeptElements;
2097
2120
  return fnSuper.call(this, oGroupLock, fnOnRemove, bIgnorePendingChanges,
2098
2121
  /*bDropApply*/true);
2099
2122
  };
2100
2123
 
2124
+ /**
2125
+ * @override
2126
+ * @see sap.ui.model.odata.v4.lib._Cache#replaceElement
2127
+ */
2128
+ _AggregationCache.prototype.replaceElement = function (aElements, _iIndex, sPredicate,
2129
+ oElement, mTypeForMetaPath, sPath, bKeepReportedMessagesPath) {
2130
+ // Note: iStart is not needed here because we know we have a key predicate
2131
+ this.visitResponse(oElement, mTypeForMetaPath,
2132
+ _Helper.getMetaPath(_Helper.buildPath(this.sMetaPath, sPath)), sPath + sPredicate,
2133
+ undefined, bKeepReportedMessagesPath);
2134
+
2135
+ _Helper.updateAll({/*mChangeListeners*/}, "", aElements.$byPredicate[sPredicate], oElement);
2136
+ };
2137
+
2101
2138
  /**
2102
2139
  * Sends a request for the elements identified by the given key predicates. Returns predicates
2103
2140
  * for elements matching the current filter.
@@ -2363,15 +2400,12 @@ sap.ui.define([
2363
2400
  */
2364
2401
  _AggregationCache.prototype.reset = function (aKeptElementPredicates, sGroupId, mQueryOptions,
2365
2402
  oAggregation, bIsGrouped) {
2366
- var fnResolve,
2367
- that = this;
2368
-
2369
2403
  if (bIsGrouped) {
2370
2404
  throw new Error("Unsupported grouping via sorter");
2371
2405
  }
2372
2406
 
2373
- aKeptElementPredicates.forEach(function (sPredicate) {
2374
- var oKeptElement = that.aElements.$byPredicate[sPredicate];
2407
+ aKeptElementPredicates.forEach((sPredicate) => {
2408
+ var oKeptElement = this.aElements.$byPredicate[sPredicate];
2375
2409
 
2376
2410
  if (_Helper.hasPrivateAnnotation(oKeptElement, "placeholder")) {
2377
2411
  throw new Error("Unexpected placeholder");
@@ -2382,29 +2416,22 @@ sap.ui.define([
2382
2416
  _Helper.setPrivateAnnotation(oKeptElement, "predicate", sPredicate);
2383
2417
  });
2384
2418
 
2385
- this.oAggregation = oAggregation;
2386
2419
  // "super" call (like @borrows ...)
2387
2420
  const fnSuper = this.oFirstLevel.reset;
2388
2421
  fnSuper.call(this, aKeptElementPredicates, sGroupId, mQueryOptions);
2389
- // reset modifies the cache's query options => recalculate result of #toString
2390
- this.sToString = this.getDownloadUrl("");
2391
2422
  if (sGroupId) { // sGroupId means we are in a side-effects refresh
2392
2423
  this.oBackup.oCountPromise = this.oCountPromise;
2393
2424
  this.oBackup.oFirstLevel = this.oFirstLevel;
2425
+ this.oBackup.oGrandTotalPromise = this.oGrandTotalPromise;
2394
2426
  this.oBackup.bUnifiedCache = this.bUnifiedCache;
2395
2427
  this.bUnifiedCache = true;
2396
2428
  } else {
2397
2429
  this.oTreeState.reset();
2398
2430
  }
2399
- this.oAggregation.$ExpandLevels = this.oTreeState.getExpandLevels();
2400
- this.oCountPromise = undefined;
2401
- if (mQueryOptions.$count) {
2402
- this.oCountPromise = new SyncPromise(function (resolve) {
2403
- fnResolve = resolve;
2404
- });
2405
- this.oCountPromise.$resolve = fnResolve;
2406
- }
2407
- this.oFirstLevel = this.createGroupLevelCache();
2431
+ oAggregation.$ExpandLevels = this.oTreeState.getExpandLevels();
2432
+
2433
+ this.doReset(oAggregation, mQueryOptions,
2434
+ _AggregationHelper.hasGrandTotal(oAggregation.aggregate));
2408
2435
  };
2409
2436
 
2410
2437
  /**
@@ -2424,6 +2451,7 @@ sap.ui.define([
2424
2451
  if (bReally) {
2425
2452
  this.oCountPromise = this.oBackup.oCountPromise;
2426
2453
  this.oFirstLevel = this.oBackup.oFirstLevel;
2454
+ this.oGrandTotalPromise = this.oBackup.oGrandTotalPromise;
2427
2455
  this.bUnifiedCache = this.oBackup.bUnifiedCache;
2428
2456
  }
2429
2457
  // "super" call (like @borrows ...)
@@ -2857,7 +2885,7 @@ sap.ui.define([
2857
2885
  sDeepResourcePath, bSharedRequest);
2858
2886
  };
2859
2887
 
2860
- // @override sap.ui.model.odata.v4.lib._Cache#fixDuplicatePredicate
2888
+ // @override sap.ui.model.odata.v4.lib._CollectionCache#fixDuplicatePredicate
2861
2889
  _AggregationCache.fixDuplicatePredicate = function (oElement, sPredicate) {
2862
2890
  if (sPredicate === "('')" || sPredicate.includes("=''")) {
2863
2891
  Log.warning("Duplicate key predicate: " + sPredicate, this.toString(),
@@ -1123,6 +1123,35 @@ sap.ui.define([
1123
1123
  return mQueryOptions;
1124
1124
  },
1125
1125
 
1126
+ /**
1127
+ * Handles the given server response for a grand total row and updates it as needed by the
1128
+ * client.
1129
+ *
1130
+ * @param {object} oAggregation
1131
+ * An object holding the information needed for data aggregation; see {@link .buildApply}
1132
+ * @param {object} oGrandTotal
1133
+ * An object representing a grand total row response from the server
1134
+ *
1135
+ * @public
1136
+ */
1137
+ handleGrandTotal : function (oAggregation, oGrandTotal) {
1138
+ if (oAggregation["grandTotal like 1.84"]) { // rename measures
1139
+ _AggregationHelper.removeUI5grand__(oGrandTotal);
1140
+ }
1141
+ _AggregationHelper.setAnnotations(oGrandTotal, true, true, 0,
1142
+ _AggregationHelper.getAllProperties(oAggregation));
1143
+
1144
+ if (oAggregation.grandTotalAtBottomOnly === false) {
1145
+ // Note: make shallow copy *before* there are private annotations!
1146
+ const oGrandTotalCopy = Object.assign({}, oGrandTotal, {
1147
+ "@$ui5.node.isExpanded" : undefined // treat copy as a leaf
1148
+ });
1149
+ _Helper.setPrivateAnnotation(oGrandTotal, "copy", oGrandTotalCopy);
1150
+ _Helper.setPrivateAnnotation(oGrandTotalCopy, "predicate", "($isTotal=true)");
1151
+ }
1152
+ _Helper.setPrivateAnnotation(oGrandTotal, "predicate", "()");
1153
+ },
1154
+
1126
1155
  /**
1127
1156
  * Tells whether grand total values are needed for at least one aggregatable property.
1128
1157
  *
@@ -1322,6 +1322,22 @@ sap.ui.define([
1322
1322
  return this.mQueryOptions;
1323
1323
  };
1324
1324
 
1325
+ /**
1326
+ * Returns this cache's query options corresponding to the given path (already cloned!) as
1327
+ * suitable for a single-entity GET request.
1328
+ *
1329
+ * @param {string} sPath
1330
+ * The entity collection's path within this cache, may be <code>""</code>
1331
+ * @returns {object|undefined} The query options as a clone, if any
1332
+ *
1333
+ * @protected
1334
+ * @see #getQueryOptions
1335
+ * @see #refreshSingle
1336
+ */
1337
+ _Cache.prototype.getQueryOptions4Single = function (sPath) {
1338
+ return _Helper.clone(_Helper.getQueryOptionsForPath(this.mQueryOptions, sPath));
1339
+ };
1340
+
1325
1341
  /**
1326
1342
  * Gets the cache's resource path.
1327
1343
  *
@@ -1485,8 +1501,7 @@ sap.ui.define([
1485
1501
  && that.oRequestor.getModelInterface().fetchMetadata(
1486
1502
  that.sMetaPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path"
1487
1503
  ).getResult(),
1488
- mQueryOptions = _Helper.clone(
1489
- _Helper.getQueryOptionsForPath(that.mQueryOptions, sPath)),
1504
+ mQueryOptions = that.getQueryOptions4Single(sPath),
1490
1505
  sReadUrl;
1491
1506
 
1492
1507
  if (iIndex >= 0) {
@@ -1820,7 +1835,7 @@ sap.ui.define([
1820
1835
  * @param {boolean} [bKeepReportedMessagesPath]
1821
1836
  * Whether <code>this.sReportedMessagesPath</code> should be kept unchanged
1822
1837
  *
1823
- * @private
1838
+ * @protected
1824
1839
  */
1825
1840
  _Cache.prototype.replaceElement = function (aElements, iIndex, sPredicate, oElement,
1826
1841
  mTypeForMetaPath, sPath, bKeepReportedMessagesPath) {
@@ -3805,8 +3820,9 @@ sap.ui.define([
3805
3820
  end : iEnd,
3806
3821
  promise : new SyncPromise(function (resolve, reject) {
3807
3822
  fnResolve = resolve;
3808
- fnReject = function () {
3809
- const oError = new Error("$$separate: canceled " + sProperty);
3823
+ fnReject = function (oError0) {
3824
+ const oError = new Error("$$separate: canceled " + sProperty,
3825
+ {cause : oError0});
3810
3826
  oError.canceled = true;
3811
3827
  reject(oError);
3812
3828
  };
@@ -3819,9 +3835,9 @@ sap.ui.define([
3819
3835
  const oResult = await this.oRequestor.request("GET", sReadUrl,
3820
3836
  this.oRequestor.lockGroup("$single", this));
3821
3837
 
3822
- let bMainFailed;
3823
- await oMainPromise.catch(() => { /* handled by caller */
3824
- bMainFailed = true;
3838
+ let oMainError;
3839
+ await oMainPromise.catch((oError) => { /* handled by caller */
3840
+ oMainError = oError;
3825
3841
  });
3826
3842
 
3827
3843
  const iIndex = this.mSeparateProperty2ReadRequests[sProperty].indexOf(oReadRange);
@@ -3831,8 +3847,8 @@ sap.ui.define([
3831
3847
  }
3832
3848
 
3833
3849
  this.mSeparateProperty2ReadRequests[sProperty].splice(iIndex, 1);
3834
- if (bMainFailed) {
3835
- fnReject();
3850
+ if (oMainError) {
3851
+ fnReject(oMainError);
3836
3852
  return;
3837
3853
  }
3838
3854
 
@@ -3842,6 +3858,10 @@ sap.ui.define([
3842
3858
  const oElement = this.aElements.$byPredicate[sPredicate];
3843
3859
  if (oElement) {
3844
3860
  if (oElement["@odata.etag"] === oSeparateData["@odata.etag"]) {
3861
+ if (oElement[sProperty]?.["@odata.etag"]
3862
+ !== oSeparateData[sProperty]?.["@odata.etag"]) {
3863
+ delete oElement[sProperty];
3864
+ }
3845
3865
  _Helper.updateSelected(this.mChangeListeners, sPredicate, oElement,
3846
3866
  oSeparateData, [sProperty]);
3847
3867
  } else {
@@ -3853,7 +3873,7 @@ sap.ui.define([
3853
3873
  fnResolve();
3854
3874
  fnSeparateReceived(sProperty, iStart, iEnd);
3855
3875
  } catch (oError) {
3856
- fnReject();
3876
+ fnReject(oError);
3857
3877
  // do not clean up mSeparateProperty2ReadRequests to avoid late property requests
3858
3878
  fnSeparateReceived(sProperty, iStart, iEnd, oError);
3859
3879
  }
@@ -4537,7 +4557,8 @@ sap.ui.define([
4537
4557
 
4538
4558
  if (bConfirm) {
4539
4559
  delete mHeaders["Prefer"];
4540
- return post(oGroupLock0.getUnlockedCopy());
4560
+ // decomposed error indicates request inside change set (but not alone)
4561
+ return post(oGroupLock0.getUnlockedCopy(!oError.decomposed));
4541
4562
  }
4542
4563
 
4543
4564
  oCanceledError = Error("Action canceled due to strict handling");
@@ -28,7 +28,8 @@ sap.ui.define([
28
28
  * @param {boolean} [bModifying]
29
29
  * Whether the reason for the group lock is a modifying request
30
30
  * @param {number} [iSerialNumber=Infinity]
31
- * A serial number which may be used on unlock
31
+ * A {@link #getSerialNumber serial number} which may be used on unlock, or <code>NaN</code>
32
+ * if none should be used
32
33
  * @param {function} [fnCancel]
33
34
  * Function that is called when the group lock is canceled
34
35
  * @throws {Error}
@@ -99,9 +100,10 @@ sap.ui.define([
99
100
  * Returns the serial number.
100
101
  *
101
102
  * @returns {number}
102
- * The serial number
103
+ * The serial number or <code>NaN</code> if none should be used
103
104
  *
104
105
  * @public
106
+ * @see #getUnlockedCopy
105
107
  */
106
108
  _GroupLock.prototype.getSerialNumber = function () {
107
109
  return this.iSerialNumber;
@@ -112,13 +114,17 @@ sap.ui.define([
112
114
  * lock on which {@link #unlock} has already been called (e.g. when one group is used to create
113
115
  * multiple requests).
114
116
  *
117
+ * @param {boolean} [bNoSerialNumber]
118
+ * Whether to replace the old serial number with <code>NaN</code> instead of keeping it
115
119
  * @returns {sap.ui.model.odata.v4.lib._GroupLock}
116
120
  * The group lock
117
121
  *
118
122
  * @public
123
+ * @see #getSerialNumber
119
124
  */
120
- _GroupLock.prototype.getUnlockedCopy = function () {
121
- return new _GroupLock(this.sGroupId, this.oOwner, false, false, this.iSerialNumber);
125
+ _GroupLock.prototype.getUnlockedCopy = function (bNoSerialNumber) {
126
+ return new _GroupLock(this.sGroupId, this.oOwner, false, false,
127
+ bNoSerialNumber ? NaN : this.iSerialNumber);
122
128
  };
123
129
 
124
130
  /**
@@ -591,8 +591,6 @@ sap.ui.define([
591
591
  * response JSON object (if available)
592
592
  * <li> <code>isConcurrentModification</code>: (optional) <code>true</code> In case of a
593
593
  * concurrent modification detected via ETags (i.e. HTTP status code 412)
594
- * <li> <code>strictHandlingFailed</code>: (optional) <code>true</code> In case of HTTP
595
- * status code 412 and response header "Preference-Applied:handling=strict"
596
594
  * <li> <code>message</code>: Error message
597
595
  * <li> <code>requestUrl</code>: (optional) The absolute request URL
598
596
  * <li> <code>resourcePath</code>: (optional) The path by which this resource has
@@ -602,6 +600,8 @@ sap.ui.define([
602
600
  * that header value was an HTTP date or a delay in seconds.
603
601
  * <li> <code>status</code>: HTTP status code
604
602
  * <li> <code>statusText</code>: (optional) HTTP status text
603
+ * <li> <code>strictHandlingFailed</code>: (optional) <code>true</code> In case of HTTP
604
+ * status code 412 and response header "Preference-Applied:handling=strict"
605
605
  * </ul>
606
606
  * @see <a href=
607
607
  * "http://docs.oasis-open.org/odata/odata-json-format/v4.0/os/odata-json-format-v4.0-os.html#_Representing_Errors_in"
@@ -807,7 +807,8 @@ sap.ui.define([
807
807
  * URL of the service document used to resolve relative request URLs
808
808
  * @returns {Error[]}
809
809
  * One error for each request given, suitable for
810
- * {@link sap.ui.model.odata.v4.ODataModel#reportError}
810
+ * {@link sap.ui.model.odata.v4.ODataModel#reportError} and marked as
811
+ * <code>decomposed</code>
811
812
  *
812
813
  * @public
813
814
  */
@@ -842,6 +843,7 @@ sap.ui.define([
842
843
  return sContentID === oRequest.$ContentID;
843
844
  }
844
845
 
846
+ oClone.decomposed = true;
845
847
  oClone.error = _Helper.clone(oError.error);
846
848
  oClone.requestUrl = sServiceUrl + oRequest.url;
847
849
  oClone.resourcePath = oRequest.$resourcePath;
@@ -450,34 +450,53 @@ sap.ui.define([
450
450
 
451
451
  /**
452
452
  * Throws an error if the new request uses strict handling and there is a change set containing
453
- * a strict handling request except the one at index <code>iChangeSetNo</code>.
453
+ * a strict handling request except the one at index <code>iChangeSetNo</code>. On the other
454
+ * hand, in case of the "odata.continue-on-error" preference, every request using strict
455
+ * handling must belong to its own change set.
454
456
  *
455
457
  * @param {object} oRequest
456
- * The new request
458
+ * The new request or <code>null</code> to re-check all change sets as a preparation for the
459
+ * "odata.continue-on-error" preference
457
460
  * @param {object[]} aRequests
458
461
  * The batch queue
459
- * @param {number} iChangeSetNo
460
- * The index of the irrelevant change set
462
+ * @param {number} [iChangeSetNo]
463
+ * The index of the irrelevant change set; ignored for a <code>null</code> request
461
464
  * @throws {Error}
462
465
  * If there is a conflicting change set
463
466
  *
464
467
  * @private
465
468
  */
466
469
  _Requestor.prototype.checkConflictingStrictRequest = function (oRequest, aRequests,
467
- iChangeSetNo) {
470
+ iChangeSetNo) {
471
+ function hasManyWithStrictHandling(aChangeSet) {
472
+ return aChangeSet.filter(isUsingStrictHandling).length > 1;
473
+ }
474
+
468
475
  function isOtherChangeSetWithStrictHandling(aChangeSet, i) {
469
476
  return iChangeSetNo !== i && aChangeSet.some(isUsingStrictHandling);
470
477
  }
471
478
 
472
479
  function isUsingStrictHandling(oRequest0) {
473
- return oRequest0.headers.Prefer === "handling=strict";
480
+ return oRequest0.headers.Prefer?.includes("handling=strict");
474
481
  }
475
482
 
476
- // do not look past aRequests.iChangeSet because these cannot be change sets
477
- if (isUsingStrictHandling(oRequest)
478
- && aRequests.slice(0, aRequests.iChangeSet + 1)
479
- .some(isOtherChangeSetWithStrictHandling)) {
480
- throw new Error("All requests with strict handling must belong to the same change set");
483
+ const sMessage = "Each request with strict handling must belong to its own change set due"
484
+ + ' to the "odata.continue-on-error" preference';
485
+ const aChangeSets = aRequests.slice(0, aRequests.iChangeSet + 1);
486
+ if (oRequest === null) {
487
+ if (aChangeSets.some(hasManyWithStrictHandling)) {
488
+ throw new Error(sMessage);
489
+ }
490
+ } else if (aRequests.bContinueOnError) {
491
+ if (aChangeSets[iChangeSetNo].length
492
+ && (isUsingStrictHandling(oRequest)
493
+ || isUsingStrictHandling(aChangeSets[iChangeSetNo][0]))) {
494
+ throw new Error(sMessage);
495
+ }
496
+ } else if (isUsingStrictHandling(oRequest)
497
+ && aChangeSets.some(isOtherChangeSetWithStrictHandling)) {
498
+ throw new Error(
499
+ "All requests with strict handling must belong to the same change set");
481
500
  }
482
501
  };
483
502
 
@@ -1793,7 +1812,8 @@ sap.ui.define([
1793
1812
  * other group ID values, the request is added to the given group and you can use
1794
1813
  * {@link #submitBatch} to send all requests in that group. This group lock will be unlocked
1795
1814
  * immediately, even if the request itself is queued. The request is rejected if the lock is
1796
- * already canceled.
1815
+ * already canceled. For a group lock w/o a serial number, a non-GET is put into a change set
1816
+ * of its own (unless <code>bAtFront</code> is used).
1797
1817
  * @param {object} [mHeaders]
1798
1818
  * Map of request-specific headers, overriding both the mandatory OData V4 headers and the
1799
1819
  * default headers given to the factory. This map of headers must not contain
@@ -1843,8 +1863,10 @@ sap.ui.define([
1843
1863
  * <code>oGroupLock</code> is already canceled.
1844
1864
  * @throws {Error} If
1845
1865
  * <ul>
1846
- * <li>group ID is '$cached'. The error has a property <code>$cached = true</code>
1847
- * <li>group ID is '$single' and there is already an existing batch queue for this group
1866
+ * <li>group ID is '$cached'; the error has a property <code>$cached = true</code>,
1867
+ * <li>group ID is '$single' and there is already an existing batch queue for this group,
1868
+ * <li>the {@link #checkConflictingStrictRequest rules for strict handling} w.r.t. change
1869
+ * sets are violated
1848
1870
  * </ul>
1849
1871
  * @public
1850
1872
  */
@@ -1911,13 +1933,18 @@ sap.ui.define([
1911
1933
  } else if (bAtFront) { // add at front of first change set
1912
1934
  aRequests[0].unshift(oRequest);
1913
1935
  } else { // push into change set which was current when the request was initiated
1936
+ if (!iRequestSerialNumber && aRequests[aRequests.iChangeSet].length) {
1937
+ that.addChangeSet(sGroupId);
1938
+ }
1914
1939
  iChangeSetNo = aRequests.iChangeSet;
1915
1940
  while (aRequests[iChangeSetNo].iSerialNumber > iRequestSerialNumber) {
1916
1941
  iChangeSetNo -= 1;
1917
1942
  }
1918
1943
  that.checkConflictingStrictRequest(oRequest, aRequests, iChangeSetNo);
1919
-
1920
1944
  aRequests[iChangeSetNo].push(oRequest);
1945
+ if (!iRequestSerialNumber) {
1946
+ that.addChangeSet(sGroupId);
1947
+ }
1921
1948
  }
1922
1949
  if (sGroupId === "$single") {
1923
1950
  that.submitBatch("$single").catch(that.oModelInterface.getReporter());
@@ -2146,11 +2173,15 @@ sap.ui.define([
2146
2173
  *
2147
2174
  * @param {string} sGroupId
2148
2175
  * The group ID
2176
+ * @throws {Error} If the {@link #checkConflictingStrictRequest rules for strict handling}
2177
+ * w.r.t. change sets are violated
2149
2178
  *
2150
2179
  * @public
2151
2180
  */
2152
2181
  _Requestor.prototype.setContinueOnError = function (sGroupId) {
2153
- this.getOrCreateBatchQueue(sGroupId).bContinueOnError = true;
2182
+ const aRequests = this.getOrCreateBatchQueue(sGroupId);
2183
+ this.checkConflictingStrictRequest(null, aRequests);
2184
+ aRequests.bContinueOnError = true;
2154
2185
  };
2155
2186
 
2156
2187
  /**