@sapui5/sap.suite.ui.generic.template 1.136.7 → 1.136.8
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/i18n/i18n_kk.properties +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/i18n/i18n_pt.properties +1 -1
- package/src/sap/suite/ui/generic/template/ListReport/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/controller/SectionTitleHandler.js +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_pt.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_vi.properties +2 -2
- package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/SmartForm.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/js/AnnotationHelper.js +31 -2
- package/src/sap/suite/ui/generic/template/lib/AppComponent.js +1 -1
- package/src/sap/suite/ui/generic/template/lib/ai/EasyFilterBarHandler.js +44 -199
- package/src/sap/suite/ui/generic/template/lib/ai/EasyFilterDataFetcherHelper.js +334 -0
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_da.properties +1 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_id.properties +3 -3
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ko.properties +1 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt.properties +1 -1
- package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +1 -1
- package/src/sap/suite/ui/generic/template/lib/presentationControl/SmartTableHandler.js +1 -1
- package/src/sap/suite/ui/generic/template/library.js +1 -1
package/package.json
CHANGED
|
@@ -45,7 +45,7 @@ GO_FILTERS=\u04E8\u0442\u0443
|
|
|
45
45
|
|
|
46
46
|
SHOW_ON_FILTER_BAR=\u0421\u04AF\u0437\u0433\u0456 \u0436\u043E\u043B\u0430\u0493\u044B\u043D\u0434\u0430 \u043A\u04E9\u0440\u0441\u0435\u0442\u0443
|
|
47
47
|
|
|
48
|
-
VISUAL_FILTER_FILTERS=\u0421\u04AF\u0437\u0433\u0456\u043B\u0435\u0440\u0434\u0456 \
|
|
48
|
+
VISUAL_FILTER_FILTERS=\u0421\u04AF\u0437\u0433\u0456\u043B\u0435\u0440\u0434\u0456 \u0431\u0435\u0439\u0456\u043C\u0434\u0435\u0443
|
|
49
49
|
|
|
50
50
|
VISUAL_FILTER_FILTERS_WITH_COUNT=\u0421\u04AF\u0437\u0433\u0456\u043B\u0435\u0440\u0434\u0456 \u0431\u0435\u0439\u0456\u043C\u0434\u0435\u0443 ({0})
|
|
51
51
|
|
|
@@ -43,7 +43,7 @@ MESSAGE_SINGLE_VALUE_L_FORM=O filtro "{0}" n\u00E3o \u00E9 relevante para a fich
|
|
|
43
43
|
|
|
44
44
|
MESSAGE_SINGLE_VALUE_S_FORM=N\u00E3o \u00E9 poss\u00EDvel filtrar por "{0}" na ficha "{1}".
|
|
45
45
|
|
|
46
|
-
MULTI_EDIT=
|
|
46
|
+
MULTI_EDIT=Editar
|
|
47
47
|
|
|
48
48
|
MULTI_EDIT_DIALOG_TITLE=Editar ({0})
|
|
49
49
|
|
|
@@ -190,7 +190,7 @@ sap.ui.define(["sap/ui/base/Object", "sap/base/util/extend", "sap/suite/ui/gener
|
|
|
190
190
|
return accBlock;
|
|
191
191
|
}, [])
|
|
192
192
|
.forEach(function(entry) {
|
|
193
|
-
if (!oSubSectionInfoObject) {
|
|
193
|
+
if (!oSubSectionInfoObject || (entry.getGroups().length === 1 && entry.getGroups()[0].getTitle && !entry.getGroups()[0].getTitle())) {
|
|
194
194
|
// Case: header is editable. manifest.json, editableHeaderContent=true
|
|
195
195
|
var sInvisibleTextID = `${entry.getId()}-ariaLabelBy-InvisibleText`,
|
|
196
196
|
oInvisibleText = Element.getElementById(sInvisibleTextID);
|
|
@@ -229,8 +229,8 @@ ENTER_MANDATORY=Nh\u1EADp gi\u00E1 tr\u1ECB cho tr\u01B0\u1EDDng {0}.
|
|
|
229
229
|
|
|
230
230
|
REQUIRED_PROP_ERROR=Nh\u1EADp gi\u00E1 tr\u1ECB.
|
|
231
231
|
|
|
232
|
-
REQUIRED_PROP_COLUMN_HIDDEN_ERROR=Ba\u0309ng ch\u01B0\u0301a l\u00F4\u0303i. {0} la\u0300 gi\u00E1 tr\u1ECB b\u0103\u0301t bu\u00F4\u0323c nh\u01B0ng kh\u00F4ng \u0111\u01B0\u01A1\u0323c hi\u00EA\u0309n thi\u0323 trong ba\u0309ng. Vui lo\u0300ng th\u00EAm gi\u00E1 tr\u1ECB trong thi\u00EA\u0301t l\u00E2\u0323p
|
|
233
|
-
REQUIRED_PROP_COLUMN_HIDDEN_ERROR_PLURAL=Ba\u0309ng ch\u01B0\u0301a l\u00F4\u0303i. {0} la\u0300 gi\u00E1 tr\u1ECB b\u0103\u0301t bu\u00F4\u0323c nh\u01B0ng kh\u00F4ng \u0111\u01B0\u01A1\u0323c hi\u00EA\u0309n thi\u0323 trong ba\u0309ng. Vui lo\u0300ng th\u00EAm gi\u00E1 tr\u1ECB trong thi\u00EA\u0301t l\u00E2\u0323p
|
|
232
|
+
REQUIRED_PROP_COLUMN_HIDDEN_ERROR=Ba\u0309ng ch\u01B0\u0301a l\u00F4\u0303i. {0} la\u0300 gi\u00E1 tr\u1ECB b\u0103\u0301t bu\u00F4\u0323c nh\u01B0ng kh\u00F4ng \u0111\u01B0\u01A1\u0323c hi\u00EA\u0309n thi\u0323 trong ba\u0309ng. Vui lo\u0300ng th\u00EAm gi\u00E1 tr\u1ECB trong thi\u00EA\u0301t l\u00E2\u0323p m\u00E0n h\u00ECnh.
|
|
233
|
+
REQUIRED_PROP_COLUMN_HIDDEN_ERROR_PLURAL=Ba\u0309ng ch\u01B0\u0301a l\u00F4\u0303i. {0} la\u0300 gi\u00E1 tr\u1ECB b\u0103\u0301t bu\u00F4\u0323c nh\u01B0ng kh\u00F4ng \u0111\u01B0\u01A1\u0323c hi\u00EA\u0309n thi\u0323 trong ba\u0309ng. Vui lo\u0300ng th\u00EAm gi\u00E1 tr\u1ECB trong thi\u00EA\u0301t l\u00E2\u0323p m\u00E0n h\u00ECnh.
|
|
234
234
|
|
|
235
235
|
T_PAGINATOR_CONTROL_PAGINATOR_TOOLTIP_UP=Mu\u0323c tr\u01B0\u01A1\u0301c
|
|
236
236
|
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
<core:CustomData key="defaultDropDownDisplayBehaviour" value="descriptionOnly" />
|
|
22
22
|
<core:CustomData key="defaultTextInEditModeSource" value="ValueListNoValidation" />
|
|
23
23
|
<core:CustomData key="dateFormatSettings" value='\{"UTC":true,"style":"medium"\}' />
|
|
24
|
-
<core:CustomData key="smartFormAriaLabel" value="{parts: [{path: 'facet>'}, {path: 'entitySet>name'}], formatter: 'AH.getSmartFormTitle'}" />
|
|
24
|
+
<core:CustomData key="smartFormAriaLabel" value="{parts: [{path: 'facet>'}, {path: 'entitySet>name'}, {path: 'block>'}, {path: 'subSectionData>'}], formatter: 'AH.getSmartFormTitle'}" />
|
|
25
25
|
</sfo:customData>
|
|
26
26
|
<sfo:layout>
|
|
27
27
|
<template:if test="{= ${appSettings>/useColumnLayoutForSmartForm} !== false}">
|
|
@@ -3017,7 +3017,7 @@ sap.ui.define(["sap/ui/model/odata/AnnotationHelper",
|
|
|
3017
3017
|
};
|
|
3018
3018
|
}
|
|
3019
3019
|
},
|
|
3020
|
-
|
|
3020
|
+
getTextArrangementFromAnnotations: function (oEntityType, oField) {
|
|
3021
3021
|
var sTextArrangement;
|
|
3022
3022
|
// 1. check TextArrangement definition for property directly - has prio 1
|
|
3023
3023
|
if (oField["com.sap.vocabularies.UI.v1.TextArrangement"] && oField["com.sap.vocabularies.UI.v1.TextArrangement"].EnumMember) {
|
|
@@ -3036,11 +3036,19 @@ sap.ui.define(["sap/ui/model/odata/AnnotationHelper",
|
|
|
3036
3036
|
sTextArrangement = oAnnotationHelper._mapTextArrangement4smartControl(oEntityType["com.sap.vocabularies.UI.v1.TextArrangement"].EnumMember);
|
|
3037
3037
|
}
|
|
3038
3038
|
}
|
|
3039
|
+
return sTextArrangement;
|
|
3040
|
+
},
|
|
3041
|
+
getTextArrangement: function(oEntityType, oField) {
|
|
3042
|
+
var sTextArrangement = this.getTextArrangementFromAnnotations(oEntityType, oField);
|
|
3039
3043
|
if (!sTextArrangement) { //coming from the title should get a readable description and underneath is the id - the default
|
|
3040
3044
|
sTextArrangement = "descriptionAndId";
|
|
3041
3045
|
}
|
|
3042
3046
|
return sTextArrangement;
|
|
3043
3047
|
},
|
|
3048
|
+
getTextArrangementForEasyFilter: function (oEntityType, oField) {
|
|
3049
|
+
var sTextArrangement = this.getTextArrangementFromAnnotations(oEntityType, oField) || "idAndDescription";
|
|
3050
|
+
return sTextArrangement;
|
|
3051
|
+
},
|
|
3044
3052
|
getTextArrangementPath: function (oField) {
|
|
3045
3053
|
return oField["com.sap.vocabularies.Common.v1.Text"] && oField["com.sap.vocabularies.Common.v1.Text"].Path;
|
|
3046
3054
|
},
|
|
@@ -4524,10 +4532,31 @@ sap.ui.define(["sap/ui/model/odata/AnnotationHelper",
|
|
|
4524
4532
|
};
|
|
4525
4533
|
},
|
|
4526
4534
|
|
|
4527
|
-
getSmartFormTitle: function(oInterface, oFacet, sEntitySetName) {
|
|
4535
|
+
getSmartFormTitle: function(oInterface, oFacet, sEntitySetName, oBlock, oSubSectionData) {
|
|
4528
4536
|
if (!oFacet) {
|
|
4537
|
+
return oAnnotationHelper.getTitleForSectionsForms(oBlock, oSubSectionData);
|
|
4538
|
+
}
|
|
4539
|
+
return oAnnotationHelper.getTitleForHeaderForm(oInterface, oFacet, sEntitySetName);
|
|
4540
|
+
},
|
|
4541
|
+
|
|
4542
|
+
getTitleForSectionsForms: function(oBlock, oSubSectionData) {
|
|
4543
|
+
if (oSubSectionData?.annotations?.Facet?.annotation?.Facets?.length > 1
|
|
4544
|
+
|| oSubSectionData?.annotations?.Facet?.annotation?.Label?.String !== oBlock?.aggregations?.groups[0]?.annotations?.Facet?.annotation?.Label?.String
|
|
4545
|
+
) {
|
|
4546
|
+
// In case Section -> SubSection have more than one form, SmartForm will have it's titles visible
|
|
4547
|
+
// or
|
|
4548
|
+
// SubSectin title !== SmartForm title, SmartForm title will also be visible
|
|
4529
4549
|
return;
|
|
4530
4550
|
}
|
|
4551
|
+
if (oBlock?.aggregations?.groups[0]?.annotations?.Facet?.annotation?.Label?.String !== oBlock?.aggregations?.groups[0]?.targetAnnotation?.Label?.String) {
|
|
4552
|
+
// Compare SmartForm title !== FiledGroup title
|
|
4553
|
+
// if they differs -> use FiledGoup title
|
|
4554
|
+
return oBlock?.aggregations?.groups[0]?.targetAnnotation?.Label?.String;
|
|
4555
|
+
}
|
|
4556
|
+
return;
|
|
4557
|
+
},
|
|
4558
|
+
|
|
4559
|
+
getTitleForHeaderForm: function(oInterface, oFacet, sEntitySetName) {
|
|
4531
4560
|
if (oFacet.Target && oFacet.Target.AnnotationPath && oFacet.Target.AnnotationPath.indexOf("com.sap.vocabularies.UI.v1.DataPoint") > -1) {
|
|
4532
4561
|
// Process DataPoint case
|
|
4533
4562
|
var { sAnnotationPath, oEntityType } = oAnnotationHelper.getModelData(oInterface, oFacet.Target.AnnotationPath, sEntitySetName);
|
|
@@ -950,7 +950,7 @@ sap.ui.define([
|
|
|
950
950
|
* @public
|
|
951
951
|
* @extends sap.ui.core.UIComponent
|
|
952
952
|
* @author SAP SE
|
|
953
|
-
* @version 1.136.
|
|
953
|
+
* @version 1.136.8
|
|
954
954
|
* @name sap.suite.ui.generic.template.lib.AppComponent
|
|
955
955
|
*/
|
|
956
956
|
var oAppComponent = UIComponent.extend("sap.suite.ui.generic.template.lib.AppComponent", {
|
|
@@ -5,8 +5,9 @@ sap.ui.define([
|
|
|
5
5
|
"sap/suite/ui/generic/template/genericUtilities/FeLogger",
|
|
6
6
|
"sap/ui/model/FilterOperator",
|
|
7
7
|
'sap/ui/model/Filter',
|
|
8
|
-
'sap/suite/ui/generic/template/js/AnnotationHelper'
|
|
9
|
-
|
|
8
|
+
'sap/suite/ui/generic/template/js/AnnotationHelper',
|
|
9
|
+
"./EasyFilterDataFetcherHelper"
|
|
10
|
+
], function(BaseObject, extend, filterHelper, FeLogger, FilterOperator,Filter,AnnotationHelper,EasyFilterDataFetcherHelper) {
|
|
10
11
|
'use strict';
|
|
11
12
|
|
|
12
13
|
/*
|
|
@@ -305,24 +306,28 @@ sap.ui.define([
|
|
|
305
306
|
// keySpecificSelectedValues will have one selectedValues object for each operator
|
|
306
307
|
// ex : [{operator: "EQ", selectedValues: ["HT-1010","HT-10001","1097"]}, {operator: "Contains", selectedValues: ["HT-100"]}]
|
|
307
308
|
oFilterItem.keySpecificSelectedValues.forEach(function (oSelectedValues) {
|
|
308
|
-
var oRange = {
|
|
309
|
-
Sign: "I", // currently not considering "E"
|
|
310
|
-
High: ""
|
|
311
|
-
};
|
|
312
|
-
|
|
313
309
|
if ((oSelectedValues.operator === "BT" || oSelectedValues.operator === "NB")) {
|
|
310
|
+
var oRange = {
|
|
311
|
+
Sign: oSelectedValues.operator === "NB" ? "E" : "I",
|
|
312
|
+
High: ""
|
|
313
|
+
};
|
|
314
314
|
oRange.Low = oSelectedValues.selectedValues[0];
|
|
315
315
|
oRange.High = oSelectedValues.selectedValues[1];
|
|
316
|
-
oRange.Option =
|
|
316
|
+
oRange.Option = "BT";
|
|
317
317
|
oFilter.Ranges.push(oRange);
|
|
318
318
|
} else {
|
|
319
|
-
oSelectedValues.selectedValues.forEach(function (
|
|
320
|
-
|
|
319
|
+
oSelectedValues.selectedValues.forEach(function (sValue) {
|
|
320
|
+
var oRange = {
|
|
321
|
+
Sign: EasyFilterDataFetcherHelper.isNegationOperator(oSelectedValues.operator) ? "E" : "I",
|
|
322
|
+
High: ""
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
if (isCPOperator(oSelectedValues.operator)) {
|
|
321
326
|
oRange.Option = "CP";
|
|
322
|
-
oRange.Low =
|
|
327
|
+
oRange.Low = getValueForCPOperator(sValue,oSelectedValues.operator);
|
|
323
328
|
} else {
|
|
324
|
-
oRange.Option = oSelectedValues.operator;
|
|
325
|
-
oRange.Low =
|
|
329
|
+
oRange.Option = EasyFilterDataFetcherHelper.isNegationOperator(oSelectedValues.operator) ? EasyFilterDataFetcherHelper.getReverseOperator(oSelectedValues.operator) : oSelectedValues.operator;
|
|
330
|
+
oRange.Low = sValue;
|
|
326
331
|
}
|
|
327
332
|
oFilter.Ranges.push(oRange);
|
|
328
333
|
});
|
|
@@ -338,6 +343,29 @@ sap.ui.define([
|
|
|
338
343
|
};
|
|
339
344
|
}
|
|
340
345
|
|
|
346
|
+
function getValueForCPOperator(sValue,sOperator) {
|
|
347
|
+
sOperator = EasyFilterDataFetcherHelper.isNegationOperator(sOperator) ? EasyFilterDataFetcherHelper.getReverseOperator(sOperator) : sOperator;
|
|
348
|
+
switch (sOperator) {
|
|
349
|
+
case FilterOperator.Contains:
|
|
350
|
+
sValue = `*${sValue}*`;
|
|
351
|
+
break;
|
|
352
|
+
case FilterOperator.EndsWith:
|
|
353
|
+
sValue = `*${sValue}`;
|
|
354
|
+
break;
|
|
355
|
+
case FilterOperator.StartsWith:
|
|
356
|
+
sValue = `${sValue}*`;
|
|
357
|
+
break;
|
|
358
|
+
default:
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
return sValue;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
function isCPOperator(sOperator) {
|
|
365
|
+
return sOperator === FilterOperator.Contains || sOperator === FilterOperator.EndsWith || sOperator === FilterOperator.NotContains || sOperator === FilterOperator.NotEndsWith
|
|
366
|
+
|| sOperator === FilterOperator.NotStartsWith || sOperator === FilterOperator.StartsWith;
|
|
367
|
+
}
|
|
368
|
+
|
|
341
369
|
/**
|
|
342
370
|
* This method is used to get the EasyFilter control from the floorplan
|
|
343
371
|
* @returns EasyFilter control
|
|
@@ -403,7 +431,6 @@ sap.ui.define([
|
|
|
403
431
|
if (oSmartFilterBarVariant.semanticDates) {
|
|
404
432
|
var { Low: value1, High: value2 } = oVariantDataFromAI.aSelectOptions[0].Ranges[0];
|
|
405
433
|
var dateData = oSmartFilterBarVariant.semanticDates.Dates[0].Data;
|
|
406
|
-
|
|
407
434
|
dateData.operation = "DATERANGE";
|
|
408
435
|
dateData.value1 = value1;
|
|
409
436
|
dateData.value2 = value2 || value1;
|
|
@@ -513,191 +540,10 @@ sap.ui.define([
|
|
|
513
540
|
}
|
|
514
541
|
}
|
|
515
542
|
|
|
516
|
-
function getFiltersForDataFetching(key,keySpecificSelectedResult) {
|
|
517
|
-
const aFilters = [];
|
|
518
|
-
|
|
519
|
-
for (var i = 0; i < keySpecificSelectedResult.length;++i) {
|
|
520
|
-
const result = keySpecificSelectedResult[i];
|
|
521
|
-
if (result.operator === FilterOperator.BT || result.operator === FilterOperator.NB) {
|
|
522
|
-
aFilters.push(new Filter({
|
|
523
|
-
path: key,
|
|
524
|
-
operator: result.operator,
|
|
525
|
-
value1: result.selectedValues[0],
|
|
526
|
-
value2: result.selectedValues[1]
|
|
527
|
-
}));
|
|
528
|
-
} else {
|
|
529
|
-
for (var i = 0;i < result.selectedValues.length;++i) {
|
|
530
|
-
aFilters.push(new Filter({
|
|
531
|
-
path: key,
|
|
532
|
-
operator: result.operator,
|
|
533
|
-
value1: result.selectedValues[i]
|
|
534
|
-
}));
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
return aFilters;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
543
|
function onDataFetcher(key,keySpecificSelectedResult,totalAIResponse) {
|
|
542
|
-
return
|
|
543
|
-
|
|
544
|
-
var aFinalResponse = [];
|
|
545
|
-
var oOwnerFilterControl = oState.oSmartFilterbar;
|
|
546
|
-
var sKey = key;
|
|
547
|
-
var sEntitySet = oController.getOwnerComponent().getEntitySet();
|
|
548
|
-
var oEntityType = oTemplateUtils.oCommonUtils.getMetaModelEntityType(sEntitySet);
|
|
549
|
-
var oSFBModel = oOwnerFilterControl.getModel();
|
|
550
|
-
var oSFBMetaModel = oSFBModel.getMetaModel();
|
|
551
|
-
var aFilters = getFiltersForDataFetching(key,keySpecificSelectedResult);
|
|
552
|
-
var oProperty = oSFBMetaModel.getODataProperty(oEntityType, key);
|
|
553
|
-
var sPropertyPath = oSFBMetaModel.getODataProperty(oEntityType, key,true);
|
|
554
|
-
var isValueHelpTableAvailable = AnnotationHelper.isValueHelpTableAvailable(oProperty);
|
|
555
|
-
|
|
556
|
-
if (isValueHelpTableAvailable) {
|
|
557
|
-
var oPropertyContext = oSFBMetaModel.createBindingContext(sPropertyPath);
|
|
558
|
-
var oVHPromise = oSFBMetaModel.getODataValueLists(oPropertyContext);
|
|
559
|
-
var filtersLength = aFilters.length;
|
|
560
|
-
// //Every Search on a value, create a seperate call to backend,but they are grouped into one batch
|
|
561
|
-
// //We need to ensure that once all calls are completed inside the batch to resolve the promise, else the system would be waiting indefenitely
|
|
562
|
-
var ctr = 0;
|
|
563
|
-
let fnForDescription = (oResponse,aMatchedFilterResults,sTextArrangementPath,sTextArrangement) => {
|
|
564
|
-
++ctr;
|
|
565
|
-
var aResults = oResponse.results;
|
|
566
|
-
|
|
567
|
-
//Check the description is present and follow the textArrangement annotation as well
|
|
568
|
-
//If the value is not present ,make the ID and Description same
|
|
569
|
-
aMatchedFilterResults.forEach((oFilter)=>{
|
|
570
|
-
var result = aResults.find((res)=>res[key] === oFilter.getValue1());
|
|
571
|
-
if (result) {
|
|
572
|
-
aFinalResponse.push({
|
|
573
|
-
operator: FilterOperator.EQ,
|
|
574
|
-
selectedValues: [{
|
|
575
|
-
value: result[key],
|
|
576
|
-
description: AnnotationHelper.getTextArrangementFinalString(result,key,sTextArrangementPath.split("/")[1],sTextArrangement)
|
|
577
|
-
}]
|
|
578
|
-
});
|
|
579
|
-
} else {
|
|
580
|
-
//Ideally description should be present, if in case its not present we will fallback to our default case where value and description would be same
|
|
581
|
-
aFinalResponse.push(getkeySpecifiedResultFromFilters(oFilter));
|
|
582
|
-
}
|
|
583
|
-
});
|
|
584
|
-
|
|
585
|
-
if (ctr === filtersLength) {
|
|
586
|
-
resolve(aFinalResponse);
|
|
587
|
-
}
|
|
588
|
-
};
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
let fnSuccessForValueList = (oResponse,oFilter,sValueListEntity) => {
|
|
593
|
-
var oValueHelpEntity = oTemplateUtils.oCommonUtils.getMetaModelEntityType(sValueListEntity);
|
|
594
|
-
var oValueHelpProperty = oSFBMetaModel.getODataProperty(oValueHelpEntity, key);
|
|
595
|
-
var aResults = oResponse.results;
|
|
596
|
-
var sTextArrangementPath = AnnotationHelper.getTextArrangementPath(oValueHelpProperty);
|
|
597
|
-
var sTextArrangement = AnnotationHelper.getTextArrangement(oValueHelpEntity,oValueHelpProperty) || "idOnly";
|
|
598
|
-
var navigationProperty = null;
|
|
599
|
-
var sEntityForTextDescription = null;
|
|
600
|
-
|
|
601
|
-
if (sTextArrangementPath && sTextArrangementPath.split("/").length > 1) {
|
|
602
|
-
navigationProperty = sTextArrangementPath.split("/")[0];
|
|
603
|
-
sEntityForTextDescription = oSFBMetaModel.getODataAssociationSetEnd(oValueHelpEntity,navigationProperty).entitySet;
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
//We are triggering the below call, only for fetching of the TextDescription.If its a different entity than ValueList only then trigger it
|
|
607
|
-
if (aResults.length === 0) {
|
|
608
|
-
++ctr;
|
|
609
|
-
aFinalResponse.push(getkeySpecifiedResultFromFilters(oFilter));
|
|
610
|
-
} else if (aResults.length !== 0 && sEntityForTextDescription && sValueListEntity !== sEntityForTextDescription) {
|
|
611
|
-
var aAllMatchedResults = aResults.map((result)=>{
|
|
612
|
-
return result[key];
|
|
613
|
-
});
|
|
614
|
-
var aMatchedFilterResults = aAllMatchedResults.map((matchedResult)=>{
|
|
615
|
-
return new Filter({
|
|
616
|
-
path: key,
|
|
617
|
-
operator: FilterOperator.EQ,
|
|
618
|
-
value1:matchedResult
|
|
619
|
-
});
|
|
620
|
-
});
|
|
621
|
-
// The below code only be executed when the textDescription and ValueList entities are different
|
|
622
|
-
oSFBModel.read("/" + sEntityForTextDescription, {
|
|
623
|
-
filters: aMatchedFilterResults,
|
|
624
|
-
success : function(response) {
|
|
625
|
-
fnForDescription(response,aMatchedFilterResults);
|
|
626
|
-
}
|
|
627
|
-
});
|
|
628
|
-
} else {
|
|
629
|
-
//The below condition is when valueList entity and navigation property entity are same
|
|
630
|
-
++ctr;
|
|
631
|
-
aResults.forEach((result)=>{
|
|
632
|
-
aFinalResponse.push({
|
|
633
|
-
operator: FilterOperator.EQ,
|
|
634
|
-
selectedValues: [{
|
|
635
|
-
value: result[key],
|
|
636
|
-
description: AnnotationHelper.getTextArrangementFinalString(result,key,
|
|
637
|
-
sTextArrangementPath,sTextArrangement)
|
|
638
|
-
}]
|
|
639
|
-
});
|
|
640
|
-
});
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
if (ctr === filtersLength) {
|
|
644
|
-
resolve(aFinalResponse);
|
|
645
|
-
}
|
|
646
|
-
};
|
|
647
|
-
|
|
648
|
-
oVHPromise.then((oValueList)=>{
|
|
649
|
-
var oValueListDefaultBinding = oValueList[""];
|
|
650
|
-
var sValueListEntity = oValueListDefaultBinding.CollectionPath.String;
|
|
651
|
-
if (Array.isArray(oValueListDefaultBinding.Parameters)) {
|
|
652
|
-
var oParameter = oValueListDefaultBinding.Parameters.find(oParam => (oParam.RecordType === "com.sap.vocabularies.Common.v1.ValueListParameterInOut" && oParam.LocalDataProperty.PropertyPath === sKey));
|
|
653
|
-
if (oParameter) {
|
|
654
|
-
key = oParameter.ValueListProperty.String;
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
//Get All Records using $search
|
|
658
|
-
aFilters.forEach((oFilter)=>{
|
|
659
|
-
oSFBModel.read("/" + sValueListEntity, {
|
|
660
|
-
urlParameters : {
|
|
661
|
-
search: oFilter.getValue1()
|
|
662
|
-
},
|
|
663
|
-
success : function(response) {
|
|
664
|
-
fnSuccessForValueList(response,oFilter,sValueListEntity);
|
|
665
|
-
}
|
|
666
|
-
});
|
|
667
|
-
});
|
|
668
|
-
});
|
|
669
|
-
|
|
670
|
-
} else {
|
|
671
|
-
//When there is no valueList associate, just return the original value in CodeList type
|
|
672
|
-
aFilters.forEach((oFilter)=>aFinalResponse.push(getkeySpecifiedResultFromFilters(oFilter)));
|
|
673
|
-
resolve(aFinalResponse);
|
|
674
|
-
}
|
|
675
|
-
});
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
function getkeySpecifiedResultFromFilters(oFilter) {
|
|
679
|
-
var values = [];
|
|
680
|
-
if (oFilter.getOperator() === FilterOperator.BT || oFilter.getOperator() === FilterOperator.NB) {
|
|
681
|
-
var values = [{
|
|
682
|
-
value: oFilter.getValue1(),
|
|
683
|
-
description: oFilter.getValue1()
|
|
684
|
-
},{
|
|
685
|
-
value: oFilter.getValue2(),
|
|
686
|
-
description: oFilter.getValue2()
|
|
687
|
-
}];
|
|
688
|
-
} else {
|
|
689
|
-
values.push({
|
|
690
|
-
value: oFilter.getValue1(),
|
|
691
|
-
description: oFilter.getValue1()
|
|
692
|
-
});
|
|
693
|
-
}
|
|
694
|
-
return {
|
|
695
|
-
operator: oFilter.getOperator(),
|
|
696
|
-
selectedValues: values
|
|
697
|
-
};
|
|
544
|
+
return EasyFilterDataFetcherHelper.fetchDataForKey(key, keySpecificSelectedResult, oState, oController, oTemplateUtils);
|
|
698
545
|
}
|
|
699
546
|
|
|
700
|
-
|
|
701
547
|
return {
|
|
702
548
|
getEasyFilterBar : fnGetEasyFilterBar,
|
|
703
549
|
initialiseEasyFilterBar : fnInitialiseEasyFilterBar,
|
|
@@ -711,8 +557,7 @@ sap.ui.define([
|
|
|
711
557
|
onShowValueHelp: fnShowValueHelp,
|
|
712
558
|
onFilterChange : fnOnFilterChange,
|
|
713
559
|
handleVariantLoad : fnHandleVariantLoad,
|
|
714
|
-
onDataFetcher
|
|
715
|
-
getkeySpecifiedResultFromFilters
|
|
560
|
+
onDataFetcher
|
|
716
561
|
};
|
|
717
562
|
}
|
|
718
563
|
|
|
@@ -721,5 +566,5 @@ sap.ui.define([
|
|
|
721
566
|
extend(this, getMethods(oState, oController, oTemplateUtils));
|
|
722
567
|
}
|
|
723
568
|
});
|
|
724
|
-
|
|
569
|
+
|
|
725
570
|
});
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
sap.ui.define([
|
|
2
|
+
'sap/ui/model/FilterOperator',
|
|
3
|
+
'sap/ui/model/Filter',
|
|
4
|
+
'sap/suite/ui/generic/template/js/AnnotationHelper'
|
|
5
|
+
], function(FilterOperator, Filter, AnnotationHelper) {
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const mReverseOperator = {};
|
|
9
|
+
fillReverseOperator();
|
|
10
|
+
|
|
11
|
+
function fillReverseOperator() {
|
|
12
|
+
mReverseOperator[FilterOperator.EQ] = FilterOperator.NE;
|
|
13
|
+
mReverseOperator[FilterOperator.Contains] = FilterOperator.NotContains;
|
|
14
|
+
mReverseOperator[FilterOperator.EndsWith] = FilterOperator.NotEndsWith;
|
|
15
|
+
mReverseOperator[FilterOperator.StartsWith] = FilterOperator.NotStartsWith;
|
|
16
|
+
mReverseOperator[FilterOperator.BT] = FilterOperator.NB;
|
|
17
|
+
|
|
18
|
+
mReverseOperator[FilterOperator.NE] = FilterOperator.EQ;
|
|
19
|
+
mReverseOperator[FilterOperator.NotContains] = FilterOperator.Contains;
|
|
20
|
+
mReverseOperator[FilterOperator.NotEndsWith] = FilterOperator.EndsWith;
|
|
21
|
+
mReverseOperator[FilterOperator.NotStartsWith] = FilterOperator.StartsWith;
|
|
22
|
+
mReverseOperator[FilterOperator.NB] = FilterOperator.BT;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getFiltersForDataFetching(sKey, keySpecificSelectedResult) {
|
|
26
|
+
const aFilters = [];
|
|
27
|
+
|
|
28
|
+
for (let i = 0; i < keySpecificSelectedResult.length; ++i) {
|
|
29
|
+
const result = keySpecificSelectedResult[i];
|
|
30
|
+
if (result.operator === FilterOperator.BT || result.operator === FilterOperator.NB) {
|
|
31
|
+
aFilters.push(new Filter({
|
|
32
|
+
path: sKey,
|
|
33
|
+
operator: result.operator,
|
|
34
|
+
value1: result.selectedValues[0],
|
|
35
|
+
value2: result.selectedValues[1]
|
|
36
|
+
}));
|
|
37
|
+
} else {
|
|
38
|
+
for (let j = 0; j < result.selectedValues.length; ++j) {
|
|
39
|
+
aFilters.push(new Filter({
|
|
40
|
+
path: sKey,
|
|
41
|
+
operator: result.operator,
|
|
42
|
+
value1: result.selectedValues[j]
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return aFilters;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function isComparitveOperator(sFilter) {
|
|
51
|
+
return sFilter === FilterOperator.BT || sFilter === FilterOperator.NB ||
|
|
52
|
+
sFilter === FilterOperator.GT || sFilter === FilterOperator.LT ||
|
|
53
|
+
sFilter === FilterOperator.GE || sFilter === FilterOperator.LE;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function isNegationOperator(sOperator) {
|
|
57
|
+
return sOperator === FilterOperator.NE || sOperator === FilterOperator.NotContains ||
|
|
58
|
+
sOperator === FilterOperator.NotEndsWith || sOperator === FilterOperator.NotStartsWith ||
|
|
59
|
+
sOperator === FilterOperator.NB;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function getkeySpecifiedResultFromFilters(oFilter) {
|
|
63
|
+
let values = [];
|
|
64
|
+
if (oFilter.getOperator() === FilterOperator.BT || oFilter.getOperator() === FilterOperator.NB) {
|
|
65
|
+
values = [{
|
|
66
|
+
value: oFilter.getValue1(),
|
|
67
|
+
description: oFilter.getValue1()
|
|
68
|
+
},{
|
|
69
|
+
value: oFilter.getValue2(),
|
|
70
|
+
description: oFilter.getValue2()
|
|
71
|
+
}];
|
|
72
|
+
} else {
|
|
73
|
+
values.push({
|
|
74
|
+
value: oFilter.getValue1(),
|
|
75
|
+
description: oFilter.getValue1()
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
operator: oFilter.getOperator(),
|
|
80
|
+
selectedValues: values
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function fetchRecordsFromValueList(oValueList, oFilter, sKey, oSFBModel,oTemplateUtils) {
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
let oValueListDefaultBinding = oValueList[""];
|
|
87
|
+
let sValueListEntity = oValueListDefaultBinding.CollectionPath.String;
|
|
88
|
+
|
|
89
|
+
if (Array.isArray(oValueListDefaultBinding.Parameters)) {
|
|
90
|
+
let oParameter = oValueListDefaultBinding.Parameters.find(oParam => (oParam.RecordType === "com.sap.vocabularies.Common.v1.ValueListParameterInOut" && oParam.LocalDataProperty.PropertyPath === sKey));
|
|
91
|
+
if (oParameter) {
|
|
92
|
+
sKey = oParameter.ValueListProperty.String;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
let bIsNotOperator = isNegationOperator(oFilter.getOperator());
|
|
97
|
+
if (bIsNotOperator) {
|
|
98
|
+
oFilter = new Filter({
|
|
99
|
+
path: sKey,
|
|
100
|
+
operator: mReverseOperator[oFilter.getOperator()],
|
|
101
|
+
value1: oFilter.getValue1()
|
|
102
|
+
});
|
|
103
|
+
} else {
|
|
104
|
+
oFilter = new Filter({
|
|
105
|
+
path: sKey,
|
|
106
|
+
operator: oFilter.getOperator(),
|
|
107
|
+
value1: oFilter.getValue1()
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
oSFBModel.read("/" + sValueListEntity, {
|
|
112
|
+
filters: [oFilter],
|
|
113
|
+
success: async function(oResponse) {
|
|
114
|
+
const aResults = oResponse.results;
|
|
115
|
+
let aResponse;
|
|
116
|
+
try {
|
|
117
|
+
if (aResults.length > 0) {
|
|
118
|
+
aResponse = await getDescriptionForResponse(oResponse.results, sValueListEntity, sKey, oSFBModel,oTemplateUtils,oFilter);
|
|
119
|
+
} else {
|
|
120
|
+
aResponse = await fetchRecordsFromValueListUsingFuzzySearch(sValueListEntity, oFilter, sKey, oSFBModel,oTemplateUtils);
|
|
121
|
+
}
|
|
122
|
+
resolve({
|
|
123
|
+
operator: (bIsNotOperator) ? mReverseOperator[oFilter.getOperator()] : oFilter.getOperator(),
|
|
124
|
+
selectedValues: aResponse
|
|
125
|
+
});
|
|
126
|
+
} catch (error) {
|
|
127
|
+
reject(error);
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
error: async function(oError) {
|
|
131
|
+
//If the error is because of some property validation, we can try to do a fuzzy search
|
|
132
|
+
try {
|
|
133
|
+
const aResponse = await fetchRecordsFromValueListUsingFuzzySearch(sValueListEntity, oFilter, sKey, oSFBModel,oTemplateUtils);
|
|
134
|
+
resolve({
|
|
135
|
+
operator: (bIsNotOperator) ? mReverseOperator[oFilter.getOperator()] : oFilter.getOperator(),
|
|
136
|
+
selectedValues: aResponse
|
|
137
|
+
});
|
|
138
|
+
} catch (error) {
|
|
139
|
+
reject(error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async function fetchRecordsFromValueListUsingFuzzySearch(sValueListEntity, oFilter, sKey, oSFBModel,oTemplateUtils) {
|
|
147
|
+
return new Promise((resolve, reject) => {
|
|
148
|
+
oSFBModel.read("/" + sValueListEntity, {
|
|
149
|
+
urlParameters: {
|
|
150
|
+
search: oFilter.getValue1()
|
|
151
|
+
},
|
|
152
|
+
success: async function(oResponse) {
|
|
153
|
+
let aResults = oResponse.results;
|
|
154
|
+
if (aResults.length == 0) {
|
|
155
|
+
//If it dosent have any records, the return the original value
|
|
156
|
+
resolve([{
|
|
157
|
+
value: oFilter.getValue1(),
|
|
158
|
+
description: oFilter.getValue1()
|
|
159
|
+
}]);
|
|
160
|
+
} else {
|
|
161
|
+
try {
|
|
162
|
+
aResults = await getDescriptionForResponse(aResults, sValueListEntity, sKey, oSFBModel,oTemplateUtils,oFilter);
|
|
163
|
+
resolve(aResults);
|
|
164
|
+
} catch (oError) {
|
|
165
|
+
reject(oError);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
error: function(oError) {
|
|
170
|
+
reject(oError);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function performClientSideSearch(aResults, oFilter,sKey,sDescriptionField) {
|
|
177
|
+
if (!sKey || !sDescriptionField) {
|
|
178
|
+
return aResults;
|
|
179
|
+
}
|
|
180
|
+
if (oFilter.getOperator() === FilterOperator.EQ || oFilter.getOperator() === FilterOperator.NE) {
|
|
181
|
+
const aFilteredResults = aResults.filter(result => result[sKey].toString().toLowerCase() === oFilter.getValue1().toString().toLowerCase() || result[sDescriptionField].toString().toLowerCase() === oFilter.getValue1().toString().toLowerCase());
|
|
182
|
+
return aFilteredResults.length > 0 ? aFilteredResults : aResults;
|
|
183
|
+
}
|
|
184
|
+
return aResults;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
async function getDescriptionForResponse(aResults, sValueListEntity, sKey, oSFBModel, oTemplateUtils,oFilter) {
|
|
188
|
+
return new Promise((resolve, reject) => {
|
|
189
|
+
const aResultsWithTextArrangement = [];
|
|
190
|
+
|
|
191
|
+
let oSFBMetaModel = oSFBModel.getMetaModel();
|
|
192
|
+
let oValueHelpEntity = oTemplateUtils.oCommonUtils.getMetaModelEntityType(sValueListEntity);
|
|
193
|
+
let oValueHelpProperty = oSFBMetaModel.getODataProperty(oValueHelpEntity, sKey);
|
|
194
|
+
let sTextArrangementPath = AnnotationHelper.getTextArrangementPath(oValueHelpProperty);
|
|
195
|
+
let sTextArrangement = AnnotationHelper.getTextArrangementForEasyFilter(oValueHelpEntity, oValueHelpProperty);
|
|
196
|
+
let navigationProperty = null;
|
|
197
|
+
let sEntityForTextDescription = sValueListEntity;
|
|
198
|
+
|
|
199
|
+
if (sTextArrangementPath && sTextArrangementPath.split("/").length > 1) {
|
|
200
|
+
navigationProperty = sTextArrangementPath.split("/")[0];
|
|
201
|
+
sEntityForTextDescription = oSFBMetaModel.getODataAssociationSetEnd(oValueHelpEntity, navigationProperty).entitySet;
|
|
202
|
+
sTextArrangementPath = sTextArrangementPath.split("/")[1];
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
aResults = performClientSideSearch(aResults, oFilter,sKey,sTextArrangementPath);
|
|
206
|
+
|
|
207
|
+
if (sValueListEntity === sEntityForTextDescription) {
|
|
208
|
+
aResults.forEach((result) => {
|
|
209
|
+
aResultsWithTextArrangement.push({
|
|
210
|
+
value: result[sKey],
|
|
211
|
+
description: AnnotationHelper.getTextArrangementFinalString(result, sKey, sTextArrangementPath, sTextArrangement)
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
resolve(aResultsWithTextArrangement);
|
|
215
|
+
} else {
|
|
216
|
+
let aAllMatchedResults = aResults.map((result) => {
|
|
217
|
+
return result[sKey];
|
|
218
|
+
});
|
|
219
|
+
let aMatchedFilterResults = aAllMatchedResults.map((matchedResult) => {
|
|
220
|
+
return new Filter({
|
|
221
|
+
path: sKey,
|
|
222
|
+
operator: FilterOperator.EQ,
|
|
223
|
+
value1: matchedResult
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// The below code only be executed when the textDescription and ValueList entities are different
|
|
228
|
+
oSFBModel.read("/" + sEntityForTextDescription, {
|
|
229
|
+
filters: aMatchedFilterResults,
|
|
230
|
+
success: function(oResponse) {
|
|
231
|
+
let aResults = oResponse.results;
|
|
232
|
+
|
|
233
|
+
aMatchedFilterResults.forEach((oFilter) => {
|
|
234
|
+
let result = aResults.find((res) => res[sKey] === oFilter.getValue1());
|
|
235
|
+
aResultsWithTextArrangement.push({
|
|
236
|
+
value: oFilter.getValue1(),
|
|
237
|
+
description: (result) ? AnnotationHelper.getTextArrangementFinalString(result, sKey, sTextArrangementPath, sTextArrangement) : oFilter.getValue1()
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
resolve(aResultsWithTextArrangement);
|
|
241
|
+
},
|
|
242
|
+
error: function(oError) {
|
|
243
|
+
reject(oError);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* The primary responsibility of this function is to convert the given values into their corresponding
|
|
252
|
+
* IDs and Descriptions, respecting the defined TextArrangement.
|
|
253
|
+
*
|
|
254
|
+
* This process is carried out in two phases:
|
|
255
|
+
*
|
|
256
|
+
* Fetching the ID:
|
|
257
|
+
* 1) Make a $filter call using the provided value and operator.
|
|
258
|
+
* - If this returns results, we proceed to fetch the corresponding descriptions for these IDs.
|
|
259
|
+
* 2) If no results are returned, make a $search (fuzzy search) call instead.
|
|
260
|
+
*
|
|
261
|
+
* Fetching the Description:
|
|
262
|
+
* 1) The description is determined by the sap:text/com.sap.vocabularies.UI.v1.TextArrangement
|
|
263
|
+
* annotation of the ValueHelp entity, not from the main entity.
|
|
264
|
+
* 2) To fetch the description, we use a $filter call, since the IDs were already retrieved in the first step.
|
|
265
|
+
*
|
|
266
|
+
* Edge cases with negation operators:
|
|
267
|
+
* 1) For negation operators such as NB, NotStartsWith, etc., we make a batch call using the
|
|
268
|
+
* positive equivalent of these operators (e.g., BT, StartsWith).
|
|
269
|
+
* 2) After receiving the results, we return them with the original negation operator
|
|
270
|
+
* (e.g., NB, NotStartsWith).
|
|
271
|
+
*/
|
|
272
|
+
|
|
273
|
+
function fetchDataForKey(sKey, keySpecificSelectedResult, oState, oController, oTemplateUtils) {
|
|
274
|
+
return new Promise(async(resolve, reject) => {
|
|
275
|
+
try {
|
|
276
|
+
const aFinalResponse = [];
|
|
277
|
+
const oOwnerFilterControl = oState.oSmartFilterbar;
|
|
278
|
+
const sEntitySet = oController.getOwnerComponent().getEntitySet();
|
|
279
|
+
const oEntityType = oTemplateUtils.oCommonUtils.getMetaModelEntityType(sEntitySet);
|
|
280
|
+
const oSFBModel = oOwnerFilterControl.getModel();
|
|
281
|
+
const oSFBMetaModel = oSFBModel.getMetaModel();
|
|
282
|
+
const aFilters = getFiltersForDataFetching(sKey, keySpecificSelectedResult);
|
|
283
|
+
const oProperty = oSFBMetaModel.getODataProperty(oEntityType, sKey);
|
|
284
|
+
const sPropertyPath = oSFBMetaModel.getODataProperty(oEntityType, sKey, true);
|
|
285
|
+
const isValueHelpTableAvailable = AnnotationHelper.isValueHelpTableAvailable(oProperty);
|
|
286
|
+
|
|
287
|
+
if (!isValueHelpTableAvailable) {
|
|
288
|
+
// When there is no valueList associate, just return the original value in CodeList type
|
|
289
|
+
aFilters.forEach(oFilter => aFinalResponse.push(getkeySpecifiedResultFromFilters(oFilter)));
|
|
290
|
+
resolve(aFinalResponse);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Get value help lists from metadata
|
|
294
|
+
const oPropertyContext = oSFBMetaModel.createBindingContext(sPropertyPath);
|
|
295
|
+
const oValueList = await oSFBMetaModel.getODataValueLists(oPropertyContext);
|
|
296
|
+
|
|
297
|
+
// Process each filter in parallel
|
|
298
|
+
const pPromises = [];
|
|
299
|
+
|
|
300
|
+
for (const oFilter of aFilters) {
|
|
301
|
+
if (isComparitveOperator(oFilter.getOperator())) {
|
|
302
|
+
// For comparative operators, just add the original values
|
|
303
|
+
aFinalResponse.push(getkeySpecifiedResultFromFilters(oFilter));
|
|
304
|
+
} else {
|
|
305
|
+
// For other operators, fetch records from value list
|
|
306
|
+
pPromises.push(fetchRecordsFromValueList(oValueList, oFilter, sKey, oSFBModel, oTemplateUtils));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Wait for all promises to resolve
|
|
311
|
+
if (pPromises.length > 0) {
|
|
312
|
+
const aResponses = await Promise.all(pPromises);
|
|
313
|
+
aResponses.forEach(aResponse => {
|
|
314
|
+
aFinalResponse.push(aResponse);
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
resolve(aFinalResponse);
|
|
319
|
+
} catch (error) {
|
|
320
|
+
reject(error); // Re-throw to allow caller to handle
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return {
|
|
326
|
+
fetchDataForKey: fetchDataForKey,
|
|
327
|
+
getFiltersForDataFetching: getFiltersForDataFetching,
|
|
328
|
+
isComparitveOperator: isComparitveOperator,
|
|
329
|
+
isNegationOperator: isNegationOperator,
|
|
330
|
+
getReverseOperator: function(operator) {
|
|
331
|
+
return mReverseOperator[operator];
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
});
|
|
@@ -271,7 +271,7 @@ NOITEMS_SMARTCHART=Tidak ditemukan data.
|
|
|
271
271
|
|
|
272
272
|
NOITEMS_LR_SMARTCHART=Tidak ada data untuk tampilan bagan dan kriteria filter yang dipilih.
|
|
273
273
|
|
|
274
|
-
NOITEMS_SMARTCHART_WITH_FILTER=Data
|
|
274
|
+
NOITEMS_SMARTCHART_WITH_FILTER=Data tidak ditemukan. Coba sesuaikan parameter filter.
|
|
275
275
|
|
|
276
276
|
SMARTCHART_INITIAL_NODATA=Untuk memulai, tetapkan filter yang relevan, pilih "Masuk".
|
|
277
277
|
|
|
@@ -424,9 +424,9 @@ RTA_DEFAULT_FILTER_MODE=Mode Filter Default
|
|
|
424
424
|
|
|
425
425
|
RTA_DEFAULT_FILTER_MODE_DESC=Mode Filter Default
|
|
426
426
|
|
|
427
|
-
RTA_SELECTION_MODE=Mode
|
|
427
|
+
RTA_SELECTION_MODE=Mode Pemilihan
|
|
428
428
|
|
|
429
|
-
RTA_SELECTION_MODE_DESC=Tentukan mode
|
|
429
|
+
RTA_SELECTION_MODE_DESC=Tentukan mode pemilihan
|
|
430
430
|
|
|
431
431
|
RTA_OP_EDITABLE_HEADER_CONTENT=Konten Header yang Dapat Diedit
|
|
432
432
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
ST_GENERIC_DRAFT_WITH_ACTIVE_DOCUMENT_DELETED=\uBCC0\uACBD
|
|
2
|
+
ST_GENERIC_DRAFT_WITH_ACTIVE_DOCUMENT_DELETED=\uBCC0\uACBD\uC0AC\uD56D\uC774 \uBB34\uC2DC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
|
|
3
3
|
|
|
4
4
|
ST_GENERIC_DRAFT_WITHOUT_ACTIVE_DOCUMENT_DELETED=\uB4DC\uB798\uD504\uD2B8\uAC00 \uBB34\uC2DC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
|
|
5
5
|
|
|
@@ -244,7 +244,7 @@ ST_GENERIC_DELETE_SELECTED=Eliminar este objeto?
|
|
|
244
244
|
|
|
245
245
|
DELETE_WITH_OBJECTINFO=Eliminar este objeto ({1} {2})?
|
|
246
246
|
|
|
247
|
-
DELETE_WITH_OBJECTTITLE=
|
|
247
|
+
DELETE_WITH_OBJECTTITLE=Excluir objeto {0}?
|
|
248
248
|
|
|
249
249
|
ST_GENERIC_OBJECT_DELETED=O objeto foi exclu\u00EDdo.
|
|
250
250
|
|
|
@@ -3216,7 +3216,7 @@ sap.ui.define(["sap/ui/base/Object",
|
|
|
3216
3216
|
* @param {sap.suite.ui.generic.template.lib.AppComponent} oAppComponent The AppComponent instance
|
|
3217
3217
|
* @public
|
|
3218
3218
|
* @extends sap.ui.base.Object
|
|
3219
|
-
* @version 1.136.
|
|
3219
|
+
* @version 1.136.8
|
|
3220
3220
|
* @since 1.30.0
|
|
3221
3221
|
* @alias sap.suite.ui.generic.template.lib.NavigationController
|
|
3222
3222
|
*/
|
|
@@ -580,7 +580,7 @@ sap.ui.define([
|
|
|
580
580
|
const getFieldProps = function (sField) {
|
|
581
581
|
return {
|
|
582
582
|
"sProperty": sField,
|
|
583
|
-
"sLabel": mPropertyByFieldName[sField]["sap:label"],
|
|
583
|
+
"sLabel": (mPropertyByFieldName[sField]["com.sap.vocabularies.Common.v1.Label"] || "").String || mPropertyByFieldName[sField]["sap:label"] || "",
|
|
584
584
|
"sValue": oItemContext.getProperty(sField),
|
|
585
585
|
"bHidden": !aVisibleColumns.has(sField)
|
|
586
586
|
};
|