@sapui5/sap.fe.macros 1.140.0 → 1.141.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 (199) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/Chart.js +53 -2
  4. package/src/sap/fe/macros/Chart.tsx +55 -0
  5. package/src/sap/fe/macros/CollaborativeDraftHandler.js +230 -0
  6. package/src/sap/fe/macros/CollaborativeDraftHandler.tsx +218 -0
  7. package/src/sap/fe/macros/CommonHelper.js +59 -15
  8. package/src/sap/fe/macros/CommonHelper.ts +65 -14
  9. package/src/sap/fe/macros/ConditionalSwitch.js +174 -0
  10. package/src/sap/fe/macros/ConditionalSwitch.tsx +141 -0
  11. package/src/sap/fe/macros/ConditionalSwitchProperty.js +78 -0
  12. package/src/sap/fe/macros/ConditionalSwitchProperty.tsx +62 -0
  13. package/src/sap/fe/macros/Field.js +14 -10
  14. package/src/sap/fe/macros/Field.ts +15 -12
  15. package/src/sap/fe/macros/MacroAPI.js +9 -4
  16. package/src/sap/fe/macros/MacroAPI.ts +9 -4
  17. package/src/sap/fe/macros/MultiValueField.js +10 -5
  18. package/src/sap/fe/macros/MultiValueField.tsx +7 -1
  19. package/src/sap/fe/macros/Page.js +5 -7
  20. package/src/sap/fe/macros/Page.tsx +4 -6
  21. package/src/sap/fe/macros/Paginator.js +9 -4
  22. package/src/sap/fe/macros/Paginator.tsx +12 -3
  23. package/src/sap/fe/macros/RichTextEditor.js +3 -2
  24. package/src/sap/fe/macros/RichTextEditor.tsx +2 -1
  25. package/src/sap/fe/macros/Status.js +38 -13
  26. package/src/sap/fe/macros/Status.tsx +26 -6
  27. package/src/sap/fe/macros/ai/EasyFillDialog.js +11 -17
  28. package/src/sap/fe/macros/ai/EasyFillDialog.tsx +11 -16
  29. package/src/sap/fe/macros/ai/EasyFilterBar.js +195 -55
  30. package/src/sap/fe/macros/ai/EasyFilterBar.tsx +234 -57
  31. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +76 -33
  32. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +89 -40
  33. package/src/sap/fe/macros/chart/Chart.js +2 -2
  34. package/src/sap/fe/macros/chart/Chart.tsx +1 -1
  35. package/src/sap/fe/macros/chart/MdcChartTemplate.js +4 -2
  36. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +4 -1
  37. package/src/sap/fe/macros/contentSwitcher/ContentSwitcher.js +9 -2
  38. package/src/sap/fe/macros/contentSwitcher/ContentSwitcher.tsx +8 -0
  39. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.js +5 -1
  40. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.ts +4 -0
  41. package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.js +2 -2
  42. package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.ts +1 -1
  43. package/src/sap/fe/macros/controls/FilterBar.js +14 -5
  44. package/src/sap/fe/macros/controls/FilterBar.ts +3 -0
  45. package/src/sap/fe/macros/controls/RadioButtons.js +61 -38
  46. package/src/sap/fe/macros/controls/RadioButtons.tsx +39 -18
  47. package/src/sap/fe/macros/controls/Section.js +4 -3
  48. package/src/sap/fe/macros/controls/Section.ts +3 -2
  49. package/src/sap/fe/macros/controls/section/SubSection.js +63 -8
  50. package/src/sap/fe/macros/controls/section/SubSection.ts +67 -1
  51. package/src/sap/fe/macros/field/Field.js +2 -2
  52. package/src/sap/fe/macros/field/Field.tsx +1 -1
  53. package/src/sap/fe/macros/field/FieldFormatOptions.js +25 -2
  54. package/src/sap/fe/macros/field/FieldFormatOptions.ts +13 -0
  55. package/src/sap/fe/macros/field/FieldHelper.js +2 -2
  56. package/src/sap/fe/macros/field/FieldHelper.ts +1 -4
  57. package/src/sap/fe/macros/field/FieldTemplating.js +3 -3
  58. package/src/sap/fe/macros/field/FieldTemplating.ts +4 -2
  59. package/src/sap/fe/macros/filter/FilterUtils.js +232 -2
  60. package/src/sap/fe/macros/filter/FilterUtils.ts +290 -4
  61. package/src/sap/fe/macros/filterBar/FilterBar.block.js +5 -3
  62. package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +4 -2
  63. package/src/sap/fe/macros/filterBar/FilterBar.js +2 -2
  64. package/src/sap/fe/macros/filterBar/FilterBar.tsx +1 -1
  65. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +63 -27
  66. package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +49 -3
  67. package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +5 -3
  68. package/src/sap/fe/macros/filterBar/FilterBarDelegate.ts +5 -2
  69. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +7 -2
  70. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +6 -1
  71. package/src/sap/fe/macros/form/Form.block.js +7 -8
  72. package/src/sap/fe/macros/form/Form.block.ts +4 -6
  73. package/src/sap/fe/macros/form/FormContainer.block.js +555 -4
  74. package/src/sap/fe/macros/form/FormContainer.block.ts +665 -6
  75. package/src/sap/fe/macros/form/FormContainer.fragment.xml +1 -0
  76. package/src/sap/fe/macros/form/FormDelegate.js +6 -9
  77. package/src/sap/fe/macros/form/FormDelegate.ts +5 -8
  78. package/src/sap/fe/macros/internal/DataPoint.js +3 -2
  79. package/src/sap/fe/macros/internal/DataPoint.tsx +10 -1
  80. package/src/sap/fe/macros/internal/FilterField.block.js +16 -8
  81. package/src/sap/fe/macros/internal/FilterField.block.ts +11 -7
  82. package/src/sap/fe/macros/internal/field/DisplayStyle.js +7 -1
  83. package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +8 -0
  84. package/src/sap/fe/macros/internal/field/EditStyle.js +21 -4
  85. package/src/sap/fe/macros/internal/field/EditStyle.tsx +18 -4
  86. package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +3 -2
  87. package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +4 -1
  88. package/src/sap/fe/macros/internal/filterField/FilterFieldTemplate.fragment.xml +1 -0
  89. package/src/sap/fe/macros/internal/helpers/ActionHelper.js +36 -5
  90. package/src/sap/fe/macros/internal/helpers/ActionHelper.ts +34 -4
  91. package/src/sap/fe/macros/library.js +1 -1
  92. package/src/sap/fe/macros/mdc/adapter/StateFilterToSelectionVariant.js +2 -1
  93. package/src/sap/fe/macros/mdc/adapter/StateFilterToSelectionVariant.ts +1 -0
  94. package/src/sap/fe/macros/messagebundle.properties +20 -2
  95. package/src/sap/fe/macros/messagebundle_ar.properties +1 -1
  96. package/src/sap/fe/macros/messagebundle_bg.properties +1 -1
  97. package/src/sap/fe/macros/messagebundle_ca.properties +1 -1
  98. package/src/sap/fe/macros/messagebundle_cnr.properties +1 -1
  99. package/src/sap/fe/macros/messagebundle_cs.properties +1 -1
  100. package/src/sap/fe/macros/messagebundle_cy.properties +1 -1
  101. package/src/sap/fe/macros/messagebundle_da.properties +1 -1
  102. package/src/sap/fe/macros/messagebundle_de.properties +4 -4
  103. package/src/sap/fe/macros/messagebundle_el.properties +1 -1
  104. package/src/sap/fe/macros/messagebundle_en.properties +1 -1
  105. package/src/sap/fe/macros/messagebundle_en_GB.properties +1 -1
  106. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +1 -1
  107. package/src/sap/fe/macros/messagebundle_es.properties +2 -2
  108. package/src/sap/fe/macros/messagebundle_es_MX.properties +1 -1
  109. package/src/sap/fe/macros/messagebundle_et.properties +1 -1
  110. package/src/sap/fe/macros/messagebundle_fi.properties +1 -1
  111. package/src/sap/fe/macros/messagebundle_fr.properties +1 -1
  112. package/src/sap/fe/macros/messagebundle_fr_CA.properties +1 -1
  113. package/src/sap/fe/macros/messagebundle_hi.properties +1 -1
  114. package/src/sap/fe/macros/messagebundle_hr.properties +1 -1
  115. package/src/sap/fe/macros/messagebundle_hu.properties +1 -1
  116. package/src/sap/fe/macros/messagebundle_id.properties +5 -5
  117. package/src/sap/fe/macros/messagebundle_it.properties +1 -1
  118. package/src/sap/fe/macros/messagebundle_iw.properties +1 -1
  119. package/src/sap/fe/macros/messagebundle_ja.properties +5 -5
  120. package/src/sap/fe/macros/messagebundle_kk.properties +1 -1
  121. package/src/sap/fe/macros/messagebundle_ko.properties +2 -2
  122. package/src/sap/fe/macros/messagebundle_lt.properties +2 -2
  123. package/src/sap/fe/macros/messagebundle_lv.properties +1 -1
  124. package/src/sap/fe/macros/messagebundle_mk.properties +2 -2
  125. package/src/sap/fe/macros/messagebundle_ms.properties +1 -1
  126. package/src/sap/fe/macros/messagebundle_nl.properties +1 -1
  127. package/src/sap/fe/macros/messagebundle_no.properties +1 -1
  128. package/src/sap/fe/macros/messagebundle_pl.properties +1 -1
  129. package/src/sap/fe/macros/messagebundle_pt.properties +1 -1
  130. package/src/sap/fe/macros/messagebundle_pt_PT.properties +1 -1
  131. package/src/sap/fe/macros/messagebundle_ro.properties +1 -1
  132. package/src/sap/fe/macros/messagebundle_ru.properties +1 -1
  133. package/src/sap/fe/macros/messagebundle_sh.properties +1 -1
  134. package/src/sap/fe/macros/messagebundle_sk.properties +1 -1
  135. package/src/sap/fe/macros/messagebundle_sl.properties +1 -1
  136. package/src/sap/fe/macros/messagebundle_sr.properties +1 -1
  137. package/src/sap/fe/macros/messagebundle_sv.properties +1 -1
  138. package/src/sap/fe/macros/messagebundle_th.properties +1 -1
  139. package/src/sap/fe/macros/messagebundle_tr.properties +1 -1
  140. package/src/sap/fe/macros/messagebundle_uk.properties +1 -1
  141. package/src/sap/fe/macros/messagebundle_vi.properties +2 -2
  142. package/src/sap/fe/macros/messagebundle_zh_CN.properties +1 -1
  143. package/src/sap/fe/macros/messagebundle_zh_TW.properties +1 -1
  144. package/src/sap/fe/macros/messages/MessageButton.js +1 -1
  145. package/src/sap/fe/macros/messages/MessageButton.ts +2 -2
  146. package/src/sap/fe/macros/messages/MessagePopover.js +3 -1
  147. package/src/sap/fe/macros/messages/MessagePopover.ts +2 -0
  148. package/src/sap/fe/macros/microchart/MicroChart.js +2 -2
  149. package/src/sap/fe/macros/microchart/MicroChart.tsx +1 -1
  150. package/src/sap/fe/macros/microchart/MicroChartHelper.js +2 -2
  151. package/src/sap/fe/macros/microchart/MicroChartHelper.tsx +1 -1
  152. package/src/sap/fe/macros/table/ActionsTemplating.js +4 -8
  153. package/src/sap/fe/macros/table/ActionsTemplating.tsx +5 -8
  154. package/src/sap/fe/macros/table/BasicSearch.js +1 -1
  155. package/src/sap/fe/macros/table/BasicSearch.ts +2 -1
  156. package/src/sap/fe/macros/table/Column.js +14 -2
  157. package/src/sap/fe/macros/table/Column.ts +7 -0
  158. package/src/sap/fe/macros/table/ColumnExportSettings.js +83 -15
  159. package/src/sap/fe/macros/table/ColumnExportSettings.ts +44 -0
  160. package/src/sap/fe/macros/table/ColumnOverride.js +14 -2
  161. package/src/sap/fe/macros/table/ColumnOverride.ts +7 -0
  162. package/src/sap/fe/macros/table/MdcTableTemplate.js +5 -5
  163. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +15 -9
  164. package/src/sap/fe/macros/table/QuickFilterSelector.js +12 -3
  165. package/src/sap/fe/macros/table/QuickFilterSelector.tsx +15 -2
  166. package/src/sap/fe/macros/table/Table.block.js +188 -147
  167. package/src/sap/fe/macros/table/Table.block.tsx +41 -11
  168. package/src/sap/fe/macros/table/Table.js +16 -10
  169. package/src/sap/fe/macros/table/Table.tsx +16 -10
  170. package/src/sap/fe/macros/table/TableAPI.js +224 -184
  171. package/src/sap/fe/macros/table/TableAPI.ts +63 -19
  172. package/src/sap/fe/macros/table/TableEventHandlerProvider.js +6 -6
  173. package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +5 -4
  174. package/src/sap/fe/macros/table/TableHelper.js +2 -2
  175. package/src/sap/fe/macros/table/TableHelper.ts +1 -1
  176. package/src/sap/fe/macros/table/TreeTable.js +16 -10
  177. package/src/sap/fe/macros/table/TreeTable.tsx +16 -10
  178. package/src/sap/fe/macros/table/Utils.js +3 -2
  179. package/src/sap/fe/macros/table/Utils.ts +7 -2
  180. package/src/sap/fe/macros/table/delegates/TableDelegate.js +69 -33
  181. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +75 -32
  182. package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +10 -10
  183. package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +11 -9
  184. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +14 -12
  185. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +11 -10
  186. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +34 -4
  187. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +45 -2
  188. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.js +55 -12
  189. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.ts +71 -9
  190. package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.js +53 -2
  191. package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.ts +55 -0
  192. package/src/sap/fe/macros/table/mixin/TableExport.js +22 -3
  193. package/src/sap/fe/macros/table/mixin/TableExport.ts +25 -4
  194. package/src/sap/fe/macros/table/mixin/TableSharing.js +3 -2
  195. package/src/sap/fe/macros/table/mixin/TableSharing.ts +4 -3
  196. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +27 -10
  197. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +31 -13
  198. package/src/sap/fe/macros/visualfilters/VisualFilter.js +5 -3
  199. package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +3 -1
@@ -53,6 +53,48 @@ function _getDefaultOperators(sPropertyType?: string): string[] {
53
53
  return FilterOperatorUtil.getOperatorsForType(oBaseType);
54
54
  }
55
55
 
56
+ /**
57
+ * Helper function to check if an operator is excluded by manifest configuration.
58
+ * @param operatorName The operator name to check
59
+ * @param oSettings The settings object containing operator configuration
60
+ * @returns True if the operator is excluded, false otherwise
61
+ */
62
+ function _isOperatorExcludedByManifest(operatorName: string, oSettings: FilterSettings | undefined): boolean {
63
+ if (!oSettings?.operatorConfiguration) return false;
64
+
65
+ return oSettings.operatorConfiguration.some(
66
+ (config) => config.path === "key" && config.equals === operatorName && config.exclude === true
67
+ );
68
+ }
69
+
70
+ /**
71
+ * Helper function to get Empty/NotEmpty operators with manifest configuration support.
72
+ * @param sType The field type
73
+ * @param oSettings The settings object containing operator configuration
74
+ * @returns Array of Empty/NotEmpty operators if not excluded by manifest
75
+ */
76
+ function _getEmptyOps(sType: string, oSettings: FilterSettings | undefined): string[] {
77
+ // Only return Empty/NotEmpty for date types
78
+ if (sType !== "Edm.Date" && sType !== "Edm.DateTimeOffset") {
79
+ return [];
80
+ }
81
+
82
+ const result: string[] = [];
83
+
84
+ // Check manifest configuration and add operators in correct order (NotEmpty first to match test expectations)
85
+ const notEmptyExcluded = _isOperatorExcludedByManifest("NotEmpty", oSettings);
86
+ const emptyExcluded = _isOperatorExcludedByManifest("Empty", oSettings);
87
+
88
+ if (!notEmptyExcluded) {
89
+ result.push("NotEmpty");
90
+ }
91
+ if (!emptyExcluded) {
92
+ result.push("Empty");
93
+ }
94
+
95
+ return result;
96
+ }
97
+
56
98
  const ValueColor = mLibrary.ValueColor;
57
99
  const CommonHelper = {
58
100
  getPathToKey: function (oCtx: Context): object {
@@ -756,6 +798,7 @@ const CommonHelper = {
756
798
  * To fetch measure attribute index.
757
799
  * @param iMeasure Chart Annotations
758
800
  * @param oChartAnnotations Chart Annotations
801
+ * @param isMicroChart Whether this is a micro chart
759
802
  * @returns MeasureAttribute index.
760
803
  * @private
761
804
  */
@@ -1029,6 +1072,9 @@ const CommonHelper = {
1029
1072
  let aSemanticDateOps: string[] = [];
1030
1073
  const oSettings = settings && typeof settings === "string" ? JSON.parse(settings).customData : settings;
1031
1074
 
1075
+ // Initialize Empty/NotEmpty operators based on field type and manifest settings
1076
+ const emptyOps = _getEmptyOps(sType || "", oSettings);
1077
+
1032
1078
  if ((oContext.getObject(`${sEntitySetPath}/@com.sap.vocabularies.Common.v1.ResultContext`) as unknown) === true) {
1033
1079
  return aEqualsOps;
1034
1080
  }
@@ -1063,7 +1109,14 @@ const CommonHelper = {
1063
1109
  switch (sAllowedExpression) {
1064
1110
  case "SingleValue":
1065
1111
  const singleValueDateOps = DefaultSemanticDateOperators.getSingleValueDateOperations();
1066
- const aSingleValueOps = sType === "Edm.Date" && bSemanticDateRange ? singleValueDateOps : aEqualsOps;
1112
+ let aSingleValueOps: string[];
1113
+ if (sType === "Edm.Date" && bSemanticDateRange) {
1114
+ aSingleValueOps = [...singleValueDateOps, ...emptyOps];
1115
+ } else if (sType === "Edm.Date" || sType === "Edm.DateTimeOffset") {
1116
+ aSingleValueOps = [...aEqualsOps, ...emptyOps]; // ["EQ", "Empty", "NotEmpty"]
1117
+ } else {
1118
+ aSingleValueOps = aEqualsOps; // ["EQ"]
1119
+ }
1067
1120
  restrictions = _getRestrictions(supportedOperators, aSingleValueOps);
1068
1121
  break;
1069
1122
  case "MultiValue":
@@ -1072,24 +1125,22 @@ const CommonHelper = {
1072
1125
  break;
1073
1126
  case "SingleRange":
1074
1127
  let aExpressionOps: string[];
1075
- if (bSemanticDateRange) {
1076
- if (sType === "Edm.Date") {
1077
- aExpressionOps = aSemanticDateOps;
1078
- } else if (sType === "Edm.DateTimeOffset") {
1079
- aExpressionOps = aSemanticDateOps;
1080
- } else {
1081
- aExpressionOps = aSingleRangeOps;
1082
- }
1128
+ if (bSemanticDateRange && (sType === "Edm.Date" || sType === "Edm.DateTimeOffset")) {
1129
+ // Only Edm.Date and Edm.DateTimeOffset get semantic operators
1130
+ aExpressionOps = [...aSemanticDateOps, ...emptyOps];
1083
1131
  } else if (sType === "Edm.DateTimeOffset") {
1084
- aExpressionOps = aSingleRangeDTBasicOps;
1132
+ aExpressionOps = [...aSingleRangeDTBasicOps, ...emptyOps];
1133
+ } else if (sType === "Edm.Date") {
1134
+ aExpressionOps = [...aSingleRangeOps, ...emptyOps];
1085
1135
  } else {
1086
1136
  aExpressionOps = aSingleRangeOps;
1087
1137
  }
1088
- const sOperators = _getRestrictions(supportedOperators, aExpressionOps);
1089
- restrictions = sOperators;
1138
+ restrictions = _getRestrictions(supportedOperators, aExpressionOps);
1090
1139
  break;
1091
1140
  case "MultiRange":
1092
- restrictions = _getRestrictions(supportedOperators, aMultiRangeOps);
1141
+ const multiRangeOps =
1142
+ sType === "Edm.Date" || sType === "Edm.DateTimeOffset" ? [...aMultiRangeOps, ...emptyOps] : aMultiRangeOps;
1143
+ restrictions = _getRestrictions(supportedOperators, multiRangeOps);
1093
1144
  break;
1094
1145
  case "SearchExpression":
1095
1146
  restrictions = _getRestrictions(supportedOperators, aSearchExpressionOps);
@@ -1109,7 +1160,7 @@ const CommonHelper = {
1109
1160
  // In case AllowedExpressions is not provided for type Edm.Date then all the default
1110
1161
  // operators for the type should be returned excluding semantic operators from the list.
1111
1162
  const aDefaultOperators = _getDefaultOperators(propertyType);
1112
- const aMultiRangeOps = ["EQ", "GE", "LE", "LT", "GT", "BT", "NE", "NOTBT", "NOTLE", "NOTLT", "NOTGE", "NOTGT"];
1163
+ const aMultiRangeOps = ["EQ", "GE", "LE", "LT", "GT", "BT", "NE", "NOTBT", "NOTLE", "NOTLT", "NOTGE", "NOTGT", "Empty", "NotEmpty"];
1113
1164
  return _getRestrictions(aDefaultOperators, aMultiRangeOps);
1114
1165
  },
1115
1166
  getAIIcon: function (): string {
@@ -0,0 +1,174 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/base/BuildingBlockBase", "sap/fe/base/ClassSupport"], function (BuildingBlockBase, ClassSupport) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4;
9
+ var _exports = {};
10
+ var property = ClassSupport.property;
11
+ var implementInterface = ClassSupport.implementInterface;
12
+ var defineUI5Class = ClassSupport.defineUI5Class;
13
+ var aggregation = ClassSupport.aggregation;
14
+ function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
15
+ function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
16
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
17
+ function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
18
+ function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
19
+ /**
20
+ * Defines a conditional template that renders content based on the evaluation of a set of switchProperties.
21
+ * The switchProperties are defined using the {@link sap.fe.macros.ConditionalSwitchProperty} building block.
22
+ * @public
23
+ * @since 1.141.0
24
+ * @ui5-experimental-since 1.141.0
25
+ */
26
+ let ConditionalSwitch = (_dec = defineUI5Class("sap.fe.macros.ConditionalSwitch"), _dec2 = implementInterface("sap.ui.core.IFormContent"), _dec3 = aggregation({
27
+ type: "sap.ui.core.IFormContent",
28
+ isDefault: false
29
+ }), _dec4 = aggregation({
30
+ type: "sap.fe.macros.ConditionalSwitchProperty",
31
+ isDefault: true,
32
+ multiple: true,
33
+ singularName: "switchProperty"
34
+ }), _dec5 = property({
35
+ type: "function"
36
+ }), _dec(_class = (_class2 = /*#__PURE__*/function (_BuildingBlockBase) {
37
+ function ConditionalSwitch(idOrSettings, settings, scope) {
38
+ var _this;
39
+ _this = _BuildingBlockBase.call(this, idOrSettings, settings, scope) || this;
40
+ _initializerDefineProperty(_this, "__implements__sap_ui_core_IFormContent", _descriptor, _this);
41
+ _initializerDefineProperty(_this, "content", _descriptor2, _this);
42
+ _initializerDefineProperty(_this, "switchProperties", _descriptor3, _this);
43
+ /**
44
+ * A function that returns the content to be rendered based on the evaluation of the switchProperties.
45
+ * The function receives an object with the switchProperties as key-value pairs, the binding context, and the displayed control.
46
+ * The function should return a single UI5 control.
47
+ * @public
48
+ */
49
+ _initializerDefineProperty(_this, "factory", _descriptor4, _this);
50
+ /**
51
+ * Time in milliseconds to debounce content creation calls.
52
+ * We use a debounce function to avoid multiple calls in quick succession when multiple switchProperties are changed at once.
53
+ * @private
54
+ */
55
+ _this.DEBOUNCE_TIME = 200;
56
+ return _this;
57
+ }
58
+ _exports = ConditionalSwitch;
59
+ _inheritsLoose(ConditionalSwitch, _BuildingBlockBase);
60
+ var _proto = ConditionalSwitch.prototype;
61
+ /**
62
+ * Debounced content creation to avoid multiple calls in quick succession.
63
+ * This is useful when multiple switchProperties are changed at once.
64
+ */
65
+ _proto._createContentDebounced = function _createContentDebounced() {
66
+ if (this._createDebounceTimer !== undefined) {
67
+ clearTimeout(this._createDebounceTimer);
68
+ }
69
+ this._createDebounceTimer = window.setTimeout(() => {
70
+ this._createContent();
71
+ }, this.DEBOUNCE_TIME);
72
+ }
73
+
74
+ /**
75
+ * Creates the content based on the current switchProperties and the factory function.
76
+ * If no factory function is provided, the content will be empty.
77
+ */;
78
+ _proto._createContent = function _createContent() {
79
+ if (this.factory) {
80
+ const switchProperties = this.switchProperties.reduce((reducer, prop) => {
81
+ reducer[prop.key] = prop.value;
82
+ return reducer;
83
+ }, {});
84
+ const oldContent = this.content;
85
+ const newContent = this.factory.call(this, switchProperties, this.getBindingContext(), this.content);
86
+ if (newContent !== oldContent) {
87
+ oldContent?.destroy();
88
+ this.content = newContent;
89
+ }
90
+ if (this.ariaLabelledBy !== undefined) {
91
+ this.content?.addAssociation("ariaLabelledBy", this.ariaLabelledBy.join(","));
92
+ }
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Overrides the addAssociation method to propagate ariaLabelledBy associations to the content.
98
+ * @param sAssociationName The name of the association
99
+ * @param sId The ID of the associated control or the control instance
100
+ * @param bSuppressInvalidate Whether to suppress invalidation
101
+ * @returns The current instance for method chaining
102
+ */;
103
+ _proto.addAssociation = function addAssociation(sAssociationName, sId, bSuppressInvalidate) {
104
+ _BuildingBlockBase.prototype.addAssociation.call(this, sAssociationName, sId, bSuppressInvalidate);
105
+ if (sAssociationName === "ariaLabelledBy" && this.content) {
106
+ this.content.addAssociation("ariaLabelledBy", sId);
107
+ }
108
+ return this;
109
+ }
110
+
111
+ /**
112
+ * Adds a ConditionalSwitchProperty to the 'switchProperties' aggregation and attaches a change listener to it.
113
+ * The change listener will trigger a content re-creation when the property value changes.
114
+ * @param conditionalSwitchProperty
115
+ * @returns The current instance for method chaining.
116
+ */;
117
+ _proto.addSwitchProperty = function addSwitchProperty(conditionalSwitchProperty) {
118
+ _BuildingBlockBase.prototype.addAggregation.call(this, "switchProperties", conditionalSwitchProperty);
119
+ if (!this.fnBoundDebounced) {
120
+ // Bind the debounced content creation method to the instance
121
+ this.fnBoundDebounced = this._createContentDebounced.bind(this);
122
+ }
123
+ conditionalSwitchProperty.attachEvent("valueChanged", this.fnBoundDebounced);
124
+ this._createContentDebounced();
125
+ return this;
126
+ }
127
+
128
+ /**
129
+ * Removes a ConditionalSwitchProperty from the 'switchProperties' aggregation and detaches its change listener.
130
+ * @param vIndex The index, ID, or instance of the ConditionalSwitchProperty to remove.
131
+ * @returns The removed ConditionalSwitchProperty instance or null if not found.
132
+ */;
133
+ _proto.removeSwitchProperty = function removeSwitchProperty(vIndex) {
134
+ const conditionalSwitchProperty = _BuildingBlockBase.prototype.removeAggregation.call(this, "switchProperties", vIndex);
135
+ if (conditionalSwitchProperty !== null && this.fnBoundDebounced) {
136
+ conditionalSwitchProperty.detachEvent("valueChanged", this.fnBoundDebounced);
137
+ }
138
+ this._createContentDebounced();
139
+ return conditionalSwitchProperty;
140
+ }
141
+
142
+ // #region IFormContent
143
+ ;
144
+ _proto.getFormDoNotAdjustWidth = function getFormDoNotAdjustWidth() {
145
+ return this.content?.getFormDoNotAdjustWidth?.() ?? false;
146
+ };
147
+ return ConditionalSwitch;
148
+ }(BuildingBlockBase), _descriptor = _applyDecoratedDescriptor(_class2.prototype, "__implements__sap_ui_core_IFormContent", [_dec2], {
149
+ configurable: true,
150
+ enumerable: true,
151
+ writable: true,
152
+ initializer: function () {
153
+ return true;
154
+ }
155
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "content", [_dec3], {
156
+ configurable: true,
157
+ enumerable: true,
158
+ writable: true,
159
+ initializer: null
160
+ }), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "switchProperties", [_dec4], {
161
+ configurable: true,
162
+ enumerable: true,
163
+ writable: true,
164
+ initializer: null
165
+ }), _descriptor4 = _applyDecoratedDescriptor(_class2.prototype, "factory", [_dec5], {
166
+ configurable: true,
167
+ enumerable: true,
168
+ writable: true,
169
+ initializer: null
170
+ }), _class2)) || _class);
171
+ _exports = ConditionalSwitch;
172
+ return _exports;
173
+ }, false);
174
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb25kaXRpb25hbFN3aXRjaCIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwiaW1wbGVtZW50SW50ZXJmYWNlIiwiX2RlYzMiLCJhZ2dyZWdhdGlvbiIsInR5cGUiLCJpc0RlZmF1bHQiLCJfZGVjNCIsIm11bHRpcGxlIiwic2luZ3VsYXJOYW1lIiwiX2RlYzUiLCJwcm9wZXJ0eSIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQnVpbGRpbmdCbG9ja0Jhc2UiLCJpZE9yU2V0dGluZ3MiLCJzZXR0aW5ncyIsInNjb3BlIiwiX3RoaXMiLCJjYWxsIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJfZGVzY3JpcHRvciIsIl9kZXNjcmlwdG9yMiIsIl9kZXNjcmlwdG9yMyIsIl9kZXNjcmlwdG9yNCIsIkRFQk9VTkNFX1RJTUUiLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiX2NyZWF0ZUNvbnRlbnREZWJvdW5jZWQiLCJfY3JlYXRlRGVib3VuY2VUaW1lciIsInVuZGVmaW5lZCIsImNsZWFyVGltZW91dCIsIndpbmRvdyIsInNldFRpbWVvdXQiLCJfY3JlYXRlQ29udGVudCIsImZhY3RvcnkiLCJzd2l0Y2hQcm9wZXJ0aWVzIiwicmVkdWNlIiwicmVkdWNlciIsInByb3AiLCJrZXkiLCJ2YWx1ZSIsIm9sZENvbnRlbnQiLCJjb250ZW50IiwibmV3Q29udGVudCIsImdldEJpbmRpbmdDb250ZXh0IiwiZGVzdHJveSIsImFyaWFMYWJlbGxlZEJ5IiwiYWRkQXNzb2NpYXRpb24iLCJqb2luIiwic0Fzc29jaWF0aW9uTmFtZSIsInNJZCIsImJTdXBwcmVzc0ludmFsaWRhdGUiLCJhZGRTd2l0Y2hQcm9wZXJ0eSIsImNvbmRpdGlvbmFsU3dpdGNoUHJvcGVydHkiLCJhZGRBZ2dyZWdhdGlvbiIsImZuQm91bmREZWJvdW5jZWQiLCJiaW5kIiwiYXR0YWNoRXZlbnQiLCJyZW1vdmVTd2l0Y2hQcm9wZXJ0eSIsInZJbmRleCIsInJlbW92ZUFnZ3JlZ2F0aW9uIiwiZGV0YWNoRXZlbnQiLCJnZXRGb3JtRG9Ob3RBZGp1c3RXaWR0aCIsIkJ1aWxkaW5nQmxvY2tCYXNlIiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImluaXRpYWxpemVyIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJDb25kaXRpb25hbFN3aXRjaC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJ1aWxkaW5nQmxvY2tCYXNlIGZyb20gXCJzYXAvZmUvYmFzZS9CdWlsZGluZ0Jsb2NrQmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0aWVzT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGlvbiwgZGVmaW5lVUk1Q2xhc3MsIGltcGxlbWVudEludGVyZmFjZSwgcHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSBDb25kaXRpb25hbFN3aXRjaFByb3BlcnR5IGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbmRpdGlvbmFsU3dpdGNoUHJvcGVydHlcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgSUZvcm1Db250ZW50IH0gZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcblxuLyoqXG4gKiBEZWZpbmVzIGEgY29uZGl0aW9uYWwgdGVtcGxhdGUgdGhhdCByZW5kZXJzIGNvbnRlbnQgYmFzZWQgb24gdGhlIGV2YWx1YXRpb24gb2YgYSBzZXQgb2Ygc3dpdGNoUHJvcGVydGllcy5cbiAqIFRoZSBzd2l0Y2hQcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSB7QGxpbmsgc2FwLmZlLm1hY3Jvcy5Db25kaXRpb25hbFN3aXRjaFByb3BlcnR5fSBidWlsZGluZyBibG9jay5cbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSAxLjE0MS4wXG4gKiBAdWk1LWV4cGVyaW1lbnRhbC1zaW5jZSAxLjE0MS4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5tYWNyb3MuQ29uZGl0aW9uYWxTd2l0Y2hcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmRpdGlvbmFsU3dpdGNoIGV4dGVuZHMgQnVpbGRpbmdCbG9ja0Jhc2UgaW1wbGVtZW50cyBJRm9ybUNvbnRlbnQge1xuXHRAaW1wbGVtZW50SW50ZXJmYWNlKFwic2FwLnVpLmNvcmUuSUZvcm1Db250ZW50XCIpXG5cdF9faW1wbGVtZW50c19fc2FwX3VpX2NvcmVfSUZvcm1Db250ZW50ID0gdHJ1ZTtcblxuXHRAYWdncmVnYXRpb24oeyB0eXBlOiBcInNhcC51aS5jb3JlLklGb3JtQ29udGVudFwiLCBpc0RlZmF1bHQ6IGZhbHNlIH0pXG5cdGNvbnRlbnQ/OiBDb250cm9sO1xuXG5cdEBhZ2dyZWdhdGlvbih7IHR5cGU6IFwic2FwLmZlLm1hY3Jvcy5Db25kaXRpb25hbFN3aXRjaFByb3BlcnR5XCIsIGlzRGVmYXVsdDogdHJ1ZSwgbXVsdGlwbGU6IHRydWUsIHNpbmd1bGFyTmFtZTogXCJzd2l0Y2hQcm9wZXJ0eVwiIH0pXG5cdHN3aXRjaFByb3BlcnRpZXMhOiBDb25kaXRpb25hbFN3aXRjaFByb3BlcnR5W107XG5cblx0LyoqXG5cdCAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBjb250ZW50IHRvIGJlIHJlbmRlcmVkIGJhc2VkIG9uIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBzd2l0Y2hQcm9wZXJ0aWVzLlxuXHQgKiBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHN3aXRjaFByb3BlcnRpZXMgYXMga2V5LXZhbHVlIHBhaXJzLCB0aGUgYmluZGluZyBjb250ZXh0LCBhbmQgdGhlIGRpc3BsYXllZCBjb250cm9sLlxuXHQgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIHNpbmdsZSBVSTUgY29udHJvbC5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHByb3BlcnR5KHsgdHlwZTogXCJmdW5jdGlvblwiIH0pXG5cdGZhY3Rvcnk/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIF9jcmVhdGVEZWJvdW5jZVRpbWVyPzogbnVtYmVyO1xuXG5cdHByaXZhdGUgZm5Cb3VuZERlYm91bmNlZD86IEZ1bmN0aW9uO1xuXG5cdGNvbnN0cnVjdG9yKGlkT3JTZXR0aW5ncz86IHN0cmluZyB8IFByb3BlcnRpZXNPZjxDb25kaXRpb25hbFN3aXRjaD4sIHNldHRpbmdzPzogUHJvcGVydGllc09mPENvbmRpdGlvbmFsU3dpdGNoPiwgc2NvcGU/OiBvYmplY3QpIHtcblx0XHRzdXBlcihpZE9yU2V0dGluZ3MsIHNldHRpbmdzLCBzY29wZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZGVib3VuY2UgY29udGVudCBjcmVhdGlvbiBjYWxscy5cblx0ICogV2UgdXNlIGEgZGVib3VuY2UgZnVuY3Rpb24gdG8gYXZvaWQgbXVsdGlwbGUgY2FsbHMgaW4gcXVpY2sgc3VjY2Vzc2lvbiB3aGVuIG11bHRpcGxlIHN3aXRjaFByb3BlcnRpZXMgYXJlIGNoYW5nZWQgYXQgb25jZS5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgcmVhZG9ubHkgREVCT1VOQ0VfVElNRSA9IDIwMDtcblxuXHQvKipcblx0ICogRGVib3VuY2VkIGNvbnRlbnQgY3JlYXRpb24gdG8gYXZvaWQgbXVsdGlwbGUgY2FsbHMgaW4gcXVpY2sgc3VjY2Vzc2lvbi5cblx0ICogVGhpcyBpcyB1c2VmdWwgd2hlbiBtdWx0aXBsZSBzd2l0Y2hQcm9wZXJ0aWVzIGFyZSBjaGFuZ2VkIGF0IG9uY2UuXG5cdCAqL1xuXHRfY3JlYXRlQ29udGVudERlYm91bmNlZCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fY3JlYXRlRGVib3VuY2VUaW1lciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5fY3JlYXRlRGVib3VuY2VUaW1lcik7XG5cdFx0fVxuXHRcdHRoaXMuX2NyZWF0ZURlYm91bmNlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLl9jcmVhdGVDb250ZW50KCk7XG5cdFx0fSwgdGhpcy5ERUJPVU5DRV9USU1FKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBjb250ZW50IGJhc2VkIG9uIHRoZSBjdXJyZW50IHN3aXRjaFByb3BlcnRpZXMgYW5kIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLlxuXHQgKiBJZiBubyBmYWN0b3J5IGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB0aGUgY29udGVudCB3aWxsIGJlIGVtcHR5LlxuXHQgKi9cblx0cHJpdmF0ZSBfY3JlYXRlQ29udGVudCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5mYWN0b3J5KSB7XG5cdFx0XHRjb25zdCBzd2l0Y2hQcm9wZXJ0aWVzOiBvYmplY3QgPSB0aGlzLnN3aXRjaFByb3BlcnRpZXMucmVkdWNlKFxuXHRcdFx0XHQocmVkdWNlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHByb3A6IENvbmRpdGlvbmFsU3dpdGNoUHJvcGVydHkpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG5cdFx0XHRcdFx0cmVkdWNlcltwcm9wLmtleV0gPSBwcm9wLnZhbHVlO1xuXHRcdFx0XHRcdHJldHVybiByZWR1Y2VyO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3Qgb2xkQ29udGVudCA9IHRoaXMuY29udGVudDtcblx0XHRcdGNvbnN0IG5ld0NvbnRlbnQgPSB0aGlzLmZhY3RvcnkuY2FsbCh0aGlzLCBzd2l0Y2hQcm9wZXJ0aWVzLCB0aGlzLmdldEJpbmRpbmdDb250ZXh0KCksIHRoaXMuY29udGVudCk7XG5cdFx0XHRpZiAobmV3Q29udGVudCAhPT0gb2xkQ29udGVudCkge1xuXHRcdFx0XHRvbGRDb250ZW50Py5kZXN0cm95KCk7XG5cdFx0XHRcdHRoaXMuY29udGVudCA9IG5ld0NvbnRlbnQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5hcmlhTGFiZWxsZWRCeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuY29udGVudD8uYWRkQXNzb2NpYXRpb24oXCJhcmlhTGFiZWxsZWRCeVwiLCB0aGlzLmFyaWFMYWJlbGxlZEJ5LmpvaW4oXCIsXCIpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogT3ZlcnJpZGVzIHRoZSBhZGRBc3NvY2lhdGlvbiBtZXRob2QgdG8gcHJvcGFnYXRlIGFyaWFMYWJlbGxlZEJ5IGFzc29jaWF0aW9ucyB0byB0aGUgY29udGVudC5cblx0ICogQHBhcmFtIHNBc3NvY2lhdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFzc29jaWF0aW9uXG5cdCAqIEBwYXJhbSBzSWQgVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIGNvbnRyb2wgb3IgdGhlIGNvbnRyb2wgaW5zdGFuY2Vcblx0ICogQHBhcmFtIGJTdXBwcmVzc0ludmFsaWRhdGUgV2hldGhlciB0byBzdXBwcmVzcyBpbnZhbGlkYXRpb25cblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZ1xuXHQgKi9cblx0b3ZlcnJpZGUgYWRkQXNzb2NpYXRpb24oc0Fzc29jaWF0aW9uTmFtZTogc3RyaW5nLCBzSWQ6IHN0cmluZyB8IE1hbmFnZWRPYmplY3QsIGJTdXBwcmVzc0ludmFsaWRhdGU/OiBib29sZWFuKTogdGhpcyB7XG5cdFx0c3VwZXIuYWRkQXNzb2NpYXRpb24oc0Fzc29jaWF0aW9uTmFtZSwgc0lkLCBiU3VwcHJlc3NJbnZhbGlkYXRlKTtcblx0XHRpZiAoc0Fzc29jaWF0aW9uTmFtZSA9PT0gXCJhcmlhTGFiZWxsZWRCeVwiICYmIHRoaXMuY29udGVudCkge1xuXHRcdFx0dGhpcy5jb250ZW50LmFkZEFzc29jaWF0aW9uKFwiYXJpYUxhYmVsbGVkQnlcIiwgc0lkKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIENvbmRpdGlvbmFsU3dpdGNoUHJvcGVydHkgdG8gdGhlICdzd2l0Y2hQcm9wZXJ0aWVzJyBhZ2dyZWdhdGlvbiBhbmQgYXR0YWNoZXMgYSBjaGFuZ2UgbGlzdGVuZXIgdG8gaXQuXG5cdCAqIFRoZSBjaGFuZ2UgbGlzdGVuZXIgd2lsbCB0cmlnZ2VyIGEgY29udGVudCByZS1jcmVhdGlvbiB3aGVuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VzLlxuXHQgKiBAcGFyYW0gY29uZGl0aW9uYWxTd2l0Y2hQcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuXHQgKi9cblx0YWRkU3dpdGNoUHJvcGVydHkoY29uZGl0aW9uYWxTd2l0Y2hQcm9wZXJ0eTogQ29uZGl0aW9uYWxTd2l0Y2hQcm9wZXJ0eSk6IHRoaXMge1xuXHRcdHN1cGVyLmFkZEFnZ3JlZ2F0aW9uKFwic3dpdGNoUHJvcGVydGllc1wiLCBjb25kaXRpb25hbFN3aXRjaFByb3BlcnR5KTtcblx0XHRpZiAoIXRoaXMuZm5Cb3VuZERlYm91bmNlZCkge1xuXHRcdFx0Ly8gQmluZCB0aGUgZGVib3VuY2VkIGNvbnRlbnQgY3JlYXRpb24gbWV0aG9kIHRvIHRoZSBpbnN0YW5jZVxuXHRcdFx0dGhpcy5mbkJvdW5kRGVib3VuY2VkID0gdGhpcy5fY3JlYXRlQ29udGVudERlYm91bmNlZC5iaW5kKHRoaXMpO1xuXHRcdH1cblx0XHRjb25kaXRpb25hbFN3aXRjaFByb3BlcnR5LmF0dGFjaEV2ZW50KFwidmFsdWVDaGFuZ2VkXCIsIHRoaXMuZm5Cb3VuZERlYm91bmNlZCk7XG5cdFx0dGhpcy5fY3JlYXRlQ29udGVudERlYm91bmNlZCgpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBDb25kaXRpb25hbFN3aXRjaFByb3BlcnR5IGZyb20gdGhlICdzd2l0Y2hQcm9wZXJ0aWVzJyBhZ2dyZWdhdGlvbiBhbmQgZGV0YWNoZXMgaXRzIGNoYW5nZSBsaXN0ZW5lci5cblx0ICogQHBhcmFtIHZJbmRleCBUaGUgaW5kZXgsIElELCBvciBpbnN0YW5jZSBvZiB0aGUgQ29uZGl0aW9uYWxTd2l0Y2hQcm9wZXJ0eSB0byByZW1vdmUuXG5cdCAqIEByZXR1cm5zIFRoZSByZW1vdmVkIENvbmRpdGlvbmFsU3dpdGNoUHJvcGVydHkgaW5zdGFuY2Ugb3IgbnVsbCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRyZW1vdmVTd2l0Y2hQcm9wZXJ0eSh2SW5kZXg6IG51bWJlciB8IHN0cmluZyB8IENvbmRpdGlvbmFsU3dpdGNoUHJvcGVydHkpOiBDb25kaXRpb25hbFN3aXRjaFByb3BlcnR5IHwgbnVsbCB7XG5cdFx0Y29uc3QgY29uZGl0aW9uYWxTd2l0Y2hQcm9wZXJ0eSA9IHN1cGVyLnJlbW92ZUFnZ3JlZ2F0aW9uKFwic3dpdGNoUHJvcGVydGllc1wiLCB2SW5kZXgpIGFzIENvbmRpdGlvbmFsU3dpdGNoUHJvcGVydHkgfCBudWxsO1xuXHRcdGlmIChjb25kaXRpb25hbFN3aXRjaFByb3BlcnR5ICE9PSBudWxsICYmIHRoaXMuZm5Cb3VuZERlYm91bmNlZCkge1xuXHRcdFx0Y29uZGl0aW9uYWxTd2l0Y2hQcm9wZXJ0eS5kZXRhY2hFdmVudChcInZhbHVlQ2hhbmdlZFwiLCB0aGlzLmZuQm91bmREZWJvdW5jZWQpO1xuXHRcdH1cblx0XHR0aGlzLl9jcmVhdGVDb250ZW50RGVib3VuY2VkKCk7XG5cdFx0cmV0dXJuIGNvbmRpdGlvbmFsU3dpdGNoUHJvcGVydHk7XG5cdH1cblxuXHQvLyAjcmVnaW9uIElGb3JtQ29udGVudFxuXG5cdGdldEZvcm1Eb05vdEFkanVzdFdpZHRoKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAodGhpcy5jb250ZW50IGFzIHVua25vd24gYXMgSUZvcm1Db250ZW50KT8uZ2V0Rm9ybURvTm90QWRqdXN0V2lkdGg/LigpID8/IGZhbHNlO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkEsSUFRcUJBLGlCQUFpQixJQUFBQyxJQUFBLEdBRHJDQyxjQUFjLENBQUMsaUNBQWlDLENBQUMsRUFBQUMsS0FBQSxHQUVoREMsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsRUFBQUMsS0FBQSxHQUc5Q0MsV0FBVyxDQUFDO0lBQUVDLElBQUksRUFBRSwwQkFBMEI7SUFBRUMsU0FBUyxFQUFFO0VBQU0sQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FHbkVILFdBQVcsQ0FBQztJQUFFQyxJQUFJLEVBQUUseUNBQXlDO0lBQUVDLFNBQVMsRUFBRSxJQUFJO0lBQUVFLFFBQVEsRUFBRSxJQUFJO0lBQUVDLFlBQVksRUFBRTtFQUFpQixDQUFDLENBQUMsRUFBQUMsS0FBQSxHQVNqSUMsUUFBUSxDQUFDO0lBQUVOLElBQUksRUFBRTtFQUFXLENBQUMsQ0FBQyxFQUFBTixJQUFBLENBQUFhLE1BQUEsSUFBQUMsT0FBQSwwQkFBQUMsa0JBQUE7SUFPL0IsU0FBQWhCLGtCQUFZaUIsWUFBdUQsRUFBRUMsUUFBMEMsRUFBRUMsS0FBYyxFQUFFO01BQUEsSUFBQUMsS0FBQTtNQUNoSUEsS0FBQSxHQUFBSixrQkFBQSxDQUFBSyxJQUFBLE9BQU1KLFlBQVksRUFBRUMsUUFBUSxFQUFFQyxLQUFLLENBQUM7TUFBQ0csMEJBQUEsQ0FBQUYsS0FBQSw0Q0FBQUcsV0FBQSxFQUFBSCxLQUFBO01BQUFFLDBCQUFBLENBQUFGLEtBQUEsYUFBQUksWUFBQSxFQUFBSixLQUFBO01BQUFFLDBCQUFBLENBQUFGLEtBQUEsc0JBQUFLLFlBQUEsRUFBQUwsS0FBQTtNQWR0QztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFMQ0UsMEJB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
@@ -0,0 +1,141 @@
1
+ import BuildingBlockBase from "sap/fe/base/BuildingBlockBase";
2
+ import type { PropertiesOf } from "sap/fe/base/ClassSupport";
3
+ import { aggregation, defineUI5Class, implementInterface, property } from "sap/fe/base/ClassSupport";
4
+ import type ConditionalSwitchProperty from "sap/fe/macros/ConditionalSwitchProperty";
5
+ import type ManagedObject from "sap/ui/base/ManagedObject";
6
+ import type Control from "sap/ui/core/Control";
7
+ import type { IFormContent } from "sap/ui/core/library";
8
+
9
+ /**
10
+ * Defines a conditional template that renders content based on the evaluation of a set of switchProperties.
11
+ * The switchProperties are defined using the {@link sap.fe.macros.ConditionalSwitchProperty} building block.
12
+ * @public
13
+ * @since 1.141.0
14
+ * @ui5-experimental-since 1.141.0
15
+ */
16
+ @defineUI5Class("sap.fe.macros.ConditionalSwitch")
17
+ export default class ConditionalSwitch extends BuildingBlockBase implements IFormContent {
18
+ @implementInterface("sap.ui.core.IFormContent")
19
+ __implements__sap_ui_core_IFormContent = true;
20
+
21
+ @aggregation({ type: "sap.ui.core.IFormContent", isDefault: false })
22
+ content?: Control;
23
+
24
+ @aggregation({ type: "sap.fe.macros.ConditionalSwitchProperty", isDefault: true, multiple: true, singularName: "switchProperty" })
25
+ switchProperties!: ConditionalSwitchProperty[];
26
+
27
+ /**
28
+ * A function that returns the content to be rendered based on the evaluation of the switchProperties.
29
+ * The function receives an object with the switchProperties as key-value pairs, the binding context, and the displayed control.
30
+ * The function should return a single UI5 control.
31
+ * @public
32
+ */
33
+ @property({ type: "function" })
34
+ factory?: Function;
35
+
36
+ private _createDebounceTimer?: number;
37
+
38
+ private fnBoundDebounced?: Function;
39
+
40
+ constructor(idOrSettings?: string | PropertiesOf<ConditionalSwitch>, settings?: PropertiesOf<ConditionalSwitch>, scope?: object) {
41
+ super(idOrSettings, settings, scope);
42
+ }
43
+
44
+ /**
45
+ * Time in milliseconds to debounce content creation calls.
46
+ * We use a debounce function to avoid multiple calls in quick succession when multiple switchProperties are changed at once.
47
+ * @private
48
+ */
49
+ private readonly DEBOUNCE_TIME = 200;
50
+
51
+ /**
52
+ * Debounced content creation to avoid multiple calls in quick succession.
53
+ * This is useful when multiple switchProperties are changed at once.
54
+ */
55
+ _createContentDebounced(): void {
56
+ if (this._createDebounceTimer !== undefined) {
57
+ clearTimeout(this._createDebounceTimer);
58
+ }
59
+ this._createDebounceTimer = window.setTimeout(() => {
60
+ this._createContent();
61
+ }, this.DEBOUNCE_TIME);
62
+ }
63
+
64
+ /**
65
+ * Creates the content based on the current switchProperties and the factory function.
66
+ * If no factory function is provided, the content will be empty.
67
+ */
68
+ private _createContent(): void {
69
+ if (this.factory) {
70
+ const switchProperties: object = this.switchProperties.reduce(
71
+ (reducer: Record<string, unknown>, prop: ConditionalSwitchProperty): Record<string, unknown> => {
72
+ reducer[prop.key] = prop.value;
73
+ return reducer;
74
+ },
75
+ {} as Record<string, unknown>
76
+ );
77
+
78
+ const oldContent = this.content;
79
+ const newContent = this.factory.call(this, switchProperties, this.getBindingContext(), this.content);
80
+ if (newContent !== oldContent) {
81
+ oldContent?.destroy();
82
+ this.content = newContent;
83
+ }
84
+ if (this.ariaLabelledBy !== undefined) {
85
+ this.content?.addAssociation("ariaLabelledBy", this.ariaLabelledBy.join(","));
86
+ }
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Overrides the addAssociation method to propagate ariaLabelledBy associations to the content.
92
+ * @param sAssociationName The name of the association
93
+ * @param sId The ID of the associated control or the control instance
94
+ * @param bSuppressInvalidate Whether to suppress invalidation
95
+ * @returns The current instance for method chaining
96
+ */
97
+ override addAssociation(sAssociationName: string, sId: string | ManagedObject, bSuppressInvalidate?: boolean): this {
98
+ super.addAssociation(sAssociationName, sId, bSuppressInvalidate);
99
+ if (sAssociationName === "ariaLabelledBy" && this.content) {
100
+ this.content.addAssociation("ariaLabelledBy", sId);
101
+ }
102
+ return this;
103
+ }
104
+
105
+ /**
106
+ * Adds a ConditionalSwitchProperty to the 'switchProperties' aggregation and attaches a change listener to it.
107
+ * The change listener will trigger a content re-creation when the property value changes.
108
+ * @param conditionalSwitchProperty
109
+ * @returns The current instance for method chaining.
110
+ */
111
+ addSwitchProperty(conditionalSwitchProperty: ConditionalSwitchProperty): this {
112
+ super.addAggregation("switchProperties", conditionalSwitchProperty);
113
+ if (!this.fnBoundDebounced) {
114
+ // Bind the debounced content creation method to the instance
115
+ this.fnBoundDebounced = this._createContentDebounced.bind(this);
116
+ }
117
+ conditionalSwitchProperty.attachEvent("valueChanged", this.fnBoundDebounced);
118
+ this._createContentDebounced();
119
+ return this;
120
+ }
121
+
122
+ /**
123
+ * Removes a ConditionalSwitchProperty from the 'switchProperties' aggregation and detaches its change listener.
124
+ * @param vIndex The index, ID, or instance of the ConditionalSwitchProperty to remove.
125
+ * @returns The removed ConditionalSwitchProperty instance or null if not found.
126
+ */
127
+ removeSwitchProperty(vIndex: number | string | ConditionalSwitchProperty): ConditionalSwitchProperty | null {
128
+ const conditionalSwitchProperty = super.removeAggregation("switchProperties", vIndex) as ConditionalSwitchProperty | null;
129
+ if (conditionalSwitchProperty !== null && this.fnBoundDebounced) {
130
+ conditionalSwitchProperty.detachEvent("valueChanged", this.fnBoundDebounced);
131
+ }
132
+ this._createContentDebounced();
133
+ return conditionalSwitchProperty;
134
+ }
135
+
136
+ // #region IFormContent
137
+
138
+ getFormDoNotAdjustWidth(): boolean {
139
+ return (this.content as unknown as IFormContent)?.getFormDoNotAdjustWidth?.() ?? false;
140
+ }
141
+ }
@@ -0,0 +1,78 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/core/Element"], function (ClassSupport, UI5Element) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _dec4, _class, _class2, _descriptor, _descriptor2, _descriptor3;
9
+ var property = ClassSupport.property;
10
+ var event = ClassSupport.event;
11
+ var defineUI5Class = ClassSupport.defineUI5Class;
12
+ function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
13
+ function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
14
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
15
+ function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
16
+ function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
17
+ /**
18
+ * Defines a property with a key and a value that can be used in conditional templates.
19
+ * When the value is changed, a `valueChanged` event is fired.
20
+ * @experimental
21
+ * @since 1.141.0
22
+ * @ui5-experimental-since 1.141.0
23
+ * @public
24
+ */
25
+ let ConditionalSwitchProperty = (_dec = defineUI5Class("sap.fe.macros.ConditionalSwitchProperty"), _dec2 = property({
26
+ type: "string"
27
+ }), _dec3 = property({
28
+ type: "any"
29
+ }), _dec4 = event(), _dec(_class = (_class2 = /*#__PURE__*/function (_UI5Element) {
30
+ function ConditionalSwitchProperty(idOrSettings, settings, scope) {
31
+ var _this;
32
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
33
+ // @ts-ignore
34
+ _this = _UI5Element.call(this, idOrSettings, settings, scope) || this;
35
+ /**
36
+ * The key of the property.
37
+ * @public
38
+ */
39
+ _initializerDefineProperty(_this, "key", _descriptor, _this);
40
+ /**
41
+ * The value of the property.
42
+ * @public
43
+ */
44
+ _initializerDefineProperty(_this, "value", _descriptor2, _this);
45
+ /**
46
+ * Event fired when the value of the property is changed.
47
+ * This is used internally by the `ConditionalTemplate` control to react to changes in the property value.
48
+ * @public
49
+ */
50
+ _initializerDefineProperty(_this, "valueChanged", _descriptor3, _this);
51
+ return _this;
52
+ }
53
+ _inheritsLoose(ConditionalSwitchProperty, _UI5Element);
54
+ var _proto = ConditionalSwitchProperty.prototype;
55
+ _proto.setValue = function setValue(value) {
56
+ this.setProperty("value", value);
57
+ this.fireEvent("valueChanged");
58
+ };
59
+ return ConditionalSwitchProperty;
60
+ }(UI5Element), _descriptor = _applyDecoratedDescriptor(_class2.prototype, "key", [_dec2], {
61
+ configurable: true,
62
+ enumerable: true,
63
+ writable: true,
64
+ initializer: null
65
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "value", [_dec3], {
66
+ configurable: true,
67
+ enumerable: true,
68
+ writable: true,
69
+ initializer: null
70
+ }), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "valueChanged", [_dec4], {
71
+ configurable: true,
72
+ enumerable: true,
73
+ writable: true,
74
+ initializer: null
75
+ }), _class2)) || _class);
76
+ return ConditionalSwitchProperty;
77
+ }, false);
78
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb25kaXRpb25hbFN3aXRjaFByb3BlcnR5IiwiX2RlYyIsImRlZmluZVVJNUNsYXNzIiwiX2RlYzIiLCJwcm9wZXJ0eSIsInR5cGUiLCJfZGVjMyIsIl9kZWM0IiwiZXZlbnQiLCJfY2xhc3MiLCJfY2xhc3MyIiwiX1VJNUVsZW1lbnQiLCJpZE9yU2V0dGluZ3MiLCJzZXR0aW5ncyIsInNjb3BlIiwiX3RoaXMiLCJjYWxsIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJfZGVzY3JpcHRvciIsIl9kZXNjcmlwdG9yMiIsIl9kZXNjcmlwdG9yMyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwic2V0VmFsdWUiLCJ2YWx1ZSIsInNldFByb3BlcnR5IiwiZmlyZUV2ZW50IiwiVUk1RWxlbWVudCIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsaXplciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ29uZGl0aW9uYWxTd2l0Y2hQcm9wZXJ0eS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0aWVzT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXZlbnQsIHByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgeyBFdmVudEhhbmRsZXIgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5cbi8qKlxuICogRGVmaW5lcyBhIHByb3BlcnR5IHdpdGggYSBrZXkgYW5kIGEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBjb25kaXRpb25hbCB0ZW1wbGF0ZXMuXG4gKiBXaGVuIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkLCBhIGB2YWx1ZUNoYW5nZWRgIGV2ZW50IGlzIGZpcmVkLlxuICogQGV4cGVyaW1lbnRhbFxuICogQHNpbmNlIDEuMTQxLjBcbiAqIEB1aTUtZXhwZXJpbWVudGFsLXNpbmNlIDEuMTQxLjBcbiAqIEBwdWJsaWNcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLm1hY3Jvcy5Db25kaXRpb25hbFN3aXRjaFByb3BlcnR5XCIpXG5jbGFzcyBDb25kaXRpb25hbFN3aXRjaFByb3BlcnR5IGV4dGVuZHMgVUk1RWxlbWVudCB7XG5cdC8qKlxuXHQgKiBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHByb3BlcnR5KHsgdHlwZTogXCJzdHJpbmdcIiB9KVxuXHRrZXkhOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwcm9wZXJ0eSh7IHR5cGU6IFwiYW55XCIgfSlcblx0dmFsdWUhOiB1bmtub3duO1xuXG5cdC8qKlxuXHQgKiBFdmVudCBmaXJlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaXMgY2hhbmdlZC5cblx0ICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGBDb25kaXRpb25hbFRlbXBsYXRlYCBjb250cm9sIHRvIHJlYWN0IHRvIGNoYW5nZXMgaW4gdGhlIHByb3BlcnR5IHZhbHVlLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAZXZlbnQoKVxuXHR2YWx1ZUNoYW5nZWQhOiBFdmVudEhhbmRsZXI8VUk1RXZlbnQ8e30sIENvbmRpdGlvbmFsU3dpdGNoUHJvcGVydHk+PjtcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRpZE9yU2V0dGluZ3M/OiBzdHJpbmcgfCBQcm9wZXJ0aWVzT2Y8Q29uZGl0aW9uYWxTd2l0Y2hQcm9wZXJ0eT4sXG5cdFx0c2V0dGluZ3M/OiBQcm9wZXJ0aWVzT2Y8Q29uZGl0aW9uYWxTd2l0Y2hQcm9wZXJ0eT4sXG5cdFx0c2NvcGU/OiBvYmplY3Rcblx0KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdXBlcihpZE9yU2V0dGluZ3MsIHNldHRpbmdzLCBzY29wZSk7XG5cdH1cblxuXHRzZXRWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5zZXRQcm9wZXJ0eShcInZhbHVlXCIsIHZhbHVlKTtcblx0XHR0aGlzLmZpcmVFdmVudChcInZhbHVlQ2hhbmdlZFwiKTtcblx0fVxufVxuXG5pbnRlcmZhY2UgQ29uZGl0aW9uYWxTd2l0Y2hQcm9wZXJ0eSB7XG5cdGdldEtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHNldEtleShrZXk6IHN0cmluZyk6IHRoaXM7XG5cdGdldFZhbHVlKCk6IHVua25vd24gfCB1bmRlZmluZWQ7XG5cdHNldFZhbHVlKHZhbHVlOiB1bmtub3duKTogdm9pZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29uZGl0aW9uYWxTd2l0Y2hQcm9wZXJ0eTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztFQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQQSxJQVNNQSx5QkFBeUIsSUFBQUMsSUFBQSxHQUQ5QkMsY0FBYyxDQUFDLHlDQUF5QyxDQUFDLEVBQUFDLEtBQUEsR0FNeERDLFFBQVEsQ0FBQztJQUFFQyxJQUFJLEVBQUU7RUFBUyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQU81QkYsUUFBUSxDQUFDO0lBQUVDLElBQUksRUFBRTtFQUFNLENBQUMsQ0FBQyxFQUFBRSxLQUFBLEdBUXpCQyxLQUFLLENBQUMsQ0FBQyxFQUFBUCxJQUFBLENBQUFRLE1BQUEsSUFBQUMsT0FBQSwwQkFBQUMsV0FBQTtJQUdSLFNBQUFYLDBCQUNDWSxZQUErRCxFQUMvREMsUUFBa0QsRUFDbERDLEtBQWMsRUFDYjtNQUFBLElBQUFDLEtBQUE7TUFDRDtNQUNBO01BQ0FBLEtBQUEsR0FBQUosV0FBQSxDQUFBSyxJQUFBLE9BQU1KLFlBQVksRUFBRUMsUUFBUSxFQUFFQyxLQUFLLENBQUM7TUE3QnJDO0FBQ0Q7QUFDQTtBQUNBO01BSENHLDBCQUFBLENBQUFGLEtBQUEsU0FBQUcsV0FBQSxFQUFBSCxLQUFBO01BT0E7QUFDRDtBQUNBO0FBQ0E7TUFIQ0UsMEJBQUEsQ0FBQUYsS0FBQSxXQUFBSSxZQUFBLEVBQUFKLEtBQUE7TUFPQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO01BSkNFLDBCQUFBLENBQUFGLEtBQUEsa0JBQUFLLFlBQUEsRUFBQUwsS0FBQTtNQUFBLE9BQUFBLEtBQUE7SUFnQkE7SUFBQ00sY0FBQSxDQUFBckIseUJBQUEsRUFBQVcsV0FBQTtJQUFBLElBQUFXLE1BQUEsR0FBQXRCLHlCQUFBLENBQUF1QixTQUFBO0lBQUFELE1BQUEsQ0FFREUsUUFBUSxHQUFSLFNBQUFBLFFBQVFBLENBQUNDLEtBQWEsRUFBUTtNQUM3QixJQUFJLENBQUNDLFdBQVcsQ0FBQyxPQUFPLEVBQUVELEtBQUssQ0FBQztNQUNoQyxJQUFJLENBQUNFLFNBQVMsQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQUFBLE9BQUEzQix5QkFBQTtFQUFBLEVBcENzQzRCLFVBQVUsR0FBQVYsV0FBQSxHQUFBVyx5QkFBQSxDQUFBbkIsT0FBQSxDQUFBYSxTQUFBLFVBQUFwQixLQUFBO0lBQUEyQixZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsSUFBQWQsWUFBQSxHQUFBVSx5QkFBQSxDQUFBbkIsT0FBQSxDQUFBYSxTQUFBLFlBQUFqQixLQUFBO0lBQUF3QixZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsSUFBQWIsWUFBQSxHQUFBUyx5QkFBQSxDQUFBbkIsT0FBQSxDQUFBYSxTQUFBLG1CQUFBaEIsS0FBQTtJQUFBdUIsWUFBQTtJQUFBQyxVQUFBO0lBQUFDLFFBQUE7SUFBQUMsV0FBQTtFQUFBLElBQUF2QixPQUFBLE1BQUFELE1BQUE7RUFBQSxPQThDbkNULHlCQUF5QjtBQUFBIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,62 @@
1
+ import type { PropertiesOf } from "sap/fe/base/ClassSupport";
2
+ import { defineUI5Class, event, property } from "sap/fe/base/ClassSupport";
3
+ import type UI5Event from "sap/ui/base/Event";
4
+ import UI5Element from "sap/ui/core/Element";
5
+ import type { EventHandler } from "types/extension_types";
6
+
7
+ /**
8
+ * Defines a property with a key and a value that can be used in conditional templates.
9
+ * When the value is changed, a `valueChanged` event is fired.
10
+ * @experimental
11
+ * @since 1.141.0
12
+ * @ui5-experimental-since 1.141.0
13
+ * @public
14
+ */
15
+ @defineUI5Class("sap.fe.macros.ConditionalSwitchProperty")
16
+ class ConditionalSwitchProperty extends UI5Element {
17
+ /**
18
+ * The key of the property.
19
+ * @public
20
+ */
21
+ @property({ type: "string" })
22
+ key!: string;
23
+
24
+ /**
25
+ * The value of the property.
26
+ * @public
27
+ */
28
+ @property({ type: "any" })
29
+ value!: unknown;
30
+
31
+ /**
32
+ * Event fired when the value of the property is changed.
33
+ * This is used internally by the `ConditionalTemplate` control to react to changes in the property value.
34
+ * @public
35
+ */
36
+ @event()
37
+ valueChanged!: EventHandler<UI5Event<{}, ConditionalSwitchProperty>>;
38
+
39
+ constructor(
40
+ idOrSettings?: string | PropertiesOf<ConditionalSwitchProperty>,
41
+ settings?: PropertiesOf<ConditionalSwitchProperty>,
42
+ scope?: object
43
+ ) {
44
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
45
+ // @ts-ignore
46
+ super(idOrSettings, settings, scope);
47
+ }
48
+
49
+ setValue(value: string): void {
50
+ this.setProperty("value", value);
51
+ this.fireEvent("valueChanged");
52
+ }
53
+ }
54
+
55
+ interface ConditionalSwitchProperty {
56
+ getKey(): string | undefined;
57
+ setKey(key: string): this;
58
+ getValue(): unknown | undefined;
59
+ setValue(value: unknown): void;
60
+ }
61
+
62
+ export default ConditionalSwitchProperty;