@sapui5/sap.fe.core 1.98.0 → 1.99.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 (231) hide show
  1. package/package.json +3 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +377 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +385 -0
  5. package/src/sap/fe/core/AppComponent.js +3 -2
  6. package/src/sap/fe/core/AppStateHandler.js +229 -181
  7. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  8. package/src/sap/fe/core/BaseController.js +3 -2
  9. package/src/sap/fe/core/BusyLocker.js +105 -121
  10. package/src/sap/fe/core/BusyLocker.ts +98 -0
  11. package/src/sap/fe/core/CommonUtils.js +2073 -2399
  12. package/src/sap/fe/core/CommonUtils.ts +2078 -0
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -2
  14. package/src/sap/fe/core/PageController.js +84 -125
  15. package/src/sap/fe/core/PageController.ts +101 -0
  16. package/src/sap/fe/core/RouterProxy.js +986 -823
  17. package/src/sap/fe/core/RouterProxy.ts +838 -0
  18. package/src/sap/fe/core/Synchronization.js +51 -35
  19. package/src/sap/fe/core/Synchronization.ts +29 -0
  20. package/src/sap/fe/core/TemplateComponent.js +173 -164
  21. package/src/sap/fe/core/TemplateComponent.ts +166 -0
  22. package/src/sap/fe/core/TemplateModel.js +97 -54
  23. package/src/sap/fe/core/TemplateModel.ts +63 -0
  24. package/src/sap/fe/core/TransactionHelper.js +1576 -1664
  25. package/src/sap/fe/core/TransactionHelper.ts +1706 -0
  26. package/src/sap/fe/core/actions/draft.js +559 -608
  27. package/src/sap/fe/core/actions/draft.ts +593 -0
  28. package/src/sap/fe/core/actions/messageHandling.js +545 -514
  29. package/src/sap/fe/core/actions/messageHandling.ts +532 -0
  30. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  31. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  32. package/src/sap/fe/core/actions/operations.js +1074 -1215
  33. package/src/sap/fe/core/actions/operations.ts +1162 -0
  34. package/src/sap/fe/core/actions/sticky.js +102 -105
  35. package/src/sap/fe/core/actions/sticky.ts +102 -0
  36. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
  37. package/src/sap/fe/core/controllerextensions/EditFlow.js +54 -211
  38. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
  39. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +279 -11
  40. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -6
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.js +47 -45
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -3
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +29 -26
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +101 -8
  45. package/src/sap/fe/core/controllerextensions/MessageHandler.js +17 -8
  46. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
  47. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  48. package/src/sap/fe/core/controllerextensions/Paginator.js +3 -2
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -2
  50. package/src/sap/fe/core/controllerextensions/Routing.js +9 -4
  51. package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
  52. package/src/sap/fe/core/controllerextensions/Share.js +3 -2
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -3
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +18 -18
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
  56. package/src/sap/fe/core/controls/CommandExecution.js +3 -2
  57. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
  58. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
  59. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -2
  60. package/src/sap/fe/core/controls/FieldWrapper.js +11 -22
  61. package/src/sap/fe/core/controls/FilterBar.js +3 -2
  62. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -2
  63. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
  64. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
  65. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
  66. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
  67. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
  68. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
  69. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +3 -2
  70. package/src/sap/fe/core/converters/ConverterContext.js +2 -2
  71. package/src/sap/fe/core/converters/ConverterContext.ts +4 -3
  72. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  73. package/src/sap/fe/core/converters/ManifestSettings.ts +1 -0
  74. package/src/sap/fe/core/converters/ManifestWrapper.js +39 -26
  75. package/src/sap/fe/core/converters/ManifestWrapper.ts +9 -0
  76. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -8
  77. package/src/sap/fe/core/converters/MetaModelConverter.ts +16 -16
  78. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  79. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  80. package/src/sap/fe/core/converters/common/AnnotationConverter.js +17 -13
  81. package/src/sap/fe/core/converters/controls/Common/Action.js +2 -2
  82. package/src/sap/fe/core/converters/controls/Common/Action.ts +2 -2
  83. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  84. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  85. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  86. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  87. package/src/sap/fe/core/converters/controls/Common/Form.js +4 -2
  88. package/src/sap/fe/core/converters/controls/Common/Form.ts +16 -2
  89. package/src/sap/fe/core/converters/controls/Common/Table.js +250 -146
  90. package/src/sap/fe/core/converters/controls/Common/Table.ts +300 -167
  91. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +115 -56
  92. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +120 -74
  93. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +467 -32
  94. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +483 -54
  95. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -6
  96. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +9 -15
  97. package/src/sap/fe/core/converters/helpers/Aggregation.js +13 -5
  98. package/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
  99. package/src/sap/fe/core/converters/helpers/IssueManager.js +4 -1
  100. package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -0
  101. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
  102. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  103. package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
  104. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
  105. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
  106. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  107. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  108. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  109. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  110. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  111. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  112. package/src/sap/fe/core/formatters/TableFormatter.js +39 -28
  113. package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
  114. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  115. package/src/sap/fe/core/formatters/ValueFormatter.ts +7 -6
  116. package/src/sap/fe/core/fpm/Component.js +3 -2
  117. package/src/sap/fe/core/helpers/AppStartupHelper.js +2 -2
  118. package/src/sap/fe/core/helpers/AppStartupHelper.ts +7 -4
  119. package/src/sap/fe/core/helpers/BindingExpression.js +314 -355
  120. package/src/sap/fe/core/helpers/BindingExpression.ts +317 -391
  121. package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
  122. package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  123. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
  124. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  125. package/src/sap/fe/core/helpers/EditState.js +81 -84
  126. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  127. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  128. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  129. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  130. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  131. package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -4
  132. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
  133. package/src/sap/fe/core/helpers/MassEditHelper.js +27 -18
  134. package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
  135. package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  136. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  137. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  138. package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
  139. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  140. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  141. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  142. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  143. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  144. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  145. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  146. package/src/sap/fe/core/library.js +4 -3
  147. package/src/sap/fe/core/library.support.js +3 -2
  148. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  149. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +1 -1
  150. package/src/sap/fe/core/messagebundle.properties +23 -10
  151. package/src/sap/fe/core/messagebundle_ar.properties +9 -0
  152. package/src/sap/fe/core/messagebundle_bg.properties +9 -0
  153. package/src/sap/fe/core/messagebundle_ca.properties +9 -0
  154. package/src/sap/fe/core/messagebundle_cs.properties +10 -1
  155. package/src/sap/fe/core/messagebundle_cy.properties +9 -0
  156. package/src/sap/fe/core/messagebundle_da.properties +9 -0
  157. package/src/sap/fe/core/messagebundle_de.properties +9 -0
  158. package/src/sap/fe/core/messagebundle_el.properties +9 -0
  159. package/src/sap/fe/core/messagebundle_en.properties +9 -0
  160. package/src/sap/fe/core/messagebundle_en_GB.properties +9 -0
  161. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +9 -0
  162. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -0
  163. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +9 -0
  164. package/src/sap/fe/core/messagebundle_es.properties +9 -0
  165. package/src/sap/fe/core/messagebundle_es_MX.properties +9 -0
  166. package/src/sap/fe/core/messagebundle_et.properties +9 -0
  167. package/src/sap/fe/core/messagebundle_fi.properties +9 -0
  168. package/src/sap/fe/core/messagebundle_fr.properties +13 -4
  169. package/src/sap/fe/core/messagebundle_fr_CA.properties +15 -6
  170. package/src/sap/fe/core/messagebundle_hi.properties +15 -6
  171. package/src/sap/fe/core/messagebundle_hr.properties +15 -6
  172. package/src/sap/fe/core/messagebundle_hu.properties +9 -0
  173. package/src/sap/fe/core/messagebundle_id.properties +10 -1
  174. package/src/sap/fe/core/messagebundle_it.properties +9 -0
  175. package/src/sap/fe/core/messagebundle_iw.properties +9 -0
  176. package/src/sap/fe/core/messagebundle_ja.properties +9 -0
  177. package/src/sap/fe/core/messagebundle_kk.properties +15 -6
  178. package/src/sap/fe/core/messagebundle_ko.properties +9 -0
  179. package/src/sap/fe/core/messagebundle_lt.properties +9 -0
  180. package/src/sap/fe/core/messagebundle_lv.properties +15 -6
  181. package/src/sap/fe/core/messagebundle_ms.properties +14 -5
  182. package/src/sap/fe/core/messagebundle_nl.properties +9 -0
  183. package/src/sap/fe/core/messagebundle_no.properties +9 -0
  184. package/src/sap/fe/core/messagebundle_pl.properties +9 -0
  185. package/src/sap/fe/core/messagebundle_pt.properties +9 -0
  186. package/src/sap/fe/core/messagebundle_pt_PT.properties +9 -0
  187. package/src/sap/fe/core/messagebundle_ro.properties +9 -0
  188. package/src/sap/fe/core/messagebundle_ru.properties +9 -0
  189. package/src/sap/fe/core/messagebundle_sh.properties +11 -2
  190. package/src/sap/fe/core/messagebundle_sk.properties +9 -0
  191. package/src/sap/fe/core/messagebundle_sl.properties +15 -6
  192. package/src/sap/fe/core/messagebundle_sv.properties +9 -0
  193. package/src/sap/fe/core/messagebundle_th.properties +9 -0
  194. package/src/sap/fe/core/messagebundle_tr.properties +9 -0
  195. package/src/sap/fe/core/messagebundle_uk.properties +9 -0
  196. package/src/sap/fe/core/messagebundle_vi.properties +9 -0
  197. package/src/sap/fe/core/messagebundle_zh_CN.properties +9 -0
  198. package/src/sap/fe/core/messagebundle_zh_TW.properties +15 -6
  199. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  200. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  201. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
  202. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  203. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  204. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
  205. package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
  206. package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  207. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
  208. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  209. package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -899
  210. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  211. package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
  212. package/src/sap/fe/core/services/ShellServicesFactory.ts +15 -10
  213. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +35 -81
  214. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +46 -94
  215. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -487
  216. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  217. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  218. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  219. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  220. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  221. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  222. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  223. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  224. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  225. package/src/sap/fe/core/templating/FilterHelper.js +138 -72
  226. package/src/sap/fe/core/templating/FilterHelper.ts +139 -71
  227. package/src/sap/fe/core/templating/UIFormatters.js +31 -1
  228. package/src/sap/fe/core/templating/UIFormatters.ts +33 -2
  229. package/src/sap/fe/core/type/Email.js +1 -1
  230. package/src/sap/fe/core/type/Email.ts +4 -6
  231. package/ui5.yaml +0 -3
@@ -0,0 +1,593 @@
1
+ import Dialog from "sap/m/Dialog";
2
+ import Button from "sap/m/Button";
3
+ import Text from "sap/m/Text";
4
+ import MessageBox from "sap/m/MessageBox";
5
+ import messageHandling from "sap/fe/core/actions/messageHandling";
6
+ import CommonUtils from "sap/fe/core/CommonUtils";
7
+ import Log from "sap/base/Log";
8
+ import { AppComponent } from "sap/fe/core";
9
+ import { SideEffectsService } from "sap/fe/core/services/SideEffectsServiceFactory";
10
+ import ResourceBundle from "sap/base/i18n/ResourceBundle";
11
+ import View from "sap/ui/core/mvc/View";
12
+ import Context from "sap/ui/model/odata/v4/Context";
13
+ import ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
14
+ import ResourceModel from "sap/ui/model/resource/ResourceModel";
15
+
16
+ /**
17
+ * Interface for callbacks used in the functions
18
+ *
19
+ *
20
+ * @author SAP SE
21
+ * @since 1.54.0
22
+ * @interface
23
+ * @name sap.fe.core.actions.draft.ICallback
24
+ * @private
25
+ */
26
+
27
+ /**
28
+ * Callback to approve or reject the creation of a draft
29
+ * @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
30
+ * @function
31
+ * @static
32
+ * @abstract
33
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
34
+ * @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
35
+ *
36
+ * @private
37
+ */
38
+
39
+ /**
40
+ * Callback after a draft was successully created
41
+ * @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
42
+ * @function
43
+ * @static
44
+ * @abstract
45
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
46
+ * @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
47
+ * @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
48
+ *
49
+ * @private
50
+ */
51
+
52
+ /**
53
+ * Callback to approve or reject overwriting an unsaved draft of another user
54
+ * @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
55
+ * @function
56
+ * @public
57
+ * @static
58
+ * @abstract
59
+ *
60
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
61
+ * @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
62
+ *
63
+ * @ui5-restricted
64
+ */
65
+ /* Constants for draft operations */
66
+ const draftOperations = {
67
+ EDIT: "EditAction",
68
+ ACTIVATION: "ActivationAction",
69
+ DISCARD: "DiscardAction",
70
+ PREPARE: "PreparationAction"
71
+ };
72
+ /**
73
+ * Static functions for the draft programming model
74
+ *
75
+ * @namespace
76
+ * @alias sap.fe.core.actions.draft
77
+ * @private
78
+ * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
79
+ * @since 1.54.0
80
+ */
81
+ const draft = {
82
+ createDraftFromActiveDocument: createDraftFromActiveDocument,
83
+ activateDocument: activateDocument,
84
+ deleteDraft: deleteDraft
85
+ };
86
+ /**
87
+ * Determines action name for a draft operation.
88
+ *
89
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
90
+ * @param {string} sOperation The operation name
91
+ * @returns {string} The name of the draft operation
92
+ */
93
+ function getActionName(oContext: any, sOperation: string) {
94
+ const oModel = oContext.getModel(),
95
+ oMetaModel = oModel.getMetaModel(),
96
+ sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
97
+
98
+ return oMetaModel.getObject(sEntitySetPath + "@com.sap.vocabularies.Common.v1.DraftRoot/" + sOperation);
99
+ }
100
+ /**
101
+ * Creates an operation context binding for the given context and operation.
102
+ *
103
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
104
+ * @param {string} sOperation The operation (action or function import)
105
+ * @param oOptions Options to create the operation context
106
+ * @returns {sap.ui.model.odata.v4.ODataContextBinding} The context binding of the bound operation
107
+ */
108
+ function createOperation(oContext: any, sOperation: string, oOptions?: any) {
109
+ const sOperationName = getActionName(oContext, sOperation);
110
+
111
+ return oContext.getModel().bindContext(sOperationName + "(...)", oContext, oOptions);
112
+ }
113
+ /**
114
+ * Check if optional draft prepare action exists.
115
+ *
116
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
117
+ * @returns {boolean} True if a a prepare action exists
118
+ */
119
+ function hasPrepareAction(oContext: any) {
120
+ return !!getActionName(oContext, draftOperations.PREPARE);
121
+ }
122
+ /**
123
+ * Creates a new draft from an active document.
124
+ *
125
+ * @function
126
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
127
+ * @param {boolean} bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
128
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
129
+ * @private
130
+ * @ui5-restricted
131
+ */
132
+ function executeDraftEditAction(oContext: any, bPreserveChanges: boolean) {
133
+ if (oContext.getProperty("IsActiveEntity")) {
134
+ const oOptions = { $$inheritExpandSelect: true };
135
+ const oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
136
+ oOperation.setParameter("PreserveChanges", bPreserveChanges);
137
+ const sGroupId = "direct";
138
+ const oEditPromise = oOperation.execute(sGroupId).then(function(oDraftDocumentContext: any) {
139
+ return oDraftDocumentContext;
140
+ });
141
+ oOperation.getModel().submitBatch(sGroupId);
142
+ return oEditPromise;
143
+ } else {
144
+ throw new Error("You cannot edit this draft document");
145
+ }
146
+ }
147
+ /*function fnOnStrictHandlingFailed(oContext: any, sGroupId: any, aMessages: any) { //Will uncomment this function in the commit : 5513510
148
+ if (aMessages.length === 1) {
149
+ const sMessage = aMessages[0].message,
150
+ dialogPromise = new Promise(function(resolve: (value: any) => void) {
151
+ sap.ui.require(["sap/m/MessageBox"], function(MessageBox: any) {
152
+ MessageBox.warning(sMessage, {
153
+ title: "Warning",
154
+ actions: [MessageBox.Action.OK, MessageBox.Action.CANCEL],
155
+ onClose: function(sAction: any) {
156
+ if (sAction === MessageBox.Action.OK) {
157
+ resolve(true);
158
+ oContext.getModel().submitBatch(sGroupId);
159
+ } else {
160
+ resolve(false);
161
+ }
162
+ }
163
+ });
164
+ });
165
+ });
166
+ return dialogPromise;
167
+ }
168
+ }*/
169
+ /**
170
+ * Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
171
+ *
172
+ * @function
173
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
174
+ * @param {object} oAppComponent The AppComponent
175
+ * @param {string} [sGroupId] The optional batch group in which the operation is to be executed
176
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
177
+ * @private
178
+ * @ui5-restricted
179
+ */
180
+ function executeDraftActivationAction(oContext: any, oAppComponent: AppComponent, sGroupId?: string) {
181
+ const bHasPrepareAction = hasPrepareAction(oContext);
182
+
183
+ // According to the draft spec if the service contains a prepare action and we trigger both prepare and
184
+ // activate in one $batch the activate action is called with iF-Match=*
185
+ const bIgnoreEtag = bHasPrepareAction;
186
+
187
+ if (!oContext.getProperty("IsActiveEntity")) {
188
+ const oOperation = createOperation(oContext, draftOperations.ACTIVATION, { $$inheritExpandSelect: true });
189
+ return oOperation
190
+ .execute(sGroupId, bIgnoreEtag)
191
+ .then(function(oActiveDocumentContext: any) {
192
+ return oActiveDocumentContext;
193
+ })
194
+ .catch(
195
+ //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
196
+ function() {
197
+ if (bHasPrepareAction) {
198
+ const sActionName = getActionName(oContext, draftOperations.PREPARE),
199
+ oSideEffectsService = oAppComponent.getSideEffectsService(),
200
+ oBindingParameters = oSideEffectsService.getODataActionSideEffects(sActionName, oContext),
201
+ aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
202
+ if (aTargetPaths && aTargetPaths.length > 0) {
203
+ oSideEffectsService.requestSideEffects(aTargetPaths, oContext).catch(function(oError: any) {
204
+ Log.error("Error while requesting side effects", oError);
205
+ });
206
+ } else {
207
+ requestMessages(oContext, oSideEffectsService).catch(function(oError: any) {
208
+ Log.error("Error while requesting messages", oError);
209
+ });
210
+ }
211
+ }
212
+ return Promise.reject();
213
+ }
214
+ );
215
+ } else {
216
+ throw new Error("The activation action cannot be executed on an active document");
217
+ }
218
+ }
219
+ /**
220
+ * Execute a preparation action.
221
+ *
222
+ * @function
223
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
224
+ * @param {object} oAppComponent The AppComponent
225
+ * @param {object} mParameters The parameters
226
+ * @param {boolean} [mParameters.groupId] The optional batch group where we want to execute the operation in
227
+ * @param {boolean} [mParameters.bPrepareForEdit] Shall the messages be requested if supported by service
228
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
229
+ * @private
230
+ * @ui5-restricted
231
+ */
232
+ function executeDraftPreparationAction(
233
+ oContext: any,
234
+ oAppComponent: AppComponent,
235
+ mParameters: { groupId?: string; bPrepareForEdit?: boolean }
236
+ ) {
237
+ const mParams = mParameters || {};
238
+ if (!oContext.getProperty("IsActiveEntity")) {
239
+ const oOperation = createOperation(oContext, draftOperations.PREPARE);
240
+
241
+ // TODO: side effects qualifier shall be even deprecated to be checked
242
+ oOperation.setParameter("SideEffectsQualifier", "");
243
+
244
+ const sGroupId = mParams.groupId || oOperation.getGroupId();
245
+ const oPreparationPromise = oOperation
246
+ .execute(sGroupId)
247
+ .then(function() {
248
+ if (mParams.bPrepareForEdit) {
249
+ // if PREPARE action is triggered after Edit then either the sideEffects (if annotated against PREPARE) are executed or the messages are requested as fallback if no sideEffects:
250
+ const sActionName = getActionName(oContext, draftOperations.PREPARE),
251
+ oSideEffectsService = oAppComponent.getSideEffectsService(),
252
+ oBindingParameters = oSideEffectsService.getODataActionSideEffects(sActionName, oContext),
253
+ aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
254
+ if (aTargetPaths && aTargetPaths.length > 0) {
255
+ oSideEffectsService.requestSideEffects(aTargetPaths, oContext, sGroupId).catch(function(oError: any) {
256
+ Log.error("Error while requesting side effects", oError);
257
+ });
258
+ } else {
259
+ requestMessages(oContext, oSideEffectsService);
260
+ }
261
+ }
262
+ return oOperation;
263
+ })
264
+ .catch(function(oError: any) {
265
+ Log.error("Error while executing the operation", oError);
266
+ });
267
+
268
+ return oPreparationPromise;
269
+ } else {
270
+ throw new Error("The preparation action cannot be executed on an active document");
271
+ }
272
+ }
273
+ /**
274
+ * Determines the message path for a context.
275
+ *
276
+ * @function
277
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the path shall be determined
278
+ * @returns {string} Message path, empty if not annotated
279
+ * @private
280
+ * @ui5-restricted
281
+ */
282
+ function getMessagesPath(oContext: Context): string {
283
+ const oModel = oContext.getModel(),
284
+ oMetaModel = oModel.getMetaModel() as ODataMetaModel,
285
+ sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
286
+ return oMetaModel.getObject(sEntitySetPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
287
+ }
288
+ /**
289
+ * Requests the messages if annotated for a given context.
290
+ *
291
+ * @function
292
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the messages shall be requested
293
+ * @param {object} oSideEffectsService Service for the SideEffects on SAP Fiori elements
294
+ * @returns {Promise} Promise which is resolved once messages were requested
295
+ * @private
296
+ * @ui5-restricted
297
+ */
298
+ function requestMessages(oContext: any, oSideEffectsService: SideEffectsService) {
299
+ const sMessagesPath = getMessagesPath(oContext);
300
+ if (sMessagesPath) {
301
+ return oSideEffectsService.requestSideEffects([{ $PropertyPath: sMessagesPath }] as any, oContext);
302
+ }
303
+ return Promise.resolve();
304
+ }
305
+ /**
306
+ * Executes discard of a draft function using HTTP Post.
307
+ *
308
+ * @function
309
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
310
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
311
+ * @private
312
+ * @ui5-restricted
313
+ */
314
+ function executeDraftDiscardAction(oContext: any): Promise<boolean> {
315
+ if (!oContext.getProperty("IsActiveEntity")) {
316
+ const oDiscardOperation = createOperation(oContext, draftOperations.DISCARD);
317
+ const oDiscardPromise = oDiscardOperation.execute("direct");
318
+ oContext.getModel().submitBatch("direct");
319
+ return oDiscardPromise;
320
+ } else {
321
+ throw new Error("The discard action cannot be executed on an active document");
322
+ }
323
+ }
324
+ /**
325
+ * Creates a draft document from an existing document.
326
+ *
327
+ * The function supports several hooks as there is a certain coreography defined.
328
+ *
329
+ * @function
330
+ * @name sap.fe.core.actions.draft#createDraftFromActiveDocument
331
+ * @memberof sap.fe.core.actions.draft
332
+ * @static
333
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
334
+ * @param {object} oAppComponent The AppComponent
335
+ * @param {object} mParameters The parameters
336
+ * @param {boolean} [mParameters.oView] The view
337
+ * @param {boolean} [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
338
+ * @param {boolean} [mParameters.bPrepareOnEdit] Also call prepare when calling draft creation
339
+ * @param {sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument} [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
340
+ * @param {sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument} [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
341
+ * @param {sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired} [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
342
+ * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
343
+ * @private
344
+ * @ui5-restricted
345
+ */
346
+ function createDraftFromActiveDocument(
347
+ oContext: any,
348
+ oAppComponent: object,
349
+ mParameters: {
350
+ oView: View;
351
+ bPreserveChanges?: boolean | undefined;
352
+ bPrepareOnEdit?: boolean | undefined;
353
+ fnBeforeCreateDraftFromActiveDocument?: any;
354
+ fnAfterCreateDraftFromActiveDocument?: any;
355
+ fnWhenDecisionToOverwriteDocumentIsRequired?: any;
356
+ }
357
+ ) {
358
+ const mParam = mParameters || {},
359
+ localI18nRef = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core") as ResourceBundle,
360
+ bRunPreserveChangesFlow =
361
+ typeof mParam.bPreserveChanges === "undefined" || (typeof mParam.bPreserveChanges === "boolean" && mParam.bPreserveChanges); //default true
362
+
363
+ /**
364
+ * Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
365
+ *
366
+ * @param {*} bOverwrite Overwrite the change or not
367
+ * @returns {Promise} Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
368
+ */
369
+ function overwriteOnDemand(bOverwrite: any) {
370
+ if (bOverwrite) {
371
+ //Overwrite existing changes
372
+ const oModel = oContext.getModel();
373
+ const draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
374
+ let oResourceBundle: ResourceBundle;
375
+
376
+ return ((mParameters.oView.getModel("sap.fe.i18n") as ResourceModel).getResourceBundle() as Promise<ResourceBundle>)
377
+ .then(function(_oResourceBundle: any) {
378
+ oResourceBundle = _oResourceBundle;
379
+ return draftDataContext.requestObject();
380
+ })
381
+ .then(function(draftAdminData: any) {
382
+ if (draftAdminData) {
383
+ // remove all unbound transition messages as we show a special dialog
384
+ messageHandling.removeUnboundTransitionMessages();
385
+ let sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
386
+ const sEntitySet = (mParameters.oView.getViewData() as any).entitySet;
387
+ if (sInfo) {
388
+ const sLockedByUserMsg = CommonUtils.getTranslatedText(
389
+ "C_DRAFT_OBJECT_PAGE_DRAFT_LOCKED_BY_USER",
390
+ oResourceBundle,
391
+ sInfo,
392
+ sEntitySet
393
+ );
394
+ MessageBox.error(sLockedByUserMsg);
395
+ throw new Error(sLockedByUserMsg);
396
+ } else {
397
+ sInfo = draftAdminData.CreatedByUserDescription || draftAdminData.CreatedByUser;
398
+ const sUnsavedChangesMsg = CommonUtils.getTranslatedText(
399
+ "C_DRAFT_OBJECT_PAGE_DRAFT_UNSAVED_CHANGES",
400
+ oResourceBundle,
401
+ sInfo,
402
+ sEntitySet
403
+ );
404
+ return showMessageBox(sUnsavedChangesMsg).then(function() {
405
+ return executeDraftEditAction(oContext, false);
406
+ });
407
+ }
408
+ }
409
+ });
410
+ }
411
+ return Promise.reject(new Error("Draft creation aborted for document: " + oContext.getPath()));
412
+ }
413
+
414
+ function showMessageBox(sUnsavedChangesMsg: any) {
415
+ return new Promise(function(resolve: (value: any) => void, reject: (reason?: any) => void) {
416
+ const oDialog = new Dialog({
417
+ title: localI18nRef.getText("C_DRAFT_OBJECT_PAGE_WARNING"),
418
+ state: "Warning",
419
+ content: new Text({
420
+ text: sUnsavedChangesMsg
421
+ }),
422
+ beginButton: new Button({
423
+ text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT"),
424
+ type: "Emphasized",
425
+ press: function() {
426
+ oDialog.close();
427
+ resolve(true);
428
+ }
429
+ }),
430
+ endButton: new Button({
431
+ text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
432
+ press: function() {
433
+ oDialog.close();
434
+ reject("Draft creation aborted for document: " + oContext.getPath());
435
+ }
436
+ }),
437
+ afterClose: function() {
438
+ oDialog.destroy();
439
+ }
440
+ });
441
+ oDialog.addStyleClass("sapUiContentPadding");
442
+ oDialog.open();
443
+ });
444
+ }
445
+
446
+ if (!oContext) {
447
+ return Promise.reject(new Error("Binding context to active document is required"));
448
+ }
449
+
450
+ return Promise.resolve(
451
+ mParam.fnBeforeCreateDraftFromActiveDocument
452
+ ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow)
453
+ : true
454
+ )
455
+ .then(function(bExecute: any) {
456
+ if (!bExecute) {
457
+ throw new Error("Draft creation was aborted by extension for document: " + oContext.getPath());
458
+ }
459
+ return executeDraftEditAction(oContext, bRunPreserveChangesFlow).catch(function(oResponse: any) {
460
+ //Only call back if error 409
461
+ if (bRunPreserveChangesFlow && oResponse.status === 409) {
462
+ return Promise.resolve(
463
+ mParam.fnWhenDecisionToOverwriteDocumentIsRequired ? mParam.fnWhenDecisionToOverwriteDocumentIsRequired() : true
464
+ ).then(overwriteOnDemand);
465
+ } else {
466
+ throw new Error(oResponse);
467
+ }
468
+ });
469
+ })
470
+ .then(function(oDraftContext: any) {
471
+ return Promise.resolve(
472
+ mParam.fnAfterCreateDraftFromActiveDocument
473
+ ? mParam.fnAfterCreateDraftFromActiveDocument(oContext, oDraftContext)
474
+ : oDraftContext
475
+ );
476
+ })
477
+ .then(function(oDraftContext: any) {
478
+ if (mParam.bPrepareOnEdit && hasPrepareAction(oDraftContext)) {
479
+ return executeDraftPreparationAction(oDraftContext, oAppComponent, { bPrepareForEdit: true }).then(function() {
480
+ return oDraftContext;
481
+ });
482
+ }
483
+ return oDraftContext;
484
+ })
485
+ .catch(function(exc: any) {
486
+ return Promise.reject(exc);
487
+ });
488
+ }
489
+ /**
490
+ * Creates an active document from a draft document.
491
+ *
492
+ * The function supports several hooks as there is a certain choreography defined.
493
+ *
494
+ * @function
495
+ * @name sap.fe.core.actions.draft#activateDocument
496
+ * @memberof sap.fe.core.actions.draft
497
+ * @static
498
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
499
+ * @param {object} oAppComponent The AppComponent
500
+ * @param {object} mParameters The parameters
501
+ * @param {sap.fe.core.actions.draft.ICallback.fnBeforeActivateDocument} [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
502
+ * @param {sap.fe.core.actions.draft.ICallback.fnAfterActivateDocument} [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
503
+ * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
504
+ * @private
505
+ * @ui5-restricted
506
+ */
507
+ function activateDocument(
508
+ oContext: any,
509
+ oAppComponent: object,
510
+ mParameters: { fnBeforeActivateDocument?: any; fnAfterActivateDocument?: any }
511
+ ) {
512
+ const mParam = mParameters || {};
513
+
514
+ if (!oContext) {
515
+ return Promise.reject(new Error("Binding context to draft document is required"));
516
+ }
517
+ return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true)
518
+ .then(function(bExecute: any) {
519
+ if (!bExecute) {
520
+ return Promise.reject(new Error("Activation of the document was aborted by extension for document: " + oContext.getPath()));
521
+ }
522
+
523
+ if (!hasPrepareAction(oContext)) {
524
+ return executeDraftActivationAction(oContext, oAppComponent);
525
+ }
526
+
527
+ /* activation requires preparation */
528
+ const sBatchGroup = "draft";
529
+ // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
530
+ const oPreparePromise = executeDraftPreparationAction(oContext, oAppComponent, {
531
+ groupId: sBatchGroup,
532
+ bPrepareForEdit: false
533
+ });
534
+ oContext.getModel().submitBatch(sBatchGroup);
535
+
536
+ const oActivatePromise = executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
537
+
538
+ return Promise.all([oPreparePromise, oActivatePromise])
539
+ .then(function(values: [any, any]) {
540
+ return values[1];
541
+ })
542
+ .catch(function(exc: any) {
543
+ return Promise.reject(exc);
544
+ });
545
+ })
546
+ .then(function(oActiveDocumentContext: any) {
547
+ return Promise.resolve(
548
+ mParam.fnAfterActivateDocument ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext) : oActiveDocumentContext
549
+ );
550
+ })
551
+ .catch(function(exc: any) {
552
+ return Promise.reject(exc);
553
+ });
554
+ }
555
+ /**
556
+ * HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE for Draft(when no DraftAction)
557
+ * and Active Instance uses DELETE always.
558
+ *
559
+ * @function
560
+ * @name sap.fe.core.actions.draft#deleteDraft
561
+ * @memberof sap.fe.core.actions.draft
562
+ * @static
563
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be discarded
564
+ * @private
565
+ * @returns {Promise}
566
+ * @ui5-restricted
567
+ */
568
+ function deleteDraft(oContext: any): Promise<boolean> {
569
+ const sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
570
+ bIsActiveEntity = oContext.getObject().IsActiveEntity;
571
+
572
+ if (bIsActiveEntity || (!bIsActiveEntity && !sDiscardAction)) {
573
+ //Use Delete in case of active entity and no discard action available for draft
574
+ if (oContext.hasPendingChanges()) {
575
+ return oContext
576
+ .getBinding()
577
+ .resetChanges()
578
+ .then(function() {
579
+ return oContext.delete();
580
+ })
581
+ .catch(function(error: any) {
582
+ return Promise.reject(error);
583
+ });
584
+ } else {
585
+ return oContext.delete();
586
+ }
587
+ } else {
588
+ //Use Discard Post Action if it is a draft entity and discard action exists
589
+ return executeDraftDiscardAction(oContext);
590
+ }
591
+ }
592
+
593
+ export default draft;