@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,250 @@
1
+ /* This class contains helpers to be used at runtime to retrieve further information on the model */
2
+ import Context from "sap/ui/model/odata/v4/Context";
3
+ import BaseContext from "sap/ui/model/Context";
4
+ import ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
5
+
6
+ const ModelHelper = {
7
+ /**
8
+ * Method to determine if the programming model is sticky.
9
+ *
10
+ * @function
11
+ * @name isStickySessionSupported
12
+ * @param {sap.ui.model.odata.v4.ODataMetaModel} oMetaModel ODataModelMetaModel to check for sticky enabled entity
13
+ * @returns {boolean} Returns true if sticky, else false
14
+ */
15
+ isStickySessionSupported: function(oMetaModel: ODataMetaModel) {
16
+ const oEntityContainer = oMetaModel.getObject("/");
17
+ for (const sEntitySet in oEntityContainer) {
18
+ if (
19
+ oEntityContainer[sEntitySet].$kind === "EntitySet" &&
20
+ oMetaModel.getObject(`/${sEntitySet}@com.sap.vocabularies.Session.v1.StickySessionSupported`)
21
+ ) {
22
+ return true;
23
+ }
24
+ }
25
+ return false;
26
+ },
27
+
28
+ /**
29
+ * Method to determine if the programming model is draft.
30
+ *
31
+ * @function
32
+ * @name isDraftSupported
33
+ * @param {sap.ui.model.odata.v4.MetaModel} oMetaModel ODataModelMetaModel of the context for which draft support shall be checked
34
+ * @param {string} sPath Path for which draft support shall be checked
35
+ * @returns {boolean} Returns true if draft, else false
36
+ */
37
+ isDraftSupported: function(oMetaModel: any, sPath: string) {
38
+ const oMetaContext = oMetaModel.getMetaContext(sPath);
39
+ let sTargetEntitySet = this.getTargetEntitySet(oMetaContext),
40
+ oParentEntitySetContext,
41
+ aParts;
42
+
43
+ if (oMetaContext.getProperty && oMetaContext.getProperty() && oMetaContext.getProperty().$ContainsTarget === true) {
44
+ aParts = oMetaModel
45
+ .getMetaPath(sPath)
46
+ .split("/")
47
+ .filter(Boolean);
48
+ if (aParts.length) {
49
+ for (let i = aParts.length - 1; i >= 0; i--) {
50
+ oParentEntitySetContext = oMetaModel.getMetaContext(oMetaModel.getMetaPath("/" + aParts[i]));
51
+ if (oParentEntitySetContext.getObject("$kind") === "EntitySet") {
52
+ sTargetEntitySet = this.getTargetEntitySet(oParentEntitySetContext);
53
+ break;
54
+ }
55
+ }
56
+ }
57
+ } else {
58
+ sTargetEntitySet = this.getTargetEntitySet(oMetaContext);
59
+ }
60
+ const oEntityContext = oMetaModel.getMetaContext(sTargetEntitySet);
61
+ if (
62
+ oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftRoot") ||
63
+ oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftNode")
64
+ ) {
65
+ return true;
66
+ }
67
+ return false;
68
+ },
69
+
70
+ /**
71
+ * Method to determine if the service, supports collaboration draft.
72
+ *
73
+ * @function
74
+ * @name isCollaborationDraftSupported
75
+ * @param {object} metaObject MetaObject to be used for determination
76
+ * @param {object} templateInterface API provided by UI5 templating if used
77
+ * @returns {boolean} Returns true if the service supports collaboration draft, else false
78
+ */
79
+ isCollaborationDraftSupported: function(metaObject: any, templateInterface?: any) {
80
+ const oMetaModel = (templateInterface?.context?.getModel() || metaObject) as ODataMetaModel;
81
+ const oEntityContainer = oMetaModel.getObject("/");
82
+ for (const sEntitySet in oEntityContainer) {
83
+ if (
84
+ oEntityContainer[sEntitySet].$kind === "EntitySet" &&
85
+ oMetaModel.getObject("/" + sEntitySet + "@com.sap.vocabularies.Common.v1.DraftRoot/ShareAction")
86
+ ) {
87
+ return true;
88
+ }
89
+ }
90
+ return false;
91
+ },
92
+
93
+ /**
94
+ * Returns path to the target entity set via using navigation property binding.
95
+ *
96
+ * @function
97
+ * @name getTargetEntitySet
98
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the target entity set shall be determined
99
+ * @returns {string} Returns path to the target entity set
100
+ */
101
+ getTargetEntitySet: function(oContext: Context) {
102
+ const sPath = oContext.getPath();
103
+ if (
104
+ oContext.getObject("$kind") === "EntitySet" ||
105
+ oContext.getObject("$kind") === "Action" ||
106
+ oContext.getObject("0/$kind") === "Action"
107
+ ) {
108
+ return sPath;
109
+ }
110
+ const sEntitySetPath = ModelHelper.getEntitySetPath(sPath);
111
+ return "/" + oContext.getObject(sEntitySetPath);
112
+ },
113
+
114
+ /**
115
+ * Returns complete path to the entity set via using navigation property binding.
116
+ *
117
+ * @function
118
+ * @name getEntitySetPath
119
+ * @param {string} sPath Path for which complete entitySet path needs to be determined
120
+ * @returns {string} Returns complete path to the entity set
121
+ */
122
+ getEntitySetPath: function(sPath: string) {
123
+ return (
124
+ "/" +
125
+ sPath
126
+ .split("/")
127
+ .filter(ModelHelper.filterOutNavPropBinding)
128
+ .join("/$NavigationPropertyBinding/")
129
+ );
130
+ },
131
+
132
+ /**
133
+ * Gets the path for the items property of MultiValueField parameters.
134
+ *
135
+ * @function
136
+ * @name getActionParameterItemsModelPath
137
+ * @param {object} oParameter Action Parameter
138
+ * @returns {string} Returns the complete model path for the items property of MultiValueField parameters
139
+ */
140
+ getActionParameterItemsModelPath: function(oParameter: any) {
141
+ return oParameter && oParameter.$Name ? `{path: 'mvfview>/${oParameter.$Name}'}` : undefined;
142
+ },
143
+
144
+ filterOutNavPropBinding: function(sPathPart: any) {
145
+ return sPathPart !== "" && sPathPart !== "$NavigationPropertyBinding";
146
+ },
147
+
148
+ /**
149
+ * Adds a setProperty to the created binding contexts of the internal JSON model.
150
+ *
151
+ * @function
152
+ * @name enhanceInternalJSONModel
153
+ * @param {sap.ui.model.json.JSONModel} Internal JSON Model which is enhanced
154
+ */
155
+
156
+ enhanceInternalJSONModel: function(oInternalModel: any) {
157
+ const fnBindContext = oInternalModel.bindContext;
158
+ oInternalModel.bindContext = function(sPath: any, oContext: any, mParameters: any, ...args: any[]) {
159
+ oContext = fnBindContext.apply(this, [sPath, oContext, mParameters, ...args]);
160
+ const fnGetBoundContext = oContext.getBoundContext;
161
+
162
+ oContext.getBoundContext = function(...subArgs: any[]) {
163
+ const oBoundContext = fnGetBoundContext.apply(this, ...subArgs);
164
+ if (oBoundContext && !oBoundContext.setProperty) {
165
+ oBoundContext.setProperty = function(sSetPropPath: any, value: any) {
166
+ if (this.getObject() === undefined) {
167
+ // initialize
168
+ this.getModel().setProperty(this.getPath(), {});
169
+ }
170
+ this.getModel().setProperty(sSetPropPath, value, this);
171
+ };
172
+ }
173
+ return oBoundContext;
174
+ };
175
+ return oContext;
176
+ };
177
+ },
178
+
179
+ /**
180
+ * Returns whether filtering on the table is case sensitive.
181
+ *
182
+ * @param oMetaModel The instance of the meta model
183
+ * @returns {boolean|undefined} Returns 'false' if FilterFunctions annotation supports 'tolower', else 'true'
184
+ */
185
+ isFilteringCaseSensitive: function(oMetaModel: any) {
186
+ if (!oMetaModel) {
187
+ return undefined;
188
+ }
189
+ const aFilterFunctions = oMetaModel.getObject("/@Org.OData.Capabilities.V1.FilterFunctions");
190
+ // Get filter functions defined at EntityContainer and check for existence of 'tolower'
191
+ return aFilterFunctions ? aFilterFunctions.indexOf("tolower") === -1 : true;
192
+ },
193
+
194
+ /**
195
+ * Get MetaPath for the context.
196
+ *
197
+ * @param {Context} oContext Context to be used
198
+ * @returns {string | undefined} Returns meta path for the context.
199
+ */
200
+ getMetaPathForContext: function(oContext: any) {
201
+ const oModel = oContext.getModel(),
202
+ oMetaModel = oModel.getMetaModel(),
203
+ sPath = oContext.getPath();
204
+ return oMetaModel && sPath && oMetaModel.getMetaPath(sPath);
205
+ },
206
+
207
+ /**
208
+ * Get MetaPath for the listbinding.
209
+ *
210
+ * @param {View} oView View of the control using listBinding
211
+ * @param {ODataListBinding | string} vListBinding ODataListBinding object or the binding path for a temporary list binding
212
+ * @returns {string | undefined} Returns meta path for the listbinding.
213
+ */
214
+ getAbsoluteMetaPathForListBinding: function(oView: any, vListBinding: any) {
215
+ const oMetaModel = oView.getModel().getMetaModel();
216
+ let sMetaPath;
217
+
218
+ if (typeof vListBinding === "string") {
219
+ if (vListBinding.startsWith("/")) {
220
+ // absolute path
221
+ sMetaPath = oMetaModel.getMetaPath(vListBinding);
222
+ } else {
223
+ // relative path
224
+ const oBindingContext = oView.getBindingContext();
225
+ const sRootContextPath = oBindingContext.getPath();
226
+ sMetaPath = oMetaModel.getMetaPath(`${sRootContextPath}/${vListBinding}`);
227
+ }
228
+ } else {
229
+ // we already get a list binding use this one
230
+ const oBinding = vListBinding;
231
+ const oRootBinding = oBinding.getRootBinding();
232
+ if (oBinding === oRootBinding) {
233
+ // absolute path
234
+ sMetaPath = oMetaModel.getMetaPath(oBinding.getPath());
235
+ } else {
236
+ // relative path
237
+ const sRootBindingPath = oRootBinding.getPath();
238
+ const sRelativePath = oBinding.getPath();
239
+ sMetaPath = oMetaModel.getMetaPath(`${sRootBindingPath}/${sRelativePath}`);
240
+ }
241
+ }
242
+ return sMetaPath;
243
+ }
244
+ };
245
+
246
+ export type InternalModelContext = BaseContext & {
247
+ setProperty(sPath: string, vValue: any): void;
248
+ };
249
+
250
+ export default ModelHelper;
@@ -1,135 +1,213 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
+ sap.ui.define(["sap/ui/core/util/PasteHelper", "sap/m/MessageBox", "sap/base/Log"], function (CorePasteHelper, MessageBox, Log) {
6
+ "use strict";
5
7
 
6
- sap.ui.define(["sap/ui/core/util/PasteHelper", "sap/m/MessageBox"], function(CorePasteHelper, MessageBox) {
7
- "use strict";
8
-
9
- var _createColumnInfoPerProperty = function(sPropertyPath, sRowBindingPath, oMetaContext, oMetaModel) {
10
- var oProperty = oMetaContext.getProperty(sPropertyPath),
11
- mFormatOptions = { parseKeepsEmptyString: true },
12
- oType = oMetaModel.getUI5Type(sRowBindingPath + "/" + sPropertyPath, mFormatOptions),
13
- bIgnore = !oProperty || oMetaContext.getProperty(sPropertyPath + "@Org.OData.Core.V1.Computed");
14
- return {
15
- property: sPropertyPath,
16
- ignore: bIgnore,
17
- type: oType
18
- };
19
- };
20
-
21
- var _getColumnInfoForPaste = function(oTable) {
22
- var oModel = oTable.getRowBinding().getModel(),
23
- oMetaModel = oModel.getMetaModel(),
24
- sRowBindingPath = oModel.resolve(oTable.getRowBinding().getPath(), oTable.getRowBinding().getContext()),
25
- oMetaContext = oMetaModel.getMetaContext(sRowBindingPath);
26
- return oTable
27
- .getControlDelegate()
28
- .fetchProperties(oTable)
29
- .then(function(aPropertyInfo) {
30
- var aColumnInfos = [];
31
- oTable.getColumns().forEach(function(oColumn) {
32
- var oInfoProperty = aPropertyInfo.find(function(property) {
33
- return property.name === oColumn.getDataProperty();
34
- });
35
- // Check if it's a complex property (property associated to multiple simple properties)
36
- if (oInfoProperty.propertyInfos) {
37
- oInfoProperty.propertyInfos.forEach(function(property) {
38
- // Get data from simple property
39
- var oDataProperty = aPropertyInfo.find(function(prop) {
40
- return prop.name === property;
41
- });
42
-
43
- // Check if there is a simple property associated to a Rating or Progress ComplexProperty --> ignore
44
- // Or check a navigation property within the current Complex property --> ignore
45
- // A fake property was created into the propertyInfos to include the Target Value
46
- // from the DataPoint (path includes the @com.sap.vocabularies.UI.v1.DataPoint annotation)
47
- if (
48
- (oDataProperty && oDataProperty.path.indexOf("@com.sap.vocabularies.UI.v1.DataPoint") > -1) ||
49
- property.indexOf("/") > -1
50
- ) {
51
- aColumnInfos.push({
52
- property: oDataProperty.path,
53
- ignore: true
54
- });
55
- } else {
56
- aColumnInfos.push(
57
- _createColumnInfoPerProperty(oDataProperty.path, sRowBindingPath, oMetaContext, oMetaModel)
58
- );
59
- }
60
- });
61
- } else if (oInfoProperty.path) {
62
- aColumnInfos.push(_createColumnInfoPerProperty(oInfoProperty.path, sRowBindingPath, oMetaContext, oMetaModel));
63
- } else {
64
- // Empty column --> ignore
65
- aColumnInfos.push({
66
- property: "unused",
67
- type: null,
68
- ignore: true
69
- });
70
- }
71
- });
72
- return aColumnInfos;
73
- });
74
- };
75
-
76
- var oPasteHelper = {
77
- /**
78
- *
79
- * @param aRawData
80
- * @param oTable
81
- * @returns {Promise<any>}
82
- */
83
- parseDataForTablePaste: function(aRawData, oTable) {
84
- return _getColumnInfoForPaste(oTable).then(function(oPasteInfos) {
85
- // Check if we have data for at least the first editable column
86
- var iPastedColumnCount = aRawData.length ? aRawData[0].length : 0;
87
- var iFirstEditableColumn = -1;
88
- for (var I = 0; I < oPasteInfos.length && iFirstEditableColumn < 0; I++) {
89
- if (!oPasteInfos[I].ignore) {
90
- iFirstEditableColumn = I;
91
- }
92
- }
93
- if (iFirstEditableColumn < 0 || iFirstEditableColumn > iPastedColumnCount - 1) {
94
- // We don't have data for an editable column --> return empty parsed data
95
- return Promise.resolve([]);
96
- } else {
97
- return CorePasteHelper.parse(aRawData, oPasteInfos).then(function(oParseResult) {
98
- if (oParseResult.errors) {
99
- var aErrorMessages = oParseResult.errors.map(function(oElement) {
100
- return oElement.message;
101
- });
102
-
103
- var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
104
- sPasteError,
105
- sErrorCorrection = oResourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_CORRECTION_MESSAGE"),
106
- sNote = oResourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_CORRECTION_NOTE");
107
-
108
- if (aErrorMessages.length > 1) {
109
- sPasteError = oResourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_MESSAGE_PLURAL", [
110
- aErrorMessages.length
111
- ]);
112
- } else {
113
- sPasteError = oResourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_MESSAGE_SINGULAR");
114
- }
115
- aErrorMessages.unshift(""); // To show space between the short text and the list of errors
116
- aErrorMessages.unshift(sNote);
117
- aErrorMessages.unshift(sErrorCorrection);
118
- MessageBox.error(sPasteError, {
119
- icon: MessageBox.Icon.ERROR,
120
- title: oResourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR"),
121
- details: aErrorMessages.join("<br>")
122
- });
123
-
124
- return []; // Errors --> return nothing
125
- } else {
126
- return oParseResult.parsedData ? oParseResult.parsedData : [];
127
- }
128
- });
129
- }
130
- });
131
- }
132
- };
133
-
134
- return oPasteHelper;
135
- });
8
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
+
10
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
11
+
12
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
+
14
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
15
+
16
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
17
+
18
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
19
+
20
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
21
+
22
+ var getInfoForEntityProperty = function (propertyPath, rowBindingPath, metaContext, metaModel) {
23
+ var property = metaContext.getProperty(propertyPath),
24
+ formatOptions = {
25
+ parseKeepsEmptyString: true
26
+ },
27
+ type = metaModel.getUI5Type("".concat(rowBindingPath, "/").concat(propertyPath), formatOptions),
28
+ isIgnored = !property || metaContext.getProperty(propertyPath + "@Org.OData.Core.V1.Computed");
29
+ return {
30
+ property: propertyPath,
31
+ ignore: isIgnored,
32
+ type: type
33
+ };
34
+ };
35
+
36
+ var displayErrorMessages = function (errorMessages) {
37
+ var messageDetails = _toConsumableArray(errorMessages);
38
+
39
+ var resourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
40
+ errorCorrectionMessage = resourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_CORRECTION_MESSAGE"),
41
+ noteMessage = resourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_CORRECTION_NOTE");
42
+ var pasteErrorMessage;
43
+
44
+ if (messageDetails.length > 1) {
45
+ pasteErrorMessage = resourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_MESSAGE_PLURAL", [messageDetails.length]);
46
+ } else {
47
+ pasteErrorMessage = resourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_MESSAGE_SINGULAR");
48
+ }
49
+
50
+ messageDetails.unshift(""); // To show space between the short text and the list of errors
51
+
52
+ messageDetails.unshift(noteMessage);
53
+ messageDetails.unshift(errorCorrectionMessage);
54
+ MessageBox.error(pasteErrorMessage, {
55
+ title: resourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR"),
56
+ details: messageDetails.join("<br>")
57
+ });
58
+ };
59
+
60
+ var PasteHelper = {
61
+ displayErrorMessages: displayErrorMessages,
62
+ formatCustomMessage: function (validationMessages, iRowNumber) {
63
+ var errorMessage = "";
64
+ var numberMessages = validationMessages.length;
65
+ var resourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
66
+ i18nRow = resourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW");
67
+
68
+ if (numberMessages > 0) {
69
+ errorMessage += "".concat(i18nRow, " ").concat(iRowNumber, ": ");
70
+ validationMessages.forEach(function (message, indexMessage) {
71
+ if (message.messageText) {
72
+ errorMessage += message.messageText + (indexMessage + 1 !== numberMessages ? " " : "");
73
+ }
74
+ });
75
+ }
76
+
77
+ return errorMessage;
78
+ },
79
+ getColumnInfo: function (table) {
80
+ var _this = this;
81
+
82
+ var model = table.getRowBinding().getModel(),
83
+ metaModel = model.getMetaModel(),
84
+ rowBindingPath = model.resolve(table.getRowBinding().getPath(), table.getRowBinding().getContext()),
85
+ metaContext = metaModel.getMetaContext(rowBindingPath);
86
+ return table.getControlDelegate().fetchProperties(table).then(function (propertyInfo) {
87
+ var PropertyInfoDict = Object.assign.apply(Object, [{}].concat(_toConsumableArray(propertyInfo.map(function (property) {
88
+ return _defineProperty({}, property.name, property);
89
+ }))));
90
+ var columnInfos = [];
91
+ table.getColumns().forEach(function (column) {
92
+ var infoProperty = PropertyInfoDict[column.getDataProperty()]; // Check if it's a complex property (property associated to multiple simple properties)
93
+
94
+ if (infoProperty.propertyInfos) {
95
+ // Get data from simple property
96
+ infoProperty.propertyInfos.forEach(function (property) {
97
+ var dataProperty = PropertyInfoDict[property]; // Check if there is a simple property associated to a Rating or Progress ComplexProperty --> ignore
98
+ // Or check a navigation property within the current Complex property --> ignore
99
+ // A fake property was created into the propertyInfos to include the Target Value
100
+ // from the DataPoint (path includes the @com.sap.vocabularies.UI.v1.DataPoint annotation)
101
+
102
+ if (dataProperty && dataProperty.path.indexOf("@com.sap.vocabularies.UI.v1.DataPoint") > -1 || property.indexOf("/") > -1) {
103
+ columnInfos.push({
104
+ property: dataProperty.path,
105
+ ignore: true
106
+ });
107
+ } else {
108
+ columnInfos.push(_this.getInfoForEntityProperty(dataProperty.path, rowBindingPath, metaContext, metaModel));
109
+ }
110
+ });
111
+ } else if (infoProperty.path) {
112
+ columnInfos.push(_this.getInfoForEntityProperty(infoProperty.path, rowBindingPath, metaContext, metaModel));
113
+ } else {
114
+ // Empty column --> ignore
115
+ columnInfos.push({
116
+ property: "unused",
117
+ type: null,
118
+ ignore: true
119
+ });
120
+ }
121
+ });
122
+ return columnInfos;
123
+ });
124
+ },
125
+ getInfoForEntityProperty: getInfoForEntityProperty,
126
+
127
+ /**
128
+ *
129
+ * @param rawData
130
+ * @param table
131
+ * @returns {Promise<any>}
132
+ */
133
+ parsePastedData: function (rawData, table) {
134
+ var _this2 = this;
135
+
136
+ return this.getColumnInfo(table).then(function (pasteInfos) {
137
+ // Check if we have data for at least the first editable column
138
+ var pastedColumnCount = rawData.length ? rawData[0].length : 0;
139
+ var firstEditableColumnIndex = -1;
140
+
141
+ for (var I = 0; I < pasteInfos.length && firstEditableColumnIndex < 0; I++) {
142
+ if (!pasteInfos[I].ignore) {
143
+ firstEditableColumnIndex = I;
144
+ }
145
+ }
146
+
147
+ return firstEditableColumnIndex < 0 || firstEditableColumnIndex > pastedColumnCount - 1 ? Promise.resolve({}) // We don't have data for an editable column --> return empty parsed data
148
+ : CorePasteHelper.parse(rawData, pasteInfos);
149
+ }).then(function (parseResult) {
150
+ if (parseResult.errors) {
151
+ var errorMessages = parseResult.errors.map(function (oElement) {
152
+ return oElement.message;
153
+ });
154
+
155
+ _this2.displayErrorMessages(errorMessages);
156
+
157
+ return []; // Errors --> return nothing
158
+ } else {
159
+ return parseResult.parsedData ? parseResult.parsedData : [];
160
+ }
161
+ });
162
+ },
163
+ pasteData: function (rawData, table, controller) {
164
+ var _this3 = this;
165
+
166
+ var oInternalEditFlow = controller._editFlow;
167
+ var tableDefinition = table.getParent().getTableDefinition();
168
+ var aData = [];
169
+ return this.parsePastedData(rawData, table).then(function (aParsedData) {
170
+ aData = aParsedData || [];
171
+ return Promise.all(aData.map(function (mData) {
172
+ var _tableDefinition$cont;
173
+
174
+ return oInternalEditFlow.getTransactionHelper().validateDocument(table.getBindingContext(), {
175
+ data: mData,
176
+ customValidationFunction: tableDefinition === null || tableDefinition === void 0 ? void 0 : (_tableDefinition$cont = tableDefinition.control) === null || _tableDefinition$cont === void 0 ? void 0 : _tableDefinition$cont.customValidationFunction
177
+ }, controller.getView());
178
+ }));
179
+ }).then(function (aValidationMessages) {
180
+ var aErrorMessages = aValidationMessages.reduce(function (aMessages, aCustomMessages, index) {
181
+ if (aCustomMessages.length > 0) {
182
+ aMessages.push({
183
+ messages: aCustomMessages,
184
+ row: index + 1
185
+ });
186
+ }
187
+
188
+ return aMessages;
189
+ }, []);
190
+
191
+ if (aErrorMessages.length > 0) {
192
+ var aRowMessages = aErrorMessages.map(function (mError) {
193
+ return _this3.formatCustomMessage(mError.messages, mError.row);
194
+ });
195
+
196
+ _this3.displayErrorMessages(aRowMessages);
197
+
198
+ return [];
199
+ }
200
+
201
+ return aData;
202
+ }).then(function (aValidatedData) {
203
+ var _tableDefinition$cont2;
204
+
205
+ return aValidatedData.length > 0 ? oInternalEditFlow.createMultipleDocuments(table.getRowBinding(), aValidatedData, tableDefinition === null || tableDefinition === void 0 ? void 0 : (_tableDefinition$cont2 = tableDefinition.control) === null || _tableDefinition$cont2 === void 0 ? void 0 : _tableDefinition$cont2.createAtEnd, true, controller.editFlow.onBeforeCreate) : undefined;
206
+ }).catch(function (oError) {
207
+ Log.error("Error while pasting data", oError);
208
+ });
209
+ }
210
+ };
211
+ return PasteHelper;
212
+ }, false);
213
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlBhc3RlSGVscGVyLnRzIl0sIm5hbWVzIjpbImdldEluZm9Gb3JFbnRpdHlQcm9wZXJ0eSIsInByb3BlcnR5UGF0aCIsInJvd0JpbmRpbmdQYXRoIiwibWV0YUNvbnRleHQiLCJtZXRhTW9kZWwiLCJwcm9wZXJ0eSIsImdldFByb3BlcnR5IiwiZm9ybWF0T3B0aW9ucyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInR5cGUiLCJnZXRVSTVUeXBlIiwiaXNJZ25vcmVkIiwiaWdub3JlIiwiZGlzcGxheUVycm9yTWVzc2FnZXMiLCJlcnJvck1lc3NhZ2VzIiwibWVzc2FnZURldGFpbHMiLCJyZXNvdXJjZUJ1bmRsZSIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImVycm9yQ29ycmVjdGlvbk1lc3NhZ2UiLCJnZXRUZXh0Iiwibm90ZU1lc3NhZ2UiLCJwYXN0ZUVycm9yTWVzc2FnZSIsImxlbmd0aCIsInVuc2hpZnQiLCJNZXNzYWdlQm94IiwiZXJyb3IiLCJ0aXRsZSIsImRldGFpbHMiLCJqb2luIiwiUGFzdGVIZWxwZXIiLCJmb3JtYXRDdXN0b21NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VzIiwiaVJvd051bWJlciIsImVycm9yTWVzc2FnZSIsIm51bWJlck1lc3NhZ2VzIiwiaTE4blJvdyIsImZvckVhY2giLCJtZXNzYWdlIiwiaW5kZXhNZXNzYWdlIiwibWVzc2FnZVRleHQiLCJnZXRDb2x1bW5JbmZvIiwidGFibGUiLCJtb2RlbCIsImdldFJvd0JpbmRpbmciLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsInJlc29sdmUiLCJnZXRQYXRoIiwiZ2V0Q29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiZ2V0Q29udHJvbERlbGVnYXRlIiwiZmV0Y2hQcm9wZXJ0aWVzIiwidGhlbiIsInByb3BlcnR5SW5mbyIsIlByb3BlcnR5SW5mb0RpY3QiLCJPYmplY3QiLCJhc3NpZ24iLCJtYXAiLCJuYW1lIiwiY29sdW1uSW5mb3MiLCJnZXRDb2x1bW5zIiwiY29sdW1uIiwiaW5mb1Byb3BlcnR5IiwiZ2V0RGF0YVByb3BlcnR5IiwicHJvcGVydHlJbmZvcyIsImRhdGFQcm9wZXJ0eSIsInBhdGgiLCJpbmRleE9mIiwicHVzaCIsInBhcnNlUGFzdGVkRGF0YSIsInJhd0RhdGEiLCJwYXN0ZUluZm9zIiwicGFzdGVkQ29sdW1uQ291bnQiLCJmaXJzdEVkaXRhYmxlQ29sdW1uSW5kZXgiLCJJIiwiUHJvbWlzZSIsIkNvcmVQYXN0ZUhlbHBlciIsInBhcnNlIiwicGFyc2VSZXN1bHQiLCJlcnJvcnMiLCJvRWxlbWVudCIsInBhcnNlZERhdGEiLCJwYXN0ZURhdGEiLCJjb250cm9sbGVyIiwib0ludGVybmFsRWRpdEZsb3ciLCJfZWRpdEZsb3ciLCJ0YWJsZURlZmluaXRpb24iLCJnZXRQYXJlbnQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhRGF0YSIsImFQYXJzZWREYXRhIiwiYWxsIiwibURhdGEiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsInZhbGlkYXRlRG9jdW1lbnQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImRhdGEiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjb250cm9sIiwiZ2V0VmlldyIsImFWYWxpZGF0aW9uTWVzc2FnZXMiLCJhRXJyb3JNZXNzYWdlcyIsInJlZHVjZSIsImFNZXNzYWdlcyIsImFDdXN0b21NZXNzYWdlcyIsImluZGV4IiwibWVzc2FnZXMiLCJyb3ciLCJhUm93TWVzc2FnZXMiLCJtRXJyb3IiLCJhVmFsaWRhdGVkRGF0YSIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwiY3JlYXRlQXRFbmQiLCJlZGl0RmxvdyIsIm9uQmVmb3JlQ3JlYXRlIiwidW5kZWZpbmVkIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBLE1BQU1BLHdCQUF3QixHQUFHLFVBQVNDLFlBQVQsRUFBNEJDLGNBQTVCLEVBQWlEQyxX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QUFELENBQW9COEIsUUFBcEIsQ0FBNkJDLGNBTDdCLENBREksR0FRSkMsU0FSSDtBQVNBLE9BeENLLEVBeUNMQyxLQXpDSyxDQXlDQyxVQUFBQyxNQUFNLEVBQUk7QUFDaEJDLFFBQUFBLEdBQUcsQ0FBQzdGLEtBQUosQ0FBVSwwQkFBVixFQUFzQzRGLE1BQXRDO0FBQ0EsT0EzQ0ssQ0FBUDtBQTRDQTtBQXBKa0IsR0FBcEI7U0F1SmV4RixXIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBDb3JlUGFzdGVIZWxwZXIgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvUGFzdGVIZWxwZXJcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuXG5leHBvcnQgdHlwZSBjdXN0b21WYWxpZGF0aW9uTWVzc2FnZSA9IHtcblx0bWVzc2FnZVRleHQ/OiBzdHJpbmc7XG5cdG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBnZXRJbmZvRm9yRW50aXR5UHJvcGVydHkgPSBmdW5jdGlvbihwcm9wZXJ0eVBhdGg6IGFueSwgcm93QmluZGluZ1BhdGg6IGFueSwgbWV0YUNvbnRleHQ6IGFueSwgbWV0YU1vZGVsOiBhbnkpOiBhbnkge1xuXHRjb25zdCBwcm9wZXJ0eSA9IG1ldGFDb250ZXh0LmdldFByb3BlcnR5KHByb3BlcnR5UGF0aCksXG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgcGFyc2VLZWVwc0VtcHR5U3RyaW5nOiB0cnVlIH0sXG5cdFx0dHlwZSA9IG1ldGFNb2RlbC5nZXRVSTVUeXBlKGAke3Jvd0JpbmRpbmdQYXRofS8ke3Byb3BlcnR5UGF0aH1gLCBmb3JtYXRPcHRpb25zKSxcblx0XHRpc0lnbm9yZWQgPSAhcHJvcGVydHkgfHwgbWV0YUNvbnRleHQuZ2V0UHJvcGVydHkocHJvcGVydHlQYXRoICsgXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIik7XG5cdHJldHVybiB7XG5cdFx0cHJvcGVydHk6IHByb3BlcnR5UGF0aCxcblx0XHRpZ25vcmU6IGlzSWdub3JlZCxcblx0XHR0eXBlOiB0eXBlXG5cdH07XG59O1xuXG5jb25zdCBkaXNwbGF5RXJyb3JNZXNzYWdlcyA9IGZ1bmN0aW9uKGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdGNvbnN0IG1lc3NhZ2VEZXRhaWxzID0gWy4uLmVycm9yTWVzc2FnZXNdO1xuXHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGUsXG5cdFx0ZXJyb3JDb3JyZWN0aW9uTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1BBU1RFX0hFTFBFUl9TQVBGRV9QQVNURV9FUlJPUl9DT1JSRUNUSU9OX01FU1NBR0VcIiksXG5cdFx0bm90ZU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19QQVNURV9IRUxQRVJfU0FQRkVfUEFTVEVfRVJST1JfQ09SUkVDVElPTl9OT1RFXCIpO1xuXHRsZXQgcGFzdGVFcnJvck1lc3NhZ2U7XG5cblx0aWYgKG1lc3NhZ2VEZXRhaWxzLmxlbmd0aCA+IDEpIHtcblx0XHRwYXN0ZUVycm9yTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1BBU1RFX0hFTFBFUl9TQVBGRV9QQVNURV9FUlJPUl9NRVNTQUdFX1BMVVJBTFwiLCBbbWVzc2FnZURldGFpbHMubGVuZ3RoXSk7XG5cdH0gZWxzZSB7XG5cdFx0cGFzdGVFcnJvck1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19QQVNURV9IRUxQRVJfU0FQRkVfUEFTVEVfRVJST1JfTUVTU0FHRV9TSU5HVUxBUlwiKTtcblx0fVxuXHRtZXNzYWdlRGV0YWlscy51bnNoaWZ0KFwiXCIpOyAvLyBUbyBzaG93IHNwYWNlIGJldHdlZW4gdGhlIHNob3J0IHRleHQgYW5kIHRoZSBsaXN0IG9mIGVycm9yc1xuXHRtZXNzYWdlRGV0YWlscy51bnNoaWZ0KG5vdGVNZXNzYWdlKTtcblx0bWVzc2FnZURldGFpbHMudW5zaGlmdChlcnJvckNvcnJlY3Rpb25NZXNzYWdlKTtcblx0TWVzc2FnZUJveC5lcnJvcihwYXN0ZUVycm9yTWVzc2FnZSwge1xuXHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRV9FUlJPUlwiKSxcblx0XHRkZXRhaWxzOiBtZXNzYWdlRGV0YWlscy5qb2luKFwiPGJyPlwiKVxuXHR9KTtcbn07XG5cbmNvbnN0IFBhc3RlSGVscGVyID0ge1xuXHRkaXNwbGF5RXJyb3JNZXNzYWdlczogZGlzcGxheUVycm9yTWVzc2FnZXMsXG5cdGZvcm1hdEN1c3RvbU1lc3NhZ2U6IGZ1bmN0aW9uKHZhbGlkYXRpb25NZXNzYWdlczogY3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VbXSwgaVJvd051bWJlcjogbnVtYmVyKTogc3RyaW5nIHtcblx0XHRsZXQgZXJyb3JNZXNzYWdlID0gXCJcIjtcblx0XHRjb25zdCBudW1iZXJNZXNzYWdlcyA9IHZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGg7XG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdFx0aTE4blJvdyA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJUX01FU1NBR0VfR1JPVVBfREVTQ1JJUFRJT05fVEFCTEVfUk9XXCIpO1xuXHRcdGlmIChudW1iZXJNZXNzYWdlcyA+IDApIHtcblx0XHRcdGVycm9yTWVzc2FnZSArPSBgJHtpMThuUm93fSAke2lSb3dOdW1iZXJ9OiBgO1xuXHRcdFx0dmFsaWRhdGlvbk1lc3NhZ2VzLmZvckVhY2goKG1lc3NhZ2UsIGluZGV4TWVzc2FnZSkgPT4ge1xuXHRcdFx0XHRpZiAobWVzc2FnZS5tZXNzYWdlVGV4dCkge1xuXHRcdFx0XHRcdGVycm9yTWVzc2FnZSArPSBtZXNzYWdlLm1lc3NhZ2VUZXh0ICsgKGluZGV4TWVzc2FnZSArIDEgIT09IG51bWJlck1lc3NhZ2VzID8gXCIgXCIgOiBcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBlcnJvck1lc3NhZ2U7XG5cdH0sXG5cdGdldENvbHVtbkluZm86IGZ1bmN0aW9uKHRhYmxlOiBhbnkpOiBQcm9taXNlPGFueVtdPiB7XG5cdFx0Y29uc3QgbW9kZWwgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TW9kZWwoKSxcblx0XHRcdG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0cm93QmluZGluZ1BhdGggPSBtb2RlbC5yZXNvbHZlKHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRQYXRoKCksIHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRDb250ZXh0KCkpLFxuXHRcdFx0bWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocm93QmluZGluZ1BhdGgpO1xuXHRcdHJldHVybiB0YWJsZVxuXHRcdFx0LmdldENvbnRyb2xEZWxlZ2F0ZSgpXG5cdFx0XHQuZmV0Y2hQcm9wZXJ0aWVzKHRhYmxlKVxuXHRcdFx0LnRoZW4oKHByb3BlcnR5SW5mbzogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IFByb3BlcnR5SW5mb0RpY3QgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5wcm9wZXJ0eUluZm8ubWFwKChwcm9wZXJ0eTogYW55KSA9PiAoeyBbcHJvcGVydHkubmFtZV06IHByb3BlcnR5IH0pKSk7XG5cdFx0XHRcdGNvbnN0IGNvbHVtbkluZm9zOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHR0YWJsZS5nZXRDb2x1bW5zKCkuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBpbmZvUHJvcGVydHkgPSBQcm9wZXJ0eUluZm9EaWN0W2NvbHVtbi5nZXREYXRhUHJvcGVydHkoKV07XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgaXQncyBhIGNvbXBsZXggcHJvcGVydHkgKHByb3BlcnR5IGFzc29jaWF0ZWQgdG8gbXVsdGlwbGUgc2ltcGxlIHByb3BlcnRpZXMpXG5cdFx0XHRcdFx0aWYgKGluZm9Qcm9wZXJ0eS5wcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHRcdFx0XHQvLyBHZXQgZGF0YSBmcm9tIHNpbXBsZSBwcm9wZXJ0eVxuXHRcdFx0XHRcdFx0aW5mb1Byb3BlcnR5LnByb3BlcnR5SW5mb3MuZm9yRWFjaCgocHJvcGVydHk6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBkYXRhUHJvcGVydHkgPSBQcm9wZXJ0eUluZm9EaWN0W3Byb3BlcnR5XTtcblxuXHRcdFx0XHRcdFx0XHQvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHNpbXBsZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHRvIGEgUmF0aW5nIG9yIFByb2dyZXNzIENvbXBsZXhQcm9wZXJ0eSAtLT4gaWdub3JlXG5cdFx0XHRcdFx0XHRcdC8vIE9yIGNoZWNrIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSB3aXRoaW4gdGhlIGN1cnJlbnQgQ29tcGxleCBwcm9wZXJ0eSAtLT4gaWdub3JlXG5cdFx0XHRcdFx0XHRcdC8vIEEgZmFrZSBwcm9wZXJ0eSB3YXMgY3JlYXRlZCBpbnRvIHRoZSBwcm9wZXJ0eUluZm9zIHRvIGluY2x1ZGUgdGhlIFRhcmdldCBWYWx1ZVxuXHRcdFx0XHRcdFx0XHQvLyBmcm9tIHRoZSBEYXRhUG9pbnQgKHBhdGggaW5jbHVkZXMgdGhlIEBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnQgYW5ub3RhdGlvbilcblx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdChkYXRhUHJvcGVydHkgJiYgZGF0YVByb3BlcnR5LnBhdGguaW5kZXhPZihcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnRcIikgPiAtMSkgfHxcblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xXG5cdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbkluZm9zLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IGRhdGFQcm9wZXJ0eS5wYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0aWdub3JlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uSW5mb3MucHVzaCh0aGlzLmdldEluZm9Gb3JFbnRpdHlQcm9wZXJ0eShkYXRhUHJvcGVydHkucGF0aCwgcm93QmluZGluZ1BhdGgsIG1ldGFDb250ZXh0LCBtZXRhTW9kZWwpKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpbmZvUHJvcGVydHkucGF0aCkge1xuXHRcdFx0XHRcdFx0Y29sdW1uSW5mb3MucHVzaCh0aGlzLmdldEluZm9Gb3JFbnRpdHlQcm9wZXJ0eShpbmZvUHJvcGVydHkucGF0aCwgcm93QmluZGluZ1BhdGgsIG1ldGFDb250ZXh0LCBtZXRhTW9kZWwpKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gRW1wdHkgY29sdW1uIC0tPiBpZ25vcmVcblx0XHRcdFx0XHRcdGNvbHVtbkluZm9zLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eTogXCJ1bnVzZWRcIixcblx0XHRcdFx0XHRcdFx0dHlwZTogbnVsbCxcblx0XHRcdFx0XHRcdFx0aWdub3JlOiB0cnVlXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gY29sdW1uSW5mb3M7XG5cdFx0XHR9KTtcblx0fSxcblx0Z2V0SW5mb0ZvckVudGl0eVByb3BlcnR5OiBnZXRJbmZvRm9yRW50aXR5UHJvcGVydHksXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gcmF3RGF0YVxuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cblx0ICovXG5cdHBhcnNlUGFzdGVkRGF0YTogZnVuY3Rpb24ocmF3RGF0YTogYW55LCB0YWJsZTogYW55KTogUHJvbWlzZTxhbnlbXT4ge1xuXHRcdHJldHVybiB0aGlzLmdldENvbHVtbkluZm8odGFibGUpXG5cdFx0XHQudGhlbihmdW5jdGlvbihwYXN0ZUluZm9zOiBhbnlbXSkge1xuXHRcdFx0XHQvLyBDaGVjayBpZiB3ZSBoYXZlIGRhdGEgZm9yIGF0IGxlYXN0IHRoZSBmaXJzdCBlZGl0YWJsZSBjb2x1bW5cblx0XHRcdFx0Y29uc3QgcGFzdGVkQ29sdW1uQ291bnQgPSByYXdEYXRhLmxlbmd0aCA/IHJhd0RhdGFbMF0ubGVuZ3RoIDogMDtcblx0XHRcdFx0bGV0IGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCA9IC0xO1xuXHRcdFx0XHRmb3IgKGxldCBJID0gMDsgSSA8IHBhc3RlSW5mb3MubGVuZ3RoICYmIGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCA8IDA7IEkrKykge1xuXHRcdFx0XHRcdGlmICghcGFzdGVJbmZvc1tJXS5pZ25vcmUpIHtcblx0XHRcdFx0XHRcdGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCA9IEk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmaXJzdEVkaXRhYmxlQ29sdW1uSW5kZXggPCAwIHx8IGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCA+IHBhc3RlZENvbHVtbkNvdW50IC0gMVxuXHRcdFx0XHRcdD8gUHJvbWlzZS5yZXNvbHZlKHt9KSAvLyBXZSBkb24ndCBoYXZlIGRhdGEgZm9yIGFuIGVkaXRhYmxlIGNvbHVtbiAtLT4gcmV0dXJuIGVtcHR5IHBhcnNlZCBkYXRhXG5cdFx0XHRcdFx0OiAoQ29yZVBhc3RlSGVscGVyIGFzIGFueSkucGFyc2UocmF3RGF0YSwgcGFzdGVJbmZvcyk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKHBhcnNlUmVzdWx0OiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHBhcnNlUmVzdWx0LmVycm9ycykge1xuXHRcdFx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZXMgPSBwYXJzZVJlc3VsdC5lcnJvcnMubWFwKGZ1bmN0aW9uKG9FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvRWxlbWVudC5tZXNzYWdlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoaXMuZGlzcGxheUVycm9yTWVzc2FnZXMoZXJyb3JNZXNzYWdlcyk7XG5cdFx0XHRcdFx0cmV0dXJuIFtdOyAvLyBFcnJvcnMgLS0+IHJldHVybiBub3RoaW5nXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhcnNlUmVzdWx0LnBhcnNlZERhdGEgPyBwYXJzZVJlc3VsdC5wYXJzZWREYXRhIDogW107XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9LFxuXHRwYXN0ZURhdGE6IGZ1bmN0aW9uKHJhd0RhdGE6IGFueSwgdGFibGU6IGFueSwgY29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9JbnRlcm5hbEVkaXRGbG93ID0gKGNvbnRyb2xsZXIgYXMgYW55KS5fZWRpdEZsb3c7XG5cdFx0Y29uc3QgdGFibGVEZWZpbml0aW9uID0gdGFibGUuZ2V0UGFyZW50KCkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cdFx0bGV0IGFEYXRhOiBhbnlbXSA9IFtdO1xuXHRcdHJldHVybiB0aGlzLnBhcnNlUGFzdGVkRGF0YShyYXdEYXRhLCB0YWJsZSlcblx0XHRcdC50aGVuKGFQYXJzZWREYXRhID0+IHtcblx0XHRcdFx0YURhdGEgPSBhUGFyc2VkRGF0YSB8fCBbXTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdGFEYXRhLm1hcChtRGF0YSA9PlxuXHRcdFx0XHRcdFx0b0ludGVybmFsRWRpdEZsb3cuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS52YWxpZGF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0XHR0YWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTogbURhdGEsXG5cdFx0XHRcdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiB0YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLmdldFZpZXcoKVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihhVmFsaWRhdGlvbk1lc3NhZ2VzID0+IHtcblx0XHRcdFx0Y29uc3QgYUVycm9yTWVzc2FnZXMgPSBhVmFsaWRhdGlvbk1lc3NhZ2VzLnJlZHVjZShmdW5jdGlvbihhTWVzc2FnZXMsIGFDdXN0b21NZXNzYWdlcywgaW5kZXgpIHtcblx0XHRcdFx0XHRpZiAoYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGFNZXNzYWdlcy5wdXNoKHsgbWVzc2FnZXM6IGFDdXN0b21NZXNzYWdlcywgcm93OiBpbmRleCArIDEgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBhTWVzc2FnZXM7XG5cdFx0XHRcdH0sIFtdKTtcblx0XHRcdFx0aWYgKGFFcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRjb25zdCBhUm93TWVzc2FnZXMgPSBhRXJyb3JNZXNzYWdlcy5tYXAoKG1FcnJvcjogYW55KSA9PiB0aGlzLmZvcm1hdEN1c3RvbU1lc3NhZ2UobUVycm9yLm1lc3NhZ2VzLCBtRXJyb3Iucm93KSk7XG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5RXJyb3JNZXNzYWdlcyhhUm93TWVzc2FnZXMpO1xuXHRcdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYURhdGE7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oYVZhbGlkYXRlZERhdGEgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYVZhbGlkYXRlZERhdGEubGVuZ3RoID4gMFxuXHRcdFx0XHRcdD8gb0ludGVybmFsRWRpdEZsb3cuY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0XHRcdFx0XHRcdHRhYmxlLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHRcdFx0YVZhbGlkYXRlZERhdGEsXG5cdFx0XHRcdFx0XHRcdHRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdChjb250cm9sbGVyIGFzIGFueSkuZWRpdEZsb3cub25CZWZvcmVDcmVhdGVcblx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2gob0Vycm9yID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcGFzdGluZyBkYXRhXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUGFzdGVIZWxwZXI7XG4iXX0=