@sapui5/sap.ushell_abap 1.152.1 → 1.154.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 (121) hide show
  1. package/package.json +1 -1
  2. package/src/main/js/sap/ushell_abap/.library +1 -1
  3. package/src/main/js/sap/ushell_abap/adapters/abap/AppStateAdapter.js +53 -63
  4. package/src/main/js/sap/ushell_abap/adapters/abap/ClientSideTargetResolutionAdapter.js +1 -1
  5. package/src/main/js/sap/ushell_abap/adapters/abap/CommonDataModelAdapter.js +1 -1
  6. package/src/main/js/sap/ushell_abap/adapters/abap/ConfigurationDefaultsAdapter.js +1 -1
  7. package/src/main/js/sap/ushell_abap/adapters/abap/ContainerAdapter.js +1 -1
  8. package/src/main/js/sap/ushell_abap/adapters/abap/FlpLaunchPageAdapter.js +62 -4
  9. package/src/main/js/sap/ushell_abap/adapters/abap/LaunchPageAdapter.js +1 -1
  10. package/src/main/js/sap/ushell_abap/adapters/abap/NavTargetResolutionAdapter.js +1 -1
  11. package/src/main/js/sap/ushell_abap/adapters/abap/NavTargetResolutionInternalAdapter.js +1 -1
  12. package/src/main/js/sap/ushell_abap/adapters/abap/PageBuildingAdapter.js +1 -1
  13. package/src/main/js/sap/ushell_abap/adapters/abap/PagePersistenceAdapter.js +8 -8
  14. package/src/main/js/sap/ushell_abap/adapters/abap/PersonalizationAdapter.js +1 -1
  15. package/src/main/js/sap/ushell_abap/adapters/abap/PersonalizationV2Adapter.js +1 -1
  16. package/src/main/js/sap/ushell_abap/adapters/abap/SearchAdapter.js +1 -1
  17. package/src/main/js/sap/ushell_abap/adapters/abap/SupportTicketAdapter.js +1 -1
  18. package/src/main/js/sap/ushell_abap/adapters/abap/Ui5ComponentLoaderAdapter.js +1 -1
  19. package/src/main/js/sap/ushell_abap/adapters/abap/UserInfoAdapter.js +11 -11
  20. package/src/main/js/sap/ushell_abap/adapters/abap/VisualizationInstantiationAdapter.js +76 -0
  21. package/src/main/js/sap/ushell_abap/adapters/hana/ContainerAdapter.js +1 -1
  22. package/src/main/js/sap/ushell_abap/adapters/local/ClientSideTargetResolutionAdapter.js +123 -0
  23. package/src/main/js/sap/ushell_abap/adapters/local/FlpLaunchPageAdapter.js +115 -0
  24. package/src/main/js/sap/ushell_abap/adapters/local/MenuAdapter.js +92 -0
  25. package/src/main/js/sap/ushell_abap/adapters/local/PageBuildingAdapter.js +242 -0
  26. package/src/main/js/sap/ushell_abap/adapters/local/PagePersistenceAdapter.js +308 -0
  27. package/src/main/js/sap/ushell_abap/api/S4MyHome.js +58 -0
  28. package/src/main/js/sap/ushell_abap/bootstrap/DirectAppStart.js +28 -15
  29. package/src/main/js/sap/ushell_abap/bootstrap/LoadLaunchpad/CreateRenderer.js +4 -2
  30. package/src/main/js/sap/ushell_abap/bootstrap/LoadLaunchpad/RequestPages.js +2 -6
  31. package/src/main/js/sap/ushell_abap/bootstrap/PlatformConfig.js +5 -5
  32. package/src/main/js/sap/ushell_abap/bootstrap/XhrLogonEventHandler.js +6 -7
  33. package/src/main/js/sap/ushell_abap/bootstrap/abapConstants.js +30 -0
  34. package/src/main/js/sap/ushell_abap/components/SideNavigation/modules/Favorites.js +549 -0
  35. package/src/main/js/sap/ushell_abap/components/SideNavigation/modules/GenericNavigationListProvider.js +241 -0
  36. package/src/main/js/sap/ushell_abap/components/cards/Card.controller.js +117 -0
  37. package/src/main/js/sap/ushell_abap/components/cards/Card.view.xml +11 -0
  38. package/src/main/js/sap/ushell_abap/components/cards/Configuration.controller.js +280 -0
  39. package/src/main/js/sap/ushell_abap/components/cards/Configuration.view.xml +27 -0
  40. package/src/main/js/sap/ushell_abap/components/cards/ManifestPropertyHelper.js +298 -0
  41. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/Component.js +90 -0
  42. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/TransactionCode.controller.js +110 -0
  43. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/TransactionCode.view.xml +16 -0
  44. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n.properties +17 -0
  45. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_ar.properties +10 -0
  46. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_bg.properties +10 -0
  47. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_ca.properties +10 -0
  48. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_cnr.properties +10 -0
  49. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_cs.properties +10 -0
  50. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_cy.properties +10 -0
  51. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_da.properties +10 -0
  52. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_de.properties +10 -0
  53. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_el.properties +10 -0
  54. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_en.properties +10 -0
  55. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_en_GB.properties +10 -0
  56. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_en_US_sappsd.properties +10 -0
  57. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_en_US_saprigi.properties +10 -0
  58. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_en_US_saptrc.properties +10 -0
  59. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_es.properties +10 -0
  60. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_es_MX.properties +10 -0
  61. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_et.properties +10 -0
  62. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_fi.properties +10 -0
  63. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_fr.properties +10 -0
  64. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_fr_CA.properties +10 -0
  65. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_hi.properties +10 -0
  66. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_hr.properties +10 -0
  67. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_hu.properties +10 -0
  68. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_id.properties +10 -0
  69. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_it.properties +10 -0
  70. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_iw.properties +10 -0
  71. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_ja.properties +10 -0
  72. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_kk.properties +10 -0
  73. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_ko.properties +10 -0
  74. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_lt.properties +10 -0
  75. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_lv.properties +10 -0
  76. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_mk.properties +10 -0
  77. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_ms.properties +10 -0
  78. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_nl.properties +10 -0
  79. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_no.properties +10 -0
  80. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_pl.properties +10 -0
  81. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_pt.properties +10 -0
  82. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_pt_PT.properties +10 -0
  83. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_ro.properties +10 -0
  84. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_ru.properties +10 -0
  85. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_sh.properties +10 -0
  86. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_sk.properties +10 -0
  87. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_sl.properties +10 -0
  88. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_sr.properties +10 -0
  89. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_sv.properties +10 -0
  90. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_th.properties +10 -0
  91. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_tr.properties +10 -0
  92. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_uk.properties +10 -0
  93. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_vi.properties +10 -0
  94. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_zh_CN.properties +10 -0
  95. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/i18n/i18n_zh_TW.properties +10 -0
  96. package/src/main/js/sap/ushell_abap/components/settings/TransactionCode/manifest.json +96 -0
  97. package/src/main/js/sap/ushell_abap/components/tiles/action/ActionTile.controller.js +189 -0
  98. package/src/main/js/sap/ushell_abap/components/tiles/action/ActionTile.view.xml +13 -0
  99. package/src/main/js/sap/ushell_abap/components/tiles/action/Configuration.controller.js +193 -0
  100. package/src/main/js/sap/ushell_abap/components/tiles/action/Configuration.view.xml +333 -0
  101. package/src/main/js/sap/ushell_abap/components/tiles/applauncher/Component.js +41 -0
  102. package/src/main/js/sap/ushell_abap/components/tiles/applauncher/Configuration.controller.js +114 -0
  103. package/src/main/js/sap/ushell_abap/components/tiles/applauncher/Configuration.view.xml +208 -0
  104. package/src/main/js/sap/ushell_abap/components/tiles/applauncher/StaticTile.controller.js +497 -0
  105. package/src/main/js/sap/ushell_abap/components/tiles/applauncher/StaticTile.view.js +61 -0
  106. package/src/main/js/sap/ushell_abap/components/tiles/applauncherdynamic/Component.js +45 -0
  107. package/src/main/js/sap/ushell_abap/components/tiles/applauncherdynamic/Configuration.controller.js +113 -0
  108. package/src/main/js/sap/ushell_abap/components/tiles/applauncherdynamic/Configuration.view.xml +231 -0
  109. package/src/main/js/sap/ushell_abap/components/tiles/applauncherdynamic/DynamicTile.controller.js +729 -0
  110. package/src/main/js/sap/ushell_abap/components/tiles/applauncherdynamic/DynamicTile.view.js +106 -0
  111. package/src/main/js/sap/ushell_abap/library.js +12 -1
  112. package/src/main/js/sap/ushell_abap/messagebundle.properties +6 -2
  113. package/src/main/js/sap/ushell_abap/pbServices/ui2/Chip.js +7 -3
  114. package/src/main/js/sap/ushell_abap/pbServices/ui2/ODataWrapper.js +3 -5
  115. package/src/main/js/sap/ushell_abap/pbServices/ui2/contracts/configuration.js +54 -4
  116. package/src/main/js/sap/ushell_abap/services/NavigationDataProvider.js +4 -4
  117. package/src/main/js/sap/ushell_abap/ui/VisualizationInstantiation/ChipInstanceWrapper.js +248 -0
  118. package/src/main/js/sap/ushell_abap/ui/VisualizationInstantiation/VizInstanceAbap.js +134 -0
  119. package/src/main/js/sap/ushell_abap/ui/VisualizationInstantiation/VizInstanceAbapLink.js +145 -0
  120. package/src/main/js/sap/ushell_abap/utils/UserPersonalization.js +127 -0
  121. package/ui5.yaml +21 -3
@@ -0,0 +1,497 @@
1
+ // Copyright (c) 2009-2026 SAP SE, All Rights Reserved
2
+
3
+ sap.ui.define([
4
+ "sap/ui/core/mvc/Controller",
5
+ "sap/ushell_abap/utils/UserPersonalization",
6
+ "sap/ushell/components/tiles/utils",
7
+ "sap/ushell/Config",
8
+ "sap/ushell/utils/WindowUtils",
9
+ "sap/m/library",
10
+ "sap/ushell/library",
11
+ "sap/ui/model/json/JSONModel",
12
+ "sap/base/Log",
13
+ "sap/ushell/base/UrlParsing",
14
+ "sap/ushell/EventHub",
15
+ "sap/ushell/Container",
16
+ "sap/ushell/utils/LaunchpadError"
17
+ ], (
18
+ Controller,
19
+ UserPersonalization,
20
+ tileUtils,
21
+ Config,
22
+ WindowUtils,
23
+ mobileLibrary,
24
+ ushellLibrary,
25
+ JSONModel,
26
+ Log,
27
+ UrlParsing,
28
+ EventHub,
29
+ Container,
30
+ LaunchpadError
31
+ ) => {
32
+ "use strict";
33
+
34
+ // shortcut for sap.m.GenericTileScope
35
+ const GenericTileScope = mobileLibrary.GenericTileScope;
36
+
37
+ // shortcut for sap.m.GenericTileMode
38
+ const GenericTileMode = mobileLibrary.GenericTileMode;
39
+
40
+ // shortcut for sap.ushell.AppType
41
+ const AppType = ushellLibrary.AppType;
42
+
43
+ // shortcut for sap.m.FrameType
44
+ const FrameType = mobileLibrary.FrameType;
45
+
46
+ /* global hasher */
47
+
48
+ return Controller.extend("sap.ushell_abap.components.tiles.applauncher.StaticTile", {
49
+ _aDoables: [],
50
+
51
+ onInit: function () {
52
+ this._aDoables = [];
53
+ const oView = this.getView();
54
+ const oViewData = oView.getViewData();
55
+ const oTileApi = oViewData.chip; // instance specific CHIP API
56
+ const oConfig = tileUtils.getAppLauncherConfig(oTileApi, oTileApi.configurationUi.isEnabled(), false);
57
+ const that = this;
58
+ let sNavigationTargetUrl = oConfig.navigation_target_url;
59
+ let oParsedHash;
60
+
61
+ const sSystem = oTileApi.url.getApplicationSystem();
62
+ if (sSystem) { // propagate system to target application
63
+ // when the navigation url is hash we want to make sure system parameter is in the parameters part
64
+ if (UrlParsing.isIntentUrl(sNavigationTargetUrl)) {
65
+ oParsedHash = UrlParsing.parseShellHash(sNavigationTargetUrl);
66
+ if (!oParsedHash.params) {
67
+ oParsedHash.params = {};
68
+ }
69
+ oParsedHash.params["sap-system"] = sSystem;
70
+ sNavigationTargetUrl = `#${UrlParsing.constructShellHash(oParsedHash)}`;
71
+ } else {
72
+ sNavigationTargetUrl += `${(sNavigationTargetUrl.indexOf("?") < 0) ? "?" : "&"}sap-system=${sSystem}`;
73
+ }
74
+ }
75
+ this.navigationTargetUrl = sNavigationTargetUrl;
76
+
77
+ const oModel = new JSONModel({
78
+ sizeBehavior: Config.last("/core/home/sizeBehavior"),
79
+ wrappingType: Config.last("/core/home/wrappingType"),
80
+ config: oConfig,
81
+ // These initial values are overwritten by the types contract
82
+ mode: oConfig.display_mode,
83
+ frameType: FrameType.OneByOne,
84
+ nav: { navigation_target_url: (oTileApi.configurationUi && oTileApi.configurationUi.isEnabled() ? "" : sNavigationTargetUrl) },
85
+ search: { display_highlight_terms: [] }
86
+ });
87
+ oView.setModel(oModel);
88
+ // listen for changes of the size behavior, as the end user can change it in the settings (if enabled)
89
+ this._aDoables.push(Config.on("/core/home/sizeBehavior").do((sSizeBehavior) => {
90
+ oModel.setProperty("/sizeBehavior", sSizeBehavior);
91
+ }));
92
+
93
+ // implement types contact
94
+ // default is Tile
95
+ if (oTileApi.types) {
96
+ oTileApi.types.attachSetType((sType) => {
97
+ if (that.tileType === sType) {
98
+ return;
99
+ }
100
+ let sMode = oModel.getProperty("/config/display_mode");
101
+ let sFrameType;
102
+ switch (sType) {
103
+ case "tilewide":
104
+ sMode ||= GenericTileMode.ContentMode;
105
+ sFrameType = FrameType.TwoByOne;
106
+ break;
107
+ case "flat":
108
+ sMode ||= GenericTileMode.ContentMode;
109
+ sFrameType = FrameType.OneByHalf;
110
+ break;
111
+ case "flatwide":
112
+ sMode ||= GenericTileMode.ContentMode;
113
+ sFrameType = FrameType.TwoByHalf;
114
+ break;
115
+ case "link":
116
+ sMode = GenericTileMode.LineMode;
117
+ sFrameType = FrameType.OneByOne;
118
+ break;
119
+
120
+ case "tile":
121
+ default:
122
+ sMode ||= GenericTileMode.ContentMode;
123
+ sFrameType = FrameType.OneByOne;
124
+ break;
125
+ }
126
+ oModel.setProperty("/mode", sMode);
127
+ oModel.setProperty("/frameType", sFrameType);
128
+
129
+ that.tileType = sType;
130
+ });
131
+ }
132
+
133
+ if (!this.tileType) {
134
+ this.tileType = "tile";
135
+ }
136
+
137
+ // implement search contract
138
+ if (oTileApi.search) {
139
+ // split and clean keyword string (may be comma + space delimited)
140
+ const sKeywords = oView.getModel().getProperty("/config/display_search_keywords");
141
+ const aKeywords = sKeywords
142
+ .split(/[, ]+/)
143
+ .filter((n) => { return n && n !== ""; });
144
+
145
+ // add title and subtitle (if present) to keywords for better FLP searching
146
+ if (oConfig.display_title_text && oConfig.display_title_text !== "" &&
147
+ aKeywords.indexOf(oConfig.display_title_text) === -1) {
148
+ aKeywords.push(oConfig.display_title_text);
149
+ }
150
+ if (oConfig.display_subtitle_text && oConfig.display_subtitle_text !== "" &&
151
+ aKeywords.indexOf(oConfig.display_subtitle_text) === -1) {
152
+ aKeywords.push(oConfig.display_subtitle_text);
153
+ }
154
+ if (oConfig.display_info_text && oConfig.display_info_text !== "" &&
155
+ aKeywords.indexOf(oConfig.display_info_text) === -1) {
156
+ aKeywords.push(oConfig.display_info_text);
157
+ }
158
+
159
+ // defined in search contract:
160
+ oTileApi.search.setKeywords(aKeywords);
161
+ oTileApi.search.attachHighlight(
162
+ (aHighlightWords) => {
163
+ oView.getModel().setProperty("/search/display_highlight_terms", aHighlightWords);
164
+ }
165
+ );
166
+ }
167
+
168
+ // implement bag update handler
169
+ if (oTileApi.bag && oTileApi.bag.attachBagsUpdated) {
170
+ // is only called by the FLP for bookmark tiles which have been updated via bookmark service
171
+ oTileApi.bag.attachBagsUpdated((aUpdatedBagIds) => {
172
+ if (aUpdatedBagIds.indexOf("tileProperties") > -1) {
173
+ tileUtils._updateTilePropertiesTexts(oView, oTileApi.bag.getBag("tileProperties"));
174
+ }
175
+ });
176
+ }
177
+
178
+ // implement configuration update handler
179
+ if (oTileApi.configuration) {
180
+ oTileApi.configuration.getTransactionCode().then((sEffective) => {
181
+ this.getView().getModel().setProperty("/config/display_transaction_code_effective", sEffective);
182
+ });
183
+
184
+ if (oTileApi.configuration.attachConfigurationUpdated) {
185
+ // is only called by the FLP for bookmark tiles which have been updated via bookmark service
186
+ oTileApi.configuration.attachConfigurationUpdated((aUpdatedConfigKeys) => {
187
+ if (aUpdatedConfigKeys.indexOf("tileConfiguration") > -1) {
188
+ tileUtils._updateTileConfiguration(oView, oTileApi.configuration.getParameterValueAsString("tileConfiguration"));
189
+ }
190
+
191
+ oTileApi.configuration.getTransactionCode().then((sEffective) => {
192
+ this.getView().getModel().setProperty("/config/display_transaction_code_effective", sEffective);
193
+ });
194
+ });
195
+ }
196
+ }
197
+
198
+ // implement preview contract
199
+ if (oTileApi.preview) {
200
+ oTileApi.preview.setTargetUrl(sNavigationTargetUrl);
201
+ oTileApi.preview.setPreviewIcon(oConfig.display_icon_url);
202
+ oTileApi.preview.setPreviewTitle(oConfig.display_title_text);
203
+ if (oTileApi.preview.setPreviewSubtitle && typeof oTileApi.preview.setPreviewSubtitle === "function") {
204
+ oTileApi.preview.setPreviewSubtitle(oConfig.display_subtitle_text);
205
+ }
206
+ }
207
+
208
+ // implement configurationUi contract: setup configuration UI
209
+ if (oTileApi.configurationUi.isEnabled()) {
210
+ oTileApi.configurationUi.setAsyncUiProvider(() => {
211
+ return tileUtils.getConfigurationUi(oView, "sap.ushell_abap.components.tiles.applauncher.Configuration")
212
+ .then((oConfigurationUi) => {
213
+ oTileApi.configurationUi.attachCancel(that.onCancelConfiguration.bind(null, oConfigurationUi));
214
+ oTileApi.configurationUi.attachSave(that.onSaveConfiguration.bind(null, oConfigurationUi));
215
+ return oConfigurationUi;
216
+ });
217
+ });
218
+ this.getView().getContent()[0].setTooltip(
219
+ tileUtils.getResourceBundle().getText("edit_configuration.tooltip")
220
+ );
221
+ }
222
+
223
+ // attach the tile actions provider for the actions contract
224
+ if (oTileApi.actions) {
225
+ let aExtendedActions = [];
226
+ const aActions = oConfig.actions;
227
+ if (aActions) {
228
+ aExtendedActions = aActions.slice();
229
+ }
230
+
231
+ if (Config.last("/core/shell/enablePersonalization")) {
232
+ const sType = (oModel.getProperty("/mode") === GenericTileMode.LineMode) ? "link" : "tile";
233
+ const tileSettingsAction = tileUtils.getTileSettingsAction(oModel, this.onSaveRuntimeSettings.bind(this), sType);
234
+ aExtendedActions.push(tileSettingsAction);
235
+ }
236
+
237
+ oTileApi.actions.setActionsProvider(() => {
238
+ return aExtendedActions;
239
+ });
240
+ }
241
+ },
242
+
243
+ onExit: function () {
244
+ this._aDoables.forEach((oDoable) => {
245
+ oDoable.off();
246
+ });
247
+ this._aDoables = [];
248
+ },
249
+
250
+ // trigger to show the configuration UI if the tile is pressed in Admin mode
251
+ onPress: function (oEvent) {
252
+ const oStaticTileView = this.getView();
253
+ const oViewData = oStaticTileView.getViewData();
254
+ const oTileApi = oViewData.chip;
255
+ const oTileConfig = oStaticTileView.getModel().getProperty("/config");
256
+ // scope is property of generic tile. It's default value is "Display"
257
+ if (oEvent.getSource().getScope && oEvent.getSource().getScope() === GenericTileScope.Display) {
258
+ if (oTileApi.configurationUi.isEnabled()) {
259
+ oTileApi.configurationUi.display();
260
+ } else if (this.navigationTargetUrl) {
261
+ EventHub.emit("UITracer.trace", {
262
+ reason: "LaunchApp",
263
+ source: "Tile",
264
+ data: {
265
+ targetUrl: this.navigationTargetUrl
266
+ }
267
+ });
268
+ if (this.navigationTargetUrl[0] === "#") {
269
+ hasher.setHash(this.navigationTargetUrl);
270
+ } else {
271
+ const bLogRecentActivity = Config.last("/core/shell/enableRecentActivity") && Config.last("/core/shell/enableRecentActivityLogging");
272
+ if (bLogRecentActivity) {
273
+ const oRecentEntry = {
274
+ title: oTileConfig.display_title_text,
275
+ appType: AppType.URL,
276
+ url: oTileConfig.navigation_target_url,
277
+ appId: oTileConfig.navigation_target_url
278
+ };
279
+ Container.getRendererInternal().logRecentActivity(oRecentEntry);
280
+ }
281
+ WindowUtils.openURL(this.navigationTargetUrl, "_blank");
282
+ }
283
+ }
284
+ }
285
+ },
286
+
287
+ // tile settings action UI save handler
288
+ onSaveRuntimeSettings: function (oSettingsView) {
289
+ const oViewModel = oSettingsView.getModel();
290
+ const oTileApi = this.getView().getViewData().chip;
291
+ const oConfigToSave = this.getView().getModel().getProperty("/config");
292
+
293
+ oConfigToSave.display_title_text = oViewModel.getProperty("/title") || "";
294
+ oConfigToSave.display_subtitle_text = oViewModel.getProperty("/subtitle") || "";
295
+ oConfigToSave.display_info_text = oViewModel.getProperty("/info") || "";
296
+ oConfigToSave.display_search_keywords = oViewModel.getProperty("/keywords") || "";
297
+
298
+ // use bag contract in order to store translatable properties
299
+ const tilePropertiesBag = oTileApi.bag.getBag("tileProperties");
300
+ tilePropertiesBag.setText("display_title_text", oConfigToSave.display_title_text);
301
+ tilePropertiesBag.setText("display_subtitle_text", oConfigToSave.display_subtitle_text);
302
+ tilePropertiesBag.setText("display_info_text", oConfigToSave.display_info_text);
303
+ tilePropertiesBag.setText("display_search_keywords", oConfigToSave.display_search_keywords);
304
+
305
+ // saving the relevant properties
306
+ tilePropertiesBag.save(
307
+ // success handler
308
+ () => {
309
+ Log.debug("property bag 'tileProperties' saved successfully");
310
+
311
+ // update tile's model
312
+ this.getView().getModel().setProperty("/config/display_title_text", oConfigToSave.display_title_text);
313
+ this.getView().getModel().setProperty("/config/display_subtitle_text", oConfigToSave.display_subtitle_text);
314
+ this.getView().getModel().setProperty("/config/display_info_text", oConfigToSave.display_info_text);
315
+ this.getView().getModel().setProperty("/config/display_search_keywords", oConfigToSave.display_search_keywords);
316
+
317
+ // call to refresh model which (due to the binding) will refresh the tile
318
+ this.getView().getModel().refresh();
319
+ },
320
+ // fnFailure
321
+ (mErrorMessages, mErrorInfo) => {
322
+ const sFirstFailedBag = Object.keys(mErrorMessages)[0];
323
+
324
+ const oError = new LaunchpadError(`Bag save failed: ${mErrorMessages[sFirstFailedBag]}`, {
325
+ info: mErrorInfo[sFirstFailedBag],
326
+ otherMessages: mErrorMessages,
327
+ otherInfo: mErrorInfo
328
+ });
329
+ Log.error("Bag save failed", oError, "sap.ushell_abap.components.tiles.applauncher.StaticTile.controller");
330
+ }
331
+ );
332
+ },
333
+
334
+ // configuration save handler
335
+ onSaveConfiguration: async function (oConfigurationView) {
336
+ const oModel = oConfigurationView.getModel();
337
+ // tile model placed into configuration model by getConfigurationUi
338
+ const oTileModel = oModel.getProperty("/tileModel");
339
+ const oTileApi = oConfigurationView.getViewData().chip;
340
+ const aTileNavigationActions = tileUtils.tileActionsRows2TileActionsArray(oModel.getProperty("/config/tile_actions_rows"));
341
+ // get the configuration to save from the model
342
+ const configToSave = {
343
+ display_icon_url: oModel.getProperty("/config/display_icon_url"),
344
+ navigation_use_semantic_object: oModel.getProperty("/config/navigation_use_semantic_object"),
345
+ navigation_target_url: oModel.getProperty("/config/navigation_target_url"),
346
+ navigation_semantic_object: (oModel.getProperty("/config/navigation_semantic_object") || "").trim(),
347
+ navigation_semantic_action: (oModel.getProperty("/config/navigation_semantic_action") || "").trim(),
348
+ navigation_semantic_parameters: (oModel.getProperty("/config/navigation_semantic_parameters") || "").trim(),
349
+ display_search_keywords: oModel.getProperty("/config/display_search_keywords")
350
+ };
351
+
352
+ // if the input fields icon, semantic object and action are failing the input validations,
353
+ // then through an error message requesting the user to enter/correct those fields
354
+ let bReject = tileUtils.checkInputOnSaveConfig(oConfigurationView);
355
+ if (!bReject) {
356
+ bReject = tileUtils.checkTileActions(oConfigurationView);
357
+ }
358
+ if (bReject) {
359
+ throw new Error("mandatory_fields_missing");
360
+ }
361
+ // overwrite target URL in case of semantic object navigation
362
+ if (configToSave.navigation_use_semantic_object) {
363
+ configToSave.navigation_target_url = tileUtils.getSemanticNavigationUrl(configToSave);
364
+ oModel.setProperty("/config/navigation_target_url", configToSave.navigation_target_url);
365
+ }
366
+
367
+ // use bag in order to store translatable properties
368
+ const tilePropertiesBag = oTileApi.bag.getBag("tileProperties");
369
+ tilePropertiesBag.setText("display_title_text", oModel.getProperty("/config/display_title_text"));
370
+ tilePropertiesBag.setText("display_subtitle_text", oModel.getProperty("/config/display_subtitle_text"));
371
+ tilePropertiesBag.setText("display_info_text", oModel.getProperty("/config/display_info_text"));
372
+ tilePropertiesBag.setText("display_search_keywords", configToSave.display_search_keywords);
373
+
374
+ const tileNavigationActionsBag = oTileApi.bag.getBag("tileNavigationActions");
375
+ // forward populating of tile navigation actions array into the bag, to Utils
376
+ tileUtils.populateTileNavigationActionsBag(tileNavigationActionsBag, aTileNavigationActions);
377
+
378
+ const oSaveDeferred = Promise.withResolvers();
379
+
380
+ // use configuration contract to write parameter values
381
+ oTileApi.writeConfiguration.setParameterValues(
382
+ { tileConfiguration: JSON.stringify(configToSave) },
383
+ // success handler
384
+ () => {
385
+ const oConfigurationConfig = tileUtils.getAppLauncherConfig(oTileApi, false, false);
386
+ const oTileConfig = tileUtils.getAppLauncherConfig(oTileApi, true, false);
387
+ // switching the model under the tile -> keep the tile model
388
+ const oModel = new JSONModel({
389
+ config: oConfigurationConfig,
390
+ // set empty target url in configuration mode
391
+ nav: { navigation_target_url: "" },
392
+ // keep tile model
393
+ tileModel: oTileModel
394
+ });
395
+ oConfigurationView.setModel(oModel);
396
+ // update tile model
397
+ oTileModel.setData({ config: oTileConfig, nav: { navigation_target_url: "" } }, false);
398
+
399
+ // update tile model
400
+ if (oTileApi.preview) {
401
+ oTileApi.preview.setTargetUrl(oConfigurationConfig.navigation_target_url);
402
+ oTileApi.preview.setPreviewIcon(oConfigurationConfig.display_icon_url);
403
+ oTileApi.preview.setPreviewTitle(oConfigurationConfig.display_title_text);
404
+ if (oTileApi.preview.setPreviewSubtitle && typeof oTileApi.preview.setPreviewSubtitle === "function") {
405
+ oTileApi.preview.setPreviewSubtitle(oConfigurationConfig.display_subtitle_text);
406
+ }
407
+ }
408
+ tilePropertiesBag.save(
409
+ // success handler
410
+ () => {
411
+ Log.debug("property bag 'tileProperties' saved successfully");
412
+ // update possibly changed values via contracts
413
+ if (oTileApi.title) {
414
+ oTileApi.title.setTitle(
415
+ oConfigurationConfig.display_title_text,
416
+ // success handler
417
+ () => {
418
+ oSaveDeferred.resolve();
419
+ },
420
+ // error handler
421
+ (sErrorMessage, oErrorInfo) => {
422
+ Log.error(`property bag 'tileProperties' save failed: ${sErrorMessage}`, null, "sap.ushell_abap.components.tiles.applauncher.StaticTile.controller");
423
+ oSaveDeferred.reject(new LaunchpadError(sErrorMessage, oErrorInfo));
424
+ }
425
+ );
426
+ } else {
427
+ oSaveDeferred.resolve();
428
+ }
429
+ },
430
+ // fnFailure
431
+ (mErrorMessages, mErrorInfo) => {
432
+ const sFirstFailedBag = Object.keys(mErrorMessages)[0];
433
+
434
+ const oError = new LaunchpadError(`Bag save failed: ${mErrorMessages[sFirstFailedBag]}`, {
435
+ info: mErrorInfo[sFirstFailedBag],
436
+ otherMessages: mErrorMessages,
437
+ otherInfo: mErrorInfo
438
+ });
439
+ Log.error("Bag save failed", oError, "sap.ushell_abap.components.tiles.applauncher.StaticTile.controller");
440
+ oSaveDeferred.reject(oError);
441
+ }
442
+ );
443
+
444
+ tileNavigationActionsBag.save(
445
+ // success handler
446
+ () => {
447
+ Log.debug("property bag 'navigationProperties' saved successfully");
448
+ },
449
+ // fnFailure
450
+ (mErrorMessages, mErrorInfo) => {
451
+ const sFirstFailedBag = Object.keys(mErrorMessages)[0];
452
+
453
+ const oError = new LaunchpadError(`Bag save failed: ${mErrorMessages[sFirstFailedBag]}`, {
454
+ info: mErrorInfo[sFirstFailedBag],
455
+ otherMessages: mErrorMessages,
456
+ otherInfo: mErrorInfo
457
+ });
458
+ Log.error("Bag save failed", oError, "sap.ushell_abap.components.tiles.applauncher.StaticTile.controller");
459
+ oSaveDeferred.reject(oError);
460
+ }
461
+ );
462
+ },
463
+ // error handler
464
+ (sErrorMessage, oErrorInfo) => {
465
+ Log.error(`property bag 'tileProperties' save failed: ${sErrorMessage}`, null, "sap.ushell_abap.components.tiles.applauncher.StaticTile.controller");
466
+ oSaveDeferred.reject(new LaunchpadError(sErrorMessage, oErrorInfo));
467
+ }
468
+ );
469
+ oConfigurationView.destroy();
470
+ return oSaveDeferred.promise;
471
+ },
472
+
473
+ // configuration cancel handler
474
+ onCancelConfiguration: function (oConfigurationView) {
475
+ // reload old configuration and display
476
+ const oViewData = oConfigurationView.getViewData();
477
+ const oModel = oConfigurationView.getModel();
478
+ // tile model placed into configuration model by getConfigurationUi
479
+ const oTileModel = oModel.getProperty("/tileModel");
480
+ const oTileApi = oViewData.chip;
481
+ const oCurrentConfig = tileUtils.getAppLauncherConfig(oTileApi, oTileApi.configurationUi.isEnabled(), false);
482
+
483
+ oConfigurationView.getModel().setData({
484
+ config: oCurrentConfig,
485
+ // set empty target url in configuration mode
486
+ nav: { navigation_target_url: "" },
487
+ tileModel: oTileModel
488
+ }, false);
489
+
490
+ oConfigurationView.destroy();
491
+ },
492
+
493
+ formatters: {
494
+ leanURL: WindowUtils.getLeanURL.bind(WindowUtils)
495
+ }
496
+ });
497
+ });
@@ -0,0 +1,61 @@
1
+ // Copyright (c) 2009-2026 SAP SE, All Rights Reserved
2
+
3
+ sap.ui.define([
4
+ "sap/ui/core/mvc/View",
5
+ "sap/m/GenericTile",
6
+ "sap/m/ImageContent",
7
+ "sap/m/TileContent",
8
+ "sap/ushell_abap/components/tiles/applauncher/StaticTile.controller" // Controller needs to be loaded
9
+ ], (
10
+ View,
11
+ GenericTile,
12
+ ImageContent,
13
+ TileContent
14
+ ) => {
15
+ "use strict";
16
+
17
+ return View.extend("sap.ushell_abap.components.tiles.applauncher.StaticTile", {
18
+ getControllerName: function () {
19
+ return "sap.ushell_abap.components.tiles.applauncher.StaticTile";
20
+ },
21
+ createContent: function (/* oController */) {
22
+ this.setHeight("100%");
23
+ this.setWidth("100%");
24
+
25
+ return this.getTileControl();
26
+ },
27
+ getTileControl: function () {
28
+ const oController = this.getController();
29
+
30
+ // Return the GenericTile if it already exists instead of creating a new one
31
+ if (this.getContent().length === 1) {
32
+ return this.getContent()[0];
33
+ }
34
+
35
+ return new GenericTile({
36
+ mode: "{= ${/mode} || (${/config/display_icon_url} ? 'ContentMode' : 'HeaderMode') }",
37
+ frameType: "{/frameType}",
38
+ header: "{/config/display_title_text}",
39
+ subheader: "{/config/display_subtitle_text}",
40
+ sizeBehavior: "{/sizeBehavior}",
41
+ wrappingType: "{/wrappingType}",
42
+ appShortcut: "{/config/display_transaction_code_effective}",
43
+ url: {
44
+ parts: ["/targetURL", "/nav/navigation_target_url"],
45
+ formatter: oController.formatters.leanURL
46
+ },
47
+ tileContent: new TileContent({
48
+ footer: "{/config/display_info_text}",
49
+ content: new ImageContent({
50
+ src: "{/config/display_icon_url}"
51
+ })
52
+ }),
53
+ press: [oController.onPress, oController]
54
+ });
55
+ },
56
+ getMode: function () {
57
+ return this.getModel().getProperty("/mode")
58
+ || (this.getModel().getProperty("/config/display_icon_url") ? "ContentMode" : "HeaderMode");
59
+ }
60
+ });
61
+ });
@@ -0,0 +1,45 @@
1
+ // Copyright (c) 2009-2026 SAP SE, All Rights Reserved
2
+
3
+ sap.ui.define([
4
+ "sap/ui/core/mvc/View",
5
+ "sap/ui/core/UIComponent",
6
+ "sap/ushell/performance/PerformanceAPI"
7
+ ], (
8
+ View,
9
+ UIComponent,
10
+ PerformanceAPI
11
+ ) => {
12
+ "use strict";
13
+
14
+ return UIComponent.extend("sap.ushell_abap.components.tiles.applauncherdynamic.Component", {
15
+ metadata: {
16
+ interfaces: ["sap.ui.core.IAsyncContentCreation"]
17
+ },
18
+
19
+ init: function () {
20
+ UIComponent.prototype.init.apply(this, arguments);
21
+
22
+ PerformanceAPI.attachComponentInitialRendering(this, () => {
23
+ PerformanceAPI.setMark("FLP First Tile View Rendered", {
24
+ useUniqueMark: true
25
+ });
26
+ PerformanceAPI.setMark("FLP Last Tile View Rendered", {
27
+ useOnlyLastMark: true
28
+ });
29
+ });
30
+ },
31
+
32
+ createContent: function () {
33
+ const oComponentData = this.getComponentData();
34
+
35
+ // We use a copy of the StaticTile view to temporarily support older versions of the CHIP XML.
36
+ // This needs to be done since the view-based approach to build CHIPs does not work with typed views
37
+ // At a later point in time, when we can be sure the new XML version has been delivered, we can delete
38
+ // the copied view and always use the original one as a typed view
39
+ return View.create({
40
+ viewName: "module:sap/ushell_abap/components/tiles/applauncherdynamic/DynamicTile.view",
41
+ viewData: oComponentData
42
+ });
43
+ }
44
+ });
45
+ });