@sapui5/sap.suite.ui.generic.template 1.152.0 → 1.153.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 (81) hide show
  1. package/package.json +1 -1
  2. package/src/sap/suite/ui/generic/template/.library +1 -1
  3. package/src/sap/suite/ui/generic/template/AnalyticalListPage/manifest.json +1 -1
  4. package/src/sap/suite/ui/generic/template/Canvas/manifest.json +1 -1
  5. package/src/sap/suite/ui/generic/template/ListReport/controller/ControllerImplementation.js +0 -6
  6. package/src/sap/suite/ui/generic/template/ListReport/manifest.json +1 -1
  7. package/src/sap/suite/ui/generic/template/ObjectPage/Component.js +5 -0
  8. package/src/sap/suite/ui/generic/template/ObjectPage/controller/ControllerImplementation.js +31 -0
  9. package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
  10. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/Actions.fragment.xml +1 -1
  11. package/src/sap/suite/ui/generic/template/QuickCreate/manifest.json +1 -1
  12. package/src/sap/suite/ui/generic/template/QuickView/manifest.json +1 -1
  13. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartFilterBarWrapper.js +8 -3
  14. package/src/sap/suite/ui/generic/template/genericUtilities/designtime/messagebundle.properties +0 -0
  15. package/src/sap/suite/ui/generic/template/lib/AppComponent.js +19 -3
  16. package/src/sap/suite/ui/generic/template/lib/Application.js +13 -0
  17. package/src/sap/suite/ui/generic/template/lib/CommonEventHandlers.js +19 -4
  18. package/src/sap/suite/ui/generic/template/lib/CommonUtils.js +4 -4
  19. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillAIOrchestrator.js +15 -0
  20. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillApplyHandler.js +12 -5
  21. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillFormRenderer.js +78 -17
  22. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillHandler.js +3 -1
  23. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillTableRenderer.js +106 -6
  24. package/src/sap/suite/ui/generic/template/lib/ai/EasyFilterBarHandler.js +29 -1
  25. package/src/sap/suite/ui/generic/template/lib/i18n/i18n.properties +11 -2
  26. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ar.properties +7 -1
  27. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_bg.properties +7 -1
  28. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ca.properties +7 -1
  29. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cnr.properties +7 -1
  30. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cs.properties +7 -1
  31. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cy.properties +7 -1
  32. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_da.properties +7 -1
  33. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_de.properties +7 -1
  34. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_el.properties +7 -1
  35. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en.properties +7 -1
  36. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_GB.properties +7 -1
  37. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_sappsd.properties +7 -1
  38. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_saprigi.properties +7 -1
  39. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_saptrc.properties +7 -1
  40. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es.properties +7 -1
  41. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es_MX.properties +7 -1
  42. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_et.properties +7 -1
  43. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fi.properties +7 -1
  44. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr.properties +10 -4
  45. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr_CA.properties +7 -1
  46. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hi.properties +7 -1
  47. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hr.properties +7 -1
  48. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hu.properties +7 -1
  49. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_id.properties +7 -1
  50. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_it.properties +7 -1
  51. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_iw.properties +7 -1
  52. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ja.properties +7 -1
  53. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_kk.properties +7 -1
  54. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ko.properties +7 -1
  55. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lt.properties +7 -1
  56. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lv.properties +7 -1
  57. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_mk.properties +7 -1
  58. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ms.properties +7 -1
  59. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_nl.properties +7 -1
  60. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_no.properties +7 -1
  61. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pl.properties +7 -1
  62. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt.properties +7 -1
  63. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt_PT.properties +7 -1
  64. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ro.properties +7 -1
  65. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ru.properties +7 -1
  66. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sh.properties +7 -1
  67. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sk.properties +7 -1
  68. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sl.properties +7 -1
  69. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sr.properties +7 -1
  70. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sv.properties +7 -1
  71. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_th.properties +7 -1
  72. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_tr.properties +7 -1
  73. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_uk.properties +7 -1
  74. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_vi.properties +7 -1
  75. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_CN.properties +7 -1
  76. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_TW.properties +7 -1
  77. package/src/sap/suite/ui/generic/template/lib/insights/InsightsCardHelper.js +24 -4
  78. package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +1 -1
  79. package/src/sap/suite/ui/generic/template/lib/presentationControl/SmartTableHandler.js +4 -0
  80. package/src/sap/suite/ui/generic/template/library.js +1 -1
  81. package/src/sap/suite/ui/generic/template/themes/base/ObjectPage.less +6 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.suite.ui.generic.template",
3
- "version": "1.152.0",
3
+ "version": "1.153.0",
4
4
  "description": "SAPUI5 Library sap.suite.ui.generic.template",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -7,7 +7,7 @@
7
7
 
8
8
  (c) Copyright 2009-2015 SAP SE. All rights reserved
9
9
  </copyright>
10
- <version>1.152.0</version>
10
+ <version>1.153.0</version>
11
11
 
12
12
  <documentation>Library with generic Suite UI templates.</documentation>
13
13
 
@@ -8,7 +8,7 @@
8
8
  "i18n": "i18n/i18n.properties",
9
9
  "applicationVersion": {
10
10
  "__comment": "applicationVersion oder componentversion??",
11
- "version": "1.152.0"
11
+ "version": "1.153.0"
12
12
  },
13
13
  "title": "{{TITLE}}",
14
14
  "description": "{{DESCRIPTION}}",
@@ -8,7 +8,7 @@
8
8
  "i18n": "i18n/i18n.properties",
9
9
  "applicationVersion": {
10
10
  "__comment": "applicationVersion oder componentversion??",
11
- "version": "1.152.0"
11
+ "version": "1.153.0"
12
12
  },
13
13
  "title": "Canvas",
14
14
  "description": "Canvas Page",
@@ -933,12 +933,6 @@ sap.ui.define([
933
933
  var oTempModel = oTemplateUtils.oComponentUtils.getTemplatePrivateModel();
934
934
  if (oTempModel.getProperty("/listReport/filterMode") === "easyFilter") {
935
935
  oSmartFilterbar.setVisible(false);
936
- // Only show gray overlay when data in table is present.
937
- // filters scenario where gray overlay shows up when No data Illustrated msg is rendered
938
- if (oTempModel.getProperty("/generic/bDataAreShownInTable")) {
939
- oTempModel.setProperty("/listReport/firstSelection", true);
940
- oTempModel.setProperty("/generic/bDataAreShownInTable", false);
941
- }
942
936
  } else {
943
937
  PXFeedback.triggerPXIntegration("toggleSwitchV2");
944
938
  oSmartFilterbar.setVisible(true);
@@ -8,7 +8,7 @@
8
8
  "i18n": "i18n/i18n.properties",
9
9
  "applicationVersion": {
10
10
  "__comment": "applicationVersion oder componentversion??",
11
- "version": "1.152.0"
11
+ "version": "1.153.0"
12
12
  },
13
13
  "title": "{{TITLE}}",
14
14
  "description": "{{DESCRIPTION}}",
@@ -126,6 +126,11 @@ sap.ui.define(["sap/suite/ui/generic/template/lib/TemplateAssembler",
126
126
  "type": "boolean",
127
127
  "defaultValue": false
128
128
  },
129
+ // shall Smart Summarization entry point be visible on this object page?
130
+ "hideSummarizationButton": {
131
+ "type": "boolean",
132
+ "defaultValue": false
133
+ },
129
134
  // shall confirmation popup be shown in object page while saving?
130
135
  "showConfirmationOnDraftActivate": {
131
136
  "type": "boolean",
@@ -1907,6 +1907,11 @@ sap.ui.define([
1907
1907
 
1908
1908
  oViewProxy.onComponentActivate = function(sBindingPath, bIsComponentCurrentlyActive){
1909
1909
  oBase.onComponentActivate(sBindingPath, bIsComponentCurrentlyActive);
1910
+ // Seed showRelatedApps for paths that skip startup-parameter processing (cross-app nav, direct URL).
1911
+ var oTemplatePrivateModel = oTemplateUtils.oComponentUtils.getTemplatePrivateModel();
1912
+ if (oTemplatePrivateModel.getProperty("/objectPage/showRelatedApps") === undefined) {
1913
+ oTemplatePrivateModel.setProperty("/objectPage/showRelatedApps", oController.getOwnerComponent().getShowRelatedApps());
1914
+ }
1910
1915
  mTablesWithSelectionChangeDuringDraftEdit = Object.create(null);
1911
1916
  };
1912
1917
 
@@ -2420,12 +2425,36 @@ sap.ui.define([
2420
2425
  return;
2421
2426
  }
2422
2427
 
2428
+ // Check manifest opt-out: global takes precedence, then page-level
2429
+ if (oTemplPrivGlobal.getProperty("/generic/fioriAI/hideSummarizationButtonGlobal")) {
2430
+ return;
2431
+ }
2432
+ var oTemplPriv = oTemplateUtils.oComponentUtils.getTemplatePrivateModel();
2433
+ if (oTemplPriv.getProperty("/objectPage/hideSummarizationButton")) {
2434
+ return;
2435
+ }
2436
+
2423
2437
  // Find "Summarize" button
2424
2438
  var oButton = oController.byId("summarize");
2425
2439
  if (oButton) {
2426
2440
  oButton.firePress();
2427
2441
  }
2428
2442
  }
2443
+
2444
+ // Calculate summarization rendering based on global and per-object page settings.
2445
+ function setSummarizationButtonVisibility() {
2446
+ var oComponentUtils = oTemplateUtils.oComponentUtils;
2447
+ var bHideSummarizationButtonGlobal = oComponentUtils.getTemplatePrivateGlobalModel().getProperty("/generic/fioriAI/hideSummarizationButtonGlobal");
2448
+ var bHideSummarizationButton = false;
2449
+ if (oComponentUtils.getSettings().hideSummarizationButton !== undefined) {
2450
+ if (typeof oComponentUtils.getSettings().hideSummarizationButton !== "boolean") {
2451
+ oLogger.warning("Manifest setting 'hideSummarizationButton' must be a boolean. Falling back to default: false.");
2452
+ } else {
2453
+ bHideSummarizationButton = oComponentUtils.getSettings().hideSummarizationButton;
2454
+ }
2455
+ }
2456
+ oComponentUtils.getTemplatePrivateModel().setProperty("/objectPage/hideSummarizationButton", bHideSummarizationButtonGlobal || bHideSummarizationButton);
2457
+ }
2429
2458
 
2430
2459
  // Generation of Event Handlers
2431
2460
  var oControllerImplementation = {
@@ -2434,6 +2463,8 @@ sap.ui.define([
2434
2463
  var bHeaderContent = oObjectPage.getShowHeaderContent();
2435
2464
  var oTemplatePrivateModel = oTemplateUtils.oComponentUtils.getTemplatePrivateModel();
2436
2465
  oTemplatePrivateModel.setProperty("/objectPage/headerContentVisible", bHeaderContent);
2466
+ // Calculate summarization rendering based on global and per-object page settings.
2467
+ setSummarizationButtonVisibility();
2437
2468
  // Create a wrapper around the object page
2438
2469
  // Use this wrapper to store/restore the pinned status of the header.
2439
2470
  oObjectPageLayoutWrapper = oTemplateUtils.oCommonUtils.getControlStateWrapper(oObjectPage);
@@ -6,7 +6,7 @@
6
6
  "type": "component",
7
7
  "i18n": "i18n/i18n.properties",
8
8
  "applicationVersion": {
9
- "version": "1.152.0"
9
+ "version": "1.153.0"
10
10
  },
11
11
  "title": "{{TITLE}}",
12
12
  "description": "{{DESCRIPTION}}",
@@ -149,7 +149,7 @@
149
149
  fesr:press="fe:sum:summarize"
150
150
  type="Ghost"
151
151
  dt:designtime="not-adaptable"
152
- visible="{_templPrivGlobal>/generic/fioriAI/isSummarizationEnabled}" />
152
+ visible="{= ${_templPrivGlobal>/generic/fioriAI/isSummarizationEnabled} &amp;&amp; !${_templPriv>/objectPage/hideSummarizationButton} }"/>
153
153
  <uxap:ObjectPageHeaderActionButton id="{:= ${parameter>/stableId}.getStableId({type: 'ObjectPageAction', subType: 'RelatedApps'}) }"
154
154
  text="{i18n>RELATED_APPS}"
155
155
  hideText="false"
@@ -6,7 +6,7 @@
6
6
  "type": "component",
7
7
  "i18n": "i18n/i18n.properties",
8
8
  "applicationVersion": {
9
- "version": "1.152.0"
9
+ "version": "1.153.0"
10
10
  },
11
11
  "title": "{{TITLE}}",
12
12
  "description": "{{DESCRIPTION}}",
@@ -6,7 +6,7 @@
6
6
  "type": "component",
7
7
  "i18n": "i18n/i18n.properties",
8
8
  "applicationVersion": {
9
- "version": "1.152.0"
9
+ "version": "1.153.0"
10
10
  },
11
11
  "title": "{{TITLE}}",
12
12
  "description": "{{DESCRIPTION}}",
@@ -190,7 +190,13 @@ sap.ui.define([
190
190
  function fnSetState(oState) {
191
191
  // Don't cause side effects (filter change event), if setting state is no real change.
192
192
  // If this comparison fails for state that actually are identically, maybe it needs to be enhanced (e.g. ignoring order in some arrays might be needed)
193
- if (JSON.stringify(oState) === JSON.stringify(fnGetState())){
193
+ // If default values present - always set state, to ensure that DefaultValues will be converted to tokens.
194
+ // SFB will have DefaultValues only in case then SFB currently have selected variant with DefaultValues.
195
+ // In case then application is restored from state, SFB will load variant with DefaultValues.
196
+ // SFB ui state and state from URL will be equals. But SFB will have DefaultValues in corresponding ValueHelp controls.
197
+ // To override DefaultValues and to convert to tokens, FEv2 will set state from URL.
198
+ var oUiState = oSmartFilterBar.getUiState();
199
+ if (JSON.stringify(oState) === JSON.stringify(fnGetState()) && !oUiState.getDefaultValues()){
194
200
  return;
195
201
  }
196
202
 
@@ -198,8 +204,7 @@ sap.ui.define([
198
204
 
199
205
  // SFB expects a UIState object - not serializable, but a managed object, actually containing also information not belonging to SFBs state
200
206
  // => get current UIState object from SFB, replace only relevant information, and set it again
201
- var oUiState = oSmartFilterBar.getUiState(),
202
- oSmartVariant = oSmartFilterBar.getSmartVariant(),
207
+ var oSmartVariant = oSmartFilterBar.getSmartVariant(),
203
208
  bIsCurrentVariantModifiedBeforeSetState = oSmartVariant.currentVariantGetModified();
204
209
 
205
210
  oUiState.getSelectionVariant().SelectOptions = oState && oState.selectOptions;
@@ -290,7 +290,17 @@ sap.ui.define([
290
290
  // - FCL: only used in case the App runs in FCL. In this case the FlexibleColumnLayoutHandler instantiates and maintains this subsection
291
291
  // - messagePage: is used to control the MessagePage. It is set on demand by the NavigationController.
292
292
  // Moreover, this function attaches the ui5 message model as named model to the AppComponent with name _templPrivMessage
293
- function setGlobalTemplateModels(){
293
+ function setGlobalTemplateModels() {
294
+ var oGenericApp = oAppComponent.getManifestEntry("sap.ui.generic.app");
295
+ var oGlobalSettings = oGenericApp && oGenericApp.settings;
296
+ var bGlobalHideSummarizationButton = false;
297
+ if (oGlobalSettings && oGlobalSettings.hideSummarizationButton !== undefined) {
298
+ if (typeof oGlobalSettings.hideSummarizationButton !== "boolean") {
299
+ oLogger.warning("Manifest setting 'hideSummarizationButton' must be a boolean. Falling back to default: false.");
300
+ } else {
301
+ bGlobalHideSummarizationButton = oGlobalSettings.hideSummarizationButton;
302
+ }
303
+ }
294
304
  oTemplateContract.oTemplatePrivateGlobalModel.setProperty("/generic", {
295
305
  // Since draft saving is done globally, there is a global state which applies to all DraftIndicators
296
306
  draftIndicatorState: DraftIndicatorState.Clear,
@@ -303,7 +313,8 @@ sap.ui.define([
303
313
  isSummarizationEnabled : false,
304
314
  isEasyFilterEnabled : false,
305
315
  isErrorExplanationEnabled : false,
306
- isEasyFillEnabled: false
316
+ isEasyFillEnabled: false,
317
+ hideSummarizationButtonGlobal: bGlobalHideSummarizationButton
307
318
  }
308
319
  });
309
320
  oAppComponent.setModel(oTemplateContract.oTemplatePrivateGlobalModel, "_templPrivGlobal");
@@ -961,7 +972,7 @@ sap.ui.define([
961
972
  * @public
962
973
  * @extends sap.ui.core.UIComponent
963
974
  * @author SAP SE
964
- * @version 1.152.0
975
+ * @version 1.153.0
965
976
  * @name sap.suite.ui.generic.template.lib.AppComponent
966
977
  */
967
978
  var oAppComponent = UIComponent.extend("sap.suite.ui.generic.template.lib.AppComponent", {
@@ -1073,6 +1084,11 @@ sap.ui.define([
1073
1084
  noDataRepresentation: {
1074
1085
  type: "string",
1075
1086
  defaultValue: "illustration" // Possible values: 'illustration', 'illustrationWithFallback' and 'textOnly'
1087
+ },
1088
+ // Hide Smart Summarization button globally in the application object page
1089
+ hideSummarizationButton: {
1090
+ type: "boolean",
1091
+ defaultValue: false
1076
1092
  }
1077
1093
  },
1078
1094
  events: {
@@ -810,6 +810,18 @@ sap.ui.define(["sap/ui/base/Object",
810
810
  return oTemplateContract.oNavigationControllerProxy.preloadComponent(sRouteName);
811
811
  }
812
812
 
813
+ // Returns true when a navigation call will open in a new tab rather than replacing the current app.
814
+ // sap-ushell-navmode (manifest-level) takes priority; sap-ushell-next-navmode (FLP startup parameter,
815
+ // system-level) is the fallback — mirroring how NavigationHandler itself determines explace.
816
+ function fnIsExplaceNavigation(oOutboundParameters) {
817
+ if (oOutboundParameters && oOutboundParameters["sap-ushell-navmode"] === "explace") {
818
+ return true;
819
+ }
820
+ var oComponentData = oTemplateContract.oAppComponent.getComponentData && oTemplateContract.oAppComponent.getComponentData();
821
+ var oStartupParams = oComponentData && oComponentData.startupParameters;
822
+ return !!(oStartupParams && oStartupParams["sap-ushell-next-navmode"] && oStartupParams["sap-ushell-next-navmode"][0] === "explace");
823
+ }
824
+
813
825
  oTemplateContract.oApplicationProxy = { // inject own api for AppComponent into the Template Contract. Other classes (NavigationController, BusyHelper) will call these functions accordingly.
814
826
  createDraftSiblingPromise: oContextBookkeeping.createDraftSiblingPromise,
815
827
  getDraftSiblingPromise: oContextBookkeeping.getDraftSiblingPromise,
@@ -916,6 +928,7 @@ sap.ui.define(["sap/ui/base/Object",
916
928
  mustRequireRequestsCanonical: mustRequireRequestsCanonical,
917
929
  getNavigationHandler: getNavigationHandler,
918
930
  navigateExternal: fnNavigateExternal,
931
+ isExplaceNavigation: fnIsExplaceNavigation,
919
932
  getStatePreservationMode: getStatePreservationMode,
920
933
  setObjectInEditMode: fnSetObjectInEditMode,
921
934
  getObjectInEditMode: fnGetObjectInEditMode,
@@ -722,7 +722,7 @@ sap.ui.define(["sap/ui/base/Object",
722
722
  // null object has to be passed as the fourth argument (i.e. for oInnerAppData) to the navigate method as an indicator that the state should not be overwritten
723
723
  // Explace outbounds must bypass fnNavigateExternal to avoid setting the app busy and consuming the re-entry guard.
724
724
  // getNavigationHandler() returns a ghost stub (no .navigate) when ghostapp=true — guard before calling.
725
- if (oOutbound.parameters && oOutbound.parameters["sap-ushell-navmode"] === "explace") {
725
+ if (oServices.oApplication.isExplaceNavigation(oOutbound.parameters)) {
726
726
  var oNavHandler = oServices.oApplication.getNavigationHandler();
727
727
  if (oNavHandler.navigate) {
728
728
  oNavHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError, null, "explace");
@@ -742,7 +742,15 @@ sap.ui.define(["sap/ui/base/Object",
742
742
  oCommonUtils.removePropertiesFromNavigationContext(oSelectionVariant, oEventSource);
743
743
  oController.adaptNavigationParameterExtension(oSelectionVariant, oObjectInfo);
744
744
  oCommonUtils.setComponentRefreshBehaviour(oOutbound);
745
- oServices.oApplication.navigateExternal(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError);
745
+ // SmartLink outbounds have no manifest parameters so sap-ushell-navmode is never set.
746
+ // System-level sap-ushell-next-navmode can still force a new tab — bypass the re-entry guard in that case.
747
+ if (oServices.oApplication.isExplaceNavigation()) {
748
+ if (oNavigationHandler.navigate) {
749
+ oNavigationHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError, null, "explace");
750
+ }
751
+ } else {
752
+ oServices.oApplication.navigateExternal(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError);
753
+ }
746
754
  }
747
755
 
748
756
  function fnHideTitleArea(oSmLiContent,aContactTitleArea) {
@@ -1115,8 +1123,15 @@ sap.ui.define(["sap/ui/base/Object",
1115
1123
  // The value "sEntitySet" holds the entity set of an object page or a table.
1116
1124
  //
1117
1125
  // Sometimes, the SmartLink is located on a field group which belongs to the child entity set of object page.
1118
- // So, we have to always derive the entity type from the smart link's binding context.
1126
+ // So, we try to derive the entity type from the SmartLink's binding context.
1119
1127
  var oEntityType = ModelUtil.getEntityTypeFromContext(oControl.getBindingContext());
1128
+ // CS20260013063140: ModelUtil.getEntityTypeFromContext returns null when the SmartLink
1129
+ // is resolved via SmartLinkDelegate, because the binding context is not yet resolvable
1130
+ // to an entity type at that point.
1131
+ // Fall back to deriving the entity type from the enclosing entity set instead.
1132
+ if (!oEntityType) {
1133
+ oEntityType = oMetaModel.getODataEntityType(oEntitySet.entityType);
1134
+ }
1120
1135
  var oField = oEntityType.property.find(function (oProperty) { return oProperty.name === sSourceClickedField; });
1121
1136
  var sTextArrangement = "descriptionAndId";
1122
1137
  if (oField) { // TODO: Need to provide the correct field Object using the entityType and corresponding association (should be handled by a BLI)
@@ -2724,7 +2739,7 @@ sap.ui.define(["sap/ui/base/Object",
2724
2739
  oCommonUtils.setComponentRefreshBehaviour(oOutbound);
2725
2740
  // Explace outbounds must bypass fnNavigateExternal to avoid setting the app busy and consuming the re-entry guard.
2726
2741
  // getNavigationHandler() returns a ghost stub (no .navigate) when ghostapp=true — guard before calling.
2727
- if (oOutbound.parameters && oOutbound.parameters["sap-ushell-navmode"] === "explace") {
2742
+ if (oServices.oApplication.isExplaceNavigation(oOutbound.parameters)) {
2728
2743
  var oNavHandler = oServices.oApplication.getNavigationHandler();
2729
2744
  if (oNavHandler.navigate) {
2730
2745
  oNavHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError, null, "explace");
@@ -835,10 +835,10 @@ sap.ui.define(["sap/ui/base/Object",
835
835
 
836
836
  setComponentRefreshBehaviour(oOutbound);
837
837
 
838
- // We now ensure that the 'sap-ushell-navmode' parameter is passed to the NavigationHandler.navigate method
839
- // and skip setting the app to busy mode when opening a new tab
840
- if (oOutbound.parameters["sap-ushell-navmode"] === "explace") {
841
- oNavigationHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, null, null, oOutbound.parameters["sap-ushell-navmode"]);
838
+ // We now skip setting the app to busy mode when opening a new tab and bypass the re-entry guard (fnNavigateExternal) for explace navigations:
839
+ // the source app stays alive when a new tab is opened, so without the bypass AppComponent.restore() is never called and the guard is never reset.
840
+ if (oServices.oApplication.isExplaceNavigation(oOutbound.parameters)) {
841
+ oNavigationHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, null, null, "explace");
842
842
  } else {
843
843
  oServices.oApplication.navigateExternal(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, fnHandleError);
844
844
  //null object has to be passed to the NavigationHandler as an
@@ -73,6 +73,21 @@ sap.ui.define([
73
73
  fnGetLabel
74
74
  );
75
75
 
76
+ // Seed current field values so the LLM can compute relative changes
77
+ // (e.g. "increase Delivery Date by 10 days", "increase Price by 20%").
78
+ if (oObjectPageContext) {
79
+ Object.keys(mFieldMapping).forEach(function(sPropertyName) {
80
+ var oEntry = mFieldMapping[sPropertyName];
81
+ if (!oEntry || oEntry.isCollection === true) {
82
+ return;
83
+ }
84
+ var vCurrentValue = oObjectPageContext.getProperty(sPropertyName);
85
+ if (vCurrentValue !== undefined && vCurrentValue !== null) {
86
+ oEntry.currentValue = vCurrentValue;
87
+ }
88
+ });
89
+ }
90
+
76
91
  return mFieldMapping;
77
92
  },
78
93
 
@@ -98,8 +98,11 @@ sap.ui.define([
98
98
  var mCollectionPropertyMap = (mCollectionState && mCollectionState.mCollectionProperties &&
99
99
  mCollectionState.mCollectionProperties[sCollectionName]) || Object.create(null);
100
100
 
101
- // Extract scalar values for ALL new row contexts — multiple row creation is supported
102
- var aRowValues = aNewContexts.map(function(oNewContext) {
101
+ // Extract scalar values for ALL non-excluded new row contexts
102
+ var oExcludedNew = oTableStagingState.mExcludedNewRows && oTableStagingState.mExcludedNewRows[sCollectionName];
103
+ var aRowValues = aNewContexts.filter(function(_, i) {
104
+ return !oExcludedNew || !oExcludedNew[i];
105
+ }).map(function(oNewContext) {
103
106
  var oValues = Object.create(null);
104
107
  Object.keys(mCollectionPropertyMap).forEach(function(sPropName) {
105
108
  var vValue = oNewContext.getProperty && oNewContext.getProperty(sPropName);
@@ -132,7 +135,9 @@ sap.ui.define([
132
135
  var aStagedRows = mStagedRowsByCollection[sCollectionName] || [];
133
136
  var mCollectionPropertyMap = mCollectionState.mCollectionProperties[sCollectionName] || Object.create(null);
134
137
 
135
- aStagedRows.forEach(function(oStagedRow) {
138
+ var oExcludedRows = oTableStagingState.mExcludedRows && oTableStagingState.mExcludedRows[sCollectionName];
139
+ aStagedRows.forEach(function(oStagedRow, iIndex) {
140
+ if (oExcludedRows && oExcludedRows[iIndex]) { return; }
136
141
  var oRealContext = oStagedRow.realContext;
137
142
  var oTransientContext = oStagedRow.transientContext;
138
143
  if (!oRealContext || !oTransientContext) {
@@ -192,9 +197,11 @@ sap.ui.define([
192
197
  if (bHasUpdates) {
193
198
  return true;
194
199
  }
195
- // Also return true if there are pending new row contexts
200
+ // Also return true if there are pending new row contexts that are not excluded
196
201
  return Object.keys((oTableStagingState && oTableStagingState.mPendingNewRowContexts) || {}).some(function(sCollectionName) {
197
- return ((oTableStagingState.mPendingNewRowContexts[sCollectionName]) || []).length > 0;
202
+ var aContexts = (oTableStagingState.mPendingNewRowContexts[sCollectionName]) || [];
203
+ var oExcludedNew = oTableStagingState.mExcludedNewRows && oTableStagingState.mExcludedNewRows[sCollectionName];
204
+ return aContexts.some(function(_, i) { return !oExcludedNew || !oExcludedNew[i]; });
198
205
  });
199
206
  },
200
207
 
@@ -2,9 +2,11 @@ sap.ui.define([
2
2
  "sap/ui/comp/smartform/GroupElement",
3
3
  "sap/ui/comp/smartfield/SmartField",
4
4
  "sap/m/Text",
5
+ "sap/m/Link",
6
+ "sap/m/Button",
5
7
  "sap/ui/layout/form/ColumnElementData",
6
8
  "sap/suite/ui/generic/template/genericUtilities/FeLogger"
7
- ], function(GroupElement, SmartField, Text, ColumnElementData, FeLogger) {
9
+ ], function(GroupElement, SmartField, Text, Link, Button, ColumnElementData, FeLogger) {
8
10
  "use strict";
9
11
 
10
12
  var sClassName = "lib.ai.EasyFill.EasyFillFormRenderer";
@@ -100,7 +102,10 @@ sap.ui.define([
100
102
  if (!Array.isArray(aFields) || aFields.length === 0) { return; }
101
103
 
102
104
  var oObjectPageLayout = oController.byId("EasyFillObjectPageLayout");
103
- var sPreviouslyLabel = oController.getView().getModel("i18n").getResourceBundle().getText("EASY_FILL_PREVIOUSLY_LABEL");
105
+ var oRb = oController.getView().getModel("i18n").getResourceBundle();
106
+ var sOriginalValueLabel = oRb.getText("EASY_FILL_ORIGINAL_VALUE_LABEL");
107
+ var sProposedValueLabel = oRb.getText("EASY_FILL_PROPOSED_VALUE_LABEL");
108
+ var sRevertTooltip = oRb.getText("EASY_FILL_REVERT_FIELD_TOOLTIP");
104
109
  var that = this;
105
110
 
106
111
  function tryInject() {
@@ -147,23 +152,21 @@ sap.ui.define([
147
152
  });
148
153
  }
149
154
 
155
+ // Hoist vAIValue so it can be reused when seeding the transient context below
156
+ var vAIValue = oLLMData[sKey];
157
+
150
158
  if (oTransientContextForEasyFill) {
151
159
  oSmartField.setBindingContext(oTransientContextForEasyFill);
152
160
  if (oTransientContextForEasyFill.getProperty(sKey) === undefined) {
153
- oTransientContextForEasyFill.setProperty(sKey, oLLMData[sKey]);
161
+ oTransientContextForEasyFill.setProperty(sKey, vAIValue);
154
162
  }
155
163
  } else {
156
164
  oSmartField.setBindingContext(oObjectPageContext);
157
165
  }
158
166
 
159
- // Read the current (pre-AI) value as a plain string and render it as
160
- // compact secondary text directly below the SmartField.
161
- // Mirroring V4: no second SmartField — just a plain sap.m.Text showing
162
- // "Previously: <value>", avoiding all SmartField layout overhead.
167
+ // Read the current (pre-AI) value as a plain string for display.
163
168
  var vCurrentValue = (oObjectPageContext && typeof oObjectPageContext.getProperty === "function")
164
169
  ? oObjectPageContext.getProperty(sKey) : null;
165
- // Use typeof check to guard against objects/arrays; Date.toLocaleDateString()
166
- // gives a readable form for date values rather than "[object Object]".
167
170
  var sCurrentValue;
168
171
  if (vCurrentValue === null || vCurrentValue === undefined || vCurrentValue === "") {
169
172
  sCurrentValue = "-";
@@ -175,17 +178,75 @@ sap.ui.define([
175
178
  sCurrentValue = String(vCurrentValue);
176
179
  }
177
180
 
178
- var oPreviousValueText = new Text({
179
- text: sPreviouslyLabel + " " + sCurrentValue,
181
+ var oGroupElement = new GroupElement({ useHorizontalLayout: false });
182
+ oGroupElement.addElement(oSmartField);
183
+
184
+ // "Original Value:" text shown for all fields (editable and non-editable)
185
+ var oOriginalValueText = new Text({
186
+ text: sOriginalValueLabel + " " + sCurrentValue,
180
187
  wrapping: false
181
188
  }).addStyleClass("sapEasyFillPreviouslyLabel");
189
+ oGroupElement.addElement(oOriginalValueText);
190
+
191
+ // Toggle controls (revert button + proposed value link) only for editable fields
192
+ if (bIsEditable) {
193
+ var bReverted = false;
194
+
195
+ var oRevertButton = new Button({
196
+ icon: "sap-icon://undo",
197
+ type: "Transparent",
198
+ tooltip: sRevertTooltip
199
+ }).addStyleClass("sapEasyFillRevertButton");
200
+
201
+ // State 2 row: "Proposed Value: <aiValue>" clickable link — hidden until user reverts
202
+ var sAIDisplayValue;
203
+ if (vAIValue === null || vAIValue === undefined || vAIValue === "") {
204
+ sAIDisplayValue = "-";
205
+ } else if (vAIValue instanceof Date) {
206
+ sAIDisplayValue = vAIValue.toLocaleDateString();
207
+ } else if (typeof vAIValue === "object") {
208
+ sAIDisplayValue = "-";
209
+ } else {
210
+ sAIDisplayValue = String(vAIValue);
211
+ }
212
+
213
+ var oProposedValueLink = new Link({
214
+ text: sProposedValueLabel + " " + sAIDisplayValue,
215
+ wrapping: false,
216
+ visible: false,
217
+ icon: "sap-icon://ai"
218
+ }).addStyleClass("sapEasyFillProposedValueLink");
219
+
220
+ // Revert button: State 1 → State 2
221
+ oRevertButton.attachPress(function() {
222
+ if (bReverted) { return; }
223
+ bReverted = true;
224
+ if (oTransientContextForEasyFill) {
225
+ oTransientContextForEasyFill.setProperty(sKey, vCurrentValue);
226
+ }
227
+ oOriginalValueText.setVisible(false);
228
+ oRevertButton.setVisible(false);
229
+ oProposedValueLink.setVisible(true);
230
+ if (typeof fnOnFieldChange === "function") { fnOnFieldChange(); }
231
+ });
232
+
233
+ // Proposed Value link: State 2 → State 1
234
+ oProposedValueLink.attachPress(function() {
235
+ if (!bReverted) { return; }
236
+ bReverted = false;
237
+ if (oTransientContextForEasyFill) {
238
+ oTransientContextForEasyFill.setProperty(sKey, vAIValue);
239
+ }
240
+ oProposedValueLink.setVisible(false);
241
+ oOriginalValueText.setVisible(true);
242
+ oRevertButton.setVisible(true);
243
+ if (typeof fnOnFieldChange === "function") { fnOnFieldChange(); }
244
+ });
245
+
246
+ oGroupElement.addElement(oRevertButton);
247
+ oGroupElement.addElement(oProposedValueLink);
248
+ }
182
249
 
183
- // Two elements stacked vertically in one GroupElement:
184
- // row 1 — primary SmartField (AI value, editable or read-only)
185
- // row 2 — "Previously: <value>" text directly below, no gap
186
- var oGroupElement = new GroupElement({ useHorizontalLayout: false });
187
- oGroupElement.addElement(oSmartField);
188
- oGroupElement.addElement(oPreviousValueText);
189
250
  oGroup.addGroupElement(oGroupElement);
190
251
  });
191
252
 
@@ -76,7 +76,9 @@ sap.ui.define([
76
76
  var mLastFieldMapping = null; // retained so table sections can be re-rendered on mode switch
77
77
  var oTableStagingState = {
78
78
  mStagedRows: Object.create(null),
79
- mPendingNewRowContexts: Object.create(null)
79
+ mPendingNewRowContexts: Object.create(null),
80
+ mExcludedRows: Object.create(null), // { navProp: { index: true } } existing rows excluded by user
81
+ mExcludedNewRows: Object.create(null) // { navProp: { index: true } } new rows excluded by user
80
82
  };
81
83
 
82
84
  // ─── Internal Helpers ────────────────────────────────────────────────────