@sapui5/sap.suite.ui.generic.template 1.129.1 → 1.130.2

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 (107) 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 +2 -2
  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/controller/RelatedAppsHandler.js +21 -9
  17. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_es.properties +2 -2
  18. package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
  19. package/src/sap/suite/ui/generic/template/ObjectPage/templateSpecificPreparationHelper.js +90 -42
  20. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/MultipleViewsSingleTableMode.fragment.xml +3 -0
  21. package/src/sap/suite/ui/generic/template/QuickCreate/i18n/i18n_fr_CA.properties +1 -1
  22. package/src/sap/suite/ui/generic/template/QuickCreate/manifest.json +1 -1
  23. package/src/sap/suite/ui/generic/template/QuickView/manifest.json +1 -1
  24. package/src/sap/suite/ui/generic/template/designtime/controls/SmartTable.designtime.js +379 -0
  25. package/src/sap/suite/ui/generic/template/designtime/{AnalyticalListPage.designtime.js → floorplans/AnalyticalListPage.designtime.js} +4 -4
  26. package/src/sap/suite/ui/generic/template/designtime/{ListReport.designtime.js → floorplans/ListReport.designtime.js} +4 -4
  27. package/src/sap/suite/ui/generic/template/designtime/{ObjectPage.designtime.js → floorplans/ObjectPage.designtime.js} +4 -5
  28. package/src/sap/suite/ui/generic/template/designtime/utils/designtimeHelper.js +119 -96
  29. package/src/sap/suite/ui/generic/template/designtime/utils/designtimeUtils.js +395 -0
  30. package/src/sap/suite/ui/generic/template/detailTemplates/i18n/i18n_es.properties +1 -1
  31. package/src/sap/suite/ui/generic/template/fragments/EasyFilter.fragment.xml +12 -17
  32. package/src/sap/suite/ui/generic/template/fragments/MessagePage.controller.js +16 -0
  33. package/src/sap/suite/ui/generic/template/fragments/MessagePopover.fragment.xml +16 -2
  34. package/src/sap/suite/ui/generic/template/fragments/SmartFormDataField.fragment.xml +2 -0
  35. package/src/sap/suite/ui/generic/template/genericUtilities/Link.js +9 -2
  36. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartTableChartCommon.js +1 -1
  37. package/src/sap/suite/ui/generic/template/js/AnnotationHelper.js +8 -4
  38. package/src/sap/suite/ui/generic/template/lib/AppComponent.js +10 -3
  39. package/src/sap/suite/ui/generic/template/lib/CommonEventHandlers.js +0 -42
  40. package/src/sap/suite/ui/generic/template/lib/CommonUtils.js +6 -1
  41. package/src/sap/suite/ui/generic/template/lib/MessageButtonHelper.js +11 -7
  42. package/src/sap/suite/ui/generic/template/lib/RetryAfterHandler.js +249 -0
  43. package/src/sap/suite/ui/generic/template/lib/ShareUtils.js +1 -1
  44. package/src/sap/suite/ui/generic/template/lib/SideEffectUtil.js +64 -3
  45. package/src/sap/suite/ui/generic/template/lib/StableIdDefinition.js +7 -0
  46. package/src/sap/suite/ui/generic/template/lib/ai/EasyFilterBarHandler.js +206 -74
  47. package/src/sap/suite/ui/generic/template/lib/ai/ErrorExplanationHelper.js +47 -0
  48. package/src/sap/suite/ui/generic/template/lib/ai/FioriAIHandler.js +10 -3
  49. package/src/sap/suite/ui/generic/template/lib/i18n/i18n.properties +31 -0
  50. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ar.properties +21 -0
  51. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_bg.properties +21 -0
  52. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ca.properties +21 -0
  53. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cnr.properties +21 -0
  54. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cs.properties +21 -0
  55. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cy.properties +21 -0
  56. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_da.properties +21 -0
  57. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_de.properties +22 -1
  58. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_el.properties +21 -0
  59. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en.properties +21 -0
  60. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_GB.properties +21 -0
  61. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_saprigi.properties +21 -0
  62. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es.properties +23 -2
  63. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es_MX.properties +21 -0
  64. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_et.properties +21 -0
  65. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fi.properties +21 -0
  66. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr.properties +21 -0
  67. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr_CA.properties +23 -2
  68. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hi.properties +21 -0
  69. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hr.properties +22 -1
  70. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hu.properties +23 -2
  71. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_id.properties +21 -0
  72. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_it.properties +21 -0
  73. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_iw.properties +21 -0
  74. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ja.properties +21 -0
  75. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_kk.properties +21 -0
  76. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ko.properties +21 -0
  77. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lt.properties +21 -0
  78. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lv.properties +21 -0
  79. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_mk.properties +21 -0
  80. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ms.properties +21 -0
  81. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_nl.properties +21 -0
  82. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_no.properties +21 -0
  83. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pl.properties +21 -0
  84. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt.properties +21 -0
  85. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt_PT.properties +21 -0
  86. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ro.properties +21 -0
  87. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ru.properties +21 -0
  88. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sh.properties +21 -0
  89. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sk.properties +21 -0
  90. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sl.properties +21 -0
  91. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sr.properties +21 -0
  92. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sv.properties +21 -0
  93. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_th.properties +21 -0
  94. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_tr.properties +21 -0
  95. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_uk.properties +21 -0
  96. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_vi.properties +21 -0
  97. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_CN.properties +21 -0
  98. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_TW.properties +21 -0
  99. package/src/sap/suite/ui/generic/template/lib/insights/InsightsCardHelper.js +39 -23
  100. package/src/sap/suite/ui/generic/template/lib/multipleViews/MultipleTablesModeHelper.js +2 -1
  101. package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +5 -3
  102. package/src/sap/suite/ui/generic/template/library.js +3 -1
  103. package/src/sap/suite/ui/generic/template/listTemplates/fragments/MultipleViewsSingleTableMode.fragment.xml +6 -2
  104. package/src/sap/suite/ui/generic/template/manifestMerger/ChangePageConfiguration.js +28 -23
  105. package/src/sap/suite/ui/generic/template/manifestMerger/MergerUtil.js +6 -6
  106. package/src/sap/suite/ui/generic/template/themes/base/base.less +0 -4
  107. 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,10 @@ 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
+ unit: oProperty["sap:unit"] || "",
86
+ required: oProperty["sap:required-in-filter"] ? true : false
77
87
  };
78
88
  }
79
89
  });
@@ -118,6 +128,7 @@ sap.ui.define([
118
128
  if (oTemplateUtils.oComponentUtils.isDraftEnabled()) {
119
129
  var oEditStateControl = oController.byId("editStateFilter");
120
130
  if (oEditStateControl) {
131
+ sTokenType = "MenuWithCheckBox";
121
132
  var oEditingStatusCodeList = oEditStateControl.getItems().map(function(oItem) {
122
133
  return {
123
134
  value : oItem.getKey(),
@@ -131,6 +142,7 @@ sap.ui.define([
131
142
  filterable: true,
132
143
  required: false,
133
144
  sortable: false,
145
+ type: sTokenType,
134
146
  codeList : oEditingStatusCodeList
135
147
  };
136
148
  oEasyFilterMetadata.fields.push(oEditStateFilterMetadata);
@@ -142,51 +154,6 @@ sap.ui.define([
142
154
  });
143
155
  }
144
156
 
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
157
  /**
191
158
  * This method reads the values of the valuehelp entity from the backend and fills the code list of each property.
192
159
  * 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 +218,7 @@ sap.ui.define([
251
218
  * This method is used to convert the AI filters to the selectOptions for the SmartFilterBar
252
219
  * It also identifies the values of edit state filter in case of draft
253
220
  * @param {*} oAIFilters
254
- * @returns array of selectOptions
221
+ * @returns map which contains selectOptions and editStateFilter
255
222
  */
256
223
  function fnGetSFBVariantData(oAIFilters) {
257
224
 
@@ -265,9 +232,14 @@ sap.ui.define([
265
232
  // ------- Converted to selectOptions [ {Property = P1, Ranges = [ a, b ] } ] .
266
233
  // ------- FE filters as "a or b".
267
234
  // 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".
235
+ // ------- AI response
236
+ // ------------ a. " [P1 = Ranges [a] GE, P1 = Ranges [b]] LT ".
237
+ // ------------ Converted to selectOptions [ {Property = P1, Ranges = [ a ] } , {Property = P2, Ranges = [ b ] } ] .
238
+ // ------------ FE filters as "a or b" and this is wrong AI should respond with operator BT/NB like below.
239
+
240
+ // ------------ b. " P1 = Ranges[a,b] OP = BT/ NB ".
241
+ // ------------ Converted to selectOptions [ {Property = P1, Ranges = [ a,b ], OP = BT/NB } ] .
242
+ // ------------ FE filters as "Greater than a and less than b" or "Not between a and b".
271
243
  // Case 2 : AI Query "Show P1 = a and P2 = b"
272
244
  // ------- AI response "[P1 = Ranges [a] , P2 = Ranges [b]]"
273
245
  // ------- Convert to selectOptions [ {Property = P1, Ranges = [ a ] } , {Property = P2, Ranges = [ b ] } ].
@@ -277,28 +249,39 @@ sap.ui.define([
277
249
  var oEditStateFilter = 0;
278
250
  oAIFilters.forEach(function(oFilterItem) {
279
251
 
280
- if ( oFilterItem.name === "EditState") {
281
- oEditStateFilter = oFilterItem.values[0]; // Edit state generally should not have more than one filter value
252
+ if ( oFilterItem.key === "EditState") {
253
+ oEditStateFilter = oFilterItem.keySpecificSelectedValues[0].selectedValues[0]; // Edit state generally should not have more than one filter value
282
254
  } else {
283
255
  var oFilter = {
284
- PropertyName : oFilterItem.name,
256
+ PropertyName : oFilterItem.key,
285
257
  Ranges : []
286
258
  };
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);
259
+ // keySpecificSelectedValues will have one selectedValues object for each operator
260
+ // ex : [{operator: "EQ", selectedValues: ["HT-1010","HT-10001","1097"]}, {operator: "Contains", selectedValues: ["HT-100"]}]
261
+ oFilterItem.keySpecificSelectedValues.forEach(function(oSelectedValues) {
262
+ oSelectedValues.selectedValues.forEach(function (oValue) {
263
+ var oRange = {
264
+ Sign : "I", // currently not considering "E"
265
+ High : ""
266
+ };
267
+ if (oSelectedValues.operator === "Contains") { // need to check for other operators if special handling is required
268
+ oRange.Option = "CP";
269
+ oRange.Low = oValue;
270
+ } else if (oSelectedValues.operator === "BT" || oSelectedValues.operator === "NB") {
271
+ // For "BT" and "NB" High is required
272
+ // AI reuse responds with array of values for BT and BN (between and not between)
273
+ // But in few cases it can also respond with two separate filters (LT and GT)
274
+ // FE DOES NOT do the auto merging and results in two separate selectOptions (results in OR condition)
275
+ oRange.Low = oValue[0];
276
+ oRange.High = oValue[1];
277
+ } else {
278
+ oRange.Option = oSelectedValues.operator;
279
+ oRange.Low = oValue;
280
+ }
281
+ oFilter.Ranges.push(oRange);
282
+ });
301
283
  });
284
+ // one oFilter will have multiple ranges if multiple filters are selected for the same property
302
285
  aSelectOptions.push(oFilter);
303
286
  }
304
287
  });
@@ -307,10 +290,159 @@ sap.ui.define([
307
290
  oEditStateFilter : oEditStateFilter
308
291
  };
309
292
  }
293
+
294
+ /**
295
+ * This method is used to get the EasyFilter control from the floorplan
296
+ * @returns EasyFilter control
297
+ */
298
+ function fnGetEasyFilterBar() {
299
+ return oController.byId("template::easyFilterContainer");
300
+ }
301
+
302
+ /**
303
+ * This method is used to initialise the EasyFilter control with the metadata from the smart filter bar
304
+ */
305
+ function fnInitialiseEasyFilterBar() {
306
+ var oEasyFilter = fnGetEasyFilterBar();
307
+ var oEasyFilterMetadataPromise = fnGetEasyFilterSearchMetadata();
308
+ var sEntitySet = oController.getOwnerComponent().getEntitySet();
309
+ oEasyFilterMetadataPromise.then((oEasyFilterMetadata) => {
310
+ oEasyFilter.setContextPath(sEntitySet);
311
+ oEasyFilter.setAppId(oController.getOwnerComponent().getAppComponent().getManifestEntry("sap.app")).id;
312
+ oEasyFilter.setFilterBarMetadata(oEasyFilterMetadata.fields);
313
+ oEasyFilter.easyfilter = oTemplateUtils.oServices.oFioriAIHandler.fioriaiLib.EasyFilter;
314
+ });
315
+ }
316
+
317
+ function fnExecuteSearch(oEvent) {
318
+ var oSmartFilterbar = oState.oSmartFilterbar;
319
+ oSmartFilterbar.search();
320
+ }
321
+
322
+ function fnClearFilters(oEvent) {
323
+ var oSmartFilterbar = oState.oSmartFilterbar;
324
+ oSmartFilterbar.search();
325
+ // Do not clear the SFB as this is applicable only for the EasyFilter
326
+ //oSmartFilterbar.clear();
327
+ }
328
+
329
+ function fnAfterQueryProcessing(oEvent) {
330
+ oQueryPromiseResolve();
331
+ }
332
+
333
+ function fnBeforeQueryProcessing(oEvent) {
334
+ oQueryPromise = new Promise(function(resolve) {
335
+ oQueryPromiseResolve = resolve;
336
+ });
337
+ oTemplateUtils.oComponentUtils.getBusyHelper().setBusy(oQueryPromise);
338
+ }
339
+
340
+ function fnTokensChanged(oEvent) {
341
+ var oSmartFilterbar = oState.oSmartFilterbar;
342
+ var oFiltersFromAI = oEvent.getParameter("tokens");
343
+ var sSmartFilterBarId = oSmartFilterbar.getId();
344
+ var oSmartFilterBarWrapper = oTemplateUtils.oCommonUtils.getControlStateWrapperById(sSmartFilterBarId, "SmartFilterBar");
345
+ var oSmartFilterBarVariant = oSmartFilterBarWrapper.getState();
346
+ var oVariantDataFromAI = fnGetSFBVariantData(oFiltersFromAI);
347
+
348
+ // restore the custom filters to the initial state for now
349
+ // To check if other objects in oSmartFilterBarVariant needs to be modified
350
+ var aAppExtension = Object.keys(oSmartFilterBarVariant.customFilters.appExtension);
351
+ if ( aAppExtension.length > 0 ) {
352
+ aAppExtension.forEach(function(sKey) {
353
+ oSmartFilterBarVariant.customFilters.appExtension[sKey] = "";
354
+ });
355
+ }
356
+ oSmartFilterBarVariant.selectOptions = oVariantDataFromAI.aSelectOptions;
357
+ if (oTemplateUtils.oComponentUtils.isDraftEnabled()) {
358
+ oSmartFilterBarVariant.customFilters.editState = oVariantDataFromAI.oEditStateFilter;
359
+ }
360
+
361
+ oSmartFilterBarWrapper.setState(oSmartFilterBarVariant);
362
+ oSmartFilterbar.getSmartVariant() && oSmartFilterbar.getSmartVariant().currentVariantSetModified(true);
363
+ oSmartFilterbar.search();
364
+ }
365
+
366
+ /**
367
+ * Event handler for the EasyFilter control's showValueHelp event.
368
+ * Identifies the input field for which the value help is requested and triggers the value help opening from SFB.
369
+ * @param {*} oEvent
370
+ * @param {*} oState
371
+ */
372
+ function fnShowValueHelp(oEvent) {
373
+ var oSmartFilterbar = oState.oSmartFilterbar;
374
+ fnValueHelpPromiseResolve = oEvent.getParameter("resolve");
375
+ oSmartFilterbar.associateValueLists();
376
+ try {
377
+ oSmartFilterbar.openValueHelpRequestForFilterItem(oEvent.getParameter("key"));
378
+ } catch (error) {
379
+ oLogger.error("Value help cannot be triggered for the field " + oEvent.getParameter("key"));
380
+ }
381
+ }
382
+
383
+ function fnQueryChanged() {
384
+ // todo : check if any action is required
385
+ }
386
+ // function fnUpdateEasyFilterBarTokens() {
387
+ // // todo : update the easy filter bar tokens with new values from the SFB VHD
388
+ // }
389
+ function fnOnFilterChange(oEvent) {
390
+ // afterFilterDataUpdate
391
+ var mChangeParameters = oEvent.getParameters("mParameters");
392
+ var aEasyFilterTokens = [];
393
+ var sFilterChangeProperty;
394
+ // filter change will be triggered for each filter change even if the value help is opened from SFB
395
+ // fnValueHelpPromiseResolve will be set only if the valeu help is opened from EasyFilter
396
+ if (mChangeParameters.sId === "change" && fnValueHelpPromiseResolve) {
397
+ sFilterChangeProperty = mChangeParameters.getParameter("filterChangeReason");
398
+ // find an efficient way to get the filters from SFB to update the EasyFilter token
399
+ oEvent.getSource().getFilters().forEach(function(aFilters) {
400
+ aFilters.aFilters && aFilters.aFilters.forEach(function(oPropertyFilterItem) {
401
+ // aFilters is available if there are more than 1 filter for the property in the EasyFilter
402
+ // In case of one filter aFilters is not available and the values are directly available in the oPropertyFilterItem
403
+ oPropertyFilterItem = oPropertyFilterItem.aFilters ? oPropertyFilterItem.aFilters : [oPropertyFilterItem];
404
+ oPropertyFilterItem.forEach(function(oFilterItem) {
405
+ if (oFilterItem.sPath === sFilterChangeProperty) {
406
+ var oPropertyToken = {
407
+ operator : "",
408
+ selectedValues : []
409
+ };
410
+ var bOperatorAvailable = aEasyFilterTokens.find(function(oToken) {
411
+ return oToken.operator === oFilterItem.sOperator;
412
+ });
413
+ if (bOperatorAvailable) {
414
+ aEasyFilterTokens.forEach(function(oToken) {
415
+ if (oToken.operator === oFilterItem.sOperator) {
416
+ oToken.selectedValues.push(oFilterItem.oValue1);
417
+ }
418
+ });
419
+ } else {
420
+ oPropertyToken.operator = oFilterItem.sOperator;
421
+ oPropertyToken.selectedValues.push(oFilterItem.oValue1);
422
+ aEasyFilterTokens.push(oPropertyToken);
423
+ }
424
+ }
425
+ });
426
+ });
427
+ });
428
+ // ex : [{ operator:eq, selectedValues:["HT-1010","HT-10001","1097"]}, { operator:Contains, selectedValues:["HT-100"]}]
429
+ fnValueHelpPromiseResolve(aEasyFilterTokens); // Assuming that the tokens for only the value help field has to be sent back
430
+ }
431
+ }
432
+
310
433
  return {
311
- triggerEasyFilterQuery : fnTriggerEasyFilterQuery,
434
+ getEasyFilterBar : fnGetEasyFilterBar,
435
+ initialiseEasyFilterBar : fnInitialiseEasyFilterBar,
312
436
  getSFBVariantData : fnGetSFBVariantData,
313
- getEasyFilterSearchMetadata : fnGetEasyFilterSearchMetadata
437
+ getEasyFilterSearchMetadata : fnGetEasyFilterSearchMetadata,
438
+ onExecuteSearch: fnExecuteSearch,
439
+ onClearFilters: fnClearFilters,
440
+ onAfterQueryProcessing: fnAfterQueryProcessing,
441
+ onBeforeQueryProcessing: fnBeforeQueryProcessing,
442
+ onQueryChanged : fnQueryChanged,
443
+ onTokensChanged: fnTokensChanged,
444
+ onShowValueHelp: fnShowValueHelp,
445
+ onFilterChange : fnOnFilterChange
314
446
  };
315
447
  }
316
448
 
@@ -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 ----------------------------------------
@@ -205,6 +205,8 @@ ST_EASY_FILTER_INPUT_PLACEHOLDER=\u0623\u062F\u062E\u0644 \u0627\u0633\u062A\u06
205
205
  ST_EASY_FILTER_GO_BUTTON_TEXT=\u0627\u0646\u062A\u0642\u0627\u0644
206
206
 
207
207
 
208
+ ST_AI_EE_BUTTON_LABEL=\u0625\u0646\u0634\u0627\u0621 \u062A\u0648\u0636\u064A\u062D
209
+
208
210
 
209
211
 
210
212
  ST_GENERIC_DRAFT_LOCKED_BY_USER=\u0642\u0627\u0645 \u0645\u0633\u062A\u062E\u062F\u0645 \u0622\u062E\u0631 \u0628\u062A\u062D\u0631\u064A\u0631 \u0647\u0630\u0627 \u0627\u0644\u0643\u0627\u0626\u0646 \u0628\u062F\u0648\u0646 \u062D\u0641\u0638 \u0627\u0644\u062A\u063A\u064A\u064A\u0631\u0627\u062A\: \n{1} \n\u0641\u064A \u062D\u0627\u0644\u0629 \u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629\u060C \u0641\u0633\u064A\u062A\u0645 \u0641\u0642\u062F\u0627\u0646 \u0623\u064A \u062A\u063A\u064A\u064A\u0631\u0627\u062A.
@@ -314,3 +316,22 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=\u0625\u0646\u0634\u0627\u0621 \u0643\u0627\u
314
316
 
315
317
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=\u0645\u062A\u0627\u0628\u0639\u0629
316
318
 
319
+ CONTENT_SWITCH=\u0645\u0641\u062A\u0627\u062D \u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u0645\u062D\u062A\u0648\u0649
320
+
321
+
322
+ ST_GENERIC_503_SERVICE_UNAVAILABLE=\u0639\u0630\u0631\u064B\u0627\u060C \u0647\u0630\u0647 \u0627\u0644\u062E\u062F\u0645\u0629 \u063A\u064A\u0631 \u0645\u062A\u0648\u0641\u0631\u0629 \u0645\u0624\u0642\u062A\u064B\u0627.
323
+
324
+ ST_GENERIC_503_AUTO_RETRY_MSG=\u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627 \u062E\u0644\u0627\u0644 {0} \u0645\u0646 \u0627\u0644\u062B\u0648\u0627\u0646\u064A.
325
+
326
+ ST_GENERIC_503_CANCEL_RETRY=\u0639\u0630\u0631\u064B\u0627\u060C \u0644\u0627 \u062A\u0632\u0627\u0644 \u0647\u0630\u0647 \u0627\u0644\u062E\u062F\u0645\u0629 \u063A\u064A\u0631 \u0645\u062A\u0648\u0641\u0631\u0629. \u0647\u0644 \u062A\u0631\u064A\u062F \u0625\u0639\u0627\u062F\u0629 \u0645\u062D\u0627\u0648\u0644\u0629 \u0627\u0644\u0625\u062C\u0631\u0627\u0621 \u0623\u0648 \u0625\u0644\u063A\u0627\u0624\u0647\u061F
327
+
328
+ RETRY=\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629
329
+
330
+ ST_GENERIC_503_RETRY_MSG_SAME_DAY=\u0646\u062A\u0648\u0642\u0639 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0645\u062A\u0648\u0641\u0631\u064B\u0627 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u0641\u064A {0}.
331
+
332
+ ST_GENERIC_503_RETRY_MSG_OTHER_DAY=\u0646\u062A\u0648\u0642\u0639 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0645\u062A\u0648\u0641\u0631\u064B\u0627 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u0641\u064A {0} \u0641\u064A {1}.
333
+
334
+ ST_GENERIC_503_RETRY_MSG_TIME_UNKNWON=\u0627\u0644\u0631\u062C\u0627\u0621 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u0644\u0627\u062D\u0642\u064B\u0627.
335
+
336
+ ST_GENERIC_503_SOURCE_MESSAGE=\u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u0645\u0635\u062F\u0631\:
337
+
@@ -205,6 +205,8 @@ ST_EASY_FILTER_INPUT_PLACEHOLDER=\u0412\u044A\u0432\u0435\u0434\u0435\u0442\u043
205
205
  ST_EASY_FILTER_GO_BUTTON_TEXT=\u0421\u0442\u0430\u0440\u0442
206
206
 
207
207
 
208
+ ST_AI_EE_BUTTON_LABEL=\u0413\u0435\u043D\u0435\u0440\u0438\u0440\u0430\u043D\u0435 \u043D\u0430 \u043E\u0431\u044F\u0441\u043D\u0435\u043D\u0438\u0435
209
+
208
210
 
209
211
 
210
212
  ST_GENERIC_DRAFT_LOCKED_BY_USER=\u0414\u0440\u0443\u0433 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B \u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u0430\u043B \u043E\u0431\u0435\u043A\u0442\u0430, \u0431\u0435\u0437 \u0434\u0430 \u0437\u0430\u043F\u0430\u0437\u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435\:\n{1} \n\u0410\u043A\u043E \u043F\u0440\u043E\u0434\u044A\u043B\u0436\u0438\u0442\u0435, \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u0449\u0435 \u0431\u044A\u0434\u0430\u0442 \u0438\u0437\u0433\u0443\u0431\u0435\u043D\u0438.
@@ -314,3 +316,22 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=\u0421\u044A\u0437\u0434\u0430\u0432\u0430\u0
314
316
 
315
317
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=\u041F\u0440\u043E\u0434\u044A\u043B\u0436\u0430\u0432\u0430\u043D\u0435
316
318
 
319
+ 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
320
+
321
+
322
+ ST_GENERIC_503_SERVICE_UNAVAILABLE=\u0417\u0430 \u0441\u044A\u0436\u0430\u043B\u0435\u043D\u0438\u0435 \u0443\u0441\u043B\u0443\u0433\u0430\u0442\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0435 \u0434\u043E\u0441\u0442\u044A\u043F\u043D\u0430.
323
+
324
+ ST_GENERIC_503_AUTO_RETRY_MSG=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u043D \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D \u043E\u043F\u0438\u0442 \u0441\u043B\u0435\u0434 {0} \u0441\u0435\u043A\u0443\u043D\u0434\u0438.
325
+
326
+ ST_GENERIC_503_CANCEL_RETRY=\u0417\u0430 \u0441\u044A\u0436\u0430\u043B\u0435\u043D\u0438\u0435 \u0443\u0441\u043B\u0443\u0433\u0430\u0442\u0430 \u0432\u0441\u0435 \u043E\u0449\u0435 \u043D\u0435 \u0435 \u0434\u043E\u0441\u0442\u044A\u043F\u043D\u0430. \u0418\u0441\u043A\u0430\u0442\u0435 \u043B\u0438 \u0434\u0430 \u043E\u043F\u0438\u0442\u0430\u0442\u0435 \u043E\u0442\u043D\u043E\u0432\u043E \u0438\u043B\u0438 \u0434\u0430 \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u0442\u043E?
327
+
328
+ RETRY=\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D \u043E\u043F\u0438\u0442
329
+
330
+ ST_GENERIC_503_RETRY_MSG_SAME_DAY=\u041E\u0447\u0430\u043A\u0432\u0430\u043C\u0435 \u0434\u0430 \u0431\u044A\u0434\u0435 \u0434\u043E\u0441\u0442\u044A\u043F\u043D\u043E \u043E\u0442\u043D\u043E\u0432\u043E \u0432 {0}.
331
+
332
+ ST_GENERIC_503_RETRY_MSG_OTHER_DAY=\u041E\u0447\u0430\u043A\u0432\u0430\u043C\u0435 \u0434\u0430 \u0431\u044A\u0434\u0435 \u0434\u043E\u0441\u0442\u044A\u043F\u043D\u043E \u043E\u0442\u043D\u043E\u0432\u043E \u043D\u0430 {0} \u0432 {1}.
333
+
334
+ ST_GENERIC_503_RETRY_MSG_TIME_UNKNWON=\u041C\u043E\u043B\u044F, \u043E\u043F\u0438\u0442\u0430\u0439\u0442\u0435 \u043F\u043E-\u043A\u044A\u0441\u043D\u043E.
335
+
336
+ ST_GENERIC_503_SOURCE_MESSAGE=\u0418\u0437\u0445\u043E\u0434\u043D\u043E \u0441\u044A\u043E\u0431\u0449\u0435\u043D\u0438\u0435\:
337
+
@@ -205,6 +205,8 @@ ST_EASY_FILTER_INPUT_PLACEHOLDER=Introdu\u00EFu una consulta en llenguatge natur
205
205
  ST_EASY_FILTER_GO_BUTTON_TEXT=Anar
206
206
 
207
207
 
208
+ ST_AI_EE_BUTTON_LABEL=Generar explicaci\u00F3
209
+
208
210
 
209
211
 
210
212
  ST_GENERIC_DRAFT_LOCKED_BY_USER=Alt.usuar.han edit.aq.obj.sense desar les mod.\: \n{1} \nSi transferiu l''obj., totes modif.es perdran.
@@ -314,3 +316,22 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Crear objecte
314
316
 
315
317
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Continuar
316
318
 
319
+ CONTENT_SWITCH=Canvi de contingut
320
+
321
+
322
+ ST_GENERIC_503_SERVICE_UNAVAILABLE=Aquest servei no est\u00E0 disponible temporalment.
323
+
324
+ ST_GENERIC_503_AUTO_RETRY_MSG=Es tornar\u00E0 a intentar autom\u00E0ticament d''aqu\u00ED a {0} segons.
325
+
326
+ ST_GENERIC_503_CANCEL_RETRY=Aquest servei encara no est\u00E0 disponible. Voleu tornar a provar-ho o voleu cancel\u00B7lar l'acci\u00F3?
327
+
328
+ RETRY=Tornar a provar-ho
329
+
330
+ ST_GENERIC_503_RETRY_MSG_SAME_DAY=Esperem que estigui disponible a les {0}.
331
+
332
+ ST_GENERIC_503_RETRY_MSG_OTHER_DAY=Esperem que estigui disponible el {0} a les {1}.
333
+
334
+ ST_GENERIC_503_RETRY_MSG_TIME_UNKNWON=Torneu-ho a provar m\u00E9s tard.
335
+
336
+ ST_GENERIC_503_SOURCE_MESSAGE=Missatge d'origen\:
337
+
@@ -205,6 +205,8 @@ ST_EASY_FILTER_INPUT_PLACEHOLDER=Unesite svoj upit na prirodnom jeziku da biste
205
205
  ST_EASY_FILTER_GO_BUTTON_TEXT=Idi
206
206
 
207
207
 
208
+ ST_AI_EE_BUTTON_LABEL=Generi\u0161i obja\u0161njenje
209
+
208
210
 
209
211
 
210
212
  ST_GENERIC_DRAFT_LOCKED_BY_USER=Dr.korisnik je uredio ovaj obj.bez snim.prom.\: \n{1} \nAko vi preuzmete, sve prom.\u0107e biti izgubljene.
@@ -314,3 +316,22 @@ DIALOG_TITLE_NEW_ACTION_FOR_CREATE=Kreiraj objekat
314
316
 
315
317
  DIALOG_ACTION_BUTTON_NEW_ACTION_FOR_CREATE=Nastavi
316
318
 
319
+ CONTENT_SWITCH=Promjena sadr\u017Eaja
320
+
321
+
322
+ ST_GENERIC_503_SERVICE_UNAVAILABLE=Na\u017Ealost, ova usluga je privremeno nedostupna.
323
+
324
+ ST_GENERIC_503_AUTO_RETRY_MSG=Automatski ponovni poku\u0161aj za {0} sekunde(i).
325
+
326
+ ST_GENERIC_503_CANCEL_RETRY=Na\u017Ealost, ova usluga je i dalje nedostupna. Da li \u017Eelite da poku\u0161ate ponovo ili da otka\u017Eete radnju?
327
+
328
+ RETRY=Poku\u0161aj ponovo
329
+
330
+ ST_GENERIC_503_RETRY_MSG_SAME_DAY=O\u010Dekujemo da \u0107e biti ponovo dostupno u {0}.
331
+
332
+ ST_GENERIC_503_RETRY_MSG_OTHER_DAY=O\u010Dekujemo da \u0107e biti ponovo dostupno u {0} u {1}.
333
+
334
+ ST_GENERIC_503_RETRY_MSG_TIME_UNKNWON=Poku\u0161ajte ponovo kasnije.
335
+
336
+ ST_GENERIC_503_SOURCE_MESSAGE=Izvorna poruka\:
337
+