@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.
- package/package.json +1 -1
- package/src/sap/suite/ui/generic/template/.library +1 -1
- package/src/sap/suite/ui/generic/template/AnalyticalListPage/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/Canvas/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/ListReport/controller/ControllerImplementation.js +0 -6
- package/src/sap/suite/ui/generic/template/ListReport/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/Component.js +5 -0
- package/src/sap/suite/ui/generic/template/ObjectPage/controller/ControllerImplementation.js +31 -0
- package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/Actions.fragment.xml +1 -1
- package/src/sap/suite/ui/generic/template/QuickCreate/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/QuickView/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartFilterBarWrapper.js +8 -3
- package/src/sap/suite/ui/generic/template/genericUtilities/designtime/messagebundle.properties +0 -0
- package/src/sap/suite/ui/generic/template/lib/AppComponent.js +19 -3
- package/src/sap/suite/ui/generic/template/lib/Application.js +13 -0
- package/src/sap/suite/ui/generic/template/lib/CommonEventHandlers.js +19 -4
- package/src/sap/suite/ui/generic/template/lib/CommonUtils.js +4 -4
- package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillAIOrchestrator.js +15 -0
- package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillApplyHandler.js +12 -5
- package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillFormRenderer.js +78 -17
- package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillHandler.js +3 -1
- package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillTableRenderer.js +106 -6
- package/src/sap/suite/ui/generic/template/lib/ai/EasyFilterBarHandler.js +29 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n.properties +11 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ar.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_bg.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ca.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cnr.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cs.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cy.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_da.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_de.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_el.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_GB.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_sappsd.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_saprigi.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_saptrc.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es_MX.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_et.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fi.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr.properties +10 -4
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr_CA.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hi.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hr.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hu.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_id.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_it.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_iw.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ja.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_kk.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ko.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lt.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lv.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_mk.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ms.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_nl.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_no.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pl.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt_PT.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ro.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ru.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sh.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sk.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sl.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sr.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sv.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_th.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_tr.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_uk.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_vi.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_CN.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_TW.properties +7 -1
- package/src/sap/suite/ui/generic/template/lib/insights/InsightsCardHelper.js +24 -4
- package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +1 -1
- package/src/sap/suite/ui/generic/template/lib/presentationControl/SmartTableHandler.js +4 -0
- package/src/sap/suite/ui/generic/template/library.js +1 -1
- package/src/sap/suite/ui/generic/template/themes/base/ObjectPage.less +6 -0
package/package.json
CHANGED
|
@@ -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);
|
|
@@ -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);
|
|
@@ -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} && !${_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"
|
|
@@ -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
|
-
|
|
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
|
|
202
|
-
oSmartVariant = oSmartFilterBar.getSmartVariant(),
|
|
207
|
+
var oSmartVariant = oSmartFilterBar.getSmartVariant(),
|
|
203
208
|
bIsCurrentVariantModifiedBeforeSetState = oSmartVariant.currentVariantGetModified();
|
|
204
209
|
|
|
205
210
|
oUiState.getSelectionVariant().SelectOptions = oState && oState.selectOptions;
|
package/src/sap/suite/ui/generic/template/genericUtilities/designtime/messagebundle.properties
ADDED
|
File without changes
|
|
@@ -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.
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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
|
|
839
|
-
//
|
|
840
|
-
if (oOutbound.parameters
|
|
841
|
-
oNavigationHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, null, null,
|
|
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
|
|
102
|
-
var
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
179
|
-
|
|
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 ────────────────────────────────────────────────────
|