@sapui5/sap.fe.macros 1.138.0 → 1.140.0

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 (240) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/Breadcrumbs.js +269 -0
  4. package/src/sap/fe/macros/Breadcrumbs.tsx +243 -0
  5. package/src/sap/fe/macros/CommonHelper.js +2 -2
  6. package/src/sap/fe/macros/CommonHelper.ts +1 -1
  7. package/src/sap/fe/macros/Field.js +85 -58
  8. package/src/sap/fe/macros/Field.ts +104 -60
  9. package/src/sap/fe/macros/FooterContent.js +44 -11
  10. package/src/sap/fe/macros/FooterContent.tsx +48 -9
  11. package/src/sap/fe/macros/FormElement.js +2 -2
  12. package/src/sap/fe/macros/FormElement.ts +1 -2
  13. package/src/sap/fe/macros/MessageButton.js +1 -2
  14. package/src/sap/fe/macros/MessageButton.tsx +0 -1
  15. package/src/sap/fe/macros/MultiValueField.js +17 -6
  16. package/src/sap/fe/macros/MultiValueField.tsx +7 -4
  17. package/src/sap/fe/macros/RichTextEditor.js +30 -5
  18. package/src/sap/fe/macros/RichTextEditor.tsx +34 -6
  19. package/src/sap/fe/macros/Share.js +85 -40
  20. package/src/sap/fe/macros/Share.tsx +42 -1
  21. package/src/sap/fe/macros/Status.js +226 -0
  22. package/src/sap/fe/macros/Status.tsx +192 -0
  23. package/src/sap/fe/macros/ValueHelp.js +4 -29
  24. package/src/sap/fe/macros/ValueHelp.tsx +2 -43
  25. package/src/sap/fe/macros/ai/EasyFillButton.js +10 -4
  26. package/src/sap/fe/macros/ai/EasyFillButton.tsx +8 -1
  27. package/src/sap/fe/macros/ai/EasyFillDialog.js +25 -10
  28. package/src/sap/fe/macros/ai/EasyFillDialog.tsx +32 -23
  29. package/src/sap/fe/macros/ai/EasyFilterBar.js +123 -114
  30. package/src/sap/fe/macros/ai/EasyFilterBar.tsx +140 -124
  31. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +11 -5
  32. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +14 -5
  33. package/src/sap/fe/macros/ai/SummarizationButton.js +2 -2
  34. package/src/sap/fe/macros/ai/SummarizationButton.tsx +1 -1
  35. package/src/sap/fe/macros/chart/ChartDelegate.js +4 -4
  36. package/src/sap/fe/macros/chart/ChartDelegate.ts +3 -3
  37. package/src/sap/fe/macros/chart/ChartHelper.js +1 -2
  38. package/src/sap/fe/macros/chart/ChartHelper.ts +0 -1
  39. package/src/sap/fe/macros/chart/ChartRuntime.js +1 -2
  40. package/src/sap/fe/macros/chart/ChartRuntime.ts +0 -1
  41. package/src/sap/fe/macros/chart/MdcChartTemplate.js +20 -6
  42. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +16 -8
  43. package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.js +3 -1
  44. package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.ts +2 -0
  45. package/src/sap/fe/macros/controls/FieldWrapper.js +9 -3
  46. package/src/sap/fe/macros/controls/FieldWrapper.ts +11 -2
  47. package/src/sap/fe/macros/controls/FilterBar.js +49 -2
  48. package/src/sap/fe/macros/controls/FilterBar.ts +55 -1
  49. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +2 -2
  50. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -2
  51. package/src/sap/fe/macros/controls/RequiredFlexBox.js +62 -0
  52. package/src/sap/fe/macros/controls/RequiredFlexBox.tsx +20 -0
  53. package/src/sap/fe/macros/controls/filterbar/VisualFilter.js +21 -11
  54. package/src/sap/fe/macros/controls/filterbar/VisualFilter.ts +25 -11
  55. package/src/sap/fe/macros/controls/filterbar/VisualFilterContainer.js +11 -2
  56. package/src/sap/fe/macros/controls/filterbar/VisualFilterContainer.ts +12 -1
  57. package/src/sap/fe/macros/controls/filterbar/utils/VisualFilterUtils.js +18 -1
  58. package/src/sap/fe/macros/controls/filterbar/utils/VisualFilterUtils.ts +20 -0
  59. package/src/sap/fe/macros/coreUI/CreateDialog.js +2 -2
  60. package/src/sap/fe/macros/coreUI/CreateDialog.tsx +1 -1
  61. package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +43 -4
  62. package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +48 -1
  63. package/src/sap/fe/macros/designtime/Designtime.helper.js +39 -2
  64. package/src/sap/fe/macros/designtime/Designtime.helper.ts +39 -0
  65. package/src/sap/fe/macros/draftIndicator/DraftIndicator.js +15 -4
  66. package/src/sap/fe/macros/draftIndicator/DraftIndicator.tsx +5 -0
  67. package/src/sap/fe/macros/field/FieldBaseDelegate.js +20 -8
  68. package/src/sap/fe/macros/field/FieldBaseDelegate.ts +34 -9
  69. package/src/sap/fe/macros/field/FieldFormatOptions.js +73 -44
  70. package/src/sap/fe/macros/field/FieldFormatOptions.ts +20 -2
  71. package/src/sap/fe/macros/field/FieldRuntime.js +1 -2
  72. package/src/sap/fe/macros/field/FieldRuntime.ts +0 -1
  73. package/src/sap/fe/macros/filter/FilterUtils.js +3 -5
  74. package/src/sap/fe/macros/filter/FilterUtils.ts +2 -4
  75. package/src/sap/fe/macros/filterBar/FilterBar.block.js +8 -2
  76. package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +2 -5
  77. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +8 -8
  78. package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +8 -8
  79. package/src/sap/fe/macros/filterBar/designtime/FilterBar.designtime.js +3 -1
  80. package/src/sap/fe/macros/filterBar/designtime/FilterBar.designtime.ts +2 -0
  81. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +1 -1
  82. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +1 -1
  83. package/src/sap/fe/macros/form/Form.js +1 -4
  84. package/src/sap/fe/macros/form/Form.tsx +0 -3
  85. package/src/sap/fe/macros/form/FormActionButtons.fragment.xml +13 -2
  86. package/src/sap/fe/macros/form/FormContainer.block.js +1 -2
  87. package/src/sap/fe/macros/form/FormContainer.block.ts +0 -1
  88. package/src/sap/fe/macros/form/FormContainer.fragment.xml +40 -0
  89. package/src/sap/fe/macros/form/FormContainerAPI.js +14 -16
  90. package/src/sap/fe/macros/form/FormContainerAPI.ts +13 -15
  91. package/src/sap/fe/macros/form/FormDelegate.js +20 -1
  92. package/src/sap/fe/macros/form/FormDelegate.ts +25 -0
  93. package/src/sap/fe/macros/form/FormHelper.js +1 -2
  94. package/src/sap/fe/macros/form/FormHelper.ts +0 -1
  95. package/src/sap/fe/macros/formatters/TableFormatter.js +10 -1
  96. package/src/sap/fe/macros/formatters/TableFormatter.ts +14 -5
  97. package/src/sap/fe/macros/fpm/CustomFragment.block.js +1 -2
  98. package/src/sap/fe/macros/fpm/CustomFragment.block.ts +0 -1
  99. package/src/sap/fe/macros/inlineEdit/InlineEdit.js +15 -3
  100. package/src/sap/fe/macros/inlineEdit/InlineEdit.ts +14 -2
  101. package/src/sap/fe/macros/internal/ActionCommand.block.js +1 -2
  102. package/src/sap/fe/macros/internal/ActionCommand.block.ts +0 -1
  103. package/src/sap/fe/macros/internal/DataPoint.js +2 -1
  104. package/src/sap/fe/macros/internal/DataPoint.tsx +1 -0
  105. package/src/sap/fe/macros/internal/DataPointFormatOptions.js +11 -2
  106. package/src/sap/fe/macros/internal/DataPointFormatOptions.ts +3 -0
  107. package/src/sap/fe/macros/internal/FilterField.block.js +10 -2
  108. package/src/sap/fe/macros/internal/FilterField.block.ts +11 -1
  109. package/src/sap/fe/macros/internal/field/CheckBoxGroup.fragment.xml +25 -0
  110. package/src/sap/fe/macros/internal/field/DisplayStyle.js +51 -13
  111. package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +53 -6
  112. package/src/sap/fe/macros/internal/field/EditStyle.js +5 -1
  113. package/src/sap/fe/macros/internal/field/EditStyle.tsx +4 -0
  114. package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +9 -2
  115. package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +11 -0
  116. package/src/sap/fe/macros/internal/field/FieldStyles.js +1 -1
  117. package/src/sap/fe/macros/internal/field/FieldStyles.tsx +2 -1
  118. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.js +46 -8
  119. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.ts +60 -6
  120. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.js +38 -2
  121. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.ts +37 -2
  122. package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +2 -1
  123. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +16 -5
  124. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +21 -9
  125. package/src/sap/fe/macros/internal/valuehelp/ValueListTable.fragment.xml +1 -0
  126. package/src/sap/fe/macros/library.js +1 -1
  127. package/src/sap/fe/macros/mdc/adapter/StateHelper.js +7 -2
  128. package/src/sap/fe/macros/mdc/adapter/StateHelper.ts +7 -3
  129. package/src/sap/fe/macros/messagebundle.properties +42 -32
  130. package/src/sap/fe/macros/messagebundle_ar.properties +12 -4
  131. package/src/sap/fe/macros/messagebundle_bg.properties +11 -3
  132. package/src/sap/fe/macros/messagebundle_ca.properties +15 -7
  133. package/src/sap/fe/macros/messagebundle_cnr.properties +12 -4
  134. package/src/sap/fe/macros/messagebundle_cs.properties +10 -2
  135. package/src/sap/fe/macros/messagebundle_cy.properties +12 -4
  136. package/src/sap/fe/macros/messagebundle_da.properties +11 -3
  137. package/src/sap/fe/macros/messagebundle_de.properties +18 -10
  138. package/src/sap/fe/macros/messagebundle_el.properties +13 -5
  139. package/src/sap/fe/macros/messagebundle_en.properties +16 -8
  140. package/src/sap/fe/macros/messagebundle_en_GB.properties +16 -8
  141. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +16 -8
  142. package/src/sap/fe/macros/messagebundle_es.properties +13 -5
  143. package/src/sap/fe/macros/messagebundle_es_MX.properties +14 -6
  144. package/src/sap/fe/macros/messagebundle_et.properties +13 -5
  145. package/src/sap/fe/macros/messagebundle_fi.properties +14 -6
  146. package/src/sap/fe/macros/messagebundle_fr.properties +14 -6
  147. package/src/sap/fe/macros/messagebundle_fr_CA.properties +15 -7
  148. package/src/sap/fe/macros/messagebundle_hi.properties +11 -3
  149. package/src/sap/fe/macros/messagebundle_hr.properties +11 -3
  150. package/src/sap/fe/macros/messagebundle_hu.properties +10 -2
  151. package/src/sap/fe/macros/messagebundle_id.properties +18 -10
  152. package/src/sap/fe/macros/messagebundle_it.properties +10 -2
  153. package/src/sap/fe/macros/messagebundle_iw.properties +10 -2
  154. package/src/sap/fe/macros/messagebundle_ja.properties +13 -5
  155. package/src/sap/fe/macros/messagebundle_kk.properties +15 -7
  156. package/src/sap/fe/macros/messagebundle_ko.properties +10 -2
  157. package/src/sap/fe/macros/messagebundle_lt.properties +11 -3
  158. package/src/sap/fe/macros/messagebundle_lv.properties +12 -4
  159. package/src/sap/fe/macros/messagebundle_mk.properties +12 -4
  160. package/src/sap/fe/macros/messagebundle_ms.properties +14 -6
  161. package/src/sap/fe/macros/messagebundle_nl.properties +13 -5
  162. package/src/sap/fe/macros/messagebundle_no.properties +12 -4
  163. package/src/sap/fe/macros/messagebundle_pl.properties +12 -4
  164. package/src/sap/fe/macros/messagebundle_pt.properties +13 -5
  165. package/src/sap/fe/macros/messagebundle_pt_PT.properties +12 -4
  166. package/src/sap/fe/macros/messagebundle_ro.properties +12 -4
  167. package/src/sap/fe/macros/messagebundle_ru.properties +13 -5
  168. package/src/sap/fe/macros/messagebundle_sh.properties +12 -4
  169. package/src/sap/fe/macros/messagebundle_sk.properties +11 -3
  170. package/src/sap/fe/macros/messagebundle_sl.properties +12 -4
  171. package/src/sap/fe/macros/messagebundle_sr.properties +12 -4
  172. package/src/sap/fe/macros/messagebundle_sv.properties +11 -3
  173. package/src/sap/fe/macros/messagebundle_th.properties +11 -3
  174. package/src/sap/fe/macros/messagebundle_tr.properties +10 -2
  175. package/src/sap/fe/macros/messagebundle_uk.properties +17 -9
  176. package/src/sap/fe/macros/messagebundle_vi.properties +12 -4
  177. package/src/sap/fe/macros/messagebundle_zh_CN.properties +11 -3
  178. package/src/sap/fe/macros/messagebundle_zh_TW.properties +12 -4
  179. package/src/sap/fe/macros/messages/MessageButton.js +55 -36
  180. package/src/sap/fe/macros/messages/MessageButton.ts +64 -39
  181. package/src/sap/fe/macros/messages/MessagePopover.js +2 -2
  182. package/src/sap/fe/macros/messages/MessagePopover.ts +4 -4
  183. package/src/sap/fe/macros/microchart/MicroChartContainer.js +1 -2
  184. package/src/sap/fe/macros/microchart/MicroChartContainer.ts +1 -2
  185. package/src/sap/fe/macros/microchart/MicroChartHelper.js +1 -2
  186. package/src/sap/fe/macros/microchart/MicroChartHelper.tsx +0 -1
  187. package/src/sap/fe/macros/share/ShareAPI.js +4 -29
  188. package/src/sap/fe/macros/share/ShareAPI.ts +1 -32
  189. package/src/sap/fe/macros/situations/SituationsPopover.js +3 -1
  190. package/src/sap/fe/macros/situations/SituationsPopover.ts +2 -0
  191. package/src/sap/fe/macros/table/Action.js +24 -2
  192. package/src/sap/fe/macros/table/Action.ts +13 -0
  193. package/src/sap/fe/macros/table/ActionGroup.js +24 -2
  194. package/src/sap/fe/macros/table/ActionGroup.ts +13 -0
  195. package/src/sap/fe/macros/table/ActionGroupOverride.js +24 -2
  196. package/src/sap/fe/macros/table/ActionGroupOverride.ts +13 -0
  197. package/src/sap/fe/macros/table/ActionOverride.js +24 -2
  198. package/src/sap/fe/macros/table/ActionOverride.ts +13 -0
  199. package/src/sap/fe/macros/table/ActionsTemplating.js +73 -12
  200. package/src/sap/fe/macros/table/ActionsTemplating.tsx +69 -13
  201. package/src/sap/fe/macros/table/Column.js +3 -3
  202. package/src/sap/fe/macros/table/Column.ts +2 -2
  203. package/src/sap/fe/macros/table/MdcTableTemplate.js +20 -8
  204. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +36 -7
  205. package/src/sap/fe/macros/table/QuickFilterSelector.js +35 -14
  206. package/src/sap/fe/macros/table/QuickFilterSelector.tsx +22 -3
  207. package/src/sap/fe/macros/table/Table.block.js +137 -108
  208. package/src/sap/fe/macros/table/Table.block.tsx +29 -2
  209. package/src/sap/fe/macros/table/TableAPI.js +143 -133
  210. package/src/sap/fe/macros/table/TableAPI.ts +5 -1
  211. package/src/sap/fe/macros/table/TableDefinition.js +4 -2
  212. package/src/sap/fe/macros/table/TableDefinition.ts +3 -1
  213. package/src/sap/fe/macros/table/TableHelper.js +1 -2
  214. package/src/sap/fe/macros/table/TableHelper.ts +0 -1
  215. package/src/sap/fe/macros/table/TableRuntime.js +26 -7
  216. package/src/sap/fe/macros/table/TableRuntime.ts +33 -5
  217. package/src/sap/fe/macros/table/Utils.js +6 -2
  218. package/src/sap/fe/macros/table/Utils.ts +5 -1
  219. package/src/sap/fe/macros/table/delegates/ALPTableDelegate.js +1 -2
  220. package/src/sap/fe/macros/table/delegates/ALPTableDelegate.ts +0 -1
  221. package/src/sap/fe/macros/table/delegates/TableDelegate.js +25 -20
  222. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +25 -24
  223. package/src/sap/fe/macros/table/delegates/TreeTableDelegate.js +1 -2
  224. package/src/sap/fe/macros/table/delegates/TreeTableDelegate.ts +0 -1
  225. package/src/sap/fe/macros/table/designtime/Table.designtime.js +3 -1
  226. package/src/sap/fe/macros/table/designtime/Table.designtime.ts +2 -0
  227. package/src/sap/fe/macros/table/massEdit/designtime/MassEdit.designtime.js +3 -1
  228. package/src/sap/fe/macros/table/massEdit/designtime/MassEdit.designtime.ts +2 -1
  229. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +2 -1
  230. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +1 -0
  231. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +8 -1
  232. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +10 -0
  233. package/src/sap/fe/macros/table/mixin/TableSharing.js +3 -2
  234. package/src/sap/fe/macros/table/mixin/TableSharing.ts +9 -1
  235. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +20 -6
  236. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +36 -14
  237. package/src/sap/fe/macros/visualfilters/VisualFilter.js +95 -7
  238. package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +93 -3
  239. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +16 -5
  240. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +18 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.macros",
3
- "version": "1.138.0",
3
+ "version": "1.140.0",
4
4
  "description": "SAPUI5 Library sap.fe.macros",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -6,7 +6,7 @@
6
6
  SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.138.0</version>
9
+ <version>1.140.0</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.macros</documentation>
12
12
 
@@ -0,0 +1,269 @@
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/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/base/ClassSupport", "sap/fe/core/buildingBlocks/BuildingBlock", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/m/Breadcrumbs", "sap/m/Link", "sap/fe/base/jsx-runtime/jsx"], function (Log, BindingToolkit, ClassSupport, BuildingBlock, CommonUtils, ResourceModelHelper, StableIdHelper, UI5Breadcrumbs, Link, _jsx) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _class, _class2, _descriptor, _descriptor2;
9
+ var _exports = {};
10
+ var generate = StableIdHelper.generate;
11
+ var getResourceModel = ResourceModelHelper.getResourceModel;
12
+ var property = ClassSupport.property;
13
+ var implementInterface = ClassSupport.implementInterface;
14
+ var defineUI5Class = ClassSupport.defineUI5Class;
15
+ var compileExpression = BindingToolkit.compileExpression;
16
+ 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 }); }
17
+ function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
18
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
19
+ 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; }
20
+ function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
21
+ const hierachyModeOptions = {
22
+ OBJECT: "objectNavigation",
23
+ FULL: "fullNavigation"
24
+ };
25
+ _exports.hierachyModeOptions = hierachyModeOptions;
26
+ /**
27
+ * Building block used to create breadcrumbs.
28
+ */
29
+ let Breadcrumbs = (_dec = defineUI5Class("sap.fe.macros.Breadcrumbs"), _dec2 = implementInterface("sap.m.IBreadcrumbs"), _dec3 = property({
30
+ type: "string",
31
+ defaultValue: hierachyModeOptions.OBJECT,
32
+ allowedValues: Object.values(hierachyModeOptions)
33
+ }), _dec(_class = (_class2 = /*#__PURE__*/function (_BuildingBlock) {
34
+ function Breadcrumbs() {
35
+ var _this;
36
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
37
+ args[_key] = arguments[_key];
38
+ }
39
+ _this = _BuildingBlock.call(this, ...args) || this;
40
+ _initializerDefineProperty(_this, "__implements__sap_m_IBreadcrumbs", _descriptor, _this);
41
+ /**
42
+ * Hierarchy mode for breadcrumbs
43
+ * @public
44
+ */
45
+ _initializerDefineProperty(_this, "hierarchyMode", _descriptor2, _this);
46
+ return _this;
47
+ }
48
+ _exports = Breadcrumbs;
49
+ _inheritsLoose(Breadcrumbs, _BuildingBlock);
50
+ var _proto = Breadcrumbs.prototype;
51
+ _proto.onMetadataAvailable = function onMetadataAvailable() {
52
+ if (!this.content) {
53
+ this._getOwner()?.runAsOwner(() => {
54
+ this.content = this.createContent();
55
+ });
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Get breadcrumbs title information for full path.
61
+ * @param fullPathForLinks The context path of the object page.
62
+ * @returns Promises resolving to TitleInformation objects for each path part.
63
+ */;
64
+ _proto._getBreadcrumbsTitleInfos = function _getBreadcrumbsTitleInfos(fullPathForLinks) {
65
+ const promises = [],
66
+ appComponent = this.getAppComponent(),
67
+ rootViewController = appComponent.getRootViewController(),
68
+ metaModel = appComponent.getMetaModel(),
69
+ pathParts = this._getBreadcrumbsPathParts(fullPathForLinks);
70
+ let path = "";
71
+ if (this.hierarchyMode === hierachyModeOptions.FULL) {
72
+ // Home page
73
+ const resourceModel = getResourceModel(this);
74
+ const homeTitle = this._getFEManifestBreadcrumbSettings()?.home;
75
+ promises.push(Promise.resolve({
76
+ intent: "#Shell-home",
77
+ title: homeTitle ? CommonUtils.getTranslatedTextFromExpBindingString(homeTitle, this) : resourceModel.getText("T_APP_HOME")
78
+ }));
79
+ }
80
+ pathParts.forEach(function (pathPart, idx) {
81
+ path += pathPart ? `/${pathPart}` : "";
82
+ if (!appComponent.getRouter().getRouteInfoByHash(path)) {
83
+ // If the target is not declared in the routes, we skip it
84
+ return;
85
+ }
86
+ // If in full Navigation mode, the first page of the application uses the title and subtitle from the manifest
87
+ if (!idx && path === "" && this.hierarchyMode === hierachyModeOptions.FULL) {
88
+ promises.push(this._getFirstPageTitleInformation());
89
+ return;
90
+ }
91
+ const parameterPath = metaModel.getMetaPath(path);
92
+ const resultContext = metaModel.getObject(`${parameterPath}/@com.sap.vocabularies.Common.v1.ResultContext`);
93
+ if (resultContext) {
94
+ // We dont need to create a breadcrumb for Parameter path
95
+ return;
96
+ }
97
+ promises.push(rootViewController.getTitleInfoFromPath(path));
98
+ }.bind(this));
99
+ return promises;
100
+ }
101
+
102
+ /**
103
+ * Get path parts from the full path for links.
104
+ * @param fullPathForLinks The context path of the object page.
105
+ * @returns Path parts for creating breadcrumb links.
106
+ */;
107
+ _proto._getBreadcrumbsPathParts = function _getBreadcrumbsPathParts(fullPathForLinks) {
108
+ const pathParts = fullPathForLinks?.split("/") ?? [];
109
+ if (this.hierarchyMode !== hierachyModeOptions.FULL) {
110
+ pathParts.shift(); // Remove ""
111
+ pathParts.splice(-1, 1); // Remove current page
112
+ }
113
+ return pathParts;
114
+ }
115
+
116
+ /**
117
+ * Get the context path from the hash.
118
+ * @param sHash The hash to get the context path from
119
+ * @returns Context path from the corresponding route target options
120
+ */;
121
+ _proto._getContextPathFromHash = function _getContextPathFromHash(sHash) {
122
+ const appComponent = this.getAppComponent(),
123
+ rootViewController = appComponent.getRootViewController();
124
+ const {
125
+ entitySet,
126
+ contextPath
127
+ } = rootViewController.getTargetOptionsFromHash(sHash)?.options?.settings ?? {};
128
+ return contextPath ?? (entitySet ? `/${entitySet}` : undefined);
129
+ };
130
+ _proto._getFirstPageTitleInformation = async function _getFirstPageTitleInformation() {
131
+ const appComponent = this.getAppComponent(),
132
+ rootViewController = appComponent.getRootViewController(),
133
+ manifestAppSettings = appComponent.getManifestEntry("sap.app"),
134
+ appTitle = manifestAppSettings.title || "",
135
+ appSubTitle = manifestAppSettings.subTitle || "",
136
+ appIcon = manifestAppSettings.icon || "",
137
+ appSpecificHash = rootViewController.getAppSpecificHash(),
138
+ rootContextPath = this._getContextPathFromHash(""),
139
+ dataModelObjectPath = this.getDataModelObjectPath(rootContextPath),
140
+ typeNamePluralAnno = dataModelObjectPath?.targetEntityType?.annotations?.UI?.HeaderInfo?.TypeNamePlural,
141
+ exp = compileExpression(typeNamePluralAnno),
142
+ rootTypeNamePlural = exp ? CommonUtils.getTranslatedTextFromExpBindingString(exp, this) : undefined;
143
+ const titleInfo = {
144
+ ...(await rootViewController.getRootLevelTitleInformation(appSpecificHash, appTitle, appSubTitle, appIcon))
145
+ };
146
+ titleInfo.subtitle = rootTypeNamePlural ? rootTypeNamePlural : titleInfo.title;
147
+ const spaceName = this._getFEManifestBreadcrumbSettings()?.space;
148
+ titleInfo.title = spaceName ? CommonUtils.getTranslatedTextFromExpBindingString(spaceName, this) : "";
149
+ return titleInfo;
150
+ };
151
+ _proto._getFEManifestBreadcrumbSettings = function _getFEManifestBreadcrumbSettings() {
152
+ const appComponent = this.getAppComponent(),
153
+ manifestFESettings = appComponent.getManifestEntry("sap.fe");
154
+ return manifestFESettings?.app?.breadcrumbs;
155
+ }
156
+
157
+ /**
158
+ * Sets breadcrumb links in the given Breadcrumbs control.
159
+ *
160
+ * This method retrieves the title information for each path part and sets the links accordingly.
161
+ * If the `fullPathForLink` parameter is not provided, it uses the binding context path of the Breadcrumbs control.
162
+ * @param fullPathForLinks The full path for the link, defaults to the binding context path of the Breadcrumbs control
163
+ * @returns A promise that resolves when the breadcrumb links are set
164
+ */;
165
+ _proto.setBreadcrumbLinks = async function setBreadcrumbLinks() {
166
+ let fullPathForLinks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getBindingContext()?.getPath();
167
+ if (typeof fullPathForLinks !== "string") {
168
+ Log.info("Breadcrumbs: path not available. Cannot set breadcrumb links.");
169
+ return;
170
+ }
171
+ const breadcrumbsCtrl = this.getContent();
172
+ if (!breadcrumbsCtrl) {
173
+ Log.error("Breadcrumbs Building block: Breadcrumbs control not available. Cannot set breadcrumb links.");
174
+ return;
175
+ }
176
+ try {
177
+ const titleHierarchyInfos = await Promise.all(this._getBreadcrumbsTitleInfos(fullPathForLinks));
178
+ titleHierarchyInfos.forEach(this.updateBreadcrumbLink.bind(this));
179
+ } catch (error) {
180
+ Log.error("Error while setting the breadcrumb links: " + error);
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Update the breadcrumb link at the specified hierarchy position.
186
+ * @param titleHierarchyInfo The title information for the link
187
+ * @param hierarchyPosition The position of the link in the hierarchy
188
+ * @param titleHierarchyInfos The array of all title information for the hierarchy
189
+ */;
190
+ _proto.updateBreadcrumbLink = function updateBreadcrumbLink(titleHierarchyInfo, hierarchyPosition, titleHierarchyInfos) {
191
+ const breadcrumbsCtrl = this.getContent();
192
+ const isLastLink = hierarchyPosition === titleHierarchyInfos.length - 1;
193
+ const linkText = this.getLinkText(titleHierarchyInfo, isLastLink, hierarchyPosition);
194
+ if (!linkText) {
195
+ Log.error("Breadcrumbs: No link text available for the breadcrumb link at position " + hierarchyPosition);
196
+ return;
197
+ }
198
+ if (isLastLink && this.hierarchyMode === hierachyModeOptions.FULL) {
199
+ // NOTE: As of 1.136.0, the setCurrentLocationText method is not deprecated.
200
+ // It was depricated in UI5 1.123 but reintroduced on/before UI5 1.127.
201
+ // As of day of writing this, we use UI5 1.124 for openui5 types.
202
+ // eslint-disable-next-line deprecation/deprecation
203
+ breadcrumbsCtrl.setCurrentLocationText(linkText);
204
+ } else {
205
+ const link = breadcrumbsCtrl.getLinks()[hierarchyPosition] ? breadcrumbsCtrl.getLinks()[hierarchyPosition] : new Link();
206
+ //sCurrentEntity is a fallback value in case of empty title
207
+ link.setText(linkText);
208
+ //We apply an additional encodeURI in case of special characters (ie "/") used in the url through the semantic keys
209
+ link.setHref(encodeURI(titleHierarchyInfo.intent));
210
+ if (!breadcrumbsCtrl.getLinks()[hierarchyPosition]) {
211
+ breadcrumbsCtrl.addLink(link);
212
+ }
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Get link text based on title and subtitle.
218
+ * @param titleInfo Title information containing title and subtitle
219
+ * @param isLastLink Determines if it is the last link in the breadcrumbs
220
+ * @param hierarchyPosition Position of the link in the hierarchy
221
+ * @returns Link text
222
+ */;
223
+ _proto.getLinkText = function getLinkText(titleInfo, isLastLink, hierarchyPosition) {
224
+ const {
225
+ title,
226
+ subtitle
227
+ } = titleInfo;
228
+ const titleExists = title !== undefined && title !== "";
229
+ const subtitleExists = subtitle !== undefined && subtitle !== "";
230
+ if (titleExists && subtitleExists && this.hierarchyMode === hierachyModeOptions.FULL) {
231
+ const resourceModel = getResourceModel(this);
232
+ const isFirstPage = hierarchyPosition === 1;
233
+ return !isFirstPage && isLastLink ? title : resourceModel.getText("T_BREADCRUMBS_TITLE_LONG_TEMPLATE", [title, subtitle]);
234
+ }
235
+ if (subtitleExists) {
236
+ return subtitle;
237
+ } else if (titleExists) {
238
+ return title;
239
+ }
240
+ };
241
+ _proto.createContent = function createContent() {
242
+ const viewId = this.getPageController()?.getView().getId();
243
+ return _jsx(UI5Breadcrumbs
244
+ // This is set as absolute ID.
245
+ , {
246
+ id: viewId ? generate([`${viewId}--fe`, "Breadcrumbs"]) : undefined,
247
+ modelContextChange: () => {
248
+ this.setBreadcrumbLinks();
249
+ }
250
+ });
251
+ };
252
+ return Breadcrumbs;
253
+ }(BuildingBlock), _descriptor = _applyDecoratedDescriptor(_class2.prototype, "__implements__sap_m_IBreadcrumbs", [_dec2], {
254
+ configurable: true,
255
+ enumerable: true,
256
+ writable: true,
257
+ initializer: function () {
258
+ return true;
259
+ }
260
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "hierarchyMode", [_dec3], {
261
+ configurable: true,
262
+ enumerable: true,
263
+ writable: true,
264
+ initializer: null
265
+ }), _class2)) || _class);
266
+ _exports = Breadcrumbs;
267
+ return _exports;
268
+ }, false);
269
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJoaWVyYWNoeU1vZGVPcHRpb25zIiwiT0JKRUNUIiwiRlVMTCIsIl9leHBvcnRzIiwiQnJlYWRjcnVtYnMiLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsImltcGxlbWVudEludGVyZmFjZSIsIl9kZWMzIiwicHJvcGVydHkiLCJ0eXBlIiwiZGVmYXVsdFZhbHVlIiwiYWxsb3dlZFZhbHVlcyIsIk9iamVjdCIsInZhbHVlcyIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQnVpbGRpbmdCbG9jayIsIl90aGlzIiwiX2xlbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjYWxsIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJfZGVzY3JpcHRvciIsIl9kZXNjcmlwdG9yMiIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwib25NZXRhZGF0YUF2YWlsYWJsZSIsImNvbnRlbnQiLCJfZ2V0T3duZXIiLCJydW5Bc093bmVyIiwiY3JlYXRlQ29udGVudCIsIl9nZXRCcmVhZGNydW1ic1RpdGxlSW5mb3MiLCJmdWxsUGF0aEZvckxpbmtzIiwicHJvbWlzZXMiLCJhcHBDb21wb25lbnQiLCJnZXRBcHBDb21wb25lbnQiLCJyb290Vmlld0NvbnRyb2xsZXIiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJwYXRoUGFydHMiLCJfZ2V0QnJlYWRjcnVtYnNQYXRoUGFydHMiLCJwYXRoIiwiaGllcmFyY2h5TW9kZSIsInJlc291cmNlTW9kZWwiLCJnZXRSZXNvdXJjZU1vZGVsIiwiaG9tZVRpdGxlIiwiX2dldEZFTWFuaWZlc3RCcmVhZGNydW1iU2V0dGluZ3MiLCJob21lIiwicHVzaCIsIlByb21pc2UiLCJyZXNvbHZlIiwiaW50ZW50IiwidGl0bGUiLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmciLCJnZXRUZXh0IiwiZm9yRWFjaCIsInBhdGhQYXJ0IiwiaWR4IiwiZ2V0Um91dGVyIiwiZ2V0Um91dGVJbmZvQnlIYXNoIiwiX2dldEZpcnN0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJwYXJhbWV0ZXJQYXRoIiwiZ2V0TWV0YVBhdGgiLCJyZXN1bHRDb250ZXh0IiwiZ2V0T2JqZWN0IiwiZ2V0VGl0bGVJbmZvRnJvbVBhdGgiLCJiaW5kIiwic3BsaXQiLCJzaGlmdCIsInNwbGljZSIsIl9nZXRDb250ZXh0UGF0aEZyb21IYXNoIiwic0hhc2giLCJlbnRpdHlTZXQiLCJjb250ZXh0UGF0aCIsImdldFRhcmdldE9wdGlvbnNGcm9tSGFzaCIsIm9wdGlvbnMiLCJzZXR0aW5ncyIsInVuZGVmaW5lZCIsIm1hbmlmZXN0QXBwU2V0dGluZ3MiLCJnZXRNYW5pZmVzdEVudHJ5IiwiYXBwVGl0bGUiLCJhcHBTdWJUaXRsZSIsInN1YlRpdGxlIiwiYXBwSWNvbiIsImljb24iLCJhcHBTcGVjaWZpY0hhc2giLCJnZXRBcHBTcGVjaWZpY0hhc2giLCJyb290Q29udGV4dFBhdGgiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInR5cGVOYW1lUGx1cmFsQW5ubyIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGVhZGVySW5mbyIsIlR5cGVOYW1lUGx1cmFsIiwiZXhwIiwiY29tcGlsZUV4cHJlc3Npb24iLCJyb290VHlwZU5hbWVQbHVyYWwiLCJ0aXRsZUluZm8iLCJnZXRSb290TGV2ZWxUaXRsZUluZm9ybWF0aW9uIiwic3VidGl0bGUiLCJzcGFjZU5hbWUiLCJzcGFjZSIsIm1hbmlmZXN0RkVTZXR0aW5ncyIsImFwcCIsImJyZWFkY3J1bWJzIiwic2V0QnJlYWRjcnVtYkxpbmtzIiwiZ2V0QmluZGluZ0NvbnRleHQiLCJnZXRQYXRoIiwiTG9nIiwiaW5mbyIsImJyZWFkY3J1bWJzQ3RybCIsImdldENvbnRlbnQiLCJlcnJvciIsInRpdGxlSGllcmFyY2h5SW5mb3MiLCJhbGwiLCJ1cGRhdGVCcmVhZGNydW1iTGluayIsInRpdGxlSGllcmFyY2h5SW5mbyIsImhpZXJhcmNoeVBvc2l0aW9uIiwiaXNMYXN0TGluayIsImxpbmtUZXh0IiwiZ2V0TGlua1RleHQiLCJzZXRDdXJyZW50TG9jYXRpb25UZXh0IiwibGluayIsImdldExpbmtzIiwiTGluayIsInNldFRleHQiLCJzZXRIcmVmIiwiZW5jb2RlVVJJIiwiYWRkTGluayIsInRpdGxlRXhpc3RzIiwic3VidGl0bGVFeGlzdHMiLCJpc0ZpcnN0UGFnZSIsInZpZXdJZCIsImdldFBhZ2VDb250cm9sbGVyIiwiZ2V0VmlldyIsImdldElkIiwiX2pzeCIsIlVJNUJyZWFkY3J1bWJzIiwiaWQiLCJnZW5lcmF0ZSIsIm1vZGVsQ29udGV4dENoYW5nZSIsIkJ1aWxkaW5nQmxvY2siLCJfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiaW5pdGlhbGl6ZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkJyZWFkY3J1bWJzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgaW1wbGVtZW50SW50ZXJmYWNlLCBwcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBCdWlsZGluZ0Jsb2NrIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBUaXRsZUluZm9ybWF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L1Jvb3RWaWV3QmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBVSTVCcmVhZGNydW1icyBmcm9tIFwic2FwL20vQnJlYWRjcnVtYnNcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJzYXAvbS9MaW5rXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0Q29udGVudCB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuXG5leHBvcnQgY29uc3QgaGllcmFjaHlNb2RlT3B0aW9ucyA9IHtcblx0T0JKRUNUOiBcIm9iamVjdE5hdmlnYXRpb25cIixcblx0RlVMTDogXCJmdWxsTmF2aWdhdGlvblwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSGllcmFjaHlNb2RlID0gKHR5cGVvZiBoaWVyYWNoeU1vZGVPcHRpb25zKVtrZXlvZiB0eXBlb2YgaGllcmFjaHlNb2RlT3B0aW9uc107XG5cbi8qKlxuICogQnVpbGRpbmcgYmxvY2sgdXNlZCB0byBjcmVhdGUgYnJlYWRjcnVtYnMuXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5tYWNyb3MuQnJlYWRjcnVtYnNcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyZWFkY3J1bWJzIGV4dGVuZHMgQnVpbGRpbmdCbG9jazxVSTVCcmVhZGNydW1icz4ge1xuXHRAaW1wbGVtZW50SW50ZXJmYWNlKFwic2FwLm0uSUJyZWFkY3J1bWJzXCIpXG5cdF9faW1wbGVtZW50c19fc2FwX21fSUJyZWFkY3J1bWJzID0gdHJ1ZTtcblxuXHQvKipcblx0ICogSGllcmFyY2h5IG1vZGUgZm9yIGJyZWFkY3J1bWJzXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwcm9wZXJ0eSh7XG5cdFx0dHlwZTogXCJzdHJpbmdcIixcblx0XHRkZWZhdWx0VmFsdWU6IGhpZXJhY2h5TW9kZU9wdGlvbnMuT0JKRUNULFxuXHRcdGFsbG93ZWRWYWx1ZXM6IE9iamVjdC52YWx1ZXMoaGllcmFjaHlNb2RlT3B0aW9ucylcblx0fSlcblx0aGllcmFyY2h5TW9kZSE6IEhpZXJhY2h5TW9kZTtcblxuXHRvbk1ldGFkYXRhQXZhaWxhYmxlKCk6IHZvaWQge1xuXHRcdGlmICghdGhpcy5jb250ZW50KSB7XG5cdFx0XHR0aGlzLl9nZXRPd25lcigpPy5ydW5Bc093bmVyKCgpID0+IHtcblx0XHRcdFx0dGhpcy5jb250ZW50ID0gdGhpcy5jcmVhdGVDb250ZW50KCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGJyZWFkY3J1bWJzIHRpdGxlIGluZm9ybWF0aW9uIGZvciBmdWxsIHBhdGguXG5cdCAqIEBwYXJhbSBmdWxsUGF0aEZvckxpbmtzIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIG9iamVjdCBwYWdlLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlcyByZXNvbHZpbmcgdG8gVGl0bGVJbmZvcm1hdGlvbiBvYmplY3RzIGZvciBlYWNoIHBhdGggcGFydC5cblx0ICovXG5cdF9nZXRCcmVhZGNydW1ic1RpdGxlSW5mb3MoZnVsbFBhdGhGb3JMaW5rczogc3RyaW5nKTogUHJvbWlzZTxUaXRsZUluZm9ybWF0aW9uPltdIHtcblx0XHRjb25zdCBwcm9taXNlczogUHJvbWlzZTxUaXRsZUluZm9ybWF0aW9uPltdID0gW10sXG5cdFx0XHRhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpISxcblx0XHRcdHJvb3RWaWV3Q29udHJvbGxlciA9IGFwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKSxcblx0XHRcdG1ldGFNb2RlbCA9IGFwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHBhdGhQYXJ0cyA9IHRoaXMuX2dldEJyZWFkY3J1bWJzUGF0aFBhcnRzKGZ1bGxQYXRoRm9yTGlua3MpO1xuXG5cdFx0bGV0IHBhdGggPSBcIlwiO1xuXHRcdGlmICh0aGlzLmhpZXJhcmNoeU1vZGUgPT09IGhpZXJhY2h5TW9kZU9wdGlvbnMuRlVMTCkge1xuXHRcdFx0Ly8gSG9tZSBwYWdlXG5cdFx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzKTtcblx0XHRcdGNvbnN0IGhvbWVUaXRsZSA9IHRoaXMuX2dldEZFTWFuaWZlc3RCcmVhZGNydW1iU2V0dGluZ3MoKT8uaG9tZTtcblx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdFByb21pc2UucmVzb2x2ZSh7XG5cdFx0XHRcdFx0aW50ZW50OiBcIiNTaGVsbC1ob21lXCIsXG5cdFx0XHRcdFx0dGl0bGU6IGhvbWVUaXRsZVxuXHRcdFx0XHRcdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nKGhvbWVUaXRsZSwgdGhpcylcblx0XHRcdFx0XHRcdDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiVF9BUFBfSE9NRVwiKVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cGF0aFBhcnRzLmZvckVhY2goXG5cdFx0XHRmdW5jdGlvbiAodGhpczogQnJlYWRjcnVtYnMsIHBhdGhQYXJ0OiBzdHJpbmcsIGlkeDogbnVtYmVyKTogdm9pZCB7XG5cdFx0XHRcdHBhdGggKz0gcGF0aFBhcnQgPyBgLyR7cGF0aFBhcnR9YCA6IFwiXCI7XG5cdFx0XHRcdGlmICghYXBwQ29tcG9uZW50LmdldFJvdXRlcigpLmdldFJvdXRlSW5mb0J5SGFzaChwYXRoKSkge1xuXHRcdFx0XHRcdC8vIElmIHRoZSB0YXJnZXQgaXMgbm90IGRlY2xhcmVkIGluIHRoZSByb3V0ZXMsIHdlIHNraXAgaXRcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gSWYgaW4gZnVsbCBOYXZpZ2F0aW9uIG1vZGUsIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBhcHBsaWNhdGlvbiB1c2VzIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUgZnJvbSB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0aWYgKCFpZHggJiYgcGF0aCA9PT0gXCJcIiAmJiB0aGlzLmhpZXJhcmNoeU1vZGUgPT09IGhpZXJhY2h5TW9kZU9wdGlvbnMuRlVMTCkge1xuXHRcdFx0XHRcdHByb21pc2VzLnB1c2godGhpcy5fZ2V0Rmlyc3RQYWdlVGl0bGVJbmZvcm1hdGlvbigpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBwYXJhbWV0ZXJQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHBhdGgpO1xuXHRcdFx0XHRjb25zdCByZXN1bHRDb250ZXh0ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtwYXJhbWV0ZXJQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKTtcblx0XHRcdFx0aWYgKHJlc3VsdENvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBXZSBkb250IG5lZWQgdG8gY3JlYXRlIGEgYnJlYWRjcnVtYiBmb3IgUGFyYW1ldGVyIHBhdGhcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cHJvbWlzZXMucHVzaChyb290Vmlld0NvbnRyb2xsZXIuZ2V0VGl0bGVJbmZvRnJvbVBhdGgocGF0aCkpO1xuXHRcdFx0fS5iaW5kKHRoaXMpXG5cdFx0KTtcblx0XHRyZXR1cm4gcHJvbWlzZXM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHBhdGggcGFydHMgZnJvbSB0aGUgZnVsbCBwYXRoIGZvciBsaW5rcy5cblx0ICogQHBhcmFtIGZ1bGxQYXRoRm9yTGlua3MgVGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgb2JqZWN0IHBhZ2UuXG5cdCAqIEByZXR1cm5zIFBhdGggcGFydHMgZm9yIGNyZWF0aW5nIGJyZWFkY3J1bWIgbGlua3MuXG5cdCAqL1xuXHRfZ2V0QnJlYWRjcnVtYnNQYXRoUGFydHMoZnVsbFBhdGhGb3JMaW5rczogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IHBhdGhQYXJ0cyA9IGZ1bGxQYXRoRm9yTGlua3M/LnNwbGl0KFwiL1wiKSA/PyBbXTtcblx0XHRpZiAodGhpcy5oaWVyYXJjaHlNb2RlICE9PSBoaWVyYWNoeU1vZGVPcHRpb25zLkZVTEwpIHtcblx0XHRcdHBhdGhQYXJ0cy5zaGlmdCgpOyAvLyBSZW1vdmUgXCJcIlxuXHRcdFx0cGF0aFBhcnRzLnNwbGljZSgtMSwgMSk7IC8vIFJlbW92ZSBjdXJyZW50IHBhZ2Vcblx0XHR9XG5cdFx0cmV0dXJuIHBhdGhQYXJ0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGNvbnRleHQgcGF0aCBmcm9tIHRoZSBoYXNoLlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggdG8gZ2V0IHRoZSBjb250ZXh0IHBhdGggZnJvbVxuXHQgKiBAcmV0dXJucyBDb250ZXh0IHBhdGggZnJvbSB0aGUgY29ycmVzcG9uZGluZyByb3V0ZSB0YXJnZXQgb3B0aW9uc1xuXHQgKi9cblx0X2dldENvbnRleHRQYXRoRnJvbUhhc2goc0hhc2g6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKSEsXG5cdFx0XHRyb290Vmlld0NvbnRyb2xsZXIgPSBhcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0Y29uc3QgeyBlbnRpdHlTZXQsIGNvbnRleHRQYXRoIH0gPSByb290Vmlld0NvbnRyb2xsZXIuZ2V0VGFyZ2V0T3B0aW9uc0Zyb21IYXNoKHNIYXNoKT8ub3B0aW9ucz8uc2V0dGluZ3MgPz8ge307XG5cdFx0cmV0dXJuIGNvbnRleHRQYXRoID8/IChlbnRpdHlTZXQgPyBgLyR7ZW50aXR5U2V0fWAgOiB1bmRlZmluZWQpO1xuXHR9XG5cblx0YXN5bmMgX2dldEZpcnN0UGFnZVRpdGxlSW5mb3JtYXRpb24oKTogUHJvbWlzZTxUaXRsZUluZm9ybWF0aW9uPiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKSEsXG5cdFx0XHRyb290Vmlld0NvbnRyb2xsZXIgPSBhcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCksXG5cdFx0XHRtYW5pZmVzdEFwcFNldHRpbmdzID0gYXBwQ29tcG9uZW50LmdldE1hbmlmZXN0RW50cnkoXCJzYXAuYXBwXCIpLFxuXHRcdFx0YXBwVGl0bGUgPSBtYW5pZmVzdEFwcFNldHRpbmdzLnRpdGxlIHx8IFwiXCIsXG5cdFx0XHRhcHBTdWJUaXRsZSA9IG1hbmlmZXN0QXBwU2V0dGluZ3Muc3ViVGl0bGUgfHwgXCJcIixcblx0XHRcdGFwcEljb24gPSBtYW5pZmVzdEFwcFNldHRpbmdzLmljb24gfHwgXCJcIixcblx0XHRcdGFwcFNwZWNpZmljSGFzaCA9IHJvb3RWaWV3Q29udHJvbGxlci5nZXRBcHBTcGVjaWZpY0hhc2goKSxcblx0XHRcdHJvb3RDb250ZXh0UGF0aCA9IHRoaXMuX2dldENvbnRleHRQYXRoRnJvbUhhc2goXCJcIiksXG5cdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoID0gdGhpcy5nZXREYXRhTW9kZWxPYmplY3RQYXRoKHJvb3RDb250ZXh0UGF0aCksXG5cdFx0XHR0eXBlTmFtZVBsdXJhbEFubm8gPSBkYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRFbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uVUk/LkhlYWRlckluZm8/LlR5cGVOYW1lUGx1cmFsLFxuXHRcdFx0ZXhwID0gY29tcGlsZUV4cHJlc3Npb24odHlwZU5hbWVQbHVyYWxBbm5vKSxcblx0XHRcdHJvb3RUeXBlTmFtZVBsdXJhbCA9IGV4cCA/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmcoZXhwLCB0aGlzKSA6IHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IHRpdGxlSW5mbyA9IHsgLi4uKGF3YWl0IHJvb3RWaWV3Q29udHJvbGxlci5nZXRSb290TGV2ZWxUaXRsZUluZm9ybWF0aW9uKGFwcFNwZWNpZmljSGFzaCwgYXBwVGl0bGUsIGFwcFN1YlRpdGxlLCBhcHBJY29uKSkgfTtcblx0XHR0aXRsZUluZm8uc3VidGl0bGUgPSByb290VHlwZU5hbWVQbHVyYWwgPyByb290VHlwZU5hbWVQbHVyYWwgOiB0aXRsZUluZm8udGl0bGU7XG5cdFx0Y29uc3Qgc3BhY2VOYW1lID0gdGhpcy5fZ2V0RkVNYW5pZmVzdEJyZWFkY3J1bWJTZXR0aW5ncygpPy5zcGFjZTtcblx0XHR0aXRsZUluZm8udGl0bGUgPSBzcGFjZU5hbWUgPyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nKHNwYWNlTmFtZSwgdGhpcykgOiBcIlwiO1xuXHRcdHJldHVybiB0aXRsZUluZm87XG5cdH1cblxuXHRfZ2V0RkVNYW5pZmVzdEJyZWFkY3J1bWJTZXR0aW5ncygpOiBOb25OdWxsYWJsZTxNYW5pZmVzdENvbnRlbnRbXCJzYXAuZmVcIl1bXCJhcHBcIl0+W1wiYnJlYWRjcnVtYnNcIl0gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkhLFxuXHRcdFx0bWFuaWZlc3RGRVNldHRpbmdzID0gYXBwQ29tcG9uZW50LmdldE1hbmlmZXN0RW50cnkoXCJzYXAuZmVcIik7XG5cdFx0cmV0dXJuIG1hbmlmZXN0RkVTZXR0aW5ncz8uYXBwPy5icmVhZGNydW1icztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGJyZWFkY3J1bWIgbGlua3MgaW4gdGhlIGdpdmVuIEJyZWFkY3J1bWJzIGNvbnRyb2wuXG5cdCAqXG5cdCAqIFRoaXMgbWV0aG9kIHJldHJpZXZlcyB0aGUgdGl0bGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggcGF0aCBwYXJ0IGFuZCBzZXRzIHRoZSBsaW5rcyBhY2NvcmRpbmdseS5cblx0ICogSWYgdGhlIGBmdWxsUGF0aEZvckxpbmtgIHBhcmFtZXRlciBpcyBub3QgcHJvdmlkZWQsIGl0IHVzZXMgdGhlIGJpbmRpbmcgY29udGV4dCBwYXRoIG9mIHRoZSBCcmVhZGNydW1icyBjb250cm9sLlxuXHQgKiBAcGFyYW0gZnVsbFBhdGhGb3JMaW5rcyBUaGUgZnVsbCBwYXRoIGZvciB0aGUgbGluaywgZGVmYXVsdHMgdG8gdGhlIGJpbmRpbmcgY29udGV4dCBwYXRoIG9mIHRoZSBCcmVhZGNydW1icyBjb250cm9sXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJyZWFkY3J1bWIgbGlua3MgYXJlIHNldFxuXHQgKi9cblx0YXN5bmMgc2V0QnJlYWRjcnVtYkxpbmtzKGZ1bGxQYXRoRm9yTGlua3MgPSB0aGlzLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0eXBlb2YgZnVsbFBhdGhGb3JMaW5rcyAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0TG9nLmluZm8oXCJCcmVhZGNydW1iczogcGF0aCBub3QgYXZhaWxhYmxlLiBDYW5ub3Qgc2V0IGJyZWFkY3J1bWIgbGlua3MuXCIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBicmVhZGNydW1ic0N0cmwgPSB0aGlzLmdldENvbnRlbnQoKTtcblx0XHRpZiAoIWJyZWFkY3J1bWJzQ3RybCkge1xuXHRcdFx0TG9nLmVycm9yKFwiQnJlYWRjcnVtYnMgQnVpbGRpbmcgYmxvY2s6IEJyZWFkY3J1bWJzIGNvbnRyb2wgbm90IGF2YWlsYWJsZS4gQ2Fubm90IHNldCBicmVhZGNydW1iIGxpbmtzLlwiKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHRpdGxlSGllcmFyY2h5SW5mb3M6IFRpdGxlSW5mb3JtYXRpb25bXSA9IGF3YWl0IFByb21pc2UuYWxsKHRoaXMuX2dldEJyZWFkY3J1bWJzVGl0bGVJbmZvcyhmdWxsUGF0aEZvckxpbmtzKSk7XG5cdFx0XHR0aXRsZUhpZXJhcmNoeUluZm9zLmZvckVhY2godGhpcy51cGRhdGVCcmVhZGNydW1iTGluay5iaW5kKHRoaXMpKTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2V0dGluZyB0aGUgYnJlYWRjcnVtYiBsaW5rczogXCIgKyBlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB0aGUgYnJlYWRjcnVtYiBsaW5rIGF0IHRoZSBzcGVjaWZpZWQgaGllcmFyY2h5IHBvc2l0aW9uLlxuXHQgKiBAcGFyYW0gdGl0bGVIaWVyYXJjaHlJbmZvIFRoZSB0aXRsZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGxpbmtcblx0ICogQHBhcmFtIGhpZXJhcmNoeVBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgbGluayBpbiB0aGUgaGllcmFyY2h5XG5cdCAqIEBwYXJhbSB0aXRsZUhpZXJhcmNoeUluZm9zIFRoZSBhcnJheSBvZiBhbGwgdGl0bGUgaW5mb3JtYXRpb24gZm9yIHRoZSBoaWVyYXJjaHlcblx0ICovXG5cdHVwZGF0ZUJyZWFkY3J1bWJMaW5rKHRpdGxlSGllcmFyY2h5SW5mbzogVGl0bGVJbmZvcm1hdGlvbiwgaGllcmFyY2h5UG9zaXRpb246IG51bWJlciwgdGl0bGVIaWVyYXJjaHlJbmZvczogVGl0bGVJbmZvcm1hdGlvbltdKTogdm9pZCB7XG5cdFx0Y29uc3QgYnJlYWRjcnVtYnNDdHJsID0gdGhpcy5nZXRDb250ZW50KCkhO1xuXHRcdGNvbnN0IGlzTGFzdExpbmsgPSBoaWVyYXJjaHlQb3NpdGlvbiA9PT0gdGl0bGVIaWVyYXJjaHlJbmZvcy5sZW5ndGggLSAxO1xuXHRcdGNvbnN0IGxpbmtUZXh0ID0gdGhpcy5nZXRMaW5rVGV4dCh0aXRsZUhpZXJhcmNoeUluZm8sIGlzTGFzdExpbmssIGhpZXJhcmNoeVBvc2l0aW9uKTtcblx0XHRpZiAoIWxpbmtUZXh0KSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJCcmVhZGNydW1iczogTm8gbGluayB0ZXh0IGF2YWlsYWJsZSBmb3IgdGhlIGJyZWFkY3J1bWIgbGluayBhdCBwb3NpdGlvbiBcIiArIGhpZXJhcmNoeVBvc2l0aW9uKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKGlzTGFzdExpbmsgJiYgdGhpcy5oaWVyYXJjaHlNb2RlID09PSBoaWVyYWNoeU1vZGVPcHRpb25zLkZVTEwpIHtcblx0XHRcdC8vIE5PVEU6IEFzIG9mIDEuMTM2LjAsIHRoZSBzZXRDdXJyZW50TG9jYXRpb25UZXh0IG1ldGhvZCBpcyBub3QgZGVwcmVjYXRlZC5cblx0XHRcdC8vIEl0IHdhcyBkZXByaWNhdGVkIGluIFVJNSAxLjEyMyBidXQgcmVpbnRyb2R1Y2VkIG9uL2JlZm9yZSBVSTUgMS4xMjcuXG5cdFx0XHQvLyBBcyBvZiBkYXkgb2Ygd3JpdGluZyB0aGlzLCB3ZSB1c2UgVUk1IDEuMTI0IGZvciBvcGVudWk1IHR5cGVzLlxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cdFx0XHRicmVhZGNydW1ic0N0cmwuc2V0Q3VycmVudExvY2F0aW9uVGV4dChsaW5rVGV4dCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGxpbmsgPSBicmVhZGNydW1ic0N0cmwuZ2V0TGlua3MoKVtoaWVyYXJjaHlQb3NpdGlvbl0gPyBicmVhZGNydW1ic0N0cmwuZ2V0TGlua3MoKVtoaWVyYXJjaHlQb3NpdGlvbl0gOiBuZXcgTGluaygpO1xuXHRcdFx0Ly9zQ3VycmVudEVudGl0eSBpcyBhIGZhbGxiYWNrIHZhbHVlIGluIGNhc2Ugb2YgZW1wdHkgdGl0bGVcblx0XHRcdGxpbmsuc2V0VGV4dChsaW5rVGV4dCk7XG5cdFx0XHQvL1dlIGFwcGx5IGFuIGFkZGl0aW9uYWwgZW5jb2RlVVJJIGluIGNhc2Ugb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIChpZSBcIi9cIikgdXNlZCBpbiB0aGUgdXJsIHRocm91Z2ggdGhlIHNlbWFudGljIGtleXNcblx0XHRcdGxpbmsuc2V0SHJlZihlbmNvZGVVUkkodGl0bGVIaWVyYXJjaHlJbmZvLmludGVudCEpKTtcblx0XHRcdGlmICghYnJlYWRjcnVtYnNDdHJsLmdldExpbmtzKClbaGllcmFyY2h5UG9zaXRpb25dKSB7XG5cdFx0XHRcdGJyZWFkY3J1bWJzQ3RybC5hZGRMaW5rKGxpbmspO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgbGluayB0ZXh0IGJhc2VkIG9uIHRpdGxlIGFuZCBzdWJ0aXRsZS5cblx0ICogQHBhcmFtIHRpdGxlSW5mbyBUaXRsZSBpbmZvcm1hdGlvbiBjb250YWluaW5nIHRpdGxlIGFuZCBzdWJ0aXRsZVxuXHQgKiBAcGFyYW0gaXNMYXN0TGluayBEZXRlcm1pbmVzIGlmIGl0IGlzIHRoZSBsYXN0IGxpbmsgaW4gdGhlIGJyZWFkY3J1bWJzXG5cdCAqIEBwYXJhbSBoaWVyYXJjaHlQb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgbGluayBpbiB0aGUgaGllcmFyY2h5XG5cdCAqIEByZXR1cm5zIExpbmsgdGV4dFxuXHQgKi9cblx0Z2V0TGlua1RleHQodGl0bGVJbmZvOiBUaXRsZUluZm9ybWF0aW9uLCBpc0xhc3RMaW5rOiBib29sZWFuLCBoaWVyYXJjaHlQb3NpdGlvbjogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB7IHRpdGxlLCBzdWJ0aXRsZSB9ID0gdGl0bGVJbmZvO1xuXHRcdGNvbnN0IHRpdGxlRXhpc3RzID0gdGl0bGUgIT09IHVuZGVmaW5lZCAmJiB0aXRsZSAhPT0gXCJcIjtcblx0XHRjb25zdCBzdWJ0aXRsZUV4aXN0cyA9IHN1YnRpdGxlICE9PSB1bmRlZmluZWQgJiYgc3VidGl0bGUgIT09IFwiXCI7XG5cdFx0aWYgKHRpdGxlRXhpc3RzICYmIHN1YnRpdGxlRXhpc3RzICYmIHRoaXMuaGllcmFyY2h5TW9kZSA9PT0gaGllcmFjaHlNb2RlT3B0aW9ucy5GVUxMKSB7XG5cdFx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzKTtcblx0XHRcdGNvbnN0IGlzRmlyc3RQYWdlID0gaGllcmFyY2h5UG9zaXRpb24gPT09IDE7XG5cdFx0XHRyZXR1cm4gIWlzRmlyc3RQYWdlICYmIGlzTGFzdExpbmsgPyB0aXRsZSA6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIlRfQlJFQURDUlVNQlNfVElUTEVfTE9OR19URU1QTEFURVwiLCBbdGl0bGUsIHN1YnRpdGxlXSk7XG5cdFx0fVxuXHRcdGlmIChzdWJ0aXRsZUV4aXN0cykge1xuXHRcdFx0cmV0dXJuIHN1YnRpdGxlO1xuXHRcdH0gZWxzZSBpZiAodGl0bGVFeGlzdHMpIHtcblx0XHRcdHJldHVybiB0aXRsZTtcblx0XHR9XG5cdH1cblxuXHRjcmVhdGVDb250ZW50KCk6IFVJNUJyZWFkY3J1bWJzIHtcblx0XHRjb25zdCB2aWV3SWQgPSB0aGlzLmdldFBhZ2VDb250cm9sbGVyKCk/LmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8VUk1QnJlYWRjcnVtYnNcblx0XHRcdFx0Ly8gVGhpcyBpcyBzZXQgYXMgYWJzb2x1dGUgSUQuXG5cdFx0XHRcdGlkPXt2aWV3SWQgPyBnZW5lcmF0ZShbYCR7dmlld0lkfS0tZmVgLCBcIkJyZWFkY3J1bWJzXCJdKSA6IHVuZGVmaW5lZH1cblx0XHRcdFx0bW9kZWxDb250ZXh0Q2hhbmdlPXsoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0dGhpcy5zZXRCcmVhZGNydW1iTGlua3MoKTtcblx0XHRcdFx0fX1cblx0XHRcdD48L1VJNUJyZWFkY3J1bWJzPlxuXHRcdCk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFZTyxNQUFNQSxtQkFBbUIsR0FBRztJQUNsQ0MsTUFBTSxFQUFFLGtCQUFrQjtJQUMxQkMsSUFBSSxFQUFFO0VBQ1AsQ0FBVTtFQUFDQyxRQUFBLENBQUFILG1CQUFBLEdBQUFBLG1CQUFBO0VBR1g7QUFDQTtBQUNBO0VBRkEsSUFJcUJJLFdBQVcsSUFB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
@@ -0,0 +1,243 @@
1
+ import Log from "sap/base/Log";
2
+ import { compileExpression } from "sap/fe/base/BindingToolkit";
3
+ import { defineUI5Class, implementInterface, property } from "sap/fe/base/ClassSupport";
4
+ import BuildingBlock from "sap/fe/core/buildingBlocks/BuildingBlock";
5
+ import CommonUtils from "sap/fe/core/CommonUtils";
6
+ import { getResourceModel } from "sap/fe/core/helpers/ResourceModelHelper";
7
+ import { generate } from "sap/fe/core/helpers/StableIdHelper";
8
+ import type { TitleInformation } from "sap/fe/core/rootView/RootViewBaseController";
9
+ import UI5Breadcrumbs from "sap/m/Breadcrumbs";
10
+ import Link from "sap/m/Link";
11
+ import type { ManifestContent } from "sap/ui/core/Manifest";
12
+
13
+ export const hierachyModeOptions = {
14
+ OBJECT: "objectNavigation",
15
+ FULL: "fullNavigation"
16
+ } as const;
17
+ export type HierachyMode = (typeof hierachyModeOptions)[keyof typeof hierachyModeOptions];
18
+
19
+ /**
20
+ * Building block used to create breadcrumbs.
21
+ */
22
+ @defineUI5Class("sap.fe.macros.Breadcrumbs")
23
+ export default class Breadcrumbs extends BuildingBlock<UI5Breadcrumbs> {
24
+ @implementInterface("sap.m.IBreadcrumbs")
25
+ __implements__sap_m_IBreadcrumbs = true;
26
+
27
+ /**
28
+ * Hierarchy mode for breadcrumbs
29
+ * @public
30
+ */
31
+ @property({
32
+ type: "string",
33
+ defaultValue: hierachyModeOptions.OBJECT,
34
+ allowedValues: Object.values(hierachyModeOptions)
35
+ })
36
+ hierarchyMode!: HierachyMode;
37
+
38
+ onMetadataAvailable(): void {
39
+ if (!this.content) {
40
+ this._getOwner()?.runAsOwner(() => {
41
+ this.content = this.createContent();
42
+ });
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Get breadcrumbs title information for full path.
48
+ * @param fullPathForLinks The context path of the object page.
49
+ * @returns Promises resolving to TitleInformation objects for each path part.
50
+ */
51
+ _getBreadcrumbsTitleInfos(fullPathForLinks: string): Promise<TitleInformation>[] {
52
+ const promises: Promise<TitleInformation>[] = [],
53
+ appComponent = this.getAppComponent()!,
54
+ rootViewController = appComponent.getRootViewController(),
55
+ metaModel = appComponent.getMetaModel(),
56
+ pathParts = this._getBreadcrumbsPathParts(fullPathForLinks);
57
+
58
+ let path = "";
59
+ if (this.hierarchyMode === hierachyModeOptions.FULL) {
60
+ // Home page
61
+ const resourceModel = getResourceModel(this);
62
+ const homeTitle = this._getFEManifestBreadcrumbSettings()?.home;
63
+ promises.push(
64
+ Promise.resolve({
65
+ intent: "#Shell-home",
66
+ title: homeTitle
67
+ ? CommonUtils.getTranslatedTextFromExpBindingString(homeTitle, this)
68
+ : resourceModel.getText("T_APP_HOME")
69
+ })
70
+ );
71
+ }
72
+ pathParts.forEach(
73
+ function (this: Breadcrumbs, pathPart: string, idx: number): void {
74
+ path += pathPart ? `/${pathPart}` : "";
75
+ if (!appComponent.getRouter().getRouteInfoByHash(path)) {
76
+ // If the target is not declared in the routes, we skip it
77
+ return;
78
+ }
79
+ // If in full Navigation mode, the first page of the application uses the title and subtitle from the manifest
80
+ if (!idx && path === "" && this.hierarchyMode === hierachyModeOptions.FULL) {
81
+ promises.push(this._getFirstPageTitleInformation());
82
+ return;
83
+ }
84
+
85
+ const parameterPath = metaModel.getMetaPath(path);
86
+ const resultContext = metaModel.getObject(`${parameterPath}/@com.sap.vocabularies.Common.v1.ResultContext`);
87
+ if (resultContext) {
88
+ // We dont need to create a breadcrumb for Parameter path
89
+ return;
90
+ }
91
+ promises.push(rootViewController.getTitleInfoFromPath(path));
92
+ }.bind(this)
93
+ );
94
+ return promises;
95
+ }
96
+
97
+ /**
98
+ * Get path parts from the full path for links.
99
+ * @param fullPathForLinks The context path of the object page.
100
+ * @returns Path parts for creating breadcrumb links.
101
+ */
102
+ _getBreadcrumbsPathParts(fullPathForLinks: string): string[] {
103
+ const pathParts = fullPathForLinks?.split("/") ?? [];
104
+ if (this.hierarchyMode !== hierachyModeOptions.FULL) {
105
+ pathParts.shift(); // Remove ""
106
+ pathParts.splice(-1, 1); // Remove current page
107
+ }
108
+ return pathParts;
109
+ }
110
+
111
+ /**
112
+ * Get the context path from the hash.
113
+ * @param sHash The hash to get the context path from
114
+ * @returns Context path from the corresponding route target options
115
+ */
116
+ _getContextPathFromHash(sHash: string): string | undefined {
117
+ const appComponent = this.getAppComponent()!,
118
+ rootViewController = appComponent.getRootViewController();
119
+ const { entitySet, contextPath } = rootViewController.getTargetOptionsFromHash(sHash)?.options?.settings ?? {};
120
+ return contextPath ?? (entitySet ? `/${entitySet}` : undefined);
121
+ }
122
+
123
+ async _getFirstPageTitleInformation(): Promise<TitleInformation> {
124
+ const appComponent = this.getAppComponent()!,
125
+ rootViewController = appComponent.getRootViewController(),
126
+ manifestAppSettings = appComponent.getManifestEntry("sap.app"),
127
+ appTitle = manifestAppSettings.title || "",
128
+ appSubTitle = manifestAppSettings.subTitle || "",
129
+ appIcon = manifestAppSettings.icon || "",
130
+ appSpecificHash = rootViewController.getAppSpecificHash(),
131
+ rootContextPath = this._getContextPathFromHash(""),
132
+ dataModelObjectPath = this.getDataModelObjectPath(rootContextPath),
133
+ typeNamePluralAnno = dataModelObjectPath?.targetEntityType?.annotations?.UI?.HeaderInfo?.TypeNamePlural,
134
+ exp = compileExpression(typeNamePluralAnno),
135
+ rootTypeNamePlural = exp ? CommonUtils.getTranslatedTextFromExpBindingString(exp, this) : undefined;
136
+
137
+ const titleInfo = { ...(await rootViewController.getRootLevelTitleInformation(appSpecificHash, appTitle, appSubTitle, appIcon)) };
138
+ titleInfo.subtitle = rootTypeNamePlural ? rootTypeNamePlural : titleInfo.title;
139
+ const spaceName = this._getFEManifestBreadcrumbSettings()?.space;
140
+ titleInfo.title = spaceName ? CommonUtils.getTranslatedTextFromExpBindingString(spaceName, this) : "";
141
+ return titleInfo;
142
+ }
143
+
144
+ _getFEManifestBreadcrumbSettings(): NonNullable<ManifestContent["sap.fe"]["app"]>["breadcrumbs"] | undefined {
145
+ const appComponent = this.getAppComponent()!,
146
+ manifestFESettings = appComponent.getManifestEntry("sap.fe");
147
+ return manifestFESettings?.app?.breadcrumbs;
148
+ }
149
+
150
+ /**
151
+ * Sets breadcrumb links in the given Breadcrumbs control.
152
+ *
153
+ * This method retrieves the title information for each path part and sets the links accordingly.
154
+ * If the `fullPathForLink` parameter is not provided, it uses the binding context path of the Breadcrumbs control.
155
+ * @param fullPathForLinks The full path for the link, defaults to the binding context path of the Breadcrumbs control
156
+ * @returns A promise that resolves when the breadcrumb links are set
157
+ */
158
+ async setBreadcrumbLinks(fullPathForLinks = this.getBindingContext()?.getPath()): Promise<void> {
159
+ if (typeof fullPathForLinks !== "string") {
160
+ Log.info("Breadcrumbs: path not available. Cannot set breadcrumb links.");
161
+ return;
162
+ }
163
+ const breadcrumbsCtrl = this.getContent();
164
+ if (!breadcrumbsCtrl) {
165
+ Log.error("Breadcrumbs Building block: Breadcrumbs control not available. Cannot set breadcrumb links.");
166
+ return;
167
+ }
168
+ try {
169
+ const titleHierarchyInfos: TitleInformation[] = await Promise.all(this._getBreadcrumbsTitleInfos(fullPathForLinks));
170
+ titleHierarchyInfos.forEach(this.updateBreadcrumbLink.bind(this));
171
+ } catch (error: unknown) {
172
+ Log.error("Error while setting the breadcrumb links: " + error);
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Update the breadcrumb link at the specified hierarchy position.
178
+ * @param titleHierarchyInfo The title information for the link
179
+ * @param hierarchyPosition The position of the link in the hierarchy
180
+ * @param titleHierarchyInfos The array of all title information for the hierarchy
181
+ */
182
+ updateBreadcrumbLink(titleHierarchyInfo: TitleInformation, hierarchyPosition: number, titleHierarchyInfos: TitleInformation[]): void {
183
+ const breadcrumbsCtrl = this.getContent()!;
184
+ const isLastLink = hierarchyPosition === titleHierarchyInfos.length - 1;
185
+ const linkText = this.getLinkText(titleHierarchyInfo, isLastLink, hierarchyPosition);
186
+ if (!linkText) {
187
+ Log.error("Breadcrumbs: No link text available for the breadcrumb link at position " + hierarchyPosition);
188
+ return;
189
+ }
190
+ if (isLastLink && this.hierarchyMode === hierachyModeOptions.FULL) {
191
+ // NOTE: As of 1.136.0, the setCurrentLocationText method is not deprecated.
192
+ // It was depricated in UI5 1.123 but reintroduced on/before UI5 1.127.
193
+ // As of day of writing this, we use UI5 1.124 for openui5 types.
194
+ // eslint-disable-next-line deprecation/deprecation
195
+ breadcrumbsCtrl.setCurrentLocationText(linkText);
196
+ } else {
197
+ const link = breadcrumbsCtrl.getLinks()[hierarchyPosition] ? breadcrumbsCtrl.getLinks()[hierarchyPosition] : new Link();
198
+ //sCurrentEntity is a fallback value in case of empty title
199
+ link.setText(linkText);
200
+ //We apply an additional encodeURI in case of special characters (ie "/") used in the url through the semantic keys
201
+ link.setHref(encodeURI(titleHierarchyInfo.intent!));
202
+ if (!breadcrumbsCtrl.getLinks()[hierarchyPosition]) {
203
+ breadcrumbsCtrl.addLink(link);
204
+ }
205
+ }
206
+ }
207
+
208
+ /**
209
+ * Get link text based on title and subtitle.
210
+ * @param titleInfo Title information containing title and subtitle
211
+ * @param isLastLink Determines if it is the last link in the breadcrumbs
212
+ * @param hierarchyPosition Position of the link in the hierarchy
213
+ * @returns Link text
214
+ */
215
+ getLinkText(titleInfo: TitleInformation, isLastLink: boolean, hierarchyPosition: number): string | undefined {
216
+ const { title, subtitle } = titleInfo;
217
+ const titleExists = title !== undefined && title !== "";
218
+ const subtitleExists = subtitle !== undefined && subtitle !== "";
219
+ if (titleExists && subtitleExists && this.hierarchyMode === hierachyModeOptions.FULL) {
220
+ const resourceModel = getResourceModel(this);
221
+ const isFirstPage = hierarchyPosition === 1;
222
+ return !isFirstPage && isLastLink ? title : resourceModel.getText("T_BREADCRUMBS_TITLE_LONG_TEMPLATE", [title, subtitle]);
223
+ }
224
+ if (subtitleExists) {
225
+ return subtitle;
226
+ } else if (titleExists) {
227
+ return title;
228
+ }
229
+ }
230
+
231
+ createContent(): UI5Breadcrumbs {
232
+ const viewId = this.getPageController()?.getView().getId();
233
+ return (
234
+ <UI5Breadcrumbs
235
+ // This is set as absolute ID.
236
+ id={viewId ? generate([`${viewId}--fe`, "Breadcrumbs"]) : undefined}
237
+ modelContextChange={(): void => {
238
+ this.setBreadcrumbLinks();
239
+ }}
240
+ ></UI5Breadcrumbs>
241
+ );
242
+ }
243
+ }