@sapui5/sap.fe.core 1.97.0 → 1.100.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 (306) hide show
  1. package/package.json +7 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +309 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +315 -0
  5. package/src/sap/fe/core/AppComponent.js +389 -397
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +198 -181
  8. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  9. package/src/sap/fe/core/BaseController.js +83 -58
  10. package/src/sap/fe/core/BaseController.ts +68 -0
  11. package/src/sap/fe/core/BusyLocker.js +105 -121
  12. package/src/sap/fe/core/BusyLocker.ts +98 -0
  13. package/src/sap/fe/core/CommonUtils.js +2164 -2379
  14. package/src/sap/fe/core/CommonUtils.ts +2177 -0
  15. package/src/sap/fe/core/ExtensionAPI.js +279 -266
  16. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  17. package/src/sap/fe/core/PageController.js +218 -125
  18. package/src/sap/fe/core/PageController.ts +129 -0
  19. package/src/sap/fe/core/RouterProxy.js +924 -807
  20. package/src/sap/fe/core/RouterProxy.ts +840 -0
  21. package/src/sap/fe/core/Synchronization.js +41 -35
  22. package/src/sap/fe/core/Synchronization.ts +29 -0
  23. package/src/sap/fe/core/TemplateComponent.js +173 -155
  24. package/src/sap/fe/core/TemplateComponent.ts +173 -0
  25. package/src/sap/fe/core/TemplateModel.js +79 -54
  26. package/src/sap/fe/core/TemplateModel.ts +63 -0
  27. package/src/sap/fe/core/TransactionHelper.js +1560 -1579
  28. package/src/sap/fe/core/TransactionHelper.ts +1717 -0
  29. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  30. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  31. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  32. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  33. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  34. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  35. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  36. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  37. package/src/sap/fe/core/actions/draft.js +521 -581
  38. package/src/sap/fe/core/actions/draft.ts +566 -0
  39. package/src/sap/fe/core/actions/messageHandling.js +564 -511
  40. package/src/sap/fe/core/actions/messageHandling.ts +552 -0
  41. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  42. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  43. package/src/sap/fe/core/actions/operations.js +1093 -1211
  44. package/src/sap/fe/core/actions/operations.ts +1192 -0
  45. package/src/sap/fe/core/actions/sticky.js +114 -104
  46. package/src/sap/fe/core/actions/sticky.ts +119 -0
  47. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +70 -66
  48. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  49. package/src/sap/fe/core/controllerextensions/EditFlow.js +1594 -1701
  50. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  51. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
  52. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  53. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +719 -505
  54. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  55. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -813
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  57. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1005 -973
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  59. package/src/sap/fe/core/controllerextensions/KPIManagement.js +530 -476
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +137 -46
  61. package/src/sap/fe/core/controllerextensions/MassEdit.js +144 -0
  62. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.js +234 -232
  64. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  65. package/src/sap/fe/core/controllerextensions/PageReady.js +302 -337
  66. package/src/sap/fe/core/controllerextensions/PageReady.ts +23 -17
  67. package/src/sap/fe/core/controllerextensions/Paginator.js +189 -148
  68. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  69. package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -146
  70. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  71. package/src/sap/fe/core/controllerextensions/Routing.js +145 -106
  72. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  73. package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
  74. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  75. package/src/sap/fe/core/controllerextensions/Share.js +220 -244
  76. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  77. package/src/sap/fe/core/controllerextensions/SideEffects.js +593 -634
  78. package/src/sap/fe/core/controllerextensions/SideEffects.ts +29 -27
  79. package/src/sap/fe/core/controllerextensions/ViewState.js +789 -806
  80. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -3
  82. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  83. package/src/sap/fe/core/controls/CommandExecution.js +68 -66
  84. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  85. package/src/sap/fe/core/controls/ConditionalWrapper.js +91 -75
  86. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  87. package/src/sap/fe/core/controls/CustomQuickViewPage.js +131 -125
  88. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  89. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +105 -110
  90. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  91. package/src/sap/fe/core/controls/FieldWrapper.js +122 -140
  92. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  93. package/src/sap/fe/core/controls/FilterBar.js +163 -159
  94. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +46 -44
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  97. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
  98. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  100. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +127 -116
  101. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  102. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -255
  103. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  104. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +151 -141
  105. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  106. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
  107. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  108. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  110. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  111. package/src/sap/fe/core/converters/ConverterContext.js +348 -367
  112. package/src/sap/fe/core/converters/ConverterContext.ts +33 -19
  113. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  114. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -1
  115. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -354
  116. package/src/sap/fe/core/converters/ManifestWrapper.ts +34 -6
  117. package/src/sap/fe/core/converters/MetaModelConverter.js +72 -9
  118. package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -16
  119. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  120. package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
  121. package/src/sap/fe/core/converters/annotations/DataField.js +28 -14
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +38 -14
  123. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  125. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  126. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  127. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  128. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  130. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -11
  131. package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -6
  132. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  133. package/src/sap/fe/core/converters/controls/Common/KPI.ts +75 -2
  134. package/src/sap/fe/core/converters/controls/Common/Table.js +507 -408
  135. package/src/sap/fe/core/converters/controls/Common/Table.ts +618 -500
  136. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +592 -0
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +718 -0
  138. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +465 -59
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +462 -72
  140. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  142. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  143. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  144. package/src/sap/fe/core/converters/helpers/Aggregation.js +118 -121
  145. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  146. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  147. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  148. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  149. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  150. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  151. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  152. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  153. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  154. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +28 -7
  155. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +23 -6
  156. package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -7
  157. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -14
  158. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  159. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  160. package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -90
  161. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  162. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  163. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  164. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  166. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  167. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  168. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  169. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  170. package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
  171. package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
  172. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  173. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  174. package/src/sap/fe/core/fpm/Component.js +51 -54
  175. package/src/sap/fe/core/fpm/Component.ts +48 -0
  176. package/src/sap/fe/core/helpers/AppStartupHelper.js +373 -0
  177. package/src/sap/fe/core/helpers/AppStartupHelper.ts +417 -0
  178. package/src/sap/fe/core/helpers/BindingExpression.js +489 -442
  179. package/src/sap/fe/core/helpers/BindingExpression.ts +486 -469
  180. package/src/sap/fe/core/helpers/ClassSupport.js +212 -76
  181. package/src/sap/fe/core/helpers/ClassSupport.ts +198 -71
  182. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
  183. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
  184. package/src/sap/fe/core/helpers/EditState.js +81 -84
  185. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  186. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  187. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  188. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  189. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  190. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  191. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  192. package/src/sap/fe/core/helpers/MassEditHelper.js +604 -0
  193. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  194. package/src/sap/fe/core/helpers/ModelHelper.js +253 -225
  195. package/src/sap/fe/core/helpers/ModelHelper.ts +250 -0
  196. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  197. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  198. package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
  199. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +334 -0
  200. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  201. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  202. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  203. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  204. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  205. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  206. package/src/sap/fe/core/library.js +427 -425
  207. package/src/sap/fe/core/library.support.js +23 -27
  208. package/src/sap/fe/core/library.support.ts +23 -0
  209. package/src/sap/fe/core/library.ts +420 -0
  210. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +64 -0
  211. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +69 -0
  212. package/src/sap/fe/core/messagebundle.properties +78 -13
  213. package/src/sap/fe/core/messagebundle_ar.properties +58 -7
  214. package/src/sap/fe/core/messagebundle_bg.properties +58 -7
  215. package/src/sap/fe/core/messagebundle_ca.properties +58 -7
  216. package/src/sap/fe/core/messagebundle_cs.properties +59 -8
  217. package/src/sap/fe/core/messagebundle_cy.properties +58 -7
  218. package/src/sap/fe/core/messagebundle_da.properties +58 -7
  219. package/src/sap/fe/core/messagebundle_de.properties +58 -7
  220. package/src/sap/fe/core/messagebundle_el.properties +58 -7
  221. package/src/sap/fe/core/messagebundle_en.properties +57 -6
  222. package/src/sap/fe/core/messagebundle_en_GB.properties +57 -6
  223. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +61 -6
  224. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +58 -7
  225. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +58 -7
  226. package/src/sap/fe/core/messagebundle_es.properties +58 -7
  227. package/src/sap/fe/core/messagebundle_es_MX.properties +58 -7
  228. package/src/sap/fe/core/messagebundle_et.properties +58 -7
  229. package/src/sap/fe/core/messagebundle_fi.properties +60 -9
  230. package/src/sap/fe/core/messagebundle_fr.properties +64 -13
  231. package/src/sap/fe/core/messagebundle_fr_CA.properties +59 -8
  232. package/src/sap/fe/core/messagebundle_hi.properties +58 -7
  233. package/src/sap/fe/core/messagebundle_hr.properties +58 -7
  234. package/src/sap/fe/core/messagebundle_hu.properties +59 -8
  235. package/src/sap/fe/core/messagebundle_id.properties +61 -10
  236. package/src/sap/fe/core/messagebundle_it.properties +58 -7
  237. package/src/sap/fe/core/messagebundle_iw.properties +58 -7
  238. package/src/sap/fe/core/messagebundle_ja.properties +58 -7
  239. package/src/sap/fe/core/messagebundle_kk.properties +58 -7
  240. package/src/sap/fe/core/messagebundle_ko.properties +58 -7
  241. package/src/sap/fe/core/messagebundle_lt.properties +58 -7
  242. package/src/sap/fe/core/messagebundle_lv.properties +59 -8
  243. package/src/sap/fe/core/messagebundle_ms.properties +58 -7
  244. package/src/sap/fe/core/messagebundle_nl.properties +58 -7
  245. package/src/sap/fe/core/messagebundle_no.properties +58 -7
  246. package/src/sap/fe/core/messagebundle_pl.properties +58 -7
  247. package/src/sap/fe/core/messagebundle_pt.properties +59 -8
  248. package/src/sap/fe/core/messagebundle_pt_PT.properties +58 -7
  249. package/src/sap/fe/core/messagebundle_ro.properties +58 -7
  250. package/src/sap/fe/core/messagebundle_ru.properties +58 -7
  251. package/src/sap/fe/core/messagebundle_sh.properties +58 -7
  252. package/src/sap/fe/core/messagebundle_sk.properties +58 -7
  253. package/src/sap/fe/core/messagebundle_sl.properties +58 -7
  254. package/src/sap/fe/core/messagebundle_sv.properties +59 -8
  255. package/src/sap/fe/core/messagebundle_th.properties +58 -7
  256. package/src/sap/fe/core/messagebundle_tr.properties +60 -9
  257. package/src/sap/fe/core/messagebundle_uk.properties +58 -7
  258. package/src/sap/fe/core/messagebundle_vi.properties +58 -7
  259. package/src/sap/fe/core/messagebundle_zh_CN.properties +58 -7
  260. package/src/sap/fe/core/messagebundle_zh_TW.properties +58 -7
  261. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  262. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  263. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
  264. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  265. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +67 -92
  266. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -6
  267. package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
  268. package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
  269. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +927 -1152
  272. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  273. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -707
  274. package/src/sap/fe/core/services/ShellServicesFactory.ts +52 -15
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +569 -637
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +78 -102
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -478
  278. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +460 -0
  279. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  280. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  281. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  282. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  283. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  284. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  285. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  286. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  287. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  288. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  289. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  290. package/src/sap/fe/core/templating/DataModelPathHelper.js +97 -127
  291. package/src/sap/fe/core/templating/DataModelPathHelper.ts +112 -135
  292. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  295. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  296. package/src/sap/fe/core/templating/FilterHelper.js +140 -78
  297. package/src/sap/fe/core/templating/FilterHelper.ts +149 -78
  298. package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
  299. package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
  300. package/src/sap/fe/core/templating/UIFormatters.js +76 -135
  301. package/src/sap/fe/core/templating/UIFormatters.ts +76 -99
  302. package/src/sap/fe/core/type/Email.js +1 -1
  303. package/src/sap/fe/core/type/Email.ts +4 -6
  304. package/ui5.yaml +0 -3
  305. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  306. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -0,0 +1,417 @@
1
+ import ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
2
+ import ODataModel from "sap/ui/model/odata/v4/ODataModel";
3
+ import Context from "sap/ui/model/odata/v4/Context";
4
+ import Filter from "sap/ui/model/Filter";
5
+ import FilterOperator from "sap/ui/model/FilterOperator";
6
+ import Router from "sap/ui/core/routing/Router";
7
+ import ModelHelper from "./ModelHelper";
8
+
9
+ type ValuedKey = {
10
+ name: string;
11
+ value: string;
12
+ };
13
+
14
+ type PageInfo = {
15
+ pattern: string;
16
+ contextPath: string;
17
+ draftMode: Boolean;
18
+ technicalKeys: ValuedKey[] | undefined;
19
+ semanticKeys: ValuedKey[] | undefined;
20
+ target: string;
21
+ pageLevel: number;
22
+ };
23
+
24
+ const AppStartupHelper = {
25
+ /**
26
+ * Retrieves a set of key values from startup parameters.
27
+ *
28
+ * @param aKeyNames The array of key names
29
+ * @param oStartupParameters The startup parameters
30
+ * @returns {any[]} An array of pairs {name, value} if all key values could be found in the startup parameters, undefined otherwise
31
+ */
32
+ _getKeysFromStartupParams: function(aKeyNames: string[], oStartupParameters: any): ValuedKey[] | undefined {
33
+ let bAllFound = true;
34
+ const aKeys = aKeyNames.map(name => {
35
+ if (oStartupParameters[name] && oStartupParameters[name].length === 1) {
36
+ return { name, value: oStartupParameters[name][0] as string };
37
+ } else {
38
+ // A unique key value couldn't be found in the startup parameters
39
+ bAllFound = false;
40
+ return { name, value: "" };
41
+ }
42
+ });
43
+
44
+ return bAllFound ? aKeys : undefined;
45
+ },
46
+
47
+ /**
48
+ * Creates a filter from a list of key values.
49
+ *
50
+ * @param aKeys Array of semantic keys or technical keys (with values)
51
+ * @param bDraftMode True if the entity supports draft mode
52
+ * @param oMetaModel The metamodel
53
+ * @returns The filter
54
+ */
55
+ _createFilterFromKeys: function(aKeys: ValuedKey[], bDraftMode: Boolean, oMetaModel: ODataMetaModel): Filter {
56
+ const bFilterCaseSensitive = ModelHelper.isFilteringCaseSensitive(oMetaModel);
57
+
58
+ let bFilterOnActiveEntity = false;
59
+ const aFilters = aKeys.map(key => {
60
+ if (key.name === "IsActiveEntity") {
61
+ bFilterOnActiveEntity = true;
62
+ }
63
+ return new Filter({
64
+ path: key.name,
65
+ operator: FilterOperator.EQ,
66
+ value1: key.value,
67
+ caseSensitive: bFilterCaseSensitive
68
+ });
69
+ });
70
+ if (bDraftMode && !bFilterOnActiveEntity) {
71
+ const oDraftFilter = new Filter({
72
+ filters: [new Filter("IsActiveEntity", "EQ", false), new Filter("SiblingEntity/IsActiveEntity", "EQ", null)],
73
+ and: false
74
+ });
75
+ aFilters.push(oDraftFilter);
76
+ }
77
+
78
+ return new Filter(aFilters, true);
79
+ },
80
+
81
+ /**
82
+ * Loads all contexts for a list of page infos.
83
+ *
84
+ * @param aStartupPages The list of page infos
85
+ * @param oModel The model used to load the contexts
86
+ * @returns A Promise for all contexts
87
+ */
88
+ _requestObjectsFromParameters: function(aStartupPages: PageInfo[], oModel: ODataModel): Promise<Context[][]> {
89
+ // Load the respective objects for all object pages found in aExternallyNavigablePages
90
+ const aContextPromises = aStartupPages.map(pageInfo => {
91
+ const aKeys = pageInfo.semanticKeys || pageInfo.technicalKeys || [];
92
+ const oFilter = this._createFilterFromKeys(aKeys, pageInfo.draftMode, oModel.getMetaModel());
93
+
94
+ // only request a minimum of fields to boost backend performance since this is only used to check if an object exists
95
+ const oListBind = oModel.bindList(pageInfo.contextPath, undefined, undefined, oFilter, {
96
+ "$select": aKeys
97
+ .map(key => {
98
+ return key.name;
99
+ })
100
+ .join(",")
101
+ } as any);
102
+ return oListBind.requestContexts(0, 2);
103
+ });
104
+
105
+ return Promise.all(aContextPromises);
106
+ },
107
+
108
+ /**
109
+ * Creates a PageInfo from a route if ti's reachable from the startup parameters.
110
+ *
111
+ * @param oRoute The route
112
+ * @param oManifestRouting The app manifest routing section
113
+ * @param oStartupParameters The startup parameters
114
+ * @param oMetaModel The app metamodel
115
+ * @returns A page info if the page is reachable, undefined otherwise
116
+ */
117
+ _getReachablePageInfoFromRoute: function(
118
+ oRoute: any,
119
+ oManifestRouting: any,
120
+ oStartupParameters: any,
121
+ oMetaModel: ODataMetaModel
122
+ ): PageInfo | undefined {
123
+ // Remove trailing ':?query:' and '/'
124
+ let sPattern: string = oRoute.pattern.replace(":?query:", "");
125
+ sPattern = sPattern.replace(/\/$/, "");
126
+
127
+ if (!sPattern) {
128
+ return undefined; // Ignore level-0 routes (ListReport)
129
+ }
130
+
131
+ sPattern = sPattern.replace(/\(\{[^\}]*\}\)/g, "(#)"); // Replace keys with #
132
+
133
+ // Get the rightmost target for this route
134
+ const sTargetName: string = Array.isArray(oRoute.target) ? oRoute.target[oRoute.target.length - 1] : oRoute.target;
135
+ const oTarget = oManifestRouting.targets[sTargetName];
136
+
137
+ const aPatternSegments = sPattern.split("/");
138
+ const pageLevel = aPatternSegments.length - 1;
139
+
140
+ if (pageLevel !== 0 && oTarget?.options?.settings?.allowDeepLinking !== true) {
141
+ // The first level of object page allows deep linking by default.
142
+ // Otherwise, the target must allow deep linking explicitely in the manifest
143
+ return undefined;
144
+ }
145
+
146
+ const sContextPath: string =
147
+ oTarget.options.settings.contextPath || (oTarget.options.settings.entitySet && "/" + oTarget.options.settings.entitySet);
148
+ const oEntityType = sContextPath && oMetaModel.getObject("/$EntityContainer" + sContextPath + "/");
149
+
150
+ if (!oEntityType) {
151
+ return undefined;
152
+ }
153
+
154
+ // Get the semantic key values for the entity
155
+ const aSemanticKeyNames: any = oMetaModel.getObject(
156
+ "/$EntityContainer" + sContextPath + "/@com.sap.vocabularies.Common.v1.SemanticKey"
157
+ );
158
+
159
+ const aSemantickKeys = aSemanticKeyNames
160
+ ? this._getKeysFromStartupParams(
161
+ aSemanticKeyNames.map((semKey: any) => {
162
+ return semKey.$PropertyPath as string;
163
+ }),
164
+ oStartupParameters
165
+ )
166
+ : undefined;
167
+
168
+ // Get the technical keys only if we couldn't find the semantic key values, and on first level OP
169
+ const aTechnicalKeys =
170
+ !aSemantickKeys && pageLevel === 0 ? this._getKeysFromStartupParams(oEntityType["$Key"], oStartupParameters) : undefined;
171
+
172
+ if (aSemantickKeys === undefined && aTechnicalKeys === undefined) {
173
+ // We couldn't find the semantic/technical keys in the startup parameters
174
+ return undefined;
175
+ }
176
+
177
+ // The startup parameters contain values for all semantic keys (or technical keys) --> we can store the page info in the corresponding level
178
+ const draftMode =
179
+ oMetaModel.getObject("/$EntityContainer" + sContextPath + "@com.sap.vocabularies.Common.v1.DraftRoot") ||
180
+ oMetaModel.getObject("/$EntityContainer" + sContextPath + "@com.sap.vocabularies.Common.v1.DraftNode")
181
+ ? true
182
+ : false;
183
+
184
+ return {
185
+ pattern: sPattern,
186
+ contextPath: sContextPath,
187
+ draftMode,
188
+ technicalKeys: aTechnicalKeys,
189
+ semanticKeys: aSemantickKeys,
190
+ target: sTargetName,
191
+ pageLevel
192
+ };
193
+ },
194
+
195
+ /**
196
+ * Returns the list of all pages that allow deeplink and that can be reached using the startup parameters.
197
+ *
198
+ * @param oManifestRouting The routing information from the app manifest
199
+ * @param oStartupParameters The startup parameters
200
+ * @param oMetaModel The metamodel
201
+ * @returns
202
+ */
203
+ _getReachablePages: function(oManifestRouting: any, oStartupParameters: any, oMetaModel: ODataMetaModel): PageInfo[][] {
204
+ const aRoutes: any[] = oManifestRouting.routes;
205
+ const mPagesByLevel: Record<number, PageInfo[]> = {};
206
+
207
+ aRoutes.forEach(oRoute => {
208
+ const oPageInfo = this._getReachablePageInfoFromRoute(oRoute, oManifestRouting, oStartupParameters, oMetaModel);
209
+
210
+ if (oPageInfo) {
211
+ if (!mPagesByLevel[oPageInfo.pageLevel]) {
212
+ mPagesByLevel[oPageInfo.pageLevel] = [];
213
+ }
214
+ mPagesByLevel[oPageInfo.pageLevel].push(oPageInfo);
215
+ }
216
+ });
217
+
218
+ // A page is reachable only if all its parents are also reachable
219
+ // So if we couldn't find any pages for a given level, all pages with a higher level won't be reachable anyway
220
+ const aReachablePages: PageInfo[][] = [];
221
+ let level = 0;
222
+ while (mPagesByLevel[level]) {
223
+ aReachablePages.push(mPagesByLevel[level]);
224
+ level++;
225
+ }
226
+
227
+ return aReachablePages;
228
+ },
229
+
230
+ /**
231
+ * Get the list of startup pages.
232
+ *
233
+ * @param oManifestRouting The routing information from the app manifest
234
+ * @param oStartupParameters The startup parameters
235
+ * @param oMetaModel The metamodel
236
+ * @returns An array of startup page infos
237
+ */
238
+ _getStartupPagesFromStartupParams: function(oManifestRouting: any, oStartupParameters: any, oMetaModel: ODataMetaModel): PageInfo[] {
239
+ // Find all pages that can be reached with the startup parameters
240
+ const aReachablePages = this._getReachablePages(oManifestRouting, oStartupParameters, oMetaModel);
241
+
242
+ if (aReachablePages.length === 0) {
243
+ return [];
244
+ }
245
+
246
+ // Find the longest sequence of pages that can be reached (recursively)
247
+ let result: PageInfo[] = [];
248
+ const current: PageInfo[] = [];
249
+
250
+ function findRecursive(level: number) {
251
+ const aCurrentLevelPages = aReachablePages[level];
252
+ const lastPage = current.length ? current[current.length - 1] : undefined;
253
+
254
+ if (aCurrentLevelPages) {
255
+ aCurrentLevelPages.forEach(function(nextPage) {
256
+ if (!lastPage || nextPage.pattern.indexOf(lastPage.pattern) === 0) {
257
+ // We only consider pages that can be reached from the page at the previous level,
258
+ // --> their pattern must be the pattern of the previous page with another segment appended
259
+ current.push(nextPage);
260
+ findRecursive(level + 1);
261
+ current.pop();
262
+ }
263
+ });
264
+ }
265
+ if (current.length > result.length) {
266
+ result = current.slice(); // We have found a sequence longer than our previous best --> store it as the new longest
267
+ }
268
+ }
269
+
270
+ findRecursive(0);
271
+
272
+ return result;
273
+ },
274
+
275
+ /**
276
+ * Creates the startup object from the list of pages and contexts.
277
+ *
278
+ * @param aStartupPages The pages
279
+ * @param aContexts The contexts
280
+ * @returns An object containing either a hash or a context to navigate to, or an empty object if no deep link was found
281
+ */
282
+ _getDeepLinkObject: function(aStartupPages: PageInfo[], aContexts: Context[]): { hash?: string; context?: Context } {
283
+ if (aContexts.length === 1) {
284
+ return { context: aContexts[0] };
285
+ } else if (aContexts.length > 1) {
286
+ // Navigation to a deeper level --> use the pattern of the deepest object page
287
+ // and replace the parameters by the ID from the contexts
288
+ let hash = aStartupPages[aStartupPages.length - 1].pattern;
289
+ aContexts.forEach(function(oContext) {
290
+ hash = hash.replace("(#)", "(" + oContext.getPath().split("(")[1]);
291
+ });
292
+
293
+ return { hash };
294
+ } else {
295
+ return {};
296
+ }
297
+ },
298
+
299
+ /**
300
+ * Calculates startup parameters for a deeplink case, from startup parameters and routing infoirmation.
301
+ *
302
+ * @param oManifestRouting The routing information from the app manifest
303
+ * @param oStartupParameters The startup parameters
304
+ * @param oModel The OData model
305
+ * @returns An object containing either a hash or a context to navigate to, or an empty object if no deep link was found
306
+ */
307
+ getDeepLinkStartupHash: function(
308
+ oManifestRouting: any,
309
+ oStartupParameters: any,
310
+ oModel: ODataModel
311
+ ): Promise<{ hash?: string; context?: Context }> {
312
+ let aStartupPages: PageInfo[];
313
+
314
+ return oModel
315
+ .getMetaModel()
316
+ .requestObject("/$EntityContainer/")
317
+ .then(() => {
318
+ // Check if semantic keys are present in url parameters for every object page at each level
319
+ aStartupPages = this._getStartupPagesFromStartupParams(oManifestRouting, oStartupParameters, oModel.getMetaModel());
320
+
321
+ return this._requestObjectsFromParameters(aStartupPages, oModel);
322
+ })
323
+ .then((aValues: Context[][]) => {
324
+ if (aValues.length) {
325
+ // Make sure we only get 1 context per promise, and flatten the array
326
+ const aContexts: Context[] = [];
327
+ aValues.forEach(function(aFoundContexts) {
328
+ if (aFoundContexts.length === 1) {
329
+ aContexts.push(aFoundContexts[0]);
330
+ }
331
+ });
332
+
333
+ return aContexts.length === aValues.length ? this._getDeepLinkObject(aStartupPages, aContexts) : {};
334
+ } else {
335
+ return {};
336
+ }
337
+ });
338
+ },
339
+
340
+ /**
341
+ * Calculates the new hash based on the startup parameters.
342
+ *
343
+ * @param oStartupParameters The startup parameter values (map parameter name -> array of values)
344
+ * @param sContextPath The context path for the startup of the app (generally the path to the main entity set)
345
+ * @param oRouter The router instance
346
+ * @param oMetaModel The meta model
347
+ * @returns A promise containing the hash to navigate to, or an empty string if there's no need to navigate
348
+ */
349
+ getCreateStartupHash: function(
350
+ oStartupParameters: any,
351
+ sContextPath: string,
352
+ oRouter: Router,
353
+ oMetaModel: ODataMetaModel
354
+ ): Promise<String> {
355
+ return oMetaModel.requestObject(sContextPath + "@").then((oEntitySetAnnotations: any) => {
356
+ let sMetaPath = "";
357
+ let bCreatable = true;
358
+
359
+ if (
360
+ oEntitySetAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"] &&
361
+ oEntitySetAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"]["NewAction"]
362
+ ) {
363
+ sMetaPath = sContextPath + "@com.sap.vocabularies.Common.v1.DraftRoot/NewAction@Org.OData.Core.V1.OperationAvailable";
364
+ } else if (
365
+ oEntitySetAnnotations["@com.sap.vocabularies.Session.v1.StickySessionSupported"] &&
366
+ oEntitySetAnnotations["@com.sap.vocabularies.Session.v1.StickySessionSupported"]["NewAction"]
367
+ ) {
368
+ sMetaPath =
369
+ sContextPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/NewAction@Org.OData.Core.V1.OperationAvailable";
370
+ }
371
+
372
+ if (sMetaPath) {
373
+ const bNewActionOperationAvailable = oMetaModel.getObject(sMetaPath);
374
+ if (bNewActionOperationAvailable === false) {
375
+ bCreatable = false;
376
+ }
377
+ } else {
378
+ const oInsertRestrictions = oEntitySetAnnotations["@Org.OData.Capabilities.V1.InsertRestrictions"];
379
+ if (oInsertRestrictions && oInsertRestrictions.Insertable === false) {
380
+ bCreatable = false;
381
+ }
382
+ }
383
+ if (bCreatable) {
384
+ return this.getDefaultCreateHash(oStartupParameters, sContextPath, oRouter);
385
+ } else {
386
+ return "";
387
+ }
388
+ });
389
+ },
390
+
391
+ /**
392
+ * Calculates the hash to create a new object.
393
+ *
394
+ * @param oStartupParameters The startup parameter values (map parameter name -> array of values)
395
+ * @param sContextPath The context path of the entity set to be used for the creation
396
+ * @param oRouter The router instance
397
+ * @returns The hash
398
+ */
399
+ getDefaultCreateHash: function(oStartupParameters: any, sContextPath: string, oRouter: Router): string {
400
+ let sDefaultCreateHash =
401
+ oStartupParameters && oStartupParameters.preferredMode ? (oStartupParameters.preferredMode[0] as string) : "create";
402
+ let sHash = "";
403
+
404
+ sDefaultCreateHash =
405
+ sDefaultCreateHash.indexOf(":") !== -1 && sDefaultCreateHash.length > sDefaultCreateHash.indexOf(":") + 1
406
+ ? sDefaultCreateHash.substr(0, sDefaultCreateHash.indexOf(":"))
407
+ : "create";
408
+ sHash = sContextPath.substring(1) + "(...)?i-action=" + sDefaultCreateHash;
409
+ if (oRouter.getRouteInfoByHash(sHash)) {
410
+ return sHash;
411
+ } else {
412
+ throw new Error("No route match for creating a new " + sContextPath.substring(1));
413
+ }
414
+ }
415
+ };
416
+
417
+ export default AppStartupHelper;