@sapui5/sap.suite.ui.generic.template 1.129.0 → 1.130.1

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 (100) hide show
  1. package/package.json +4 -3
  2. package/src/sap/suite/ui/generic/template/.library +5 -1
  3. package/src/sap/suite/ui/generic/template/AnalyticalListPage/Component.js +1 -1
  4. package/src/sap/suite/ui/generic/template/AnalyticalListPage/controller/VisualFilterDialogController.js +1 -1
  5. package/src/sap/suite/ui/generic/template/AnalyticalListPage/manifest.json +1 -1
  6. package/src/sap/suite/ui/generic/template/Canvas/manifest.json +1 -1
  7. package/src/sap/suite/ui/generic/template/ListReport/Component.js +1 -1
  8. package/src/sap/suite/ui/generic/template/ListReport/controller/ControllerImplementation.js +22 -11
  9. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_bg.properties +3 -3
  10. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_hu.properties +1 -1
  11. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_th.properties +1 -1
  12. package/src/sap/suite/ui/generic/template/ListReport/manifest.json +5 -2
  13. package/src/sap/suite/ui/generic/template/ListReport/view/fragments/DefaultVariant.fragment.xml +7 -8
  14. package/src/sap/suite/ui/generic/template/ListReport/view/fragments/MultipleViewsSingleTableMode.fragment.xml +4 -1
  15. package/src/sap/suite/ui/generic/template/ObjectPage/Component.js +1 -1
  16. package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
  17. package/src/sap/suite/ui/generic/template/ObjectPage/templateSpecificPreparationHelper.js +90 -42
  18. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/MultipleViewsSingleTableMode.fragment.xml +3 -0
  19. package/src/sap/suite/ui/generic/template/QuickCreate/manifest.json +1 -1
  20. package/src/sap/suite/ui/generic/template/QuickView/manifest.json +1 -1
  21. package/src/sap/suite/ui/generic/template/designtime/controls/SmartTable.designtime.js +379 -0
  22. package/src/sap/suite/ui/generic/template/designtime/{AnalyticalListPage.designtime.js → floorplans/AnalyticalListPage.designtime.js} +3 -3
  23. package/src/sap/suite/ui/generic/template/designtime/{ListReport.designtime.js → floorplans/ListReport.designtime.js} +3 -3
  24. package/src/sap/suite/ui/generic/template/designtime/{ObjectPage.designtime.js → floorplans/ObjectPage.designtime.js} +4 -5
  25. package/src/sap/suite/ui/generic/template/designtime/utils/designtimeHelper.js +119 -96
  26. package/src/sap/suite/ui/generic/template/designtime/utils/designtimeUtils.js +395 -0
  27. package/src/sap/suite/ui/generic/template/fragments/EasyFilter.fragment.xml +12 -17
  28. package/src/sap/suite/ui/generic/template/fragments/MessagePage.controller.js +16 -0
  29. package/src/sap/suite/ui/generic/template/fragments/MessagePopover.fragment.xml +16 -2
  30. package/src/sap/suite/ui/generic/template/fragments/SmartFormDataField.fragment.xml +2 -0
  31. package/src/sap/suite/ui/generic/template/genericUtilities/Link.js +9 -2
  32. package/src/sap/suite/ui/generic/template/js/AnnotationHelper.js +8 -4
  33. package/src/sap/suite/ui/generic/template/lib/AppComponent.js +10 -3
  34. package/src/sap/suite/ui/generic/template/lib/CommonEventHandlers.js +0 -42
  35. package/src/sap/suite/ui/generic/template/lib/CommonUtils.js +6 -1
  36. package/src/sap/suite/ui/generic/template/lib/MessageButtonHelper.js +11 -7
  37. package/src/sap/suite/ui/generic/template/lib/RetryAfterHandler.js +249 -0
  38. package/src/sap/suite/ui/generic/template/lib/ShareUtils.js +1 -1
  39. package/src/sap/suite/ui/generic/template/lib/SideEffectUtil.js +64 -3
  40. package/src/sap/suite/ui/generic/template/lib/StableIdDefinition.js +7 -0
  41. package/src/sap/suite/ui/generic/template/lib/ai/EasyFilterBarHandler.js +210 -74
  42. package/src/sap/suite/ui/generic/template/lib/ai/ErrorExplanationHelper.js +47 -0
  43. package/src/sap/suite/ui/generic/template/lib/ai/FioriAIHandler.js +10 -3
  44. package/src/sap/suite/ui/generic/template/lib/i18n/i18n.properties +31 -0
  45. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ar.properties +2 -0
  46. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_bg.properties +2 -0
  47. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ca.properties +2 -0
  48. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cnr.properties +2 -0
  49. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cs.properties +2 -0
  50. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cy.properties +2 -0
  51. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_da.properties +2 -0
  52. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_de.properties +3 -1
  53. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_el.properties +2 -0
  54. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en.properties +2 -0
  55. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_GB.properties +2 -0
  56. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_saprigi.properties +1 -0
  57. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es.properties +4 -2
  58. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es_MX.properties +2 -0
  59. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_et.properties +2 -0
  60. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fi.properties +2 -0
  61. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr.properties +2 -0
  62. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr_CA.properties +2 -0
  63. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hi.properties +2 -0
  64. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hr.properties +3 -1
  65. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hu.properties +2 -0
  66. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_id.properties +2 -0
  67. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_it.properties +2 -0
  68. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_iw.properties +2 -0
  69. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ja.properties +2 -0
  70. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_kk.properties +2 -0
  71. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ko.properties +2 -0
  72. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lt.properties +2 -0
  73. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lv.properties +2 -0
  74. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_mk.properties +2 -0
  75. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ms.properties +2 -0
  76. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_nl.properties +2 -0
  77. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_no.properties +2 -0
  78. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pl.properties +2 -0
  79. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt.properties +2 -0
  80. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt_PT.properties +2 -0
  81. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ro.properties +2 -0
  82. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ru.properties +2 -0
  83. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sh.properties +2 -0
  84. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sk.properties +2 -0
  85. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sl.properties +2 -0
  86. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sr.properties +2 -0
  87. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sv.properties +2 -0
  88. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_th.properties +2 -0
  89. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_tr.properties +2 -0
  90. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_uk.properties +2 -0
  91. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_vi.properties +2 -0
  92. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_CN.properties +2 -0
  93. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_TW.properties +2 -0
  94. package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +5 -3
  95. package/src/sap/suite/ui/generic/template/library.js +3 -1
  96. package/src/sap/suite/ui/generic/template/listTemplates/fragments/MultipleViewsSingleTableMode.fragment.xml +6 -2
  97. package/src/sap/suite/ui/generic/template/manifestMerger/ChangePageConfiguration.js +28 -23
  98. package/src/sap/suite/ui/generic/template/manifestMerger/MergerUtil.js +6 -6
  99. package/src/sap/suite/ui/generic/template/themes/base/base.less +0 -4
  100. package/ui5.yaml +1 -0
@@ -2,20 +2,26 @@ sap.ui.define([
2
2
  "sap/ui/base/Object",
3
3
  "sap/base/util/extend",
4
4
  "sap/suite/ui/generic/template/lib/filterHelper",
5
- "sap/ui/core/library"
6
- ], function(BaseObject, extend, filterHelper, SapCoreLibrary) {
5
+ "sap/suite/ui/generic/template/genericUtilities/FeLogger"
6
+ ], function(BaseObject, extend, filterHelper, FeLogger) {
7
7
  'use strict';
8
8
 
9
9
  /*
10
10
  * This is a handler class for EasyFilterBar.
11
- * It gets initialized when the Fiori AI is enabled and provides the EasyFilterBar capabilities to the floorplan.
11
+ * It gets initialized when the Fiori AI filtering intent is enabled
12
+ * Preparation of the easy filter metadata is done from the smart filter bar metadata
13
+ * Event handlers for the easy filter bar are also defined here
12
14
  *
13
15
  */
14
16
  var oEasyFilterMetadata;
17
+ var oLogger = new FeLogger("lib.ai.EasyFilterBarHandler").getLogger();
15
18
 
16
19
  function getMethods(oState, oController, oTemplateUtils) {
17
- var ValueState = SapCoreLibrary.ValueState;
18
20
  var mCodeList = {};
21
+ // used for busyHandling between query triggered and query resolved.
22
+ var oQueryPromise, oQueryPromiseResolve;
23
+ var fnValueHelpPromiseResolve;
24
+ // fnValueHelpPromiseReject;
19
25
 
20
26
  /**
21
27
  * This method prepares the metadata calculation after the smart filter bar is initialized
@@ -55,6 +61,7 @@ sap.ui.define([
55
61
  var oSFBMetaModel = oSFBModel.getMetaModel();
56
62
  var oEditStateFilterItem;
57
63
  var sEntitySet = oController.getOwnerComponent().getEntitySet();
64
+ var sTokenType = "ValueHelp"; // Other values are "Calendar" | "Time" | "MenuWithCheckBox"
58
65
 
59
66
  var mFilterProperties = {}; // todo : Add the properties from navigation entites
60
67
  var oEntityType = oTemplateUtils.oCommonUtils.getMetaModelEntityType(sEntitySet);
@@ -63,6 +70,7 @@ sap.ui.define([
63
70
  var bIsCodeListRequired = "";
64
71
  oProperty.extensions && oProperty.extensions.forEach(function(oExtension) {
65
72
  if (oExtension.name === "value-list" && oExtension.value === "fixed-values") {
73
+ sTokenType = "MenuWithCheckBox";
66
74
  bIsCodeListRequired = true;
67
75
  }
68
76
  });
@@ -72,8 +80,9 @@ sap.ui.define([
72
80
  dataType: oProperty.type,
73
81
  filterable: true,
74
82
  sortable: false,
75
- codeList : bIsCodeListRequired
76
- //,required: oProperty.required (TO-DO)
83
+ codeList : bIsCodeListRequired,
84
+ type: sTokenType,
85
+ required: oProperty["sap:required-in-filter"] ? true : false
77
86
  };
78
87
  }
79
88
  });
@@ -118,6 +127,7 @@ sap.ui.define([
118
127
  if (oTemplateUtils.oComponentUtils.isDraftEnabled()) {
119
128
  var oEditStateControl = oController.byId("editStateFilter");
120
129
  if (oEditStateControl) {
130
+ sTokenType = "MenuWithCheckBox";
121
131
  var oEditingStatusCodeList = oEditStateControl.getItems().map(function(oItem) {
122
132
  return {
123
133
  value : oItem.getKey(),
@@ -131,6 +141,7 @@ sap.ui.define([
131
141
  filterable: true,
132
142
  required: false,
133
143
  sortable: false,
144
+ type: sTokenType,
134
145
  codeList : oEditingStatusCodeList
135
146
  };
136
147
  oEasyFilterMetadata.fields.push(oEditStateFilterMetadata);
@@ -142,51 +153,6 @@ sap.ui.define([
142
153
  });
143
154
  }
144
155
 
145
- /**
146
- * This method is used to trigger the EasyFilter search of the fiori AI reuse library
147
- * @param {*} oEasyFilterControl EasyFilter control of the floorplan
148
- * @returns Promise which resolves to AI filters
149
- */
150
- function fnTriggerEasyFilterQuery(oEasyFilterControl) {
151
-
152
- var sEasyFilterQuery = oEasyFilterControl.getValue();
153
- if (sEasyFilterQuery.length === 0) {
154
- // Resolving with an empty array will reset the SFB filters and trigger a fresh GET call
155
- return Promise.resolve([]);
156
- } else {
157
- var oEasyFilterMetadataPromise = fnGetEasyFilterSearchMetadata();
158
- var oResultPromise = new Promise(function(fnResolve, fnReject) {
159
- oEasyFilterMetadataPromise.then(function(oEasyFilterMetadata) {
160
- var oFioriAIFilterQueryPromise = oTemplateUtils.oServices.oFioriAIHandler.fioriaiLib.EasyFilter.easyFilter(sEasyFilterQuery, oEasyFilterMetadata);
161
- oFioriAIFilterQueryPromise.then(function(oResponse) {
162
- if (oResponse.success) {
163
- if (oResponse.data.version === 1) {
164
- // In cases where user filters with some random string and the no valuable filter is availabel then simply reject
165
- if (oResponse.data.unclear || !oResponse.data.filter) {
166
- var sUnclearInputMessage = oResponse.data.unclear ? "Unclear input: " + oResponse.data.unclear : "Unclear input";
167
- oEasyFilterControl.setValueStateText(sUnclearInputMessage);
168
- oEasyFilterControl.setValueState(ValueState.Warning);
169
- fnReject(oResponse);
170
- } else if (oResponse.data.filter) {
171
- // Commenting out for v4 parity
172
- //oEasyFilterControl.setValueState(ValueState.Success);
173
- fnResolve(oResponse.data.filter);
174
- }
175
- } else if (oResponse.data.version === 2) {
176
- // to-do for version 2
177
- }
178
- } else {
179
- oEasyFilterControl.setValueStateText(oResponse.message);
180
- oEasyFilterControl.setValueState(ValueState.Warning);
181
- fnReject(oResponse);
182
- }
183
- },fnReject);
184
- });
185
- });
186
- return oResultPromise;
187
- }
188
- }
189
-
190
156
  /**
191
157
  * This method reads the values of the valuehelp entity from the backend and fills the code list of each property.
192
158
  * Once the values are filled then the fioriAI uses it for getting the ID of the user entered description in the search field
@@ -251,7 +217,7 @@ sap.ui.define([
251
217
  * This method is used to convert the AI filters to the selectOptions for the SmartFilterBar
252
218
  * It also identifies the values of edit state filter in case of draft
253
219
  * @param {*} oAIFilters
254
- * @returns array of selectOptions
220
+ * @returns map which contains selectOptions and editStateFilter
255
221
  */
256
222
  function fnGetSFBVariantData(oAIFilters) {
257
223
 
@@ -265,9 +231,14 @@ sap.ui.define([
265
231
  // ------- Converted to selectOptions [ {Property = P1, Ranges = [ a, b ] } ] .
266
232
  // ------- FE filters as "a or b".
267
233
  // Case 1.b : AI Query "Show P1 between a and b"
268
- // ------- AI response " [P1 = Ranges [a] , P1 = Ranges [b]]".
269
- // ------- Converted to selectOptions [ {Property = P1, Ranges = [ a ] } , {Property = P2, Ranges = [ b ] } ] .
270
- // ------- FE filters as "a and b" but (todo) currently it is "a or b".
234
+ // ------- AI response
235
+ // ------------ a. " [P1 = Ranges [a] GE, P1 = Ranges [b]] LT ".
236
+ // ------------ Converted to selectOptions [ {Property = P1, Ranges = [ a ] } , {Property = P2, Ranges = [ b ] } ] .
237
+ // ------------ FE filters as "a or b" and this is wrong AI should respond with operator BT/NB like below.
238
+
239
+ // ------------ b. " P1 = Ranges[a,b] OP = BT/ NB ".
240
+ // ------------ Converted to selectOptions [ {Property = P1, Ranges = [ a,b ], OP = BT/NB } ] .
241
+ // ------------ FE filters as "Greater than a and less than b" or "Not between a and b".
271
242
  // Case 2 : AI Query "Show P1 = a and P2 = b"
272
243
  // ------- AI response "[P1 = Ranges [a] , P2 = Ranges [b]]"
273
244
  // ------- Convert to selectOptions [ {Property = P1, Ranges = [ a ] } , {Property = P2, Ranges = [ b ] } ].
@@ -277,28 +248,39 @@ sap.ui.define([
277
248
  var oEditStateFilter = 0;
278
249
  oAIFilters.forEach(function(oFilterItem) {
279
250
 
280
- if ( oFilterItem.name === "EditState") {
281
- oEditStateFilter = oFilterItem.values[0]; // Edit state generally should not have more than one filter value
251
+ if ( oFilterItem.key === "EditState") {
252
+ oEditStateFilter = oFilterItem.keySpecificSelectedValues[0].selectedValues[0]; // Edit state generally should not have more than one filter value
282
253
  } else {
283
254
  var oFilter = {
284
- PropertyName : oFilterItem.name,
255
+ PropertyName : oFilterItem.key,
285
256
  Ranges : []
286
257
  };
287
- oFilterItem.values.forEach(function (oValue) {
288
- var oRange = {
289
- Sign : "I", // currently not considering "E"
290
- High : "" // Usually for "BT" High is required, but AI provides two separate filters (LT and GT) and FE converts it to two separate selectOptions
291
- // But this results in OR condition
292
- // todo : check if AI can provide BT filter or FE should handle it
293
- };
294
- if (oFilterItem.operator === "Contains") { // need to check for other operators if special handling is required
295
- oRange.Option = "CP";
296
- } else {
297
- oRange.Option = oFilterItem.operator;
298
- }
299
- oRange.Low = oValue;
300
- oFilter.Ranges.push(oRange);
258
+ // keySpecificSelectedValues will have one selectedValues object for each operator
259
+ // ex : [{operator: "EQ", selectedValues: ["HT-1010","HT-10001","1097"]}, {operator: "Contains", selectedValues: ["HT-100"]}]
260
+ oFilterItem.keySpecificSelectedValues.forEach(function(oSelectedValues) {
261
+ oSelectedValues.selectedValues.forEach(function (oValue) {
262
+ var oRange = {
263
+ Sign : "I", // currently not considering "E"
264
+ High : ""
265
+ };
266
+ if (oSelectedValues.operator === "Contains") { // need to check for other operators if special handling is required
267
+ oRange.Option = "CP";
268
+ oRange.Low = oValue;
269
+ } else if (oSelectedValues.operator === "BT" || oSelectedValues.operator === "NB") {
270
+ // For "BT" and "NB" High is required
271
+ // AI reuse responds with array of values for BT and BN (between and not between)
272
+ // But in few cases it can also respond with two separate filters (LT and GT)
273
+ // FE DOES NOT do the auto merging and results in two separate selectOptions (results in OR condition)
274
+ oRange.Low = oValue[0];
275
+ oRange.High = oValue[1];
276
+ } else {
277
+ oRange.Option = oSelectedValues.operator;
278
+ oRange.Low = oValue;
279
+ }
280
+ oFilter.Ranges.push(oRange);
281
+ });
301
282
  });
283
+ // one oFilter will have multiple ranges if multiple filters are selected for the same property
302
284
  aSelectOptions.push(oFilter);
303
285
  }
304
286
  });
@@ -307,10 +289,164 @@ sap.ui.define([
307
289
  oEditStateFilter : oEditStateFilter
308
290
  };
309
291
  }
292
+
293
+ /**
294
+ * This method is used to get the EasyFilter control from the floorplan
295
+ * @returns EasyFilter control
296
+ */
297
+ function fnGetEasyFilterBar() {
298
+ return oController.byId("template::easyFilterContainer");
299
+ }
300
+
301
+ /**
302
+ * This method is used to initialise the EasyFilter control with the metadata from the smart filter bar
303
+ */
304
+ function fnInitialiseEasyFilterBar() {
305
+ var oEasyFilter = fnGetEasyFilterBar();
306
+ var oEasyFilterMetadataPromise = fnGetEasyFilterSearchMetadata();
307
+ var sEntitySet = oController.getOwnerComponent().getEntitySet();
308
+ oEasyFilterMetadataPromise.then((oEasyFilterMetadata) => {
309
+ oEasyFilter.setContextPath(sEntitySet);
310
+ oEasyFilter.setAppId(oController.getOwnerComponent().getAppComponent().getManifestEntry("sap.app")).id;
311
+ oEasyFilter.setFilterBarMetadata(oEasyFilterMetadata.fields);
312
+ oEasyFilter.easyfilter = oTemplateUtils.oServices.oFioriAIHandler.fioriaiLib.EasyFilter;
313
+ });
314
+ }
315
+
316
+ function fnExecuteSearch(oEvent) {
317
+ var oSmartFilterbar = oState.oSmartFilterbar;
318
+ oSmartFilterbar.search();
319
+ }
320
+
321
+ function fnClearFilters(oEvent) {
322
+ var oSmartFilterbar = oState.oSmartFilterbar;
323
+ oSmartFilterbar.search();
324
+ // Do not clear the SFB as this is applicable only for the EasyFilter
325
+ //oSmartFilterbar.clear();
326
+ }
327
+
328
+ function fnAfterQueryProcessing(oEvent) {
329
+ oQueryPromiseResolve();
330
+ }
331
+
332
+ function fnBeforeQueryProcessing(oEvent) {
333
+ oQueryPromise = new Promise(function(resolve) {
334
+ oQueryPromiseResolve = resolve;
335
+ });
336
+ oTemplateUtils.oComponentUtils.getBusyHelper().setBusy(oQueryPromise);
337
+ }
338
+
339
+ function fnTokensChanged(oEvent) {
340
+ var oSmartFilterbar = oState.oSmartFilterbar;
341
+ var oFiltersFromAI = oEvent.getParameter("tokens");
342
+ var sSmartFilterBarId = oSmartFilterbar.getId();
343
+ var oSmartFilterBarWrapper = oTemplateUtils.oCommonUtils.getControlStateWrapperById(sSmartFilterBarId, "SmartFilterBar");
344
+ var oSmartFilterBarVariant = oSmartFilterBarWrapper.getState();
345
+ var oVariantDataFromAI = fnGetSFBVariantData(oFiltersFromAI);
346
+
347
+ // restore the custom filters to the initial state for now
348
+ // To check if other objects in oSmartFilterBarVariant needs to be modified
349
+ var aAppExtension = Object.keys(oSmartFilterBarVariant.customFilters.appExtension);
350
+ if ( aAppExtension.length > 0 ) {
351
+ aAppExtension.forEach(function(sKey) {
352
+ oSmartFilterBarVariant.customFilters.appExtension[sKey] = "";
353
+ });
354
+ }
355
+ oSmartFilterBarVariant.selectOptions = oVariantDataFromAI.aSelectOptions;
356
+ if (oTemplateUtils.oComponentUtils.isDraftEnabled()) {
357
+ oSmartFilterBarVariant.customFilters.editState = oVariantDataFromAI.oEditStateFilter;
358
+ }
359
+
360
+ oSmartFilterBarWrapper.setState(oSmartFilterBarVariant);
361
+ oSmartFilterbar.getSmartVariant() && oSmartFilterbar.getSmartVariant().currentVariantSetModified(true);
362
+ oSmartFilterbar.search();
363
+ }
364
+
365
+ /**
366
+ * Event handler for the EasyFilter control's showValueHelp event.
367
+ * Identifies the input field for which the value help is requested and triggers the value help opening from SFB.
368
+ * @param {*} oEvent
369
+ * @param {*} oState
370
+ */
371
+ function fnShowValueHelp(oEvent) {
372
+ var oSmartFilterbar = oState.oSmartFilterbar;
373
+ fnValueHelpPromiseResolve = oEvent.getParameter("resolve");
374
+ oSmartFilterbar.associateValueLists();
375
+ var oInputField = oSmartFilterbar.getAllFilterItems().find(function(oFilterItem) {
376
+ if (oFilterItem.getName() === oEvent.getParameter("key")) {
377
+ return oFilterItem;
378
+ }
379
+ });
380
+ try {
381
+ oInputField.getControl().fireValueHelpRequest();
382
+ } catch (error) {
383
+ oLogger.error("Value help cannot be triggered for the field " + oEvent.getParameter("key"));
384
+ }
385
+ }
386
+
387
+ function fnQueryChanged() {
388
+ // todo : check if any action is required
389
+ }
390
+ // function fnUpdateEasyFilterBarTokens() {
391
+ // // todo : update the easy filter bar tokens with new values from the SFB VHD
392
+ // }
393
+ function fnOnFilterChange(oEvent) {
394
+ // afterFilterDataUpdate
395
+ var mChangeParameters = oEvent.getParameters("mParameters");
396
+ var aEasyFilterTokens = [];
397
+ var sFilterChangeProperty;
398
+ // filter change will be triggered for each filter change even if the value help is opened from SFB
399
+ // fnValueHelpPromiseResolve will be set only if the valeu help is opened from EasyFilter
400
+ if (mChangeParameters.sId === "change" && fnValueHelpPromiseResolve) {
401
+ sFilterChangeProperty = mChangeParameters.getParameter("filterChangeReason");
402
+ // find an efficient way to get the filters from SFB to update the EasyFilter token
403
+ oEvent.getSource().getFilters().forEach(function(aFilters) {
404
+ aFilters.aFilters && aFilters.aFilters.forEach(function(oPropertyFilterItem) {
405
+ // aFilters is available if there are more than 1 filter for the property in the EasyFilter
406
+ // In case of one filter aFilters is not available and the values are directly available in the oPropertyFilterItem
407
+ oPropertyFilterItem = oPropertyFilterItem.aFilters ? oPropertyFilterItem.aFilters : [oPropertyFilterItem];
408
+ oPropertyFilterItem.forEach(function(oFilterItem) {
409
+ if (oFilterItem.sPath === sFilterChangeProperty) {
410
+ var oPropertyToken = {
411
+ operator : "",
412
+ selectedValues : []
413
+ };
414
+ var bOperatorAvailable = aEasyFilterTokens.find(function(oToken) {
415
+ return oToken.operator === oFilterItem.sOperator;
416
+ });
417
+ if (bOperatorAvailable) {
418
+ aEasyFilterTokens.forEach(function(oToken) {
419
+ if (oToken.operator === oFilterItem.sOperator) {
420
+ oToken.selectedValues.push(oFilterItem.oValue1);
421
+ }
422
+ });
423
+ } else {
424
+ oPropertyToken.operator = oFilterItem.sOperator;
425
+ oPropertyToken.selectedValues.push(oFilterItem.oValue1);
426
+ aEasyFilterTokens.push(oPropertyToken);
427
+ }
428
+ }
429
+ });
430
+ });
431
+ });
432
+ // ex : [{ operator:eq, selectedValues:["HT-1010","HT-10001","1097"]}, { operator:Contains, selectedValues:["HT-100"]}]
433
+ fnValueHelpPromiseResolve(aEasyFilterTokens); // Assuming that the tokens for only the value help field has to be sent back
434
+ }
435
+ }
436
+
310
437
  return {
311
- triggerEasyFilterQuery : fnTriggerEasyFilterQuery,
438
+ getEasyFilterBar : fnGetEasyFilterBar,
439
+ initialiseEasyFilterBar : fnInitialiseEasyFilterBar,
312
440
  getSFBVariantData : fnGetSFBVariantData,
313
- getEasyFilterSearchMetadata : fnGetEasyFilterSearchMetadata
441
+ getEasyFilterSearchMetadata : fnGetEasyFilterSearchMetadata,
442
+ onExecuteSearch: fnExecuteSearch,
443
+ onClearFilters: fnClearFilters,
444
+ onAfterQueryProcessing: fnAfterQueryProcessing,
445
+ onBeforeQueryProcessing: fnBeforeQueryProcessing,
446
+ onQueryChanged : fnQueryChanged,
447
+ onTokensChanged: fnTokensChanged,
448
+ onShowValueHelp: fnShowValueHelp,
449
+ onFilterChange : fnOnFilterChange
314
450
  };
315
451
  }
316
452
 
@@ -0,0 +1,47 @@
1
+ sap.ui.define([
2
+ "sap/suite/ui/generic/template/genericUtilities/FeLogger",
3
+ "sap/ui/performance/trace/FESRHelper"
4
+ ], function(FeLogger, FESRHelper) {
5
+ 'use strict';
6
+ var oLogger = new FeLogger("lib.ai.ErrorExplanationHelper").getLogger();
7
+
8
+ function generateErrorExplanation(oEvent, oController, oTemplateUtils) {
9
+ var oErrorExplanationMetadata, oErrorExplanationData;
10
+ var oSource = oEvent.getSource();
11
+
12
+ var oOwnerComponent = oController.getOwnerComponent();
13
+ var oAppComponent = oOwnerComponent.getAppComponent();
14
+ var aRegistrationIds = oAppComponent.getManifestEntry("sap.fiori").registrationIds;
15
+ var sRegistrationIdsString = aRegistrationIds && aRegistrationIds.length > 0 ? aRegistrationIds.join(",") : "";
16
+
17
+ oErrorExplanationMetadata = {
18
+ version : 1,
19
+ fioriId: sRegistrationIdsString,
20
+ appName: oAppComponent.getManifestEntry("sap.app").title || null,
21
+ componentName: oAppComponent.getManifestEntry("sap.app").id || null
22
+ };
23
+ oErrorExplanationData = {
24
+ version : 1,
25
+ message : oSource.data("message"),
26
+ code: oSource.data("code"),
27
+ description: oSource.data("description"),
28
+ descriptionUrl: oSource.data("descriptionUrl")
29
+ };
30
+ try {
31
+ oTemplateUtils.oServices.oFioriAIHandler.fioriaiLib.ErrorExplanation.explain(oErrorExplanationMetadata, oErrorExplanationData);
32
+ } catch (oError) {
33
+ oLogger.warning(oError);
34
+ }
35
+ FESRHelper.setSemanticStepname(oSource, "press", "fe:ee:explain");
36
+ }
37
+
38
+ function isErrorExplanationEnabled(oTemplateUtils) {
39
+ var oTemplatePrivateGlobalModel = oTemplateUtils.oComponentUtils.getTemplatePrivateGlobalModel();
40
+ return oTemplatePrivateGlobalModel.getProperty("/generic/fioriAI/isErrorExplanationEnabled");
41
+ }
42
+
43
+ return {
44
+ generateErrorExplanation: generateErrorExplanation,
45
+ isErrorExplanationEnabled: isErrorExplanationEnabled
46
+ };
47
+ });
@@ -8,7 +8,7 @@ sap.ui.define([
8
8
  var sAIIntent = "#IntelligentPrompt-summarize"; // For now the intent is common for all the AI scenarios
9
9
  var sFioriAILibrary = "ux.eng.fioriai.reuse";
10
10
  var UShellContainer = sap.ui.require("sap/ushell/Container");
11
- var oLogger = new FeLogger("js.FioriAIHandler").getLogger();
11
+ var oLogger = new FeLogger("lib.ai.FioriAIHandler").getLogger();
12
12
  /*
13
13
  * This is a handler class for Fiori AI. It is used to load the Fiori AI library and provide it to the template for template consumption.
14
14
  *
@@ -32,14 +32,20 @@ sap.ui.define([
32
32
  oNavigationService.resolveIntent(sAIIntent).then(function(sUrl) {
33
33
  Lib.load({name: sFioriAILibrary, url: sUrl}).then(function() {
34
34
  // To-Do : load the summarize from reuse/summary
35
- sap.ui.require(["ux/eng/fioriai/reuse/library", "ux/eng/fioriai/reuse/easyfilter/EasyFilter"], function(fioriaiLib, EasyFilter) {
35
+ sap.ui.require(["ux/eng/fioriai/reuse/library",
36
+ "ux/eng/fioriai/reuse/easyfilter/EasyFilter",
37
+ "ux/eng/fioriai/reuse/errorexplanation/ErrorExplanation"
38
+ ], function(fioriaiLib, EasyFilter, ErrorExplanation) {
36
39
  that.fioriaiLib.summarize = fioriaiLib.summarize;
37
40
  that.fioriaiLib.EasyFilter = EasyFilter;
41
+ that.fioriaiLib.ErrorExplanation = ErrorExplanation;
42
+
38
43
  that.isFioriAIEnabled = true;
39
44
  // Each AI capability will be enabled separately. Currently there is no separation for beta , but in future it will be
40
45
  oTemplateContract.oTemplatePrivateGlobalModel.setProperty("/generic/fioriAI/isSummarizationEnabled", !!sUrl);
41
46
  // isEasyFilterEnabled property controls the visibility of the filter bar switch from which the easyfilter can be accessed
42
47
  oTemplateContract.oTemplatePrivateGlobalModel.setProperty("/generic/fioriAI/isEasyFilterEnabled", !!sUrl);
48
+ oTemplateContract.oTemplatePrivateGlobalModel.setProperty("/generic/fioriAI/isErrorExplanationEnabled", !!sUrl);
43
49
  fnResolveInit();
44
50
  });
45
51
  });
@@ -68,7 +74,8 @@ sap.ui.define([
68
74
  // If the AI intent is available then later the library will be loaded
69
75
  this.fioriaiLib = {
70
76
  summarize: null,
71
- EasyFilter: null
77
+ EasyFilter: null,
78
+ ErrorExplanation: null
72
79
  };
73
80
  this.isFioriAIEnabled = false;
74
81
  extend(this, getMethods(oTemplateContract));
@@ -318,6 +318,8 @@ ST_EASY_FILTER_GO_BUTTON_TEXT=Go
318
318
 
319
319
  #------------End of: Easy filter related text-----------------------
320
320
 
321
+ ST_AI_EE_BUTTON_LABEL=Generate Explanation
322
+
321
323
  #---Final block: texts to be redefined by the application ----------------------------------------------
322
324
 
323
325
  #--- a) Texts that are only relevant for the object page of the root object
@@ -484,4 +486,33 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Create Object
484
486
  #XTIT: Dialog action button text for new action for create
485
487
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Continue
486
488
 
489
+ # XTIT, 30: Invisible Text for multiple view drop down menu
490
+ CONTENT_SWITCH=Content Switch
491
+
492
+ #--- e) Texts that are relevant for retry after scenario
493
+
494
+ # XMSG: Message for 503 error
495
+ ST_GENERIC_503_SERVICE_UNAVAILABLE=Sorry, this service is temporarily unavailable.
496
+
497
+ # XMSG: Automatic retry message with seconds
498
+ ST_GENERIC_503_AUTO_RETRY_MSG=Automatic retry in {0} seconds
499
+
500
+ #XMSG: Confirmation message for cancelling retry
501
+ ST_GENERIC_503_CANCEL_RETRY=Sorry, this service is still unavailable. Do you want to retry or cancel the action?
502
+
503
+ #XBUT: Retry button on dialog
504
+ RETRY=Retry
505
+
506
+ # XMSG: Description of the 503 Error Message Page (Same day)
507
+ ST_GENERIC_503_RETRY_MSG_SAME_DAY=We expect it to be available again at {0}.
508
+
509
+ # XMSG: Description of the 503 Error Message Page (Some other day)
510
+ ST_GENERIC_503_RETRY_MSG_OTHER_DAY=We expect it to be available again on {0} at {1}.
511
+
512
+ # XMSG: Description of the 503 Error Message Page (Unknown time)
513
+ ST_GENERIC_503_RETRY_MSG_TIME_UNKNWON=Please try again later.
514
+
515
+ #XMSG: Label for the error message provided by server
516
+ ST_GENERIC_503_SOURCE_MESSAGE=Source message:
517
+
487
518
  #---End of final block: texts to be redefined by the application ----------------------------------------
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=\u0625\u0646\u0634\u0627\u0621 \u0643\u0627\u
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=\u0645\u062A\u0627\u0628\u0639\u0629
316
316
 
317
+ CONTENT_SWITCH=\u0645\u0641\u062A\u0627\u062D \u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u0645\u062D\u062A\u0648\u0649
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=\u0421\u044A\u0437\u0434\u0430\u0432\u0430\u0
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=\u041F\u0440\u043E\u0434\u044A\u043B\u0436\u0430\u0432\u0430\u043D\u0435
316
316
 
317
+ CONTENT_SWITCH=\u041F\u0440\u0435\u0432\u043A\u043B\u044E\u0447\u0432\u0430\u0442\u0435\u043B \u043D\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430\u043D\u0438\u0435
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Crear objecte
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Continuar
316
316
 
317
+ CONTENT_SWITCH=Canvi de contingut
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Kreiraj objekat
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Nastavi
316
316
 
317
+ CONTENT_SWITCH=Promjena sadr\u017Eaja
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Vytvo\u0159it objekt
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Pokra\u010Dovat
316
316
 
317
+ CONTENT_SWITCH=P\u0159ep\u00EDna\u010D obsahu
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Creu Gwrthrych
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Bwrw ymlaen
316
316
 
317
+ CONTENT_SWITCH=Newid Cynnwys
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Opret objekt
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Forts\u00E6t
316
316
 
317
+ CONTENT_SWITCH=Indholdsindikator
318
+
@@ -29,7 +29,7 @@ DATA_LOSS_MESSAGE=Ihre Eintr\u00E4ge gehen beim Verlassen dieser Seite verloren.
29
29
 
30
30
  DATA_LOSS_GENERAL_MESSAGE=Ihre Eintr\u00E4ge gehen verloren, wenn Sie fortfahren.
31
31
 
32
- PROCEED=Fortfahren
32
+ PROCEED=Weiter
33
33
 
34
34
  DATA_LOSS_LEAVE_BTN=Seite verlassen
35
35
 
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Objekt anlegen
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Weiter
316
316
 
317
+ CONTENT_SWITCH=Inhaltswechsel
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u0
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=\u03A3\u03C5\u03BD\u03AD\u03C7\u03B5\u03B9\u03B1
316
316
 
317
+ CONTENT_SWITCH=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03A0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Create Object
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Continue
316
316
 
317
+ CONTENT_SWITCH=Content Switch
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Create Object
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Continue
316
316
 
317
+ CONTENT_SWITCH=Content Switch
318
+
@@ -314,3 +314,4 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=\u206A\u206A\u206A\u200D\u200B\u200B\u200C\u2
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=\u206A\u206A\u206A\u200C\u200D\u200B\u200D\u200C\u200C\u200D\u200D\u200D\u200B\u200C\u200D\u200C\u200D\u200D\u200C\u200B\u200D\u200B\u200B\u200D\u200C\u200D\u200D\u200D\u200B\u200C\u200C\u200D\u200D\u200B\u200C\u200B\u200D\u200C\u200B\u200C\u200C\u200B\u200D\u206AContinue\u206A\u206A
316
316
 
317
+ CONTENT_SWITCH=\u206A\u206A\u206A\u200D\u200D\u200D\u200B\u200D\u200C\u200B\u200B\u200D\u200C\u200D\u200B\u200C\u200B\u200B\u200D\u200D\u200B\u200D\u200B\u200D\u200D\u200D\u200B\u200B\u200D\u200D\u200C\u200B\u200D\u200B\u200C\u200B\u200B\u200C\u200B\u200D\u200B\u206AContent Switch\u206A\u206A
@@ -25,9 +25,9 @@ ST_SUCCESS=Con \u00E9xito
25
25
 
26
26
  ST_CHANGES_APPLIED=Se han aplicado las modificaciones
27
27
 
28
- DATA_LOSS_MESSAGE=Si sale se per.entr.
28
+ DATA_LOSS_MESSAGE=Sus entradas se perder\u00E1n al abandonar esta p\u00E1gina.
29
29
 
30
- DATA_LOSS_GENERAL_MESSAGE=Si cont.se per.entr.
30
+ DATA_LOSS_GENERAL_MESSAGE=Si contin\u00FAa se perder\u00E1n sus entradas.
31
31
 
32
32
  PROCEED=Continuar
33
33
 
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Crear objeto
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Continuar
316
316
 
317
+ CONTENT_SWITCH=Cambio de contenido
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Crear objeto
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Continuar
316
316
 
317
+ CONTENT_SWITCH=Cambio de contenido
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Loo objekt
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=J\u00E4tka
316
316
 
317
+ CONTENT_SWITCH=Sisul\u00FCliti
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Luo objekti
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Jatka
316
316
 
317
+ CONTENT_SWITCH=Sis\u00E4lt\u00F6kytkin
318
+
@@ -314,3 +314,5 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Cr\u00E9er objet
314
314
 
315
315
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Suite
316
316
 
317
+ CONTENT_SWITCH=Commutateur de contenu
318
+