@openui5/sap.ui.core 1.116.0 → 1.117.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 (474) hide show
  1. package/.eslintrc.json +1 -22
  2. package/package.json +1 -1
  3. package/src/jquery.sap.global.js +1 -1
  4. package/src/jquery.sap.properties.js +1 -1
  5. package/src/jquery.sap.resources.js +1 -1
  6. package/src/jquery.sap.script.js +1 -1
  7. package/src/jquery.sap.storage.js +3 -3
  8. package/src/sap/base/Event.js +4 -4
  9. package/src/sap/base/Eventing.js +5 -6
  10. package/src/sap/base/config/MemoryConfigurationProvider.js +10 -1
  11. package/src/sap/base/config.js +3 -2
  12. package/src/sap/base/i18n/Formatting.js +30 -32
  13. package/src/sap/base/i18n/LanguageTag.js +2 -2
  14. package/src/sap/base/i18n/Localization.js +19 -20
  15. package/src/sap/base/i18n/date/CalendarType.js +1 -1
  16. package/src/sap/base/i18n/date/CalendarWeekNumbering.js +1 -1
  17. package/src/sap/base/i18n/date/TimezoneUtils.js +1 -1
  18. package/src/sap/base/util/JSTokenizer.js +1 -1
  19. package/src/sap/base/util/fetch.js +4 -4
  20. package/src/sap/base/util/mixedFetch.js +2 -2
  21. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  22. package/src/sap/base/util/restricted/_castArray.js +1 -1
  23. package/src/sap/base/util/restricted/_compact.js +1 -1
  24. package/src/sap/base/util/restricted/_curry.js +1 -1
  25. package/src/sap/base/util/restricted/_debounce.js +1 -1
  26. package/src/sap/base/util/restricted/_difference.js +1 -1
  27. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  28. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  29. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  30. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  31. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  32. package/src/sap/base/util/restricted/_flatten.js +1 -1
  33. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  34. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  35. package/src/sap/base/util/restricted/_intersection.js +1 -1
  36. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  37. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  38. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  39. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  40. package/src/sap/base/util/restricted/_isNil.js +1 -1
  41. package/src/sap/base/util/restricted/_max.js +1 -1
  42. package/src/sap/base/util/restricted/_merge.js +1 -1
  43. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  44. package/src/sap/base/util/restricted/_min.js +1 -1
  45. package/src/sap/base/util/restricted/_omit.js +1 -1
  46. package/src/sap/base/util/restricted/_pick.js +1 -1
  47. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  48. package/src/sap/base/util/restricted/_throttle.js +1 -1
  49. package/src/sap/base/util/restricted/_toArray.js +1 -1
  50. package/src/sap/base/util/restricted/_union.js +1 -1
  51. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  52. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  53. package/src/sap/base/util/restricted/_uniq.js +1 -1
  54. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  55. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  56. package/src/sap/base/util/restricted/_without.js +1 -1
  57. package/src/sap/base/util/restricted/_xor.js +1 -1
  58. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  59. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  60. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  61. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  62. package/src/sap/base/util/syncFetch.js +2 -2
  63. package/src/sap/ui/Device.js +3 -3
  64. package/src/sap/ui/Global.js +4 -4
  65. package/src/sap/ui/base/Event.js +6 -4
  66. package/src/sap/ui/base/EventProvider.js +1 -1
  67. package/src/sap/ui/base/Interface.js +1 -1
  68. package/src/sap/ui/base/ManagedObject.js +2 -4
  69. package/src/sap/ui/base/ManagedObjectMetadata.js +4 -6
  70. package/src/sap/ui/base/Metadata.js +1 -1
  71. package/src/sap/ui/base/Object.js +1 -1
  72. package/src/sap/ui/base/ObjectPool.js +1 -1
  73. package/src/sap/ui/core/.library +2 -2
  74. package/src/sap/ui/core/AnimationMode.js +1 -1
  75. package/src/sap/ui/core/BusyIndicator.js +1 -1
  76. package/src/sap/ui/core/Component.js +1 -1
  77. package/src/sap/ui/core/ComponentContainer.js +1 -1
  78. package/src/sap/ui/core/ComponentMetadata.js +1 -1
  79. package/src/sap/ui/core/ComponentSupport.js +1 -1
  80. package/src/sap/ui/core/ConfigTest.js +17 -0
  81. package/src/sap/ui/core/Configuration.js +2 -14
  82. package/src/sap/ui/core/Control.js +4 -1
  83. package/src/sap/ui/core/ControlBehavior.js +2 -2
  84. package/src/sap/ui/core/Core.js +3 -1
  85. package/src/sap/ui/core/CustomData.js +1 -1
  86. package/src/sap/ui/core/DeclarativeSupport.js +1 -1
  87. package/src/sap/ui/core/Element.js +1 -1
  88. package/src/sap/ui/core/ElementMetadata.js +2 -4
  89. package/src/sap/ui/core/EnabledPropagator.js +1 -1
  90. package/src/sap/ui/core/EventBus.js +1 -1
  91. package/src/sap/ui/core/Fragment.js +1 -1
  92. package/src/sap/ui/core/HTML.js +1 -1
  93. package/src/sap/ui/core/History.js +1 -1
  94. package/src/sap/ui/core/Icon.js +1 -1
  95. package/src/sap/ui/core/IconPool.js +1 -2
  96. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  97. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  98. package/src/sap/ui/core/InvisibleMessage.js +1 -1
  99. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  100. package/src/sap/ui/core/InvisibleText.js +1 -1
  101. package/src/sap/ui/core/Item.js +1 -1
  102. package/src/sap/ui/core/LabelEnablement.js +1 -1
  103. package/src/sap/ui/core/LayoutData.js +1 -1
  104. package/src/sap/ui/core/Lib.js +17 -16
  105. package/src/sap/ui/core/ListItem.js +1 -1
  106. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  107. package/src/sap/ui/core/Locale.js +5 -2
  108. package/src/sap/ui/core/LocaleData.js +12 -4
  109. package/src/sap/ui/core/Manifest.js +5 -5
  110. package/src/sap/ui/core/Message.js +1 -1
  111. package/src/sap/ui/core/Popup.js +37 -50
  112. package/src/sap/ui/core/RenderManager.js +1 -1
  113. package/src/sap/ui/core/Renderer.js +1 -1
  114. package/src/sap/ui/core/Rendering.js +1 -1
  115. package/src/sap/ui/core/ResizeHandler.js +1 -1
  116. package/src/sap/ui/core/ScrollBar.js +1 -1
  117. package/src/sap/ui/core/SeparatorItem.js +1 -1
  118. package/src/sap/ui/core/Shortcut.js +11 -9
  119. package/src/sap/ui/core/StaticArea.js +1 -1
  120. package/src/sap/ui/core/Theming.js +16 -9
  121. package/src/sap/ui/core/Title.js +1 -1
  122. package/src/sap/ui/core/TooltipBase.js +1 -1
  123. package/src/sap/ui/core/UIArea.js +1 -1
  124. package/src/sap/ui/core/UIComponent.js +1 -1
  125. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  126. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  127. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  128. package/src/sap/ui/core/XMLComposite.js +1 -1
  129. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  130. package/src/sap/ui/core/XMLTemplateProcessor.js +27 -5
  131. package/src/sap/ui/core/_IconRegistry.js +82 -11
  132. package/src/sap/ui/core/boot/_bootConfig.js +137 -0
  133. package/src/sap/ui/core/boot/_runBoot.js +16 -0
  134. package/src/sap/ui/core/boot/initDOM.js +96 -0
  135. package/src/sap/ui/core/boot/loadCalendar.js +50 -0
  136. package/src/sap/ui/core/boot/loadManifest.js +55 -0
  137. package/src/sap/ui/core/boot/loadModules.js +80 -0
  138. package/src/sap/ui/core/boot/manifest.json +11 -0
  139. package/src/sap/ui/core/boot/onInit.js +44 -0
  140. package/src/sap/ui/core/boot.js +107 -0
  141. package/src/sap/ui/core/date/UI5Date.js +9 -3
  142. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  143. package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
  144. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  145. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  146. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  147. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  148. package/src/sap/ui/core/format/DateFormat.js +13 -12
  149. package/src/sap/ui/core/format/TimezoneUtil.js +1 -1
  150. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  151. package/src/sap/ui/core/library.js +32 -6
  152. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  153. package/src/sap/ui/core/message/Message.js +1 -1
  154. package/src/sap/ui/core/message/MessageManager.js +1 -1
  155. package/src/sap/ui/core/message/MessageMixin.js +6 -5
  156. package/src/sap/ui/core/message/MessageParser.js +1 -1
  157. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  158. package/src/sap/ui/core/messagebundle_ar.properties +57 -55
  159. package/src/sap/ui/core/messagebundle_bg.properties +57 -55
  160. package/src/sap/ui/core/messagebundle_ca.properties +30 -28
  161. package/src/sap/ui/core/messagebundle_cs.properties +43 -41
  162. package/src/sap/ui/core/messagebundle_cy.properties +58 -56
  163. package/src/sap/ui/core/messagebundle_da.properties +56 -54
  164. package/src/sap/ui/core/messagebundle_de.properties +58 -56
  165. package/src/sap/ui/core/messagebundle_el.properties +47 -45
  166. package/src/sap/ui/core/messagebundle_en.properties +58 -56
  167. package/src/sap/ui/core/messagebundle_en_GB.properties +58 -56
  168. package/src/sap/ui/core/messagebundle_en_US_sappsd.properties +2 -0
  169. package/src/sap/ui/core/messagebundle_en_US_saprigi.properties +2 -0
  170. package/src/sap/ui/core/messagebundle_en_US_saptrc.properties +3 -0
  171. package/src/sap/ui/core/messagebundle_es.properties +47 -45
  172. package/src/sap/ui/core/messagebundle_es_MX.properties +57 -55
  173. package/src/sap/ui/core/messagebundle_et.properties +54 -52
  174. package/src/sap/ui/core/messagebundle_fi.properties +51 -49
  175. package/src/sap/ui/core/messagebundle_fr.properties +36 -34
  176. package/src/sap/ui/core/messagebundle_fr_CA.properties +21 -19
  177. package/src/sap/ui/core/messagebundle_hi.properties +42 -40
  178. package/src/sap/ui/core/messagebundle_hr.properties +57 -55
  179. package/src/sap/ui/core/messagebundle_hu.properties +58 -56
  180. package/src/sap/ui/core/messagebundle_id.properties +58 -56
  181. package/src/sap/ui/core/messagebundle_it.properties +59 -57
  182. package/src/sap/ui/core/messagebundle_iw.properties +58 -56
  183. package/src/sap/ui/core/messagebundle_ja.properties +50 -48
  184. package/src/sap/ui/core/messagebundle_kk.properties +43 -41
  185. package/src/sap/ui/core/messagebundle_ko.properties +19 -17
  186. package/src/sap/ui/core/messagebundle_lt.properties +58 -56
  187. package/src/sap/ui/core/messagebundle_lv.properties +58 -56
  188. package/src/sap/ui/core/messagebundle_ms.properties +58 -56
  189. package/src/sap/ui/core/messagebundle_nl.properties +57 -55
  190. package/src/sap/ui/core/messagebundle_no.properties +55 -53
  191. package/src/sap/ui/core/messagebundle_pl.properties +55 -53
  192. package/src/sap/ui/core/messagebundle_pt.properties +57 -55
  193. package/src/sap/ui/core/messagebundle_pt_PT.properties +57 -55
  194. package/src/sap/ui/core/messagebundle_ro.properties +58 -56
  195. package/src/sap/ui/core/messagebundle_ru.properties +57 -55
  196. package/src/sap/ui/core/messagebundle_sh.properties +58 -56
  197. package/src/sap/ui/core/messagebundle_sk.properties +57 -55
  198. package/src/sap/ui/core/messagebundle_sl.properties +58 -56
  199. package/src/sap/ui/core/messagebundle_sv.properties +54 -52
  200. package/src/sap/ui/core/messagebundle_th.properties +17 -15
  201. package/src/sap/ui/core/messagebundle_tr.properties +58 -56
  202. package/src/sap/ui/core/messagebundle_uk.properties +58 -56
  203. package/src/sap/ui/core/messagebundle_vi.properties +58 -56
  204. package/src/sap/ui/core/messagebundle_zh_CN.properties +58 -56
  205. package/src/sap/ui/core/messagebundle_zh_TW.properties +58 -56
  206. package/src/sap/ui/core/mvc/HTMLView.js +1 -1
  207. package/src/sap/ui/core/mvc/JSONView.js +1 -1
  208. package/src/sap/ui/core/mvc/JSView.js +1 -1
  209. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  210. package/src/sap/ui/core/mvc/View.js +1 -1
  211. package/src/sap/ui/core/mvc/XMLView.js +14 -2
  212. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  213. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  214. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  215. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  216. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  217. package/src/sap/ui/core/rules/Misc.support.js +1 -1
  218. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
  219. package/src/sap/ui/core/search/SearchProvider.js +1 -1
  220. package/src/sap/ui/core/service/Service.js +1 -1
  221. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  222. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  223. package/src/sap/ui/core/support/Plugin.js +1 -1
  224. package/src/sap/ui/core/support/Support.js +7 -4
  225. package/src/sap/ui/core/support/plugins/ControlTree.js +1 -1
  226. package/src/sap/ui/core/support/plugins/Interaction.js +1 -1
  227. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  228. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  229. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  230. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  231. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  232. package/src/sap/ui/core/support/plugins/ViewInfo.js +1 -1
  233. package/src/sap/ui/core/themes/base/Icon.less +2 -2
  234. package/src/sap/ui/core/theming/Parameters.js +0 -5
  235. package/src/sap/ui/core/theming/ThemeManager.js +3 -4
  236. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  237. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  238. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  239. package/src/sap/ui/core/tmpl/Template.js +1 -1
  240. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  241. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  242. package/src/sap/ui/core/util/Export.js +1 -1
  243. package/src/sap/ui/core/util/ExportCell.js +1 -1
  244. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  245. package/src/sap/ui/core/util/ExportRow.js +1 -1
  246. package/src/sap/ui/core/util/ExportType.js +1 -1
  247. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  248. package/src/sap/ui/core/util/File.js +1 -1
  249. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  250. package/src/sap/ui/core/util/MockServer.js +4 -5
  251. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  252. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  253. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  254. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  255. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  256. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  257. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  258. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  259. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  260. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  261. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  262. package/src/sap/ui/debug/ControlTree.js +1 -1
  263. package/src/sap/ui/debug/DebugEnv.js +1 -1
  264. package/src/sap/ui/debug/PropertyList.js +1 -1
  265. package/src/sap/ui/model/ClientModel.js +1 -1
  266. package/src/sap/ui/model/CompositeDataState.js +1 -1
  267. package/src/sap/ui/model/CompositeType.js +1 -1
  268. package/src/sap/ui/model/DataState.js +1 -1
  269. package/src/sap/ui/model/MetaModel.js +1 -1
  270. package/src/sap/ui/model/Model.js +1 -1
  271. package/src/sap/ui/model/SelectionModel.js +1 -1
  272. package/src/sap/ui/model/SimpleType.js +1 -1
  273. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  274. package/src/sap/ui/model/Type.js +1 -1
  275. package/src/sap/ui/model/analytics/AnalyticalBinding.js +166 -79
  276. package/src/sap/ui/model/analytics/AnalyticalVersionInfo.js +4 -3
  277. package/src/sap/ui/model/analytics/BatchResponseCollector.js +2 -2
  278. package/src/sap/ui/model/analytics/ODataModelAdapter.js +14 -27
  279. package/src/sap/ui/model/analytics/odata4analytics.js +6 -12
  280. package/src/sap/ui/model/base/ManagedObjectModel.js +2 -1
  281. package/src/sap/ui/model/json/JSONModel.js +6 -1
  282. package/src/sap/ui/model/message/MessageModel.js +1 -1
  283. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  284. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  285. package/src/sap/ui/model/odata/ODataMetaModel.js +191 -5
  286. package/src/sap/ui/model/odata/ODataMetadata.js +38 -4
  287. package/src/sap/ui/model/odata/ODataModel.js +1 -1
  288. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  289. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  290. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  291. package/src/sap/ui/model/odata/type/Date.js +1 -1
  292. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  293. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  294. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  295. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +1 -1
  296. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  297. package/src/sap/ui/model/odata/type/Double.js +1 -1
  298. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  299. package/src/sap/ui/model/odata/type/Int.js +1 -1
  300. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  301. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  302. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  303. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  304. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  305. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  306. package/src/sap/ui/model/odata/type/Single.js +1 -1
  307. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  308. package/src/sap/ui/model/odata/type/String.js +1 -1
  309. package/src/sap/ui/model/odata/type/Time.js +1 -1
  310. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  311. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  312. package/src/sap/ui/model/odata/v2/Context.js +1 -1
  313. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  314. package/src/sap/ui/model/odata/v2/ODataModel.js +2 -2
  315. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +1 -1
  316. package/src/sap/ui/model/odata/v4/AnnotationHelper.js +4 -4
  317. package/src/sap/ui/model/odata/v4/Context.js +33 -30
  318. package/src/sap/ui/model/odata/v4/ODataBinding.js +18 -14
  319. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +12 -12
  320. package/src/sap/ui/model/odata/v4/ODataListBinding.js +110 -43
  321. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +20 -28
  322. package/src/sap/ui/model/odata/v4/ODataModel.js +40 -31
  323. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +8 -6
  324. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +14 -14
  325. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +93 -9
  326. package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +25 -27
  327. package/src/sap/ui/model/odata/v4/lib/_Cache.js +58 -195
  328. package/src/sap/ui/model/odata/v4/lib/_Helper.js +157 -0
  329. package/src/sap/ui/model/odata/v4/lib/_MetadataRequestor.js +14 -5
  330. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +27 -15
  331. package/src/sap/ui/model/resource/ResourceModel.js +1 -1
  332. package/src/sap/ui/model/type/Boolean.js +1 -1
  333. package/src/sap/ui/model/type/Currency.js +1 -1
  334. package/src/sap/ui/model/type/Date.js +1 -1
  335. package/src/sap/ui/model/type/DateInterval.js +1 -1
  336. package/src/sap/ui/model/type/DateTime.js +1 -1
  337. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  338. package/src/sap/ui/model/type/FileSize.js +1 -1
  339. package/src/sap/ui/model/type/Float.js +1 -1
  340. package/src/sap/ui/model/type/Integer.js +1 -1
  341. package/src/sap/ui/model/type/String.js +1 -1
  342. package/src/sap/ui/model/type/Time.js +1 -1
  343. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  344. package/src/sap/ui/model/type/Unit.js +1 -1
  345. package/src/sap/ui/model/xml/XMLModel.js +1 -1
  346. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  347. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  348. package/src/sap/ui/test/TestUtils.js +1 -1
  349. package/src/sap/ui/test/generic/TestBase.js +1 -1
  350. package/src/sap/ui/test/generic/_EnforceSemanticRendering.js +1 -3
  351. package/src/sap/ui/test/matchers/_Visitor.js +6 -1
  352. package/src/sap/ui/test/starter/_setupAndStart.js +2 -5
  353. package/src/sap/ui/thirdparty/qunit-2.js +9 -3
  354. package/src/sap/ui/util/Mobile.js +10 -6
  355. package/src/sap/ui/util/Storage.js +1 -1
  356. package/src/sap-ui-boot.js +23 -6
  357. package/src/ui5-boot.js +50 -0
  358. package/src/ui5loader-autoconfig.js +147 -75
  359. package/src/ui5loader.js +320 -360
  360. package/test/sap/ui/core/Device.js +1 -1
  361. package/test/sap/ui/core/demokit/sample/OpaAction/applicationUnderTest/view/Main.view.xml +1 -0
  362. package/test/sap/ui/core/demokit/sample/ViewTemplate/types/Template.controller.js +2 -2
  363. package/test/sap/ui/core/demokit/sample/odata/v2/AutoExpand/AutoExpand.view.xml +24 -5
  364. package/test/sap/ui/core/demokit/sample/odata/v4/Ancestry/Main.view.xml +24 -6
  365. package/test/sap/ui/core/demokit/sample/odata/v4/DataAggregation/DataAggregation.view.xml +20 -5
  366. package/test/sap/ui/core/demokit/sample/odata/v4/DataAggregation/Opa.qunit.js +2 -1
  367. package/test/sap/ui/core/demokit/sample/odata/v4/DeepCreate/Opa.qunit.js +2 -1
  368. package/test/sap/ui/core/demokit/sample/odata/v4/Draft/Opa.qunit.js +2 -1
  369. package/test/sap/ui/core/demokit/sample/odata/v4/FieldGroups/Opa.qunit.js +2 -1
  370. package/test/sap/ui/core/demokit/sample/odata/v4/FlatDataAggregation/FlatDataAggregation.view.xml +4 -1
  371. package/test/sap/ui/core/demokit/sample/odata/v4/FlexibleColumnLayout/Opa.qunit.js +2 -1
  372. package/test/sap/ui/core/demokit/sample/odata/v4/GridTable/GridTable.view.xml +12 -3
  373. package/test/sap/ui/core/demokit/sample/odata/v4/LateProperties/Main.controller.js +2 -1
  374. package/test/sap/ui/core/demokit/sample/odata/v4/LateProperties/Opa.OptimisticBatch.qunit.js +2 -1
  375. package/test/sap/ui/core/demokit/sample/odata/v4/LateProperties/Opa.qunit.js +2 -1
  376. package/test/sap/ui/core/demokit/sample/odata/v4/ListBinding/Opa.qunit.js +2 -1
  377. package/test/sap/ui/core/demokit/sample/odata/v4/ListBindingTemplate/Opa.qunit.js +2 -1
  378. package/test/sap/ui/core/demokit/sample/odata/v4/MultipleInlineCreationRowsGrid/Opa.qunit.js +2 -1
  379. package/test/sap/ui/core/demokit/sample/odata/v4/Products/Opa.qunit.js +2 -1
  380. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/RecursiveHierarchy.view.xml +26 -8
  381. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/data/metadata.xml +4 -0
  382. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrderTP100_V2/Opa.qunit.js +2 -1
  383. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrderTP100_V4/Opa.qunit.js +2 -1
  384. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/Opa.qunit.js +2 -1
  385. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/pages/Main.js +18 -0
  386. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/tests/Create.js +10 -6
  387. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrdersRTATest/Opa.qunit.js +2 -1
  388. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrdersRTATest/manifest.json +18 -0
  389. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrdersTemplate/Opa.qunit.js +2 -1
  390. package/test/sap/ui/core/demokit/sample/odata/v4/ServerDrivenPaging/Opa.qunit.js +2 -1
  391. package/test/sap/ui/core/demokit/sample/odata/v4/ServerDrivenPaging/pages/Main.js +4 -1
  392. package/test/sap/ui/core/demokit/sample/odata/v4/Sticky/Opa.qunit.js +2 -1
  393. package/test/sap/ui/core/demokit/tutorial/odatav4/06/webapp/controller/App.controller.js +1 -6
  394. package/test/sap/ui/core/demokit/tutorial/odatav4/06/webapp/localService/mockserver.js +1 -0
  395. package/test/sap/ui/core/demokit/tutorial/odatav4/07/webapp/controller/App.controller.js +1 -6
  396. package/test/sap/ui/core/demokit/tutorial/odatav4/07/webapp/localService/mockserver.js +1 -0
  397. package/test/sap/ui/core/demokit/tutorial/odatav4/08/webapp/controller/App.controller.js +1 -6
  398. package/test/sap/ui/core/demokit/tutorial/odatav4/08/webapp/localService/mockserver.js +1 -0
  399. package/test/sap/ui/core/demokit/tutorial/odatav4/09/webapp/controller/App.controller.js +1 -6
  400. package/test/sap/ui/core/demokit/tutorial/odatav4/09/webapp/localService/mockserver.js +1 -0
  401. package/test/sap/ui/core/demokit/tutorial/odatav4/10/webapp/controller/App.controller.js +3 -8
  402. package/test/sap/ui/core/demokit/tutorial/odatav4/10/webapp/localService/mockserver.js +1 -0
  403. package/test/sap/ui/core/demokit/tutorial/odatav4/11/webapp/controller/App.controller.js +3 -8
  404. package/test/sap/ui/core/demokit/tutorial/odatav4/11/webapp/localService/mockserver.js +1 -0
  405. package/test/sap/ui/core/qunit/IconPool.qunit.js +53 -4
  406. package/test/sap/ui/core/qunit/ManagedObjectModel.qunit.js +43 -5
  407. package/test/sap/ui/core/qunit/Theming.qunit.js +19 -1
  408. package/test/sap/ui/core/qunit/analytics/AnalyticalBinding.qunit.js +510 -185
  409. package/test/sap/ui/core/qunit/analytics/ODataModelAdapter.qunit.js +80 -10
  410. package/test/sap/ui/core/qunit/analytics/odata4analytics.qunit.js +20 -29
  411. package/test/sap/ui/core/qunit/base/Config_cascade.qunit.js +18 -1
  412. package/test/sap/ui/core/qunit/base/i18n/Formatting.qunit.js +15 -13
  413. package/test/sap/ui/core/qunit/base/i18n/Localization.qunit.js +35 -12
  414. package/test/sap/ui/core/qunit/bootstrap/Configuration.main.qunit.js +11 -0
  415. package/test/sap/ui/core/qunit/bootstrap/Configuration.qunit.html +4 -3
  416. package/test/sap/ui/core/qunit/bootstrap/Configuration.qunit.js +71 -35
  417. package/test/sap/ui/core/qunit/bootstrap/_checkCoreAndLibraryBooted.qunit.js +1 -1
  418. package/test/sap/ui/core/qunit/component/Models.qunit.js +5 -2
  419. package/test/sap/ui/core/qunit/generic/EnforceSemanticRendering.qunit.js +2 -2
  420. package/test/sap/ui/core/qunit/generic/SettersContextReturn.qunit.js +2 -2
  421. package/test/sap/ui/core/qunit/generic/legacy/SettersContextReturn.qunit.js +2 -2
  422. package/test/sap/ui/core/qunit/i18n/LocaleData.qunit.js +48 -13
  423. package/test/sap/ui/core/qunit/i18n/UI5Date.qunit.js +16 -4
  424. package/test/sap/ui/core/qunit/i18n/UniversalDate.qunit.js +73 -103
  425. package/test/sap/ui/core/qunit/i18n/UniversalDateUtils.qunit.js +34 -39
  426. package/test/sap/ui/core/qunit/internal/BeforePush.ODataV4.js +28 -0
  427. package/test/sap/ui/core/qunit/internal/BeforePush.html +1 -0
  428. package/test/sap/ui/core/qunit/internal/BeforePush.js +15 -0
  429. package/test/sap/ui/core/qunit/internal/performance/ExpressionParser.performance.qunit.js +1 -0
  430. package/test/sap/ui/core/qunit/loader/asyncMode.qunit.js +2 -2
  431. package/test/sap/ui/core/qunit/loader/asyncMode_unavoidablySync.qunit.js +1 -1
  432. package/test/sap/ui/core/qunit/loader/testsuite.loader.qunit.js +0 -3
  433. package/test/sap/ui/core/qunit/model/FAR_CUSTOMER_LINE_ITEMS.metadata.xml +2 -0
  434. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessorRequireXML.qunit.js +51 -0
  435. package/test/sap/ui/core/qunit/mvc/testdata/Async.view.xml +1 -1
  436. package/test/sap/ui/core/qunit/mvc/testdata/AsyncTypedView.js +5 -1
  437. package/test/sap/ui/core/qunit/odata/ODataMetadataNoFakeService.qunit.js +68 -4
  438. package/test/sap/ui/core/qunit/odata/v2/ODataModel.integration.qunit.js +232 -37
  439. package/test/sap/ui/core/qunit/odata/v2/V2ODataModel.qunit.js +1 -1
  440. package/test/sap/ui/core/qunit/odata/v4/Context.qunit.js +10 -5
  441. package/test/sap/ui/core/qunit/odata/v4/ODataBinding.qunit.js +33 -1
  442. package/test/sap/ui/core/qunit/odata/v4/ODataContextBinding.qunit.js +5 -3
  443. package/test/sap/ui/core/qunit/odata/v4/ODataListBinding.qunit.js +186 -65
  444. package/test/sap/ui/core/qunit/odata/v4/ODataMetaModel.qunit.js +17 -66
  445. package/test/sap/ui/core/qunit/odata/v4/ODataModel.integration.qunit.js +528 -60
  446. package/test/sap/ui/core/qunit/odata/v4/ODataModel.qunit.js +48 -8
  447. package/test/sap/ui/core/qunit/odata/v4/ODataModel.realOData.qunit.js +0 -3
  448. package/test/sap/ui/core/qunit/odata/v4/data/metadata.json +2 -1
  449. package/test/sap/ui/core/qunit/odata/v4/data/metadata.xml +4 -0
  450. package/test/sap/ui/core/qunit/odata/v4/data/metadata_special_cases.xml +2 -0
  451. package/test/sap/ui/core/qunit/odata/v4/lib/_AggregationCache.qunit.js +148 -1
  452. package/test/sap/ui/core/qunit/odata/v4/lib/_AggregationHelper.qunit.js +24 -11
  453. package/test/sap/ui/core/qunit/odata/v4/lib/_Cache.qunit.js +196 -404
  454. package/test/sap/ui/core/qunit/odata/v4/lib/_Helper.qunit.js +201 -2
  455. package/test/sap/ui/core/qunit/odata/v4/lib/_MetadataRequestor.qunit.js +7 -3
  456. package/test/sap/ui/core/qunit/odata/v4/lib/_Requestor.qunit.js +21 -4
  457. package/test/sap/ui/core/qunit/opa/matchers/LabelFor.qunit.js +4 -2
  458. package/test/sap/ui/core/qunit/opa/matchers/_Busy.qunit.js +129 -2
  459. package/test/sap/ui/core/qunit/opa/matchers/_Editable.qunit.js +5 -1
  460. package/test/sap/ui/core/qunit/routing/fixture/Async1.view.xml +1 -1
  461. package/test/sap/ui/core/qunit/testdata/xml-require/helper/Formatter.js +7 -4
  462. package/test/sap/ui/core/qunit/testdata/xml-require/view/XMLTemplateProcessorAsync_require_in_html.view.xml +36 -0
  463. package/test/sap/ui/core/qunit/testsuites/testsuite.theming.qunit.js +2 -2
  464. package/test/sap/ui/core/qunit/types/DateFormatTimezones.qunit.js +1222 -1201
  465. package/test/sap/ui/core/qunit/util/Popup.qunit.js +7 -11
  466. package/test/sap/ui/core/qunit/util/XMLPreprocessor.qunit.js +3 -1
  467. package/test/sap/ui/core/qunit/util/jQuery.sap.Version.qunit.js +3 -0
  468. package/test/sap/ui/core/qunit/util/reflection/BaseTreeModifier.qunit.js +1 -1
  469. package/test/sap/ui/core/relnotes/changes-1.116.json +1 -12
  470. package/test/sap/ui/core/relnotes/changes-1.117.json +127 -0
  471. package/test/sap/ui/core/visual/images/HyphenationPlayground/windows/1600x1200/chrome/horizon/ltr/cozy/19_thirdParty_language_sl.ref.lnk +1 -1
  472. package/ui5.yaml +165 -0
  473. package/src/sap/ui/core/util/MockServerAnnotationsHandler.js +0 -45
  474. /package/test/sap/ui/core/qunit/bootstrap/{GlobalConfigurationSettings.js → Configuration.beforeBootstrap.qunit.js} +0 -0
@@ -98,7 +98,7 @@ sap.ui.define([
98
98
  * @param {string} sTitle - A test title
99
99
  * @param {object} assert - The QUnit assert object
100
100
  * @param {sap.m.Table|sap.ui.table.Table} oTable - A table
101
- * @param {string[]} aExpectedPaths - List of all expected current conntext paths
101
+ * @param {string[]} aExpectedPaths - List of all expected (normalized) current context paths
102
102
  * @param {any[][]} aExpectedContent - "Table" of expected cell contents
103
103
  * @param {number} [iExpectedLength=aExpectedPaths.length] - Expected length
104
104
  */
@@ -110,7 +110,8 @@ sap.ui.define([
110
110
  assert.strictEqual(oListBinding.isLengthFinal(), true, "length is final");
111
111
  assert.strictEqual(oListBinding.getLength(), iExpectedLength || aExpectedPaths.length,
112
112
  sTitle);
113
- assert.deepEqual(oListBinding.getAllCurrentContexts().map(getPath), aExpectedPaths);
113
+ assert.deepEqual(oListBinding.getAllCurrentContexts().map(getNormalizedPath),
114
+ aExpectedPaths);
114
115
 
115
116
  aExpectedContent = aExpectedContent.map(function (aTexts) {
116
117
  return aTexts.map(function (vText) {
@@ -5233,7 +5234,9 @@ sap.ui.define([
5233
5234
  return Promise.all([
5234
5235
  Promise.resolve().then(function () {
5235
5236
  // code under test
5236
- oTable.destroy();
5237
+ // Note: oTable.destroy(); not allowed for direct children of XMLView!
5238
+ that.oView.destroy();
5239
+ delete that.oView;
5237
5240
  }),
5238
5241
  that.waitForChanges(assert)
5239
5242
  ]);
@@ -8594,7 +8597,7 @@ sap.ui.define([
8594
8597
  var oTable = that.oView.byId("table");
8595
8598
 
8596
8599
  that.expectChange("note", ["bar", "foo"])
8597
- .expectChange("companyName", [null, "SAP"])
8600
+ .expectChange("companyName", ["", "SAP"])
8598
8601
  .expectChange("buyerID", ["24", "23"])
8599
8602
  .expectChange("note", ["baz"]);
8600
8603
 
@@ -11100,11 +11103,11 @@ sap.ui.define([
11100
11103
  }]
11101
11104
  })
11102
11105
  .expectChange("city", ["Walldorf"])
11103
- .expectChange("longitude", [null]);
11106
+ .expectChange("longitude", ["0.000000000000"]); // default value
11104
11107
 
11105
11108
  return this.createView(assert, sView, oModel).then(function () {
11106
11109
  that.expectChange("city", ["", "Walldorf"])
11107
- .expectChange("longitude", ["0.000000000000", null]);
11110
+ .expectChange("longitude", [, "0.000000000000"]);
11108
11111
 
11109
11112
  oTable = that.oView.byId("table");
11110
11113
  oTable.getBinding("items").create();
@@ -18207,9 +18210,7 @@ sap.ui.define([
18207
18210
  method : "DELETE",
18208
18211
  url : "BusinessPartnerList('0100000000')"
18209
18212
  })
18210
- // Note: The value of the property binding is undefined because there is no
18211
- // explicit cache value for it, but the type's formatValue converts this to null.
18212
- .expectChange("companyName", null)
18213
+ .expectChange("companyName", "") // defaulting to null in the cache
18213
18214
  .expectChange("phoneNumber", null);
18214
18215
 
18215
18216
  return Promise.all([
@@ -19236,6 +19237,72 @@ sap.ui.define([
19236
19237
  });
19237
19238
  });
19238
19239
 
19240
+ //*********************************************************************************************
19241
+ // Scenario: Deferred delete in a nested list w/o cache. Filter in the parent list, so that the
19242
+ // parent entity drops out. Then submit or reset (canceling the delete).
19243
+ // BCP: 2380081607
19244
+ [false, true].forEach(function (bReset) {
19245
+ QUnit.test("ODLB: no cache, deferred delete, parent lost, reset=" + bReset, function (assert) {
19246
+ var oDeletePromise,
19247
+ oModel = this.createTeaBusiModel({autoExpandSelect : true, updateGroupId : "update"}),
19248
+ sView = '\
19249
+ <Table id="teams" items="{/TEAMS}">\
19250
+ <Text id="team" text="{Team_Id}"/>\
19251
+ <Table items="{path : \'TEAM_2_EMPLOYEES\', templateShareable : true}">\
19252
+ <Text id="employee" text="{ID}"/>\
19253
+ </Table>\
19254
+ </Table>',
19255
+ that = this;
19256
+
19257
+ this.expectRequest("TEAMS?$select=Team_Id&$expand=TEAM_2_EMPLOYEES($select=ID)"
19258
+ + "&$skip=0&$top=100", {
19259
+ value : [{
19260
+ Team_Id : "TEAM_1",
19261
+ TEAM_2_EMPLOYEES : [{ID : "1"}, {ID : "2"}]
19262
+ }]
19263
+ })
19264
+ .expectChange("team", ["TEAM_1"])
19265
+ .expectChange("employee", ["1", "2"]);
19266
+
19267
+ return this.createView(assert, sView, oModel).then(function () {
19268
+ that.expectChange("employee", ["2"]);
19269
+
19270
+ oDeletePromise = that.oView.byId("teams").getItems()[0].getCells()[1]
19271
+ .getBinding("items").getCurrentContexts()[0].delete();
19272
+
19273
+ return that.waitForChanges(assert);
19274
+ }).then(function () {
19275
+ that.expectRequest("TEAMS?$select=Team_Id&$expand=TEAM_2_EMPLOYEES($select=ID)"
19276
+ + "&$filter=Team_Id ne '1'&$skip=0&$top=100", {value : []});
19277
+
19278
+ that.oView.byId("teams").getBinding("items")
19279
+ .filter(new Filter("Team_Id", FilterOperator.NE, "1"));
19280
+
19281
+ return that.waitForChanges(assert);
19282
+ }).then(function () {
19283
+ if (bReset) {
19284
+ that.expectCanceledError("Failed to delete /TEAMS('TEAM_1')/TEAM_2_EMPLOYEES('1')",
19285
+ "Request canceled: DELETE EMPLOYEES('1'); group: update");
19286
+
19287
+ oModel.resetChanges();
19288
+ } else {
19289
+ that.expectRequest("DELETE EMPLOYEES('1')");
19290
+ }
19291
+
19292
+ return Promise.all([
19293
+ oModel.submitBatch("update"),
19294
+ oDeletePromise.then(function () {
19295
+ assert.notOk(bReset);
19296
+ }, function (oError) {
19297
+ assert.ok(bReset);
19298
+ assert.ok(oError.canceled);
19299
+ }),
19300
+ that.waitForChanges(assert)
19301
+ ]);
19302
+ });
19303
+ });
19304
+ });
19305
+
19239
19306
  //*********************************************************************************************
19240
19307
  // Scenario: Create and persist two contexts using "end of start". Delete one via API group and
19241
19308
  // the other one via $auto (to see that we must react on the last deletion). Create a third
@@ -19376,6 +19443,7 @@ sap.ui.define([
19376
19443
  }).then(function (aResult) {
19377
19444
  oPromise = aResult[0].delete(); // delete the RVC
19378
19445
 
19446
+ // It's not possible to synchronously reset after delete, so wait a short moment.
19379
19447
  return that.waitForChanges(assert, "deferred delete");
19380
19448
  }).then(function () {
19381
19449
  that.expectCanceledError(
@@ -24496,8 +24564,8 @@ sap.ui.define([
24496
24564
  return that.oView.byId("table").getItems()[0].getBindingContext()
24497
24565
  .requestSideEffects([{$PropertyPath : "Country"}])
24498
24566
  .then(mustFail(assert), function (oError) {
24499
- assert.strictEqual(oError.message, "Must not request side effects for a context"
24500
- + " of a binding with $$aggregation");
24567
+ assert.strictEqual(oError.message,
24568
+ "Must not request side effects when using data aggregation");
24501
24569
  });
24502
24570
  });
24503
24571
  });
@@ -24650,7 +24718,7 @@ sap.ui.define([
24650
24718
  that.expectChange("count", "1");
24651
24719
 
24652
24720
  // code under test
24653
- that.oView.byId("count").setBindingContext(oListBinding.getHeaderContext());
24721
+ that.oView.byId("count").setBindingContext(oHeaderContext);
24654
24722
 
24655
24723
  return that.waitForChanges(assert, "$count");
24656
24724
  }).then(function () {
@@ -24752,11 +24820,6 @@ sap.ui.define([
24752
24820
  ]);
24753
24821
  assert.strictEqual(oListBinding.getCount(), 1, "count of nodes"); // code under test
24754
24822
 
24755
- assert.throws(function () {
24756
- // code under test (JIRA: CPOUI5ODATAV4-1851)
24757
- oListBinding.create();
24758
- }, new Error("Cannot create in " + oListBinding + " when using data aggregation"));
24759
-
24760
24823
  assert.throws(function () {
24761
24824
  // code under test (JIRA: CPOUI5ODATAV4-1851)
24762
24825
  oRoot.delete();
@@ -24936,7 +24999,7 @@ sap.ui.define([
24936
24999
  return Promise.all([
24937
25000
  // code under test
24938
25001
  // Note: $direct avoids "HTTP request was not processed because $batch failed"
24939
- oListBinding.getHeaderContext().requestSideEffects([""], "$direct")
25002
+ oHeaderContext.requestSideEffects([""], "$direct")
24940
25003
  .then(mustFail(assert), function (oError0) {
24941
25004
  assert.strictEqual(oError0, oError);
24942
25005
  }),
@@ -27411,6 +27474,175 @@ sap.ui.define([
27411
27474
  });
27412
27475
  });
27413
27476
 
27477
+ //*********************************************************************************************
27478
+ // Scenario: Show the single root node of a recursive hierarchy, which happens to be a leaf.
27479
+ // Create two new child nodes underneath.
27480
+ // Note: The "_Friend" navigation property is misused in order to have an artist play the role
27481
+ // of a hierarchy directory. This way, a draft root object is available (as needed by real
27482
+ // services).
27483
+ // JIRA: CPOUI5ODATAV4-1592
27484
+ QUnit.test("Recursive Hierarchy: create new children", function (assert) {
27485
+ var oChild, oListBinding, fnRespond, oRoot, oTable;
27486
+
27487
+ const oModel = this.createSpecialCasesModel({autoExpandSelect : true});
27488
+ const sFriend = "/Artists(ArtistID='99',IsActiveEntity=false)/_Friend";
27489
+ const sView = `
27490
+ <t:Table id="table" rows="{path : '/Artists(ArtistID=\\\'99\\\',IsActiveEntity=false)/_Friend',
27491
+ parameters : {
27492
+ $$aggregation : {
27493
+ hierarchyQualifier : 'OrgChart'
27494
+ }
27495
+ }}" threshold="0" visibleRowCount="3">
27496
+ <Text text="{= %{@$ui5.node.isExpanded} }"/>
27497
+ <Text text="{= %{@$ui5.node.level} }"/>
27498
+ <Text id="name" text="{Name}"/>
27499
+ </t:Table>`;
27500
+ const that = this;
27501
+
27502
+ this.expectRequest({
27503
+ batchNo : 1,
27504
+ url : sFriend.slice(1) + "?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels("
27505
+ + "HierarchyNodes=$root" + sFriend
27506
+ + ",HierarchyQualifier='OrgChart',NodeProperty='_/NodeID',Levels=1)"
27507
+ + "&$select=ArtistID,IsActiveEntity,Name,_/DrillState,_/NodeID"
27508
+ + "&$count=true&$skip=0&$top=3"
27509
+ }, {
27510
+ "@odata.count" : "1",
27511
+ value : [{
27512
+ ArtistID : "0",
27513
+ IsActiveEntity : false,
27514
+ Name : "Alpha",
27515
+ _ : {
27516
+ // DescendantCount : "0", // not needed w/o expandTo
27517
+ // DistanceFromRoot : "0", // not needed w/o expandTo
27518
+ DrillState : "leaf",
27519
+ NodeID : "0,false"
27520
+ }
27521
+ }]
27522
+ })
27523
+ .expectChange("name", ["Alpha"]);
27524
+
27525
+ return this.createView(assert, sView, oModel).then(function () {
27526
+ oTable = that.oView.byId("table");
27527
+ oRoot = oTable.getRows()[0].getBindingContext();
27528
+ oListBinding = oRoot.getBinding();
27529
+
27530
+ checkTable("root is leaf", assert, oTable, [
27531
+ sFriend + "(ArtistID='0',IsActiveEntity=false)"
27532
+ ], [
27533
+ [undefined, 1, "Alpha"],
27534
+ ["", "", ""],
27535
+ ["", "", ""]
27536
+ ]);
27537
+ assert.strictEqual(oRoot.getIndex(), 0);
27538
+
27539
+ assert.throws(function () {
27540
+ // code under test (missing "@$ui5.node.parent")
27541
+ oListBinding.create({}, /*bSkipRefresh*/true);
27542
+ }); // TypeError: Cannot read properties of undefined (reading 'getCanonicalPath')
27543
+
27544
+ that.expectChange("name", [, "Beta"])
27545
+ .expectRequest({
27546
+ method : "POST",
27547
+ url : sFriend.slice(1),
27548
+ payload : {
27549
+ "BestFriend@odata.bind" : "Artists(ArtistID='0',IsActiveEntity=false)",
27550
+ Name : "Beta"
27551
+ }
27552
+ }, new Promise(function (resolve) {
27553
+ fnRespond = resolve.bind(null, {
27554
+ "@odata.etag" : "etag1.0",
27555
+ ArtistID : "1",
27556
+ IsActiveEntity : false,
27557
+ Name : "Beta: β" // side effect
27558
+ });
27559
+ }));
27560
+
27561
+ // code under test
27562
+ oChild = oListBinding.create({
27563
+ "@$ui5.node.parent" : oRoot,
27564
+ Name : "Beta"
27565
+ }, /*bSkipRefresh*/true);
27566
+
27567
+ return that.waitForChanges(assert, "create 1st child");
27568
+ }).then(function () {
27569
+ checkTable("during creation", assert, oTable, [
27570
+ sFriend + "(ArtistID='0',IsActiveEntity=false)",
27571
+ sFriend + "($uid=...)"
27572
+ ], [
27573
+ [true, 1, "Alpha"],
27574
+ [undefined, 2, "Beta"],
27575
+ ["", "", ""]
27576
+ ]);
27577
+ assert.strictEqual(oChild.getIndex(), 1);
27578
+
27579
+ that.expectChange("name", [, "Beta: β"]);
27580
+
27581
+ fnRespond();
27582
+
27583
+ return Promise.all([
27584
+ oChild.created(),
27585
+ that.waitForChanges(assert, "respond")
27586
+ ]);
27587
+ }).then(function () {
27588
+ checkTable("after creation", assert, oTable, [
27589
+ sFriend + "(ArtistID='0',IsActiveEntity=false)",
27590
+ sFriend + "(ArtistID='1',IsActiveEntity=false)"
27591
+ ], [
27592
+ [true, 1, "Alpha"],
27593
+ [undefined, 2, "Beta: β"],
27594
+ ["", "", ""]
27595
+ ]);
27596
+ assert.strictEqual(oChild.getIndex(), 1);
27597
+ assert.deepEqual(oChild.getObject(), {
27598
+ "@$ui5.context.isTransient" : false,
27599
+ "@$ui5.node.level" : 2,
27600
+ "@odata.etag" : "etag1.0",
27601
+ ArtistID : "1",
27602
+ IsActiveEntity : false,
27603
+ Name : "Beta: β"
27604
+ });
27605
+
27606
+ that.expectChange("name", [, "Gamma", "Beta: β"])
27607
+ .expectRequest({
27608
+ method : "POST",
27609
+ url : sFriend.slice(1),
27610
+ payload : {
27611
+ "BestFriend@odata.bind" : "Artists(ArtistID='0',IsActiveEntity=false)",
27612
+ Name : "Gamma"
27613
+ }
27614
+ }, {
27615
+ ArtistID : "2",
27616
+ IsActiveEntity : false,
27617
+ Name : "Gamma: γ" // side effect
27618
+ })
27619
+ .expectChange("name", [, "Gamma: γ"]);
27620
+
27621
+ // code under test
27622
+ oChild = oListBinding.create({
27623
+ "@$ui5.node.parent" : oRoot,
27624
+ Name : "Gamma"
27625
+ }, /*bSkipRefresh*/true);
27626
+
27627
+ assert.strictEqual(oChild.getIndex(), 1);
27628
+
27629
+ return Promise.all([
27630
+ oChild.created(),
27631
+ that.waitForChanges(assert, "create 2nd child")
27632
+ ]);
27633
+ }).then(function () {
27634
+ checkTable("after creation", assert, oTable, [
27635
+ sFriend + "(ArtistID='0',IsActiveEntity=false)",
27636
+ sFriend + "(ArtistID='2',IsActiveEntity=false)",
27637
+ sFriend + "(ArtistID='1',IsActiveEntity=false)"
27638
+ ], [
27639
+ [true, 1, "Alpha"],
27640
+ [undefined, 2, "Gamma: γ"],
27641
+ [undefined, 2, "Beta: β"]
27642
+ ]);
27643
+ });
27644
+ });
27645
+
27414
27646
  //*********************************************************************************************
27415
27647
  // Scenario: Application tries to overwrite client-side instance annotations.
27416
27648
  // JIRA: CPOUI5UISERVICESV3-1220
@@ -28686,8 +28918,7 @@ sap.ui.define([
28686
28918
  undefined, undefined, {$$updateGroupId : "doNotSubmit"}).create();
28687
28919
  oCreationRowContext.setProperty("Price", "47"); // BCP: 2270087626
28688
28920
 
28689
- that.expectChange("price", null) // timing issue, #setProperty is too slow :-(
28690
- .expectChange("price", "47")
28921
+ that.expectChange("price", "47")
28691
28922
  .expectChange("artistName", "The Beatles (modified)");
28692
28923
 
28693
28924
  oCreationRow.setBindingContext(oCreationRowContext);
@@ -29375,7 +29606,7 @@ sap.ui.define([
29375
29606
  .expectChange("id", "42")
29376
29607
  .expectChange("isActive", "Yes")
29377
29608
  .expectChange("name", "Hour Frustrated")
29378
- .expectChange("inProcessByUser", null); // initialization due to #setContext
29609
+ .expectChange("inProcessByUser", ""); // initialization due to #setContext
29379
29610
 
29380
29611
  that.oView.setBindingContext(
29381
29612
  oModel.bindContext("/Artists(ArtistID='42',IsActiveEntity=true)", null,
@@ -32291,7 +32522,7 @@ sap.ui.define([
32291
32522
  SalesOrderID : "1",
32292
32523
  SO_2_BP : null
32293
32524
  })
32294
- .expectChange("company", null);
32525
+ .expectChange("company", "");
32295
32526
 
32296
32527
  return this.createView(assert, sView, oModel).then(function () {
32297
32528
  that.expectRequest("SalesOrderList('1')?$select=SO_2_BP"
@@ -32326,7 +32557,7 @@ sap.ui.define([
32326
32557
  + "&$expand=SO_2_BP($select=BusinessPartnerID,CompanyName)", {
32327
32558
  SO_2_BP : null
32328
32559
  })
32329
- .expectChange("company", null);
32560
+ .expectChange("company", "");
32330
32561
 
32331
32562
  return Promise.all([
32332
32563
  // code under test
@@ -32740,7 +32971,8 @@ sap.ui.define([
32740
32971
  }]
32741
32972
  })
32742
32973
  .expectChange("price", [,,,,,,, "7.77", "7.88"])
32743
- .expectChange("currency", [,,,,,,, "EUR", "EUR"]);
32974
+ .expectChange("currency", [,,,,,,, "EUR", "EUR"])
32975
+ .expectChange("inProcessByUser", [,,,,,,, "", ""]);
32744
32976
 
32745
32977
  oTable.setFirstVisibleRow(7);
32746
32978
 
@@ -36094,7 +36326,7 @@ sap.ui.define([
36094
36326
  // are formatted differently by sap.ui.model.odata.type.String#formatValue
36095
36327
  .expectChange("position", ["", "10"])
36096
36328
  .expectChange("quantity", [null, "7.000"])
36097
- .expectChange("product", [null, "2"])
36329
+ .expectChange("product", ["", "2"])
36098
36330
  .expectChange("position", ["20"])
36099
36331
  .expectChange("quantity", ["0.000"])
36100
36332
  .expectChange("product", ["3"])
@@ -37945,8 +38177,8 @@ sap.ui.define([
37945
38177
  BusinessPartnerId : "1",
37946
38178
  CompanyName : "SAP"
37947
38179
  })
37948
- .expectChange("city", [null])
37949
- .expectChange("type", [null])
38180
+ .expectChange("city", [""])
38181
+ .expectChange("type", [""])
37950
38182
  .expectChange("company", ["SAP"]);
37951
38183
 
37952
38184
  return Promise.all([
@@ -39597,7 +39829,7 @@ sap.ui.define([
39597
39829
  })
39598
39830
  .expectChange("budget", "1,234")
39599
39831
  .expectChange("name", "Team #1")
39600
- .expectChange("teamId", null);
39832
+ .expectChange("teamId", "");
39601
39833
 
39602
39834
  return this.createView(assert, sView, oModel).then(function () {
39603
39835
  oBinding = that.oView.byId("form").getObjectBinding();
@@ -39666,7 +39898,7 @@ sap.ui.define([
39666
39898
  TEAM_2_MANAGER : null
39667
39899
  })
39668
39900
  .expectChange("budget", "1,234")
39669
- .expectChange("teamId", null);
39901
+ .expectChange("teamId", "");
39670
39902
 
39671
39903
  oBinding.refresh();
39672
39904
 
@@ -43716,7 +43948,7 @@ sap.ui.define([
43716
43948
 
43717
43949
  return this.createView(assert, sView, oModel).then(function () {
43718
43950
  that.expectChange("name", ["John Doe"])
43719
- .expectChange("teamId", [null]);
43951
+ .expectChange("teamId", [""]);
43720
43952
 
43721
43953
  // code under test
43722
43954
  oContext = that.oView.byId("employees").getBinding("items")
@@ -49527,6 +49759,8 @@ sap.ui.define([
49527
49759
  // The response has fewer nested entities in different order (CPOUI5ODATAV4-2079)
49528
49760
  // Nested entities via initial data and via #create (CPOUI5ODATAV4-2036)
49529
49761
  // Optimize the refresh after create w/o bSkipRefresh (CPOUI5ODATAV4-2048)
49762
+ // Accept the complete response, not only $select (esp. GrossAmount) (CPOUI5ODATAV4-1977)
49763
+ // Also create the product (nested single below collection) (CPOUI5ODATAV4-1977)
49530
49764
  [false, true].forEach(function (bSkipRefresh) {
49531
49765
  var sTitle = "CPOUI5ODATAV4-1973: Deep create, nested ODLB w/o cache, bSkipRefresh="
49532
49766
  + bSkipRefresh;
@@ -49542,26 +49776,33 @@ sap.ui.define([
49542
49776
  <Text id="order" text="{SalesOrderID}"/>\
49543
49777
  <Table items="{path : \'SO_2_SOITEM\', templateShareable : true}">\
49544
49778
  <Input id="note" value="{Note}"/>\
49779
+ <Text id="productId" text="{SOITEM_2_PRODUCT/ProductID}"/>\
49780
+ <Input id="productName" value="{SOITEM_2_PRODUCT/Name}"/>\
49545
49781
  </Table>\
49546
49782
  </Table>',
49547
49783
  that = this;
49548
49784
 
49549
49785
  this.expectRequest("SalesOrderList?$select=SalesOrderID"
49550
- + "&$expand=SO_2_SOITEM($select=ItemPosition,Note,SalesOrderID)&$skip=0&$top=100",
49786
+ + "&$expand=SO_2_SOITEM($select=ItemPosition,Note,SalesOrderID"
49787
+ + ";$expand=SOITEM_2_PRODUCT($select=Name,ProductID))&$skip=0&$top=100",
49551
49788
  {value : []})
49552
49789
  .expectChange("order", [])
49553
- .expectChange("note", []);
49790
+ .expectChange("note", [])
49791
+ .expectChange("productId", [])
49792
+ .expectChange("productName", []);
49554
49793
 
49555
49794
  return this.createView(assert, sView, oModel).then(function () {
49556
49795
  that.expectChange("order", [""])
49557
- .expectChange("note", ["A", "B"]);
49796
+ .expectChange("note", ["A", "B"])
49797
+ .expectChange("productId", ["", ""])
49798
+ .expectChange("productName", ["PA", ""]);
49558
49799
 
49559
49800
  oOrdersBinding = that.oView.byId("orders").getBinding("items");
49560
49801
 
49561
49802
  // code under test
49562
49803
  oCreatedOrderContext = oOrdersBinding.create({
49563
49804
  SO_2_SOITEM : [
49564
- {Note : "A"},
49805
+ {Note : "A", SOITEM_2_PRODUCT : {Name : "PA"}},
49565
49806
  {Note : "B"}
49566
49807
  ]
49567
49808
  }, bSkipRefresh);
@@ -49575,7 +49816,10 @@ sap.ui.define([
49575
49816
  aContexts = oItemsBinding.getCurrentContexts();
49576
49817
  assert.deepEqual(aContexts.map(getObject), [{
49577
49818
  "@$ui5.context.isTransient" : true,
49578
- Note : "A"
49819
+ Note : "A",
49820
+ SOITEM_2_PRODUCT : {
49821
+ Name : "PA"
49822
+ }
49579
49823
  }, {
49580
49824
  "@$ui5.context.isTransient" : true,
49581
49825
  Note : "B"
@@ -49584,19 +49828,28 @@ sap.ui.define([
49584
49828
  assert.strictEqual(oContext.isTransient(), true);
49585
49829
  });
49586
49830
 
49587
- that.expectChange("note", [,, "C", "D"]);
49831
+ that.expectChange("note", [,, "C", "D"])
49832
+ .expectChange("productId", [,, "", ""])
49833
+ .expectChange("productName", [, "PB", "", ""]);
49588
49834
 
49589
49835
  // code under test
49836
+ aContexts[1].setProperty("SOITEM_2_PRODUCT/Name", "PB");
49590
49837
  oItemsBinding.create({Note : "C"}, false, true); // at end
49591
49838
  oItemsBinding.create({Note : "D"}, false, true); // at end
49592
49839
 
49593
49840
  aContexts = oItemsBinding.getCurrentContexts();
49594
49841
  assert.deepEqual(aContexts.map(getObject), [{
49595
49842
  "@$ui5.context.isTransient" : true,
49596
- Note : "A"
49843
+ Note : "A",
49844
+ SOITEM_2_PRODUCT : {
49845
+ Name : "PA"
49846
+ }
49597
49847
  }, {
49598
49848
  "@$ui5.context.isTransient" : true,
49599
- Note : "B"
49849
+ Note : "B",
49850
+ SOITEM_2_PRODUCT : {
49851
+ Name : "PB"
49852
+ }
49600
49853
  }, {
49601
49854
  "@$ui5.context.isTransient" : true,
49602
49855
  Note : "C"
@@ -49636,38 +49889,52 @@ sap.ui.define([
49636
49889
  url : "SalesOrderList",
49637
49890
  payload : {
49638
49891
  SO_2_SOITEM : [
49639
- {Note : "AA"},
49640
- {Note : "BB"},
49892
+ {Note : "AA", SOITEM_2_PRODUCT : {Name : "PA"}},
49893
+ {Note : "BB", SOITEM_2_PRODUCT : {Name : "PB"}},
49641
49894
  {Note : "CC"},
49642
49895
  {Note : "DD"}
49643
49896
  ]
49644
49897
  }
49645
49898
  }, {
49646
49899
  "@odata.etag" : "etag",
49900
+ GrossAmount : "128.97",
49647
49901
  SalesOrderID : "new",
49648
49902
  SO_2_SOITEM : [{
49649
49903
  "@odata.etag" : "etag10",
49650
- GrossAmount : "42.99", // excess property
49904
+ GrossAmount : "41.99",
49651
49905
  ItemPosition : "0010",
49652
49906
  Note : "AAA",
49653
- SalesOrderID : "new"
49907
+ SalesOrderID : "new",
49908
+ SOITEM_2_PRODUCT : {
49909
+ "@odata.etag" : "etagP1",
49910
+ Name : "PA",
49911
+ ProductID : "P1"
49912
+ }
49654
49913
  }, {
49655
49914
  "@odata.etag" : "etag20",
49656
- GrossAmount : "42.99", // excess property
49915
+ GrossAmount : "42.99",
49657
49916
  ItemPosition : "0020",
49658
49917
  Note : "CCC",
49659
- SalesOrderID : "new"
49918
+ SalesOrderID : "new",
49919
+ SOITEM_2_PRODUCT : null
49660
49920
  }, {
49661
49921
  "@odata.etag" : "etag30",
49662
- GrossAmount : "42.99", // excess property
49922
+ GrossAmount : "43.99",
49663
49923
  ItemPosition : "0030",
49664
49924
  Note : "BBB",
49665
- SalesOrderID : "new"
49925
+ SalesOrderID : "new",
49926
+ SOITEM_2_PRODUCT : {
49927
+ "@odata.etag" : "etagP2",
49928
+ Name : "PB",
49929
+ ProductID : "P2"
49930
+ }
49666
49931
  }]
49667
49932
  })
49668
49933
  // optimized refresh: even w/o bSkipRefresh nothing is requested
49669
49934
  .expectChange("order", ["new"])
49670
- .expectChange("note", ["AAA", "CCC", "BBB"]);
49935
+ .expectChange("note", ["AAA", "CCC", "BBB"])
49936
+ .expectChange("productId", ["P1", , "P2"])
49937
+ .expectChange("productName", [, "", "PB"]);
49671
49938
 
49672
49939
  that.expectCanceledError(
49673
49940
  "Deep create of SalesOrderList succeeded. Do not use this promise.")
@@ -49687,8 +49954,8 @@ sap.ui.define([
49687
49954
  that.waitForChanges(assert, "submit POST")
49688
49955
  ].flat());
49689
49956
  }).then(function () {
49690
- var aContexts = oItemsBinding.getAllCurrentContexts();
49691
-
49957
+ assert.strictEqual(oCreatedOrderContext.getProperty("GrossAmount"), "128.97");
49958
+ const aContexts = oItemsBinding.getAllCurrentContexts();
49692
49959
  assert.deepEqual(aContexts.map(getPath), [
49693
49960
  "/SalesOrderList('new')/SO_2_SOITEM(SalesOrderID='new',ItemPosition='0010')",
49694
49961
  "/SalesOrderList('new')/SO_2_SOITEM(SalesOrderID='new',ItemPosition='0020')",
@@ -49696,19 +49963,33 @@ sap.ui.define([
49696
49963
  ]);
49697
49964
  assert.deepEqual(aContexts.map(getObject), [{
49698
49965
  "@odata.etag" : "etag10",
49966
+ GrossAmount : "41.99",
49699
49967
  ItemPosition : "0010",
49700
49968
  Note : "AAA",
49701
- SalesOrderID : "new"
49969
+ SalesOrderID : "new",
49970
+ SOITEM_2_PRODUCT : {
49971
+ "@odata.etag" : "etagP1",
49972
+ Name : "PA",
49973
+ ProductID : "P1"
49974
+ }
49702
49975
  }, {
49703
49976
  "@odata.etag" : "etag20",
49977
+ GrossAmount : "42.99",
49704
49978
  ItemPosition : "0020",
49705
49979
  Note : "CCC",
49706
- SalesOrderID : "new"
49980
+ SalesOrderID : "new",
49981
+ SOITEM_2_PRODUCT : null
49707
49982
  }, {
49708
49983
  "@odata.etag" : "etag30",
49984
+ GrossAmount : "43.99",
49709
49985
  ItemPosition : "0030",
49710
49986
  Note : "BBB",
49711
- SalesOrderID : "new"
49987
+ SalesOrderID : "new",
49988
+ SOITEM_2_PRODUCT : {
49989
+ "@odata.etag" : "etagP2",
49990
+ Name : "PB",
49991
+ ProductID : "P2"
49992
+ }
49712
49993
  }]);
49713
49994
 
49714
49995
  that.expectChange("note", ["AAAA"])
@@ -49748,6 +50029,8 @@ sap.ui.define([
49748
50029
  // response, and the item a $expand to the Product. Also check that the
49749
50030
  // @$ui5.context.isTransient annotation fires all change events.
49750
50031
  // CPOUI5ODATAV4-2048
50032
+ //
50033
+ // Accept the complete response, not only $select (esp. GrossAmount) (CPOUI5ODATAV4-1977)
49751
50034
  [false, true].forEach(function (bSkipRefresh) {
49752
50035
  var sTitle = "CPOUI5ODATAV4-2033: Deep create, nested ODLB w/ own cache, bSkipRefresh="
49753
50036
  + bSkipRefresh;
@@ -49795,7 +50078,7 @@ sap.ui.define([
49795
50078
  return this.createView(assert, sView, oModel).then(function () {
49796
50079
  that.expectChange("isTransient", [true, undefined])
49797
50080
  .expectChange("order", ["", "1"])
49798
- .expectChange("bp", null)
50081
+ .expectChange("bp", "")
49799
50082
  .expectChange("currency", "EUR") // default value
49800
50083
  .expectChange("orderCount", "2")
49801
50084
  .expectChange("itemCount", "0");
@@ -49813,7 +50096,7 @@ sap.ui.define([
49813
50096
  return that.waitForChanges(assert, "create order");
49814
50097
  }).then(function () {
49815
50098
  that.expectChange("note", ["AA", "doNotSubmit", "B"])
49816
- .expectChange("product", [null, null, null])
50099
+ .expectChange("product", ["", "", ""])
49817
50100
  .expectChange("itemCount", "1")
49818
50101
  .expectChange("itemCount", "2")
49819
50102
  .expectChange("itemCount", "3");
@@ -49886,22 +50169,23 @@ sap.ui.define([
49886
50169
  }
49887
50170
  }, {
49888
50171
  "@odata.etag" : "etag",
50172
+ GrossAmount : "128.97",
49889
50173
  SalesOrderID : "new",
49890
50174
  SO_2_SOITEM : [{
49891
50175
  "@odata.etag" : "etag10",
49892
- GrossAmount : "42.99", // excess property
50176
+ GrossAmount : "41.99",
49893
50177
  ItemPosition : "0010",
49894
50178
  Note : "BBB",
49895
50179
  SalesOrderID : "new"
49896
50180
  }, {
49897
50181
  "@odata.etag" : "etag20",
49898
- GrossAmount : "42.99", // excess property
50182
+ GrossAmount : "42.99",
49899
50183
  ItemPosition : "0020",
49900
50184
  Note : "additional",
49901
50185
  SalesOrderID : "new"
49902
50186
  }, {
49903
50187
  "@odata.etag" : "etag30",
49904
- GrossAmount : "42.99", // excess property
50188
+ GrossAmount : "43.99",
49905
50189
  ItemPosition : "0030",
49906
50190
  Note : "AAA",
49907
50191
  SalesOrderID : "new"
@@ -50019,8 +50303,8 @@ sap.ui.define([
50019
50303
  that.waitForChanges(assert, "submit -> success")
50020
50304
  ]);
50021
50305
  }).then(function () {
50022
- var aContexts = oItemsBinding.getAllCurrentContexts();
50023
-
50306
+ assert.strictEqual(oCreatedOrderContext.getProperty("GrossAmount"), "128.97");
50307
+ const aContexts = oItemsBinding.getAllCurrentContexts();
50024
50308
  assert.strictEqual(oCreatedOrderContext.getValue("@$ui5.context.isTransient"), false);
50025
50309
  assert.strictEqual(oCreatedOrderContext.getValue("SO_2_BP/BusinessPartnerID"), "BP");
50026
50310
  assert.deepEqual(aContexts.map(getPath), [
@@ -50031,6 +50315,7 @@ sap.ui.define([
50031
50315
  assert.deepEqual(aContexts.map(getObject), [{
50032
50316
  "@odata.etag" : "etag10",
50033
50317
  ItemPosition : "0010",
50318
+ GrossAmount : "41.99",
50034
50319
  Note : "BBB",
50035
50320
  SalesOrderID : "new",
50036
50321
  SOITEM_2_PRODUCT : {
@@ -50041,6 +50326,7 @@ sap.ui.define([
50041
50326
  }, {
50042
50327
  "@odata.etag" : "etag20",
50043
50328
  ItemPosition : "0020",
50329
+ GrossAmount : "42.99",
50044
50330
  Note : "additional",
50045
50331
  SalesOrderID : "new",
50046
50332
  SOITEM_2_PRODUCT : {
@@ -50051,6 +50337,7 @@ sap.ui.define([
50051
50337
  }, {
50052
50338
  "@odata.etag" : "etag30",
50053
50339
  ItemPosition : "0030",
50340
+ GrossAmount : "43.99",
50054
50341
  Note : "AAA",
50055
50342
  SalesOrderID : "new",
50056
50343
  SOITEM_2_PRODUCT : {
@@ -50239,6 +50526,8 @@ sap.ui.define([
50239
50526
  // (5) Delete the second employee
50240
50527
  // (6) Submit; the number of equipment items changes for each employee
50241
50528
  // JIRA: CPOUI5ODATAV4-1976
50529
+ //
50530
+ // Accept the complete response, not only $select (esp. EmployeeId) (CPOUI5ODATAV4-1977)
50242
50531
  [false, true].forEach(function (bOwnRequest) {
50243
50532
  ["Table", "t:Table"].forEach(function (sTable) {
50244
50533
  var sTitle = "CPOUI5ODATAV4-1976: Deep create, nested list in nested list, $$ownRequest="
@@ -50405,11 +50694,13 @@ sap.ui.define([
50405
50694
  EMPLOYEE_2_EQUIPMENTS : [{
50406
50695
  "@odata.etag" : "etag.P1",
50407
50696
  Category : "C",
50697
+ EmployeeId : "E1",
50408
50698
  ID : 1,
50409
50699
  Name : "P1"
50410
50700
  }, {
50411
50701
  "@odata.etag" : "etag.P2",
50412
50702
  Category : "C",
50703
+ EmployeeId : "E1",
50413
50704
  ID : 2,
50414
50705
  Name : "P2"
50415
50706
  }]
@@ -50420,6 +50711,7 @@ sap.ui.define([
50420
50711
  EMPLOYEE_2_EQUIPMENTS : [{
50421
50712
  "@odata.etag" : "etag.F1",
50422
50713
  Category : "C",
50714
+ EmployeeId : "E2",
50423
50715
  ID : 3,
50424
50716
  Name : "F1"
50425
50717
  }]
@@ -50457,17 +50749,20 @@ sap.ui.define([
50457
50749
  assert.deepEqual(aEquipmentsBindings[0].getAllCurrentContexts().map(getObject), [{
50458
50750
  "@odata.etag" : "etag.P1",
50459
50751
  Category : "C",
50752
+ EmployeeId : "E1",
50460
50753
  ID : 1,
50461
50754
  Name : "P1"
50462
50755
  }, {
50463
50756
  "@odata.etag" : "etag.P2",
50464
50757
  Category : "C",
50758
+ EmployeeId : "E1",
50465
50759
  ID : 2,
50466
50760
  Name : "P2"
50467
50761
  }]);
50468
50762
  assert.deepEqual(aEquipmentsBindings[1].getAllCurrentContexts().map(getObject), [{
50469
50763
  "@odata.etag" : "etag.F1",
50470
50764
  Category : "C",
50765
+ EmployeeId : "E2",
50471
50766
  ID : 3,
50472
50767
  Name : "F1"
50473
50768
  }]);
@@ -50476,6 +50771,127 @@ sap.ui.define([
50476
50771
  });
50477
50772
  });
50478
50773
 
50774
+ //*********************************************************************************************
50775
+ // Scenario: Deep create, nested single entity incl. recursion.
50776
+ // Create an employee with a nested team (one property via initial data, another one set
50777
+ // afterward) with a nested manager. See that the complete response is accepted, not only
50778
+ // $select (esp. Name, MEMBER_COUNT)
50779
+ // JIRA: CPOUI5ODATAV4-1977
50780
+ QUnit.test("CPOUI5ODATAV4-1977: Deep create, nested single entity", function (assert) {
50781
+ let oBinding;
50782
+ let oCreatedContext;
50783
+ const oModel = this.createTeaBusiModel({autoExpandSelect : true, updateGroupId : "update"});
50784
+ const sView = `
50785
+ <Table id="employees" items="{/EMPLOYEES}">
50786
+ <Text id="id" text="{ID}"/>
50787
+ <Text id="teamId" text="{EMPLOYEE_2_TEAM/Team_Id}"/>
50788
+ <Input id="teamName" value="{EMPLOYEE_2_TEAM/Name}"/>
50789
+ <Input id="manager" value="{EMPLOYEE_2_TEAM/TEAM_2_MANAGER/ID}"/>
50790
+ <Text id="managerTeamId" text="{EMPLOYEE_2_TEAM/TEAM_2_MANAGER/TEAM_ID}"/>
50791
+ </Table>`;
50792
+ const that = this;
50793
+
50794
+ this.expectRequest("EMPLOYEES?$select=ID&$expand=EMPLOYEE_2_TEAM($select=Name,Team_Id"
50795
+ + ";$expand=TEAM_2_MANAGER($select=ID,TEAM_ID))&$skip=0&$top=100", {
50796
+ value : [{
50797
+ ID : "E1",
50798
+ EMPLOYEE_2_TEAM : {
50799
+ Name : "Team 1",
50800
+ Team_Id : "T1",
50801
+ TEAM_2_MANAGER : {
50802
+ ID : "M1",
50803
+ TEAM_ID : "T1"
50804
+ }
50805
+ }
50806
+ }]
50807
+ })
50808
+ .expectChange("id", ["E1"])
50809
+ .expectChange("teamId", ["T1"])
50810
+ .expectChange("teamName", ["Team 1"])
50811
+ .expectChange("manager", ["M1"])
50812
+ .expectChange("managerTeamId", ["T1"]);
50813
+
50814
+ return this.createView(assert, sView, oModel).then(function () {
50815
+ that.expectChange("id", ["", "E1"])
50816
+ .expectChange("teamId", ["Tnew", "T1"])
50817
+ .expectChange("teamName", ["", "Team 1"])
50818
+ .expectChange("manager", ["", "M1"])
50819
+ .expectChange("managerTeamId", ["", "T1"]);
50820
+
50821
+ oBinding = that.oView.byId("employees").getBinding("items");
50822
+ // code under test
50823
+ // bSkipRefresh not needed due to deep create
50824
+ oCreatedContext = oBinding.create({EMPLOYEE_2_TEAM : {Team_Id : "Tnew"}});
50825
+
50826
+ return that.waitForChanges(assert, "create employee");
50827
+ }).then(function () {
50828
+ that.expectChange("teamName", ["Team 2"])
50829
+ .expectChange("manager", ["M2"]);
50830
+
50831
+ oCreatedContext.setProperty("EMPLOYEE_2_TEAM/Name", "Team 2");
50832
+ oCreatedContext.setProperty("EMPLOYEE_2_TEAM/TEAM_2_MANAGER/ID", "M2");
50833
+
50834
+ return that.waitForChanges(assert, "patch transient");
50835
+ }).then(function () {
50836
+ that.expectRequest({
50837
+ method : "POST",
50838
+ url : "EMPLOYEES",
50839
+ payload : {
50840
+ EMPLOYEE_2_TEAM : {
50841
+ Name : "Team 2",
50842
+ Team_Id : "Tnew",
50843
+ TEAM_2_MANAGER : {
50844
+ ID : "M2"
50845
+ }
50846
+ }
50847
+ }
50848
+ }, {
50849
+ "@odata.etag" : "etagE2",
50850
+ ID : "E2",
50851
+ Name : "Peter Burke",
50852
+ EMPLOYEE_2_TEAM : {
50853
+ "@odata.etag" : "etagT2",
50854
+ MEMBER_COUNT : 1,
50855
+ Name : "Team 2 (from server)",
50856
+ Team_Id : "T2",
50857
+ TEAM_2_MANAGER : {
50858
+ "@odata.etag" : "etagM2",
50859
+ ID : "M2",
50860
+ TEAM_ID : "T2"
50861
+ }
50862
+ }
50863
+ })
50864
+ .expectChange("id", ["E2"])
50865
+ .expectChange("teamId", ["T2"])
50866
+ .expectChange("teamName", ["Team 2 (from server)"])
50867
+ .expectChange("managerTeamId", ["T2"]);
50868
+
50869
+ return Promise.all([
50870
+ oModel.submitBatch("update"),
50871
+ oCreatedContext.created(),
50872
+ that.waitForChanges(assert, "submit")
50873
+ ]);
50874
+ }).then(function () {
50875
+ assert.deepEqual(oCreatedContext.getObject(), {
50876
+ "@$ui5.context.isTransient" : false,
50877
+ "@odata.etag" : "etagE2",
50878
+ ID : "E2",
50879
+ Name : "Peter Burke",
50880
+ EMPLOYEE_2_TEAM : {
50881
+ "@odata.etag" : "etagT2",
50882
+ MEMBER_COUNT : 1,
50883
+ Name : "Team 2 (from server)",
50884
+ Team_Id : "T2",
50885
+ TEAM_2_MANAGER : {
50886
+ "@odata.etag" : "etagM2",
50887
+ ID : "M2",
50888
+ TEAM_ID : "T2"
50889
+ }
50890
+ }
50891
+ });
50892
+ });
50893
+ });
50894
+
50479
50895
  //*********************************************************************************************
50480
50896
  // Scenario: A deep create of a sales order with items is tried, but there is an ODCB w/o path
50481
50897
  // (w/ or w/o own cache) in between. A non-deep create however must work.
@@ -52643,7 +53059,25 @@ sap.ui.define([
52643
53059
  headers : {"If-Match" : "ETag"},
52644
53060
  method : "DELETE",
52645
53061
  url : "Artists(ArtistID='42',IsActiveEntity=false)"
52646
- });
53062
+ }, undefined, {
53063
+ "sap-messages" : JSON.stringify([{
53064
+ code : "foo-42",
53065
+ message : "What a nice name!",
53066
+ numericSeverity : 2,
53067
+ target : "Name"
53068
+ }])
53069
+ })
53070
+ .expectMessages([{
53071
+ message : sMessage1,
53072
+ target : "/Artists(ArtistID='42',IsActiveEntity=false)/Name",
53073
+ type : "Success"
53074
+ }, {
53075
+ code : "foo-42",
53076
+ message : "What a nice name!",
53077
+ persistent : true,
53078
+ target : "/Artists(ArtistID='42',IsActiveEntity=false)/Name",
53079
+ type : "Information"
53080
+ }]);
52647
53081
 
52648
53082
  return Promise.all([
52649
53083
  // code under test
@@ -52661,6 +53095,40 @@ sap.ui.define([
52661
53095
  return that.waitForChanges(assert, "show active");
52662
53096
  }).then(function () {
52663
53097
  return that.checkValueState(assert, that.oView.byId("name"), "None", "");
53098
+ }).then(function () {
53099
+ that.oLogMock.expects("error")
53100
+ .withArgs("Failed to delete /Artists(ArtistID='42',IsActiveEntity=false)");
53101
+ that.expectRequest({
53102
+ headers : {"If-Match" : "ETag"},
53103
+ method : "DELETE",
53104
+ url : "Artists(ArtistID='42',IsActiveEntity=false)"
53105
+ }, createErrorInsideBatch({target : "ArtistID"}))
53106
+ .expectMessages([{
53107
+ message : sMessage1,
53108
+ target : "/Artists(ArtistID='42',IsActiveEntity=false)/Name",
53109
+ type : "Success"
53110
+ }, {
53111
+ code : "foo-42",
53112
+ message : "What a nice name!",
53113
+ persistent : true,
53114
+ target : "/Artists(ArtistID='42',IsActiveEntity=false)/Name",
53115
+ type : "Information"
53116
+ }, {
53117
+ code : "CODE",
53118
+ message : "Request intentionally failed",
53119
+ persistent : true,
53120
+ target : "/Artists(ArtistID='42',IsActiveEntity=false)/ArtistID",
53121
+ technical : true,
53122
+ type : "Error"
53123
+ }]);
53124
+
53125
+ return Promise.all([
53126
+ // code under test
53127
+ oModel.delete(oDraftContext).then(mustFail(assert), function (oError) {
53128
+ assert.strictEqual(oError.message, "Request intentionally failed");
53129
+ }),
53130
+ that.waitForChanges(assert, "delete again")
53131
+ ]);
52664
53132
  }).then(function () {
52665
53133
  that.expectMessages([]);
52666
53134