@openui5/sap.ui.core 1.98.0 → 1.101.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 (418) hide show
  1. package/.eslintrc.json +33 -1
  2. package/THIRDPARTY.txt +6 -6
  3. package/package.json +1 -1
  4. package/src/jquery.sap.global.js +6 -3
  5. package/src/jquery.sap.mobile.js +29 -11
  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/Log.js +1 -1
  11. package/src/sap/base/strings/whitespaceReplacer.js +1 -1
  12. package/src/sap/base/util/LoaderExtensions.js +1 -10
  13. package/src/sap/base/util/UriParameters.js +2 -2
  14. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  15. package/src/sap/base/util/restricted/_castArray.js +1 -1
  16. package/src/sap/base/util/restricted/_compact.js +1 -1
  17. package/src/sap/base/util/restricted/_curry.js +1 -1
  18. package/src/sap/base/util/restricted/_debounce.js +1 -1
  19. package/src/sap/base/util/restricted/_difference.js +1 -1
  20. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  21. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  22. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  23. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  24. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  25. package/src/sap/base/util/restricted/_flatten.js +1 -1
  26. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  27. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  28. package/src/sap/base/util/restricted/_intersection.js +1 -1
  29. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  30. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  31. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  32. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  33. package/src/sap/base/util/restricted/_isNil.js +1 -1
  34. package/src/sap/base/util/restricted/_max.js +1 -1
  35. package/src/sap/base/util/restricted/_merge.js +1 -1
  36. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  37. package/src/sap/base/util/restricted/_min.js +1 -1
  38. package/src/sap/base/util/restricted/_omit.js +1 -1
  39. package/src/sap/base/util/restricted/_pick.js +1 -1
  40. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  41. package/src/sap/base/util/restricted/_throttle.js +1 -1
  42. package/src/sap/base/util/restricted/_toArray.js +1 -1
  43. package/src/sap/base/util/restricted/_union.js +1 -1
  44. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  45. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  46. package/src/sap/base/util/restricted/_uniq.js +1 -1
  47. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  48. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  49. package/src/sap/base/util/restricted/_without.js +1 -1
  50. package/src/sap/base/util/restricted/_xor.js +1 -1
  51. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  52. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  53. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  54. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  55. package/src/sap/ui/Device.js +3 -3
  56. package/src/sap/ui/Global.js +4 -4
  57. package/src/sap/ui/VersionInfo.js +13 -10
  58. package/src/sap/ui/base/BindingParser.js +34 -7
  59. package/src/sap/ui/base/Event.js +1 -1
  60. package/src/sap/ui/base/EventProvider.js +2 -2
  61. package/src/sap/ui/base/ExpressionParser.js +1 -1
  62. package/src/sap/ui/base/Interface.js +1 -1
  63. package/src/sap/ui/base/ManagedObject.js +32 -22
  64. package/src/sap/ui/base/ManagedObjectMetadata.js +1 -1
  65. package/src/sap/ui/base/ManagedObjectObserver.js +2 -0
  66. package/src/sap/ui/base/ManagedObjectRegistry.js +10 -5
  67. package/src/sap/ui/base/Metadata.js +1 -1
  68. package/src/sap/ui/base/Object.js +1 -1
  69. package/src/sap/ui/base/ObjectPool.js +1 -1
  70. package/src/sap/ui/core/.library +2 -2
  71. package/src/sap/ui/core/BusyIndicator.js +1 -1
  72. package/src/sap/ui/core/Component.js +24 -20
  73. package/src/sap/ui/core/ComponentContainer.js +1 -1
  74. package/src/sap/ui/core/ComponentMetadata.js +2 -2
  75. package/src/sap/ui/core/ComponentSupport.js +1 -1
  76. package/src/sap/ui/core/Configuration.js +80 -11
  77. package/src/sap/ui/core/Control.js +2 -1
  78. package/src/sap/ui/core/Core.js +29 -12
  79. package/src/sap/ui/core/CustomData.js +1 -1
  80. package/src/sap/ui/core/DeclarativeSupport.js +1 -1
  81. package/src/sap/ui/core/Element.js +4 -7
  82. package/src/sap/ui/core/ElementMetadata.js +1 -1
  83. package/src/sap/ui/core/EnabledPropagator.js +1 -1
  84. package/src/sap/ui/core/EventBus.js +1 -1
  85. package/src/sap/ui/core/ExtensionPoint.js +6 -1
  86. package/src/sap/ui/core/FocusHandler.js +1 -1
  87. package/src/sap/ui/core/Fragment.js +1 -1
  88. package/src/sap/ui/core/HTML.js +1 -1
  89. package/src/sap/ui/core/HTMLRenderer.js +1 -1
  90. package/src/sap/ui/core/History.js +1 -1
  91. package/src/sap/ui/core/Icon.js +17 -3
  92. package/src/sap/ui/core/IconRenderer.js +1 -1
  93. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  94. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  95. package/src/sap/ui/core/InvisibleMessage.js +1 -1
  96. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  97. package/src/sap/ui/core/InvisibleText.js +1 -1
  98. package/src/sap/ui/core/Item.js +1 -1
  99. package/src/sap/ui/core/LabelEnablement.js +9 -2
  100. package/src/sap/ui/core/LayoutData.js +1 -1
  101. package/src/sap/ui/core/ListItem.js +1 -1
  102. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  103. package/src/sap/ui/core/LocalBusyIndicatorRenderer.js +2 -2
  104. package/src/sap/ui/core/Locale.js +1 -1
  105. package/src/sap/ui/core/LocaleData.js +73 -6
  106. package/src/sap/ui/core/Manifest.js +5 -3
  107. package/src/sap/ui/core/Message.js +1 -1
  108. package/src/sap/ui/core/Patcher.js +6 -4
  109. package/src/sap/ui/core/Popup.js +11 -8
  110. package/src/sap/ui/core/RenderManager.js +1 -1
  111. package/src/sap/ui/core/Renderer.js +1 -1
  112. package/src/sap/ui/core/ResizeHandler.js +1 -1
  113. package/src/sap/ui/core/ScrollBar.js +1 -1
  114. package/src/sap/ui/core/ScrollBarRenderer.js +1 -1
  115. package/src/sap/ui/core/SeparatorItem.js +1 -1
  116. package/src/sap/ui/core/Title.js +1 -1
  117. package/src/sap/ui/core/TooltipBase.js +1 -1
  118. package/src/sap/ui/core/UIArea.js +1 -1
  119. package/src/sap/ui/core/UIComponent.js +1 -1
  120. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  121. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  122. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  123. package/src/sap/ui/core/XMLComposite.js +1 -1
  124. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  125. package/src/sap/ui/core/XMLTemplateProcessor.js +27 -26
  126. package/src/sap/ui/core/_IconRegistry.js +13 -3
  127. package/src/sap/ui/core/cache/CacheManager.js +1 -1
  128. package/src/sap/ui/core/cache/LRUPersistentCache.js +2 -1
  129. package/src/sap/ui/core/cldr/en_AU.json +1 -1
  130. package/src/sap/ui/core/date/Buddhist.js +3 -3
  131. package/src/sap/ui/core/date/Japanese.js +4 -4
  132. package/src/sap/ui/core/date/UniversalDate.js +10 -0
  133. package/src/sap/ui/core/date/UniversalDateUtils.js +49 -49
  134. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  135. package/src/sap/ui/core/delegate/ScrollEnablement.js +9 -6
  136. package/src/sap/ui/core/dnd/DragAndDrop.js +27 -22
  137. package/src/sap/ui/core/dnd/DragDropBase.js +1 -2
  138. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  139. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  140. package/src/sap/ui/core/dnd/DropInfo.js +3 -3
  141. package/src/sap/ui/core/format/DateFormat.js +670 -199
  142. package/src/sap/ui/core/format/DateFormatTimezoneDisplay.js +47 -0
  143. package/src/sap/ui/core/format/ListFormat.js +2 -2
  144. package/src/sap/ui/core/format/NumberFormat.js +502 -216
  145. package/src/sap/ui/core/format/TimezoneUtil.js +248 -0
  146. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  147. package/src/sap/ui/core/library.js +220 -189
  148. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  149. package/src/sap/ui/core/message/Message.js +1 -1
  150. package/src/sap/ui/core/message/MessageManager.js +1 -1
  151. package/src/sap/ui/core/message/MessageParser.js +1 -1
  152. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  153. package/src/sap/ui/core/messagebundle.properties +2 -0
  154. package/src/sap/ui/core/messagebundle_ar.properties +1 -0
  155. package/src/sap/ui/core/messagebundle_bg.properties +6 -5
  156. package/src/sap/ui/core/messagebundle_ca.properties +1 -0
  157. package/src/sap/ui/core/messagebundle_cs.properties +1 -0
  158. package/src/sap/ui/core/messagebundle_cy.properties +1 -0
  159. package/src/sap/ui/core/messagebundle_da.properties +1 -0
  160. package/src/sap/ui/core/messagebundle_de.properties +2 -1
  161. package/src/sap/ui/core/messagebundle_el.properties +1 -0
  162. package/src/sap/ui/core/messagebundle_en.properties +1 -0
  163. package/src/sap/ui/core/messagebundle_en_GB.properties +1 -0
  164. package/src/sap/ui/core/messagebundle_en_US_sappsd.properties +1 -0
  165. package/src/sap/ui/core/messagebundle_en_US_saprigi.properties +1 -0
  166. package/src/sap/ui/core/messagebundle_en_US_saptrc.properties +1 -0
  167. package/src/sap/ui/core/messagebundle_es.properties +1 -0
  168. package/src/sap/ui/core/messagebundle_es_MX.properties +1 -0
  169. package/src/sap/ui/core/messagebundle_et.properties +1 -0
  170. package/src/sap/ui/core/messagebundle_fi.properties +1 -0
  171. package/src/sap/ui/core/messagebundle_fr.properties +1 -0
  172. package/src/sap/ui/core/messagebundle_fr_CA.properties +1 -0
  173. package/src/sap/ui/core/messagebundle_hi.properties +1 -0
  174. package/src/sap/ui/core/messagebundle_hr.properties +1 -0
  175. package/src/sap/ui/core/messagebundle_hu.properties +1 -0
  176. package/src/sap/ui/core/messagebundle_id.properties +3 -2
  177. package/src/sap/ui/core/messagebundle_it.properties +1 -0
  178. package/src/sap/ui/core/messagebundle_iw.properties +1 -0
  179. package/src/sap/ui/core/messagebundle_ja.properties +1 -0
  180. package/src/sap/ui/core/messagebundle_kk.properties +1 -0
  181. package/src/sap/ui/core/messagebundle_ko.properties +2 -1
  182. package/src/sap/ui/core/messagebundle_lt.properties +1 -0
  183. package/src/sap/ui/core/messagebundle_lv.properties +2 -1
  184. package/src/sap/ui/core/messagebundle_ms.properties +1 -0
  185. package/src/sap/ui/core/messagebundle_nl.properties +1 -0
  186. package/src/sap/ui/core/messagebundle_no.properties +1 -0
  187. package/src/sap/ui/core/messagebundle_pl.properties +1 -0
  188. package/src/sap/ui/core/messagebundle_pt.properties +1 -0
  189. package/src/sap/ui/core/messagebundle_pt_PT.properties +1 -0
  190. package/src/sap/ui/core/messagebundle_ro.properties +1 -0
  191. package/src/sap/ui/core/messagebundle_ru.properties +1 -0
  192. package/src/sap/ui/core/messagebundle_sh.properties +1 -0
  193. package/src/sap/ui/core/messagebundle_sk.properties +1 -0
  194. package/src/sap/ui/core/messagebundle_sl.properties +1 -0
  195. package/src/sap/ui/core/messagebundle_sv.properties +1 -0
  196. package/src/sap/ui/core/messagebundle_th.properties +1 -0
  197. package/src/sap/ui/core/messagebundle_tr.properties +1 -0
  198. package/src/sap/ui/core/messagebundle_uk.properties +1 -0
  199. package/src/sap/ui/core/messagebundle_vi.properties +1 -0
  200. package/src/sap/ui/core/messagebundle_zh_CN.properties +1 -0
  201. package/src/sap/ui/core/messagebundle_zh_TW.properties +1 -0
  202. package/src/sap/ui/core/mvc/Controller.js +1 -1
  203. package/src/sap/ui/core/mvc/ControllerExtensionProvider.js +1 -1
  204. package/src/sap/ui/core/mvc/HTMLView.js +1 -1
  205. package/src/sap/ui/core/mvc/HTMLViewRenderer.js +1 -1
  206. package/src/sap/ui/core/mvc/JSONView.js +1 -1
  207. package/src/sap/ui/core/mvc/JSONViewRenderer.js +1 -1
  208. package/src/sap/ui/core/mvc/JSView.js +1 -1
  209. package/src/sap/ui/core/mvc/JSViewRenderer.js +1 -1
  210. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  211. package/src/sap/ui/core/mvc/TemplateViewRenderer.js +1 -1
  212. package/src/sap/ui/core/mvc/View.js +1 -1
  213. package/src/sap/ui/core/mvc/ViewRenderer.js +1 -1
  214. package/src/sap/ui/core/mvc/XMLView.js +16 -4
  215. package/src/sap/ui/core/mvc/XMLViewRenderer.js +5 -2
  216. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  217. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  218. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  219. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  220. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  221. package/src/sap/ui/core/routing/Router.js +1 -1
  222. package/src/sap/ui/core/rules/App.support.js +6 -1
  223. package/src/sap/ui/core/rules/Misc.support.js +8 -3
  224. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
  225. package/src/sap/ui/core/search/SearchProvider.js +1 -1
  226. package/src/sap/ui/core/service/Service.js +1 -1
  227. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  228. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  229. package/src/sap/ui/core/support/Plugin.js +29 -1
  230. package/src/sap/ui/core/support/Support.js +3 -3
  231. package/src/sap/ui/core/support/controls/InteractionSlider.js +395 -407
  232. package/src/sap/ui/core/support/plugins/Breakpoint.js +5 -5
  233. package/src/sap/ui/core/support/plugins/ControlTree.js +434 -347
  234. package/src/sap/ui/core/support/plugins/Debugging.js +153 -129
  235. package/src/sap/ui/core/support/plugins/Interaction.js +71 -85
  236. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  237. package/src/sap/ui/core/support/plugins/Performance.js +10 -13
  238. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  239. package/src/sap/ui/core/support/plugins/TechInfo.js +5 -3
  240. package/src/sap/ui/core/support/plugins/Trace.js +7 -7
  241. package/src/sap/ui/core/support/plugins/ViewInfo.js +84 -22
  242. package/src/sap/ui/core/support/support.css +23 -23
  243. package/src/sap/ui/core/support/support.html +4 -6
  244. package/src/sap/ui/core/support/techinfo/TechnicalInfo.js +1 -1
  245. package/src/sap/ui/core/themes/base/CommandShortcutHints.less +1 -1
  246. package/src/sap/ui/core/themes/base/DragAndDrop.less +3 -3
  247. package/src/sap/ui/core/themes/base/base.less +1524 -54
  248. package/src/sap/ui/core/themes/base/fonts/SAP-icons.woff2 +0 -0
  249. package/src/sap/ui/core/themes/base/global.less +169 -13
  250. package/src/sap/ui/core/themes/base/shared.less +1 -0
  251. package/src/sap/ui/core/themes/sap_hcb/global.less +164 -7
  252. package/src/sap/ui/core/theming/Parameters.js +1 -1
  253. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  254. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  255. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  256. package/src/sap/ui/core/tmpl/Template.js +1 -1
  257. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  258. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  259. package/src/sap/ui/core/util/Export.js +1 -1
  260. package/src/sap/ui/core/util/ExportCell.js +1 -1
  261. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  262. package/src/sap/ui/core/util/ExportRow.js +1 -1
  263. package/src/sap/ui/core/util/ExportType.js +1 -1
  264. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  265. package/src/sap/ui/core/util/File.js +1 -1
  266. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  267. package/src/sap/ui/core/util/MockServer.js +20 -17
  268. package/src/sap/ui/core/util/PasteHelper.js +5 -5
  269. package/src/sap/ui/core/util/XMLPreprocessor.js +17 -4
  270. package/src/sap/ui/core/util/reflection/XmlTreeModifier.js +1 -1
  271. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  272. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  273. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  274. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  275. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  276. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  277. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  278. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  279. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  280. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  281. package/src/sap/ui/debug/ControlTree.js +1 -1
  282. package/src/sap/ui/debug/DebugEnv.js +1 -1
  283. package/src/sap/ui/debug/LogViewer.js +2 -2
  284. package/src/sap/ui/debug/PropertyList.js +1 -1
  285. package/src/sap/ui/dom/includeStylesheet.js +8 -3
  286. package/src/sap/ui/events/jquery/EventExtension.js +1 -1
  287. package/src/sap/ui/model/Binding.js +4 -3
  288. package/src/sap/ui/model/ClientModel.js +1 -1
  289. package/src/sap/ui/model/ClientTreeBinding.js +1 -1
  290. package/src/sap/ui/model/CompositeBinding.js +4 -1
  291. package/src/sap/ui/model/CompositeDataState.js +1 -1
  292. package/src/sap/ui/model/CompositeType.js +13 -1
  293. package/src/sap/ui/model/ContextBinding.js +1 -1
  294. package/src/sap/ui/model/DataState.js +1 -1
  295. package/src/sap/ui/model/MetaModel.js +1 -2
  296. package/src/sap/ui/model/Model.js +10 -7
  297. package/src/sap/ui/model/SelectionModel.js +1 -1
  298. package/src/sap/ui/model/SimpleType.js +1 -1
  299. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  300. package/src/sap/ui/model/Type.js +1 -1
  301. package/src/sap/ui/model/_Helper.js +24 -0
  302. package/src/sap/ui/model/analytics/AnalyticalBinding.js +30 -15
  303. package/src/sap/ui/model/analytics/ODataModelAdapter.js +2 -1
  304. package/src/sap/ui/model/base/ManagedObjectModel.js +9 -7
  305. package/src/sap/ui/model/json/JSONListBinding.js +1 -1
  306. package/src/sap/ui/model/json/JSONModel.js +15 -8
  307. package/src/sap/ui/model/json/JSONPropertyBinding.js +1 -1
  308. package/src/sap/ui/model/message/MessageListBinding.js +1 -1
  309. package/src/sap/ui/model/message/MessageModel.js +1 -1
  310. package/src/sap/ui/model/message/MessagePropertyBinding.js +1 -1
  311. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  312. package/src/sap/ui/model/odata/ODataListBinding.js +1 -1
  313. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  314. package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
  315. package/src/sap/ui/model/odata/ODataMetadata.js +3 -3
  316. package/src/sap/ui/model/odata/ODataModel.js +2 -2
  317. package/src/sap/ui/model/odata/ODataPropertyBinding.js +3 -1
  318. package/src/sap/ui/model/odata/ODataTreeBinding.js +1 -1
  319. package/src/sap/ui/model/odata/ODataTreeBindingFlat.js +5 -4
  320. package/src/sap/ui/model/odata/ODataUtils.js +7 -9
  321. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  322. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  323. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  324. package/src/sap/ui/model/odata/type/Date.js +1 -1
  325. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  326. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  327. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  328. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +349 -0
  329. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  330. package/src/sap/ui/model/odata/type/Double.js +1 -1
  331. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  332. package/src/sap/ui/model/odata/type/Int.js +1 -1
  333. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  334. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  335. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  336. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  337. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  338. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  339. package/src/sap/ui/model/odata/type/Single.js +1 -1
  340. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  341. package/src/sap/ui/model/odata/type/String.js +1 -1
  342. package/src/sap/ui/model/odata/type/Time.js +1 -1
  343. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  344. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  345. package/src/sap/ui/model/odata/v2/Context.js +69 -5
  346. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  347. package/src/sap/ui/model/odata/v2/ODataContextBinding.js +8 -4
  348. package/src/sap/ui/model/odata/v2/ODataListBinding.js +215 -78
  349. package/src/sap/ui/model/odata/v2/ODataModel.js +283 -80
  350. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +6 -4
  351. package/src/sap/ui/model/odata/v4/AnnotationHelper.js +16 -17
  352. package/src/sap/ui/model/odata/v4/Context.js +117 -76
  353. package/src/sap/ui/model/odata/v4/ODataBinding.js +62 -37
  354. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +157 -169
  355. package/src/sap/ui/model/odata/v4/ODataListBinding.js +451 -262
  356. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +91 -63
  357. package/src/sap/ui/model/odata/v4/ODataModel.js +478 -250
  358. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +74 -83
  359. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +65 -61
  360. package/src/sap/ui/model/odata/v4/_AnnotationHelperExpression.js +61 -6
  361. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +15 -0
  362. package/src/sap/ui/model/odata/v4/lib/_Cache.js +336 -86
  363. package/src/sap/ui/model/odata/v4/lib/_ConcatHelper.js +5 -13
  364. package/src/sap/ui/model/odata/v4/lib/_GroupLock.js +16 -0
  365. package/src/sap/ui/model/odata/v4/lib/_Helper.js +13 -6
  366. package/src/sap/ui/model/odata/v4/lib/_MetadataConverter.js +2 -2
  367. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +233 -26
  368. package/src/sap/ui/model/odata/v4/lib/_V2Requestor.js +1 -1
  369. package/src/sap/ui/model/resource/ResourceModel.js +1 -1
  370. package/src/sap/ui/model/resource/ResourcePropertyBinding.js +1 -1
  371. package/src/sap/ui/model/type/Boolean.js +1 -1
  372. package/src/sap/ui/model/type/Currency.js +1 -1
  373. package/src/sap/ui/model/type/Date.js +1 -1
  374. package/src/sap/ui/model/type/DateInterval.js +1 -1
  375. package/src/sap/ui/model/type/DateTime.js +1 -1
  376. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  377. package/src/sap/ui/model/type/FileSize.js +1 -1
  378. package/src/sap/ui/model/type/Float.js +1 -1
  379. package/src/sap/ui/model/type/Integer.js +1 -1
  380. package/src/sap/ui/model/type/String.js +1 -1
  381. package/src/sap/ui/model/type/Time.js +1 -1
  382. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  383. package/src/sap/ui/model/type/Unit.js +1 -1
  384. package/src/sap/ui/model/xml/XMLListBinding.js +1 -1
  385. package/src/sap/ui/model/xml/XMLModel.js +1 -1
  386. package/src/sap/ui/model/xml/XMLPropertyBinding.js +1 -1
  387. package/src/sap/ui/performance/trace/FESR.js +1 -1
  388. package/src/sap/ui/performance/trace/FESRHelper.js +72 -0
  389. package/src/sap/ui/performance/trace/Interaction.js +6 -2
  390. package/src/sap/ui/performance/trace/Passport.js +3 -3
  391. package/src/sap/ui/qunit/qunit-2-css.js +4 -4
  392. package/src/sap/ui/qunit/qunit-css.js +4 -4
  393. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  394. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  395. package/src/sap/ui/test/BranchTracking.js +1 -0
  396. package/src/sap/ui/test/Opa5.js +10 -6
  397. package/src/sap/ui/test/OpaBuilder.js +7 -7
  398. package/src/sap/ui/test/TestUtils.js +11 -0
  399. package/src/sap/ui/test/_UsageReport.js +1 -1
  400. package/src/sap/ui/test/generic/GenericTestCollection.js +176 -0
  401. package/src/sap/ui/test/generic/TestBase.js +151 -0
  402. package/src/sap/ui/test/generic/Utils.js +284 -0
  403. package/src/sap/ui/test/gherkin/opa5TestHarness.js +14 -5
  404. package/src/sap/ui/test/opaQunit.js +11 -10
  405. package/src/sap/ui/test/selectors/_ControlSelectorGenerator.js +9 -8
  406. package/src/sap/ui/test/selectors/_ControlSelectorValidator.js +1 -1
  407. package/src/sap/ui/test/starter/_setupAndStart.js +4 -0
  408. package/src/sap/ui/thirdparty/IPv6.js +1 -1
  409. package/src/sap/ui/thirdparty/SecondLevelDomains.js +1 -1
  410. package/src/sap/ui/thirdparty/URI.js +7 -3
  411. package/src/sap/ui/thirdparty/URITemplate.js +1 -1
  412. package/src/sap/ui/thirdparty/jqueryui/jquery-ui-datepicker.js +143 -3
  413. package/src/sap/ui/thirdparty/jqueryui/jquery-ui-position.js +8 -1
  414. package/src/sap/ui/thirdparty/jszip.js +17 -7
  415. package/src/sap/ui/thirdparty/mobify-carousel.js +1 -1
  416. package/src/sap/ui/util/Mobile.js +17 -0
  417. package/src/sap/ui/util/Storage.js +1 -1
  418. package/src/ui5loader.js +9 -5
@@ -176,33 +176,33 @@ sap.ui.define([
176
176
 
177
177
  /**
178
178
  * Decides whether the given query options can be fulfilled by this binding and merges them into
179
- * this binding's aggregated query options if necessary.
179
+ * this binding's <code>mAggregatedQueryOptions</code> if necessary.
180
180
  *
181
181
  * The query options cannot be fulfilled if there are conflicts. A conflict is an option other
182
- * than $expand, $select and $count which has different values in the aggregate and the options
183
- * to be merged. This is checked recursively.
184
- *
185
- * Merging is not necessary if the binding's cache has already requested its data and the query
186
- * options would extend $select. In this case the binding's cache will request the resp.
187
- * property and add it when it is accessed.
188
- *
189
- * Note: * is an item in $select and $expand just as others, that is it must be part of the
190
- * array of items and one must not ignore the other items if * is provided. See
191
- * "5.1.2 System Query Option $expand" and "5.1.3 System Query Option $select" in specification
192
- * "OData Version 4.0 Part 2: URL Conventions".
193
- *
194
- * @param {object} mQueryOptions The query options to be merged
195
- * @param {string} sBaseMetaPath This binding's meta path
196
- * @param {boolean} bCacheImmutable Whether the cache of this binding is immutable
182
+ * than <code>$expand</code>, <code>$select</code> and <code>$count</code> which has different
183
+ * values in the aggregate and the options to be merged. This is checked recursively.
184
+ *
185
+ * If the cache is already immutable the query options are aggregated into
186
+ * <code>mLateQueryOptions</code>. Then they also cannot be fulfilled if they contain a
187
+ * <code>$expand</code> using a collection-valued navigation property.
188
+ *
189
+ * Note: * is an item in <code>$select</code> and <code>$expand</code> just as others, that is
190
+ * it must be part of the array of items and one must not ignore the other items if * is
191
+ * provided. See "5.1.2 System Query Option $expand" and "5.1.3 System Query Option $select" in
192
+ * specification "OData Version 4.0 Part 2: URL Conventions".
193
+ *
194
+ * @param {object} mQueryOptions - The query options to be merged
195
+ * @param {string} sBaseMetaPath - This binding's meta path
196
+ * @param {boolean} bCacheImmutable - Whether the cache of this binding is immutable
197
+ * @param {boolean} bIsProperty - Whether the child is a property binding
197
198
  * @returns {boolean} Whether the query options can be fulfilled by this binding
198
199
  *
199
200
  * @private
200
201
  */
201
202
  ODataParentBinding.prototype.aggregateQueryOptions = function (mQueryOptions, sBaseMetaPath,
202
- bCacheImmutable) {
203
+ bCacheImmutable, bIsProperty) {
203
204
  var mAggregatedQueryOptionsClone = _Helper.merge({},
204
205
  bCacheImmutable && this.mLateQueryOptions || this.mAggregatedQueryOptions),
205
- bChanged = false,
206
206
  that = this;
207
207
 
208
208
  /*
@@ -234,7 +234,6 @@ sap.ui.define([
234
234
  .fetchObject(sExpandMetaPath).getResult().$isCollection) {
235
235
  return false;
236
236
  }
237
- bChanged = true;
238
237
  }
239
238
  return merge(mAggregatedQueryOptions.$expand[sExpandPath],
240
239
  mQueryOptions0.$expand[sExpandPath], sExpandMetaPath, true, bAddExpand);
@@ -248,7 +247,6 @@ sap.ui.define([
248
247
  */
249
248
  function mergeSelectPath(sSelectPath) {
250
249
  if (mAggregatedQueryOptions.$select.indexOf(sSelectPath) < 0) {
251
- bChanged = true;
252
250
  mAggregatedQueryOptions.$select.push(sSelectPath);
253
251
  }
254
252
  return true;
@@ -256,8 +254,9 @@ sap.ui.define([
256
254
 
257
255
  // Top-level all query options in the aggregate are OK, even if not repeated in the
258
256
  // child. In a $expand the child must also have them (and the second loop checks that
259
- // they're equal).
260
- return (!bInsideExpand || Object.keys(mAggregatedQueryOptions).every(function (sName) {
257
+ // they're equal). Property bindings are an exception to this rule.
258
+ return (bIsProperty || !bInsideExpand
259
+ || Object.keys(mAggregatedQueryOptions).every(function (sName) {
261
260
  return sName in mQueryOptions0 || sName === "$count" || sName === "$expand"
262
261
  || sName === "$select";
263
262
  }))
@@ -288,7 +287,7 @@ sap.ui.define([
288
287
  if (merge(mAggregatedQueryOptionsClone, mQueryOptions, sBaseMetaPath)) {
289
288
  if (!bCacheImmutable) {
290
289
  this.mAggregatedQueryOptions = mAggregatedQueryOptionsClone;
291
- } else if (bChanged) {
290
+ } else {
292
291
  this.mLateQueryOptions = mAggregatedQueryOptionsClone;
293
292
  }
294
293
  return true;
@@ -321,6 +320,8 @@ sap.ui.define([
321
320
  * pending changes are ignored if all parameters are unchanged. Since 1.97.0, pending changes
322
321
  * are ignored if they relate to a
323
322
  * {@link sap.ui.model.odata.v4.Context#setKeepAlive kept-alive} context of this binding.
323
+ * Since 1.98.0, {@link sap.ui.model.odata.v4.Context#isTransient transient} contexts
324
+ * of a {@link #getRootBinding root binding} do not count as pending changes.
324
325
  *
325
326
  * @public
326
327
  * @since 1.45.0
@@ -460,6 +461,9 @@ sap.ui.define([
460
461
  * A (temporary) key predicate for the transient entity: "($uid=...)"
461
462
  * @param {object} [oInitialData={}]
462
463
  * The initial data for the created entity
464
+ * @param {boolean} bAtEndOfCreated
465
+ * Whether the newly created entity should be inserted after previously created entities, not
466
+ * before them
463
467
  * @param {function} fnErrorCallback
464
468
  * A function which is called with an error object each time a POST request for the create
465
469
  * fails
@@ -472,7 +476,8 @@ sap.ui.define([
472
476
  * @private
473
477
  */
474
478
  ODataParentBinding.prototype.createInCache = function (oUpdateGroupLock, vCreatePath,
475
- sCollectionPath, sTransientPredicate, oInitialData, fnErrorCallback, fnSubmitCallback) {
479
+ sCollectionPath, sTransientPredicate, oInitialData, bAtEndOfCreated, fnErrorCallback,
480
+ fnSubmitCallback) {
476
481
  var that = this;
477
482
 
478
483
  return this.oCachePromise.then(function (oCache) {
@@ -481,7 +486,8 @@ sap.ui.define([
481
486
  if (oCache) {
482
487
  sPathInCache = _Helper.getRelativePath(sCollectionPath, that.getResolvedPath());
483
488
  return oCache.create(oUpdateGroupLock, vCreatePath, sPathInCache,
484
- sTransientPredicate, oInitialData, fnErrorCallback, fnSubmitCallback
489
+ sTransientPredicate, oInitialData, bAtEndOfCreated, fnErrorCallback,
490
+ fnSubmitCallback
485
491
  ).then(function (oCreatedEntity) {
486
492
  if (that.mCacheByResourcePath) {
487
493
  // Ensure that cache containing non-transient created entity is recreated
@@ -492,8 +498,8 @@ sap.ui.define([
492
498
  });
493
499
  }
494
500
  return that.oContext.getBinding().createInCache(oUpdateGroupLock, vCreatePath,
495
- sCollectionPath, sTransientPredicate, oInitialData, fnErrorCallback,
496
- fnSubmitCallback);
501
+ sCollectionPath, sTransientPredicate, oInitialData, bAtEndOfCreated,
502
+ fnErrorCallback, fnSubmitCallback);
497
503
  });
498
504
  };
499
505
 
@@ -609,7 +615,7 @@ sap.ui.define([
609
615
  * @since 1.61
610
616
  */
611
617
  ODataParentBinding.prototype.destroy = function () {
612
- // this.mAggregatedQueryOptions = undefined;
618
+ // this.mAggregatedQueryOptions = undefined;
613
619
  this.aChildCanUseCachePromises = [];
614
620
  this.removeReadGroupLock();
615
621
  this.oResumePromise = undefined;
@@ -638,6 +644,8 @@ sap.ui.define([
638
644
  * The child binding's binding path relative to <code>oContext</code>
639
645
  * @param {object|sap.ui.base.SyncPromise} vChildQueryOptions
640
646
  * The child binding's (aggregated) query options or a promise resolving with them
647
+ * @param {boolean} bIsProperty
648
+ * Whether the child is a property binding
641
649
  * @returns {sap.ui.base.SyncPromise}
642
650
  * A promise resolved with the reduced path for the child binding if the child binding can use
643
651
  * this binding's or an ancestor binding's cache; resolved with <code>undefined</code>
@@ -647,7 +655,7 @@ sap.ui.define([
647
655
  * @see sap.ui.model.odata.v4.ODataMetaModel#getReducedPath
648
656
  */
649
657
  ODataParentBinding.prototype.fetchIfChildCanUseCache = function (oContext, sChildPath,
650
- vChildQueryOptions) {
658
+ vChildQueryOptions, bIsProperty) {
651
659
  // getBaseForPathReduction must be called early, because the (virtual) parent context may be
652
660
  // lost again when the path is needed
653
661
  var sBaseForPathReduction = this.getBaseForPathReduction(),
@@ -759,7 +767,7 @@ sap.ui.define([
759
767
  if (bIsAdvertisement) {
760
768
  mWrappedChildQueryOptions = {$select : [sReducedChildMetaPath.slice(1)]};
761
769
  return that.aggregateQueryOptions(mWrappedChildQueryOptions, sBaseMetaPath,
762
- bCacheImmutable)
770
+ bCacheImmutable, bIsProperty)
763
771
  ? sReducedPath
764
772
  : undefined;
765
773
  }
@@ -771,7 +779,7 @@ sap.ui.define([
771
779
  that.oModel.oInterface.fetchMetadata);
772
780
  if (mWrappedChildQueryOptions) {
773
781
  return that.aggregateQueryOptions(mWrappedChildQueryOptions, sBaseMetaPath,
774
- bCacheImmutable)
782
+ bCacheImmutable, bIsProperty)
775
783
  ? sReducedPath
776
784
  : undefined;
777
785
  }
@@ -779,7 +787,7 @@ sap.ui.define([
779
787
  }
780
788
  if (sReducedChildMetaPath === "value") { // symbolic name for operation result
781
789
  return that.aggregateQueryOptions(mChildQueryOptions, sBaseMetaPath,
782
- bCacheImmutable)
790
+ bCacheImmutable, bIsProperty)
783
791
  ? sReducedPath
784
792
  : undefined;
785
793
  }
@@ -808,7 +816,8 @@ sap.ui.define([
808
816
 
809
817
  // Note: in operation bindings mAggregatedQueryOptions misses the options from
810
818
  // $$inheritExpandSelect
811
- if (oCache && !oCache.hasSentRequest() && !that.oOperation) {
819
+ // If the cache is immutable, only mLateQueryOptions may have changed
820
+ if (!bCacheImmutable && oCache && !oCache.hasSentRequest() && !that.oOperation) {
812
821
  if (that.bSharedRequest) {
813
822
  oCache.setActive(false);
814
823
  oCache = that.createAndSetCache(that.mAggregatedQueryOptions,
@@ -856,9 +865,13 @@ sap.ui.define([
856
865
  sMetaPath = _Helper.getMetaPath(oModel.resolve(this.sPath, oContext));
857
866
  mConvertedQueryOptions = Object.assign({}, mQueryOptions, {$select : []});
858
867
  return SyncPromise.all(mQueryOptions.$select.map(function (sSelectPath) {
859
- return _Helper.fetchPropertyAndType(
860
- fnFetchMetadata, sMetaPath + "/" + sSelectPath
861
- ).then(function () {
868
+ var sMetaSelectPath = sMetaPath + "/" + sSelectPath;
869
+
870
+ if (sMetaSelectPath.endsWith(".*")) { // fetch metadata for namespace itself
871
+ sMetaSelectPath = sMetaSelectPath.slice(0, -1);
872
+ }
873
+
874
+ return _Helper.fetchPropertyAndType(fnFetchMetadata, sMetaSelectPath).then(function () {
862
875
  var mWrappedQueryOptions = _Helper.wrapChildQueryOptions(
863
876
  sMetaPath, sSelectPath, {}, fnFetchMetadata);
864
877
 
@@ -989,17 +1002,24 @@ sap.ui.define([
989
1002
  * @override
990
1003
  * @see sap.ui.model.odata.v4.ODataBinding#hasPendingChangesInDependents
991
1004
  */
992
- ODataParentBinding.prototype.hasPendingChangesInDependents = function (bIgnoreKeptAlive) {
1005
+ ODataParentBinding.prototype.hasPendingChangesInDependents = function (bIgnoreKeptAlive0) {
993
1006
  return this.getDependentBindings().some(function (oDependent) {
994
1007
  var oCache = oDependent.oCache,
995
- bHasPendingChanges;
1008
+ bHasPendingChanges,
1009
+ bIgnoreKeptAlive = bIgnoreKeptAlive0; // new copy for this dependent only
996
1010
 
997
- if (bIgnoreKeptAlive && oDependent.oContext.isKeepAlive()) {
998
- return false;
1011
+ if (bIgnoreKeptAlive) {
1012
+ if (oDependent.oContext.isKeepAlive()) {
1013
+ return false; // changes can be safely ignored here
1014
+ }
1015
+ if (oDependent.oContext.getIndex() !== undefined) {
1016
+ bIgnoreKeptAlive = false; // context of ODLB which is not kept alive: unsafe!
1017
+ }
999
1018
  }
1000
1019
  if (oCache !== undefined) {
1001
1020
  // Pending changes for this cache are only possible when there is a cache already
1002
- if (oCache && oCache.hasPendingChangesForPath("")) {
1021
+ if (oCache && oCache.hasPendingChangesForPath("", false, bIgnoreKeptAlive
1022
+ && oDependent.mParameters && oDependent.mParameters.$$ownRequest)) {
1003
1023
  return true;
1004
1024
  }
1005
1025
  } else if (oDependent.hasPendingChangesForPath("")) {
@@ -1018,7 +1038,7 @@ sap.ui.define([
1018
1038
  }
1019
1039
  }
1020
1040
  // Ask dependents, they might have no cache, but pending changes in mCacheByResourcePath
1021
- return oDependent.hasPendingChangesInDependents();
1041
+ return oDependent.hasPendingChangesInDependents(bIgnoreKeptAlive);
1022
1042
  })
1023
1043
  || this.oModel.withUnresolvedBindings("hasPendingChangesInCaches",
1024
1044
  this.getResolvedPath().slice(1));
@@ -1047,36 +1067,6 @@ sap.ui.define([
1047
1067
  return false;
1048
1068
  };
1049
1069
 
1050
- /**
1051
- * Refreshes all dependent bindings with the given parameters and waits for them to have
1052
- * finished.
1053
- *
1054
- * @param {string} sResourcePathPrefix
1055
- * The resource path prefix which is used to delete the dependent caches and corresponding
1056
- * messages; may be "" but not <code>undefined</code>
1057
- * @param {string} [sGroupId]
1058
- * The group ID to be used for refresh
1059
- * @param {boolean} [bCheckUpdate]
1060
- * If <code>true</code>, a property binding is expected to check for updates
1061
- * @param {boolean} [bKeepCacheOnError]
1062
- * If <code>true</code>, the binding data remains unchanged if the refresh fails
1063
- * @returns {sap.ui.base.SyncPromise}
1064
- * A promise resolving when all dependent bindings are refreshed; it is rejected
1065
- * when the refresh fails; the promise is resolved immediately on a suspended binding
1066
- * @throws {Error}
1067
- * If the binding's root binding is suspended and a group ID different from the binding's
1068
- * group ID is given
1069
- *
1070
- * @private
1071
- */
1072
- ODataParentBinding.prototype.refreshDependentBindings = function (sResourcePathPrefix, sGroupId,
1073
- bCheckUpdate, bKeepCacheOnError) {
1074
- return SyncPromise.all(this.getDependentBindings().map(function (oDependentBinding) {
1075
- return oDependentBinding.refreshInternal(sResourcePathPrefix, sGroupId, bCheckUpdate,
1076
- bKeepCacheOnError);
1077
- }));
1078
- };
1079
-
1080
1070
  /**
1081
1071
  * Recursively refreshes all dependent list bindings that have no own cache.
1082
1072
  *
@@ -1256,10 +1246,10 @@ sap.ui.define([
1256
1246
  * @throws {Error}
1257
1247
  * If this binding
1258
1248
  * <ul>
1259
- * <li>is relative to a {@link sap.ui.model.odata.v4.Context},</li>
1260
- * <li>is an operation binding,</li>
1261
- * <li>has {@link sap.ui.model.Binding#isSuspended} set to <code>false</code>,</li>
1262
- * <li>is not a root binding. Use {@link #getRootBinding} to determine the root binding.</li>
1249
+ * <li>is relative to a {@link sap.ui.model.odata.v4.Context},
1250
+ * <li>is an operation binding,
1251
+ * <li>has {@link sap.ui.model.Binding#isSuspended} set to <code>false</code>,
1252
+ * <li>is not a root binding. Use {@link #getRootBinding} to determine the root binding.
1263
1253
  * </ul>
1264
1254
  *
1265
1255
  * @public
@@ -1314,16 +1304,17 @@ sap.ui.define([
1314
1304
  * data service requests. Call {@link #resume} to resume the binding. Before 1.53.0, this method
1315
1305
  * was not supported and threw an error. Since 1.97.0, pending changes are ignored if they
1316
1306
  * relate to a {@link sap.ui.model.odata.v4.Context#setKeepAlive kept-alive} context of this
1317
- * binding.
1307
+ * binding. Since 1.98.0, {@link sap.ui.model.odata.v4.Context#isTransient transient} contexts
1308
+ * of a {@link #getRootBinding root binding} do not count as pending changes.
1318
1309
  *
1319
1310
  * @throws {Error}
1320
1311
  * If this binding
1321
- * <ul>
1322
- * <li>is relative to a {@link sap.ui.model.odata.v4.Context},</li>
1323
- * <li>is an operation binding,</li>
1324
- * <li>has {@link sap.ui.model.Binding#isSuspended} set to <code>true</code>,</li>
1325
- * <li>has pending changes that cannot be ignored,</li>
1326
- * <li>is not a root binding. Use {@link #getRootBinding} to determine the root binding.</li>
1312
+ * <ul>
1313
+ * <li>is relative to a {@link sap.ui.model.odata.v4.Context},
1314
+ * <li>is an operation binding,
1315
+ * <li>has {@link sap.ui.model.Binding#isSuspended} set to <code>true</code>,
1316
+ * <li>has pending changes that cannot be ignored,
1317
+ * <li>is not a root binding. Use {@link #getRootBinding} to determine the root binding.
1327
1318
  * </ul>
1328
1319
  *
1329
1320
  * @public
@@ -29,7 +29,38 @@ sap.ui.define([
29
29
  dataRequested : true,
30
30
  DataStateChange : true
31
31
  },
32
- sVirtualPath = "/" + Context.VIRTUAL; // a snippet indicating a virtual path
32
+ sVirtualPath = "/" + Context.VIRTUAL, // a snippet indicating a virtual path
33
+ /**
34
+ * @alias sap.ui.model.odata.v4.ODataPropertyBinding
35
+ * @author SAP SE
36
+ * @class Property binding for an OData V4 model.
37
+ * An event handler can only be attached to this binding for the following events:
38
+ * 'AggregatedDataStateChange', 'change', 'dataReceived', 'dataRequested' and
39
+ * 'DataStateChange'. For unsupported events, an error is thrown.
40
+ * @extends sap.ui.model.PropertyBinding
41
+ * @hideconstructor
42
+ * @mixes sap.ui.model.odata.v4.ODataBinding
43
+ * @public
44
+ * @since 1.37.0
45
+ * @version 1.101.0
46
+ * @borrows sap.ui.model.odata.v4.ODataBinding#getGroupId as #getGroupId
47
+ * @borrows sap.ui.model.odata.v4.ODataBinding#getRootBinding as #getRootBinding
48
+ * @borrows sap.ui.model.odata.v4.ODataBinding#getUpdateGroupId as #getUpdateGroupId
49
+ * @borrows sap.ui.model.odata.v4.ODataBinding#hasPendingChanges as #hasPendingChanges
50
+ * @borrows sap.ui.model.odata.v4.ODataBinding#isInitial as #isInitial
51
+ * @borrows sap.ui.model.odata.v4.ODataBinding#refresh as #refresh
52
+ * @borrows sap.ui.model.odata.v4.ODataBinding#requestRefresh as #requestRefresh
53
+ * @borrows sap.ui.model.odata.v4.ODataBinding#resetChanges as #resetChanges
54
+ * @borrows sap.ui.model.odata.v4.ODataBinding#toString as #toString
55
+ */
56
+ ODataPropertyBinding
57
+ = PropertyBinding.extend("sap.ui.model.odata.v4.ODataPropertyBinding", {
58
+ constructor : constructor
59
+ });
60
+
61
+ //*********************************************************************************************
62
+ // ODataPropertyBinding
63
+ //*********************************************************************************************
33
64
 
34
65
  /**
35
66
  * Do <strong>NOT</strong> call this private constructor, but rather use
@@ -45,65 +76,37 @@ sap.ui.define([
45
76
  * Map of binding parameters
46
77
  * @throws {Error}
47
78
  * If disallowed binding parameters are provided
48
- *
49
- * @alias sap.ui.model.odata.v4.ODataPropertyBinding
50
- * @author SAP SE
51
- * @class Property binding for an OData V4 model.
52
- * An event handler can only be attached to this binding for the following events:
53
- * 'AggregatedDataStateChange', 'change', 'dataReceived', 'dataRequested' and
54
- * 'DataStateChange'. For unsupported events, an error is thrown.
55
- * @extends sap.ui.model.PropertyBinding
56
- * @hideconstructor
57
- * @mixes sap.ui.model.odata.v4.ODataBinding
58
- * @public
59
- * @since 1.37.0
60
- * @version 1.98.0
61
- * @borrows sap.ui.model.odata.v4.ODataBinding#getGroupId as #getGroupId
62
- * @borrows sap.ui.model.odata.v4.ODataBinding#getRootBinding as #getRootBinding
63
- * @borrows sap.ui.model.odata.v4.ODataBinding#getUpdateGroupId as #getUpdateGroupId
64
- * @borrows sap.ui.model.odata.v4.ODataBinding#hasPendingChanges as #hasPendingChanges
65
- * @borrows sap.ui.model.odata.v4.ODataBinding#isInitial as #isInitial
66
- * @borrows sap.ui.model.odata.v4.ODataBinding#refresh as #refresh
67
- * @borrows sap.ui.model.odata.v4.ODataBinding#requestRefresh as #requestRefresh
68
- * @borrows sap.ui.model.odata.v4.ODataBinding#resetChanges as #resetChanges
69
- * @borrows sap.ui.model.odata.v4.ODataBinding#toString as #toString
70
- */
71
- var ODataPropertyBinding
72
- = PropertyBinding.extend("sap.ui.model.odata.v4.ODataPropertyBinding", {
73
- constructor : function (oModel, sPath, oContext, mParameters) {
74
- PropertyBinding.call(this, oModel, sPath);
75
- // initialize mixin members
76
- asODataBinding.call(this);
77
-
78
- if (sPath.endsWith("/")) {
79
- throw new Error("Invalid path: " + sPath);
80
- }
81
- if (mParameters) {
82
- this.checkBindingParameters(mParameters,
83
- ["$$groupId", "$$ignoreMessages", "$$noPatch"]);
84
- this.sGroupId = mParameters.$$groupId;
85
- this.bNoPatch = mParameters.$$noPatch;
86
- this.setIgnoreMessages(mParameters.$$ignoreMessages);
87
- } else {
88
- this.sGroupId = undefined;
89
- this.bNoPatch = false;
90
- }
91
- this.oCheckUpdateCallToken = undefined;
92
- this.oContext = oContext;
93
- this.bHasDeclaredType = undefined; // whether the binding info declares a type
94
- this.bInitial = true;
95
- // Note: system query options supported at property binding only for ".../$count"
96
- this.mQueryOptions = this.oModel.buildQueryOptions(_Helper.clone(mParameters),
97
- /*bSystemQueryOptionsAllowed*/sPath.endsWith("$count"));
98
- this.vValue = undefined;
99
- // BEWARE: #doFetchQueryOptions uses #isRoot which relies on this.oContext!
100
- this.fetchCache(oContext);
101
- oModel.bindingCreated(this);
102
- },
103
- metadata : {
104
- publicMethods : []
105
- }
106
- });
79
+ */
80
+ function constructor(oModel, sPath, oContext, mParameters) {
81
+ PropertyBinding.call(this, oModel, sPath);
82
+ // initialize mixin members
83
+ asODataBinding.call(this);
84
+
85
+ if (sPath.endsWith("/")) {
86
+ throw new Error("Invalid path: " + sPath);
87
+ }
88
+ if (mParameters) {
89
+ this.checkBindingParameters(mParameters,
90
+ ["$$groupId", "$$ignoreMessages", "$$noPatch"]);
91
+ this.sGroupId = mParameters.$$groupId;
92
+ this.bNoPatch = mParameters.$$noPatch;
93
+ this.setIgnoreMessages(mParameters.$$ignoreMessages);
94
+ } else {
95
+ this.sGroupId = undefined;
96
+ this.bNoPatch = false;
97
+ }
98
+ this.oCheckUpdateCallToken = undefined;
99
+ this.oContext = oContext;
100
+ this.bHasDeclaredType = undefined; // whether the binding info declares a type
101
+ this.bInitial = true;
102
+ // Note: system query options supported at property binding only for ".../$count"
103
+ this.mQueryOptions = this.oModel.buildQueryOptions(_Helper.clone(mParameters),
104
+ /*bSystemQueryOptionsAllowed*/sPath.endsWith("$count"));
105
+ this.vValue = undefined;
106
+ // BEWARE: #doFetchQueryOptions uses #isRoot which relies on this.oContext!
107
+ this.fetchCache(oContext);
108
+ oModel.bindingCreated(this);
109
+ }
107
110
 
108
111
  asODataBinding(ODataPropertyBinding.prototype);
109
112
 
@@ -266,7 +269,8 @@ sap.ui.define([
266
269
  && !bIsMeta) {
267
270
  vType = oMetaModel.fetchUI5Type(sResolvedPath);
268
271
  }
269
- if (arguments.length < 4) {
272
+ if (vValue === undefined) {
273
+ // if called via #onChange, we need to fetch implicit values
270
274
  vValue = this.oCachePromise.then(function (oCache) {
271
275
  var sDataPath, sMetaPath;
272
276
 
@@ -108,6 +108,8 @@ sap.ui.define([
108
108
  * <li> <code>type</code>: the EDM data type (like "Edm.String") if it could be
109
109
  * determined
110
110
  * <li> <code>constraints</code>: {object} type constraints if result is "binding"
111
+ * <li> <code>formatOptions</code>: {object} format options if result is "binding"
112
+ * <li> <code>parameters</code>: {object} binding parameters if result is "binding"
111
113
  * </ul>
112
114
  *
113
115
  * @private
@@ -405,7 +407,8 @@ sap.ui.define([
405
407
  return Expression.path(oPathValue);
406
408
  }
407
409
 
408
- ["$And", "$Apply", "$Date", "$DateTimeOffset", "$Decimal", "$Float", "$Eq",
410
+ [
411
+ "$And", "$Apply", "$Date", "$DateTimeOffset", "$Decimal", "$Float", "$Eq",
409
412
  "$Ge", "$Gt", "$Guid", "$If", "$Int", "$Le", "$Lt", "$Name", "$Ne", "$Not",
410
413
  "$Null", "$Or", "$Path", "$PropertyPath", "$TimeOfDay", "$LabeledElement"
411
414
  ].forEach(function (sProperty) {
@@ -539,6 +542,52 @@ sap.ui.define([
539
542
  });
540
543
  },
541
544
 
545
+ /**
546
+ * Fetch the result object for a date/time with timezone.
547
+ * If <code>oPathValue.path</code> references a property which has a
548
+ * <code>com.sap.vocabularies.Common.v1.Timezone</code> annotation, a composite result
549
+ * object for a <code>sap.ui.model.odata.type.DateTimeWithTimezone</code> type with the
550
+ * date/time and the timezone as parts is returned.
551
+ *
552
+ * @param {object} oPathValue
553
+ * model, path (and value) information pointing to the path (see Expression object)
554
+ * @param {string} sValue
555
+ * use this value instead of <code>oPathValue.value</code>!
556
+ * @param {object} mConstraints
557
+ * the type constraints for the property referenced by <code>oPathValue.path</code>
558
+ * @returns {sap.ui.base.SyncPromise|undefined}
559
+ * a sync promise which resolves with a result object for the date/time with timezone, or
560
+ * is rejected with an error; <code>undefined</code> if there is no timezone annotation
561
+ * for the property referenced by <code>oPathValue.path</code>
562
+ */
563
+ fetchDateTimeWithTimezone : function (oPathValue, sValue, mConstraints) {
564
+ var oModel = oPathValue.model,
565
+ sPath = oPathValue.path + "@com.sap.vocabularies.Common.v1.Timezone/$Path",
566
+ sTargetPath = oModel.getObject(sPath);
567
+
568
+ function formatPart(mConstraints0, sType, sPath0) {
569
+ return Basics.resultToString(
570
+ Expression.pathResult(oPathValue, sType, sPath0, mConstraints0),
571
+ false, true);
572
+ }
573
+
574
+ if (!sTargetPath) {
575
+ return undefined;
576
+ }
577
+ return oModel.fetchObject(sPath + "/$").then(function (oTarget) {
578
+ return {
579
+ result : "composite",
580
+ type : "sap.ui.model.odata.type.DateTimeWithTimezone",
581
+ value : "{mode:'TwoWay',parts:["
582
+ + formatPart(mConstraints, "Edm.DateTimeOffset", sValue)
583
+ + ","
584
+ + formatPart(oModel.getConstraints(oTarget, sPath), oTarget.$Type,
585
+ sTargetPath)
586
+ + "],type:'sap.ui.model.odata.type.DateTimeWithTimezone'}"
587
+ };
588
+ });
589
+ },
590
+
542
591
  /**
543
592
  * Handling of "14.5.3.1.2 Function odata.fillUriTemplate".
544
593
  *
@@ -771,6 +820,11 @@ sap.ui.define([
771
820
  * <code>Org.OData.Measures.V1.Unit</code> annotation, a composite result object for a
772
821
  * <code>sap.ui.model.odata.type.Unit</code> type with the measures, the unit and the unit
773
822
  * customizing as parts is returned.
823
+ * If <code>oPathValue.path</code> references a property with type
824
+ * <code>Edm.DateTimeOffset</code> and a
825
+ * <code>com.sap.vocabularies.Common.v1.Timezone</code> annotation, a composite result
826
+ * object for a <code>sap.ui.model.odata.type.DateTimeWithTimezone</code> type with the
827
+ * date/time and the timezone as parts is returned.
774
828
  *
775
829
  * @param {object} oPathValue
776
830
  * model, path and value information pointing to the path (see Expression object)
@@ -795,16 +849,17 @@ sap.ui.define([
795
849
  }
796
850
 
797
851
  return oPromise.then(function (oProperty) {
798
- var mConstraints,
799
- oCurrencyOrUnitPromise,
852
+ var oAnnotationBasedPromise,
853
+ mConstraints,
800
854
  sType = oProperty && oProperty.$Type;
801
855
 
802
856
  if (oProperty && oPathValue.complexBinding) {
803
857
  mConstraints = oModel.getConstraints(oProperty, oPathValue.path);
804
- oCurrencyOrUnitPromise
805
- = Expression.fetchCurrencyOrUnit(oPathValue, sValue, sType, mConstraints);
858
+ oAnnotationBasedPromise = sType === "Edm.DateTimeOffset"
859
+ ? Expression.fetchDateTimeWithTimezone(oPathValue, sValue, mConstraints)
860
+ : Expression.fetchCurrencyOrUnit(oPathValue, sValue, sType, mConstraints);
806
861
  }
807
- return oCurrencyOrUnitPromise
862
+ return oAnnotationBasedPromise
808
863
  || Expression.pathResult(oPathValue, sType, sValue, mConstraints);
809
864
  });
810
865
  },
@@ -437,6 +437,21 @@ sap.ui.define([
437
437
  return this.drillDown(this.aElements, sPath, oGroupLock);
438
438
  };
439
439
 
440
+ /**
441
+ * Nothing to do here, we have no created elements.
442
+ *
443
+ * @param {string} [_sPath]
444
+ * Relative path to drill-down into
445
+ * @returns {object[]}
446
+ * An empty array
447
+ *
448
+ * @public
449
+ */
450
+ // @override sap.ui.model.odata.v4.lib._Cache#getCreatedElements
451
+ _AggregationCache.prototype.getCreatedElements = function (_sPath) {
452
+ return [];
453
+ };
454
+
440
455
  /**
441
456
  * @override
442
457
  * @see sap.ui.model.odata.v4.lib._Cache#getDownloadQueryOptions