@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,699 @@
1
+ import Dialog from "sap/m/Dialog";
2
+ import XMLTemplateProcessor from "sap/ui/core/XMLTemplateProcessor";
3
+ import JSONModel from "sap/ui/model/json/JSONModel";
4
+ import Fragment from "sap/ui/core/Fragment";
5
+ import XMLPreprocessor from "sap/ui/core/util/XMLPreprocessor";
6
+ import Log from "sap/base/Log";
7
+ import CommonUtils from "sap/fe/core/CommonUtils";
8
+ import Table from "sap/ui/mdc/Table";
9
+ import ResourceBundle from "sap/base/i18n/ResourceBundle";
10
+ import Button from "sap/m/Button";
11
+ import PageController from "sap/fe/core/PageController";
12
+ import { convertMetaModelContext, getInvolvedDataModelObjects } from "../converters/MetaModelConverter";
13
+ import { getTextBinding } from "sap/fe/macros/field/FieldTemplating";
14
+ import { getEditableExpression, getRequiredExpression } from "../templating/UIFormatters";
15
+ import { isReadOnlyExpression } from "../templating/FieldControlHelper";
16
+ import { hasValueHelpWithFixedValues } from "sap/fe/core/templating/PropertyHelper";
17
+
18
+ /* This class contains helpers to be used for mass edit functionality */
19
+ type TextArrangementInfo = {
20
+ textArrangement: string;
21
+ valuePath: string;
22
+ descriptionPath?: string;
23
+ value: string;
24
+ description: string;
25
+ fullText: string;
26
+ };
27
+ const aValidDataTypes = [
28
+ "Edm.Boolean",
29
+ "Edm.Byte",
30
+ "Edm.Decimal",
31
+ "Edm.Double",
32
+ "Edm.Float",
33
+ "Edm.Guid",
34
+ "Edm.Int16",
35
+ "Edm.Int32",
36
+ "Edm.Int64",
37
+ "Edm.SByte",
38
+ "Edm.Single",
39
+ "Edm.String"
40
+ ];
41
+ const MassEditHelper = {
42
+ /**
43
+ * Initializes the value at final or deepest level path with a blank array.
44
+ * Return an empty array pointing to the final or deepest level path.
45
+ *
46
+ * @param {string} sPath Property path
47
+ * @param {Array} aValues Array instance where the default data needs to be added
48
+ * @returns {Array}
49
+ */
50
+ initLastLevelOfPropertyPath: function(sPath: string, aValues: any) {
51
+ let aFinalPath: any;
52
+ let index = 0;
53
+ const aPaths = sPath.split("/");
54
+ let sFullPath = "";
55
+ aPaths.forEach(function(sPropertyPath: string) {
56
+ if (!aValues[sPropertyPath] && index === 0) {
57
+ aValues[sPropertyPath] = {};
58
+ aFinalPath = aValues[sPropertyPath];
59
+ sFullPath = sFullPath + sPropertyPath;
60
+ index++;
61
+ } else if (!aFinalPath[sPropertyPath]) {
62
+ sFullPath = sFullPath + "/" + sPropertyPath;
63
+ if (sFullPath !== sPath) {
64
+ aFinalPath[sPropertyPath] = {};
65
+ aFinalPath = aFinalPath[sPropertyPath];
66
+ } else {
67
+ aFinalPath[sPropertyPath] = [];
68
+ }
69
+ }
70
+ });
71
+ return aFinalPath;
72
+ },
73
+
74
+ /**
75
+ * Method to get unique values for given array values.
76
+ *
77
+ * @param {string} sValue Property value
78
+ * @param {number} index Index of the property value
79
+ * @param {Array} self Instance of the array
80
+ * @returns {boolean}
81
+ */
82
+ getUniqueValues: function(sValue: string, index: number, self: any[]) {
83
+ if (sValue) {
84
+ return self.indexOf(sValue) === index;
85
+ }
86
+ },
87
+
88
+ /**
89
+ * Gets the property value for a multi-level path (for example: _Materials/Material_Details gets the value of Material_Details under _Materials Object).
90
+ * Returns the propertyValue, which can be of any type (string, number, etc..).
91
+ *
92
+ * @param {string} sDataPropertyPath Property path
93
+ * @param {object} oValues Object of property values
94
+ * @returns {*}
95
+ */
96
+ getValueForMultiLevelPath: function(sDataPropertyPath: string, oValues: any) {
97
+ if (sDataPropertyPath && sDataPropertyPath.indexOf("/") > 0) {
98
+ const aPropertyPaths = sDataPropertyPath.split("/");
99
+ let Result: any;
100
+ aPropertyPaths.forEach(function(sPath: string) {
101
+ Result = oValues && oValues[sPath] ? oValues[sPath] : Result && Result[sPath];
102
+ });
103
+ return Result;
104
+ }
105
+ },
106
+
107
+ /**
108
+ * Gets the key path for the key of a combo box that must be selected initially when the dialog opens:
109
+ * => If propertyValue for all selected contexts is different, then < Keep Existing Values > is preselected.
110
+ * => If propertyValue for all selected contexts is the same, then the propertyValue is preselected.
111
+ * => If propertyValue for all selected contexts is empty, then < Leave Blank > is preselected.
112
+ *
113
+ *
114
+ * @param {Array} aContexts Contexts for mass edit
115
+ * @param {string} sDataPropertyPath Data property path
116
+ * @returns {string}
117
+ */
118
+ getDefaultSelectionPathComboBox: function(aContexts: any[], sDataPropertyPath: string) {
119
+ if (sDataPropertyPath && aContexts.length > 0) {
120
+ const oSelectedContext = aContexts,
121
+ aPropertyValues: any[] = [];
122
+ oSelectedContext.forEach(function(oContext: any) {
123
+ const oDataObject = oContext.getObject();
124
+ const sMultiLevelPathCondition =
125
+ sDataPropertyPath.indexOf("/") > -1 && oDataObject.hasOwnProperty(sDataPropertyPath.split("/")[0]);
126
+ if (oContext && (oDataObject.hasOwnProperty(sDataPropertyPath) || sMultiLevelPathCondition)) {
127
+ aPropertyValues.push(oContext.getObject(sDataPropertyPath));
128
+ }
129
+ });
130
+ const aUniquePropertyValues = aPropertyValues.filter(MassEditHelper.getUniqueValues);
131
+ if (aUniquePropertyValues.length > 1) {
132
+ return "Default/" + sDataPropertyPath;
133
+ } else if (aUniquePropertyValues.length === 0) {
134
+ return "Empty/" + sDataPropertyPath;
135
+ } else if (aUniquePropertyValues.length === 1) {
136
+ return sDataPropertyPath;
137
+ }
138
+ }
139
+ },
140
+
141
+ /**
142
+ * Checks hidden annotation value [both static and path based] for table's selected context.
143
+ *
144
+ * @param {*} hiddenValue Hidden annotation value / path for field
145
+ * @param {Array} aContexts Contexts for mass edit
146
+ * @returns {boolean}
147
+ */
148
+ getHiddenValueForContexts: function(hiddenValue: any, aContexts: any[]) {
149
+ if (hiddenValue && hiddenValue.$Path) {
150
+ return !aContexts.some(function(oSelectedContext: any) {
151
+ return oSelectedContext.getObject(hiddenValue.$Path) === false;
152
+ });
153
+ }
154
+ return hiddenValue;
155
+ },
156
+
157
+ /**
158
+ * Initializes a JSON Model for properties of dialog fields [label, visiblity, dataproperty, etc.].
159
+ *
160
+ * @param {object} oTable Instance of Table
161
+ * @param {Array} aContexts Contexts for mass edit
162
+ * @param {Array} aDataArray Array containing data related to the dialog used by both the static and the runtime model
163
+ * @returns {object}
164
+ */
165
+ prepareDataForDialog: function(oTable: Table, aContexts: any[], aDataArray: any[]) {
166
+ const oMetaModel = oTable && (oTable.getModel().getMetaModel() as any),
167
+ sCurrentEntitySetName = oTable.data("metaPath"),
168
+ aTableFields = MassEditHelper.getTableFields(oTable),
169
+ oEntityTypeContext = oMetaModel.getContext(sCurrentEntitySetName + "/@"),
170
+ oDataModelObjectPath = getInvolvedDataModelObjects(oEntityTypeContext);
171
+
172
+ const oDataFieldModel = new JSONModel();
173
+ let oResult;
174
+ let sLabelText;
175
+ let bValueHelpEnabled;
176
+ let sUnitPropertyPath;
177
+ let bValueHelpEnabledForUnit;
178
+ let bIsImmutable;
179
+ let bIsComputed;
180
+ let bChartProperty;
181
+ let oTextBinding;
182
+ let bValidDataType;
183
+ let bInValidInputType;
184
+
185
+ aTableFields.forEach(function(oColumnInfo: any) {
186
+ const sDataPropertyPath = oColumnInfo.dataProperty;
187
+ if (sDataPropertyPath) {
188
+ let oPropertyInfo = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@");
189
+ bValueHelpEnabled =
190
+ sDataPropertyPath &&
191
+ oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@") &&
192
+ oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@")[
193
+ "@com.sap.vocabularies.Common.v1.ValueList"
194
+ ];
195
+ sUnitPropertyPath =
196
+ (oPropertyInfo && oPropertyInfo["@Org.OData.Measures.V1.Unit"] && oPropertyInfo["@Org.OData.Measures.V1.Unit"].$Path) ||
197
+ (oPropertyInfo &&
198
+ oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"] &&
199
+ oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"].$Path);
200
+ sLabelText = oColumnInfo.label || (oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.Common.v1.Label"]);
201
+ bValueHelpEnabledForUnit =
202
+ sUnitPropertyPath &&
203
+ oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@") &&
204
+ oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@")[
205
+ "@com.sap.vocabularies.Common.v1.ValueList"
206
+ ];
207
+ if (oDataModelObjectPath) {
208
+ oDataModelObjectPath.targetObject = oDataModelObjectPath.targetEntityType.entityProperties.filter(function(
209
+ oProperty: any
210
+ ) {
211
+ return oProperty.name === sDataPropertyPath;
212
+ });
213
+ }
214
+ oDataModelObjectPath.targetObject = oDataModelObjectPath.targetObject[0] || {};
215
+ oTextBinding = getTextBinding(oDataModelObjectPath, {}, true) || {};
216
+ const oFieldContext = oMetaModel.getContext(oColumnInfo.annotationPath),
217
+ oDataFieldConverted = convertMetaModelContext(oFieldContext),
218
+ oPropertyContext = oMetaModel.getContext(sCurrentEntitySetName + "/" + sDataPropertyPath + "@"),
219
+ oInterface = oPropertyContext && oPropertyContext.getInterface();
220
+ bIsImmutable =
221
+ oPropertyContext && oPropertyContext.getProperty() && oPropertyContext.getProperty()["@Org.OData.Core.V1.Immutable"];
222
+ bIsComputed =
223
+ oPropertyContext && oPropertyContext.getProperty() && oPropertyContext.getProperty()["@Org.OData.Core.V1.Computed"];
224
+ const bHiddenField =
225
+ MassEditHelper.getHiddenValueForContexts(
226
+ oFieldContext && oFieldContext.getObject()["@com.sap.vocabularies.UI.v1.Hidden"],
227
+ aContexts
228
+ ) || false;
229
+ oInterface.context = {
230
+ getModel: function() {
231
+ return oInterface.getModel();
232
+ },
233
+ getPath: function() {
234
+ return sCurrentEntitySetName + "/" + sDataPropertyPath;
235
+ }
236
+ };
237
+ oPropertyInfo =
238
+ (oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target) ||
239
+ (oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target);
240
+ // Datafield is not included in the FieldControl calculation, needs to be implemented
241
+ const isReadOnly = isReadOnlyExpression(oPropertyInfo);
242
+ bChartProperty = oPropertyInfo && oPropertyInfo.term && oPropertyInfo.term === "com.sap.vocabularies.UI.v1.Chart";
243
+ bValidDataType = oPropertyInfo && aValidDataTypes.indexOf(oPropertyInfo.type) !== -1;
244
+ bInValidInputType =
245
+ (oColumnInfo &&
246
+ oColumnInfo.inputType &&
247
+ (oColumnInfo.inputType === "sap.m.RatingIndicator" || oColumnInfo.inputType === "sap.ui.mdc.MultiValueField")) ||
248
+ hasValueHelpWithFixedValues(oPropertyInfo);
249
+ if (
250
+ sDataPropertyPath &&
251
+ !bHiddenField &&
252
+ !bIsImmutable &&
253
+ !bIsComputed &&
254
+ !bChartProperty &&
255
+ bValidDataType &&
256
+ !bInValidInputType &&
257
+ oColumnInfo.inputType &&
258
+ getEditableExpression(oPropertyInfo, oDataFieldConverted, oDataModelObjectPath) !== "false"
259
+ ) {
260
+ oResult = {
261
+ "label": sLabelText + ":",
262
+ "visible":
263
+ sDataPropertyPath &&
264
+ !bHiddenField &&
265
+ !bIsImmutable &&
266
+ !bIsComputed &&
267
+ getEditableExpression(oPropertyInfo, oDataFieldConverted, oDataModelObjectPath),
268
+ "dataProperty": sDataPropertyPath,
269
+ "isValueHelpEnabled": bValueHelpEnabled ? bValueHelpEnabled : false,
270
+ "unitProperty": sUnitPropertyPath ? sUnitPropertyPath : false,
271
+ "isValueHelpEnabledForUnit": bValueHelpEnabledForUnit ? bValueHelpEnabledForUnit : false,
272
+ "propertyPathForValueHelp": sCurrentEntitySetName + "/" + sDataPropertyPath,
273
+ "propertyPathForValueHelpUnit": sCurrentEntitySetName + "/" + sUnitPropertyPath,
274
+ "isFieldRequired": getRequiredExpression(oPropertyInfo, oDataFieldConverted, true),
275
+ "defaultSelectionPath": sDataPropertyPath
276
+ ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sDataPropertyPath)
277
+ : false,
278
+ "defaultSelectionUnitPath": sUnitPropertyPath
279
+ ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sUnitPropertyPath)
280
+ : false,
281
+ "entitySet": sCurrentEntitySetName,
282
+ "textBinding": oTextBinding,
283
+ "nullable": oPropertyInfo.nullable !== undefined ? oPropertyInfo.nullable : true,
284
+ "isPropertyReadOnly": isReadOnly !== undefined ? isReadOnly : false
285
+ };
286
+ aDataArray.push(oResult);
287
+ }
288
+ }
289
+ });
290
+ oDataFieldModel.setData(aDataArray);
291
+ return oDataFieldModel;
292
+ },
293
+
294
+ getInputTypeForColumn: function(oColumn: any) {
295
+ return (
296
+ oColumn.getTemplate().getContent &&
297
+ oColumn.getTemplate().getContent() &&
298
+ oColumn.getTemplate().getContent().getContentEdit &&
299
+ oColumn
300
+ .getTemplate()
301
+ .getContent()
302
+ .getContentEdit() &&
303
+ oColumn
304
+ .getTemplate()
305
+ .getContent()
306
+ .getContentEdit()[0] &&
307
+ oColumn
308
+ .getTemplate()
309
+ .getContent()
310
+ .getContentEdit()[0]
311
+ .getMetadata()
312
+ .getName()
313
+ );
314
+ },
315
+
316
+ getTableFields: function(oTable: any) {
317
+ const aColumns = (oTable && oTable.getColumns()) || [];
318
+ return aColumns.map(function(oColumn: any) {
319
+ const sDataProperty = oColumn && oColumn.getDataProperty(),
320
+ aRealtedColumnInfo =
321
+ oTable.data("columns") &&
322
+ oTable.data("columns").customData.filter(function(oColumnInfo: any) {
323
+ return oColumnInfo.name === sDataProperty && oColumnInfo.type === "Annotation";
324
+ });
325
+ return {
326
+ "dataProperty": sDataProperty,
327
+ "label": oColumn.getHeader(),
328
+ "annotationPath": aRealtedColumnInfo && aRealtedColumnInfo[0] && aRealtedColumnInfo[0].annotationPath,
329
+ "inputType": MassEditHelper.getInputTypeForColumn(oColumn)
330
+ };
331
+ });
332
+ },
333
+
334
+ getDefaultTextsForDialog: function(oResourceBundle: any, iSelectedContexts: any, oTable: any) {
335
+ // The confirm button text is "Save" for table in Display mode and "Apply" for table in edit mode. This can be later exposed if needed.
336
+ const bDisplayMode = oTable.data("displayModePropertyBinding") === "true";
337
+
338
+ return {
339
+ "keepExistingPrefix": "< Keep",
340
+ "leaveBlankValue": "< Leave Blank >",
341
+ "clearFieldValue": "< Clear Values >",
342
+ "massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
343
+ "applyButtonText": bDisplayMode
344
+ ? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT")
345
+ : oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
346
+ "cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT")
347
+ };
348
+ },
349
+
350
+ /**
351
+ * Adds a suffix to the 'keep existing' property of the comboBox.
352
+ *
353
+ * @param {string} sInputType InputType of the field
354
+ * @returns {string}
355
+ */
356
+ getSuffixForKeepExisiting: function(sInputType: string) {
357
+ let sResult = "Values";
358
+
359
+ switch (sInputType) {
360
+ //TODO - Add for other control types as well (Radio Button, Email, Input, MDC Fields, Image etc.)
361
+ case "sap.m.DatePicker":
362
+ sResult = "Dates";
363
+ break;
364
+ case "sap.m.CheckBox":
365
+ sResult = "Settings";
366
+ break;
367
+ }
368
+ return sResult;
369
+ },
370
+
371
+ /**
372
+ * Adds default values to the model [Keep Existing Values, Leave Blank].
373
+ *
374
+ * @param {Array} aValues Array instance where the default data needs to be added
375
+ * @param {Array} aContexts Contexts for mass edit
376
+ * @param {object} oDefaultValues Default values from Application Manifest
377
+ * @param {object} oPropertyInfo Property information
378
+ * @param {boolean} bUOMField
379
+ */
380
+ setDefaultValuesToDialog: function(aValues: any[], aContexts: any[], oDefaultValues: any, oPropertyInfo: any, bUOMField?: boolean) {
381
+ const sPropertyPath = oPropertyInfo.dataProperty,
382
+ sInputType = oPropertyInfo.inputType,
383
+ bPropertyRequired = oPropertyInfo.isFieldRequired;
384
+ const sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType);
385
+ //TODO - Add <<Use Value Help or control implmentation>> and related key by checking if value help is enabled for property or Unit.
386
+ //TODO - Add option Apply to Empty Fields only for Both Value Help and controls.
387
+ const bValueExistsForPropertyPath = aContexts.some(function(oSelectedContext: any) {
388
+ return oSelectedContext.getObject(sPropertyPath);
389
+ });
390
+ if (bValueExistsForPropertyPath) {
391
+ if (bPropertyRequired !== "true" && !bUOMField) {
392
+ aValues.unshift({ text: oDefaultValues.clearFieldValue, key: "ClearFieldValue/" + sPropertyPath });
393
+ }
394
+ } else {
395
+ aValues.unshift({ text: oDefaultValues.leaveBlankValue, key: "Empty/" + sPropertyPath });
396
+ }
397
+ aValues.unshift({
398
+ text: oDefaultValues.keepExistingPrefix + " " + sSuffixForKeepExisting + " >",
399
+ key: "Default/" + sPropertyPath
400
+ });
401
+ },
402
+
403
+ getTextArrangementInfo: function(
404
+ sProperty: any,
405
+ oTextBinding: any,
406
+ sCurrentEntitySet: any,
407
+ oSelectedContext: any
408
+ ): TextArrangementInfo | undefined {
409
+ const oMetaModel = oSelectedContext.getModel().getMetaModel();
410
+ const sDisplayMode = CommonUtils.computeDisplayMode(oMetaModel.getObject(sCurrentEntitySet + "/" + sProperty + "@"));
411
+ let sDescriptionPath, sValue, sDescriptionValue, sFullText;
412
+ if (oTextBinding && (oTextBinding.path || (oTextBinding.parameters && oTextBinding.parameters.length)) && sProperty) {
413
+ if (oTextBinding.path) {
414
+ if (sDisplayMode === "Description") {
415
+ sValue = oSelectedContext.getObject(sProperty);
416
+ sDescriptionValue = oSelectedContext.getObject(oTextBinding.path);
417
+ sFullText = sDescriptionValue;
418
+ } else if (sDisplayMode === "Value") {
419
+ sValue = oSelectedContext.getObject(sProperty);
420
+ sFullText = sValue;
421
+ }
422
+ } else if (oTextBinding.parameters) {
423
+ oTextBinding.parameters.forEach(function(oProps: any) {
424
+ if (oProps.path && oProps.path !== sProperty) {
425
+ sDescriptionPath = oProps.path;
426
+ }
427
+ });
428
+ sValue = oSelectedContext.getObject(sProperty);
429
+ sDescriptionValue = oSelectedContext.getObject(sDescriptionPath);
430
+ if (sDisplayMode === "ValueDescription" && sValue && sDescriptionValue) {
431
+ sFullText = sValue + " (" + sDescriptionValue + ")";
432
+ } else if (sDisplayMode === "DescriptionValue" && sDescriptionValue && sValue) {
433
+ sFullText = sDescriptionValue + " (" + sValue + ")";
434
+ }
435
+ }
436
+ return {
437
+ "textArrangement": sDisplayMode,
438
+ "valuePath": sProperty,
439
+ "descriptionPath": sDescriptionPath,
440
+ "value": sValue,
441
+ "description": sDescriptionValue,
442
+ "fullText": sFullText
443
+ };
444
+ }
445
+ return undefined;
446
+ },
447
+
448
+ /**
449
+ * Initializes a runtime model:
450
+ * => The model consists of values shown in the comboBox of the dialog (Leave Blank, Keep Existing Values, or any property value for the selected context, etc.)
451
+ * => The model will capture runtime changes in the results property (the value entered in the comboBox).
452
+ *
453
+ * @param {Array} aContexts Contexts for mass edit
454
+ * @param {Array} aDataArray Array containing data related to the dialog used by both the static and the runtime model
455
+ * @param {object} oDefaultValues Default values from i18n
456
+ * @returns {object}
457
+ */
458
+ setRuntimeModelOnDialog: function(aContexts: any[], aDataArray: any[], oDefaultValues: any) {
459
+ const aValues: any[] = [];
460
+ const aUnitData: any[] = [];
461
+ const aResults: any[] = [];
462
+ const aReadOnlyFieldInfo: any[] = [];
463
+ const oDistinctValueMap: any = {};
464
+ let sPropertyName;
465
+ aDataArray.forEach(function(oData: any) {
466
+ let oTextInfo;
467
+ if (oData.dataProperty && oData.dataProperty.indexOf("/") > -1) {
468
+ const aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oData.dataProperty, aValues);
469
+ const aPropertyPaths = oData.dataProperty.split("/");
470
+ let sPropertyKey;
471
+ for (let i = 0; i < aContexts.length; i++) {
472
+ const sMultiLevelPathValue = aContexts[i].getObject(oData.dataProperty);
473
+ sPropertyKey = oData.dataProperty + "/" + sMultiLevelPathValue;
474
+ if (!oDistinctValueMap[sPropertyKey] && aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]]) {
475
+ oTextInfo = MassEditHelper.getTextArrangementInfo(
476
+ oData.dataProperty,
477
+ oData.textBinding,
478
+ oData.entitySet,
479
+ aContexts[i]
480
+ );
481
+ aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].push({
482
+ "text": (oTextInfo && oTextInfo.fullText) || sMultiLevelPathValue,
483
+ "key": oData.dataProperty,
484
+ "textInfo": oTextInfo
485
+ });
486
+ oDistinctValueMap[sPropertyKey] = sMultiLevelPathValue;
487
+ }
488
+ }
489
+ } else {
490
+ aValues[oData.dataProperty] = aValues[oData.dataProperty] || [];
491
+ if (oData.unitProperty) {
492
+ aUnitData[oData.unitProperty] = aUnitData[oData.unitProperty] || [];
493
+ }
494
+ for (let i = 0; i < aContexts.length; i++) {
495
+ const oDataObject = aContexts[i].getObject();
496
+ sPropertyName = oData.dataProperty + "/" + oDataObject[oData.dataProperty];
497
+ if (oData.dataProperty && oDataObject[oData.dataProperty] && !oDistinctValueMap[sPropertyName]) {
498
+ oTextInfo = MassEditHelper.getTextArrangementInfo(
499
+ oData.dataProperty,
500
+ oData.textBinding,
501
+ oData.entitySet,
502
+ aContexts[i]
503
+ );
504
+ aValues[oData.dataProperty].push({
505
+ "text": (oTextInfo && oTextInfo.fullText) || oDataObject[oData.dataProperty],
506
+ "key": oData.dataProperty,
507
+ "textInfo": oTextInfo
508
+ });
509
+ oDistinctValueMap[sPropertyName] = oDataObject[oData.dataProperty];
510
+ }
511
+ if (oData.unitProperty && oDataObject[oData.unitProperty]) {
512
+ sPropertyName = oData.unitProperty + "/" + oDataObject[oData.unitProperty];
513
+ if (!oDistinctValueMap[sPropertyName]) {
514
+ oTextInfo = MassEditHelper.getTextArrangementInfo(
515
+ oData.unitProperty,
516
+ oData.textBinding,
517
+ oData.entitySet,
518
+ aContexts[i]
519
+ );
520
+ aUnitData[oData.unitProperty].push({
521
+ "text": (oTextInfo && oTextInfo.fullText) || oDataObject[oData.unitProperty],
522
+ "key": oData.unitProperty,
523
+ "textInfo": oTextInfo
524
+ });
525
+ oDistinctValueMap[sPropertyName] = oDataObject[oData.unitProperty];
526
+ }
527
+ }
528
+ }
529
+ }
530
+ });
531
+ aDataArray.forEach(function(oData: any) {
532
+ if (oData.dataProperty.indexOf("/") > -1) {
533
+ const sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(oData.dataProperty, aValues);
534
+ if (!sMultiLevelPropPathValue) {
535
+ sMultiLevelPropPathValue.push({ text: oDefaultValues.leaveBlankValue, key: "Empty/" + oData.dataProperty });
536
+ } else {
537
+ MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue, aContexts, oDefaultValues, oData);
538
+ }
539
+ } else if (aValues[oData.dataProperty] && aValues[oData.dataProperty].length) {
540
+ MassEditHelper.setDefaultValuesToDialog(aValues[oData.dataProperty], aContexts, oDefaultValues, oData);
541
+ }
542
+ if (aUnitData[oData.unitProperty] && aUnitData[oData.unitProperty].length) {
543
+ MassEditHelper.setDefaultValuesToDialog(aUnitData[oData.unitProperty], aContexts, oDefaultValues, oData, true);
544
+ } else if (
545
+ (oData.dataProperty && aValues[oData.dataProperty] && !aValues[oData.dataProperty].length) ||
546
+ (oData.unitProperty && aUnitData[oData.unitProperty] && !aUnitData[oData.unitProperty].length)
547
+ ) {
548
+ const bClearFieldOrBlankValueExists =
549
+ aValues[oData.dataProperty] &&
550
+ aValues[oData.dataProperty].some(function(obj: any) {
551
+ return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
552
+ });
553
+ if (oData.dataProperty && !bClearFieldOrBlankValueExists) {
554
+ aValues[oData.dataProperty].push({ text: oDefaultValues.leaveBlankValue, key: "Empty/" + oData.dataProperty });
555
+ }
556
+ const bClearFieldOrBlankUnitValueExists =
557
+ aUnitData[oData.unitProperty] &&
558
+ aUnitData[oData.unitProperty].some(function(obj: any) {
559
+ return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
560
+ });
561
+ if (oData.unitProperty && !bClearFieldOrBlankUnitValueExists) {
562
+ aUnitData[oData.unitProperty].push({
563
+ text: oDefaultValues.leaveBlankValue,
564
+ key: "Empty/" + oData.unitProperty
565
+ });
566
+ }
567
+ }
568
+ if (oData.isPropertyReadOnly && typeof oData.isPropertyReadOnly === "boolean") {
569
+ aReadOnlyFieldInfo.push({ "property": oData.dataProperty, value: oData.isPropertyReadOnly, type: "Default" });
570
+ } else if (
571
+ oData.isPropertyReadOnly &&
572
+ oData.isPropertyReadOnly.operands &&
573
+ oData.isPropertyReadOnly.operands[0] &&
574
+ oData.isPropertyReadOnly.operands[0].operand1 &&
575
+ oData.isPropertyReadOnly.operands[0].operand2
576
+ ) {
577
+ // This needs to be refactored in accordance with the ReadOnlyExpression change
578
+ aReadOnlyFieldInfo.push({
579
+ "property": oData.dataProperty,
580
+ propertyPath: oData.isPropertyReadOnly.operands[0].operand1.path,
581
+ propertyValue: oData.isPropertyReadOnly.operands[0].operand2.value,
582
+ type: "Path"
583
+ });
584
+ }
585
+ });
586
+ const oData = { "values": aValues, "unitData": aUnitData, "results": aResults, "readablePropertyData": aReadOnlyFieldInfo };
587
+ const oDialogDataModel = new JSONModel(oData);
588
+ return oDialogDataModel;
589
+ },
590
+
591
+ /**
592
+ * Create the mass edit dialog.
593
+ *
594
+ * @param {object} oTable Instance of Table
595
+ * @param {Array} aContexts Contexts for mass edit
596
+ * @param {object} oController Controller for the view
597
+ * @returns {object} Promise returning instance of dialog.
598
+ */
599
+ createDialog: function(oTable: Table, aContexts: any[], oController: PageController) {
600
+ const sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
601
+ aDataArray: any[] = [],
602
+ oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core") as ResourceBundle,
603
+ oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
604
+ oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
605
+ oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues);
606
+
607
+ return new Promise(function(resolve: (value: any) => void, reject: (reason?: any) => void) {
608
+ const oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
609
+ return Promise.resolve(
610
+ XMLPreprocessor.process(
611
+ oFragment,
612
+ { name: sFragmentName },
613
+ {
614
+ bindingContexts: {
615
+ dataFieldModel: oDataFieldModel.createBindingContext("/")
616
+ },
617
+ models: {
618
+ dataFieldModel: oDataFieldModel
619
+ }
620
+ }
621
+ )
622
+ )
623
+ .then(function(oFragment: any) {
624
+ return Fragment.load({ definition: oFragment }).then(function(oDialogContent: any) {
625
+ const oDialog = new Dialog({
626
+ title: oDefaultValues.massEditTitle,
627
+ content: [oDialogContent],
628
+ beginButton: new Button({
629
+ text: oDefaultValues.applyButtonText,
630
+ type: "Emphasized",
631
+ press: function(oEvent: any) {
632
+ const oDialog = oEvent.getSource().getParent();
633
+ const oModel = oDialog.getModel("fieldsInfo");
634
+ const aResults = oModel.getProperty("/results");
635
+ const aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
636
+ const changePromise: any[] = [];
637
+ let bReadOnlyField = false;
638
+
639
+ aContexts.forEach(function(oSelectedContext: any) {
640
+ aResults.forEach(function(oResult: any) {
641
+ //TODO - Add save implementation for Value Help.
642
+ if (aPropertyReadableInfo) {
643
+ bReadOnlyField = aPropertyReadableInfo.some(function(oPropertyInfo: any) {
644
+ if (oResult.keyValue === oPropertyInfo.property) {
645
+ if (oPropertyInfo.type === "Default") {
646
+ return oPropertyInfo.value === true;
647
+ } else if (
648
+ oPropertyInfo.type === "Path" &&
649
+ oPropertyInfo.propertyValue &&
650
+ oPropertyInfo.propertyPath
651
+ ) {
652
+ return (
653
+ oSelectedContext.getObject(oPropertyInfo.propertyPath) ===
654
+ oPropertyInfo.propertyValue
655
+ );
656
+ }
657
+ }
658
+ });
659
+ }
660
+ if (oResult.keyValue && oResult.value !== "Default" && !bReadOnlyField) {
661
+ changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value));
662
+ }
663
+ });
664
+ });
665
+ return Promise.all(changePromise)
666
+ .then(function(oRes: any[]) {
667
+ const oListBinding = oTable.getRowBinding(),
668
+ oExtensionAPI = oController && (oController.getExtensionAPI() as any);
669
+ return oExtensionAPI.refresh(oListBinding.getPath()).then(function() {
670
+ oDialog.close();
671
+ oDialog.destroy();
672
+ return oRes;
673
+ });
674
+ })
675
+ .catch(function(oError: any) {
676
+ //TODO - Add error handling part for the Dialog
677
+ Log.error("Mass Edit: Something went wrong in updating entries.", oError);
678
+ });
679
+ }
680
+ }),
681
+ endButton: new Button({
682
+ text: oDefaultValues.cancelButtonText,
683
+ press: function(oEvent: any) {
684
+ const oDialog = oEvent.getSource().getParent();
685
+ oDialog.close();
686
+ oDialog.destroy();
687
+ }
688
+ })
689
+ });
690
+ oDialog.setModel(oDialogDataModel, "fieldsInfo");
691
+ resolve(oDialog);
692
+ });
693
+ })
694
+ .catch(reject);
695
+ });
696
+ }
697
+ };
698
+
699
+ export default MassEditHelper;