@sapui5/sap.suite.ui.generic.template 1.150.1 → 1.151.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 (59) hide show
  1. package/package.json +1 -1
  2. package/src/sap/suite/ui/generic/template/.library +1 -1
  3. package/src/sap/suite/ui/generic/template/AnalyticalListPage/control/visualfilterbar/SmartVisualFilterBar.js +1 -1
  4. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en_US_sappsd.properties +17 -9
  5. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en_US_saptrc.properties +113 -105
  6. package/src/sap/suite/ui/generic/template/AnalyticalListPage/manifest.json +1 -1
  7. package/src/sap/suite/ui/generic/template/Canvas/manifest.json +1 -1
  8. package/src/sap/suite/ui/generic/template/ListReport/AnnotationHelperSmartList.js +1 -1
  9. package/src/sap/suite/ui/generic/template/ListReport/controller/ControllerImplementation.js +0 -6
  10. package/src/sap/suite/ui/generic/template/ListReport/controller/IappStateHandler.js +9 -0
  11. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_en_US_sappsd.properties +8 -5
  12. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_en_US_saptrc.properties +61 -58
  13. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_fr.properties +1 -1
  14. package/src/sap/suite/ui/generic/template/ListReport/manifest.json +1 -1
  15. package/src/sap/suite/ui/generic/template/ObjectPage/controller/ControllerImplementation.js +3 -1
  16. package/src/sap/suite/ui/generic/template/ObjectPage/controller/RelatedAppsHandler.js +1 -1
  17. package/src/sap/suite/ui/generic/template/ObjectPage/controller/inlineCreationRows/InlineCreationRowsHelper.js +10 -7
  18. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_de.properties +4 -4
  19. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_en.properties +1 -1
  20. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_en_US_sappsd.properties +53 -9
  21. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_en_US_saprigi.properties +1 -1
  22. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_en_US_saptrc.properties +143 -95
  23. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_fr.properties +3 -3
  24. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_no.properties +1 -1
  25. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_ro.properties +1 -1
  26. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_ru.properties +1 -1
  27. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_sl.properties +1 -1
  28. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_sv.properties +1 -1
  29. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_uk.properties +1 -1
  30. package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
  31. package/src/sap/suite/ui/generic/template/QuickCreate/i18n/i18n_en_US_saptrc.properties +14 -14
  32. package/src/sap/suite/ui/generic/template/QuickCreate/manifest.json +1 -1
  33. package/src/sap/suite/ui/generic/template/QuickView/i18n/i18n_en_US_saptrc.properties +2 -2
  34. package/src/sap/suite/ui/generic/template/QuickView/manifest.json +1 -1
  35. package/src/sap/suite/ui/generic/template/detailTemplates/i18n/i18n_en_US_saptrc.properties +6 -6
  36. package/src/sap/suite/ui/generic/template/fragments/AnalyticalTableColumns.fragment.xml +0 -10
  37. package/src/sap/suite/ui/generic/template/fragments/EasyFilter.fragment.xml +0 -2
  38. package/src/sap/suite/ui/generic/template/fragments/GridTableColumns.fragment.xml +5 -2
  39. package/src/sap/suite/ui/generic/template/fragments/TreeTableColumns.fragment.xml +5 -2
  40. package/src/sap/suite/ui/generic/template/genericUtilities/controlHelper.js +10 -1
  41. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartFilterBarWrapper.js +40 -28
  42. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartTableChartCommon.js +10 -0
  43. package/src/sap/suite/ui/generic/template/lib/AppComponent.js +3 -1
  44. package/src/sap/suite/ui/generic/template/lib/Application.js +28 -2
  45. package/src/sap/suite/ui/generic/template/lib/CRUDManager.js +5 -24
  46. package/src/sap/suite/ui/generic/template/lib/CommonEventHandlers.js +47 -10
  47. package/src/sap/suite/ui/generic/template/lib/CommonUtils.js +17 -9
  48. package/src/sap/suite/ui/generic/template/lib/PageLeaveHandler.js +19 -14
  49. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/fragments/EasyFillDialog.fragment.xml +0 -1
  50. package/src/sap/suite/ui/generic/template/lib/ai/EasyFilterBarHandler.js +148 -51
  51. package/src/sap/suite/ui/generic/template/lib/ai/EasyFilterDataFetcherHelper.js +1 -1
  52. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_sappsd.properties +275 -14
  53. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_saptrc.properties +392 -163
  54. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sl.properties +6 -6
  55. package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +1 -1
  56. package/src/sap/suite/ui/generic/template/lib/presentationControl/SmartTableHandler.js +13 -13
  57. package/src/sap/suite/ui/generic/template/library.js +1 -1
  58. package/src/sap/suite/ui/generic/template/listTemplates/controller/IappStateHandler.js +12 -3
  59. package/src/sap/suite/ui/generic/template/listTemplates/i18n/i18n_en_US_saptrc.properties +1 -1
@@ -132,6 +132,10 @@ sap.ui.define([
132
132
  sFilterRestriction = oExtension.value;
133
133
  }
134
134
  });
135
+ // sap:hidden-filter extension may be absent when only the vocabulary annotation is set
136
+ if (!bIsHiddenFilter && oProperty["com.sap.vocabularies.UI.v1.HiddenFilter"]) {
137
+ bIsHiddenFilter = oProperty["com.sap.vocabularies.UI.v1.HiddenFilter"].Bool === "true";
138
+ }
135
139
  if ((oProperty.type === "Edm.DateTime" && oProperty["sap:display-format"] === "Date") ||
136
140
  (oProperty.type === "Edm.String" && oProperty["com.sap.vocabularies.Common.v1.IsCalendarDate"] && oProperty["com.sap.vocabularies.Common.v1.IsCalendarDate"].Bool === "true")) {
137
141
  sTokenType = "Calendar";
@@ -577,6 +581,17 @@ sap.ui.define([
577
581
  setState: fnApplyEasyFilterVariantState
578
582
  });
579
583
 
584
+ // Sync sLoadedVariantFilterMode on afterSave (Save As path)
585
+ // so layout switches after saving correctly show the dirty indicator.
586
+ var oSVM = oState.oSmartFilterbar.getSmartVariant();
587
+ if (oSVM && oSVM.attachAfterSave) {
588
+ oSVM.attachAfterSave(function() {
589
+ var oTMModel = oTemplateUtils.oComponentUtils.getTemplatePrivateModel();
590
+ var sCurrentFilterMode = oTMModel.getProperty("/listReport/filterMode");
591
+ sLoadedVariantFilterMode = sCurrentFilterMode;
592
+ });
593
+ }
594
+
580
595
  // Handle INIT timing gap: the "INIT" afterVariantLoad fires before this handler
581
596
  // is created. Read whatever the variant already loaded into customFilterData now.
582
597
  var oCustomData = oState.oSmartFilterbar.getCustomFilterData();
@@ -694,10 +709,119 @@ sap.ui.define([
694
709
  oSmartFilterBarWrapper.setState(oSmartFilterBarVariant);
695
710
  // currentVariantSetModified intentionally omitted — pressing Go with the same
696
711
  // query must not mark the variant as dirty.
697
- // oSmartFilterbar.getSmartVariant() && oSmartFilterbar.getSmartVariant().currentVariantSetModified(true);
712
+
713
+ var aSelectOptionsNeedingInjection = fnGetCustomFieldsNeedingInjection(oSmartFilterbar, oVariantDataFromAI.aSelectOptions);
714
+ fnInjectCustomFiltersOnRebind(aSelectOptionsNeedingInjection);
715
+ fnSyncCustomFieldInputValues(aSelectOptionsNeedingInjection, oSmartFilterbar);
716
+
717
+ // Apply sorters/groupLevels bundled with tokens after SFB state is set but
718
+ // before triggering search, to prevent a premature rebind with incomplete filters.
719
+ var aBundledSorters = oEvent.getParameter("sorters");
720
+ var aBundledGroupLevels = oEvent.getParameter("groupLevels");
721
+ if (aBundledSorters !== undefined) {
722
+ fnApplySortersToTable(aBundledSorters);
723
+ }
724
+ if (aBundledGroupLevels !== undefined) {
725
+ fnApplyGroupLevelsToTable(aBundledGroupLevels);
726
+ }
727
+
698
728
  oSmartFilterbar.search();
699
729
  }
700
730
 
731
+ /**
732
+ * Returns the subset of aSelectOptions whose property names landed in SFB's _CUSTOM
733
+ * bucket after setState — meaning SFB could not route them through its standard filter
734
+ * pipeline (plain Input fields with no value-list annotation).
735
+ * @param {object} oSmartFilterbar - The SmartFilterBar control instance
736
+ * @param {Array} aSelectOptions - Select options built from AI tokens
737
+ * @returns {Array} Select options that require direct filter injection
738
+ */
739
+ function fnGetCustomFieldsNeedingInjection(oSmartFilterbar, aSelectOptions) {
740
+ var oFilterData = oSmartFilterbar.getFilterData();
741
+ var oCustomData = oFilterData && oFilterData._CUSTOM;
742
+ return aSelectOptions.filter(function(oSelectOption) {
743
+ return oCustomData && oCustomData.hasOwnProperty(oSelectOption.PropertyName);
744
+ });
745
+ }
746
+
747
+ /**
748
+ * Builds UI5 Filter objects for each _CUSTOM select option and registers a one-shot
749
+ * beforeRebindTable handler on the SmartTable that injects them into bindingParams.filters
750
+ * just before the OData request is built — bypassing SFB's filter pipeline entirely.
751
+ * EQ is remapped to Contains to match Classic SFB substringof behaviour on plain Input fields.
752
+ * @param {Array} aSelectOptionsNeedingInjection - Select options that require direct filter injection
753
+ * @returns {void}
754
+ */
755
+ function fnInjectCustomFiltersOnRebind(aSelectOptionsNeedingInjection) {
756
+ if (aSelectOptionsNeedingInjection.length === 0 || !oState.oPresentationControlHandler) {
757
+ return;
758
+ }
759
+ var oSmartTable = oState.oPresentationControlHandler.getControl();
760
+ if (!oSmartTable || typeof oSmartTable.attachBeforeRebindTable !== 'function') {
761
+ return;
762
+ }
763
+ var aInjectFilters = [];
764
+ aSelectOptionsNeedingInjection.forEach(function(oSelectOption) {
765
+ oSelectOption.Ranges.forEach(function(oRange) {
766
+ var sOp = oRange.Option;
767
+ var sVal = oRange.Low;
768
+ if (sOp === 'CP') {
769
+ aInjectFilters.push(new Filter(oSelectOption.PropertyName, FilterOperator.Contains, sVal.replace(/^\*|\*$/g, '')));
770
+ } else if (sOp === 'EQ') {
771
+ aInjectFilters.push(new Filter(oSelectOption.PropertyName, FilterOperator.Contains, sVal));
772
+ } else if (sOp === 'BT') {
773
+ aInjectFilters.push(new Filter(oSelectOption.PropertyName, FilterOperator.BT, oRange.Low, oRange.High));
774
+ } else if (sOp === 'NB') {
775
+ aInjectFilters.push(new Filter({path: oSelectOption.PropertyName, operator: FilterOperator.BT, value1: oRange.Low, value2: oRange.High, bExclude: true}));
776
+ } else {
777
+ var sMappedOp = FilterOperator[sOp];
778
+ if (!sMappedOp) {
779
+ oLogger.warning("EasyFilterBarHandler: unsupported select-option operator '" + sOp + "' for property '" + oSelectOption.PropertyName + "' — skipping filter injection");
780
+ return;
781
+ }
782
+ aInjectFilters.push(new Filter(oSelectOption.PropertyName, sMappedOp, sVal));
783
+ }
784
+ });
785
+ });
786
+ var fnOnBeforeRebind = function(oRebindEvent) {
787
+ oSmartTable.detachBeforeRebindTable(fnOnBeforeRebind);
788
+ var oBindingParams = oRebindEvent.getParameter('bindingParams');
789
+ oBindingParams.filters = oBindingParams.filters || [];
790
+ var aBindingFilters = oBindingParams.filters;
791
+ // Remove prior easy-filter entries for the same properties to avoid stacking.
792
+ aInjectFilters.forEach(function(oF) {
793
+ for (var i = aBindingFilters.length - 1; i >= 0; i--) {
794
+ if (aBindingFilters[i] && aBindingFilters[i].sPath === oF.sPath) {
795
+ aBindingFilters.splice(i, 1);
796
+ }
797
+ }
798
+ aBindingFilters.push(oF);
799
+ });
800
+ };
801
+ oSmartTable.attachBeforeRebindTable(fnOnBeforeRebind);
802
+ }
803
+
804
+ /**
805
+ * Sets the visible value on the SFB Input control for each _CUSTOM field so the Classic
806
+ * filter tab shows the correct value when the user switches filter modes.
807
+ * Uses setValue only — no fireChange — to avoid triggering SFB's async filter rebuild.
808
+ * @param {Array} aSelectOptionsNeedingInjection - Select options that require direct filter injection
809
+ * @param {object} oSmartFilterbar - The SmartFilterBar control instance
810
+ * @returns {void}
811
+ */
812
+ function fnSyncCustomFieldInputValues(aSelectOptionsNeedingInjection, oSmartFilterbar) {
813
+ aSelectOptionsNeedingInjection.forEach(function(oSelectOption) {
814
+ if (oSelectOption.Ranges.length > 0) {
815
+ var aItems = oSmartFilterbar.getAllFilterItems(true) || [];
816
+ var oItem = aItems.find(function(i) { return i.getName && i.getName() === oSelectOption.PropertyName; });
817
+ var oCtrl = oItem && oItem.getControl && oItem.getControl();
818
+ if (oCtrl && oCtrl.setValue) {
819
+ oCtrl.setValue(oSelectOption.Ranges[0].Low);
820
+ }
821
+ }
822
+ });
823
+ }
824
+
701
825
  /**
702
826
  * Event handler for the EasyFilterBarContainer's tokensChangedByUser event.
703
827
  * Fired when the user manually deletes or modifies a token (distinct from AI-resolved tokens).
@@ -708,42 +832,30 @@ sap.ui.define([
708
832
  fnSetCreationAllowed(false);
709
833
  }
710
834
 
711
- /**
712
- /**
713
- * Event handler for the EasyFilter control's sortersChanged event.
714
- * Applies the AI-determined sort order to the SmartTable via setUiState,
715
- * which updates the data binding, column sort indicators, and P13n state
716
- * through the PersonalizationController.
717
- * @param {sap.ui.base.Event} oEvent The sortersChanged event containing sort definitions
718
- */
719
- function fnSortersChanged(oEvent) {
835
+ function fnApplySortersToTable(aSorters) {
720
836
  try {
721
- var aSorters = oEvent.getParameter("sorters");
722
-
723
837
  var oPresentationControlHandler = oState.oPresentationControlHandler;
724
838
  if (!oPresentationControlHandler) {
725
- oLogger.error("EasyFilterBarHandler.onSortersChanged: PresentationControlHandler not found.");
839
+ oLogger.error("EasyFilterBarHandler: PresentationControlHandler not found.");
726
840
  return;
727
841
  }
728
-
842
+
729
843
  var oControl = oPresentationControlHandler.getControl();
730
844
  if (!oControl) {
731
- oLogger.error("EasyFilterBarHandler.onSortersChanged: Presentation control not found.");
845
+ oLogger.error("EasyFilterBarHandler: Presentation control not found.");
732
846
  return;
733
847
  }
734
848
 
735
849
  if (!controlHelper.isSmartTable(oControl)) {
736
- oLogger.warning("EasyFilterBarHandler.onSortersChanged: Sorting is only supported for SmartTable.");
850
+ oLogger.warning("EasyFilterBarHandler: Sorting is only supported for SmartTable.");
737
851
  return;
738
852
  }
739
-
853
+
740
854
  var oUiState = oControl.getUiState();
741
855
  var oPresentationVariant = oUiState.getPresentationVariant();
742
-
743
- oPresentationVariant.SortOrder = undefined; // Clear existing sort order before applying new one
744
856
 
745
- // Set new sort order (empty array clears sorting)
746
- const aSortersMapped = (aSorters && aSorters.length ) ? aSorters.map(function (oSorter) {
857
+ oPresentationVariant.SortOrder = undefined;
858
+ var aSortersMapped = (aSorters && aSorters.length) ? aSorters.map(function(oSorter) {
747
859
  return {
748
860
  Property: oSorter.key,
749
861
  Descending: !!oSorter.descending
@@ -757,51 +869,38 @@ sap.ui.define([
757
869
  } finally {
758
870
  bApplyingSorting = false;
759
871
  }
760
-
761
872
  } catch (error) {
762
873
  bApplyingSorting = false;
763
874
  oLogger.warning("EasyFilterBar: unexpected error while handling sortersChanged", String(error));
764
875
  }
765
- }
876
+ }
766
877
 
767
- /**
768
- * Event handler for the EasyFilter control's groupLevelsChanged event.
769
- * Applies the AI-determined group levels to the SmartTable via setUiState,
770
- * which updates the data binding and table grouping state
771
- * through the PersonalizationController.
772
- * @param {sap.ui.base.Event} oEvent The groupLevelsChanged event containing group level definitions
773
- */
774
- function fnGroupLevelsChanged(oEvent) {
878
+ function fnApplyGroupLevelsToTable(aGroupLevels) {
775
879
  try {
776
- var aGroupLevels = oEvent.getParameter("groupLevels");
777
-
778
880
  var oPresentationControlHandler = oState.oPresentationControlHandler;
779
881
  if (!oPresentationControlHandler) {
780
- oLogger.error("EasyFilterBarHandler.onGroupLevelsChanged: PresentationControlHandler not found.");
882
+ oLogger.error("EasyFilterBarHandler: PresentationControlHandler not found.");
781
883
  return;
782
884
  }
783
-
885
+
784
886
  var oControl = oPresentationControlHandler.getControl();
785
887
  if (!oControl) {
786
- oLogger.error("EasyFilterBarHandler.onGroupLevelsChanged: Presentation control not found.");
888
+ oLogger.error("EasyFilterBarHandler: Presentation control not found.");
787
889
  return;
788
890
  }
789
891
 
790
892
  if (!controlHelper.isSmartTable(oControl)) {
791
- oLogger.warning("EasyFilterBarHandler.onGroupLevelsChanged: Grouping is only supported for SmartTable.");
893
+ oLogger.warning("EasyFilterBarHandler: Grouping is only supported for SmartTable.");
792
894
  return;
793
895
  }
794
-
896
+
795
897
  var oUiState = oControl.getUiState();
796
898
  var oPresentationVariant = oUiState.getPresentationVariant();
797
-
798
- oPresentationVariant.GroupBy = undefined; // Clear existing group levels before applying new ones
799
-
800
- // SmartTable supports grouping by only one column at a time,
801
- // so we take only the first group level even if multiple are provided.
802
- oPresentationVariant.GroupBy = (aGroupLevels && aGroupLevels.length) ?
803
- aGroupLevels?.flatMap(aGroup => Object.values(aGroup)) : undefined;
804
-
899
+
900
+ oPresentationVariant.GroupBy = undefined;
901
+ oPresentationVariant.GroupBy = (aGroupLevels && aGroupLevels.length) ?
902
+ aGroupLevels.flatMap(function(aGroup) { return Object.values(aGroup); }) : undefined;
903
+
805
904
  bApplyingGrouplevels = true;
806
905
  try {
807
906
  oControl.setUiState(oUiState);
@@ -812,13 +911,13 @@ sap.ui.define([
812
911
  bApplyingGrouplevels = false;
813
912
  oLogger.warning("EasyFilterBar: unexpected error while handling groupLevelsChanged", String(error));
814
913
  }
815
- }
914
+ }
816
915
 
817
916
  /**
818
917
  * Event handler for the EasyFilter control's showValueHelp event.
819
918
  * Identifies the input field for which the value help is requested and triggers the value help opening from SFB.
820
- * @param {*} oEvent
821
- * @param {*} oState
919
+ * @param {sap.ui.base.Event} oEvent - The showValueHelp event fired by the EasyFilter control
920
+ * @param {object} oState - The current controller state object
822
921
  */
823
922
  function fnShowValueHelp(oEvent) {
824
923
  var oSmartFilterbar = oState.oSmartFilterbar;
@@ -1030,8 +1129,6 @@ sap.ui.define([
1030
1129
  onQueryChanged : fnQueryChanged,
1031
1130
  onTokensChanged: fnTokensChanged,
1032
1131
  onTokensChangedByUser: fnTokensChangedByUser,
1033
- onSortersChanged: fnSortersChanged,
1034
- onGroupLevelsChanged: fnGroupLevelsChanged,
1035
1132
  onShowValueHelp: fnShowValueHelp,
1036
1133
  onFilterChange : fnOnFilterChange,
1037
1134
  handleVariantLoad : fnHandleVariantLoad,
@@ -287,7 +287,7 @@ sap.ui.define([
287
287
  if (!isValueHelpTableAvailable) {
288
288
  // When there is no valueList associate, just return the original value in CodeList type
289
289
  aFilters.forEach(oFilter => aFinalResponse.push(getkeySpecifiedResultFromFilters(oFilter)));
290
- resolve(aFinalResponse);
290
+ return resolve(aFinalResponse);
291
291
  }
292
292
 
293
293
  // Get value help lists from metadata