@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.
- package/package.json +1 -1
- package/src/sap/fe/macros/.library +1 -1
- package/src/sap/fe/macros/Breadcrumbs.js +269 -0
- package/src/sap/fe/macros/Breadcrumbs.tsx +243 -0
- package/src/sap/fe/macros/CommonHelper.js +2 -2
- package/src/sap/fe/macros/CommonHelper.ts +1 -1
- package/src/sap/fe/macros/Field.js +85 -58
- package/src/sap/fe/macros/Field.ts +104 -60
- package/src/sap/fe/macros/FooterContent.js +44 -11
- package/src/sap/fe/macros/FooterContent.tsx +48 -9
- package/src/sap/fe/macros/FormElement.js +2 -2
- package/src/sap/fe/macros/FormElement.ts +1 -2
- package/src/sap/fe/macros/MessageButton.js +1 -2
- package/src/sap/fe/macros/MessageButton.tsx +0 -1
- package/src/sap/fe/macros/MultiValueField.js +17 -6
- package/src/sap/fe/macros/MultiValueField.tsx +7 -4
- package/src/sap/fe/macros/RichTextEditor.js +30 -5
- package/src/sap/fe/macros/RichTextEditor.tsx +34 -6
- package/src/sap/fe/macros/Share.js +85 -40
- package/src/sap/fe/macros/Share.tsx +42 -1
- package/src/sap/fe/macros/Status.js +226 -0
- package/src/sap/fe/macros/Status.tsx +192 -0
- package/src/sap/fe/macros/ValueHelp.js +4 -29
- package/src/sap/fe/macros/ValueHelp.tsx +2 -43
- package/src/sap/fe/macros/ai/EasyFillButton.js +10 -4
- package/src/sap/fe/macros/ai/EasyFillButton.tsx +8 -1
- package/src/sap/fe/macros/ai/EasyFillDialog.js +25 -10
- package/src/sap/fe/macros/ai/EasyFillDialog.tsx +32 -23
- package/src/sap/fe/macros/ai/EasyFilterBar.js +123 -114
- package/src/sap/fe/macros/ai/EasyFilterBar.tsx +140 -124
- package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +11 -5
- package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +14 -5
- package/src/sap/fe/macros/ai/SummarizationButton.js +2 -2
- package/src/sap/fe/macros/ai/SummarizationButton.tsx +1 -1
- package/src/sap/fe/macros/chart/ChartDelegate.js +4 -4
- package/src/sap/fe/macros/chart/ChartDelegate.ts +3 -3
- package/src/sap/fe/macros/chart/ChartHelper.js +1 -2
- package/src/sap/fe/macros/chart/ChartHelper.ts +0 -1
- package/src/sap/fe/macros/chart/ChartRuntime.js +1 -2
- package/src/sap/fe/macros/chart/ChartRuntime.ts +0 -1
- package/src/sap/fe/macros/chart/MdcChartTemplate.js +20 -6
- package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +16 -8
- package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.js +3 -1
- package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.ts +2 -0
- package/src/sap/fe/macros/controls/FieldWrapper.js +9 -3
- package/src/sap/fe/macros/controls/FieldWrapper.ts +11 -2
- package/src/sap/fe/macros/controls/FilterBar.js +49 -2
- package/src/sap/fe/macros/controls/FilterBar.ts +55 -1
- package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +2 -2
- package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -2
- package/src/sap/fe/macros/controls/RequiredFlexBox.js +62 -0
- package/src/sap/fe/macros/controls/RequiredFlexBox.tsx +20 -0
- package/src/sap/fe/macros/controls/filterbar/VisualFilter.js +21 -11
- package/src/sap/fe/macros/controls/filterbar/VisualFilter.ts +25 -11
- package/src/sap/fe/macros/controls/filterbar/VisualFilterContainer.js +11 -2
- package/src/sap/fe/macros/controls/filterbar/VisualFilterContainer.ts +12 -1
- package/src/sap/fe/macros/controls/filterbar/utils/VisualFilterUtils.js +18 -1
- package/src/sap/fe/macros/controls/filterbar/utils/VisualFilterUtils.ts +20 -0
- package/src/sap/fe/macros/coreUI/CreateDialog.js +2 -2
- package/src/sap/fe/macros/coreUI/CreateDialog.tsx +1 -1
- package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +43 -4
- package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +48 -1
- package/src/sap/fe/macros/designtime/Designtime.helper.js +39 -2
- package/src/sap/fe/macros/designtime/Designtime.helper.ts +39 -0
- package/src/sap/fe/macros/draftIndicator/DraftIndicator.js +15 -4
- package/src/sap/fe/macros/draftIndicator/DraftIndicator.tsx +5 -0
- package/src/sap/fe/macros/field/FieldBaseDelegate.js +20 -8
- package/src/sap/fe/macros/field/FieldBaseDelegate.ts +34 -9
- package/src/sap/fe/macros/field/FieldFormatOptions.js +73 -44
- package/src/sap/fe/macros/field/FieldFormatOptions.ts +20 -2
- package/src/sap/fe/macros/field/FieldRuntime.js +1 -2
- package/src/sap/fe/macros/field/FieldRuntime.ts +0 -1
- package/src/sap/fe/macros/filter/FilterUtils.js +3 -5
- package/src/sap/fe/macros/filter/FilterUtils.ts +2 -4
- package/src/sap/fe/macros/filterBar/FilterBar.block.js +8 -2
- package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +2 -5
- package/src/sap/fe/macros/filterBar/FilterBarAPI.js +8 -8
- package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +8 -8
- package/src/sap/fe/macros/filterBar/designtime/FilterBar.designtime.js +3 -1
- package/src/sap/fe/macros/filterBar/designtime/FilterBar.designtime.ts +2 -0
- package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +1 -1
- package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +1 -1
- package/src/sap/fe/macros/form/Form.js +1 -4
- package/src/sap/fe/macros/form/Form.tsx +0 -3
- package/src/sap/fe/macros/form/FormActionButtons.fragment.xml +13 -2
- package/src/sap/fe/macros/form/FormContainer.block.js +1 -2
- package/src/sap/fe/macros/form/FormContainer.block.ts +0 -1
- package/src/sap/fe/macros/form/FormContainer.fragment.xml +40 -0
- package/src/sap/fe/macros/form/FormContainerAPI.js +14 -16
- package/src/sap/fe/macros/form/FormContainerAPI.ts +13 -15
- package/src/sap/fe/macros/form/FormDelegate.js +20 -1
- package/src/sap/fe/macros/form/FormDelegate.ts +25 -0
- package/src/sap/fe/macros/form/FormHelper.js +1 -2
- package/src/sap/fe/macros/form/FormHelper.ts +0 -1
- package/src/sap/fe/macros/formatters/TableFormatter.js +10 -1
- package/src/sap/fe/macros/formatters/TableFormatter.ts +14 -5
- package/src/sap/fe/macros/fpm/CustomFragment.block.js +1 -2
- package/src/sap/fe/macros/fpm/CustomFragment.block.ts +0 -1
- package/src/sap/fe/macros/inlineEdit/InlineEdit.js +15 -3
- package/src/sap/fe/macros/inlineEdit/InlineEdit.ts +14 -2
- package/src/sap/fe/macros/internal/ActionCommand.block.js +1 -2
- package/src/sap/fe/macros/internal/ActionCommand.block.ts +0 -1
- package/src/sap/fe/macros/internal/DataPoint.js +2 -1
- package/src/sap/fe/macros/internal/DataPoint.tsx +1 -0
- package/src/sap/fe/macros/internal/DataPointFormatOptions.js +11 -2
- package/src/sap/fe/macros/internal/DataPointFormatOptions.ts +3 -0
- package/src/sap/fe/macros/internal/FilterField.block.js +10 -2
- package/src/sap/fe/macros/internal/FilterField.block.ts +11 -1
- package/src/sap/fe/macros/internal/field/CheckBoxGroup.fragment.xml +25 -0
- package/src/sap/fe/macros/internal/field/DisplayStyle.js +51 -13
- package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +53 -6
- package/src/sap/fe/macros/internal/field/EditStyle.js +5 -1
- package/src/sap/fe/macros/internal/field/EditStyle.tsx +4 -0
- package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +9 -2
- package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +11 -0
- package/src/sap/fe/macros/internal/field/FieldStyles.js +1 -1
- package/src/sap/fe/macros/internal/field/FieldStyles.tsx +2 -1
- package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.js +46 -8
- package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.ts +60 -6
- package/src/sap/fe/macros/internal/valuehelp/TableDelegate.js +38 -2
- package/src/sap/fe/macros/internal/valuehelp/TableDelegate.ts +37 -2
- package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +2 -1
- package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +16 -5
- package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +21 -9
- package/src/sap/fe/macros/internal/valuehelp/ValueListTable.fragment.xml +1 -0
- package/src/sap/fe/macros/library.js +1 -1
- package/src/sap/fe/macros/mdc/adapter/StateHelper.js +7 -2
- package/src/sap/fe/macros/mdc/adapter/StateHelper.ts +7 -3
- package/src/sap/fe/macros/messagebundle.properties +42 -32
- package/src/sap/fe/macros/messagebundle_ar.properties +12 -4
- package/src/sap/fe/macros/messagebundle_bg.properties +11 -3
- package/src/sap/fe/macros/messagebundle_ca.properties +15 -7
- package/src/sap/fe/macros/messagebundle_cnr.properties +12 -4
- package/src/sap/fe/macros/messagebundle_cs.properties +10 -2
- package/src/sap/fe/macros/messagebundle_cy.properties +12 -4
- package/src/sap/fe/macros/messagebundle_da.properties +11 -3
- package/src/sap/fe/macros/messagebundle_de.properties +18 -10
- package/src/sap/fe/macros/messagebundle_el.properties +13 -5
- package/src/sap/fe/macros/messagebundle_en.properties +16 -8
- package/src/sap/fe/macros/messagebundle_en_GB.properties +16 -8
- package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +16 -8
- package/src/sap/fe/macros/messagebundle_es.properties +13 -5
- package/src/sap/fe/macros/messagebundle_es_MX.properties +14 -6
- package/src/sap/fe/macros/messagebundle_et.properties +13 -5
- package/src/sap/fe/macros/messagebundle_fi.properties +14 -6
- package/src/sap/fe/macros/messagebundle_fr.properties +14 -6
- package/src/sap/fe/macros/messagebundle_fr_CA.properties +15 -7
- package/src/sap/fe/macros/messagebundle_hi.properties +11 -3
- package/src/sap/fe/macros/messagebundle_hr.properties +11 -3
- package/src/sap/fe/macros/messagebundle_hu.properties +10 -2
- package/src/sap/fe/macros/messagebundle_id.properties +18 -10
- package/src/sap/fe/macros/messagebundle_it.properties +10 -2
- package/src/sap/fe/macros/messagebundle_iw.properties +10 -2
- package/src/sap/fe/macros/messagebundle_ja.properties +13 -5
- package/src/sap/fe/macros/messagebundle_kk.properties +15 -7
- package/src/sap/fe/macros/messagebundle_ko.properties +10 -2
- package/src/sap/fe/macros/messagebundle_lt.properties +11 -3
- package/src/sap/fe/macros/messagebundle_lv.properties +12 -4
- package/src/sap/fe/macros/messagebundle_mk.properties +12 -4
- package/src/sap/fe/macros/messagebundle_ms.properties +14 -6
- package/src/sap/fe/macros/messagebundle_nl.properties +13 -5
- package/src/sap/fe/macros/messagebundle_no.properties +12 -4
- package/src/sap/fe/macros/messagebundle_pl.properties +12 -4
- package/src/sap/fe/macros/messagebundle_pt.properties +13 -5
- package/src/sap/fe/macros/messagebundle_pt_PT.properties +12 -4
- package/src/sap/fe/macros/messagebundle_ro.properties +12 -4
- package/src/sap/fe/macros/messagebundle_ru.properties +13 -5
- package/src/sap/fe/macros/messagebundle_sh.properties +12 -4
- package/src/sap/fe/macros/messagebundle_sk.properties +11 -3
- package/src/sap/fe/macros/messagebundle_sl.properties +12 -4
- package/src/sap/fe/macros/messagebundle_sr.properties +12 -4
- package/src/sap/fe/macros/messagebundle_sv.properties +11 -3
- package/src/sap/fe/macros/messagebundle_th.properties +11 -3
- package/src/sap/fe/macros/messagebundle_tr.properties +10 -2
- package/src/sap/fe/macros/messagebundle_uk.properties +17 -9
- package/src/sap/fe/macros/messagebundle_vi.properties +12 -4
- package/src/sap/fe/macros/messagebundle_zh_CN.properties +11 -3
- package/src/sap/fe/macros/messagebundle_zh_TW.properties +12 -4
- package/src/sap/fe/macros/messages/MessageButton.js +55 -36
- package/src/sap/fe/macros/messages/MessageButton.ts +64 -39
- package/src/sap/fe/macros/messages/MessagePopover.js +2 -2
- package/src/sap/fe/macros/messages/MessagePopover.ts +4 -4
- package/src/sap/fe/macros/microchart/MicroChartContainer.js +1 -2
- package/src/sap/fe/macros/microchart/MicroChartContainer.ts +1 -2
- package/src/sap/fe/macros/microchart/MicroChartHelper.js +1 -2
- package/src/sap/fe/macros/microchart/MicroChartHelper.tsx +0 -1
- package/src/sap/fe/macros/share/ShareAPI.js +4 -29
- package/src/sap/fe/macros/share/ShareAPI.ts +1 -32
- package/src/sap/fe/macros/situations/SituationsPopover.js +3 -1
- package/src/sap/fe/macros/situations/SituationsPopover.ts +2 -0
- package/src/sap/fe/macros/table/Action.js +24 -2
- package/src/sap/fe/macros/table/Action.ts +13 -0
- package/src/sap/fe/macros/table/ActionGroup.js +24 -2
- package/src/sap/fe/macros/table/ActionGroup.ts +13 -0
- package/src/sap/fe/macros/table/ActionGroupOverride.js +24 -2
- package/src/sap/fe/macros/table/ActionGroupOverride.ts +13 -0
- package/src/sap/fe/macros/table/ActionOverride.js +24 -2
- package/src/sap/fe/macros/table/ActionOverride.ts +13 -0
- package/src/sap/fe/macros/table/ActionsTemplating.js +73 -12
- package/src/sap/fe/macros/table/ActionsTemplating.tsx +69 -13
- package/src/sap/fe/macros/table/Column.js +3 -3
- package/src/sap/fe/macros/table/Column.ts +2 -2
- package/src/sap/fe/macros/table/MdcTableTemplate.js +20 -8
- package/src/sap/fe/macros/table/MdcTableTemplate.tsx +36 -7
- package/src/sap/fe/macros/table/QuickFilterSelector.js +35 -14
- package/src/sap/fe/macros/table/QuickFilterSelector.tsx +22 -3
- package/src/sap/fe/macros/table/Table.block.js +137 -108
- package/src/sap/fe/macros/table/Table.block.tsx +29 -2
- package/src/sap/fe/macros/table/TableAPI.js +143 -133
- package/src/sap/fe/macros/table/TableAPI.ts +5 -1
- package/src/sap/fe/macros/table/TableDefinition.js +4 -2
- package/src/sap/fe/macros/table/TableDefinition.ts +3 -1
- package/src/sap/fe/macros/table/TableHelper.js +1 -2
- package/src/sap/fe/macros/table/TableHelper.ts +0 -1
- package/src/sap/fe/macros/table/TableRuntime.js +26 -7
- package/src/sap/fe/macros/table/TableRuntime.ts +33 -5
- package/src/sap/fe/macros/table/Utils.js +6 -2
- package/src/sap/fe/macros/table/Utils.ts +5 -1
- package/src/sap/fe/macros/table/delegates/ALPTableDelegate.js +1 -2
- package/src/sap/fe/macros/table/delegates/ALPTableDelegate.ts +0 -1
- package/src/sap/fe/macros/table/delegates/TableDelegate.js +25 -20
- package/src/sap/fe/macros/table/delegates/TableDelegate.ts +25 -24
- package/src/sap/fe/macros/table/delegates/TreeTableDelegate.js +1 -2
- package/src/sap/fe/macros/table/delegates/TreeTableDelegate.ts +0 -1
- package/src/sap/fe/macros/table/designtime/Table.designtime.js +3 -1
- package/src/sap/fe/macros/table/designtime/Table.designtime.ts +2 -0
- package/src/sap/fe/macros/table/massEdit/designtime/MassEdit.designtime.js +3 -1
- package/src/sap/fe/macros/table/massEdit/designtime/MassEdit.designtime.ts +2 -1
- package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +2 -1
- package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +1 -0
- package/src/sap/fe/macros/table/mixin/TableHierarchy.js +8 -1
- package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +10 -0
- package/src/sap/fe/macros/table/mixin/TableSharing.js +3 -2
- package/src/sap/fe/macros/table/mixin/TableSharing.ts +9 -1
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +20 -6
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +36 -14
- package/src/sap/fe/macros/visualfilters/VisualFilter.js +95 -7
- package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +93 -3
- package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +16 -5
- package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +18 -4
package/package.json
CHANGED
|
@@ -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
|
+
}
|