@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,115 @@
1
+ import Control from "sap/ui/core/Control";
2
+
3
+ export type FieldWrapperType = Control & {
4
+ getEditMode(): string;
5
+ getContentDisplay(): Control;
6
+ getContentEdit(): Control[];
7
+ getAriaLabelledBy(): Control[];
8
+ _setAriaLabelledBy(oControl: Control): void;
9
+ };
10
+ const FieldWrapper = Control.extend("sap.fe.core.controls.FieldWrapper", {
11
+ metadata: {
12
+ interfaces: ["sap.ui.core.IFormContent"],
13
+ properties: {
14
+ textAlign: {
15
+ type: "sap.ui.core.TextAlign"
16
+ },
17
+ width: {
18
+ type: "sap.ui.core.CSSSize",
19
+ defaultValue: null
20
+ },
21
+ formDoNotAdjustWidth: {
22
+ type: "boolean",
23
+ defaultValue: false
24
+ },
25
+ editMode: {
26
+ type: "string",
27
+ defaultValue: "Display"
28
+ },
29
+ required: {
30
+ type: "boolean",
31
+ defaultValue: false
32
+ }
33
+ },
34
+ associations: {
35
+ /**
36
+ * Association to controls / IDs that label this control (see WAI-ARIA attribute aria-labelledby).
37
+ */
38
+ ariaLabelledBy: { type: "sap.ui.core.Control", multiple: true, singularName: "ariaLabelledBy" }
39
+ },
40
+ defaultAggregation: "contentDisplay",
41
+ aggregations: {
42
+ contentDisplay: { type: "sap.ui.core.Control", multiple: false },
43
+ contentEdit: { type: "sap.ui.core.Control", multiple: true }
44
+ }
45
+ },
46
+ enhanceAccessibilityState: function(oElement: any, mAriaProps: any) {
47
+ const oParent = this.getParent() as any;
48
+
49
+ if (oParent && oParent.enhanceAccessibilityState) {
50
+ // use FieldWrapper as control, but aria properties of rendered inner control.
51
+ oParent.enhanceAccessibilityState(this, mAriaProps);
52
+ }
53
+
54
+ return mAriaProps;
55
+ },
56
+ getAccessibilityInfo: function(this: FieldWrapperType) {
57
+ let oContent;
58
+ if (this.getEditMode() === "Display") {
59
+ oContent = this.getContentDisplay();
60
+ } else {
61
+ oContent = this.getContentEdit().length ? this.getContentEdit()[0] : null;
62
+ }
63
+ return oContent && oContent.getAccessibilityInfo ? oContent.getAccessibilityInfo() : {};
64
+ },
65
+
66
+ _setAriaLabelledBy: function(this: FieldWrapperType, oContent: any) {
67
+ if (oContent && oContent.addAriaLabelledBy) {
68
+ const aAriaLabelledBy = this.getAriaLabelledBy();
69
+
70
+ for (let i = 0; i < aAriaLabelledBy.length; i++) {
71
+ const sId = aAriaLabelledBy[i];
72
+ const aAriaLabelledBys = oContent.getAriaLabelledBy() || [];
73
+ if (aAriaLabelledBys.indexOf(sId) === -1) {
74
+ oContent.addAriaLabelledBy(sId);
75
+ }
76
+ }
77
+ }
78
+ },
79
+ onBeforeRendering: function(this: FieldWrapperType) {
80
+ // before calling the renderer of the FieldWrapper parent control may have set ariaLabelledBy
81
+ // we ensure it is passed to its inner controls
82
+ this._setAriaLabelledBy(this.getContentDisplay());
83
+ const aContentEdit = this.getContentEdit();
84
+ for (let i = 0; i < aContentEdit.length; i++) {
85
+ this._setAriaLabelledBy(aContentEdit[i]);
86
+ }
87
+ },
88
+ renderer: {
89
+ apiVersion: 2,
90
+ render: function(oRm: any, oControl: any) {
91
+ oRm.openStart("div", oControl);
92
+ oRm.style("text-align", oControl.getTextAlign());
93
+ if (oControl.getEditMode() === "Display") {
94
+ oRm.style("width", oControl.getWidth());
95
+ oRm.openEnd();
96
+ oRm.renderControl(oControl.getContentDisplay()); // render the child Control for display
97
+ } else {
98
+ const aContentEdit = oControl.getContentEdit();
99
+
100
+ // if (aContentEdit.length > 1) {
101
+ // oRm.class("sapUiMdcFieldBaseMoreFields");
102
+ // }
103
+ oRm.style("width", oControl.getWidth());
104
+ oRm.openEnd();
105
+ for (let i = 0; i < aContentEdit.length; i++) {
106
+ const oContent = aContentEdit[i]; // render the child Control for edit
107
+ oRm.renderControl(oContent);
108
+ }
109
+ }
110
+ oRm.close("div"); // end of the complete Control
111
+ }
112
+ }
113
+ });
114
+
115
+ export default FieldWrapper;
@@ -1,161 +1,165 @@
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(
6
- [
7
- "sap/ui/mdc/FilterBar",
8
- "sap/ui/mdc/filterbar/FilterBarBaseRenderer",
9
- "sap/ui/mdc/filterbar/aligned/FilterItemLayout",
10
- "sap/fe/core/controls/filterbar/VisualFilterContainer",
11
- "sap/fe/core/controls/filterbar/FilterContainer"
12
- ],
13
- function(MdcFilterBar, FilterBarBaseRenderer, FilterItemLayout, VisualFilterContainer, FilterContainer) {
14
- "use strict";
15
- var FilterBar = MdcFilterBar.extend("sap.fe.core.controls.FilterBar", {
16
- metadata: {
17
- properties: {
18
- initialLayout: {
19
- type: "string",
20
- defaultValue: "compact"
21
- }
22
- },
23
- associations: {
24
- /**
25
- * Control which allows for switching between visual and normal filter layouts
26
- */
27
- toggleControl: {
28
- type: "sap.m.SegmentedButton",
29
- multiple: false
30
- }
31
- }
32
- },
33
- renderer: FilterBarBaseRenderer
34
- });
35
-
36
- FilterBar.prototype.setToggleControl = function(vToggle) {
37
- if (typeof vToggle === "string") {
38
- this._oSegmentedButton = sap.ui.getCore().byId(vToggle);
39
- } else {
40
- this._oSegmentedButton = vToggle;
41
- }
42
-
43
- if (this.getToggleControl() && this._oSegmentedButton) {
44
- this._oSegmentedButton.detachEvent("select", this._toggleLayout.bind(this));
45
- }
46
- if (this._oSegmentedButton) {
47
- this._oSegmentedButton.attachEvent("select", this._toggleLayout.bind(this));
48
- }
49
- this.setAssociation("toggleControl", vToggle, true);
50
- };
51
-
52
- FilterBar.prototype._toggleLayout = function() {
53
- // Since primary layout is always compact
54
- // hence set the secondary layout as visual filter only for the first time only
55
- if (!this._oSecondaryFilterBarLayout) {
56
- this._oSecondaryFilterBarLayout = new VisualFilterContainer();
57
- }
58
-
59
- // do not show Adapt Filters Button for visual layout
60
- if (this._oSecondaryFilterBarLayout.isA("sap.fe.core.controls.filterbar.VisualFilterContainer")) {
61
- this.setShowAdaptFiltersButton(false);
62
- } else {
63
- this.setShowAdaptFiltersButton(true);
64
- }
65
-
66
- // get all filter fields and button of the current layout
67
- var oCurrentFilterBarLayout = this._oFilterBarLayout;
68
- var oFilterItems = this.getFilterItems();
69
- var aFilterFields = oCurrentFilterBarLayout.getAllFilterFields();
70
- var aSortedFilterFields = this.getSortedFilterFields(oFilterItems, aFilterFields);
71
- var aButtons = oCurrentFilterBarLayout.getAllButtons();
72
- var aVisualFilterFields =
73
- oCurrentFilterBarLayout.getAllVisualFilterFields && oCurrentFilterBarLayout.getAllVisualFilterFields();
74
- if (this._oSecondaryFilterBarLayout.isA("sap.fe.core.controls.filterbar.VisualFilterContainer")) {
75
- this._oSecondaryFilterBarLayout.setAllFilterFields(aSortedFilterFields, aVisualFilterFields);
76
- }
77
- // use secondary filter bar layout as new layout
78
- this._oFilterBarLayout = this._oSecondaryFilterBarLayout;
79
-
80
- // insert all filter fields from current layout to new layout
81
- var that = this;
82
- aFilterFields.forEach(function(oFilterField, iIndex) {
83
- oCurrentFilterBarLayout.removeFilterField(oFilterField);
84
- that._oFilterBarLayout.insertFilterField(oFilterField, iIndex);
85
- });
86
- // insert all buttons from the current layout to the new layout
87
- aButtons.forEach(function(oButton) {
88
- oCurrentFilterBarLayout.removeButton(oButton);
89
- that._oFilterBarLayout.addButton(oButton);
90
- });
91
-
92
- // set the current filter bar layout to the secondary one
93
- this._oSecondaryFilterBarLayout = oCurrentFilterBarLayout;
94
-
95
- // update the layout aggregation of the filter bar and rerender the same.
96
- this.setAggregation("layout", that._oFilterBarLayout, true);
97
- this._oFilterBarLayout.rerender();
98
- };
99
-
100
- FilterBar.prototype.getSortedFilterFields = function(aFilterItems, aFilterFields) {
101
- var aFilterIds = [];
102
- aFilterItems.forEach(function(oFilterItem) {
103
- aFilterIds.push(oFilterItem.getId());
104
- });
105
- aFilterFields.sort(function(aFirstItem, aSecondItem) {
106
- var sFirstItemVFId, sSecondItemVFId;
107
- aFirstItem.getContent().forEach(function(oInnerControl) {
108
- if (oInnerControl.isA("sap.ui.mdc.FilterField")) {
109
- sFirstItemVFId = oInnerControl.getId();
110
- }
111
- });
112
- aSecondItem.getContent().forEach(function(oInnerControl) {
113
- if (oInnerControl.isA("sap.ui.mdc.FilterField")) {
114
- sSecondItemVFId = oInnerControl.getId();
115
- }
116
- });
117
- return aFilterIds.indexOf(sFirstItemVFId) - aFilterIds.indexOf(sSecondItemVFId);
118
- });
119
- return aFilterFields;
120
- };
121
-
122
- FilterBar.prototype._createInnerLayout = function() {
123
- this._oFilterBarLayout = new FilterContainer();
124
- this._cLayoutItem = FilterItemLayout;
125
- this._oFilterBarLayout.getInner().addStyleClass("sapUiMdcFilterBarBaseAFLayout");
126
- this._addButtons();
127
-
128
- // TODO: Check with MDC if there is a better way to load visual filter on the basis of control property
129
- // _createInnerLayout is called on Init by the filter bar base.
130
- // This mean that we do not have access to the control properties yet
131
- // and hence we cannot decide on the basis of control properties whether initial layout should be compact or visual
132
- // As a result we have to do this workaround to always load the compact layout by default
133
- // And toogle the same in case the initialLayout was supposed to be visual filters.
134
- var oInnerLayout = this._oFilterBarLayout.getInner(),
135
- that = this;
136
- var oFilterContainerInnerLayoutEventDelegate = {
137
- onBeforeRendering: function() {
138
- if (that.getInitialLayout() === "visual") {
139
- that._toggleLayout();
140
- }
141
- oInnerLayout.removeEventDelegate(oFilterContainerInnerLayoutEventDelegate);
142
- }
143
- };
144
- oInnerLayout.addEventDelegate(oFilterContainerInnerLayoutEventDelegate);
145
-
146
- this.setAggregation("layout", this._oFilterBarLayout, true);
147
- };
148
-
149
- FilterBar.prototype.exit = function() {
150
- MdcFilterBar.prototype.exit.apply(this, arguments);
151
- // Sometimes upon external navigation this._SegmentedButton is already destroyed
152
- // so check if it exists and then only remove stuff
153
- if (this._oSegmentedButton) {
154
- this._oSegmentedButton.detachEvent("select", this._toggleLayout);
155
- delete this._oSegmentedButton;
156
- }
157
- };
158
-
159
- return FilterBar;
160
- }
161
- );
5
+ sap.ui.define(["sap/ui/mdc/FilterBar", "sap/ui/mdc/filterbar/aligned/FilterItemLayout", "sap/fe/core/controls/filterbar/VisualFilterContainer", "sap/fe/core/controls/filterbar/FilterContainer"], function (MdcFilterBar, FilterItemLayout, VisualFilterContainer, FilterContainer) {
6
+ "use strict";
7
+
8
+ var FilterBar = MdcFilterBar.extend("sap.fe.core.controls.FilterBar", {
9
+ metadata: {
10
+ properties: {
11
+ initialLayout: {
12
+ type: "string",
13
+ defaultValue: "compact"
14
+ }
15
+ },
16
+ associations: {
17
+ /**
18
+ * Control which allows for switching between visual and normal filter layouts
19
+ */
20
+ toggleControl: {
21
+ type: "sap.m.SegmentedButton",
22
+ multiple: false
23
+ }
24
+ }
25
+ },
26
+ renderer: {
27
+ apiVersion: 2
28
+ }
29
+ });
30
+
31
+ FilterBar.prototype.setToggleControl = function (vToggle) {
32
+ if (typeof vToggle === "string") {
33
+ this._oSegmentedButton = sap.ui.getCore().byId(vToggle);
34
+ } else {
35
+ this._oSegmentedButton = vToggle;
36
+ }
37
+
38
+ if (this.getToggleControl() && this._oSegmentedButton) {
39
+ this._oSegmentedButton.detachEvent("select", this._toggleLayout.bind(this));
40
+ }
41
+
42
+ if (this._oSegmentedButton) {
43
+ this._oSegmentedButton.attachEvent("select", this._toggleLayout.bind(this));
44
+ }
45
+
46
+ this.setAssociation("toggleControl", vToggle, true);
47
+ };
48
+
49
+ FilterBar.prototype._toggleLayout = function () {
50
+ var _this = this;
51
+
52
+ // Since primary layout is always compact
53
+ // hence set the secondary layout as visual filter only for the first time only
54
+ if (!this._oSecondaryFilterBarLayout) {
55
+ this._oSecondaryFilterBarLayout = new VisualFilterContainer();
56
+ } // do not show Adapt Filters Button for visual layout
57
+
58
+
59
+ if (this._oSecondaryFilterBarLayout.isA("sap.fe.core.controls.filterbar.VisualFilterContainer")) {
60
+ this.setShowAdaptFiltersButton(false);
61
+ } else {
62
+ this.setShowAdaptFiltersButton(true);
63
+ } // get all filter fields and button of the current layout
64
+
65
+
66
+ var oCurrentFilterBarLayout = this._oFilterBarLayout;
67
+ var oFilterItems = this.getFilterItems();
68
+ var aFilterFields = oCurrentFilterBarLayout.getAllFilterFields();
69
+ var aSortedFilterFields = this.getSortedFilterFields(oFilterItems, aFilterFields);
70
+ var aButtons = oCurrentFilterBarLayout.getAllButtons();
71
+ var aVisualFilterFields = oCurrentFilterBarLayout.getAllVisualFilterFields && oCurrentFilterBarLayout.getAllVisualFilterFields();
72
+
73
+ if (this._oSecondaryFilterBarLayout.isA("sap.fe.core.controls.filterbar.VisualFilterContainer")) {
74
+ this._oSecondaryFilterBarLayout.setAllFilterFields(aSortedFilterFields, aVisualFilterFields);
75
+ } // use secondary filter bar layout as new layout
76
+
77
+
78
+ this._oFilterBarLayout = this._oSecondaryFilterBarLayout; // insert all filter fields from current layout to new layout
79
+
80
+ aFilterFields.forEach(function (oFilterField, iIndex) {
81
+ oCurrentFilterBarLayout.removeFilterField(oFilterField);
82
+
83
+ _this._oFilterBarLayout.insertFilterField(oFilterField, iIndex);
84
+ }); // insert all buttons from the current layout to the new layout
85
+
86
+ aButtons.forEach(function (oButton) {
87
+ oCurrentFilterBarLayout.removeButton(oButton);
88
+
89
+ _this._oFilterBarLayout.addButton(oButton);
90
+ }); // set the current filter bar layout to the secondary one
91
+
92
+ this._oSecondaryFilterBarLayout = oCurrentFilterBarLayout; // update the layout aggregation of the filter bar and rerender the same.
93
+
94
+ this.setAggregation("layout", this._oFilterBarLayout, true);
95
+
96
+ this._oFilterBarLayout.rerender();
97
+ };
98
+
99
+ FilterBar.prototype.getSortedFilterFields = function (aFilterItems, aFilterFields) {
100
+ var aFilterIds = [];
101
+ aFilterItems.forEach(function (oFilterItem) {
102
+ aFilterIds.push(oFilterItem.getId());
103
+ });
104
+ aFilterFields.sort(function (aFirstItem, aSecondItem) {
105
+ var sFirstItemVFId, sSecondItemVFId;
106
+ aFirstItem.getContent().forEach(function (oInnerControl) {
107
+ if (oInnerControl.isA("sap.ui.mdc.FilterField")) {
108
+ sFirstItemVFId = oInnerControl.getId();
109
+ }
110
+ });
111
+ aSecondItem.getContent().forEach(function (oInnerControl) {
112
+ if (oInnerControl.isA("sap.ui.mdc.FilterField")) {
113
+ sSecondItemVFId = oInnerControl.getId();
114
+ }
115
+ });
116
+ return aFilterIds.indexOf(sFirstItemVFId) - aFilterIds.indexOf(sSecondItemVFId);
117
+ });
118
+ return aFilterFields;
119
+ };
120
+
121
+ FilterBar.prototype._createInnerLayout = function () {
122
+ var _this2 = this;
123
+
124
+ this._oFilterBarLayout = new FilterContainer();
125
+ this._cLayoutItem = FilterItemLayout;
126
+
127
+ this._oFilterBarLayout.getInner().addStyleClass("sapUiMdcFilterBarBaseAFLayout");
128
+
129
+ this._addButtons(); // TODO: Check with MDC if there is a better way to load visual filter on the basis of control property
130
+ // _createInnerLayout is called on Init by the filter bar base.
131
+ // This mean that we do not have access to the control properties yet
132
+ // and hence we cannot decide on the basis of control properties whether initial layout should be compact or visual
133
+ // As a result we have to do this workaround to always load the compact layout by default
134
+ // And toogle the same in case the initialLayout was supposed to be visual filters.
135
+
136
+
137
+ var oInnerLayout = this._oFilterBarLayout.getInner();
138
+
139
+ var oFilterContainerInnerLayoutEventDelegate = {
140
+ onBeforeRendering: function () {
141
+ if (_this2.getInitialLayout() === "visual") {
142
+ _this2._toggleLayout();
143
+ }
144
+
145
+ oInnerLayout.removeEventDelegate(oFilterContainerInnerLayoutEventDelegate);
146
+ }
147
+ };
148
+ oInnerLayout.addEventDelegate(oFilterContainerInnerLayoutEventDelegate);
149
+ this.setAggregation("layout", this._oFilterBarLayout, true);
150
+ };
151
+
152
+ FilterBar.prototype.exit = function () {
153
+ MdcFilterBar.prototype.exit.apply(this, []); // Sometimes upon external navigation this._SegmentedButton is already destroyed
154
+ // so check if it exists and then only remove stuff
155
+
156
+ if (this._oSegmentedButton) {
157
+ this._oSegmentedButton.detachEvent("select", this._toggleLayout);
158
+
159
+ delete this._oSegmentedButton;
160
+ }
161
+ };
162
+
163
+ return FilterBar;
164
+ }, false);
165
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJGaWx0ZXJCYXIiLCJNZGNGaWx0ZXJCYXIiLCJleHRlbmQiLCJtZXRhZGF0YSIsInByb3BlcnRpZXMiLCJpbml0aWFsTGF5b3V0IiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsImFzc29jaWF0aW9ucyIsInRvZ2dsZUNvbnRyb2wiLCJtdWx0aXBsZSIsInJlbmRlcmVyIiwiYXBpVmVyc2lvbiIsInByb3RvdHlwZSIsInNldFRvZ2dsZUNvbnRyb2wiLCJ2VG9nZ2xlIiwiX29TZWdtZW50ZWRCdXR0b24iLCJzYXAiLCJ1aSIsImdldENvcmUiLCJieUlkIiwiZ2V0VG9nZ2xlQ29udHJvbCIsImRldGFjaEV2ZW50IiwiX3RvZ2dsZUxheW91dCIsImJpbmQiLCJhdHRhY2hFdmVudCIsInNldEFzc29jaWF0aW9uIiwiX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXQiLCJWaXN1YWxGaWx0ZXJDb250YWluZXIiLCJpc0EiLCJzZXRTaG93QWRhcHRGaWx0ZXJzQnV0dG9uIiwib0N1cnJlbnRGaWx0ZXJCYXJMYXlvdXQiLCJfb0ZpbHRlckJhckxheW91dCIsIm9GaWx0ZXJJdGVtcyIsImdldEZpbHRlckl0ZW1zIiwiYUZpbHRlckZpZWxkcyIsImdldEFsbEZpbHRlckZpZWxkcyIsImFTb3J0ZWRGaWx0ZXJGaWVsZHMiLCJnZXRTb3J0ZWRGaWx0ZXJGaWVsZHMiLCJhQnV0dG9ucyIsImdldEFsbEJ1dHRvbnMiLCJhVmlzdWFsRmlsdGVyRmllbGRzIiwiZ2V0QWxsVmlzdWFsRmlsdGVyRmllbGRzIiwic2V0QWxsRmlsdGVyRmllbGRzIiwiZm9yRWFjaCIsIm9GaWx0ZXJGaWVsZCIsImlJbmRleCIsInJlbW92ZUZpbHRlckZpZWxkIiwiaW5zZXJ0RmlsdGVyRmllbGQiLCJvQnV0dG9uIiwicmVtb3ZlQnV0dG9uIiwiYWRkQnV0dG9uIiwic2V0QWdncmVnYXRpb24iLCJyZXJlbmRlciIsImFGaWx0ZXJJdGVtcyIsImFGaWx0ZXJJZHMiLCJvRmlsdGVySXRlbSIsInB1c2giLCJnZXRJZCIsInNvcnQiLCJhRmlyc3RJdGVtIiwiYVNlY29uZEl0ZW0iLCJzRmlyc3RJdGVtVkZJZCIsInNTZWNvbmRJdGVtVkZJZCIsImdldENvbnRlbnQiLCJvSW5uZXJDb250cm9sIiwiaW5kZXhPZiIsIl9jcmVhdGVJbm5lckxheW91dCIsIkZpbHRlckNvbnRhaW5lciIsIl9jTGF5b3V0SXRlbSIsIkZpbHRlckl0ZW1MYXlvdXQiLCJnZXRJbm5lciIsImFkZFN0eWxlQ2xhc3MiLCJfYWRkQnV0dG9ucyIsIm9Jbm5lckxheW91dCIsIm9GaWx0ZXJDb250YWluZXJJbm5lckxheW91dEV2ZW50RGVsZWdhdGUiLCJvbkJlZm9yZVJlbmRlcmluZyIsImdldEluaXRpYWxMYXlvdXQiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwiYWRkRXZlbnREZWxlZ2F0ZSIsImV4aXQiLCJhcHBseSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQUVBLE1BQU1BLFNBQVMsR0FBR0MsWUFBWSxDQUFDQyxNQUFiLENBQW9CLGdDQUFwQixFQUFzRDtBQUN2RUMsSUFBQUEsUUFBUSxFQUFFO0FBQ1RDLE1BQUFBLFVBQVUsRUFBRTtBQUNYQyxRQUFBQSxhQUFhLEVBQUU7QUFDZEMsVUFBQUEsSUFBSSxFQUFFLFFBRFE7QUFFZEMsVUFBQUEsWUFBWSxFQUFFO0FBRkE7QUFESixPQURIO0FBT1RDLE1BQUFBLFlBQVksRUFBRTtBQUNiO0FBQ0g7QUFDQTtBQUNHQyxRQUFBQSxhQUFhLEVBQUU7QUFDZEgsVUFBQUEsSUFBSSxFQUFFLHVCQURRO0FBRWRJLFVBQUFBLFFBQVEsRUFBRTtBQUZJO0FBSkY7QUFQTCxLQUQ2RDtBQWtCdkVDLElBQUFBLFFBQVEsRUFBRTtBQUNUQyxNQUFBQSxVQUFVLEVBQUU7QUFESDtBQWxCNkQsR0FBdEQsQ0FBbEI7O0FBc0JBWixFQUFBQSxTQUFTLENBQUNhLFNBQVYsQ0FBb0JDLGdCQUFwQixHQUF1QyxVQUFTQyxPQUFULEVBQXVCO0FBQzdELFFB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c0NvbnRlbnQiOlsiaW1wb3J0IE1kY0ZpbHRlckJhciBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJCYXJcIjtcbmltcG9ydCBGaWx0ZXJJdGVtTGF5b3V0IGZyb20gXCJzYXAvdWkvbWRjL2ZpbHRlcmJhci9hbGlnbmVkL0ZpbHRlckl0ZW1MYXlvdXRcIjtcbmltcG9ydCBWaXN1YWxGaWx0ZXJDb250YWluZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL2ZpbHRlcmJhci9WaXN1YWxGaWx0ZXJDb250YWluZXJcIjtcbmltcG9ydCBGaWx0ZXJDb250YWluZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL2ZpbHRlcmJhci9GaWx0ZXJDb250YWluZXJcIjtcbmNvbnN0IEZpbHRlckJhciA9IE1kY0ZpbHRlckJhci5leHRlbmQoXCJzYXAuZmUuY29yZS5jb250cm9scy5GaWx0ZXJCYXJcIiwge1xuXHRtZXRhZGF0YToge1xuXHRcdHByb3BlcnRpZXM6IHtcblx0XHRcdGluaXRpYWxMYXlvdXQ6IHtcblx0XHRcdFx0dHlwZTogXCJzdHJpbmdcIixcblx0XHRcdFx0ZGVmYXVsdFZhbHVlOiBcImNvbXBhY3RcIlxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0YXNzb2NpYXRpb25zOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIENvbnRyb2wgd2hpY2ggYWxsb3dzIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiB2aXN1YWwgYW5kIG5vcm1hbCBmaWx0ZXIgbGF5b3V0c1xuXHRcdFx0ICovXG5cdFx0XHR0b2dnbGVDb250cm9sOiB7XG5cdFx0XHRcdHR5cGU6IFwic2FwLm0uU2VnbWVudGVkQnV0dG9uXCIsXG5cdFx0XHRcdG11bHRpcGxlOiBmYWxzZVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0cmVuZGVyZXI6IHtcblx0XHRhcGlWZXJzaW9uOiAyXG5cdH1cbn0pO1xuRmlsdGVyQmFyLnByb3RvdHlwZS5zZXRUb2dnbGVDb250cm9sID0gZnVuY3Rpb24odlRvZ2dsZTogYW55KSB7XG5cdGlmICh0eXBlb2YgdlRvZ2dsZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHRoaXMuX29TZWdtZW50ZWRCdXR0b24gPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQodlRvZ2dsZSk7XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy5fb1NlZ21lbnRlZEJ1dHRvbiA9IHZUb2dnbGU7XG5cdH1cblxuXHRpZiAodGhpcy5nZXRUb2dnbGVDb250cm9sKCkgJiYgdGhpcy5fb1NlZ21lbnRlZEJ1dHRvbikge1xuXHRcdHRoaXMuX29TZWdtZW50ZWRCdXR0b24uZGV0YWNoRXZlbnQoXCJzZWxlY3RcIiwgdGhpcy5fdG9nZ2xlTGF5b3V0LmJpbmQodGhpcykpO1xuXHR9XG5cdGlmICh0aGlzLl9vU2VnbWVudGVkQnV0dG9uKSB7XG5cdFx0dGhpcy5fb1NlZ21lbnRlZEJ1dHRvbi5hdHRhY2hFdmVudChcInNlbGVjdFwiLCB0aGlzLl90b2dnbGVMYXlvdXQuYmluZCh0aGlzKSk7XG5cdH1cblx0dGhpcy5zZXRBc3NvY2lhdGlvbihcInRvZ2dsZUNvbnRyb2xcIiwgdlRvZ2dsZSwgdHJ1ZSk7XG59O1xuRmlsdGVyQmFyLnByb3RvdHlwZS5fdG9nZ2xlTGF5b3V0ID0gZnVuY3Rpb24oKSB7XG5cdC8vIFNpbmNlIHByaW1hcnkgbGF5b3V0IGlzIGFsd2F5cyBjb21wYWN0XG5cdC8vIGhlbmNlIHNldCB0aGUgc2Vjb25kYXJ5IGxheW91dCBhcyB2aXN1YWwgZmlsdGVyIG9ubHkgZm9yIHRoZSBmaXJzdCB0aW1lIG9ubHlcblx0aWYgKCF0aGlzLl9vU2Vjb25kYXJ5RmlsdGVyQmFyTGF5b3V0KSB7XG5cdFx0dGhpcy5fb1NlY29uZGFyeUZpbHRlckJhckxheW91dCA9IG5ldyBWaXN1YWxGaWx0ZXJDb250YWluZXIoKTtcblx0fVxuXG5cdC8vIGRvIG5vdCBzaG93IEFkYXB0IEZpbHRlcnMgQnV0dG9uIGZvciB2aXN1YWwgbGF5b3V0XG5cdGlmICh0aGlzLl9vU2Vjb25kYXJ5RmlsdGVyQmFyTGF5b3V0LmlzQShcInNhcC5mZS5jb3JlLmNvbnRyb2xzLmZpbHRlcmJhci5WaXN1YWxGaWx0ZXJDb250YWluZXJcIikpIHtcblx0XHR0aGlzLnNldFNob3dBZGFwdEZpbHRlcnNCdXR0b24oZmFsc2UpO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMuc2V0U2hvd0FkYXB0RmlsdGVyc0J1dHRvbih0cnVlKTtcblx0fVxuXG5cdC8vIGdldCBhbGwgZmlsdGVyIGZpZWxkcyBhbmQgYnV0dG9uIG9mIHRoZSBjdXJyZW50IGxheW91dFxuXHRjb25zdCBvQ3VycmVudEZpbHRlckJhckxheW91dCA9IHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQ7XG5cdGNvbnN0IG9GaWx0ZXJJdGVtcyA9IHRoaXMuZ2V0RmlsdGVySXRlbXMoKTtcblx0Y29uc3QgYUZpbHRlckZpZWxkcyA9IG9DdXJyZW50RmlsdGVyQmFyTGF5b3V0LmdldEFsbEZpbHRlckZpZWxkcygpO1xuXHRjb25zdCBhU29ydGVkRmlsdGVyRmllbGRzID0gdGhpcy5nZXRTb3J0ZWRGaWx0ZXJGaWVsZHMob0ZpbHRlckl0ZW1zLCBhRmlsdGVyRmllbGRzKTtcblx0Y29uc3QgYUJ1dHRvbnMgPSBvQ3VycmVudEZpbHRlckJhckxheW91dC5nZXRBbGxCdXR0b25zKCk7XG5cdGNvbnN0IGFWaXN1YWxGaWx0ZXJGaWVsZHMgPSBvQ3VycmVudEZpbHRlckJhckxheW91dC5nZXRBbGxWaXN1YWxGaWx0ZXJGaWVsZHMgJiYgb0N1cnJlbnRGaWx0ZXJCYXJMYXlvdXQuZ2V0QWxsVmlzdWFsRmlsdGVyRmllbGRzKCk7XG5cdGlmICh0aGlzLl9vU2Vjb25kYXJ5RmlsdGVyQmFyTGF5b3V0LmlzQShcInNhcC5mZS5jb3JlLmNvbnRyb2xzLmZpbHRlcmJhci5WaXN1YWxGaWx0ZXJDb250YWluZXJcIikpIHtcblx0XHR0aGlzLl9vU2Vjb25kYXJ5RmlsdGVyQmFyTGF5b3V0LnNldEFsbEZpbHRlckZpZWxkcyhhU29ydGVkRmlsdGVyRmllbGRzLCBhVmlzdWFsRmlsdGVyRmllbGRzKTtcblx0fVxuXHQvLyB1c2Ugc2Vjb25kYXJ5IGZpbHRlciBiYXIgbGF5b3V0IGFzIG5ldyBsYXlvdXRcblx0dGhpcy5fb0ZpbHRlckJhckxheW91dCA9IHRoaXMuX29TZWNvbmRhcnlGaWx0ZXJCYXJMYXlvdXQ7XG5cblx0Ly8gaW5zZXJ0IGFsbCBmaWx0ZXIgZmllbGRzIGZyb20gY3VycmVudCBsYXlvdXQgdG8gbmV3IGxheW91dFxuXHRhRmlsdGVyRmllbGRzLmZvckVhY2goKG9GaWx0ZXJGaWVsZDogYW55LCBpSW5kZXg6IGFueSkgPT4ge1xuXHRcdG9DdXJyZW50RmlsdGVyQmFyTGF5b3V0LnJlbW92ZUZpbHRlckZpZWxkKG9GaWx0ZXJGaWVsZCk7XG5cdFx0dGhpcy5fb0ZpbHRlckJhckxheW91dC5pbnNlcnRGaWx0ZXJGaWVsZChvRmlsdGVyRmllbGQsIGlJbmRleCk7XG5cdH0pO1xuXHQvLyBpbnNlcnQgYWxsIGJ1dHRvbnMgZnJvbSB0aGUgY3VycmVudCBsYXlvdXQgdG8gdGhlIG5ldyBsYXlvdXRcblx0YUJ1dHRvbnMuZm9yRWFjaCgob0J1dHRvbjogYW55KSA9PiB7XG5cdFx0b0N1cnJlbnRGaWx0ZXJCYXJMYXlvdXQucmVtb3ZlQnV0dG9uKG9CdXR0b24pO1xuXHRcdHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQuYWRkQnV0dG9uKG9CdXR0b24pO1xuXHR9KTtcblxuXHQvLyBzZXQgdGhlIGN1cnJlbnQgZmlsdGVyIGJhciBsYXlvdXQgdG8gdGhlIHNlY29uZGFyeSBvbmVcblx0dGhpcy5fb1NlY29uZGFyeUZpbHRlckJhckxheW91dCA9IG9DdXJyZW50RmlsdGVyQmFyTGF5b3V0O1xuXG5cdC8vIHVwZGF0ZSB0aGUgbGF5b3V0IGFnZ3JlZ2F0aW9uIG9mIHRoZSBmaWx0ZXIgYmFyIGFuZCByZXJlbmRlciB0aGUgc2FtZS5cblx0dGhpcy5zZXRBZ2dyZWdhdGlvbihcImxheW91dFwiLCB0aGlzLl9vRmlsdGVyQmFyTGF5b3V0LCB0cnVlKTtcblx0dGhpcy5fb0ZpbHRlckJhckxheW91dC5yZXJlbmRlcigpO1xufTtcbkZpbHRlckJhci5wcm90b3R5cGUuZ2V0U29ydGVkRmlsdGVyRmllbGRzID0gZnVuY3Rpb24oYUZpbHRlckl0ZW1zOiBhbnksIGFGaWx0ZXJGaWVsZHM6IGFueSkge1xuXHRjb25zdCBhRmlsdGVySWRzOiBhbnlbXSA9IFtdO1xuXHRhRmlsdGVySXRlbXMuZm9yRWFjaChmdW5jdGlvbihvRmlsdGVySXRlbTogYW55KSB7XG5cdFx0YUZpbHRlcklkcy5wdXNoKG9GaWx0ZXJJdGVtLmdldElkKCkpO1xuXHR9KTtcblx0YUZpbHRlckZpZWxkcy5zb3J0KGZ1bmN0aW9uKGFGaXJzdEl0ZW06IGFueSwgYVNlY29uZEl0ZW06IGFueSkge1xuXHRcdGxldCBzRmlyc3RJdGVtVkZJZCwgc1NlY29uZEl0ZW1WRklkO1xuXHRcdGFGaXJzdEl0ZW0uZ2V0Q29udGVudCgpLmZvckVhY2goZnVuY3Rpb24ob0lubmVyQ29udHJvbDogYW55KSB7XG5cdFx0XHRpZiAob0lubmVyQ29udHJvbC5pc0EoXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpKSB7XG5cdFx0XHRcdHNGaXJzdEl0ZW1WRklkID0gb0lubmVyQ29udHJvbC5nZXRJZCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGFTZWNvbmRJdGVtLmdldENvbnRlbnQoKS5mb3JFYWNoKGZ1bmN0aW9uKG9Jbm5lckNvbnRyb2w6IGFueSkge1xuXHRcdFx0aWYgKG9Jbm5lckNvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5GaWx0ZXJGaWVsZFwiKSkge1xuXHRcdFx0XHRzU2Vjb25kSXRlbVZGSWQgPSBvSW5uZXJDb250cm9sLmdldElkKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFGaWx0ZXJJZHMuaW5kZXhPZihzRmlyc3RJdGVtVkZJZCkgLSBhRmlsdGVySWRzLmluZGV4T2Yoc1NlY29uZEl0ZW1WRklkKTtcblx0fSk7XG5cdHJldHVybiBhRmlsdGVyRmllbGRzO1xufTtcbkZpbHRlckJhci5wcm90b3R5cGUuX2NyZWF0ZUlubmVyTGF5b3V0ID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQgPSBuZXcgRmlsdGVyQ29udGFpbmVyKCk7XG5cdHRoaXMuX2NMYXlvdXRJdGVtID0gRmlsdGVySXRlbUxheW91dDtcblx0dGhpcy5fb0ZpbHRlckJhckxheW91dC5nZXRJbm5lcigpLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaU1kY0ZpbHRlckJhckJhc2VBRkxheW91dFwiKTtcblx0dGhpcy5fYWRkQnV0dG9ucygpO1xuXG5cdC8vIFRPRE86IENoZWNrIHdpdGggTURDIGlmIHRoZXJlIGlzIGEgYmV0dGVyIHdheSB0byBsb2FkIHZpc3VhbCBmaWx0ZXIgb24gdGhlIGJhc2lzIG9mIGNvbnRyb2wgcHJvcGVydHlcblx0Ly8gX2NyZWF0ZUlubmVyTGF5b3V0IGlzIGNhbGxlZCBvbiBJbml0IGJ5IHRoZSBmaWx0ZXIgYmFyIGJhc2UuXG5cdC8vIFRoaXMgbWVhbiB0aGF0IHdlIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgY29udHJvbCBwcm9wZXJ0aWVzIHlldFxuXHQvLyBhbmQgaGVuY2Ugd2UgY2Fubm90IGRlY2lkZSBvbiB0aGUgYmFzaXMgb2YgY29udHJvbCBwcm9wZXJ0aWVzIHdoZXRoZXIgaW5pdGlhbCBsYXlvdXQgc2hvdWxkIGJlIGNvbXBhY3Qgb3IgdmlzdWFsXG5cdC8vIEFzIGEgcmVzdWx0IHdlIGhhdmUgdG8gZG8gdGhpcyB3b3JrYXJvdW5kIHRvIGFsd2F5cyBsb2FkIHRoZSBjb21wYWN0IGxheW91dCBieSBkZWZhdWx0XG5cdC8vIEFuZCB0b29nbGUgdGhlIHNhbWUgaW4gY2FzZSB0aGUgaW5pdGlhbExheW91dCB3YXMgc3VwcG9zZWQgdG8gYmUgdmlzdWFsIGZpbHRlcnMuXG5cdGNvbnN0IG9Jbm5lckxheW91dCA9IHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQuZ2V0SW5uZXIoKTtcblx0Y29uc3Qgb0ZpbHRlckNvbnRhaW5lcklubmVyTGF5b3V0RXZlbnREZWxlZ2F0ZSA9IHtcblx0XHRvbkJlZm9yZVJlbmRlcmluZzogKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuZ2V0SW5pdGlhbExheW91dCgpID09PSBcInZpc3VhbFwiKSB7XG5cdFx0XHRcdHRoaXMuX3RvZ2dsZUxheW91dCgpO1xuXHRcdFx0fVxuXHRcdFx0b0lubmVyTGF5b3V0LnJlbW92ZUV2ZW50RGVsZWdhdGUob0ZpbHRlckNvbnRhaW5lcklubmVyTGF5b3V0RXZlbnREZWxlZ2F0ZSk7XG5cdFx0fVxuXHR9O1xuXHRvSW5uZXJMYXlvdXQuYWRkRXZlbnREZWxlZ2F0ZShvRmlsdGVyQ29udGFpbmVySW5uZXJMYXlvdXRFdmVudERlbGVnYXRlKTtcblxuXHR0aGlzLnNldEFnZ3JlZ2F0aW9uKFwibGF5b3V0XCIsIHRoaXMuX29GaWx0ZXJCYXJMYXlvdXQsIHRydWUpO1xufTtcbkZpbHRlckJhci5wcm90b3R5cGUuZXhpdCA9IGZ1bmN0aW9uKCkge1xuXHQoTWRjRmlsdGVyQmFyLnByb3RvdHlwZSBhcyBhbnkpLmV4aXQuYXBwbHkodGhpcywgW10pO1xuXHQvLyBTb21ldGltZXMgdXBvbiBleHRlcm5hbCBuYXZpZ2F0aW9uIHRoaXMuX1NlZ21lbnRlZEJ1dHRvbiBpcyBhbHJlYWR5IGRlc3Ryb3llZFxuXHQvLyBzbyBjaGVjayBpZiBpdCBleGlzdHMgYW5kIHRoZW4gb25seSByZW1vdmUgc3R1ZmZcblx0aWYgKHRoaXMuX29TZWdtZW50ZWRCdXR0b24pIHtcblx0XHR0aGlzLl9vU2VnbWVudGVkQnV0dG9uLmRldGFjaEV2ZW50KFwic2VsZWN0XCIsIHRoaXMuX3RvZ2dsZUxheW91dCk7XG5cdFx0ZGVsZXRlIHRoaXMuX29TZWdtZW50ZWRCdXR0b247XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZpbHRlckJhcjtcbiJdfQ==
@@ -0,0 +1,143 @@
1
+ import MdcFilterBar from "sap/ui/mdc/FilterBar";
2
+ import FilterItemLayout from "sap/ui/mdc/filterbar/aligned/FilterItemLayout";
3
+ import VisualFilterContainer from "sap/fe/core/controls/filterbar/VisualFilterContainer";
4
+ import FilterContainer from "sap/fe/core/controls/filterbar/FilterContainer";
5
+ const FilterBar = MdcFilterBar.extend("sap.fe.core.controls.FilterBar", {
6
+ metadata: {
7
+ properties: {
8
+ initialLayout: {
9
+ type: "string",
10
+ defaultValue: "compact"
11
+ }
12
+ },
13
+ associations: {
14
+ /**
15
+ * Control which allows for switching between visual and normal filter layouts
16
+ */
17
+ toggleControl: {
18
+ type: "sap.m.SegmentedButton",
19
+ multiple: false
20
+ }
21
+ }
22
+ },
23
+ renderer: {
24
+ apiVersion: 2
25
+ }
26
+ });
27
+ FilterBar.prototype.setToggleControl = function(vToggle: any) {
28
+ if (typeof vToggle === "string") {
29
+ this._oSegmentedButton = sap.ui.getCore().byId(vToggle);
30
+ } else {
31
+ this._oSegmentedButton = vToggle;
32
+ }
33
+
34
+ if (this.getToggleControl() && this._oSegmentedButton) {
35
+ this._oSegmentedButton.detachEvent("select", this._toggleLayout.bind(this));
36
+ }
37
+ if (this._oSegmentedButton) {
38
+ this._oSegmentedButton.attachEvent("select", this._toggleLayout.bind(this));
39
+ }
40
+ this.setAssociation("toggleControl", vToggle, true);
41
+ };
42
+ FilterBar.prototype._toggleLayout = function() {
43
+ // Since primary layout is always compact
44
+ // hence set the secondary layout as visual filter only for the first time only
45
+ if (!this._oSecondaryFilterBarLayout) {
46
+ this._oSecondaryFilterBarLayout = new VisualFilterContainer();
47
+ }
48
+
49
+ // do not show Adapt Filters Button for visual layout
50
+ if (this._oSecondaryFilterBarLayout.isA("sap.fe.core.controls.filterbar.VisualFilterContainer")) {
51
+ this.setShowAdaptFiltersButton(false);
52
+ } else {
53
+ this.setShowAdaptFiltersButton(true);
54
+ }
55
+
56
+ // get all filter fields and button of the current layout
57
+ const oCurrentFilterBarLayout = this._oFilterBarLayout;
58
+ const oFilterItems = this.getFilterItems();
59
+ const aFilterFields = oCurrentFilterBarLayout.getAllFilterFields();
60
+ const aSortedFilterFields = this.getSortedFilterFields(oFilterItems, aFilterFields);
61
+ const aButtons = oCurrentFilterBarLayout.getAllButtons();
62
+ const aVisualFilterFields = oCurrentFilterBarLayout.getAllVisualFilterFields && oCurrentFilterBarLayout.getAllVisualFilterFields();
63
+ if (this._oSecondaryFilterBarLayout.isA("sap.fe.core.controls.filterbar.VisualFilterContainer")) {
64
+ this._oSecondaryFilterBarLayout.setAllFilterFields(aSortedFilterFields, aVisualFilterFields);
65
+ }
66
+ // use secondary filter bar layout as new layout
67
+ this._oFilterBarLayout = this._oSecondaryFilterBarLayout;
68
+
69
+ // insert all filter fields from current layout to new layout
70
+ aFilterFields.forEach((oFilterField: any, iIndex: any) => {
71
+ oCurrentFilterBarLayout.removeFilterField(oFilterField);
72
+ this._oFilterBarLayout.insertFilterField(oFilterField, iIndex);
73
+ });
74
+ // insert all buttons from the current layout to the new layout
75
+ aButtons.forEach((oButton: any) => {
76
+ oCurrentFilterBarLayout.removeButton(oButton);
77
+ this._oFilterBarLayout.addButton(oButton);
78
+ });
79
+
80
+ // set the current filter bar layout to the secondary one
81
+ this._oSecondaryFilterBarLayout = oCurrentFilterBarLayout;
82
+
83
+ // update the layout aggregation of the filter bar and rerender the same.
84
+ this.setAggregation("layout", this._oFilterBarLayout, true);
85
+ this._oFilterBarLayout.rerender();
86
+ };
87
+ FilterBar.prototype.getSortedFilterFields = function(aFilterItems: any, aFilterFields: any) {
88
+ const aFilterIds: any[] = [];
89
+ aFilterItems.forEach(function(oFilterItem: any) {
90
+ aFilterIds.push(oFilterItem.getId());
91
+ });
92
+ aFilterFields.sort(function(aFirstItem: any, aSecondItem: any) {
93
+ let sFirstItemVFId, sSecondItemVFId;
94
+ aFirstItem.getContent().forEach(function(oInnerControl: any) {
95
+ if (oInnerControl.isA("sap.ui.mdc.FilterField")) {
96
+ sFirstItemVFId = oInnerControl.getId();
97
+ }
98
+ });
99
+ aSecondItem.getContent().forEach(function(oInnerControl: any) {
100
+ if (oInnerControl.isA("sap.ui.mdc.FilterField")) {
101
+ sSecondItemVFId = oInnerControl.getId();
102
+ }
103
+ });
104
+ return aFilterIds.indexOf(sFirstItemVFId) - aFilterIds.indexOf(sSecondItemVFId);
105
+ });
106
+ return aFilterFields;
107
+ };
108
+ FilterBar.prototype._createInnerLayout = function() {
109
+ this._oFilterBarLayout = new FilterContainer();
110
+ this._cLayoutItem = FilterItemLayout;
111
+ this._oFilterBarLayout.getInner().addStyleClass("sapUiMdcFilterBarBaseAFLayout");
112
+ this._addButtons();
113
+
114
+ // TODO: Check with MDC if there is a better way to load visual filter on the basis of control property
115
+ // _createInnerLayout is called on Init by the filter bar base.
116
+ // This mean that we do not have access to the control properties yet
117
+ // and hence we cannot decide on the basis of control properties whether initial layout should be compact or visual
118
+ // As a result we have to do this workaround to always load the compact layout by default
119
+ // And toogle the same in case the initialLayout was supposed to be visual filters.
120
+ const oInnerLayout = this._oFilterBarLayout.getInner();
121
+ const oFilterContainerInnerLayoutEventDelegate = {
122
+ onBeforeRendering: () => {
123
+ if (this.getInitialLayout() === "visual") {
124
+ this._toggleLayout();
125
+ }
126
+ oInnerLayout.removeEventDelegate(oFilterContainerInnerLayoutEventDelegate);
127
+ }
128
+ };
129
+ oInnerLayout.addEventDelegate(oFilterContainerInnerLayoutEventDelegate);
130
+
131
+ this.setAggregation("layout", this._oFilterBarLayout, true);
132
+ };
133
+ FilterBar.prototype.exit = function() {
134
+ (MdcFilterBar.prototype as any).exit.apply(this, []);
135
+ // Sometimes upon external navigation this._SegmentedButton is already destroyed
136
+ // so check if it exists and then only remove stuff
137
+ if (this._oSegmentedButton) {
138
+ this._oSegmentedButton.detachEvent("select", this._toggleLayout);
139
+ delete this._oSegmentedButton;
140
+ }
141
+ };
142
+
143
+ export default FilterBar;