@openui5/sap.ui.core 1.93.3 → 1.96.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/.eslintrc.json +13 -2
  2. package/.reuse/dep5 +6 -11
  3. package/THIRDPARTY.txt +10 -16
  4. package/package.json +1 -1
  5. package/src/jquery.sap.global.js +5 -2
  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/jquery.sap.stubs.js +2 -1
  11. package/src/jquery.sap.trace.js +2 -1
  12. package/src/sap/base/i18n/ResourceBundle.js +6 -2
  13. package/src/sap/base/strings/whitespaceReplacer.js +52 -0
  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 +37 -42
  56. package/src/sap/ui/Global.js +8 -7
  57. package/src/sap/ui/base/DataType.js +14 -8
  58. package/src/sap/ui/base/Event.js +1 -1
  59. package/src/sap/ui/base/EventProvider.js +1 -1
  60. package/src/sap/ui/base/ExpressionParser.js +9 -6
  61. package/src/sap/ui/base/Interface.js +3 -49
  62. package/src/sap/ui/base/ManagedObject.js +12 -7
  63. package/src/sap/ui/base/ManagedObjectMetadata.js +1 -1
  64. package/src/sap/ui/base/Metadata.js +1 -1
  65. package/src/sap/ui/base/Object.js +49 -4
  66. package/src/sap/ui/base/ObjectPool.js +1 -1
  67. package/src/sap/ui/base/syncXHRFix.js +2 -1
  68. package/src/sap/ui/core/.library +5 -5
  69. package/src/sap/ui/core/AppCacheBuster.js +4 -4
  70. package/src/sap/ui/core/BusyIndicator.js +1 -11
  71. package/src/sap/ui/core/Component.js +300 -140
  72. package/src/sap/ui/core/ComponentContainer.js +24 -8
  73. package/src/sap/ui/core/ComponentMetadata.js +14 -3
  74. package/src/sap/ui/core/ComponentSupport.js +1 -1
  75. package/src/sap/ui/core/Configuration.js +67 -31
  76. package/src/sap/ui/core/Control.js +1 -1
  77. package/src/sap/ui/core/Core.js +103 -25
  78. package/src/sap/ui/core/CustomData.js +1 -1
  79. package/src/sap/ui/core/CustomizingConfiguration.js +35 -260
  80. package/src/sap/ui/core/DeclarativeSupport.js +3 -2
  81. package/src/sap/ui/core/Element.js +1 -1
  82. package/src/sap/ui/core/ElementMetadata.js +4 -2
  83. package/src/sap/ui/core/EnabledPropagator.js +91 -73
  84. package/src/sap/ui/core/EventBus.js +1 -1
  85. package/src/sap/ui/core/ExtensionPoint.js +7 -14
  86. package/src/sap/ui/core/Fragment.js +30 -32
  87. package/src/sap/ui/core/HTML.js +1 -1
  88. package/src/sap/ui/core/History.js +1 -1
  89. package/src/sap/ui/core/Icon.js +7 -8
  90. package/src/sap/ui/core/IconPool.js +26 -1097
  91. package/src/sap/ui/core/IconRenderer.js +6 -6
  92. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  93. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  94. package/src/sap/ui/core/InvisibleMessage.js +1 -1
  95. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  96. package/src/sap/ui/core/InvisibleText.js +1 -1
  97. package/src/sap/ui/core/Item.js +1 -1
  98. package/src/sap/ui/core/LabelEnablement.js +1 -1
  99. package/src/sap/ui/core/LayoutData.js +1 -1
  100. package/src/sap/ui/core/ListItem.js +1 -1
  101. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  102. package/src/sap/ui/core/Locale.js +26 -4
  103. package/src/sap/ui/core/LocaleData.js +1 -1
  104. package/src/sap/ui/core/Manifest.js +4 -61
  105. package/src/sap/ui/core/Message.js +1 -1
  106. package/src/sap/ui/core/Patcher.js +27 -3
  107. package/src/sap/ui/core/Placeholder.js +28 -15
  108. package/src/sap/ui/core/RenderManager.js +36 -6
  109. package/src/sap/ui/core/Renderer.js +13 -3
  110. package/src/sap/ui/core/ResizeHandler.js +1 -1
  111. package/src/sap/ui/core/ScrollBar.js +2 -2
  112. package/src/sap/ui/core/SeparatorItem.js +1 -1
  113. package/src/sap/ui/core/ShortcutHintsMixin.js +14 -7
  114. package/src/sap/ui/core/Title.js +1 -1
  115. package/src/sap/ui/core/TooltipBase.js +1 -1
  116. package/src/sap/ui/core/UIArea.js +1 -1
  117. package/src/sap/ui/core/UIComponent.js +42 -16
  118. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  119. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  120. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  121. package/src/sap/ui/core/XMLComposite.js +2 -2
  122. package/src/sap/ui/core/XMLCompositeMetadata.js +2 -2
  123. package/src/sap/ui/core/XMLTemplateProcessor.js +116 -41
  124. package/src/sap/ui/core/_IconRegistry.js +1148 -0
  125. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  126. package/src/sap/ui/core/delegate/ScrollEnablement.js +6 -3
  127. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  128. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  129. package/src/sap/ui/core/dnd/DragInfo.js +2 -2
  130. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  131. package/src/sap/ui/core/format/NumberFormat.js +16 -1
  132. package/src/sap/ui/core/hyphenation/Hyphenation.js +73 -221
  133. package/src/sap/ui/core/hyphenation/HyphenationTestingWords.js +11 -10
  134. package/src/sap/ui/core/library.js +3 -3
  135. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  136. package/src/sap/ui/core/message/Message.js +1 -1
  137. package/src/sap/ui/core/message/MessageManager.js +13 -15
  138. package/src/sap/ui/core/message/MessageParser.js +1 -1
  139. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  140. package/src/sap/ui/core/messagebundle_de.properties +1 -1
  141. package/src/sap/ui/core/messagebundle_fr.properties +1 -1
  142. package/src/sap/ui/core/messagebundle_it.properties +1 -1
  143. package/src/sap/ui/core/messagebundle_pl.properties +1 -1
  144. package/src/sap/ui/core/messagebundle_th.properties +2 -2
  145. package/src/sap/ui/core/mvc/Controller.js +38 -19
  146. package/src/sap/ui/core/mvc/ControllerExtensionProvider.js +30 -32
  147. package/src/sap/ui/core/mvc/ControllerMetadata.js +18 -18
  148. package/src/sap/ui/core/mvc/HTMLView.js +2 -2
  149. package/src/sap/ui/core/mvc/JSONView.js +2 -2
  150. package/src/sap/ui/core/mvc/JSView.js +2 -2
  151. package/src/sap/ui/core/mvc/TemplateView.js +2 -2
  152. package/src/sap/ui/core/mvc/View.js +58 -85
  153. package/src/sap/ui/core/mvc/XMLView.js +2 -2
  154. package/src/sap/ui/core/mvc/XMLViewRenderer.js +17 -20
  155. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  156. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  157. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  158. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  159. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  160. package/src/sap/ui/core/routing/History.js +10 -2
  161. package/src/sap/ui/core/routing/Router.js +8 -1
  162. package/src/sap/ui/core/routing/Target.js +13 -0
  163. package/src/sap/ui/core/routing/Targets.js +13 -2
  164. package/src/sap/ui/core/routing/async/Route.js +1 -1
  165. package/src/sap/ui/core/routing/async/Target.js +353 -259
  166. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
  167. package/src/sap/ui/core/search/SearchProvider.js +1 -1
  168. package/src/sap/ui/core/service/Service.js +1 -1
  169. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  170. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  171. package/src/sap/ui/core/support/BootSupportTool.js +11 -0
  172. package/src/sap/ui/core/support/InteractionTree.css +4 -0
  173. package/src/sap/ui/core/support/Plugin.js +1 -1
  174. package/src/sap/ui/core/support/Support.js +1 -1
  175. package/src/sap/ui/core/support/ViewInfo.css +599 -0
  176. package/src/sap/ui/core/support/controls/InteractionTree.js +352 -222
  177. package/src/sap/ui/core/support/controls/ObjectViewer.js +3 -41
  178. package/src/sap/ui/core/support/controls/TimelineOverview.js +49 -24
  179. package/src/sap/ui/core/support/controls/TreeViewer.js +12 -58
  180. package/src/sap/ui/core/support/plugins/ControlTree.js +59 -68
  181. package/src/sap/ui/core/support/plugins/Debugging.js +9 -11
  182. package/src/sap/ui/core/support/plugins/Interaction.js +2 -2
  183. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  184. package/src/sap/ui/core/support/plugins/Performance.js +147 -75
  185. package/src/sap/ui/core/support/plugins/Selector.js +19 -24
  186. package/src/sap/ui/core/support/plugins/TechInfo.js +5 -5
  187. package/src/sap/ui/core/support/plugins/Trace.js +95 -32
  188. package/src/sap/ui/core/support/plugins/ViewInfo.js +9 -73
  189. package/src/sap/ui/core/support/support.css +109 -14
  190. package/src/sap/ui/core/support/support.html +6 -2
  191. package/src/sap/ui/core/support/techinfo/TechnicalInfo.fragment.xml +1 -0
  192. package/src/sap/ui/core/support/techinfo/TechnicalInfo.js +149 -72
  193. package/src/sap/ui/core/themes/base/Icon.less +9 -0
  194. package/src/sap/ui/core/themes/base/fonts/SAP-icons.woff2 +0 -0
  195. package/src/sap/ui/core/theming/Parameters.js +6 -4
  196. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  197. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  198. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  199. package/src/sap/ui/core/tmpl/Template.js +10 -28
  200. package/src/sap/ui/core/tmpl/TemplateControl.js +4 -4
  201. package/src/sap/ui/core/tmpl/_parsePath.js +35 -0
  202. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  203. package/src/sap/ui/core/util/DraftEnabledMockServer.js +9 -4
  204. package/src/sap/ui/core/util/Export.js +1 -1
  205. package/src/sap/ui/core/util/ExportCell.js +1 -1
  206. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  207. package/src/sap/ui/core/util/ExportRow.js +1 -1
  208. package/src/sap/ui/core/util/ExportType.js +1 -1
  209. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  210. package/src/sap/ui/core/util/File.js +1 -1
  211. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  212. package/src/sap/ui/core/util/MockServer.js +5 -5
  213. package/src/sap/ui/core/util/MockServerAnnotationsHandler.js +3 -2
  214. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  215. package/src/sap/ui/core/util/XMLPreprocessor.js +11 -12
  216. package/src/sap/ui/core/util/reflection/BaseTreeModifier.js +136 -63
  217. package/src/sap/ui/core/util/reflection/JsControlTreeModifier.js +170 -153
  218. package/src/sap/ui/core/util/reflection/XmlTreeModifier.js +424 -293
  219. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  220. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  221. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  222. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  223. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  224. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  225. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  226. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  227. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  228. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  229. package/src/sap/ui/debug/ControlTree.js +10 -4
  230. package/src/sap/ui/debug/DebugEnv.js +3 -4
  231. package/src/sap/ui/debug/Highlighter.js +8 -2
  232. package/src/sap/ui/debug/PropertyList.css +55 -0
  233. package/src/sap/ui/debug/PropertyList.js +111 -182
  234. package/src/sap/ui/model/Binding.js +174 -118
  235. package/src/sap/ui/model/ClientContextBinding.js +1 -1
  236. package/src/sap/ui/model/ClientListBinding.js +1 -3
  237. package/src/sap/ui/model/ClientModel.js +4 -4
  238. package/src/sap/ui/model/ClientPropertyBinding.js +4 -2
  239. package/src/sap/ui/model/ClientTreeBinding.js +15 -9
  240. package/src/sap/ui/model/ClientTreeBindingAdapter.js +28 -23
  241. package/src/sap/ui/model/CompositeBinding.js +98 -77
  242. package/src/sap/ui/model/CompositeDataState.js +2 -2
  243. package/src/sap/ui/model/CompositeType.js +2 -2
  244. package/src/sap/ui/model/Context.js +4 -2
  245. package/src/sap/ui/model/ContextBinding.js +6 -14
  246. package/src/sap/ui/model/DataState.js +2 -2
  247. package/src/sap/ui/model/Filter.js +255 -53
  248. package/src/sap/ui/model/FilterOperator.js +1 -1
  249. package/src/sap/ui/model/FilterProcessor.js +27 -17
  250. package/src/sap/ui/model/FilterType.js +1 -1
  251. package/src/sap/ui/model/ListBinding.js +180 -117
  252. package/src/sap/ui/model/MetaModel.js +4 -9
  253. package/src/sap/ui/model/Model.js +345 -294
  254. package/src/sap/ui/model/PropertyBinding.js +92 -58
  255. package/src/sap/ui/model/SelectionModel.js +2 -2
  256. package/src/sap/ui/model/SimpleType.js +2 -2
  257. package/src/sap/ui/model/Sorter.js +1 -1
  258. package/src/sap/ui/model/SorterProcessor.js +1 -1
  259. package/src/sap/ui/model/StaticBinding.js +1 -1
  260. package/src/sap/ui/model/TreeAutoExpandMode.js +2 -2
  261. package/src/sap/ui/model/TreeBinding.js +1 -1
  262. package/src/sap/ui/model/TreeBindingAdapter.js +251 -100
  263. package/src/sap/ui/model/TreeBindingCompatibilityAdapter.js +16 -9
  264. package/src/sap/ui/model/TreeBindingUtils.js +1 -0
  265. package/src/sap/ui/model/Type.js +1 -1
  266. package/src/sap/ui/model/analytics/AnalyticalBinding.js +8 -4
  267. package/src/sap/ui/model/analytics/AnalyticalTreeBindingAdapter.js +1 -1
  268. package/src/sap/ui/model/analytics/AnalyticalVersionInfo.js +1 -1
  269. package/src/sap/ui/model/analytics/BatchResponseCollector.js +1 -1
  270. package/src/sap/ui/model/analytics/ODataModelAdapter.js +1 -1
  271. package/src/sap/ui/model/analytics/odata4analytics.js +34 -25
  272. package/src/sap/ui/model/base/ManagedObjectModel.js +4 -0
  273. package/src/sap/ui/model/json/JSONListBinding.js +8 -5
  274. package/src/sap/ui/model/json/JSONModel.js +24 -15
  275. package/src/sap/ui/model/json/JSONPropertyBinding.js +4 -3
  276. package/src/sap/ui/model/json/JSONTreeBinding.js +1 -1
  277. package/src/sap/ui/model/message/MessageListBinding.js +6 -3
  278. package/src/sap/ui/model/message/MessageModel.js +23 -15
  279. package/src/sap/ui/model/message/MessagePropertyBinding.js +2 -2
  280. package/src/sap/ui/model/odata/AnnotationHelper.js +1 -1
  281. package/src/sap/ui/model/odata/AnnotationParser.js +1 -1
  282. package/src/sap/ui/model/odata/CountMode.js +1 -1
  283. package/src/sap/ui/model/odata/Filter.js +1 -1
  284. package/src/sap/ui/model/odata/ODataAnnotations.js +2 -2
  285. package/src/sap/ui/model/odata/ODataContextBinding.js +1 -1
  286. package/src/sap/ui/model/odata/ODataListBinding.js +1 -1
  287. package/src/sap/ui/model/odata/ODataMessageParser.js +2 -2
  288. package/src/sap/ui/model/odata/ODataMetaModel.js +5 -3
  289. package/src/sap/ui/model/odata/ODataMetadata.js +2 -2
  290. package/src/sap/ui/model/odata/ODataModel.js +8 -7
  291. package/src/sap/ui/model/odata/ODataPropertyBinding.js +1 -1
  292. package/src/sap/ui/model/odata/ODataTreeBinding.js +65 -33
  293. package/src/sap/ui/model/odata/ODataTreeBindingAdapter.js +1 -1
  294. package/src/sap/ui/model/odata/ODataTreeBindingFlat.js +2 -2
  295. package/src/sap/ui/model/odata/ODataUtils.js +13 -11
  296. package/src/sap/ui/model/odata/OperationMode.js +1 -1
  297. package/src/sap/ui/model/odata/_AnnotationHelperExpression.js +1 -1
  298. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  299. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  300. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  301. package/src/sap/ui/model/odata/type/Date.js +1 -1
  302. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  303. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  304. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  305. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  306. package/src/sap/ui/model/odata/type/Double.js +1 -1
  307. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  308. package/src/sap/ui/model/odata/type/Int.js +1 -1
  309. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  310. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  311. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  312. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  313. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  314. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  315. package/src/sap/ui/model/odata/type/Single.js +1 -1
  316. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  317. package/src/sap/ui/model/odata/type/String.js +1 -1
  318. package/src/sap/ui/model/odata/type/Time.js +1 -1
  319. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  320. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  321. package/src/sap/ui/model/odata/v2/Context.js +81 -9
  322. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +3 -3
  323. package/src/sap/ui/model/odata/v2/ODataContextBinding.js +39 -49
  324. package/src/sap/ui/model/odata/v2/ODataListBinding.js +236 -73
  325. package/src/sap/ui/model/odata/v2/ODataModel.js +314 -164
  326. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +110 -97
  327. package/src/sap/ui/model/odata/v2/_CreatedContextsCache.js +129 -0
  328. package/src/sap/ui/model/odata/v4/Context.js +6 -3
  329. package/src/sap/ui/model/odata/v4/ODataBinding.js +5 -6
  330. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +117 -40
  331. package/src/sap/ui/model/odata/v4/ODataListBinding.js +95 -15
  332. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +44 -31
  333. package/src/sap/ui/model/odata/v4/ODataModel.js +86 -78
  334. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +47 -28
  335. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +11 -7
  336. package/src/sap/ui/model/odata/v4/_AnnotationHelperExpression.js +10 -3
  337. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +8 -1
  338. package/src/sap/ui/model/odata/v4/lib/_Cache.js +24 -16
  339. package/src/sap/ui/model/odata/v4/lib/_Helper.js +32 -30
  340. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +52 -17
  341. package/src/sap/ui/model/odata/v4/lib/_V2Requestor.js +2 -2
  342. package/src/sap/ui/model/resource/ResourceModel.js +6 -2
  343. package/src/sap/ui/model/resource/ResourcePropertyBinding.js +1 -1
  344. package/src/sap/ui/model/type/Boolean.js +2 -2
  345. package/src/sap/ui/model/type/Currency.js +2 -2
  346. package/src/sap/ui/model/type/Date.js +9 -3
  347. package/src/sap/ui/model/type/DateInterval.js +4 -2
  348. package/src/sap/ui/model/type/DateTime.js +2 -2
  349. package/src/sap/ui/model/type/DateTimeInterval.js +2 -2
  350. package/src/sap/ui/model/type/FileSize.js +4 -2
  351. package/src/sap/ui/model/type/Float.js +4 -2
  352. package/src/sap/ui/model/type/Integer.js +4 -2
  353. package/src/sap/ui/model/type/String.js +2 -2
  354. package/src/sap/ui/model/type/Time.js +2 -2
  355. package/src/sap/ui/model/type/TimeInterval.js +2 -2
  356. package/src/sap/ui/model/type/Unit.js +14 -7
  357. package/src/sap/ui/model/xml/XMLListBinding.js +15 -9
  358. package/src/sap/ui/model/xml/XMLModel.js +70 -41
  359. package/src/sap/ui/model/xml/XMLPropertyBinding.js +4 -4
  360. package/src/sap/ui/model/xml/XMLTreeBinding.js +5 -4
  361. package/src/sap/ui/performance/trace/Interaction.js +30 -15
  362. package/src/sap/ui/performance/trace/initTraces.js +1 -1
  363. package/src/sap/ui/qunit/QUnitUtils.js +3 -2
  364. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  365. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +9 -11
  366. package/src/sap/ui/test/TestUtils.js +11 -4
  367. package/src/sap/ui/test/actions/Drag.js +6 -2
  368. package/src/sap/ui/test/actions/Drop.js +6 -2
  369. package/src/sap/ui/test/actions/EnterText.js +6 -0
  370. package/src/sap/ui/test/actions/Press.js +6 -0
  371. package/src/sap/ui/test/actions/Scroll.js +6 -0
  372. package/src/sap/ui/test/autowaiter/_resourceWaiter.js +4 -4
  373. package/src/sap/ui/test/launchers/componentLauncher.js +0 -4
  374. package/src/sap/ui/test/matchers/I18NText.js +29 -11
  375. package/src/sap/ui/test/opaQunit.js +5 -0
  376. package/src/sap/ui/thirdparty/crossroads.js +6 -4
  377. package/src/sap/ui/thirdparty/hyphenopoly/Hyphenopoly.js +1196 -0
  378. package/src/sap/ui/thirdparty/hyphenopoly/Hyphenopoly_Loader.js +797 -0
  379. package/src/sap/ui/thirdparty/hyphenopoly/hyphenEngine.asm.js +108 -127
  380. package/src/sap/ui/thirdparty/hyphenopoly/hyphenEngine.wasm +0 -0
  381. package/src/sap/ui/thirdparty/hyphenopoly/patterns/bg.hpb +0 -0
  382. package/src/sap/ui/thirdparty/hyphenopoly/patterns/ca.hpb +0 -0
  383. package/src/sap/ui/thirdparty/hyphenopoly/patterns/da.hpb +0 -0
  384. package/src/sap/ui/thirdparty/hyphenopoly/patterns/de.hpb +0 -0
  385. package/src/sap/ui/thirdparty/hyphenopoly/patterns/el-monoton.hpb +0 -0
  386. package/src/sap/ui/thirdparty/hyphenopoly/patterns/en-us.hpb +0 -0
  387. package/src/sap/ui/thirdparty/hyphenopoly/patterns/es.hpb +0 -0
  388. package/src/sap/ui/thirdparty/hyphenopoly/patterns/et.hpb +0 -0
  389. package/src/sap/ui/thirdparty/hyphenopoly/patterns/fi.hpb +0 -0
  390. package/src/sap/ui/thirdparty/hyphenopoly/patterns/fr.hpb +0 -0
  391. package/src/sap/ui/thirdparty/hyphenopoly/patterns/hi.hpb +0 -0
  392. package/src/sap/ui/thirdparty/hyphenopoly/patterns/hr.hpb +0 -0
  393. package/src/sap/ui/thirdparty/hyphenopoly/patterns/hu.hpb +0 -0
  394. package/src/sap/ui/thirdparty/hyphenopoly/patterns/it.hpb +0 -0
  395. package/src/sap/ui/thirdparty/hyphenopoly/patterns/lt.hpb +0 -0
  396. package/src/sap/ui/thirdparty/hyphenopoly/patterns/nb-no.hpb +0 -0
  397. package/src/sap/ui/thirdparty/hyphenopoly/patterns/nl.hpb +0 -0
  398. package/src/sap/ui/thirdparty/hyphenopoly/patterns/pt.hpb +0 -0
  399. package/src/sap/ui/thirdparty/hyphenopoly/patterns/ru.hpb +0 -0
  400. package/src/sap/ui/thirdparty/hyphenopoly/patterns/sl.hpb +0 -0
  401. package/src/sap/ui/thirdparty/hyphenopoly/patterns/sv.hpb +0 -0
  402. package/src/sap/ui/thirdparty/hyphenopoly/patterns/th.hpb +0 -0
  403. package/src/sap/ui/thirdparty/hyphenopoly/patterns/tr.hpb +0 -0
  404. package/src/sap/ui/thirdparty/hyphenopoly/patterns/uk.hpb +0 -0
  405. package/src/sap/ui/thirdparty/jquery.js +9 -1
  406. package/src/sap/ui/thirdparty/qunit-2.js +1 -1
  407. package/src/sap/ui/thirdparty/qunit.js +1 -1
  408. package/src/sap/ui/util/Mobile.js +2 -20
  409. package/src/sap/ui/util/Storage.js +1 -1
  410. package/src/sap/ui/util/isCrossOriginURL.js +16 -6
  411. package/src/sap-ui-core-nojQuery.js +1 -1
  412. package/src/sap-ui-core.js +1 -1
  413. package/src/sap-ui-debug.js +3 -17
  414. package/ui5.yaml +5 -2
  415. package/src/sap/ui/core/support/plugins/MessageTest.js +0 -96
  416. package/src/sap/ui/thirdparty/hyphenopoly/hyphenopoly.bundle.js +0 -860
@@ -652,11 +652,13 @@ sap.ui.define([
652
652
  *
653
653
  * This model is read-only.
654
654
  *
655
+ * This model is not prepared to be inherited from.
656
+ *
655
657
  * @extends sap.ui.model.MetaModel
656
658
  * @hideconstructor
657
659
  * @public
658
660
  * @since 1.37.0
659
- * @version 1.93.3
661
+ * @version 1.96.2
660
662
  */
661
663
  var ODataMetaModel = MetaModel.extend("sap.ui.model.odata.v4.ODataMetaModel", {
662
664
  /*
@@ -1289,7 +1291,7 @@ sap.ui.define([
1289
1291
  * Whether to continue after this step
1290
1292
  */
1291
1293
  function step(sSegment, i, aSegments) {
1292
- var iIndexOfAt, bSplitSegment;
1294
+ var iIndexOfAt, bResultIsObject, bSplitSegment;
1293
1295
 
1294
1296
  if (sSegment === "$Annotations") {
1295
1297
  return log(WARNING, "Invalid segment: $Annotations");
@@ -1328,8 +1330,9 @@ sap.ui.define([
1328
1330
 
1329
1331
  if (typeof vResult === "string"
1330
1332
  && !(bSplitSegment && (sSegment === "@sapui.name" || sSegment[1] === "@"))
1333
+ && !(bODataMode && oSchemaChild && oSchemaChild.$kind === "EnumType")
1331
1334
  // indirection: treat string content as a meta model path unless followed by
1332
- // a computed annotation
1335
+ // a computed annotation or if it is an (Edm.Int64) enum member value
1333
1336
  && !steps(vResult, aSegments.slice(0, i))) {
1334
1337
  return false;
1335
1338
  }
@@ -1341,23 +1344,24 @@ sap.ui.define([
1341
1344
  // technical property, switch to pure "JSON" drill-down
1342
1345
  bODataMode = false;
1343
1346
  } else {
1347
+ bResultIsObject = typeof vResult === "object";
1344
1348
  if (bSplitSegment) {
1345
1349
  // no special preparations needed, but handle overloads below!
1346
1350
  } else if (sSegment[0] !== "@" && sSegment.includes(".", 1)) {
1347
1351
  // "17.3 QualifiedName": scope lookup
1348
1352
  return scopeLookup(sSegment);
1349
- } else if (vResult && "$Type" in vResult) {
1353
+ } else if (bResultIsObject && "$Type" in vResult) {
1350
1354
  // implicit $Type insertion, e.g. at (navigation) property
1351
1355
  if (!scopeLookup(vResult.$Type, "$Type")) {
1352
1356
  return false;
1353
1357
  }
1354
- } else if (vResult && "$Action" in vResult) {
1358
+ } else if (bResultIsObject && "$Action" in vResult) {
1355
1359
  // implicit $Action insertion at action import
1356
1360
  if (!scopeLookup(vResult.$Action, "$Action")) {
1357
1361
  return false;
1358
1362
  }
1359
1363
  vBindingParameterType = UNBOUND;
1360
- } else if (vResult && "$Function" in vResult) {
1364
+ } else if (bResultIsObject && "$Function" in vResult) {
1361
1365
  // implicit $Function insertion at function import
1362
1366
  if (!scopeLookup(vResult.$Function, "$Function")) {
1363
1367
  return false;
@@ -1462,19 +1466,18 @@ sap.ui.define([
1462
1466
  aSegments[i].slice(0, iIndexOfAt)).join("/"));
1463
1467
  }
1464
1468
  }
1465
- if (!vResult || typeof vResult !== "object") {
1466
- // Note: even an OData path cannot continue here (e.g. by type cast)
1467
- vResult = undefined;
1468
- return !bInsideAnnotation && log(DEBUG, "Invalid segment: ", sSegment);
1469
- }
1470
1469
  if (bODataMode && sSegment[0] === "@") { // annotation(s) via external targeting
1471
1470
  // Note: inline annotations are reached via above fast path for pure "JSON"
1472
1471
  // drill-down
1473
- vBindingParameterType = vResult.$Type || vBindingParameterType;
1472
+ vBindingParameterType = vResult && vResult.$Type || vBindingParameterType;
1474
1473
  vResult = mScope.$Annotations[sTarget] || {};
1475
1474
  bODataMode = false; // switch to pure "JSON" drill-down
1476
1475
  } else if (sSegment === "$" && i + 1 < aSegments.length) {
1477
1476
  return log(WARNING, "Unsupported path after $");
1477
+ } else if (!vResult || typeof vResult !== "object") {
1478
+ // Note: even an OData path cannot continue here (e.g. by type cast)
1479
+ vResult = undefined;
1480
+ return !bInsideAnnotation && log(DEBUG, "Invalid segment: ", sSegment);
1478
1481
  }
1479
1482
  }
1480
1483
 
@@ -1660,7 +1663,7 @@ sap.ui.define([
1660
1663
 
1661
1664
  // First fetch the complete metapath to ensure that everything is in mScope
1662
1665
  // This also ensures that the metadata is valid
1663
- return this.fetchObject(this.getMetaPath(sResolvedPath)).then(function () {
1666
+ return this.fetchObject(_Helper.getMetaPath(sResolvedPath)).then(function () {
1664
1667
  // Then fetch mScope
1665
1668
  return that.fetchEntityContainer();
1666
1669
  }).then(function (mScope) {
@@ -2078,7 +2081,8 @@ sap.ui.define([
2078
2081
  && aSegments0[i + 1] === "$Parameter") {
2079
2082
  // Filter via the binding parameter
2080
2083
  aOverloadMetadata = that.getObject(
2081
- that.getMetaPath(aSegments0.slice(0, i + 1).join("/") + "/@$ui5.overload")
2084
+ _Helper.getMetaPath(aSegments0.slice(0, i + 1).join("/")
2085
+ + "/@$ui5.overload")
2082
2086
  );
2083
2087
  // Note: This must be a bound operation with a binding parameter; otherwise it
2084
2088
  // would be in the first segment and the loop would not touch it due to
@@ -2097,7 +2101,7 @@ sap.ui.define([
2097
2101
  return j < iBasePathLength || sSegment[0] === "#" || sSegment[0] === "@"
2098
2102
  || rNumber.test(sSegment) || sSegment === "$Parameter"
2099
2103
  ? {} // simply an object w/o $Partner and $isCollection
2100
- : that.getObject(that.getMetaPath(aSegments.slice(0, j + 1).join("/"))) || {};
2104
+ : that.getObject(_Helper.getMetaPath(aSegments.slice(0, j + 1).join("/"))) || {};
2101
2105
  });
2102
2106
  mPaths[sPath] = true;
2103
2107
  if (!(bNoReduceBeforeCollection
@@ -2226,7 +2230,7 @@ sap.ui.define([
2226
2230
  * @since 1.37.0
2227
2231
  */
2228
2232
  ODataMetaModel.prototype.getMetaContext = function (sPath) {
2229
- return new BaseContext(this, this.getMetaPath(sPath));
2233
+ return new BaseContext(this, _Helper.getMetaPath(sPath));
2230
2234
  };
2231
2235
 
2232
2236
  /**
@@ -3082,7 +3086,8 @@ sap.ui.define([
3082
3086
  * instead, see {@link sap.ui.model.odata.v4.ODataModel#bindList}.
3083
3087
  *
3084
3088
  * For fixed values, only one mapping is expected and the qualifier is ignored. The mapping
3085
- * is available with key "".
3089
+ * is available with key "" and has an additional property "$qualifier" which is the original
3090
+ * qualifier (useful in case of "ValueListRelevantQualifiers" annotation).
3086
3091
  *
3087
3092
  * The promise is rejected with an error if there is no value list information available
3088
3093
  * for the given property path. Use {@link #getValueListType} to determine if value list
@@ -3110,7 +3115,7 @@ sap.ui.define([
3110
3115
  */
3111
3116
  ODataMetaModel.prototype.requestValueListInfo = function (sPropertyPath, bAutoExpandSelect,
3112
3117
  oContext) {
3113
- var sPropertyMetaPath = this.getMetaPath(sPropertyPath),
3118
+ var sPropertyMetaPath = _Helper.getMetaPath(sPropertyPath),
3114
3119
  sParentMetaPath = sPropertyMetaPath.slice(0, sPropertyMetaPath.lastIndexOf("/"))
3115
3120
  .replace("/$Parameter", ""),
3116
3121
  sQualifiedName = sParentMetaPath.slice(sParentMetaPath.lastIndexOf("/") + 1),
@@ -3210,7 +3215,7 @@ sap.ui.define([
3210
3215
  });
3211
3216
  });
3212
3217
  })).then(function () {
3213
- var aQualifiers;
3218
+ var aRelevantQualifiers = mAnnotationByTerm[sValueListRelevantQualifiers];
3214
3219
 
3215
3220
  // add all mappings in the data service (or local annotation files)
3216
3221
  Object.keys(mAnnotationByTerm).filter(function (sTerm) {
@@ -3219,28 +3224,36 @@ sap.ui.define([
3219
3224
  addMapping(mAnnotationByTerm[sTerm], getValueListQualifier(sTerm), that.sUrl,
3220
3225
  that.oModel);
3221
3226
  });
3222
- aQualifiers = Object.keys(oValueListInfo);
3223
3227
 
3224
3228
  // Each reference must have contributed at least one qualifier. So if oValueListInfo
3225
3229
  // is empty, there cannot have been a reference.
3226
- if (!aQualifiers.length) {
3230
+ if (isEmptyObject(oValueListInfo)) {
3227
3231
  throw new Error("No annotation '" + sValueListReferences.slice(1) + "' for " +
3228
3232
  sPropertyPath);
3229
3233
  }
3234
+
3235
+ return aRelevantQualifiers && oContext && oContext.getBinding
3236
+ ? that.filterValueListRelevantQualifiers(oValueListInfo, aRelevantQualifiers,
3237
+ sPropertyMetaPath + sValueListRelevantQualifiers, oContext)
3238
+ : oValueListInfo;
3239
+ }).then(function (mValueListByRelevantQualifier) {
3240
+ var aQualifiers, mValueListMapping;
3241
+
3230
3242
  if (bFixedValues) {
3231
- // With fixed values, only one mapping may exist. Return it for qualifier "".
3232
- if (aQualifiers.length > 1) {
3243
+ aQualifiers = Object.keys(mValueListByRelevantQualifier);
3244
+ // With fixed values, only one mapping should exist. Return it for qualifier "".
3245
+ if (aQualifiers.length !== 1) {
3233
3246
  throw new Error("Annotation '" + sValueListWithFixedValues.slice(1)
3234
- + "' but multiple '" + sValueList.slice(1)
3247
+ + "' but not exactly one '" + sValueList.slice(1)
3235
3248
  + "' for property " + sPropertyPath);
3236
3249
  }
3237
- return {"" : oValueListInfo[aQualifiers[0]]};
3250
+ mValueListMapping = mValueListByRelevantQualifier[aQualifiers[0]];
3251
+ mValueListMapping.$qualifier = aQualifiers[0];
3252
+
3253
+ return {"" : mValueListMapping};
3238
3254
  }
3239
- aQualifiers = mAnnotationByTerm[sValueListRelevantQualifiers];
3240
- return aQualifiers && oContext && oContext.getBinding
3241
- ? that.filterValueListRelevantQualifiers(oValueListInfo, aQualifiers,
3242
- sPropertyMetaPath + sValueListRelevantQualifiers, oContext)
3243
- : oValueListInfo;
3255
+
3256
+ return mValueListByRelevantQualifier;
3244
3257
  });
3245
3258
  });
3246
3259
  };
@@ -3440,4 +3453,4 @@ sap.ui.define([
3440
3453
  };
3441
3454
 
3442
3455
  return ODataMetaModel;
3443
- });
3456
+ });
@@ -175,6 +175,8 @@ sap.ui.define([
175
175
  * @author SAP SE
176
176
  * @class Model implementation for OData V4.
177
177
  *
178
+ * This model is not prepared to be inherited from.
179
+ *
178
180
  * Every resource path (relative to the service root URL, no query options) according to
179
181
  * "4 Resource Path" in specification "OData Version 4.0 Part 2: URL Conventions" is
180
182
  * a valid data binding path within this model if a leading slash is added; for example
@@ -208,7 +210,7 @@ sap.ui.define([
208
210
  * @extends sap.ui.model.Model
209
211
  * @public
210
212
  * @since 1.37.0
211
- * @version 1.93.3
213
+ * @version 1.96.2
212
214
  */
213
215
  var ODataModel = Model.extend("sap.ui.model.odata.v4.ODataModel",
214
216
  /** @lends sap.ui.model.odata.v4.ODataModel.prototype */
@@ -221,6 +223,7 @@ sap.ui.define([
221
223
  sParameter,
222
224
  sServiceUrl,
223
225
  oUri,
226
+ mUriParameters,
224
227
  that = this;
225
228
 
226
229
  // do not pass any parameters to Model
@@ -255,7 +258,13 @@ sap.ui.define([
255
258
  }
256
259
  this.sOperationMode = mParameters.operationMode;
257
260
  // Note: strict checking for model's URI parameters, but "sap-*" is allowed
258
- this.mUriParameters = this.buildQueryOptions(oUri.query(true), false, true);
261
+ mUriParameters = this.buildQueryOptions(oUri.query(true), false, true);
262
+ // BEWARE: these are shared across all bindings!
263
+ this.mUriParameters = mUriParameters;
264
+ if (sap.ui.getCore().getConfiguration().getStatistics()) {
265
+ // Note: this way, "sap-statistics" is not sent within $batch
266
+ mUriParameters = Object.assign({"sap-statistics" : true}, mUriParameters);
267
+ }
259
268
  this.sServiceUrl = oUri.query("").toString();
260
269
  this.sGroupId = mParameters.groupId;
261
270
  if (this.sGroupId === undefined) {
@@ -297,7 +306,7 @@ sap.ui.define([
297
306
  // BEWARE: do not share mHeaders between _MetadataRequestor and _Requestor!
298
307
  this.oMetaModel = new ODataMetaModel(
299
308
  _MetadataRequestor.create(this.mMetadataHeaders, sODataVersion,
300
- Object.assign({}, this.mUriParameters, mParameters.metadataUrlParams)),
309
+ Object.assign({}, mUriParameters, mParameters.metadataUrlParams)),
301
310
  this.sServiceUrl + "$metadata", mParameters.annotationURI, this,
302
311
  mParameters.supportReferences);
303
312
  this.oInterface = {
@@ -314,11 +323,11 @@ sap.ui.define([
314
323
  that._submitBatch.bind(that, sGroupId, true));
315
324
  }
316
325
  },
317
- reportBoundMessages : this.reportBoundMessages.bind(this),
318
- reportUnboundMessages : this.reportUnboundMessages.bind(this)
326
+ reportStateMessages : this.reportStateMessages.bind(this),
327
+ reportTransitionMessages : this.reportTransitionMessages.bind(this)
319
328
  };
320
329
  this.oRequestor = _Requestor.create(this.sServiceUrl, this.oInterface,
321
- this.mHeaders, this.mUriParameters, sODataVersion);
330
+ this.mHeaders, mUriParameters, sODataVersion);
322
331
  this.changeHttpHeaders(mParameters.httpHeaders);
323
332
  if (mParameters.earlyRequests) {
324
333
  this.oMetaModel.fetchEntityContainer(true);
@@ -531,8 +540,8 @@ sap.ui.define([
531
540
  * @param {boolean} [mParameters.$$inheritExpandSelect]
532
541
  * For operation bindings only: Whether $expand and $select from the parent binding are used
533
542
  * in the request sent on {@link #execute}. If set to <code>true</code>, the binding must not
534
- * set the $expand or $select parameter itself, the operation must be bound, and the return
535
- * value and the binding parameter must belong to the same entity set.
543
+ * set the $expand itself, the operation must be bound, and the return value and the binding
544
+ * parameter must belong to the same entity set.
536
545
  * @param {boolean} [mParameters.$$ownRequest]
537
546
  * Whether the binding always uses an own service request to read its data; only the value
538
547
  * <code>true</code> is allowed.
@@ -552,7 +561,7 @@ sap.ui.define([
552
561
  * @throws {Error}
553
562
  * If disallowed binding parameters are provided, for example if the binding parameter
554
563
  * $$inheritExpandSelect is set to <code>true</code> and the binding is no operation binding
555
- * or the binding has one of the parameters $expand or $select.
564
+ * or the binding has the parameter $expand.
556
565
  *
557
566
  * @public
558
567
  * @see sap.ui.model.Model#bindContext
@@ -599,7 +608,7 @@ sap.ui.define([
599
608
  * resolve to an absolute OData path for an entity set.
600
609
  *
601
610
  * @param {string} sPath
602
- * The binding path in the model; must not be empty or end with a slash
611
+ * The binding path in the model; must not end with a slash
603
612
  * @param {sap.ui.model.Context} [oContext]
604
613
  * The context which is required as base for a relative path
605
614
  * @param {sap.ui.model.Sorter|sap.ui.model.Sorter[]} [vSorters]
@@ -717,8 +726,7 @@ sap.ui.define([
717
726
  * transformed into a metadata context (see
718
727
  * {@link sap.ui.model.odata.v4.ODataMetaModel#getMetaContext}). The part following the
719
728
  * separator is then interpreted relative to this metadata context, even if it starts with
720
- * a '/'; a trailing '/' is allowed here, see
721
- * {@link sap.ui.model.odata.v4.ODataMetaModel#requestObject} for the effect it has.
729
+ * a '/'; see {@link sap.ui.model.odata.v4.ODataMetaModel#requestObject} for more details.
722
730
  *
723
731
  * If the target type specified in the corresponding control property's binding info is "any"
724
732
  * and the binding is relative or points to metadata, the binding may have an object value;
@@ -726,15 +734,20 @@ sap.ui.define([
726
734
  * be {@link sap.ui.model.BindingMode.OneTime}.
727
735
  *
728
736
  * @param {string} sPath
729
- * The binding path in the model; must not be empty. Must not end with a '/' unless the
730
- * binding points to metadata.
737
+ * The binding path in the model; must not end with a slash
731
738
  * @param {sap.ui.model.Context} [oContext]
732
739
  * The context which is required as base for a relative path
733
740
  * @param {object} [mParameters]
734
741
  * Map of binding parameters which can be OData query options as specified in
735
- * "OData Version 4.0 Part 2: URL Conventions" or the binding-specific parameter "$$groupId".
736
- * All "5.2 Custom Query Options" are allowed except for those with a name starting with
737
- * "sap-" (unless starting with "sap-valid-"). All other query options lead to an error.
742
+ * "OData Version 4.0 Part 2: URL Conventions" or the binding-specific parameters as specified
743
+ * below. The following OData query options are allowed:
744
+ * <ul>
745
+ * <li> All "5.2 Custom Query Options" except for those with a name starting with "sap-"
746
+ * (unless starting with "sap-valid-")
747
+ * <li> The $apply, $filter, and $search "5.1 System Query Options" if the path ends with a
748
+ * "$count" segment.
749
+ * </ul>
750
+ * All other query options lead to an error.
738
751
  * Query options specified for the binding overwrite model query options.
739
752
  * Note: The binding only creates its own data service request if it is absolute or if it is
740
753
  * relative to a context created via {@link #createBindingContext}. The binding parameters are
@@ -1183,6 +1196,7 @@ sap.ui.define([
1183
1196
  }
1184
1197
 
1185
1198
  if (bIsBound) {
1199
+ sResourcePath = sResourcePath && sResourcePath.split("?")[0]; // remove query string
1186
1200
  aTargets = [resolveTarget(oRawMessage.target)];
1187
1201
  if (oRawMessage.additionalTargets) {
1188
1202
  oRawMessage.additionalTargets.forEach(function (sTarget) {
@@ -1199,7 +1213,7 @@ sap.ui.define([
1199
1213
  code : oRawMessage.code,
1200
1214
  descriptionUrl : sMessageLongtextUrl || undefined,
1201
1215
  message : oRawMessage.message,
1202
- persistent : bIsBound ? oRawMessage.transition : true,
1216
+ persistent : !bIsBound || oRawMessage.transition,
1203
1217
  processor : this,
1204
1218
  // Note: "" instead of undefined makes filtering easier (agreement with FE!)
1205
1219
  target : bIsBound ? aTargets : "",
@@ -1658,53 +1672,6 @@ sap.ui.define([
1658
1672
  });
1659
1673
  };
1660
1674
 
1661
- /**
1662
- * Reports the given bound OData messages by firing a <code>messageChange</code> event with
1663
- * the new messages.
1664
- *
1665
- * @param {string} sResourcePath
1666
- * The resource path of the cache that saw the messages; used to resolve the targets and
1667
- * the longtext URL
1668
- * @param {object} mPathToODataMessages
1669
- * Maps a cache-relative path with key predicates or indices to an array of messages suitable
1670
- * for {@link #createUI5Message}
1671
- * @param {string[]} [aCachePaths]
1672
- * An array of cache-relative paths of the entities for which non-persistent messages have to
1673
- * be removed; if the array is not given, all entities are affected
1674
- *
1675
- * @private
1676
- */
1677
- ODataModel.prototype.reportBoundMessages = function (sResourcePath, mPathToODataMessages,
1678
- aCachePaths) {
1679
- var sDataBindingPath = "/" + sResourcePath,
1680
- aNewMessages = [],
1681
- aOldMessages = [],
1682
- that = this;
1683
-
1684
- Object.keys(mPathToODataMessages).forEach(function (sCachePath) {
1685
- mPathToODataMessages[sCachePath].forEach(function (oRawMessage) {
1686
- aNewMessages.push(that.createUI5Message(oRawMessage, sResourcePath, sCachePath));
1687
- });
1688
- });
1689
- (aCachePaths || [""]).forEach(function (sCachePath) {
1690
- var sPath = _Helper.buildPath(sDataBindingPath, sCachePath);
1691
-
1692
- Object.keys(that.mMessages).forEach(function (sMessageTarget) {
1693
- if (sMessageTarget === sPath
1694
- || sMessageTarget.startsWith(sPath + "/")
1695
- || sMessageTarget.startsWith(sPath + "(")) {
1696
- aOldMessages = aOldMessages.concat(
1697
- that.mMessages[sMessageTarget].filter(function (oMessage) {
1698
- return !oMessage.persistent;
1699
- }));
1700
- }
1701
- });
1702
- });
1703
- if (aNewMessages.length || aOldMessages.length) {
1704
- this.fireMessageChange({newMessages : aNewMessages, oldMessages : aOldMessages});
1705
- }
1706
- };
1707
-
1708
1675
  /**
1709
1676
  * Reports a technical error by firing a <code>messageChange</code> event with a new message and
1710
1677
  * logging the error to the console. Takes care that the error is only reported once via the
@@ -1737,8 +1704,7 @@ sap.ui.define([
1737
1704
  * @private
1738
1705
  */
1739
1706
  ODataModel.prototype.reportError = function (sLogMessage, sReportingClassName, oError) {
1740
- var sDetails,
1741
- oRawMessages;
1707
+ var sDetails;
1742
1708
 
1743
1709
  if (oError.canceled === "noDebugLog") {
1744
1710
  return;
@@ -1759,20 +1725,61 @@ sap.ui.define([
1759
1725
  }
1760
1726
  oError.$reported = true;
1761
1727
 
1762
- oRawMessages = _Helper.extractMessages(oError);
1763
- if (oRawMessages.bound.length) {
1764
- this.reportBoundMessages(
1765
- oError.resourcePath.split("?")[0],
1766
- {"" : oRawMessages.bound},
1767
- []
1768
- );
1728
+ this.reportTransitionMessages(_Helper.extractMessages(oError), oError.resourcePath);
1729
+ };
1730
+
1731
+ /**
1732
+ * Reports the given OData state messages by firing a <code>messageChange</code> event with
1733
+ * the new messages.
1734
+ *
1735
+ * Note that this method may also report transition messages that have been transported via the
1736
+ * messages property of an entity.
1737
+ *
1738
+ * @param {string} sResourcePath
1739
+ * The resource path of the cache that saw the messages; used to resolve the targets and
1740
+ * the longtext URL
1741
+ * @param {object} mPathToODataMessages
1742
+ * Maps a cache-relative path with key predicates or indices to an array of messages suitable
1743
+ * for {@link #createUI5Message}
1744
+ * @param {string[]} [aCachePaths]
1745
+ * An array of cache-relative paths of the entities for which non-persistent messages have to
1746
+ * be removed; if the array is not given, all entities are affected
1747
+ *
1748
+ * @private
1749
+ */
1750
+ ODataModel.prototype.reportStateMessages = function (sResourcePath, mPathToODataMessages,
1751
+ aCachePaths) {
1752
+ var sDataBindingPath = "/" + sResourcePath,
1753
+ aNewMessages = [],
1754
+ aOldMessages = [],
1755
+ that = this;
1756
+
1757
+ Object.keys(mPathToODataMessages).forEach(function (sCachePath) {
1758
+ mPathToODataMessages[sCachePath].forEach(function (oRawMessage) {
1759
+ aNewMessages.push(that.createUI5Message(oRawMessage, sResourcePath, sCachePath));
1760
+ });
1761
+ });
1762
+ (aCachePaths || [""]).forEach(function (sCachePath) {
1763
+ var sPath = _Helper.buildPath(sDataBindingPath, sCachePath);
1764
+
1765
+ Object.keys(that.mMessages).forEach(function (sMessageTarget) {
1766
+ if (sMessageTarget === sPath
1767
+ || sMessageTarget.startsWith(sPath + "/")
1768
+ || sMessageTarget.startsWith(sPath + "(")) {
1769
+ aOldMessages = aOldMessages.concat(
1770
+ that.mMessages[sMessageTarget].filter(function (oMessage) {
1771
+ return !oMessage.persistent;
1772
+ }));
1773
+ }
1774
+ });
1775
+ });
1776
+ if (aNewMessages.length || aOldMessages.length) {
1777
+ this.fireMessageChange({newMessages : aNewMessages, oldMessages : aOldMessages});
1769
1778
  }
1770
- // The longtextUrls are already absolute, so sResourcePath is not needed here
1771
- this.reportUnboundMessages(oRawMessages.unbound);
1772
1779
  };
1773
1780
 
1774
1781
  /**
1775
- * Reports the given unbound OData messages by firing a <code>messageChange</code> event with
1782
+ * Reports the given OData transition messages by firing a <code>messageChange</code> event with
1776
1783
  * the new messages.
1777
1784
  *
1778
1785
  * @param {object[]} aMessages
@@ -1782,12 +1789,13 @@ sap.ui.define([
1782
1789
  *
1783
1790
  * @private
1784
1791
  */
1785
- ODataModel.prototype.reportUnboundMessages = function (aMessages, sResourcePath) {
1792
+ ODataModel.prototype.reportTransitionMessages = function (aMessages, sResourcePath) {
1786
1793
  var that = this;
1787
1794
 
1788
1795
  if (aMessages && aMessages.length) {
1789
1796
  this.fireMessageChange({
1790
1797
  newMessages : aMessages.map(function (oMessage) {
1798
+ oMessage.transition = true;
1791
1799
  return that.createUI5Message(oMessage, sResourcePath);
1792
1800
  })
1793
1801
  });
@@ -93,6 +93,15 @@ sap.ui.define([
93
93
  * @private
94
94
  */
95
95
 
96
+ /**
97
+ * Binding specific code for suspend.
98
+ *
99
+ * @private
100
+ */
101
+ ODataParentBinding.prototype.doSuspend = function () {
102
+ // nothing to do here
103
+ };
104
+
96
105
  /**
97
106
  * Fire event 'patchCompleted' to attached listeners, if the last PATCH request is completed.
98
107
  *
@@ -425,7 +434,7 @@ sap.ui.define([
425
434
  return this.oCachePromise.then(function (oCache) {
426
435
  if (oCache && that.bRelative) {
427
436
  return that.fetchResourcePath(that.oContext).then(function (sResourcePath) {
428
- if (oCache.$resourcePath === sResourcePath) {
437
+ if (oCache.getResourcePath() === sResourcePath) {
429
438
  return updateDependents();
430
439
  }
431
440
  return that.refreshInternal(""); // entity of context changed
@@ -472,10 +481,10 @@ sap.ui.define([
472
481
  return oCache.create(oUpdateGroupLock, vCreatePath, sPathInCache,
473
482
  sTransientPredicate, oInitialData, fnErrorCallback, fnSubmitCallback
474
483
  ).then(function (oCreatedEntity) {
475
- if (oCache.$resourcePath) {
484
+ if (that.mCacheByResourcePath) {
476
485
  // Ensure that cache containing non-transient created entity is recreated
477
486
  // when the parent binding changes to another row and back again.
478
- delete that.mCacheByResourcePath[oCache.$resourcePath];
487
+ delete that.mCacheByResourcePath[oCache.getResourcePath()];
479
488
  }
480
489
  return oCreatedEntity;
481
490
  });
@@ -644,17 +653,16 @@ sap.ui.define([
644
653
  // getBaseForPathReduction must be called early, because the (virtual) parent context may be
645
654
  // lost again when the path is needed
646
655
  var sBaseForPathReduction = this.getBaseForPathReduction(),
647
- sBaseMetaPath,
656
+ sBaseMetaPath = _Helper.getMetaPath(oContext.getPath()),
648
657
  bCacheImmutable,
649
658
  oCanUseCachePromise,
650
- sFullMetaPath,
659
+ // whether this binding is an operation or depends on one
660
+ bDependsOnOperation = oContext.getPath().includes("(...)"),
651
661
  iIndex = oContext.getIndex(),
652
662
  bIsAdvertisement = sChildPath[0] === "#",
653
663
  oMetaModel = this.oModel.getMetaModel(),
654
664
  aPromises,
655
665
  sResolvedChildPath = this.oModel.resolve(sChildPath, oContext),
656
- // whether this binding is an operation or depends on one
657
- bDependsOnOperation = oContext.getPath().includes("(...)"),
658
666
  that = this;
659
667
 
660
668
  /*
@@ -668,12 +676,27 @@ sap.ui.define([
668
676
  if (bIsAdvertisement) {
669
677
  // Ensure entity type metadata is loaded even for advertisement so that sync access
670
678
  // to key properties is possible
671
- return oMetaModel.fetchObject(sFullMetaPath.slice(0,
672
- sFullMetaPath.lastIndexOf("/") + 1));
679
+ return oMetaModel.fetchObject(sBaseMetaPath + "/");
673
680
  }
674
681
 
675
682
  return _Helper.fetchPropertyAndType(that.oModel.oInterface.fetchMetadata,
676
- sFullMetaPath);
683
+ getStrippedMetaPath(sResolvedChildPath));
684
+ }
685
+
686
+ /*
687
+ * Returns the meta path corresponding to the given path, with its annotation part stripped
688
+ * off.
689
+ *
690
+ * @param {string} sPath - A path
691
+ * @returns {string} The meta path with its annotation part stripped off
692
+ */
693
+ function getStrippedMetaPath(sPath) {
694
+ var iIndex;
695
+
696
+ sPath = _Helper.getMetaPath(sPath);
697
+ iIndex = sPath.indexOf("@"); // Note: sPath[0] !== "@"
698
+
699
+ return iIndex > 0 ? sPath.slice(0, iIndex) : sPath;
677
700
  }
678
701
 
679
702
  if (bDependsOnOperation && !sResolvedChildPath.includes("/$Parameter/")
@@ -692,8 +715,6 @@ sap.ui.define([
692
715
  || oContext.isKeepAlive() // kept-alive contexts have no index when not in aContexts
693
716
  || this.oCache === null
694
717
  || this.oCache && this.oCache.hasSentRequest();
695
- sBaseMetaPath = oMetaModel.getMetaPath(oContext.getPath());
696
- sFullMetaPath = oMetaModel.getMetaPath(sResolvedChildPath);
697
718
  aPromises = [
698
719
  this.doFetchQueryOptions(this.oContext),
699
720
  // After access to complete meta path of property, the metadata of all prefix paths
@@ -703,11 +724,11 @@ sap.ui.define([
703
724
  vChildQueryOptions
704
725
  ];
705
726
  oCanUseCachePromise = SyncPromise.all(aPromises).then(function (aResult) {
706
- var sChildMetaPath,
707
- mChildQueryOptions = aResult[2],
727
+ var mChildQueryOptions = aResult[2],
708
728
  mWrappedChildQueryOptions,
709
729
  mLocalQueryOptions = aResult[0],
710
730
  oProperty = aResult[1],
731
+ sReducedChildMetaPath,
711
732
  sReducedPath;
712
733
 
713
734
  if (Array.isArray(oProperty)) { // Arrays are only used for functions and actions
@@ -716,15 +737,10 @@ sap.ui.define([
716
737
  }
717
738
 
718
739
  sReducedPath = oMetaModel.getReducedPath(sResolvedChildPath, sBaseForPathReduction);
719
-
720
- if (sChildPath === "$count" || sChildPath.endsWith("/$count")
721
- || sChildPath[0] === "@") {
722
- return sReducedPath;
723
- }
724
-
725
- sChildMetaPath = _Helper.getRelativePath(_Helper.getMetaPath(sReducedPath),
740
+ sReducedChildMetaPath = _Helper.getRelativePath(getStrippedMetaPath(sReducedPath),
726
741
  sBaseMetaPath);
727
- if (sChildMetaPath === undefined) {
742
+
743
+ if (sReducedChildMetaPath === undefined) {
728
744
  // the child's data does not fit into this bindings's cache, try the parent
729
745
  that.bHasPathReductionToParent = true;
730
746
  return that.oContext.getBinding().fetchIfChildCanUseCache(that.oContext,
@@ -732,7 +748,8 @@ sap.ui.define([
732
748
  vChildQueryOptions);
733
749
  }
734
750
 
735
- if (bDependsOnOperation) {
751
+ if (bDependsOnOperation || sReducedChildMetaPath === "$count"
752
+ || sReducedChildMetaPath.endsWith("/$count")) {
736
753
  return sReducedPath;
737
754
  }
738
755
 
@@ -742,17 +759,18 @@ sap.ui.define([
742
759
  that.bAggregatedQueryOptionsInitial = false;
743
760
  }
744
761
  if (bIsAdvertisement) {
745
- mWrappedChildQueryOptions = {"$select" : [sChildMetaPath.slice(1)]};
762
+ mWrappedChildQueryOptions = {"$select" : [sReducedChildMetaPath.slice(1)]};
746
763
  return that.aggregateQueryOptions(mWrappedChildQueryOptions, sBaseMetaPath,
747
764
  bCacheImmutable)
748
765
  ? sReducedPath
749
766
  : undefined;
750
767
  }
751
- if (sChildMetaPath === ""
768
+ if (sReducedChildMetaPath === ""
752
769
  || oProperty
753
770
  && (oProperty.$kind === "Property" || oProperty.$kind === "NavigationProperty")) {
754
771
  mWrappedChildQueryOptions = _Helper.wrapChildQueryOptions(sBaseMetaPath,
755
- sChildMetaPath, mChildQueryOptions, that.oModel.oInterface.fetchMetadata);
772
+ sReducedChildMetaPath, mChildQueryOptions,
773
+ that.oModel.oInterface.fetchMetadata);
756
774
  if (mWrappedChildQueryOptions) {
757
775
  return that.aggregateQueryOptions(mWrappedChildQueryOptions, sBaseMetaPath,
758
776
  bCacheImmutable)
@@ -761,14 +779,14 @@ sap.ui.define([
761
779
  }
762
780
  return undefined;
763
781
  }
764
- if (sChildMetaPath === "value") { // symbolic name for operation result
782
+ if (sReducedChildMetaPath === "value") { // symbolic name for operation result
765
783
  return that.aggregateQueryOptions(mChildQueryOptions, sBaseMetaPath,
766
784
  bCacheImmutable)
767
785
  ? sReducedPath
768
786
  : undefined;
769
787
  }
770
788
  Log.error("Failed to enhance query options for auto-$expand/$select as the path '"
771
- + sFullMetaPath + "' does not point to a property",
789
+ + sResolvedChildPath + "' does not point to a property",
772
790
  JSON.stringify(oProperty), sClassName);
773
791
  return undefined;
774
792
  }).then(function (sReducedPath) {
@@ -1348,6 +1366,7 @@ sap.ui.define([
1348
1366
  });
1349
1367
  this.oResumePromise.$resolve = fnResolve;
1350
1368
  this.removeReadGroupLock();
1369
+ this.doSuspend();
1351
1370
  };
1352
1371
 
1353
1372
  /**