@sapui5/sap.fe.core 1.100.0 → 1.102.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 (295) hide show
  1. package/package.json +4 -4
  2. package/src/sap/fe/core/.library +2 -3
  3. package/src/sap/fe/core/AppComponent.js +23 -30
  4. package/src/sap/fe/core/AppComponent.ts +35 -40
  5. package/src/sap/fe/core/AppStateHandler.js +8 -8
  6. package/src/sap/fe/core/AppStateHandler.ts +11 -11
  7. package/src/sap/fe/core/BaseController.js +9 -9
  8. package/src/sap/fe/core/BaseController.ts +3 -4
  9. package/src/sap/fe/core/CommonUtils.js +122 -101
  10. package/src/sap/fe/core/CommonUtils.ts +239 -193
  11. package/src/sap/fe/core/ExtensionAPI.js +12 -13
  12. package/src/sap/fe/core/ExtensionAPI.ts +21 -31
  13. package/src/sap/fe/core/PageController.js +19 -13
  14. package/src/sap/fe/core/PageController.ts +40 -34
  15. package/src/sap/fe/core/TemplateComponent.js +198 -123
  16. package/src/sap/fe/core/TemplateComponent.ts +109 -121
  17. package/src/sap/fe/core/TemplateModel.js +7 -9
  18. package/src/sap/fe/core/TemplateModel.ts +3 -3
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +935 -0
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +837 -0
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
  27. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  28. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  29. package/src/sap/fe/core/controllerextensions/EditFlow.js +660 -288
  30. package/src/sap/fe/core/controllerextensions/EditFlow.ts +513 -331
  31. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +11 -11
  32. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -7
  33. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +43 -25
  34. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +132 -103
  35. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +16 -16
  36. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +64 -55
  37. package/src/sap/fe/core/controllerextensions/InternalRouting.js +166 -99
  38. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +187 -149
  39. package/src/sap/fe/core/controllerextensions/KPIManagement.js +14 -14
  40. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -11
  41. package/src/sap/fe/core/controllerextensions/MassEdit.js +13 -12
  42. package/src/sap/fe/core/controllerextensions/MassEdit.ts +22 -22
  43. package/src/sap/fe/core/controllerextensions/MessageHandler.js +14 -26
  44. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +20 -30
  45. package/src/sap/fe/core/controllerextensions/PageReady.js +25 -23
  46. package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -47
  47. package/src/sap/fe/core/controllerextensions/Paginator.js +24 -15
  48. package/src/sap/fe/core/controllerextensions/Paginator.ts +35 -20
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -10
  50. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  51. package/src/sap/fe/core/controllerextensions/Routing.js +11 -11
  52. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  53. package/src/sap/fe/core/controllerextensions/Share.js +34 -16
  54. package/src/sap/fe/core/controllerextensions/Share.ts +50 -32
  55. package/src/sap/fe/core/controllerextensions/SideEffects.js +15 -15
  56. package/src/sap/fe/core/controllerextensions/SideEffects.ts +64 -65
  57. package/src/sap/fe/core/controllerextensions/ViewState.js +27 -31
  58. package/src/sap/fe/core/controllerextensions/ViewState.ts +103 -102
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
  61. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  62. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +90 -132
  63. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
  64. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +18 -8
  65. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +264 -0
  66. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +35 -33
  67. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +100 -0
  68. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  69. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1584 -0
  70. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +190 -159
  71. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +780 -0
  72. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +329 -76
  73. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1149 -0
  74. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +169 -97
  75. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
  76. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
  77. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +592 -0
  78. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +83 -60
  79. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
  80. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +52 -36
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  82. package/src/sap/fe/core/controls/Any.js +28 -0
  83. package/src/sap/fe/core/controls/Any.ts +30 -0
  84. package/src/sap/fe/core/controls/CommandExecution.js +50 -16
  85. package/src/sap/fe/core/controls/CommandExecution.ts +31 -22
  86. package/src/sap/fe/core/controls/ConditionalWrapper.js +136 -65
  87. package/src/sap/fe/core/controls/ConditionalWrapper.ts +49 -58
  88. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +371 -0
  89. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +282 -0
  90. package/src/sap/fe/core/controls/CustomQuickViewPage.js +74 -36
  91. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +23 -32
  92. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +52 -5
  93. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +127 -67
  94. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +127 -67
  95. package/src/sap/fe/core/controls/FieldWrapper.js +171 -87
  96. package/src/sap/fe/core/controls/FieldWrapper.ts +69 -80
  97. package/src/sap/fe/core/controls/FileWrapper.js +360 -0
  98. package/src/sap/fe/core/controls/FileWrapper.ts +202 -0
  99. package/src/sap/fe/core/controls/FilterBar.js +154 -119
  100. package/src/sap/fe/core/controls/FilterBar.ts +128 -123
  101. package/src/sap/fe/core/controls/FormElementWrapper.js +102 -37
  102. package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -35
  103. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  104. package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
  105. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +111 -89
  106. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +86 -82
  107. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -193
  108. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +211 -204
  109. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +152 -116
  110. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +105 -105
  111. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
  112. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
  113. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +41 -81
  114. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  115. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -35
  116. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -35
  117. package/src/sap/fe/core/converters/ManifestSettings.js +3 -1
  118. package/src/sap/fe/core/converters/ManifestSettings.ts +9 -2
  119. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
  120. package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
  121. package/src/sap/fe/core/converters/annotations/DataField.js +20 -5
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +27 -6
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +14 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +23 -28
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +17 -10
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -14
  127. package/src/sap/fe/core/converters/controls/Common/Form.js +16 -18
  128. package/src/sap/fe/core/converters/controls/Common/Form.ts +20 -20
  129. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  130. package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -3
  131. package/src/sap/fe/core/converters/controls/Common/Table.js +389 -173
  132. package/src/sap/fe/core/converters/controls/Common/Table.ts +440 -244
  133. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +26 -16
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -19
  135. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +78 -47
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +146 -107
  137. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
  138. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
  139. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +30 -25
  140. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +39 -34
  141. package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
  142. package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
  143. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  144. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
  145. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  146. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
  147. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +27 -24
  148. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +49 -40
  149. package/src/sap/fe/core/converters/templates/ListReportConverter.js +33 -22
  150. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +77 -62
  151. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -28
  152. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +38 -45
  153. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
  154. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
  155. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
  156. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
  157. package/src/sap/fe/core/formatters/TableFormatter.js +74 -13
  158. package/src/sap/fe/core/formatters/TableFormatter.ts +71 -16
  159. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
  160. package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
  161. package/src/sap/fe/core/fpm/Component.js +46 -17
  162. package/src/sap/fe/core/fpm/Component.ts +11 -16
  163. package/src/sap/fe/core/helpers/AppStartupHelper.js +4 -4
  164. package/src/sap/fe/core/helpers/AppStartupHelper.ts +3 -3
  165. package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
  166. package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
  167. package/src/sap/fe/core/helpers/ClassSupport.js +273 -256
  168. package/src/sap/fe/core/helpers/ClassSupport.ts +315 -237
  169. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  170. package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
  171. package/src/sap/fe/core/helpers/MassEditHelper.js +522 -147
  172. package/src/sap/fe/core/helpers/MassEditHelper.ts +563 -236
  173. package/src/sap/fe/core/helpers/ModelHelper.js +29 -1
  174. package/src/sap/fe/core/helpers/ModelHelper.ts +39 -26
  175. package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
  176. package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
  177. package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -3
  178. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +3 -1
  179. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  180. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  181. package/src/sap/fe/core/helpers/StableIdHelper.js +5 -7
  182. package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -8
  183. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  184. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  185. package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
  186. package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
  187. package/src/sap/fe/core/library.js +13 -5
  188. package/src/sap/fe/core/library.ts +26 -17
  189. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  190. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -3
  191. package/src/sap/fe/core/messagebundle.properties +135 -180
  192. package/src/sap/fe/core/messagebundle_ar.properties +31 -64
  193. package/src/sap/fe/core/messagebundle_bg.properties +31 -64
  194. package/src/sap/fe/core/messagebundle_ca.properties +31 -64
  195. package/src/sap/fe/core/messagebundle_cs.properties +31 -64
  196. package/src/sap/fe/core/messagebundle_cy.properties +32 -65
  197. package/src/sap/fe/core/messagebundle_da.properties +31 -64
  198. package/src/sap/fe/core/messagebundle_de.properties +29 -62
  199. package/src/sap/fe/core/messagebundle_el.properties +32 -65
  200. package/src/sap/fe/core/messagebundle_en.properties +32 -65
  201. package/src/sap/fe/core/messagebundle_en_GB.properties +29 -62
  202. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -74
  203. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +32 -65
  204. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +20 -6
  205. package/src/sap/fe/core/messagebundle_es.properties +31 -64
  206. package/src/sap/fe/core/messagebundle_es_MX.properties +31 -64
  207. package/src/sap/fe/core/messagebundle_et.properties +31 -64
  208. package/src/sap/fe/core/messagebundle_fi.properties +29 -62
  209. package/src/sap/fe/core/messagebundle_fr.properties +36 -69
  210. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -66
  211. package/src/sap/fe/core/messagebundle_hi.properties +29 -62
  212. package/src/sap/fe/core/messagebundle_hr.properties +32 -65
  213. package/src/sap/fe/core/messagebundle_hu.properties +30 -63
  214. package/src/sap/fe/core/messagebundle_id.properties +32 -65
  215. package/src/sap/fe/core/messagebundle_it.properties +31 -64
  216. package/src/sap/fe/core/messagebundle_iw.properties +31 -64
  217. package/src/sap/fe/core/messagebundle_ja.properties +29 -62
  218. package/src/sap/fe/core/messagebundle_kk.properties +31 -64
  219. package/src/sap/fe/core/messagebundle_ko.properties +31 -64
  220. package/src/sap/fe/core/messagebundle_lt.properties +31 -64
  221. package/src/sap/fe/core/messagebundle_lv.properties +32 -65
  222. package/src/sap/fe/core/messagebundle_ms.properties +31 -64
  223. package/src/sap/fe/core/messagebundle_nl.properties +31 -64
  224. package/src/sap/fe/core/messagebundle_no.properties +31 -64
  225. package/src/sap/fe/core/messagebundle_pl.properties +34 -67
  226. package/src/sap/fe/core/messagebundle_pt.properties +32 -65
  227. package/src/sap/fe/core/messagebundle_pt_PT.properties +31 -64
  228. package/src/sap/fe/core/messagebundle_ro.properties +33 -66
  229. package/src/sap/fe/core/messagebundle_ru.properties +33 -66
  230. package/src/sap/fe/core/messagebundle_sh.properties +31 -64
  231. package/src/sap/fe/core/messagebundle_sk.properties +31 -64
  232. package/src/sap/fe/core/messagebundle_sl.properties +29 -62
  233. package/src/sap/fe/core/messagebundle_sv.properties +30 -63
  234. package/src/sap/fe/core/messagebundle_th.properties +31 -64
  235. package/src/sap/fe/core/messagebundle_tr.properties +31 -64
  236. package/src/sap/fe/core/messagebundle_uk.properties +32 -65
  237. package/src/sap/fe/core/messagebundle_vi.properties +31 -64
  238. package/src/sap/fe/core/messagebundle_zh_CN.properties +32 -65
  239. package/src/sap/fe/core/messagebundle_zh_TW.properties +34 -67
  240. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +4 -4
  241. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
  242. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +5 -5
  243. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -2
  244. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +11 -8
  245. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -13
  246. package/src/sap/fe/core/services/NavigationServiceFactory.js +5 -5
  247. package/src/sap/fe/core/services/NavigationServiceFactory.ts +9 -5
  248. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -4
  249. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +1 -1
  250. package/src/sap/fe/core/services/RoutingServiceFactory.js +105 -66
  251. package/src/sap/fe/core/services/RoutingServiceFactory.ts +59 -49
  252. package/src/sap/fe/core/services/ShellServicesFactory.js +104 -29
  253. package/src/sap/fe/core/services/ShellServicesFactory.ts +64 -30
  254. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
  255. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
  256. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +11 -10
  257. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +38 -51
  258. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
  259. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +6 -3
  260. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  261. package/src/sap/fe/core/support/CommonHelper.ts +0 -3
  262. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -9
  263. package/src/sap/fe/core/templating/DataModelPathHelper.ts +32 -38
  264. package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
  265. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +27 -6
  266. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
  267. package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
  268. package/src/sap/fe/core/templating/FilterHelper.js +4 -4
  269. package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
  270. package/src/sap/fe/core/templating/PropertyHelper.js +70 -33
  271. package/src/sap/fe/core/templating/PropertyHelper.ts +49 -27
  272. package/src/sap/fe/core/templating/UIFormatters.js +133 -22
  273. package/src/sap/fe/core/templating/UIFormatters.ts +144 -50
  274. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  275. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  276. package/src/sap/fe/core/type/Email.js +26 -8
  277. package/src/sap/fe/core/type/Email.ts +8 -7
  278. package/src/sap/fe/core/AnnotationHelper.js +0 -312
  279. package/src/sap/fe/core/AnnotationHelper.ts +0 -315
  280. package/src/sap/fe/core/RouterProxy.js +0 -926
  281. package/src/sap/fe/core/TransactionHelper.js +0 -1562
  282. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -392
  283. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -136
  284. package/src/sap/fe/core/actions/collaboration/Manage.js +0 -262
  285. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +0 -103
  286. package/src/sap/fe/core/actions/draft.js +0 -523
  287. package/src/sap/fe/core/actions/messageHandling.js +0 -567
  288. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  289. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  290. package/src/sap/fe/core/actions/operations.js +0 -1096
  291. package/src/sap/fe/core/actions/sticky.js +0 -130
  292. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -78
  293. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +0 -65
  294. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  295. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
@@ -2,115 +2,175 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/ui/model/json/JSONModel", "sap/ui/core/XMLTemplateProcessor", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/Fragment"], function (Log, JSONModel, XMLTemplateProcessor, XMLPreprocessor, Fragment) {
5
+ sap.ui.define(["sap/base/Log", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel"], function (Log, Fragment, XMLPreprocessor, XMLTemplateProcessor, JSONModel) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
9
 
10
+ var DraftDataLossOptions;
11
+
12
+ (function (DraftDataLossOptions) {
13
+ DraftDataLossOptions["Save"] = "draftDataLossOptionSave";
14
+ DraftDataLossOptions["Keep"] = "draftDataLossOptionKeep";
15
+ DraftDataLossOptions["Discard"] = "draftDataLossOptionDiscard";
16
+ })(DraftDataLossOptions || (DraftDataLossOptions = {}));
17
+
10
18
  var fnOnDataLossConfirmed;
11
19
  var fnOnDataLossCancel;
12
20
 
13
- function fnDataLossConfirmation(onDataLossConfirmed, onDataLossCancel, oController, bSkipBindingToView) {
14
- var oDataLossPopup;
15
- fnOnDataLossConfirmed = onDataLossConfirmed;
21
+ function fnDataLossConfirmation(onDataLossOk, onDataLossCancel, controller, skipBindingToView) {
22
+ // Open the data loss popup and after processing the selected function finally call
23
+ // onDataLossConfirmed which resolves the promise and leads to processing of the originally
24
+ // triggered action like e.g. a back navigation
25
+ var dataLossPopup;
26
+ fnOnDataLossConfirmed = onDataLossOk;
16
27
  fnOnDataLossCancel = onDataLossCancel;
17
- var sFragmentname = "sap.fe.core.controls.DataLossOrDraftDiscard.DataLossDraft";
18
- var oView = oController.getView();
28
+ var fragmentName = "sap.fe.core.controls.DataLossOrDraftDiscard.DataLossDraft";
29
+ var view = controller.getView();
19
30
  var fragmentController = {
20
- onDataLossKeepDraft: function () {
21
- oDataLossPopup.close();
22
- fnOnDataLossConfirmed();
23
- },
24
- onDataLossDiscardDraft: function () {
25
- oDataLossPopup.close();
26
- discardDraft(oController, bSkipBindingToView).then(fnOnDataLossConfirmed).catch(function (oError) {
27
- Log.error("Error while discarding draft", oError);
28
- });
31
+ onDataLossOk: function () {
32
+ var selectedKey = getSelectedKey(dataLossPopup);
33
+
34
+ if (selectedKey === DraftDataLossOptions.Save) {
35
+ saveDocument(controller).then(fnOnDataLossConfirmed).catch(function (error) {
36
+ Log.error("Error while saving document", error);
37
+ });
38
+ dataLossPopup.close();
39
+ } else if (selectedKey === DraftDataLossOptions.Keep) {
40
+ fnOnDataLossConfirmed();
41
+ dataLossPopup.close();
42
+ } else if (selectedKey === DraftDataLossOptions.Discard) {
43
+ discardDraft(controller, skipBindingToView).then(fnOnDataLossConfirmed).catch(function (error) {
44
+ Log.error("Error while discarding draft", error);
45
+ });
46
+ dataLossPopup.close();
47
+ }
29
48
  },
30
49
  onDataLossCancel: function () {
31
- oDataLossPopup.close();
32
50
  fnOnDataLossCancel();
51
+ dataLossPopup.close();
52
+ },
53
+ setDataLossPopup: function (dataLossPopup) {
54
+ controller.dataLossPopup = dataLossPopup;
33
55
  }
34
56
  };
35
-
36
- fragmentController.setDataLossPopup = function (oDataLossPopup) {
37
- oController.dataLossPopup = oDataLossPopup;
38
- };
39
-
40
- var oThis = new JSONModel({
41
- id: oView.getId()
42
- }),
43
- oPreprocessorSettings = {
57
+ var i18nModel = view.getModel("sap.fe.i18n");
58
+ var localThisModel = new JSONModel({}),
59
+ preprocessorSettings = {
44
60
  bindingContexts: {
45
- "this": oThis.createBindingContext("/")
61
+ "this": localThisModel.createBindingContext("/")
46
62
  },
47
63
  models: {
48
- "this": oThis,
49
- "this.i18n": oView.getModel("sap.fe.i18n")
64
+ "this": localThisModel,
65
+ "i18n": i18nModel
50
66
  }
51
67
  };
52
- var oPopoverFragment = XMLTemplateProcessor.loadTemplate(sFragmentname, "fragment");
53
68
 
54
- if (oController.dataLossPopup) {
55
- oDataLossPopup = oController.dataLossPopup;
56
- oDataLossPopup.open();
69
+ if (controller.dataLossPopup) {
70
+ dataLossPopup = controller.dataLossPopup;
71
+ dataLossPopup.open();
72
+ selectAndFocusFirstEntry(dataLossPopup);
57
73
  } else {
58
- Promise.resolve(XMLPreprocessor.process(oPopoverFragment, {
59
- name: sFragmentname
60
- }, oPreprocessorSettings)).then(function (oFragment) {
74
+ var dialogFragment = XMLTemplateProcessor.loadTemplate(fragmentName, "fragment");
75
+ Promise.resolve(XMLPreprocessor.process(dialogFragment, {
76
+ name: fragmentName
77
+ }, preprocessorSettings)).then(function (fragment) {
61
78
  return Fragment.load({
62
- definition: oFragment,
79
+ definition: fragment,
63
80
  controller: fragmentController
64
81
  });
65
- }).then(function (oPopup) {
66
- oDataLossPopup = oPopup;
67
- oView.addDependent(oDataLossPopup);
68
- var oModel = new JSONModel();
69
- oDataLossPopup.setModel(oModel, "dataLoss");
70
- var oi18nModel = oController.getView().getModel("sap.fe.i18n");
71
- oDataLossPopup.setModel(oi18nModel, "i18n");
72
- oDataLossPopup.open();
73
- fragmentController.setDataLossPopup(oDataLossPopup);
74
- }).catch(function (oError) {
75
- Log.error("Error while opening the Discard Dialog fragment", oError);
82
+ }).then(function (popup) {
83
+ dataLossPopup = popup;
84
+ popup.attachAfterOpen(function () {
85
+ selectAndFocusFirstEntry(dataLossPopup);
86
+ });
87
+ view.addDependent(dataLossPopup);
88
+ dataLossPopup.open();
89
+ fragmentController.setDataLossPopup(dataLossPopup);
90
+ }).catch(function (error) {
91
+ Log.error("Error while opening the Discard Dialog fragment", error);
76
92
  });
77
93
  }
78
94
  }
79
95
 
80
- function fnPerformAfterDiscardorKeepDraftImpl(fnPositive, fnNegative, oController, bSkipBindingToView) {
81
- fnDataLossConfirmation(fnPositive, fnNegative, oController, bSkipBindingToView);
82
- }
83
-
84
- function performAfterDiscardorKeepDraft(fnProcessFunction, fnCancelFunction, oController, bSkipBindingToView) {
85
- var oRet = new Promise(function (resolve, reject) {
86
- var fnPositive = function (oContext) {
87
- var oRet = fnProcessFunction(oContext);
88
- resolve(oRet);
96
+ function performAfterDiscardorKeepDraft(processFunctionOnDatalossOk, processFunctionOnDatalossCancel, controller, skipBindingToView) {
97
+ // Depending on if the user closed the data loss popup with Ok or Cancel,
98
+ // execute the provided follow-up function and resolve or reject the promise
99
+ return new Promise(function (resolve, reject) {
100
+ var dataLossPopupOk = function (context) {
101
+ var returnValue = processFunctionOnDatalossOk(context);
102
+ resolve(returnValue);
89
103
  };
90
104
 
91
- var fnNegative = function () {
92
- fnCancelFunction();
105
+ var dataLossPopupCancel = function () {
106
+ processFunctionOnDatalossCancel();
93
107
  reject();
94
108
  };
95
109
 
96
- fnPerformAfterDiscardorKeepDraftImpl(fnPositive, fnNegative, oController, bSkipBindingToView);
110
+ fnDataLossConfirmation(dataLossPopupOk, dataLossPopupCancel, controller, skipBindingToView);
97
111
  });
98
- return oRet;
99
112
  }
100
113
 
101
114
  _exports.performAfterDiscardorKeepDraft = performAfterDiscardorKeepDraft;
102
115
 
103
- function discardDraft(oController, bSkipBindingToView) {
104
- var oParamsContext = oController.getView().getBindingContext();
105
- var mParams = {
116
+ function discardDraft(controller, skipBindingToView) {
117
+ var context = controller.getView().getBindingContext();
118
+ var params = {
106
119
  skipBackNavigation: true,
107
120
  skipDiscardPopover: true,
108
- skipBindingToView: bSkipBindingToView !== undefined ? bSkipBindingToView : true
121
+ skipBindingToView: skipBindingToView !== undefined ? skipBindingToView : true
109
122
  };
110
- return oController.editFlow.cancelDocument(oParamsContext, mParams);
123
+ return controller.editFlow.cancelDocument(context, params);
111
124
  }
112
125
 
113
126
  _exports.discardDraft = discardDraft;
114
- return _exports;
127
+
128
+ function saveDocument(controller) {
129
+ var context = controller.getView().getBindingContext(); // We check if we are on the OP and then call the internal _saveDocument from the OP controller
130
+ // since here some special handling is done for creationRow before editFlow.saveDocument is called.
131
+ // In case of a custom controller we directly call saveDocument from the editFlow
132
+
133
+ if (controller.isA("sap.fe.templates.ObjectPage.ObjectPageController")) {
134
+ return controller._saveDocument(context);
135
+ } else {
136
+ return controller.editFlow.saveDocument(context);
137
+ }
138
+ }
139
+
140
+ _exports.saveDocument = saveDocument;
141
+
142
+ function getSelectedKey(dataLossPopup) {
143
+ // For not using control IDs we introduced customData in the fragment and
144
+ // use it here for finding the correct list in the dialog and for
145
+ // determining the selected option from the list
146
+ var dataLossOptionsList = dataLossPopup.getContent().find(function (element) {
147
+ return element.data("listIdentifier") === "draftDataLossOptionsList";
148
+ });
149
+ return dataLossOptionsList.getSelectedItem().data("itemKey");
150
+ }
151
+
152
+ _exports.getSelectedKey = getSelectedKey;
153
+
154
+ function selectAndFocusFirstEntry(dataLossPopup) {
155
+ // For not using control IDs we introduced customData in the fragment and
156
+ // use it here for finding the correct list in the dialog.
157
+ var dataLossOptionsList = dataLossPopup.getContent().find(function (element) {
158
+ return element.data("listIdentifier") === "draftDataLossOptionsList";
159
+ }); // Preselect the first entry in the list
160
+
161
+ var firstListItemOption = dataLossOptionsList.getItems()[0];
162
+ dataLossOptionsList.setSelectedItem(firstListItemOption); // By default set the focus on the first button of the dialog
163
+
164
+ dataLossPopup.getButtons()[0].focus();
165
+ }
166
+
167
+ _exports.selectAndFocusFirstEntry = selectAndFocusFirstEntry;
168
+ return {
169
+ performAfterDiscardorKeepDraft: performAfterDiscardorKeepDraft,
170
+ discardDraft: discardDraft,
171
+ saveDocument: saveDocument,
172
+ getSelectedKey: getSelectedKey,
173
+ selectAndFocusFirstEntry: selectAndFocusFirstEntry
174
+ };
115
175
  }, false);
116
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyLnRzIl0sIm5hbWVzIjpbImZuT25EYXRhTG9zc0NvbmZpcm1lZCIsImZuT25EYXRhTG9zc0NhbmNlbCIsImZuRGF0YUxvc3NDb25maXJtYXRpb24iLCJvbkRhdGFMb3NzQ29uZmlybWVkIiwib25EYXRhTG9zc0NhbmNlbCIsIm9Db250cm9sbGVyIiwiYlNraXBCaW5kaW5nVG9WaWV3Iiwib0RhdGFMb3NzUG9wdXAiLCJzRnJhZ21lbnRuYW1lIiwib1ZpZXciLCJnZXRWaWV3IiwiZnJhZ21lbnRDb250cm9sbGVyIiwib25EYXRhTG9zc0tlZXBEcmFmdCIsImNsb3NlIiwib25EYXRhTG9zc0Rpc2NhcmREcmFmdCIsImRpc2NhcmREcmFmdCIsInRoZW4iLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwic2V0RGF0YUxvc3NQb3B1cCIsImRhdGFMb3NzUG9wdXAiLCJvVGhpcyIsIkpTT05Nb2RlbCIsImlkIiwiZ2V0SWQiLCJvUHJlcHJvY2Vzc29yU2V0dGluZ3MiLCJiaW5kaW5nQ29udGV4dHMiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm1vZGVscyIsImdldE1vZGVsIiwib1BvcG92ZXJGcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwib3BlbiIsIlByb21pc2UiLCJyZXNvbHZlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIm5hbWUiLCJvRnJhZ21lbnQiLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsIm9Qb3B1cCIsImFkZERlcGVuZGVudCIsIm9Nb2RlbCIsInNldE1vZGVsIiwib2kxOG5Nb2RlbCIsImZuUGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0SW1wbCIsImZuUG9zaXRpdmUiLCJmbk5lZ2F0aXZlIiwicGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0IiwiZm5Qcm9jZXNzRnVuY3Rpb24iLCJmbkNhbmNlbEZ1bmN0aW9uIiwib1JldCIsInJlamVjdCIsIm9Db250ZXh0Iiwib1BhcmFtc0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm1QYXJhbXMiLCJza2lwQmFja05hdmlnYXRpb24iLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJza2lwQmluZGluZ1RvVmlldyIsInVuZGVmaW5lZCIsImVkaXRGbG93IiwiY2FuY2VsRG9jdW1lbnQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7OztBQUtBLE1BQUlBLHFCQUFKO0FBQ0EsTUFBSUMsa0JBQUo7O0FBQ0EsV0FBU0Msc0JBQVQsQ0FBZ0NDLG1CQUFoQyxFQUEwREMsZ0JBQTFELEVBQWlGQyxXQUFqRixFQUFtR0Msa0JBQW5HLEVBQTRIO0FBQzNILFFBQUlDLGNBQUo7QUFDQVAsSUFBQUEscUJBQXFCLEdBQUdHLG1CQUF4QjtBQUNBRixJQUFBQSxrQkFBa0IsR0FBR0csZ0JBQXJCO0FBQ0EsUUFBTUksYUFBYSxHQUFHLDJEQUF0QjtBQUNBLFFBQU1DLEtBQUssR0FBR0osV0FBVyxDQUFDSyxPQUFaLEVBQWQ7QUFDQSxRQUFNQyxrQkFBdUIsR0FBRztBQUMvQkMsTUFBQUEsbUJBQW1CLEVBQUUsWUFBVztBQUMvQkwsUUFBQUEsY0FBYyxDQUFDTSxLQUFmO0FBQ0FiLFFBQUFBLHFCQUFxQjtBQUNyQixPQUo4QjtBQUsvQmMsTUFBQUEsc0JBQXNCLEVBQUUsWUFBVztBQUNsQ1AsUUFBQUEsY0FBYyxDQUFDTSxLQUFmO0FBQ0FFLFFBQUFBLFlBQVksQ0FBQ1YsV0FBRCxFQUFjQyxrQkFBZCxDQUFaLENBQ0VVLElBREYsQ0FDT2hCLHFCQURQLEVBRUVpQixLQUZGLENBRVEsVUFBU0MsTUFBVCxFQUFzQjtBQUM1QkMsVUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsOEJBQVYsRUFBMENGLE1BQTFDO0FBQ0EsU0FKRjtBQUtBLE9BWjhCO0FBYS9CZCxNQUFBQSxnQkFBZ0IsRUFBRSxZQUFXO0FBQzVCRyxRQUFBQSxjQUFjLENBQUNNLEtBQWY7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SSxHQUFHRixpQkFBaUIsQ0FBQ0ksUUFBRCxDQUE5QjtBQUNBdEIsUUFBQUEsT0FBTyxDQUFDb0IsSUFBRCxDQUFQO0FBQ0EsT0FIRDs7QUFJQSxVQUFNSixVQUFVLEdBQUcsWUFBVztBQUM3QkcsUUFBQUEsZ0JBQWdCO0FBQ2hCRSxRQUFBQSxNQUFNO0FBQ04sT0FIRDs7QUFJQVAsTUFBQUEsb0NBQW9DLENBQUNDLFVBQUQsRUFBYUMsVUFBYixFQUF5QmhELFdBQXpCLEVBQXNDQyxrQkFBdEMsQ0FBcEM7QUFDQSxLQVZZLENBQWI7QUFXQSxXQUFPbUQsSUFBUDtBQUNBOzs7O0FBQ00sV0FBUzFDLFlBQVQsQ0FBc0JWLFdBQXRCLEVBQXdDQyxrQkFBeEMsRUFBaUU7QUFDdkUsUUFBTXNELGNBQWMsR0FBR3ZELFdBQVcsQ0FBQ0ssT0FBWixHQUFzQm1ELGlCQUF0QixFQUF2QjtBQUNBLFFBQU1DLE9BQU8sR0FBRztBQUNmQyxNQUFBQSxrQkFBa0IsRUFBRSxJQURMO0FBRWZDLE1BQUFBLGtCQUFrQixFQUFFLElBRkw7QUFHZkMsTUFBQUEsaUJBQWlCLEVBQUUzRCxrQkFBa0IsS0FBSzRELFNBQXZCLEdBQW1DNUQsa0JBQW5DLEdBQXdEO0FBSDVELEtBQWhCO0FBTUEsV0FBT0QsV0FBVyxDQUFDOEQsUUFBWixDQUFxQkMsY0FBckIsQ0FBb0NSLGNBQXBDLEVBQW9ERSxPQUFwRCxDQUFQO0FBQ0EiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IFBvcHVwIGZyb20gXCJzYXAvdWkvY29yZS9Qb3B1cFwiO1xuXG5sZXQgZm5PbkRhdGFMb3NzQ29uZmlybWVkOiBGdW5jdGlvbjtcbmxldCBmbk9uRGF0YUxvc3NDYW5jZWw6IEZ1bmN0aW9uO1xuZnVuY3Rpb24gZm5EYXRhTG9zc0NvbmZpcm1hdGlvbihvbkRhdGFMb3NzQ29uZmlybWVkOiBhbnksIG9uRGF0YUxvc3NDYW5jZWw6IGFueSwgb0NvbnRyb2xsZXI6IGFueSwgYlNraXBCaW5kaW5nVG9WaWV3OiBhbnkpIHtcblx0bGV0IG9EYXRhTG9zc1BvcHVwOiBQb3B1cDtcblx0Zm5PbkRhdGFMb3NzQ29uZmlybWVkID0gb25EYXRhTG9zc0NvbmZpcm1lZDtcblx0Zm5PbkRhdGFMb3NzQ2FuY2VsID0gb25EYXRhTG9zc0NhbmNlbDtcblx0Y29uc3Qgc0ZyYWdtZW50bmFtZSA9IFwic2FwLmZlLmNvcmUuY29udHJvbHMuRGF0YUxvc3NPckRyYWZ0RGlzY2FyZC5EYXRhTG9zc0RyYWZ0XCI7XG5cdGNvbnN0IG9WaWV3ID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpO1xuXHRjb25zdCBmcmFnbWVudENvbnRyb2xsZXI6IGFueSA9IHtcblx0XHRvbkRhdGFMb3NzS2VlcERyYWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdG9EYXRhTG9zc1BvcHVwLmNsb3NlKCk7XG5cdFx0XHRmbk9uRGF0YUxvc3NDb25maXJtZWQoKTtcblx0XHR9LFxuXHRcdG9uRGF0YUxvc3NEaXNjYXJkRHJhZnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0b0RhdGFMb3NzUG9wdXAuY2xvc2UoKTtcblx0XHRcdGRpc2NhcmREcmFmdChvQ29udHJvbGxlciwgYlNraXBCaW5kaW5nVG9WaWV3KVxuXHRcdFx0XHQudGhlbihmbk9uRGF0YUxvc3NDb25maXJtZWQpXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgZHJhZnRcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fSxcblx0XHRvbkRhdGFMb3NzQ2FuY2VsOiBmdW5jdGlvbigpIHtcblx0XHRcdG9EYXRhTG9zc1BvcHVwLmNsb3NlKCk7XG5cdFx0XHRmbk9uRGF0YUxvc3NDYW5jZWwoKTtcblx0XHR9XG5cdH07XG5cdGZyYWdtZW50Q29udHJvbGxlci5zZXREYXRhTG9zc1BvcHVwID0gZnVuY3Rpb24ob0RhdGFMb3NzUG9wdXA6IFBvcHVwKSB7XG5cdFx0b0NvbnRyb2xsZXIuZGF0YUxvc3NQb3B1cCA9IG9EYXRhTG9zc1BvcHVwO1xuXHR9O1xuXG5cdGNvbnN0IG9UaGlzID0gbmV3IEpTT05Nb2RlbCh7XG5cdFx0XHRpZDogb1ZpZXcuZ2V0SWQoKVxuXHRcdH0pLFxuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncyA9IHtcblx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcInRoaXNcIjogb1RoaXMuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHR9LFxuXHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFwidGhpc1wiOiBvVGhpcyxcblx0XHRcdFx0XCJ0aGlzLmkxOG5cIjogb1ZpZXcuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKVxuXHRcdFx0fVxuXHRcdH07XG5cdGNvbnN0IG9Qb3BvdmVyRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50bmFtZSwgXCJmcmFnbWVudFwiKTtcblxuXHRpZiAob0NvbnRyb2xsZXIuZGF0YUxvc3NQb3B1cCkge1xuXHRcdG9EYXRhTG9zc1BvcHVwID0gb0NvbnRyb2xsZXIuZGF0YUxvc3NQb3B1cDtcblx0XHRvRGF0YUxvc3NQb3B1cC5vcGVuKCk7XG5cdH0gZWxzZSB7XG5cdFx0UHJvbWlzZS5yZXNvbHZlKFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKG9Qb3BvdmVyRnJhZ21lbnQsIHsgbmFtZTogc0ZyYWdtZW50bmFtZSB9LCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MpKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24ob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQsIGNvbnRyb2xsZXI6IGZyYWdtZW50Q29udHJvbGxlciB9KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbihvUG9wdXA6IGFueSkge1xuXHRcdFx0XHRvRGF0YUxvc3NQb3B1cCA9IG9Qb3B1cDtcblx0XHRcdFx0b1ZpZXcuYWRkRGVwZW5kZW50KG9EYXRhTG9zc1BvcHVwKTtcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdFx0XHRvRGF0YUxvc3NQb3B1cC5zZXRNb2RlbChvTW9kZWwsIFwiZGF0YUxvc3NcIik7XG5cdFx0XHRcdGNvbnN0IG9pMThuTW9kZWwgPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0b0RhdGFMb3NzUG9wdXAuc2V0TW9kZWwob2kxOG5Nb2RlbCwgXCJpMThuXCIpO1xuXHRcdFx0XHRvRGF0YUxvc3NQb3B1cC5vcGVuKCk7XG5cdFx0XHRcdGZyYWdtZW50Q29udHJvbGxlci5zZXREYXRhTG9zc1BvcHVwKG9EYXRhTG9zc1BvcHVwKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgb3BlbmluZyB0aGUgRGlzY2FyZCBEaWFsb2cgZnJhZ21lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG59XG5mdW5jdGlvbiBmblBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdEltcGwoZm5Qb3NpdGl2ZTogYW55LCBmbk5lZ2F0aXZlOiBhbnksIG9Db250cm9sbGVyOiBhbnksIGJTa2lwQmluZGluZ1RvVmlldzogYW55KSB7XG5cdGZuRGF0YUxvc3NDb25maXJtYXRpb24oZm5Qb3NpdGl2ZSwgZm5OZWdhdGl2ZSwgb0NvbnRyb2xsZXIsIGJTa2lwQmluZGluZ1RvVmlldyk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0KGZuUHJvY2Vzc0Z1bmN0aW9uOiBhbnksIGZuQ2FuY2VsRnVuY3Rpb246IGFueSwgb0NvbnRyb2xsZXI6IGFueSwgYlNraXBCaW5kaW5nVG9WaWV3OiBhbnkpIHtcblx0Y29uc3Qgb1JldCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRjb25zdCBmblBvc2l0aXZlID0gZnVuY3Rpb24ob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1JldCA9IGZuUHJvY2Vzc0Z1bmN0aW9uKG9Db250ZXh0KTtcblx0XHRcdHJlc29sdmUob1JldCk7XG5cdFx0fTtcblx0XHRjb25zdCBmbk5lZ2F0aXZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRmbkNhbmNlbEZ1bmN0aW9uKCk7XG5cdFx0XHRyZWplY3QoKTtcblx0XHR9O1xuXHRcdGZuUGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0SW1wbChmblBvc2l0aXZlLCBmbk5lZ2F0aXZlLCBvQ29udHJvbGxlciwgYlNraXBCaW5kaW5nVG9WaWV3KTtcblx0fSk7XG5cdHJldHVybiBvUmV0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRpc2NhcmREcmFmdChvQ29udHJvbGxlcjogYW55LCBiU2tpcEJpbmRpbmdUb1ZpZXc6IGFueSkge1xuXHRjb25zdCBvUGFyYW1zQ29udGV4dCA9IG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRjb25zdCBtUGFyYW1zID0ge1xuXHRcdHNraXBCYWNrTmF2aWdhdGlvbjogdHJ1ZSxcblx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IHRydWUsXG5cdFx0c2tpcEJpbmRpbmdUb1ZpZXc6IGJTa2lwQmluZGluZ1RvVmlldyAhPT0gdW5kZWZpbmVkID8gYlNraXBCaW5kaW5nVG9WaWV3IDogdHJ1ZVxuXHR9O1xuXG5cdHJldHVybiBvQ29udHJvbGxlci5lZGl0Rmxvdy5jYW5jZWxEb2N1bWVudChvUGFyYW1zQ29udGV4dCwgbVBhcmFtcyk7XG59XG4iXX0=
176
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyLnRzIl0sIm5hbWVzIjpbIkRyYWZ0RGF0YUxvc3NPcHRpb25zIiwiZm5PbkRhdGFMb3NzQ29uZmlybWVkIiwiZm5PbkRhdGFMb3NzQ2FuY2VsIiwiZm5EYXRhTG9zc0NvbmZpcm1hdGlvbiIsIm9uRGF0YUxvc3NPayIsIm9uRGF0YUxvc3NDYW5jZWwiLCJjb250cm9sbGVyIiwic2tpcEJpbmRpbmdUb1ZpZXciLCJkYXRhTG9zc1BvcHVwIiwiZnJhZ21lbnROYW1lIiwidmlldyIsImdldFZpZXciLCJmcmFnbWVudENvbnRyb2xsZXIiLCJzZWxlY3RlZEtleSIsImdldFNlbGVjdGVkS2V5IiwiU2F2ZSIsInNhdmVEb2N1bWVudCIsInRoZW4iLCJjYXRjaCIsImVycm9yIiwiTG9nIiwiY2xvc2UiLCJLZWVwIiwiRGlzY2FyZCIsImRpc2NhcmREcmFmdCIsInNldERhdGFMb3NzUG9wdXAiLCJpMThuTW9kZWwiLCJnZXRNb2RlbCIsImxvY2FsVGhpc01vZGVsIiwiSlNPTk1vZGVsIiwicHJlcHJvY2Vzc29yU2V0dGluZ3MiLCJiaW5kaW5nQ29udGV4dHMiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm1vZGVscyIsIm9wZW4iLCJzZWxlY3RBbmRGb2N1c0ZpcnN0RW50cnkiLCJkaWFsb2dGcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwibmFtZSIsImZyYWdtZW50IiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsInBvcHVwIiwiYXR0YWNoQWZ0ZXJPcGVuIiwiYWRkRGVwZW5kZW50IiwicGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0IiwicHJvY2Vzc0Z1bmN0aW9uT25EYXRhbG9zc09rIiwicHJvY2Vzc0Z1bmN0aW9uT25EYXRhbG9zc0NhbmNlbCIsInJlamVjdCIsImRhdGFMb3NzUG9wdXBPayIsImNvbnRleHQiLCJyZXR1cm5WYWx1ZSIsImRhdGFMb3NzUG9wdXBDYW5jZWwiLCJnZXRCaW5kaW5nQ29udGV4dCIsInBhcmFtcyIsInNraXBCYWNrTmF2aWdhdGlvbiIsInNraXBEaXNjYXJkUG9wb3ZlciIsInVuZGVmaW5lZCIsImVkaXRGbG93IiwiY2FuY2VsRG9jdW1lbnQiLCJpc0EiLCJfc2F2ZURvY3VtZW50IiwiZGF0YUxvc3NPcHRpb25zTGlzdCIsImdldENvbnRlbnQiLCJmaW5kIiwiZWxlbWVudCIsImRhdGEiLCJnZXRTZWxlY3RlZEl0ZW0iLCJmaXJzdExpc3RJdGVtT3B0aW9uIiwiZ2V0SXRlbXMiLCJzZXRTZWxlY3RlZEl0ZW0iLCJnZXRCdXR0b25zIiwiZm9jdXMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7OztNQU9LQSxvQjs7YUFBQUEsb0I7QUFBQUEsSUFBQUEsb0I7QUFBQUEsSUFBQUEsb0I7QUFBQUEsSUFBQUEsb0I7S0FBQUEsb0IsS0FBQUEsb0I7O0FBTUwsTUFBSUMscUJBQUo7QUFDQSxNQUFJQyxrQkFBSjs7QUFDQSxXQUFTQyxzQkFBVCxDQUFnQ0MsWUFBaEMsRUFBbURDLGdCQUFuRCxFQUEwRUMsVUFBMUUsRUFBMkZDLGlCQUEzRixFQUFtSDtBQUNsSDtBQUNBO0FBQ0E7QUFDQSxRQUFJQyxhQUFKO0FBQ0FQLElBQUFBLHFCQUFxQixHQUFHRyxZQUF4QjtBQUNBRixJQUFBQSxrQkFBa0IsR0FBR0csZ0JBQXJCO0FBQ0EsUUFBTUksWUFBWSxHQUFHLDJEQUFyQjtBQUNBLFFBQU1DLElBQUksR0FBR0osVUFBVSxDQUFDSyxPQUFYLEVBQWI7QUFDQSxRQUFNQyxrQkFBdUIsR0FBRztBQUMvQlIsTUFBQUEsWUFBWSxFQUFFLFlBQVk7QUFDekIsWUFBTVMsV0FBVyxHQUFHQyxjQUFjLENBQUNOLGFBQUQsQ0FBbEM7O0FBQ0EsWUFBSUssV0FBVyxLQUFLYixvQkFBb0IsQ0FBQ2UsSUFBekMsRUFBK0M7QUFDOUNDLFVBQUFBLFlBQVks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L0Q7O0FBQ0FsRSxJQUFBQSxhQUFhLENBQUNxRSxVQUFkLEdBQTJCLENBQTNCLEVBQThCQyxLQUE5QjtBQUNBOzs7U0FFYztBQUFFM0IsSUFBQUEsOEJBQThCLEVBQTlCQSw4QkFBRjtBQUFrQzNCLElBQUFBLFlBQVksRUFBWkEsWUFBbEM7QUFBZ0RSLElBQUFBLFlBQVksRUFBWkEsWUFBaEQ7QUFBOERGLElBQUFBLGNBQWMsRUFBZEEsY0FBOUQ7QUFBOEVxQixJQUFBQSx3QkFBd0IsRUFBeEJBO0FBQTlFLEciLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEN1c3RvbUxpc3RJdGVtIGZyb20gXCJzYXAvbS9DdXN0b21MaXN0SXRlbVwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTGlzdCBmcm9tIFwic2FwL20vTGlzdFwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuXG5lbnVtIERyYWZ0RGF0YUxvc3NPcHRpb25zIHtcblx0U2F2ZSA9IFwiZHJhZnREYXRhTG9zc09wdGlvblNhdmVcIixcblx0S2VlcCA9IFwiZHJhZnREYXRhTG9zc09wdGlvbktlZXBcIixcblx0RGlzY2FyZCA9IFwiZHJhZnREYXRhTG9zc09wdGlvbkRpc2NhcmRcIlxufVxuXG5sZXQgZm5PbkRhdGFMb3NzQ29uZmlybWVkOiBGdW5jdGlvbjtcbmxldCBmbk9uRGF0YUxvc3NDYW5jZWw6IEZ1bmN0aW9uO1xuZnVuY3Rpb24gZm5EYXRhTG9zc0NvbmZpcm1hdGlvbihvbkRhdGFMb3NzT2s6IGFueSwgb25EYXRhTG9zc0NhbmNlbDogYW55LCBjb250cm9sbGVyOiBhbnksIHNraXBCaW5kaW5nVG9WaWV3OiBhbnkpIHtcblx0Ly8gT3BlbiB0aGUgZGF0YSBsb3NzIHBvcHVwIGFuZCBhZnRlciBwcm9jZXNzaW5nIHRoZSBzZWxlY3RlZCBmdW5jdGlvbiBmaW5hbGx5IGNhbGxcblx0Ly8gb25EYXRhTG9zc0NvbmZpcm1lZCB3aGljaCByZXNvbHZlcyB0aGUgcHJvbWlzZSBhbmQgbGVhZHMgdG8gcHJvY2Vzc2luZyBvZiB0aGUgb3JpZ2luYWxseVxuXHQvLyB0cmlnZ2VyZWQgYWN0aW9uIGxpa2UgZS5nLiBhIGJhY2sgbmF2aWdhdGlvblxuXHRsZXQgZGF0YUxvc3NQb3B1cDogRGlhbG9nO1xuXHRmbk9uRGF0YUxvc3NDb25maXJtZWQgPSBvbkRhdGFMb3NzT2s7XG5cdGZuT25EYXRhTG9zc0NhbmNlbCA9IG9uRGF0YUxvc3NDYW5jZWw7XG5cdGNvbnN0IGZyYWdtZW50TmFtZSA9IFwic2FwLmZlLmNvcmUuY29udHJvbHMuRGF0YUxvc3NPckRyYWZ0RGlzY2FyZC5EYXRhTG9zc0RyYWZ0XCI7XG5cdGNvbnN0IHZpZXcgPSBjb250cm9sbGVyLmdldFZpZXcoKTtcblx0Y29uc3QgZnJhZ21lbnRDb250cm9sbGVyOiBhbnkgPSB7XG5cdFx0b25EYXRhTG9zc09rOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRjb25zdCBzZWxlY3RlZEtleSA9IGdldFNlbGVjdGVkS2V5KGRhdGFMb3NzUG9wdXApO1xuXHRcdFx0aWYgKHNlbGVjdGVkS2V5ID09PSBEcmFmdERhdGFMb3NzT3B0aW9ucy5TYXZlKSB7XG5cdFx0XHRcdHNhdmVEb2N1bWVudChjb250cm9sbGVyKVxuXHRcdFx0XHRcdC50aGVuKGZuT25EYXRhTG9zc0NvbmZpcm1lZClcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyBkb2N1bWVudFwiLCBlcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGRhdGFMb3NzUG9wdXAuY2xvc2UoKTtcblx0XHRcdH0gZWxzZSBpZiAoc2VsZWN0ZWRLZXkgPT09IERyYWZ0RGF0YUxvc3NPcHRpb25zLktlZXApIHtcblx0XHRcdFx0Zm5PbkRhdGFMb3NzQ29uZmlybWVkKCk7XG5cdFx0XHRcdGRhdGFMb3NzUG9wdXAuY2xvc2UoKTtcblx0XHRcdH0gZWxzZSBpZiAoc2VsZWN0ZWRLZXkgPT09IERyYWZ0RGF0YUxvc3NPcHRpb25zLkRpc2NhcmQpIHtcblx0XHRcdFx0ZGlzY2FyZERyYWZ0KGNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3KVxuXHRcdFx0XHRcdC50aGVuKGZuT25EYXRhTG9zc0NvbmZpcm1lZClcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgZHJhZnRcIiwgZXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRkYXRhTG9zc1BvcHVwLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbkRhdGFMb3NzQ2FuY2VsOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRmbk9uRGF0YUxvc3NDYW5jZWwoKTtcblx0XHRcdGRhdGFMb3NzUG9wdXAuY2xvc2UoKTtcblx0XHR9LFxuXHRcdHNldERhdGFMb3NzUG9wdXA6IGZ1bmN0aW9uIChkYXRhTG9zc1BvcHVwOiBEaWFsb2cpIHtcblx0XHRcdGNvbnRyb2xsZXIuZGF0YUxvc3NQb3B1cCA9IGRhdGFMb3NzUG9wdXA7XG5cdFx0fVxuXHR9O1xuXG5cdGNvbnN0IGkxOG5Nb2RlbCA9IHZpZXcuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0Y29uc3QgbG9jYWxUaGlzTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHt9KSxcblx0XHRwcmVwcm9jZXNzb3JTZXR0aW5ncyA9IHtcblx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcInRoaXNcIjogbG9jYWxUaGlzTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHR9LFxuXHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFwidGhpc1wiOiBsb2NhbFRoaXNNb2RlbCxcblx0XHRcdFx0XCJpMThuXCI6IGkxOG5Nb2RlbFxuXHRcdFx0fVxuXHRcdH07XG5cblx0aWYgKGNvbnRyb2xsZXIuZGF0YUxvc3NQb3B1cCkge1xuXHRcdGRhdGFMb3NzUG9wdXAgPSBjb250cm9sbGVyLmRhdGFMb3NzUG9wdXA7XG5cdFx0ZGF0YUxvc3NQb3B1cC5vcGVuKCk7XG5cdFx0c2VsZWN0QW5kRm9jdXNGaXJzdEVudHJ5KGRhdGFMb3NzUG9wdXApO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGRpYWxvZ0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKGZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKTtcblx0XHRQcm9taXNlLnJlc29sdmUoWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoZGlhbG9nRnJhZ21lbnQsIHsgbmFtZTogZnJhZ21lbnROYW1lIH0sIHByZXByb2Nlc3NvclNldHRpbmdzKSlcblx0XHRcdC50aGVuKChmcmFnbWVudCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7IGRlZmluaXRpb246IGZyYWdtZW50LCBjb250cm9sbGVyOiBmcmFnbWVudENvbnRyb2xsZXIgfSk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKHBvcHVwOiBhbnkpID0+IHtcblx0XHRcdFx0ZGF0YUxvc3NQb3B1cCA9IHBvcHVwO1xuXHRcdFx0XHRwb3B1cC5hdHRhY2hBZnRlck9wZW4oKCkgPT4ge1xuXHRcdFx0XHRcdHNlbGVjdEFuZEZvY3VzRmlyc3RFbnRyeShkYXRhTG9zc1BvcHVwKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZpZXcuYWRkRGVwZW5kZW50KGRhdGFMb3NzUG9wdXApO1xuXHRcdFx0XHRkYXRhTG9zc1BvcHVwLm9wZW4oKTtcblx0XHRcdFx0ZnJhZ21lbnRDb250cm9sbGVyLnNldERhdGFMb3NzUG9wdXAoZGF0YUxvc3NQb3B1cCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIG9wZW5pbmcgdGhlIERpc2NhcmQgRGlhbG9nIGZyYWdtZW50XCIsIGVycm9yKTtcblx0XHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJmb3JtQWZ0ZXJEaXNjYXJkb3JLZWVwRHJhZnQoXG5cdHByb2Nlc3NGdW5jdGlvbk9uRGF0YWxvc3NPazogYW55LFxuXHRwcm9jZXNzRnVuY3Rpb25PbkRhdGFsb3NzQ2FuY2VsOiBhbnksXG5cdGNvbnRyb2xsZXI6IGFueSxcblx0c2tpcEJpbmRpbmdUb1ZpZXc6IGFueVxuKSB7XG5cdC8vIERlcGVuZGluZyBvbiBpZiB0aGUgdXNlciBjbG9zZWQgdGhlIGRhdGEgbG9zcyBwb3B1cCB3aXRoIE9rIG9yIENhbmNlbCxcblx0Ly8gZXhlY3V0ZSB0aGUgcHJvdmlkZWQgZm9sbG93LXVwIGZ1bmN0aW9uIGFuZCByZXNvbHZlIG9yIHJlamVjdCB0aGUgcHJvbWlzZVxuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRjb25zdCBkYXRhTG9zc1BvcHVwT2sgPSBmdW5jdGlvbiAoY29udGV4dDogYW55KSB7XG5cdFx0XHRjb25zdCByZXR1cm5WYWx1ZSA9IHByb2Nlc3NGdW5jdGlvbk9uRGF0YWxvc3NPayhjb250ZXh0KTtcblx0XHRcdHJlc29sdmUocmV0dXJuVmFsdWUpO1xuXHRcdH07XG5cdFx0Y29uc3QgZGF0YUxvc3NQb3B1cENhbmNlbCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHByb2Nlc3NGdW5jdGlvbk9uRGF0YWxvc3NDYW5jZWwoKTtcblx0XHRcdHJlamVjdCgpO1xuXHRcdH07XG5cdFx0Zm5EYXRhTG9zc0NvbmZpcm1hdGlvbihkYXRhTG9zc1BvcHVwT2ssIGRhdGFMb3NzUG9wdXBDYW5jZWwsIGNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3KTtcblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNjYXJkRHJhZnQoY29udHJvbGxlcjogYW55LCBza2lwQmluZGluZ1RvVmlldzogYW55KSB7XG5cdGNvbnN0IGNvbnRleHQgPSBjb250cm9sbGVyLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0c2tpcEJhY2tOYXZpZ2F0aW9uOiB0cnVlLFxuXHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogdHJ1ZSxcblx0XHRza2lwQmluZGluZ1RvVmlldzogc2tpcEJpbmRpbmdUb1ZpZXcgIT09IHVuZGVmaW5lZCA/IHNraXBCaW5kaW5nVG9WaWV3IDogdHJ1ZVxuXHR9O1xuXHRyZXR1cm4gY29udHJvbGxlci5lZGl0Rmxvdy5jYW5jZWxEb2N1bWVudChjb250ZXh0LCBwYXJhbXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZURvY3VtZW50KGNvbnRyb2xsZXI6IGFueSkge1xuXHRjb25zdCBjb250ZXh0ID0gY29udHJvbGxlci5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0Ly8gV2UgY2hlY2sgaWYgd2UgYXJlIG9uIHRoZSBPUCBhbmQgdGhlbiBjYWxsIHRoZSBpbnRlcm5hbCBfc2F2ZURvY3VtZW50IGZyb20gdGhlIE9QIGNvbnRyb2xsZXJcblx0Ly8gc2luY2UgaGVyZSBzb21lIHNwZWNpYWwgaGFuZGxpbmcgaXMgZG9uZSBmb3IgY3JlYXRpb25Sb3cgYmVmb3JlIGVkaXRGbG93LnNhdmVEb2N1bWVudCBpcyBjYWxsZWQuXG5cdC8vIEluIGNhc2Ugb2YgYSBjdXN0b20gY29udHJvbGxlciB3ZSBkaXJlY3RseSBjYWxsIHNhdmVEb2N1bWVudCBmcm9tIHRoZSBlZGl0Rmxvd1xuXHRpZiAoY29udHJvbGxlci5pc0EoXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZUNvbnRyb2xsZXJcIikpIHtcblx0XHRyZXR1cm4gY29udHJvbGxlci5fc2F2ZURvY3VtZW50KGNvbnRleHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb250cm9sbGVyLmVkaXRGbG93LnNhdmVEb2N1bWVudChjb250ZXh0KTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRLZXkoZGF0YUxvc3NQb3B1cDogRGlhbG9nKSB7XG5cdC8vIEZvciBub3QgdXNpbmcgY29udHJvbCBJRHMgd2UgaW50cm9kdWNlZCBjdXN0b21EYXRhIGluIHRoZSBmcmFnbWVudCBhbmRcblx0Ly8gdXNlIGl0IGhlcmUgZm9yIGZpbmRpbmcgdGhlIGNvcnJlY3QgbGlzdCBpbiB0aGUgZGlhbG9nIGFuZCBmb3Jcblx0Ly8gZGV0ZXJtaW5pbmcgdGhlIHNlbGVjdGVkIG9wdGlvbiBmcm9tIHRoZSBsaXN0XG5cdGNvbnN0IGRhdGFMb3NzT3B0aW9uc0xpc3Q6IExpc3QgPSBkYXRhTG9zc1BvcHVwXG5cdFx0LmdldENvbnRlbnQoKVxuXHRcdC5maW5kKChlbGVtZW50KSA9PiBlbGVtZW50LmRhdGEoXCJsaXN0SWRlbnRpZmllclwiKSA9PT0gXCJkcmFmdERhdGFMb3NzT3B0aW9uc0xpc3RcIikgYXMgTGlzdDtcblx0cmV0dXJuIGRhdGFMb3NzT3B0aW9uc0xpc3QuZ2V0U2VsZWN0ZWRJdGVtKCkuZGF0YShcIml0ZW1LZXlcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RBbmRGb2N1c0ZpcnN0RW50cnkoZGF0YUxvc3NQb3B1cDogRGlhbG9nKSB7XG5cdC8vIEZvciBub3QgdXNpbmcgY29udHJvbCBJRHMgd2UgaW50cm9kdWNlZCBjdXN0b21EYXRhIGluIHRoZSBmcmFnbWVudCBhbmRcblx0Ly8gdXNlIGl0IGhlcmUgZm9yIGZpbmRpbmcgdGhlIGNvcnJlY3QgbGlzdCBpbiB0aGUgZGlhbG9nLlxuXHRjb25zdCBkYXRhTG9zc09wdGlvbnNMaXN0OiBMaXN0ID0gZGF0YUxvc3NQb3B1cFxuXHRcdC5nZXRDb250ZW50KClcblx0XHQuZmluZCgoZWxlbWVudCkgPT4gZWxlbWVudC5kYXRhKFwibGlzdElkZW50aWZpZXJcIikgPT09IFwiZHJhZnREYXRhTG9zc09wdGlvbnNMaXN0XCIpIGFzIExpc3Q7XG5cdC8vIFByZXNlbGVjdCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGxpc3Rcblx0Y29uc3QgZmlyc3RMaXN0SXRlbU9wdGlvbjogQ3VzdG9tTGlzdEl0ZW0gPSBkYXRhTG9zc09wdGlvbnNMaXN0LmdldEl0ZW1zKClbMF0gYXMgQ3VzdG9tTGlzdEl0ZW07XG5cdGRhdGFMb3NzT3B0aW9uc0xpc3Quc2V0U2VsZWN0ZWRJdGVtKGZpcnN0TGlzdEl0ZW1PcHRpb24pO1xuXHQvLyBCeSBkZWZhdWx0IHNldCB0aGUgZm9jdXMgb24gdGhlIGZpcnN0IGJ1dHRvbiBvZiB0aGUgZGlhbG9nXG5cdGRhdGFMb3NzUG9wdXAuZ2V0QnV0dG9ucygpWzBdLmZvY3VzKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgcGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0LCBkaXNjYXJkRHJhZnQsIHNhdmVEb2N1bWVudCwgZ2V0U2VsZWN0ZWRLZXksIHNlbGVjdEFuZEZvY3VzRmlyc3RFbnRyeSB9O1xuIl19
@@ -1,101 +1,161 @@
1
1
  import Log from "sap/base/Log";
2
- import JSONModel from "sap/ui/model/json/JSONModel";
3
- import XMLTemplateProcessor from "sap/ui/core/XMLTemplateProcessor";
4
- import XMLPreprocessor from "sap/ui/core/util/XMLPreprocessor";
2
+ import CustomListItem from "sap/m/CustomListItem";
3
+ import Dialog from "sap/m/Dialog";
4
+ import List from "sap/m/List";
5
5
  import Fragment from "sap/ui/core/Fragment";
6
- import Popup from "sap/ui/core/Popup";
6
+ import XMLPreprocessor from "sap/ui/core/util/XMLPreprocessor";
7
+ import XMLTemplateProcessor from "sap/ui/core/XMLTemplateProcessor";
8
+ import JSONModel from "sap/ui/model/json/JSONModel";
9
+
10
+ enum DraftDataLossOptions {
11
+ Save = "draftDataLossOptionSave",
12
+ Keep = "draftDataLossOptionKeep",
13
+ Discard = "draftDataLossOptionDiscard"
14
+ }
7
15
 
8
16
  let fnOnDataLossConfirmed: Function;
9
17
  let fnOnDataLossCancel: Function;
10
- function fnDataLossConfirmation(onDataLossConfirmed: any, onDataLossCancel: any, oController: any, bSkipBindingToView: any) {
11
- let oDataLossPopup: Popup;
12
- fnOnDataLossConfirmed = onDataLossConfirmed;
18
+ function fnDataLossConfirmation(onDataLossOk: any, onDataLossCancel: any, controller: any, skipBindingToView: any) {
19
+ // Open the data loss popup and after processing the selected function finally call
20
+ // onDataLossConfirmed which resolves the promise and leads to processing of the originally
21
+ // triggered action like e.g. a back navigation
22
+ let dataLossPopup: Dialog;
23
+ fnOnDataLossConfirmed = onDataLossOk;
13
24
  fnOnDataLossCancel = onDataLossCancel;
14
- const sFragmentname = "sap.fe.core.controls.DataLossOrDraftDiscard.DataLossDraft";
15
- const oView = oController.getView();
25
+ const fragmentName = "sap.fe.core.controls.DataLossOrDraftDiscard.DataLossDraft";
26
+ const view = controller.getView();
16
27
  const fragmentController: any = {
17
- onDataLossKeepDraft: function() {
18
- oDataLossPopup.close();
19
- fnOnDataLossConfirmed();
20
- },
21
- onDataLossDiscardDraft: function() {
22
- oDataLossPopup.close();
23
- discardDraft(oController, bSkipBindingToView)
24
- .then(fnOnDataLossConfirmed)
25
- .catch(function(oError: any) {
26
- Log.error("Error while discarding draft", oError);
27
- });
28
+ onDataLossOk: function () {
29
+ const selectedKey = getSelectedKey(dataLossPopup);
30
+ if (selectedKey === DraftDataLossOptions.Save) {
31
+ saveDocument(controller)
32
+ .then(fnOnDataLossConfirmed)
33
+ .catch(function (error: any) {
34
+ Log.error("Error while saving document", error);
35
+ });
36
+ dataLossPopup.close();
37
+ } else if (selectedKey === DraftDataLossOptions.Keep) {
38
+ fnOnDataLossConfirmed();
39
+ dataLossPopup.close();
40
+ } else if (selectedKey === DraftDataLossOptions.Discard) {
41
+ discardDraft(controller, skipBindingToView)
42
+ .then(fnOnDataLossConfirmed)
43
+ .catch(function (error: any) {
44
+ Log.error("Error while discarding draft", error);
45
+ });
46
+ dataLossPopup.close();
47
+ }
28
48
  },
29
- onDataLossCancel: function() {
30
- oDataLossPopup.close();
49
+ onDataLossCancel: function () {
31
50
  fnOnDataLossCancel();
51
+ dataLossPopup.close();
52
+ },
53
+ setDataLossPopup: function (dataLossPopup: Dialog) {
54
+ controller.dataLossPopup = dataLossPopup;
32
55
  }
33
56
  };
34
- fragmentController.setDataLossPopup = function(oDataLossPopup: Popup) {
35
- oController.dataLossPopup = oDataLossPopup;
36
- };
37
57
 
38
- const oThis = new JSONModel({
39
- id: oView.getId()
40
- }),
41
- oPreprocessorSettings = {
58
+ const i18nModel = view.getModel("sap.fe.i18n");
59
+ const localThisModel = new JSONModel({}),
60
+ preprocessorSettings = {
42
61
  bindingContexts: {
43
- "this": oThis.createBindingContext("/")
62
+ "this": localThisModel.createBindingContext("/")
44
63
  },
45
64
  models: {
46
- "this": oThis,
47
- "this.i18n": oView.getModel("sap.fe.i18n")
65
+ "this": localThisModel,
66
+ "i18n": i18nModel
48
67
  }
49
68
  };
50
- const oPopoverFragment = XMLTemplateProcessor.loadTemplate(sFragmentname, "fragment");
51
69
 
52
- if (oController.dataLossPopup) {
53
- oDataLossPopup = oController.dataLossPopup;
54
- oDataLossPopup.open();
70
+ if (controller.dataLossPopup) {
71
+ dataLossPopup = controller.dataLossPopup;
72
+ dataLossPopup.open();
73
+ selectAndFocusFirstEntry(dataLossPopup);
55
74
  } else {
56
- Promise.resolve(XMLPreprocessor.process(oPopoverFragment, { name: sFragmentname }, oPreprocessorSettings))
57
- .then(function(oFragment: any) {
58
- return Fragment.load({ definition: oFragment, controller: fragmentController });
75
+ const dialogFragment = XMLTemplateProcessor.loadTemplate(fragmentName, "fragment");
76
+ Promise.resolve(XMLPreprocessor.process(dialogFragment, { name: fragmentName }, preprocessorSettings))
77
+ .then((fragment) => {
78
+ return Fragment.load({ definition: fragment, controller: fragmentController });
59
79
  })
60
- .then(function(oPopup: any) {
61
- oDataLossPopup = oPopup;
62
- oView.addDependent(oDataLossPopup);
63
- const oModel = new JSONModel();
64
- oDataLossPopup.setModel(oModel, "dataLoss");
65
- const oi18nModel = oController.getView().getModel("sap.fe.i18n");
66
- oDataLossPopup.setModel(oi18nModel, "i18n");
67
- oDataLossPopup.open();
68
- fragmentController.setDataLossPopup(oDataLossPopup);
80
+ .then((popup: any) => {
81
+ dataLossPopup = popup;
82
+ popup.attachAfterOpen(() => {
83
+ selectAndFocusFirstEntry(dataLossPopup);
84
+ });
85
+ view.addDependent(dataLossPopup);
86
+ dataLossPopup.open();
87
+ fragmentController.setDataLossPopup(dataLossPopup);
69
88
  })
70
- .catch(function(oError: any) {
71
- Log.error("Error while opening the Discard Dialog fragment", oError);
89
+ .catch(function (error: any) {
90
+ Log.error("Error while opening the Discard Dialog fragment", error);
72
91
  });
73
92
  }
74
93
  }
75
- function fnPerformAfterDiscardorKeepDraftImpl(fnPositive: any, fnNegative: any, oController: any, bSkipBindingToView: any) {
76
- fnDataLossConfirmation(fnPositive, fnNegative, oController, bSkipBindingToView);
77
- }
78
- export function performAfterDiscardorKeepDraft(fnProcessFunction: any, fnCancelFunction: any, oController: any, bSkipBindingToView: any) {
79
- const oRet = new Promise(function(resolve: (value: any) => void, reject: (reason?: any) => void) {
80
- const fnPositive = function(oContext: any) {
81
- const oRet = fnProcessFunction(oContext);
82
- resolve(oRet);
94
+
95
+ export function performAfterDiscardorKeepDraft(
96
+ processFunctionOnDatalossOk: any,
97
+ processFunctionOnDatalossCancel: any,
98
+ controller: any,
99
+ skipBindingToView: any
100
+ ) {
101
+ // Depending on if the user closed the data loss popup with Ok or Cancel,
102
+ // execute the provided follow-up function and resolve or reject the promise
103
+ return new Promise(function (resolve: (value: any) => void, reject: (reason?: any) => void) {
104
+ const dataLossPopupOk = function (context: any) {
105
+ const returnValue = processFunctionOnDatalossOk(context);
106
+ resolve(returnValue);
83
107
  };
84
- const fnNegative = function() {
85
- fnCancelFunction();
108
+ const dataLossPopupCancel = function () {
109
+ processFunctionOnDatalossCancel();
86
110
  reject();
87
111
  };
88
- fnPerformAfterDiscardorKeepDraftImpl(fnPositive, fnNegative, oController, bSkipBindingToView);
112
+ fnDataLossConfirmation(dataLossPopupOk, dataLossPopupCancel, controller, skipBindingToView);
89
113
  });
90
- return oRet;
91
114
  }
92
- export function discardDraft(oController: any, bSkipBindingToView: any) {
93
- const oParamsContext = oController.getView().getBindingContext();
94
- const mParams = {
115
+
116
+ export function discardDraft(controller: any, skipBindingToView: any) {
117
+ const context = controller.getView().getBindingContext();
118
+ const params = {
95
119
  skipBackNavigation: true,
96
120
  skipDiscardPopover: true,
97
- skipBindingToView: bSkipBindingToView !== undefined ? bSkipBindingToView : true
121
+ skipBindingToView: skipBindingToView !== undefined ? skipBindingToView : true
98
122
  };
123
+ return controller.editFlow.cancelDocument(context, params);
124
+ }
125
+
126
+ export function saveDocument(controller: any) {
127
+ const context = controller.getView().getBindingContext();
128
+ // We check if we are on the OP and then call the internal _saveDocument from the OP controller
129
+ // since here some special handling is done for creationRow before editFlow.saveDocument is called.
130
+ // In case of a custom controller we directly call saveDocument from the editFlow
131
+ if (controller.isA("sap.fe.templates.ObjectPage.ObjectPageController")) {
132
+ return controller._saveDocument(context);
133
+ } else {
134
+ return controller.editFlow.saveDocument(context);
135
+ }
136
+ }
99
137
 
100
- return oController.editFlow.cancelDocument(oParamsContext, mParams);
138
+ export function getSelectedKey(dataLossPopup: Dialog) {
139
+ // For not using control IDs we introduced customData in the fragment and
140
+ // use it here for finding the correct list in the dialog and for
141
+ // determining the selected option from the list
142
+ const dataLossOptionsList: List = dataLossPopup
143
+ .getContent()
144
+ .find((element) => element.data("listIdentifier") === "draftDataLossOptionsList") as List;
145
+ return dataLossOptionsList.getSelectedItem().data("itemKey");
101
146
  }
147
+
148
+ export function selectAndFocusFirstEntry(dataLossPopup: Dialog) {
149
+ // For not using control IDs we introduced customData in the fragment and
150
+ // use it here for finding the correct list in the dialog.
151
+ const dataLossOptionsList: List = dataLossPopup
152
+ .getContent()
153
+ .find((element) => element.data("listIdentifier") === "draftDataLossOptionsList") as List;
154
+ // Preselect the first entry in the list
155
+ const firstListItemOption: CustomListItem = dataLossOptionsList.getItems()[0] as CustomListItem;
156
+ dataLossOptionsList.setSelectedItem(firstListItemOption);
157
+ // By default set the focus on the first button of the dialog
158
+ dataLossPopup.getButtons()[0].focus();
159
+ }
160
+
161
+ export default { performAfterDiscardorKeepDraft, discardDraft, saveDocument, getSelectedKey, selectAndFocusFirstEntry };