@openui5/sap.ui.core 1.92.0 → 1.95.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 (394) hide show
  1. package/{.eslintrc → .eslintrc.json} +1 -2
  2. package/.reuse/dep5 +1 -6
  3. package/THIRDPARTY.txt +4 -10
  4. package/package.json +1 -1
  5. package/src/jquery.sap.global.js +9 -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 +7 -4
  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 +8 -4
  13. package/src/sap/base/strings/whitespaceReplacer.js +52 -0
  14. package/src/sap/base/util/Properties.js +4 -1
  15. package/src/sap/base/util/isEmptyObject.js +1 -2
  16. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  17. package/src/sap/base/util/restricted/_castArray.js +1 -1
  18. package/src/sap/base/util/restricted/_compact.js +1 -1
  19. package/src/sap/base/util/restricted/_curry.js +1 -1
  20. package/src/sap/base/util/restricted/_debounce.js +1 -1
  21. package/src/sap/base/util/restricted/_difference.js +1 -1
  22. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  23. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  24. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  25. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  26. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  27. package/src/sap/base/util/restricted/_flatten.js +1 -1
  28. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  29. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  30. package/src/sap/base/util/restricted/_intersection.js +1 -1
  31. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  32. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  33. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  34. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  35. package/src/sap/base/util/restricted/_isNil.js +1 -1
  36. package/src/sap/base/util/restricted/_max.js +1 -1
  37. package/src/sap/base/util/restricted/_merge.js +1 -1
  38. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  39. package/src/sap/base/util/restricted/_min.js +1 -1
  40. package/src/sap/base/util/restricted/_omit.js +1 -1
  41. package/src/sap/base/util/restricted/_pick.js +1 -1
  42. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  43. package/src/sap/base/util/restricted/_throttle.js +1 -1
  44. package/src/sap/base/util/restricted/_toArray.js +1 -1
  45. package/src/sap/base/util/restricted/_union.js +1 -1
  46. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  47. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  48. package/src/sap/base/util/restricted/_uniq.js +1 -1
  49. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  50. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  51. package/src/sap/base/util/restricted/_without.js +1 -1
  52. package/src/sap/base/util/restricted/_xor.js +1 -1
  53. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  54. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  55. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  56. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  57. package/src/sap/ui/Device.js +37 -42
  58. package/src/sap/ui/Global.js +6 -6
  59. package/src/sap/ui/VersionInfo.js +1 -0
  60. package/src/sap/ui/base/DataType.js +14 -7
  61. package/src/sap/ui/base/Event.js +1 -1
  62. package/src/sap/ui/base/EventProvider.js +1 -1
  63. package/src/sap/ui/base/ExpressionParser.js +9 -6
  64. package/src/sap/ui/base/Interface.js +3 -49
  65. package/src/sap/ui/base/ManagedObject.js +131 -24
  66. package/src/sap/ui/base/ManagedObjectMetadata.js +13 -4
  67. package/src/sap/ui/base/Metadata.js +1 -1
  68. package/src/sap/ui/base/Object.js +49 -4
  69. package/src/sap/ui/base/ObjectPool.js +1 -1
  70. package/src/sap/ui/base/syncXHRFix.js +2 -1
  71. package/src/sap/ui/core/.library +5 -5
  72. package/src/sap/ui/core/AppCacheBuster.js +4 -4
  73. package/src/sap/ui/core/BusyIndicator.js +1 -11
  74. package/src/sap/ui/core/BusyIndicatorUtils.js +4 -1
  75. package/src/sap/ui/core/Component.js +441 -179
  76. package/src/sap/ui/core/ComponentContainer.js +16 -6
  77. package/src/sap/ui/core/ComponentMetadata.js +14 -3
  78. package/src/sap/ui/core/ComponentSupport.js +1 -1
  79. package/src/sap/ui/core/Configuration.js +64 -32
  80. package/src/sap/ui/core/Control.js +1 -1
  81. package/src/sap/ui/core/Core.js +57 -40
  82. package/src/sap/ui/core/CustomData.js +1 -1
  83. package/src/sap/ui/core/CustomizingConfiguration.js +35 -260
  84. package/src/sap/ui/core/DeclarativeSupport.js +3 -2
  85. package/src/sap/ui/core/Element.js +1 -1
  86. package/src/sap/ui/core/ElementMetadata.js +4 -2
  87. package/src/sap/ui/core/EnabledPropagator.js +91 -73
  88. package/src/sap/ui/core/EventBus.js +1 -1
  89. package/src/sap/ui/core/ExtensionPoint.js +7 -14
  90. package/src/sap/ui/core/Fragment.js +30 -32
  91. package/src/sap/ui/core/HTML.js +1 -1
  92. package/src/sap/ui/core/History.js +1 -1
  93. package/src/sap/ui/core/Icon.js +5 -5
  94. package/src/sap/ui/core/IconPool.js +15 -1097
  95. package/src/sap/ui/core/IconRenderer.js +2 -2
  96. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  97. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  98. package/src/sap/ui/core/InvisibleMessage.js +9 -1
  99. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  100. package/src/sap/ui/core/InvisibleText.js +1 -1
  101. package/src/sap/ui/core/Item.js +1 -1
  102. package/src/sap/ui/core/LabelEnablement.js +1 -1
  103. package/src/sap/ui/core/LayoutData.js +1 -1
  104. package/src/sap/ui/core/ListItem.js +1 -1
  105. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  106. package/src/sap/ui/core/Locale.js +26 -4
  107. package/src/sap/ui/core/LocaleData.js +1 -1
  108. package/src/sap/ui/core/Manifest.js +124 -126
  109. package/src/sap/ui/core/Message.js +1 -1
  110. package/src/sap/ui/core/Patcher.js +53 -80
  111. package/src/sap/ui/core/Placeholder.js +25 -11
  112. package/src/sap/ui/core/Popup.js +29 -5
  113. package/src/sap/ui/core/RenderManager.js +41 -24
  114. package/src/sap/ui/core/Renderer.js +13 -3
  115. package/src/sap/ui/core/ResizeHandler.js +1 -1
  116. package/src/sap/ui/core/ScrollBar.js +2 -2
  117. package/src/sap/ui/core/SeparatorItem.js +1 -1
  118. package/src/sap/ui/core/ShortcutHintsMixin.js +14 -7
  119. package/src/sap/ui/core/ThemeCheck.js +13 -61
  120. package/src/sap/ui/core/Title.js +1 -1
  121. package/src/sap/ui/core/TooltipBase.js +1 -1
  122. package/src/sap/ui/core/UIArea.js +5 -2
  123. package/src/sap/ui/core/UIComponent.js +81 -40
  124. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  125. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  126. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  127. package/src/sap/ui/core/XMLComposite.js +1 -1
  128. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  129. package/src/sap/ui/core/XMLTemplateProcessor.js +5 -5
  130. package/src/sap/ui/core/_IconRegistry.js +1215 -0
  131. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  132. package/src/sap/ui/core/delegate/ScrollEnablement.js +6 -3
  133. package/src/sap/ui/core/dnd/DragDropBase.js +2 -9
  134. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  135. package/src/sap/ui/core/dnd/DragInfo.js +41 -1
  136. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  137. package/src/sap/ui/core/format/DateFormat.js +2 -0
  138. package/src/sap/ui/core/format/NumberFormat.js +2 -0
  139. package/src/sap/ui/core/hyphenation/Hyphenation.js +73 -221
  140. package/src/sap/ui/core/hyphenation/HyphenationTestingWords.js +11 -10
  141. package/src/sap/ui/core/library.js +3 -3
  142. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  143. package/src/sap/ui/core/message/Message.js +1 -1
  144. package/src/sap/ui/core/message/MessageManager.js +13 -13
  145. package/src/sap/ui/core/message/MessageParser.js +1 -1
  146. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  147. package/src/sap/ui/core/messagebundle_de.properties +1 -1
  148. package/src/sap/ui/core/messagebundle_fr.properties +1 -1
  149. package/src/sap/ui/core/messagebundle_it.properties +1 -1
  150. package/src/sap/ui/core/messagebundle_pl.properties +1 -1
  151. package/src/sap/ui/core/messagebundle_th.properties +2 -2
  152. package/src/sap/ui/core/mvc/Controller.js +166 -9
  153. package/src/sap/ui/core/mvc/ControllerExtensionProvider.js +30 -32
  154. package/src/sap/ui/core/mvc/ControllerMetadata.js +18 -18
  155. package/src/sap/ui/core/mvc/HTMLView.js +4 -2
  156. package/src/sap/ui/core/mvc/JSONView.js +8 -6
  157. package/src/sap/ui/core/mvc/JSView.js +5 -3
  158. package/src/sap/ui/core/mvc/TemplateView.js +2 -2
  159. package/src/sap/ui/core/mvc/View.js +73 -89
  160. package/src/sap/ui/core/mvc/ViewType.js +2 -0
  161. package/src/sap/ui/core/mvc/XMLView.js +14 -10
  162. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  163. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  164. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  165. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  166. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  167. package/src/sap/ui/core/routing/History.js +36 -18
  168. package/src/sap/ui/core/routing/Route.js +10 -1
  169. package/src/sap/ui/core/routing/Router.js +8 -5
  170. package/src/sap/ui/core/routing/Target.js +13 -0
  171. package/src/sap/ui/core/routing/TargetCache.js +1 -1
  172. package/src/sap/ui/core/routing/Targets.js +39 -2
  173. package/src/sap/ui/core/routing/async/Route.js +7 -4
  174. package/src/sap/ui/core/routing/async/Target.js +383 -262
  175. package/src/sap/ui/core/routing/sync/Target.js +15 -0
  176. package/src/sap/ui/core/rules/App.support.js +35 -1
  177. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
  178. package/src/sap/ui/core/search/SearchProvider.js +1 -1
  179. package/src/sap/ui/core/service/Service.js +1 -1
  180. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  181. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  182. package/src/sap/ui/core/support/BootSupportTool.js +11 -0
  183. package/src/sap/ui/core/support/InteractionTree.css +4 -0
  184. package/src/sap/ui/core/support/Plugin.js +1 -1
  185. package/src/sap/ui/core/support/Support.js +1 -1
  186. package/src/sap/ui/core/support/ViewInfo.css +599 -0
  187. package/src/sap/ui/core/support/controls/InteractionTree.js +352 -222
  188. package/src/sap/ui/core/support/controls/ObjectViewer.js +8 -50
  189. package/src/sap/ui/core/support/controls/TimelineOverview.js +49 -24
  190. package/src/sap/ui/core/support/controls/TreeViewer.js +12 -58
  191. package/src/sap/ui/core/support/plugins/ControlTree.js +23 -26
  192. package/src/sap/ui/core/support/plugins/Debugging.js +9 -11
  193. package/src/sap/ui/core/support/plugins/Interaction.js +2 -2
  194. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  195. package/src/sap/ui/core/support/plugins/Performance.js +147 -75
  196. package/src/sap/ui/core/support/plugins/Selector.js +19 -24
  197. package/src/sap/ui/core/support/plugins/TechInfo.js +5 -5
  198. package/src/sap/ui/core/support/plugins/Trace.js +95 -32
  199. package/src/sap/ui/core/support/plugins/ViewInfo.js +9 -73
  200. package/src/sap/ui/core/support/support.css +109 -14
  201. package/src/sap/ui/core/support/support.html +6 -2
  202. package/src/sap/ui/core/support/techinfo/TechnicalInfo.fragment.xml +1 -0
  203. package/src/sap/ui/core/support/techinfo/TechnicalInfo.js +149 -72
  204. package/src/sap/ui/core/support/trace/E2eTraceLib.js +3 -3
  205. package/src/sap/ui/core/themes/base/LocalBusyIndicator.less +5 -0
  206. package/src/sap/ui/core/themes/base/base.less +27 -25
  207. package/src/sap/ui/core/themes/base/shared.less +1 -0
  208. package/src/sap/ui/core/theming/Parameters.js +225 -61
  209. package/src/sap/ui/core/theming/ThemeHelper.js +94 -0
  210. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  211. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  212. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  213. package/src/sap/ui/core/tmpl/Template.js +11 -28
  214. package/src/sap/ui/core/tmpl/TemplateControl.js +4 -4
  215. package/src/sap/ui/core/tmpl/_parsePath.js +35 -0
  216. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  217. package/src/sap/ui/core/util/DraftEnabledMockServer.js +9 -4
  218. package/src/sap/ui/core/util/Export.js +1 -1
  219. package/src/sap/ui/core/util/ExportCell.js +1 -1
  220. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  221. package/src/sap/ui/core/util/ExportRow.js +1 -1
  222. package/src/sap/ui/core/util/ExportType.js +1 -1
  223. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  224. package/src/sap/ui/core/util/File.js +1 -1
  225. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  226. package/src/sap/ui/core/util/MockServer.js +24 -5
  227. package/src/sap/ui/core/util/MockServerAnnotationsHandler.js +3 -2
  228. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  229. package/src/sap/ui/core/util/XMLPreprocessor.js +11 -12
  230. package/src/sap/ui/core/util/reflection/BaseTreeModifier.js +154 -63
  231. package/src/sap/ui/core/util/reflection/JsControlTreeModifier.js +171 -152
  232. package/src/sap/ui/core/util/reflection/XmlTreeModifier.js +419 -291
  233. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  234. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  235. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  236. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  237. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  238. package/src/sap/ui/core/util/serializer/delegate/HTML.js +2 -2
  239. package/src/sap/ui/core/util/serializer/delegate/XML.js +2 -2
  240. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  241. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  242. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  243. package/src/sap/ui/debug/ControlTree.js +10 -4
  244. package/src/sap/ui/debug/DebugEnv.js +3 -4
  245. package/src/sap/ui/debug/PropertyList.css +55 -0
  246. package/src/sap/ui/debug/PropertyList.js +111 -182
  247. package/src/sap/ui/events/jquery/EventSimulation.js +7 -6
  248. package/src/sap/ui/events/jquery/EventTriggerHook.js +1 -1
  249. package/src/sap/ui/model/ClientModel.js +1 -1
  250. package/src/sap/ui/model/ClientPropertyBinding.js +3 -1
  251. package/src/sap/ui/model/ClientTreeBinding.js +14 -8
  252. package/src/sap/ui/model/CompositeDataState.js +1 -1
  253. package/src/sap/ui/model/CompositeType.js +1 -1
  254. package/src/sap/ui/model/Context.js +31 -11
  255. package/src/sap/ui/model/DataState.js +1 -1
  256. package/src/sap/ui/model/ListBinding.js +19 -0
  257. package/src/sap/ui/model/MetaModel.js +1 -1
  258. package/src/sap/ui/model/Model.js +3 -3
  259. package/src/sap/ui/model/SelectionModel.js +5 -1
  260. package/src/sap/ui/model/SimpleType.js +1 -1
  261. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  262. package/src/sap/ui/model/Type.js +1 -1
  263. package/src/sap/ui/model/analytics/AnalyticalBinding.js +14 -9
  264. package/src/sap/ui/model/analytics/odata4analytics.js +31 -23
  265. package/src/sap/ui/model/base/ManagedObjectModel.js +13 -1
  266. package/src/sap/ui/model/json/JSONModel.js +4 -2
  267. package/src/sap/ui/model/message/MessageModel.js +4 -2
  268. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  269. package/src/sap/ui/model/odata/ODataListBinding.js +1 -0
  270. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  271. package/src/sap/ui/model/odata/ODataMetaModel.js +5 -2
  272. package/src/sap/ui/model/odata/ODataMetadata.js +1 -1
  273. package/src/sap/ui/model/odata/ODataModel.js +7 -6
  274. package/src/sap/ui/model/odata/ODataUtils.js +31 -10
  275. package/src/sap/ui/model/odata/_AnnotationHelperBasics.js +30 -27
  276. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  277. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  278. package/src/sap/ui/model/odata/type/Currency.js +7 -2
  279. package/src/sap/ui/model/odata/type/Date.js +1 -1
  280. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  281. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  282. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  283. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  284. package/src/sap/ui/model/odata/type/Double.js +1 -1
  285. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  286. package/src/sap/ui/model/odata/type/Int.js +1 -1
  287. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  288. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  289. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  290. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  291. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  292. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  293. package/src/sap/ui/model/odata/type/Single.js +1 -1
  294. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  295. package/src/sap/ui/model/odata/type/String.js +3 -1
  296. package/src/sap/ui/model/odata/type/Time.js +1 -1
  297. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  298. package/src/sap/ui/model/odata/type/Unit.js +7 -2
  299. package/src/sap/ui/model/odata/type/UnitMixin.js +20 -7
  300. package/src/sap/ui/model/odata/v2/Context.js +187 -0
  301. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +2 -2
  302. package/src/sap/ui/model/odata/v2/ODataContextBinding.js +55 -51
  303. package/src/sap/ui/model/odata/v2/ODataListBinding.js +42 -106
  304. package/src/sap/ui/model/odata/v2/ODataModel.js +251 -159
  305. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +163 -136
  306. package/src/sap/ui/model/odata/v4/Context.js +6 -3
  307. package/src/sap/ui/model/odata/v4/ODataBinding.js +3 -3
  308. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +97 -25
  309. package/src/sap/ui/model/odata/v4/ODataListBinding.js +112 -24
  310. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +15 -12
  311. package/src/sap/ui/model/odata/v4/ODataModel.js +85 -77
  312. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +25 -15
  313. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +21 -12
  314. package/src/sap/ui/model/odata/v4/_AnnotationHelperExpression.js +10 -3
  315. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +13 -4
  316. package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +5 -1
  317. package/src/sap/ui/model/odata/v4/lib/_Cache.js +28 -17
  318. package/src/sap/ui/model/odata/v4/lib/_Helper.js +47 -30
  319. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +55 -19
  320. package/src/sap/ui/model/odata/v4/lib/_V2Requestor.js +2 -2
  321. package/src/sap/ui/model/resource/ResourceModel.js +5 -2
  322. package/src/sap/ui/model/type/Boolean.js +1 -1
  323. package/src/sap/ui/model/type/Currency.js +1 -1
  324. package/src/sap/ui/model/type/Date.js +1 -1
  325. package/src/sap/ui/model/type/DateInterval.js +1 -1
  326. package/src/sap/ui/model/type/DateTime.js +1 -1
  327. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  328. package/src/sap/ui/model/type/FileSize.js +1 -1
  329. package/src/sap/ui/model/type/Float.js +1 -1
  330. package/src/sap/ui/model/type/Integer.js +1 -1
  331. package/src/sap/ui/model/type/String.js +1 -1
  332. package/src/sap/ui/model/type/Time.js +1 -1
  333. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  334. package/src/sap/ui/model/type/Unit.js +1 -1
  335. package/src/sap/ui/model/xml/XMLModel.js +4 -2
  336. package/src/sap/ui/performance/Measurement.js +1 -1
  337. package/src/sap/ui/performance/trace/FESR.js +2 -1
  338. package/src/sap/ui/performance/trace/Interaction.js +42 -25
  339. package/src/sap/ui/performance/trace/initTraces.js +1 -1
  340. package/src/sap/ui/qunit/QUnitUtils.js +1 -1
  341. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  342. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  343. package/src/sap/ui/security/FrameOptions.js +2 -1
  344. package/src/sap/ui/test/Opa5.js +1 -1
  345. package/src/sap/ui/test/OpaBuilder.js +1 -0
  346. package/src/sap/ui/test/TestUtils.js +28 -34
  347. package/src/sap/ui/test/actions/Drag.js +6 -2
  348. package/src/sap/ui/test/actions/Drop.js +6 -2
  349. package/src/sap/ui/test/actions/EnterText.js +6 -0
  350. package/src/sap/ui/test/actions/Press.js +6 -0
  351. package/src/sap/ui/test/actions/Scroll.js +6 -0
  352. package/src/sap/ui/test/autowaiter/_resourceWaiter.js +4 -4
  353. package/src/sap/ui/test/launchers/componentLauncher.js +1 -4
  354. package/src/sap/ui/test/matchers/I18NText.js +29 -11
  355. package/src/sap/ui/test/opaQunit.js +11 -9
  356. package/src/sap/ui/test/selectors/_ControlSelectorGenerator.js +4 -4
  357. package/src/sap/ui/thirdparty/caja-html-sanitizer.js +1 -1
  358. package/src/sap/ui/thirdparty/crossroads.js +16 -6
  359. package/src/sap/ui/thirdparty/hyphenopoly/Hyphenopoly.js +1196 -0
  360. package/src/sap/ui/thirdparty/hyphenopoly/Hyphenopoly_Loader.js +797 -0
  361. package/src/sap/ui/thirdparty/hyphenopoly/hyphenEngine.asm.js +108 -127
  362. package/src/sap/ui/thirdparty/hyphenopoly/hyphenEngine.wasm +0 -0
  363. package/src/sap/ui/thirdparty/hyphenopoly/patterns/bg.hpb +0 -0
  364. package/src/sap/ui/thirdparty/hyphenopoly/patterns/ca.hpb +0 -0
  365. package/src/sap/ui/thirdparty/hyphenopoly/patterns/da.hpb +0 -0
  366. package/src/sap/ui/thirdparty/hyphenopoly/patterns/de.hpb +0 -0
  367. package/src/sap/ui/thirdparty/hyphenopoly/patterns/el-monoton.hpb +0 -0
  368. package/src/sap/ui/thirdparty/hyphenopoly/patterns/en-us.hpb +0 -0
  369. package/src/sap/ui/thirdparty/hyphenopoly/patterns/es.hpb +0 -0
  370. package/src/sap/ui/thirdparty/hyphenopoly/patterns/et.hpb +0 -0
  371. package/src/sap/ui/thirdparty/hyphenopoly/patterns/fi.hpb +0 -0
  372. package/src/sap/ui/thirdparty/hyphenopoly/patterns/fr.hpb +0 -0
  373. package/src/sap/ui/thirdparty/hyphenopoly/patterns/hi.hpb +0 -0
  374. package/src/sap/ui/thirdparty/hyphenopoly/patterns/hr.hpb +0 -0
  375. package/src/sap/ui/thirdparty/hyphenopoly/patterns/hu.hpb +0 -0
  376. package/src/sap/ui/thirdparty/hyphenopoly/patterns/it.hpb +0 -0
  377. package/src/sap/ui/thirdparty/hyphenopoly/patterns/lt.hpb +0 -0
  378. package/src/sap/ui/thirdparty/hyphenopoly/patterns/nb-no.hpb +0 -0
  379. package/src/sap/ui/thirdparty/hyphenopoly/patterns/nl.hpb +0 -0
  380. package/src/sap/ui/thirdparty/hyphenopoly/patterns/pt.hpb +0 -0
  381. package/src/sap/ui/thirdparty/hyphenopoly/patterns/ru.hpb +0 -0
  382. package/src/sap/ui/thirdparty/hyphenopoly/patterns/sl.hpb +0 -0
  383. package/src/sap/ui/thirdparty/hyphenopoly/patterns/sv.hpb +0 -0
  384. package/src/sap/ui/thirdparty/hyphenopoly/patterns/th.hpb +0 -0
  385. package/src/sap/ui/thirdparty/hyphenopoly/patterns/tr.hpb +0 -0
  386. package/src/sap/ui/thirdparty/hyphenopoly/patterns/uk.hpb +0 -0
  387. package/src/sap/ui/util/Storage.js +1 -1
  388. package/src/sap/ui/util/isCrossOriginURL.js +16 -6
  389. package/src/sap-ui-core-nojQuery.js +1 -1
  390. package/src/sap-ui-core.js +1 -1
  391. package/src/sap-ui-debug.js +3 -17
  392. package/src/ui5loader.js +5 -2
  393. package/src/sap/ui/core/support/plugins/MessageTest.js +0 -96
  394. package/src/sap/ui/thirdparty/hyphenopoly/hyphenopoly.bundle.js +0 -860
@@ -68,8 +68,8 @@ sap.ui.define([
68
68
  * @author SAP SE
69
69
  * @class Context binding for an OData V4 model.
70
70
  * An event handler can only be attached to this binding for the following events:
71
- * 'AggregatedDataStateChange', 'change', 'dataReceived', 'dataRequested', and
72
- * 'DataStateChange'. For other events, an error is thrown.
71
+ * 'AggregatedDataStateChange', 'change', 'dataReceived', 'dataRequested', 'DataStateChange',
72
+ * 'patchCompleted', and 'patchSent'. For other events, an error is thrown.
73
73
  *
74
74
  * A context binding can also be used as an <i>operation binding</i> to support bound actions,
75
75
  * action imports, bound functions and function imports. If you want to control the execution
@@ -106,7 +106,7 @@ sap.ui.define([
106
106
  * @mixes sap.ui.model.odata.v4.ODataParentBinding
107
107
  * @public
108
108
  * @since 1.37.0
109
- * @version 1.92.0
109
+ * @version 1.95.0
110
110
  *
111
111
  * @borrows sap.ui.model.odata.v4.ODataBinding#getGroupId as #getGroupId
112
112
  * @borrows sap.ui.model.odata.v4.ODataBinding#getRootBinding as #getRootBinding
@@ -114,7 +114,9 @@ sap.ui.define([
114
114
  * @borrows sap.ui.model.odata.v4.ODataBinding#hasPendingChanges as #hasPendingChanges
115
115
  * @borrows sap.ui.model.odata.v4.ODataBinding#isInitial as #isInitial
116
116
  * @borrows sap.ui.model.odata.v4.ODataBinding#refresh as #refresh
117
+ * @borrows sap.ui.model.odata.v4.ODataBinding#requestRefresh as #requestRefresh
117
118
  * @borrows sap.ui.model.odata.v4.ODataBinding#resetChanges as #resetChanges
119
+ * @borrows sap.ui.model.odata.v4.ODataBinding#toString as #toString
118
120
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#attachPatchCompleted as
119
121
  * #attachPatchCompleted
120
122
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#attachPatchSent as #attachPatchSent
@@ -122,13 +124,13 @@ sap.ui.define([
122
124
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#detachPatchCompleted as
123
125
  * #detachPatchCompleted
124
126
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#detachPatchSent as #detachPatchSent
125
- * @borrows sap.ui.model.odata.v4.ODataParentBinding#initialize as #initialize
126
127
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#resume as #resume
127
128
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#suspend as #suspend
128
129
  */
129
130
  var ODataContextBinding = ContextBinding.extend("sap.ui.model.odata.v4.ODataContextBinding", {
130
131
  constructor : function (oModel, sPath, oContext, mParameters) {
131
- var iPos = sPath.indexOf("(...)");
132
+ var iPos = sPath.indexOf("(...)"),
133
+ that = this;
132
134
 
133
135
  ContextBinding.call(this, oModel, sPath);
134
136
  // initialize mixin members
@@ -178,6 +180,13 @@ sap.ui.define([
178
180
  }
179
181
  this.setContext(oContext);
180
182
  oModel.bindingCreated(this);
183
+
184
+ Promise.resolve().then(function () {
185
+ // bInitial must be true initially, but false later. Then suspend on a just
186
+ // created binding causes a change event on resume; otherwise further changes
187
+ // on the suspended binding are required (see doSuspend)
188
+ that.bInitial = false;
189
+ });
181
190
  },
182
191
  metadata : {
183
192
  publicMethods : []
@@ -574,11 +583,15 @@ sap.ui.define([
574
583
  * @returns {SyncPromise}
575
584
  * The request promise
576
585
  * @throws {Error}
577
- * If <code>fnOnStrictHandlingFailed</code> is given but the given metadata is not an
578
- * "Action", or the given function does not return a promise, or a collection-valued parameter
579
- * for an operation other than a V4 action is encountered, or if the given metadata is neither
580
- * an "Action" nor a "Function", or if <code>bIgnoreETag</code> is used for an operation other
581
- * than a bound action
586
+ * If
587
+ * <ul>
588
+ * <li> the given metadata is neither an "Action" nor a "Function",
589
+ * <li> a collection-valued parameter for an operation other than a V4 action is encountered,
590
+ * <li> <code>bIgnoreETag</code> is used for an operation other than a bound action,
591
+ * <li> <code>fnOnStrictHandlingFailed</code> is given but the given metadata is not an
592
+ * "Action",
593
+ * <li> <code>fnOnStrictHandlingFailed</code> is given and it does not return a promise.
594
+ * </ul>
582
595
  *
583
596
  * @private
584
597
  */
@@ -621,18 +634,18 @@ sap.ui.define([
621
634
  * @throws {Error} If <code>fnOnStrictHandlingFailed</code> does not return a promise
622
635
  */
623
636
  function onStrictHandling(oError) {
624
- var oRawMessages, oResult;
637
+ var oResult;
625
638
 
626
639
  _Helper.adjustTargetsInError(oError, oOperationMetadata,
627
640
  that.oParameterContext.getPath(),
628
641
  that.bRelative ? that.oContext.getPath() : undefined);
629
642
  oError.error.$ignoreTopLevel = true;
630
- oRawMessages = _Helper.extractMessages(oError);
631
643
 
632
644
  oResult = fnOnStrictHandlingFailed(
633
- oRawMessages.bound.concat(oRawMessages.unbound).map(function (oRawMessage) {
645
+ _Helper.extractMessages(oError).map(function (oRawMessage) {
634
646
  return that.oModel.createUI5Message(oRawMessage);
635
- }));
647
+ })
648
+ );
636
649
 
637
650
  if (!(oResult instanceof Promise)) {
638
651
  throw new Error("Not a promise: " + oResult);
@@ -760,6 +773,17 @@ sap.ui.define([
760
773
  }
761
774
  };
762
775
 
776
+ /**
777
+ * @override
778
+ * @see sap.ui.model.odata.v4.ODataParentBinding#doSuspend
779
+ */
780
+ ODataContextBinding.prototype.doSuspend = function () {
781
+ if (this.bInitial) {
782
+ // if the binding is still initial, it must fire an event in resume
783
+ this.sResumeChangeReason = ChangeReason.Change;
784
+ }
785
+ };
786
+
763
787
  /**
764
788
  * Calls the OData operation that corresponds to this operation binding.
765
789
  *
@@ -779,7 +803,7 @@ sap.ui.define([
779
803
  * IDs as specified in {@link sap.ui.model.odata.v4.ODataModel}.
780
804
  * @param {boolean} [bIgnoreETag]
781
805
  * Whether the entity's ETag should be actively ignored (If-Match:*); supported for bound
782
- * actions only, since 1.90.0
806
+ * actions only, since 1.90.0. Ignored if there is no ETag (since 1.93.0).
783
807
  * @param {function} [fnOnStrictHandlingFailed]
784
808
  * If this callback is given for an action, the preference "handling=strict" is applied. If
785
809
  * the service responds with the HTTP status code 412 and a
@@ -799,8 +823,8 @@ sap.ui.define([
799
823
  * rejected if <code>fnOnStrictHandlingFailed</code> is supplied and
800
824
  * <ul>
801
825
  * <li> is used for an operation other than an action,
802
- * <li> there is another call of {@link #execute} with such a function provided in a
803
- * different change set in the same $batch request,
826
+ * <li> another request that applies the preference "handling=strict" exists in a different
827
+ * change set of the same $batch request,
804
828
  * <li> returns a <code>Promise</code> that resolves with <code>false</code>. In this case
805
829
  * <code>oError.canceled === true</code>.
806
830
  * </ul>
@@ -820,7 +844,9 @@ sap.ui.define([
820
844
  * {@link sap.ui.model.Binding#isResolved}) or relative to a transient context (see
821
845
  * {@link sap.ui.model.odata.v4.Context#isTransient}), or if deferred operation bindings are
822
846
  * nested, or if the OData resource path for a deferred operation binding's context cannot be
823
- * determined.
847
+ * determined, or if <code>fnOnStrictHandlingFailed</code> is called and does not return a
848
+ * <code>Promise</code>.
849
+
824
850
  *
825
851
  * @public
826
852
  * @since 1.37.0
@@ -888,6 +914,7 @@ sap.ui.define([
888
914
  return oCachePromise.then(function (oCache) {
889
915
  var bDataRequested = false,
890
916
  oGroupLock,
917
+ sResolvedPath = that.getResolvedPath(),
891
918
  sRelativePath = oCache || that.oOperation
892
919
  ? that.getRelativePath(sPath)
893
920
  : undefined,
@@ -938,7 +965,7 @@ sap.ui.define([
938
965
  }, function (oError) {
939
966
  oGroupLock.unlock(true);
940
967
  if (bDataRequested) {
941
- that.oModel.reportError("Failed to read path " + that.sPath, sClassName,
968
+ that.oModel.reportError("Failed to read path " + sResolvedPath, sClassName,
942
969
  oError);
943
970
  that.fireDataReceived(oError.canceled ? {data : {}} : {error : oError});
944
971
  }
@@ -1095,12 +1122,11 @@ sap.ui.define([
1095
1122
  */
1096
1123
  // @override sap.ui.model.Binding#initialize
1097
1124
  ODataContextBinding.prototype.initialize = function () {
1098
- if (this.isResolved()) {
1099
- if (this.getRootBinding().isSuspended()) {
1100
- this.sResumeChangeReason = ChangeReason.Change;
1101
- } else {
1102
- this._fireChange({reason : ChangeReason.Change});
1103
- }
1125
+ this.bInitial = false;
1126
+ // Here no other code but the event for the ManagedObject is expected. The binding should be
1127
+ // useable for controller code without calling initialize.
1128
+ if (this.isResolved() && !this.getRootBinding().isSuspended()) {
1129
+ this._fireChange({reason : ChangeReason.Change});
1104
1130
  }
1105
1131
  };
1106
1132
 
@@ -1131,6 +1157,52 @@ sap.ui.define([
1131
1157
  && !oMetadata.$EntitySetPath.includes("/"); // case 3
1132
1158
  };
1133
1159
 
1160
+ /**
1161
+ * Moves the bound entity into the given list binding. This binding loses its data. The method
1162
+ * may only be called when this binding has finished loading. You can verify this by calling
1163
+ * <code>oBinding.getBoundContext().requestObject()</code>. If that promise resolves, the
1164
+ * binding has finished loading.
1165
+ *
1166
+ * @param {sap.ui.model.odata.v4.ODataListBinding} oListBinding
1167
+ * The list binding to take the entity
1168
+ * @throws {Error}
1169
+ * If
1170
+ * <ul>
1171
+ * <li> this binding is not a root binding,
1172
+ * <li> this binding has not finished loading yet,
1173
+ * <li> not all key properties of the bound entity have been selected (so that it is
1174
+ * impossible to determine its key predicate),
1175
+ * <li> the bound entity is not an entity of the list binding's collection,
1176
+ * <li> this binding is an operation binding,
1177
+ * <li> this binding has pending changes (see {@link #hasPendingChanges}),
1178
+ * <li> this binding has a <code>$expand</code> to a collection or a dependent list binding
1179
+ * without <code>$$ownRequest</code>,
1180
+ * <li> the list binding is not suspended,
1181
+ * <li> the list binding is relative and does not use the <code>$$ownRequest</code>
1182
+ * parameter (see {@link sap.ui.model.odata.v4.ODataModel#bindList}).
1183
+ * <li> the list binding uses data aggregation
1184
+ * (@see sap.ui.model.odata.v4.ODataListBinding#setAggregation)
1185
+ * </ul>
1186
+ *
1187
+ * @experimental
1188
+ * @public
1189
+ * @since 1.95.0
1190
+ */
1191
+ ODataContextBinding.prototype.moveEntityTo = function (oListBinding) {
1192
+ if (!this.isRoot()) {
1193
+ throw new Error(this + ": must be a root binding");
1194
+ }
1195
+ if (this.oOperation) {
1196
+ throw new Error(this + ": must not be an operation binding");
1197
+ }
1198
+ if (this.hasPendingChanges()) {
1199
+ throw new Error(this + ": has pending changes");
1200
+ }
1201
+
1202
+ oListBinding.moveEntityHere(this.oElementContext);
1203
+ this.oElementContext = null;
1204
+ };
1205
+
1134
1206
  /**
1135
1207
  * @override
1136
1208
  * @see sap.ui.model.odata.v4.ODataBinding#refreshInternal
@@ -68,21 +68,24 @@ sap.ui.define([
68
68
  * @author SAP SE
69
69
  * @class List binding for an OData V4 model.
70
70
  * An event handler can only be attached to this binding for the following events:
71
- * 'AggregatedDataStateChange', 'change', 'dataReceived', 'dataRequested', 'DataStateChange'
72
- * and 'refresh'. For other events, an error is thrown.
71
+ * 'AggregatedDataStateChange', 'change', 'createCompleted', 'createSent', 'dataReceived',
72
+ * 'dataRequested', 'DataStateChange', 'patchCompleted', 'patchSent', and 'refresh'. For
73
+ * other events, an error is thrown.
73
74
  * @extends sap.ui.model.ListBinding
74
75
  * @hideconstructor
75
76
  * @mixes sap.ui.model.odata.v4.ODataParentBinding
76
77
  * @public
77
78
  * @since 1.37.0
78
- * @version 1.92.0
79
+ * @version 1.95.0
79
80
  * @borrows sap.ui.model.odata.v4.ODataBinding#getGroupId as #getGroupId
80
81
  * @borrows sap.ui.model.odata.v4.ODataBinding#getRootBinding as #getRootBinding
81
82
  * @borrows sap.ui.model.odata.v4.ODataBinding#getUpdateGroupId as #getUpdateGroupId
82
83
  * @borrows sap.ui.model.odata.v4.ODataBinding#hasPendingChanges as #hasPendingChanges
83
84
  * @borrows sap.ui.model.odata.v4.ODataBinding#isInitial as #isInitial
84
85
  * @borrows sap.ui.model.odata.v4.ODataBinding#refresh as #refresh
86
+ * @borrows sap.ui.model.odata.v4.ODataBinding#requestRefresh as #requestRefresh
85
87
  * @borrows sap.ui.model.odata.v4.ODataBinding#resetChanges as #resetChanges
88
+ * @borrows sap.ui.model.odata.v4.ODataBinding#toString as #toString
86
89
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#attachPatchCompleted as
87
90
  * #attachPatchCompleted
88
91
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#attachPatchSent as #attachPatchSent
@@ -90,7 +93,6 @@ sap.ui.define([
90
93
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#detachPatchCompleted as
91
94
  * #detachPatchCompleted
92
95
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#detachPatchSent as #detachPatchSent
93
- * @borrows sap.ui.model.odata.v4.ODataParentBinding#initialize as #initialize
94
96
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#resume as #resume
95
97
  * @borrows sap.ui.model.odata.v4.ODataParentBinding#suspend as #suspend
96
98
  */
@@ -836,6 +838,7 @@ sap.ui.define([
836
838
  oModel = this.oModel,
837
839
  sPath = this.getResolvedPath(),
838
840
  sPredicate,
841
+ aPreviousPaths,
839
842
  bStartBeyondRange = iStart > this.aContexts.length,
840
843
  i, that = this;
841
844
 
@@ -886,8 +889,9 @@ sap.ui.define([
886
889
  }
887
890
  }
888
891
  // destroy previous contexts which are not reused or kept-alive
889
- if (Object.keys(this.mPreviousContextsByPath).length) {
890
- oModel.addPrerenderingTask(this.destroyPreviousContexts.bind(this));
892
+ aPreviousPaths = Object.keys(this.mPreviousContextsByPath);
893
+ if (aPreviousPaths.length) {
894
+ oModel.addPrerenderingTask(this.destroyPreviousContexts.bind(this, aPreviousPaths));
891
895
  }
892
896
  if (iCount !== undefined) { // server count is available or "non-empty short read"
893
897
  this.bLengthFinal = true;
@@ -930,7 +934,7 @@ sap.ui.define([
930
934
  this.aContexts.forEach(function (oContext) {
931
935
  oContext.destroy();
932
936
  });
933
- this.destroyPreviousContexts(true);
937
+ this.destroyPreviousContexts();
934
938
  if (this.oHeaderContext) {
935
939
  this.oHeaderContext.destroy();
936
940
  }
@@ -988,24 +992,26 @@ sap.ui.define([
988
992
  /**
989
993
  * Removes and destroys contexts from mPreviousContextsByPath.
990
994
  *
991
- * @param {boolean} [bAllContexts]
992
- * If <code>true</code>, all contexts are removed and destroyed, otherwise only those that
993
- * are not kept alive (see {@link sap.ui.model.odata.v4.Context#isKeepAlive})
995
+ * @param {string[]} [aPathsToDelete]
996
+ * If given, only contexts with paths in this list except kept-alive ones are removed and
997
+ * destroyed; otherwise all contexts in the list are removed and destroyed
994
998
  *
995
999
  * @private
996
1000
  */
997
- ODataListBinding.prototype.destroyPreviousContexts = function (bAllContexts) {
1001
+ ODataListBinding.prototype.destroyPreviousContexts = function (aPathsToDelete) {
998
1002
  var mPreviousContextsByPath = this.mPreviousContextsByPath;
999
1003
 
1000
1004
  if (mPreviousContextsByPath) { // binding may have been destroyed already
1001
- Object.keys(mPreviousContextsByPath).forEach(function (sPath) {
1005
+ (aPathsToDelete || Object.keys(mPreviousContextsByPath)).forEach(function (sPath) {
1002
1006
  var oContext = mPreviousContextsByPath[sPath];
1003
1007
 
1004
- if (bAllContexts || !oContext.isKeepAlive()) {
1005
- oContext.destroy();
1006
- delete mPreviousContextsByPath[sPath];
1007
- } else {
1008
- oContext.iIndex = undefined;
1008
+ if (oContext) {
1009
+ if (aPathsToDelete && oContext.isKeepAlive()) {
1010
+ oContext.iIndex = undefined;
1011
+ } else {
1012
+ oContext.destroy();
1013
+ delete mPreviousContextsByPath[sPath];
1014
+ }
1009
1015
  }
1010
1016
  });
1011
1017
  }
@@ -1784,8 +1790,8 @@ sap.ui.define([
1784
1790
  * If known, the value represents the sum of the element count of the collection on the server
1785
1791
  * and the number of transient entities created on the client. Otherwise, it is
1786
1792
  * <code>undefined</code>. The value is a number of type <code>Edm.Int64</code>. Since 1.91.0,
1787
- * in case of data aggregation, the count is the leaf count on the server; it is only determined
1788
- * if the <code>$count</code> system query option is given.
1793
+ * in case of data aggregation with group levels, the count is the leaf count on the server; it
1794
+ * is only determined if the <code>$count</code> system query option is given.
1789
1795
  *
1790
1796
  * The count is known to the binding in the following situations:
1791
1797
  * <ul>
@@ -2235,6 +2241,63 @@ sap.ui.define([
2235
2241
  return this.bLengthFinal;
2236
2242
  };
2237
2243
 
2244
+ /**
2245
+ * Makes the given context a row context of this binding. Adds the entity data to the cache.
2246
+ * Makes the context kept-alive.
2247
+ *
2248
+ * @param {sap.ui.model.odata.v4.Context} oEntityContext
2249
+ * A context pointing to an entity
2250
+ * @throws {Error}
2251
+ * If the binding is not suspended, setKeepAlive is not possible, the resource paths do not
2252
+ * match, the entity's key predicate is unknown, the context binding's $expand contains
2253
+ * collections, or the context binding is still reading
2254
+ *
2255
+ * @private
2256
+ */
2257
+ ODataListBinding.prototype.moveEntityHere = function (oEntityContext) {
2258
+ var oEntity,
2259
+ oEntityFetchValuePromise,
2260
+ sEntityPath = oEntityContext.getPath(),
2261
+ mEntityQueryOptions = oEntityContext.getBinding().getInheritableQueryOptions(),
2262
+ sRelativePath = _Helper.getRelativePath(sEntityPath, this.oHeaderContext.getPath());
2263
+
2264
+ if (!sRelativePath || sRelativePath.includes("/")) {
2265
+ throw new Error(this + ": " + sEntityPath + " is not an entity of the collection");
2266
+ }
2267
+ if (!this.getRootBinding().isSuspended()) {
2268
+ throw new Error(this + ": must be suspended");
2269
+ }
2270
+ this.checkKeepAlive(oEntityContext);
2271
+
2272
+ // take the value from the context binding's cache
2273
+ oEntityFetchValuePromise = oEntityContext.fetchValue(null, null, /*bCached*/true);
2274
+ if (oEntityFetchValuePromise.isPending()) {
2275
+ throw new Error("Cannot move the entity; the context binding has not finished loading: "
2276
+ + oEntityContext.getBinding());
2277
+ }
2278
+ oEntity = oEntityFetchValuePromise.getResult();
2279
+
2280
+ if (!_Helper.getPrivateAnnotation(oEntity, "predicate")) {
2281
+ throw new Error("No key predicate known at " + sEntityPath);
2282
+ }
2283
+
2284
+ // add the context binding's query options as late query options
2285
+ if (!this.aggregateQueryOptions(mEntityQueryOptions, "", /*bImmutable*/true)) {
2286
+ throw new Error(oEntityContext + ": could not move the entity. Probably a list binding"
2287
+ + " w/o $$ownRequest depends on it");
2288
+ }
2289
+
2290
+ this.getRootBinding().resume();
2291
+ oEntityContext.oBinding = this;
2292
+ this.mPreviousContextsByPath[sEntityPath] = oEntityContext;
2293
+ this.oCachePromise.then(function (oCache) {
2294
+ oCache.addKeptElement(oEntity);
2295
+ // setKeepAlive looks into the cache, so this had to wait
2296
+ oEntityContext.setKeepAlive(true);
2297
+ oEntityContext.checkUpdate(); // create listeners in this binding's cache
2298
+ });
2299
+ };
2300
+
2238
2301
  /**
2239
2302
  * @override
2240
2303
  * @see sap.ui.model.odata.v4.ODataBinding#refreshInternal
@@ -2251,6 +2314,9 @@ sap.ui.define([
2251
2314
  // calls refreshInternal on all given bindings and returns an array of promises
2252
2315
  function refreshAll(aBindings) {
2253
2316
  return aBindings.map(function (oBinding) {
2317
+ if (oBinding.bIsBeingDestroyed) {
2318
+ return;
2319
+ }
2254
2320
  // Call refreshInternal with bCheckUpdate = false because property bindings
2255
2321
  // should not check for updates yet, otherwise they will cause a "Failed to
2256
2322
  // drill down..." when the row is no longer part of the collection. They get
@@ -2808,7 +2874,7 @@ sap.ui.define([
2808
2874
  * <ul>
2809
2875
  * <li> <code>grandTotal</code>: An optional boolean that tells whether a grand total for
2810
2876
  * this aggregatable property is needed (since 1.59.0); filtering by any aggregatable
2811
- * property is not supported in this case (since 1.89.0)
2877
+ * property is not supported in this case (since 1.89.0) as is "$search" (since 1.93.0)
2812
2878
  * <li> <code>subtotals</code>: An optional boolean that tells whether subtotals for this
2813
2879
  * aggregatable property are needed
2814
2880
  * <li> <code>with</code>: An optional string that provides the name of the method (for
@@ -2839,7 +2905,17 @@ sap.ui.define([
2839
2905
  * @param {string[]} [oAggregation.groupLevels]
2840
2906
  * A list of groupable property names used to determine group levels. They may, but don't need
2841
2907
  * to, be repeated in <code>oAggregation.group</code>. Group levels cannot be combined with
2842
- * filtering for aggregated properties.
2908
+ * filtering for aggregated properties or (since 1.93.0) with "$search".
2909
+ * @param {string} [oAggregation.search]
2910
+ * Like the <a
2911
+ * href="https://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part2-url-conventions.html">
2912
+ * "5.1.7 System Query Option $search"</a>, but applied before data aggregation
2913
+ * (since 1.93.0). Note that certain content will break the syntax of the system query option
2914
+ * <code>$apply</code> and result in an invalid request. If the OData service supports the
2915
+ * proposal <a href="https://issues.oasis-open.org/browse/ODATA-1452">ODATA-1452</a>, then
2916
+ * <code>ODataUtils.formatLiteral(sSearch, "Edm.String");</code> should be used to encapsulate
2917
+ * the whole search string beforehand (see {@link
2918
+ * sap.ui.model.odata.v4.ODataUtils.formatLiteral}).
2843
2919
  * @param {boolean} [oAggregation.subtotalsAtBottomOnly]
2844
2920
  * Tells whether subtotals for aggregatable properties are displayed at the bottom only, as a
2845
2921
  * separate row after all children, when a group level node is expanded (since 1.86.0);
@@ -2940,6 +3016,14 @@ sap.ui.define([
2940
3016
  && !this.mParameters.$$aggregation) {
2941
3017
  this.sChangeReason = "AddVirtualContext"; // JIRA: CPOUI5ODATAV4-848
2942
3018
  }
3019
+ if (oContext.getBinding
3020
+ && oContext.getBinding().getRootBinding().isSuspended()) {
3021
+ // when becoming suspended, remain silent until resume
3022
+ this.oContext = oContext;
3023
+ this.setResumeChangeReason(ChangeReason.Context);
3024
+
3025
+ return;
3026
+ }
2943
3027
  }
2944
3028
  // call Binding#setContext because of data state etc.; fires "change"
2945
3029
  Binding.prototype.setContext.call(this, oContext,
@@ -3010,7 +3094,9 @@ sap.ui.define([
3010
3094
  * aggregation information. Its value is
3011
3095
  * "groupby((&lt;dimension_1,...,dimension_N,unit_or_text_1,...,unit_or_text_K>),
3012
3096
  * aggregate(&lt;measure> with &lt;method> as &lt;alias>, ...))" where the "aggregate" part is
3013
- * only present if measures are given and both "with" and "as" are optional.
3097
+ * only present if measures are given and both "with" and "as" are optional. Since 1.93.0, a
3098
+ * previous "search before data aggregation" is considered (see the
3099
+ * <code>oAggregation.search</code> parameter of {@link #setAggregation}).
3014
3100
  *
3015
3101
  * @param {object[]} aAggregation
3016
3102
  * An array with objects holding the information needed for data aggregation; see also
@@ -3064,7 +3150,8 @@ sap.ui.define([
3064
3150
  ODataListBinding.prototype.updateAnalyticalInfo = function (aAggregation) {
3065
3151
  var oAggregation = {
3066
3152
  aggregate : {},
3067
- group : {}
3153
+ group : {},
3154
+ search : this.mParameters.$$aggregation && this.mParameters.$$aggregation.search
3068
3155
  },
3069
3156
  bHasMinMax = false,
3070
3157
  that = this;
@@ -3098,6 +3185,7 @@ sap.ui.define([
3098
3185
  oAggregation.group[oColumn.name] = oDetails;
3099
3186
  }
3100
3187
  });
3188
+
3101
3189
  this.bHasAnalyticalInfo = true;
3102
3190
  this.setAggregation(oAggregation);
3103
3191
  if (bHasMinMax) {
@@ -3157,4 +3245,4 @@ sap.ui.define([
3157
3245
  };
3158
3246
 
3159
3247
  return ODataListBinding;
3160
- });
3248
+ });
@@ -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.92.0
661
+ * @version 1.95.0
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