@sapui5/sap.fe.templates 1.147.0 → 1.148.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/AnalyticalListPage/manifest.json +1 -1
  4. package/src/sap/fe/templates/ListReport/ListReport.view.xml +2 -2
  5. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +10 -16
  6. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +10 -17
  7. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +4 -1
  8. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.ts +3 -0
  9. package/src/sap/fe/templates/ListReport/manifest.json +1 -1
  10. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +134 -24
  11. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +132 -19
  12. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +195 -20
  13. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +226 -22
  14. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +16 -8
  15. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +20 -9
  16. package/src/sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog.js +4 -1
  17. package/src/sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog.tsx +1 -0
  18. package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.js +15 -4
  19. package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.tsx +11 -2
  20. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +28 -1
  21. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +31 -0
  22. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +9 -3
  23. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +9 -1
  24. package/src/sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper.js +72 -0
  25. package/src/sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper.ts +75 -0
  26. package/src/sap/fe/templates/ObjectPage/manifest.json +1 -15
  27. package/src/sap/fe/templates/ObjectPage/overrides/CollaborationManager.js +29 -20
  28. package/src/sap/fe/templates/ObjectPage/overrides/CollaborationManager.ts +28 -21
  29. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +4 -3
  30. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +4 -4
  31. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +93 -17
  32. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +108 -22
  33. package/src/sap/fe/templates/ObjectPage/view/fragments/EmphasizedFirstHeaderAction.fragment.xml +1 -0
  34. package/src/sap/fe/templates/ObjectPage/view/fragments/ExpandedHeading.fragment.xml +4 -4
  35. package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +4 -4
  36. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderAddress.fragment.xml +1 -1
  37. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +1 -1
  38. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +1 -0
  39. package/src/sap/fe/templates/library.js +1 -1
  40. package/src/sap/fe/templates/messagebundle_no.properties +1 -1
  41. package/src/sap/fe/templates/messagebundle_uk.properties +1 -1
@@ -15,28 +15,35 @@ const CollaborationManagerOverride = {
15
15
  const controller = view.getController();
16
16
  const appComponent = controller.getOwnerComponent().getAppComponent();
17
17
  const isEditable = CommonUtils.getIsEditable(view);
18
- await controller.pageReady.waitPageReady();
19
- const card = !isEditable
20
- ? await appComponent.getCollaborationManagerService().getDesignTimeCard(RetrieveCardTypes.INTEGRATION)
21
- : undefined;
22
- if (card) {
23
- const onAddCardToCollaborationManagerCallback = (): void => {
24
- try {
25
- if (card) {
26
- appComponent.getCollaborationManagerService().publishCard(card as CardManifest);
27
- return;
28
- }
29
- } catch (e) {
30
- showGenericErrorMessage(view);
31
- Log.error(e as string);
18
+ if (!isEditable) {
19
+ // Start card retrieval immediately and register it with pageReady so it runs in
20
+ // parallel with the OData page load instead of sequentially after it.
21
+ // _getPageTitleInformation uses requestProperty() which is an OData V4 async API
22
+ // that safely queues data requests and resolves when entity data arrives.
23
+ const cardRetrievalPromise = (async (): Promise<void> => {
24
+ const card = await appComponent.getCollaborationManagerService().getDesignTimeCard(RetrieveCardTypes.INTEGRATION);
25
+ if (card) {
26
+ const onAddCardToCollaborationManagerCallback = (): void => {
27
+ try {
28
+ if (card) {
29
+ appComponent.getCollaborationManagerService().publishCard(card as CardManifest);
30
+ return;
31
+ }
32
+ } catch (e) {
33
+ showGenericErrorMessage(view);
34
+ Log.error(e as string);
35
+ }
36
+ };
37
+ const pageTitleInformation = await controller._getPageTitleInformation();
38
+ cards.push({
39
+ card: card,
40
+ title: pageTitleInformation.subtitle || "",
41
+ callback: onAddCardToCollaborationManagerCallback
42
+ });
32
43
  }
33
- };
34
- const pageTitleInformation = await controller._getPageTitleInformation();
35
- cards.push({
36
- card: card,
37
- title: pageTitleInformation.subtitle || "",
38
- callback: onAddCardToCollaborationManagerCallback
39
- });
44
+ })();
45
+ controller.pageReady.waitFor(cardRetrievalPromise);
46
+ await cardRetrievalPromise;
40
47
  }
41
48
  }
42
49
  };
@@ -14,9 +14,10 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/navigation/SelectionVariant"],
14
14
  const oAppComponent = CommonUtils.getAppComponent(oView);
15
15
  const oMetaModel = oAppComponent.getModel().getMetaModel();
16
16
  const oPageContext = oView.getBindingContext();
17
+
17
18
  //If the link context is same as page context merging of context should not happen
18
- const mergeLinkContext = oTargetInfo?.linkContextPath ? oPageContext.getPath() !== oTargetInfo?.linkContextPath : true;
19
- if (oExternalNavigationContext?.page && mergeLinkContext) {
19
+ const mergeLinkContext = oTargetInfo?.linkContextPath ? oPageContext?.getPath() !== oTargetInfo?.linkContextPath : true;
20
+ if (oExternalNavigationContext?.page && mergeLinkContext && oPageContext) {
20
21
  const sMetaPath = oMetaModel.getMetaPath(oPageContext.getPath());
21
22
  let pageAttributes = oPageContext.getObject();
22
23
  pageAttributes = oController._intentBasedNavigation.processSemanticAttributes(oPageContext, oPageContext.getObject());
@@ -55,4 +56,4 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/navigation/SelectionVariant"],
55
56
  };
56
57
  return IntentBasedNavigationOverride;
57
58
  }, false);
58
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsImFkYXB0TmF2aWdhdGlvbkNvbnRleHQiLCJvU2VsZWN0aW9uVmFyaWFudCIsIm9UYXJnZXRJbmZvIiwib1ZpZXciLCJnZXRWaWV3Iiwib0NvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwib0ludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvRXh0ZXJuYWxOYXZpZ2F0aW9uQ29udGV4dCIsImdldFByb3BlcnR5Iiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50Iiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib1BhZ2VDb250ZXh0IiwibWVyZ2VMaW5rQ29udGV4dCIsImxpbmtDb250ZXh0UGF0aCIsImdldFBhdGgiLCJwYWdlIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJwYWdlQXR0cmlidXRlcyIsImdldE9iamVjdCIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJwcm9jZXNzU2VtYW50aWNBdHRyaWJ1dGVzIiwib1BhZ2VDb250ZXh0RGF0YSIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJvUGFnZURhdGEiLCJwcmVwYXJlQ29udGV4dEZvckV4dGVybmFsTmF2aWdhdGlvbiIsIm9QYWdlUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCIsInByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QiLCJvUGFnZVNWIiwiYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQiLCJTZWxlY3Rpb25WYXJpYW50Iiwic2VtYW50aWNBdHRyaWJ1dGVzIiwib1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QiLCJhU2VsZWN0T3B0aW9uUHJvcGVydHlOYW1lcyIsImdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzIiwiZm9yRWFjaCIsInNQcm9wZXJ0eU5hbWUiLCJnZXRTZWxlY3RPcHRpb24iLCJtYXNzQWRkU2VsZWN0T3B0aW9uIiwibGlua0NvbnRleHQiLCJzZXRQcm9wZXJ0eSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZW50QmFzZWROYXZpZ2F0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbmNvbnN0IEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlID0ge1xuXHRhZGFwdE5hdmlnYXRpb25Db250ZXh0OiBmdW5jdGlvbiAoXG5cdFx0dGhpczogSW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRcdG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LFxuXHRcdG9UYXJnZXRJbmZvPzogeyBsaW5rQ29udGV4dFBhdGg6IHN0cmluZzsgbGlua0NvbnRleHQ/OiB1bmtub3duOyBwcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcixcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRvRXh0ZXJuYWxOYXZpZ2F0aW9uQ29udGV4dCA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImV4dGVybmFsTmF2aWdhdGlvbkNvbnRleHRcIik7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBvUGFnZUNvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0Ly9JZiB0aGUgbGluayBjb250ZXh0IGlzIHNhbWUgYXMgcGFnZSBjb250ZXh0IG1lcmdpbmcgb2YgY29udGV4dCBzaG91bGQgbm90IGhhcHBlblxuXHRcdGNvbnN0IG1lcmdlTGlua0NvbnRleHQgPSBvVGFyZ2V0SW5mbz8ubGlua0NvbnRleHRQYXRoID8gb1BhZ2VDb250ZXh0LmdldFBhdGgoKSAhPT0gb1RhcmdldEluZm8/LmxpbmtDb250ZXh0UGF0aCA6IHRydWU7XG5cdFx0aWYgKG9FeHRlcm5hbE5hdmlnYXRpb25Db250ZXh0Py5wYWdlICYmIG1lcmdlTGlua0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob1BhZ2VDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRsZXQgcGFnZUF0dHJpYnV0ZXMgPSBvUGFnZUNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRwYWdlQXR0cmlidXRlcyA9IG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ucHJvY2Vzc1NlbWFudGljQXR0cmlidXRlcyhvUGFnZUNvbnRleHQsIG9QYWdlQ29udGV4dC5nZXRPYmplY3QoKSk7XG5cdFx0XHRjb25zdCBvUGFnZUNvbnRleHREYXRhID0gb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5yZW1vdmVTZW5zaXRpdmVEYXRhKHBhZ2VBdHRyaWJ1dGVzLCBzTWV0YVBhdGgpLFxuXHRcdFx0XHRvUGFnZURhdGEgPSBvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLnByZXBhcmVDb250ZXh0Rm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKG9QYWdlQ29udGV4dERhdGEsIG9QYWdlQ29udGV4dCksXG5cdFx0XHRcdG9QYWdlUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCA9IG9QYWdlRGF0YS5wcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0LFxuXHRcdFx0XHQvLyBUT0RPOiBtb3ZlIHRoaXMgYWxzbyBpbnRvIHRoZSBpbnRlbnQgYmFzZWQgbmF2aWdhdGlvbiBjb250cm9sbGVyIGV4dGVuc2lvblxuXHRcdFx0XHRvUGFnZVNWID0gQ29tbW9uVXRpbHMuYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQoXG5cdFx0XHRcdFx0bmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0XHRvUGFnZURhdGEuc2VtYW50aWNBdHRyaWJ1dGVzIGFzIHVua25vd25bXSxcblx0XHRcdFx0XHRvVmlld1xuXHRcdFx0XHQpLFxuXHRcdFx0XHRvUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCA9IG9UYXJnZXRJbmZvPy5wcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0O1xuXHRcdFx0Y29uc3QgYVNlbGVjdE9wdGlvblByb3BlcnR5TmFtZXMgPSBvUGFnZVNWLmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCk7XG5cdFx0XHRhU2VsZWN0T3B0aW9uUHJvcGVydHlOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKCFvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oc1Byb3BlcnR5TmFtZSkpIHtcblx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wZXJ0eU5hbWUsIG9QYWdlU1YuZ2V0U2VsZWN0T3B0aW9uKHNQcm9wZXJ0eU5hbWUpISk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gT25seSB3aGVuIHRoZXJlIGlzIG5vIGNvbmZsaWN0IGRvIHdlIG5lZWQgdG8gYWRkIHNvbWV0aGluZ1xuXHRcdFx0XHRcdC8vIGluIGFsbCBvdGhlciBjYXNlIHRoZSBjb25mbGljdGVkIHBhdGhzIGFyZSBhbHJlYWR5IGFkZGVkIGluIHByZXBhcmVDb250ZXh0Rm9yRXh0ZXJuYWxOYXZpZ2F0aW9uXG5cdFx0XHRcdFx0Ly8gaWYgcHJvcGVydHkgd2FzIHdpdGhvdXQgY29uZmxpY3QgaW4gaW5jb21pbmcgY29udGV4dCB0aGVuIGFkZCBwYXRoIGZyb20gaW5jb21pbmcgY29udGV4dCB0byBTVlxuXHRcdFx0XHRcdC8vIFRPLURPLiBSZW1vdmUgdGhlIGNoZWNrIGZvciBvUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCBvbmNlIHNlbWFudGljIGxpbmtzIGZ1bmN0aW9uYWxpdHkgaXMgY292ZXJlZFxuXHRcdFx0XHRcdGlmIChvUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCAmJiBzUHJvcGVydHlOYW1lIGluIG9Qcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0KSB7XG5cdFx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5tYXNzQWRkU2VsZWN0T3B0aW9uKFxuXHRcdFx0XHRcdFx0XHRvUHJvcGVydGllc1dpdGhvdXRDb25mbGljdFtzUHJvcGVydHlOYW1lXSxcblx0XHRcdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKHNQcm9wZXJ0eU5hbWUpIVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gaWYgcHJvcGVydHkgd2FzIHdpdGhvdXQgY29uZmxpY3QgaW4gcGFnZSBjb250ZXh0IHRoZW4gYWRkIHBhdGggZnJvbSBwYWdlIGNvbnRleHQgdG8gU1Zcblx0XHRcdFx0XHRpZiAoc1Byb3BlcnR5TmFtZSBpbiBvUGFnZVByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QpIHtcblx0XHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50Lm1hc3NBZGRTZWxlY3RPcHRpb24oXG5cdFx0XHRcdFx0XHRcdG9QYWdlUHJvcGVydGllc1dpdGhvdXRDb25mbGljdFtzUHJvcGVydHlOYW1lXSxcblx0XHRcdFx0XHRcdFx0b1BhZ2VTVi5nZXRTZWxlY3RPcHRpb24oc1Byb3BlcnR5TmFtZSkhXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIHJlbW92ZSBub24gcHVibGljIHByb3BlcnRpZXMgZnJvbSB0YXJnZXRJbmZvXG5cdFx0ZGVsZXRlIG9UYXJnZXRJbmZvPy5wcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0O1xuXHRcdGRlbGV0ZSBvVGFyZ2V0SW5mbz8ubGlua0NvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZXh0ZXJuYWxOYXZpZ2F0aW9uQ29udGV4dFwiLCB7IHBhZ2U6IHRydWUgfSk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0VBT0EsTUFBTUEsNkJBQTZCLEdBQUc7SUFDckNDLHNCQUFzQixFQUFFLFNBQUFBLENBRXZCQyxpQkFBbUMsRUFDbkNDLFdBQW9ILEVBQzdHO01BQ1AsTUFBTUMsS0FBSyxHQUFHLElBQUksQ0FBQ0MsT0FBTyxDQUFDLENBQUM7UUFDM0JDLFdBQVcsR0FBR0YsS0FBSyxDQUFDRyxhQUFhLENBQUMsQ0FBbUI7UUFDckRDLHFCQUFxQixHQUFHLElBQUksQ0FBQ0gsT0FBTyxDQUFDLENBQUMsQ0FBQ0ksaUJBQWlC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
59
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsImFkYXB0TmF2aWdhdGlvbkNvbnRleHQiLCJvU2VsZWN0aW9uVmFyaWFudCIsIm9UYXJnZXRJbmZvIiwib1ZpZXciLCJnZXRWaWV3Iiwib0NvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwib0ludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvRXh0ZXJuYWxOYXZpZ2F0aW9uQ29udGV4dCIsImdldFByb3BlcnR5Iiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50Iiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib1BhZ2VDb250ZXh0IiwibWVyZ2VMaW5rQ29udGV4dCIsImxpbmtDb250ZXh0UGF0aCIsImdldFBhdGgiLCJwYWdlIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJwYWdlQXR0cmlidXRlcyIsImdldE9iamVjdCIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJwcm9jZXNzU2VtYW50aWNBdHRyaWJ1dGVzIiwib1BhZ2VDb250ZXh0RGF0YSIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJvUGFnZURhdGEiLCJwcmVwYXJlQ29udGV4dEZvckV4dGVybmFsTmF2aWdhdGlvbiIsIm9QYWdlUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCIsInByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QiLCJvUGFnZVNWIiwiYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQiLCJTZWxlY3Rpb25WYXJpYW50Iiwic2VtYW50aWNBdHRyaWJ1dGVzIiwib1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QiLCJhU2VsZWN0T3B0aW9uUHJvcGVydHlOYW1lcyIsImdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzIiwiZm9yRWFjaCIsInNQcm9wZXJ0eU5hbWUiLCJnZXRTZWxlY3RPcHRpb24iLCJtYXNzQWRkU2VsZWN0T3B0aW9uIiwibGlua0NvbnRleHQiLCJzZXRQcm9wZXJ0eSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZW50QmFzZWROYXZpZ2F0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcblxuY29uc3QgSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUgPSB7XG5cdGFkYXB0TmF2aWdhdGlvbkNvbnRleHQ6IGZ1bmN0aW9uIChcblx0XHR0aGlzOiBJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdFx0b1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsXG5cdFx0b1RhcmdldEluZm8/OiB7IGxpbmtDb250ZXh0UGF0aDogc3RyaW5nOyBsaW5rQ29udGV4dD86IHVua25vd247IHByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Q/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH1cblx0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKSxcblx0XHRcdG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyLFxuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdG9FeHRlcm5hbE5hdmlnYXRpb25Db250ZXh0ID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiZXh0ZXJuYWxOYXZpZ2F0aW9uQ29udGV4dFwiKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG9QYWdlQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHQvL0lmIHRoZSBsaW5rIGNvbnRleHQgaXMgc2FtZSBhcyBwYWdlIGNvbnRleHQgbWVyZ2luZyBvZiBjb250ZXh0IHNob3VsZCBub3QgaGFwcGVuXG5cdFx0Y29uc3QgbWVyZ2VMaW5rQ29udGV4dCA9IG9UYXJnZXRJbmZvPy5saW5rQ29udGV4dFBhdGggPyBvUGFnZUNvbnRleHQ/LmdldFBhdGgoKSAhPT0gb1RhcmdldEluZm8/LmxpbmtDb250ZXh0UGF0aCA6IHRydWU7XG5cdFx0aWYgKG9FeHRlcm5hbE5hdmlnYXRpb25Db250ZXh0Py5wYWdlICYmIG1lcmdlTGlua0NvbnRleHQgJiYgb1BhZ2VDb250ZXh0KSB7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9QYWdlQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0bGV0IHBhZ2VBdHRyaWJ1dGVzID0gb1BhZ2VDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0cGFnZUF0dHJpYnV0ZXMgPSBvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLnByb2Nlc3NTZW1hbnRpY0F0dHJpYnV0ZXMob1BhZ2VDb250ZXh0LCBvUGFnZUNvbnRleHQuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0Y29uc3Qgb1BhZ2VDb250ZXh0RGF0YSA9IG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ucmVtb3ZlU2Vuc2l0aXZlRGF0YShwYWdlQXR0cmlidXRlcywgc01ldGFQYXRoKSxcblx0XHRcdFx0b1BhZ2VEYXRhID0gb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5wcmVwYXJlQ29udGV4dEZvckV4dGVybmFsTmF2aWdhdGlvbihvUGFnZUNvbnRleHREYXRhLCBvUGFnZUNvbnRleHQpLFxuXHRcdFx0XHRvUGFnZVByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QgPSBvUGFnZURhdGEucHJvcGVydGllc1dpdGhvdXRDb25mbGljdCxcblx0XHRcdFx0Ly8gVE9ETzogbW92ZSB0aGlzIGFsc28gaW50byB0aGUgaW50ZW50IGJhc2VkIG5hdmlnYXRpb24gY29udHJvbGxlciBleHRlbnNpb25cblx0XHRcdFx0b1BhZ2VTViA9IENvbW1vblV0aWxzLmFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50KFxuXHRcdFx0XHRcdG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdFx0b1BhZ2VEYXRhLnNlbWFudGljQXR0cmlidXRlcyBhcyB1bmtub3duW10sXG5cdFx0XHRcdFx0b1ZpZXdcblx0XHRcdFx0KSxcblx0XHRcdFx0b1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QgPSBvVGFyZ2V0SW5mbz8ucHJvcGVydGllc1dpdGhvdXRDb25mbGljdDtcblx0XHRcdGNvbnN0IGFTZWxlY3RPcHRpb25Qcm9wZXJ0eU5hbWVzID0gb1BhZ2VTVi5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdFx0YVNlbGVjdE9wdGlvblByb3BlcnR5TmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmICghb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKHNQcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcGVydHlOYW1lLCBvUGFnZVNWLmdldFNlbGVjdE9wdGlvbihzUHJvcGVydHlOYW1lKSEpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIE9ubHkgd2hlbiB0aGVyZSBpcyBubyBjb25mbGljdCBkbyB3ZSBuZWVkIHRvIGFkZCBzb21ldGhpbmdcblx0XHRcdFx0XHQvLyBpbiBhbGwgb3RoZXIgY2FzZSB0aGUgY29uZmxpY3RlZCBwYXRocyBhcmUgYWxyZWFkeSBhZGRlZCBpbiBwcmVwYXJlQ29udGV4dEZvckV4dGVybmFsTmF2aWdhdGlvblxuXHRcdFx0XHRcdC8vIGlmIHByb3BlcnR5IHdhcyB3aXRob3V0IGNvbmZsaWN0IGluIGluY29taW5nIGNvbnRleHQgdGhlbiBhZGQgcGF0aCBmcm9tIGluY29taW5nIGNvbnRleHQgdG8gU1Zcblx0XHRcdFx0XHQvLyBUTy1ETy4gUmVtb3ZlIHRoZSBjaGVjayBmb3Igb1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Qgb25jZSBzZW1hbnRpYyBsaW5rcyBmdW5jdGlvbmFsaXR5IGlzIGNvdmVyZWRcblx0XHRcdFx0XHRpZiAob1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QgJiYgc1Byb3BlcnR5TmFtZSBpbiBvUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCkge1xuXHRcdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQubWFzc0FkZFNlbGVjdE9wdGlvbihcblx0XHRcdFx0XHRcdFx0b1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Rbc1Byb3BlcnR5TmFtZV0sXG5cdFx0XHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihzUHJvcGVydHlOYW1lKSFcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIGlmIHByb3BlcnR5IHdhcyB3aXRob3V0IGNvbmZsaWN0IGluIHBhZ2UgY29udGV4dCB0aGVuIGFkZCBwYXRoIGZyb20gcGFnZSBjb250ZXh0IHRvIFNWXG5cdFx0XHRcdFx0aWYgKHNQcm9wZXJ0eU5hbWUgaW4gb1BhZ2VQcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0KSB7XG5cdFx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5tYXNzQWRkU2VsZWN0T3B0aW9uKFxuXHRcdFx0XHRcdFx0XHRvUGFnZVByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Rbc1Byb3BlcnR5TmFtZV0sXG5cdFx0XHRcdFx0XHRcdG9QYWdlU1YuZ2V0U2VsZWN0T3B0aW9uKHNQcm9wZXJ0eU5hbWUpIVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyByZW1vdmUgbm9uIHB1YmxpYyBwcm9wZXJ0aWVzIGZyb20gdGFyZ2V0SW5mb1xuXHRcdGRlbGV0ZSBvVGFyZ2V0SW5mbz8ucHJvcGVydGllc1dpdGhvdXRDb25mbGljdDtcblx0XHRkZWxldGUgb1RhcmdldEluZm8/LmxpbmtDb250ZXh0O1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImV4dGVybmFsTmF2aWdhdGlvbkNvbnRleHRcIiwgeyBwYWdlOiB0cnVlIH0pO1xuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztFQU1BLE1BQU1BLDZCQUE2QixHQUFHO0lBQ3JDQyxzQkFBc0IsRUFBRSxTQUFBQSxDQUV2QkMsaUJBQW1DLEVBQ25DQyxXQUFvSCxFQUM3RztNQUNQLE1BQU1DLEtBQUssR0FBRyxJQUFJLENBQUNDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCQyxXQUFXLEdBQUdGLEtBQUssQ0FBQ0csYUFBYSxDQUFDLENBQW1CO1FBQ3JEQyxxQkFBcUIsR0FBRyxJQUFJLENBQUNILE9BQU8sQ0FBQyxDQUFDLENBQUNJLGlCQUFpQixDQUFDLFVBQVUsQ0FBeUI7UUFDNUZDLDBCQUEwQixHQUFHRixxQkFBcUIs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
@@ -3,7 +3,6 @@ import type IntentBasedNavigation from "sap/fe/core/controllerextensions/IntentB
3
3
  import type { InternalModelContext } from "sap/fe/core/helpers/ModelHelper";
4
4
  import type PageController from "sap/fe/core/PageController";
5
5
  import SelectionVariant from "sap/fe/navigation/SelectionVariant";
6
- import type Context from "sap/ui/model/Context";
7
6
 
8
7
  const IntentBasedNavigationOverride = {
9
8
  adaptNavigationContext: function (
@@ -17,10 +16,11 @@ const IntentBasedNavigationOverride = {
17
16
  oExternalNavigationContext = oInternalModelContext.getProperty("externalNavigationContext");
18
17
  const oAppComponent = CommonUtils.getAppComponent(oView);
19
18
  const oMetaModel = oAppComponent.getModel().getMetaModel();
20
- const oPageContext = oView.getBindingContext() as Context;
19
+ const oPageContext = oView.getBindingContext();
20
+
21
21
  //If the link context is same as page context merging of context should not happen
22
- const mergeLinkContext = oTargetInfo?.linkContextPath ? oPageContext.getPath() !== oTargetInfo?.linkContextPath : true;
23
- if (oExternalNavigationContext?.page && mergeLinkContext) {
22
+ const mergeLinkContext = oTargetInfo?.linkContextPath ? oPageContext?.getPath() !== oTargetInfo?.linkContextPath : true;
23
+ if (oExternalNavigationContext?.page && mergeLinkContext && oPageContext) {
24
24
  const sMetaPath = oMetaModel.getMetaPath(oPageContext.getPath());
25
25
  let pageAttributes = oPageContext.getObject();
26
26
  pageAttributes = oController._intentBasedNavigation.processSemanticAttributes(oPageContext, oPageContext.getObject());
@@ -2,33 +2,109 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2026 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library"], function (Log, CommonUtils, KeepAliveHelper, ModelHelper, CoreLibrary) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper"], function (Log, CommonUtils, KeepAliveHelper, ModelHelper, CoreLibrary, SectionNavigationHelper) {
6
6
  "use strict";
7
7
 
8
+ var pollForSectionStability = SectionNavigationHelper.pollForSectionStability;
8
9
  const VariantManagement = CoreLibrary.VariantManagement;
9
10
  const opControlHandlers = {
10
11
  retrieve: function (oOPLayout) {
12
+ const controller = this.getView().getController();
13
+ // Get subsection from controller's stored target subsection (set by onNavigateChange or targetControlId navigation)
14
+ const targetSubSection = controller.targetSubSection;
15
+ const selectedSection = oOPLayout.getSelectedSection();
16
+ const selectedSubSection = targetSubSection?.getId() ?? null;
11
17
  return {
12
- selectedSection: oOPLayout.getSelectedSection()
18
+ selectedSection,
19
+ selectedSubSection
13
20
  };
14
21
  },
15
22
  apply: function (opLayout, controlState) {
16
23
  const selectedSection = controlState?.selectedSection;
17
- if (selectedSection) {
18
- const opSectionToSelect = opLayout.getSections().find(section => section.getId() === selectedSection);
19
- if (opSectionToSelect?.getVisible() === false) {
20
- const controller = this.getView().getController();
21
- controller.pageReady.waitPageReady().then(function () {
22
- opLayout.setSelectedSection(selectedSection);
23
- return undefined;
24
- }).catch(err => {
25
- const message = err instanceof Error ? err.message : String(err);
26
- Log.error(`FE V4 : OP : ViewState : ObjectPageLayout state couldn't be applied : ${message}`);
27
- });
28
- } else {
29
- opLayout.setSelectedSection(selectedSection);
30
- }
24
+ const selectedSubSection = controlState?.selectedSubSection;
25
+ if (!selectedSection) {
26
+ return;
31
27
  }
28
+
29
+ // Check if the selected section is a section or subsection
30
+ const opSectionToSelect = opLayout.getSections().find(section => section.getId() === selectedSection);
31
+ const isSubSectionId = !opSectionToSelect && this.getView().byId(selectedSection)?.isA("sap.uxap.ObjectPageSubSection");
32
+ const controller = this.getView().getController();
33
+
34
+ // Determine the target to navigate to: prefer subsection if available
35
+ const navigationTarget = selectedSubSection ?? selectedSection;
36
+ const isNavigatingToSubSection = !!selectedSubSection || isSubSectionId;
37
+
38
+ // Determine target section ID for comparison (needed before pageReady)
39
+ const getTargetSectionId = () => {
40
+ if (isSubSectionId) {
41
+ return opLayout.getSections().find(s => s.getSubSections().some(ss => ss.getId() === navigationTarget))?.getId();
42
+ }
43
+ return selectedSection;
44
+ };
45
+
46
+ // Wait for pageReady, then navigate and poll for UX rules reset
47
+ controller.pageReady.waitPageReady().then(async () => {
48
+ const targetSectionId = getTargetSectionId();
49
+
50
+ // Skip if no valid target section (e.g., subsection's parent no longer exists)
51
+ // or already on target section - no navigation or polling needed
52
+ if (!targetSectionId || opLayout.getSelectedSection() === targetSectionId) {
53
+ return;
54
+ }
55
+ const performNavigation = () => {
56
+ // Guard: don't navigate if ObjectPageLayout has been destroyed
57
+ if (!opLayout.getDomRef()) {
58
+ return;
59
+ }
60
+
61
+ // Guard: don't navigate if already on target section
62
+ const currentSection = opLayout.getSelectedSection();
63
+ if (currentSection === targetSectionId) {
64
+ return;
65
+ }
66
+ if (isNavigatingToSubSection) {
67
+ // For subsection navigation, use navigateToSubSection which handles parent section activation
68
+ const localId = controller.getView().getLocalId(navigationTarget);
69
+ if (localId) {
70
+ controller.getExtensionAPI().navigateToSubSection(localId);
71
+ } else {
72
+ opLayout.scrollToSection(navigationTarget, 0);
73
+ }
74
+ } else if (opSectionToSelect && opSectionToSelect.getVisible() === true) {
75
+ // For section IDs, navigate if section is visible
76
+ opLayout.scrollToSection(selectedSection, 0);
77
+ }
78
+ };
79
+
80
+ // Skip navigation and polling on subsequent loads - only restore section during initial load
81
+ // This prevents overriding user's manual tab selection when state is restored later
82
+ const controllerWithFlag = controller;
83
+ if (controllerWithFlag.skipViewStateSectionRestore === true) {
84
+ return;
85
+ }
86
+
87
+ // Navigate immediately
88
+ performNavigation();
89
+
90
+ // Skip polling if already on target section
91
+ if (opLayout.getSelectedSection() === targetSectionId) {
92
+ return;
93
+ }
94
+
95
+ // Poll to detect UX rules reset during initial load
96
+ // Uses shared utility from helpers/SectionNavigationHelper.ts
97
+ await pollForSectionStability({
98
+ getSelectedSection: () => opLayout.getSelectedSection(),
99
+ targetSectionId,
100
+ onResetDetected: performNavigation,
101
+ guardCheck: () => !!opLayout.getDomRef()
102
+ });
103
+ return; // Required by linter rule promise/always-return
104
+ }).catch(() => {
105
+ // ViewState: ObjectPageLayout section state couldn't be applied
106
+ // Don't re-throw - allow page to continue even if navigation fails
107
+ });
32
108
  },
33
109
  refreshBinding: function (oOPLayout) {
34
110
  const oBindingContext = oOPLayout.getBindingContext();
@@ -160,4 +236,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/K
160
236
  };
161
237
  return ViewStateExtensionOverride;
162
238
  }, false);
163
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYXJpYW50TWFuYWdlbWVudCIsIkNvcmVMaWJyYXJ5Iiwib3BDb250cm9sSGFuZGxlcnMiLCJyZXRyaWV2ZSIsIm9PUExheW91dCIsInNlbGVjdGVkU2VjdGlvbiIsImdldFNlbGVjdGVkU2VjdGlvbiIsImFwcGx5Iiwib3BMYXlvdXQiLCJjb250cm9sU3RhdGUiLCJvcFNlY3Rpb25Ub1NlbGVjdCIsImdldFNlY3Rpb25zIiwiZmluZCIsInNlY3Rpb24iLCJnZXRJZCIsImdldFZpc2libGUiLCJjb250cm9sbGVyIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJwYWdlUmVhZHkiLCJ3YWl0UGFnZVJlYWR5IiwidGhlbiIsInNldFNlbGVjdGVkU2VjdGlvbiIsInVuZGVmaW5lZCIsImNhdGNoIiwiZXJyIiwibWVzc2FnZSIsIkVycm9yIiwiU3RyaW5nIiwiTG9nIiwiZXJyb3IiLCJyZWZyZXNoQmluZGluZyIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0JpbmRpbmciLCJnZXRCaW5kaW5nIiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzU3RyYXRlZ3kiLCJLZWVwQWxpdmVIZWxwZXIiLCJnZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJvTmF2aWdhdGlvblByb3BlcnRpZXMiLCJDb21tb25VdGlscyIsImdldENvbnRleHRQYXRoUHJvcGVydGllcyIsIiRraW5kIiwiYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwiYVByZXYiLCJzTmF2UHJvcCIsIiRpc0NvbGxlY3Rpb24iLCJwdXNoIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJhUHJvcGVydGllcyIsIiRQcm9wZXJ0eVBhdGgiLCJzR3JvdXBJZCIsImdldEdyb3VwSWQiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJjb25jYXQiLCJyZWZyZXNoIiwiaW5mbyIsIlZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlIiwiX2dldE9iamVjdFBhZ2VMYXlvdXQiLCJ2aWV3IiwiX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sIiwiX2dldE9QU3RhdGVIYW5kbGVyIiwiY29udHJvbCIsInZpZXdPUCIsImNhbGwiLCJfZ2V0T1BSZWZyZXNoSGFuZGxlciIsImFkYXB0Q29udHJvbFN0YXRlSGFuZGxlciIsImNvbnRyb2xTdGF0ZUhhbmRsZXJzIiwib3BTdGF0ZUhhbmRsZXIiLCJhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlciIsImNvbnRyb2xSZWZyZXNoSGFuZGxlcnMiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJhZGFwdFN0YXRlQ29udHJvbHMiLCJhU3RhdGVDb250cm9scyIsIm9WaWV3IiwiYmFzZSIsIm9WaWV3RGF0YSIsImdldFZpZXdEYXRhIiwidmFyaWFudE1hbmFnZW1lbnQiLCJDb250cm9sIiwiUGFnZSIsIk5vbmUiLCJieUlkIiwiYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzIiwiYUNvbnRyb2xzIiwic1JlZnJlc2hTdHJhdGVneSIsImdldFZpZXdSZWZyZXNoSW5mbyIsIm9Db250cm9sbGVyIiwiYUNvbnRyb2xzVG9SZWZyZXNoIiwib09iamVjdFBhZ2VDb250cm9sIiwiYVZpZXdDb250cm9scyIsIl9maW5kVGFibGVzIiwiZ2V0Q29udHJvbHNGb3JSZWZyZXNoIiwiYVByZXZDb250cm9scyIsIm9Db250cm9sIiwiaW5jbHVkZXMiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlZpZXdTdGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFZpZXdTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvVmlld1N0YXRlXCI7XG5pbXBvcnQgeyB0eXBlIENvbnRyb2xTdGF0ZUhhbmRsZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvVmlld1N0YXRlXCI7XG5pbXBvcnQgS2VlcEFsaXZlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0tlZXBBbGl2ZUhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgQ29yZUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsTmF2UHJvcGVydHkgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5cbmNvbnN0IFZhcmlhbnRNYW5hZ2VtZW50ID0gQ29yZUxpYnJhcnkuVmFyaWFudE1hbmFnZW1lbnQ7XG5leHBvcnQgdHlwZSBPYmplY3RQYWdlU3RhdGUgPSB7IHNlbGVjdGVkU2VjdGlvbjogc3RyaW5nIHwgbnVsbCB9O1xuXG5jb25zdCBvcENvbnRyb2xIYW5kbGVycyA9IHtcblx0cmV0cmlldmU6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQpOiBPYmplY3RQYWdlU3RhdGUge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZWxlY3RlZFNlY3Rpb246IG9PUExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKVxuXHRcdH07XG5cdH0sXG5cdGFwcGx5OiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBvcExheW91dDogT2JqZWN0UGFnZUxheW91dCwgY29udHJvbFN0YXRlPzogeyBzZWxlY3RlZFNlY3Rpb246IHN0cmluZyB8IG51bGwgfSk6IHZvaWQge1xuXHRcdGNvbnN0IHNlbGVjdGVkU2VjdGlvbiA9IGNvbnRyb2xTdGF0ZT8uc2VsZWN0ZWRTZWN0aW9uO1xuXHRcdGlmIChzZWxlY3RlZFNlY3Rpb24pIHtcblx0XHRcdGNvbnN0IG9wU2VjdGlvblRvU2VsZWN0ID0gb3BMYXlvdXQuZ2V0U2VjdGlvbnMoKS5maW5kKChzZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikgPT4gc2VjdGlvbi5nZXRJZCgpID09PSBzZWxlY3RlZFNlY3Rpb24pO1xuXHRcdFx0aWYgKG9wU2VjdGlvblRvU2VsZWN0Py5nZXRWaXNpYmxlKCkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG5cdFx0XHRcdGNvbnRyb2xsZXIucGFnZVJlYWR5XG5cdFx0XHRcdFx0LndhaXRQYWdlUmVhZHkoKVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRcdG9wTGF5b3V0LnNldFNlbGVjdGVkU2VjdGlvbihzZWxlY3RlZFNlY3Rpb24pO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoZXJyOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBGRSBWNCA6IE9QIDogVmlld1N0YXRlIDogT2JqZWN0UGFnZUxheW91dCBzdGF0ZSBjb3VsZG4ndCBiZSBhcHBsaWVkIDogJHttZXNzYWdlfWApO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3BMYXlvdXQuc2V0U2VsZWN0ZWRTZWN0aW9uKHNlbGVjdGVkU2VjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9PUExheW91dDogT2JqZWN0UGFnZUxheW91dCk6IHZvaWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9PUExheW91dC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0JpbmRpbmdDb250ZXh0ICYmIG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0aWYgKG9CaW5kaW5nKSB7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdGNvbnN0IHNTdHJhdGVneSA9IEtlZXBBbGl2ZUhlbHBlci5nZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgob09QTGF5b3V0LCBzTWV0YVBhdGgpO1xuXHRcdFx0aWYgKHNTdHJhdGVneSA9PT0gXCJzZWxmXCIpIHtcblx0XHRcdFx0Ly8gUmVmcmVzaCBtYWluIGNvbnRleHQgYW5kIDEtMSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgb3IgT1Bcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbE5hdlByb3BlcnR5PiA9XG5cdFx0XHRcdFx0XHQoQ29tbW9uVXRpbHMuZ2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwge1xuXHRcdFx0XHRcdFx0XHQka2luZDogXCJOYXZpZ2F0aW9uUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0fSkgYXMgUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsTmF2UHJvcGVydHk+KSB8fCB7fSxcblx0XHRcdFx0XHRhTmF2UHJvcGVydGllc1RvUmVxdWVzdCA9IE9iamVjdC5rZXlzKG9OYXZpZ2F0aW9uUHJvcGVydGllcykucmVkdWNlKGZ1bmN0aW9uIChcblx0XHRcdFx0XHRcdGFQcmV2OiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgfVtdLFxuXHRcdFx0XHRcdFx0c05hdlByb3A6IHN0cmluZ1xuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0aWYgKG9OYXZpZ2F0aW9uUHJvcGVydGllc1tzTmF2UHJvcF0uJGlzQ29sbGVjdGlvbiAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0XHRhUHJldi5wdXNoKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNOYXZQcm9wIH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGFQcmV2O1xuXHRcdFx0XHRcdH0sIFtdKSxcblx0XHRcdFx0XHRhUHJvcGVydGllczogKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyB9IHwgeyAkUHJvcGVydHlQYXRoOiBzdHJpbmcgfSlbXSA9IFt7ICRQcm9wZXJ0eVBhdGg6IFwiKlwiIH1dLFxuXHRcdFx0XHRcdHNHcm91cElkID0gb0JpbmRpbmcuZ2V0R3JvdXBJZCgpO1xuXG5cdFx0XHRcdG9CaW5kaW5nQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoYVByb3BlcnRpZXMuY29uY2F0KGFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0KSwgc0dyb3VwSWQpO1xuXHRcdFx0fSBlbHNlIGlmIChzU3RyYXRlZ3kgPT09IFwiaW5jbHVkaW5nRGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdC8vIENvbXBsZXRlIHJlZnJlc2hcblx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRMb2cuaW5mbyhgT2JqZWN0UGFnZTogJHtvT1BMYXlvdXQuZ2V0SWQoKX0gd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhYCk7XG5cdFx0fVxuXHR9XG59O1xuXG5jb25zdCBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZSA9IHtcblx0X2dldE9iamVjdFBhZ2VMYXlvdXQ6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUpOiBPYmplY3RQYWdlTGF5b3V0IHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyO1xuXHRcdHJldHVybiBjb250cm9sbGVyLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHN0YXRlIGhhbmRsZXIgZm9yIE9iamVjdFBhZ2VMYXlvdXQgaW4gdmlldy5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgZm9yIHN0YXRlIGludGVyYWN0aW9uXG5cdCAqIEByZXR1cm5zIFN0YXRlIGhhbmRsZXJcblx0ICovXG5cdF9nZXRPUFN0YXRlSGFuZGxlcjogZnVuY3Rpb24gKFxuXHRcdHRoaXM6IFZpZXdTdGF0ZSxcblx0XHRjb250cm9sOiBNYW5hZ2VkT2JqZWN0XG5cdCk6IENvbnRyb2xTdGF0ZUhhbmRsZXI8T2JqZWN0UGFnZUxheW91dCwgT2JqZWN0UGFnZVN0YXRlPiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgdmlld09QID0gVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUuX2dldE9iamVjdFBhZ2VMYXlvdXQuY2FsbCh0aGlzKTtcblx0XHRpZiAodmlld09QID09PSBjb250cm9sKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyZXRyaWV2ZTogb3BDb250cm9sSGFuZGxlcnMucmV0cmlldmUsXG5cdFx0XHRcdGFwcGx5OiBvcENvbnRyb2xIYW5kbGVycy5hcHBseVxuXHRcdFx0fTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgcmVmcmVzaCBoYW5kbGVyIGZvciBPYmplY3RQYWdlTGF5b3V0IGluIHZpZXcuXG5cdCAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIGJlaW5nIHJlZnJlc2hlZFxuXHQgKiBAcmV0dXJucyBSZWZyZXNoIGhhbmRsZXJcblx0ICovXG5cdF9nZXRPUFJlZnJlc2hIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3Rcblx0KTogQ29udHJvbFN0YXRlSGFuZGxlcjxPYmplY3RQYWdlTGF5b3V0LCBPYmplY3RQYWdlU3RhdGU+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB2aWV3T1AgPSBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZS5fZ2V0T2JqZWN0UGFnZUxheW91dC5jYWxsKHRoaXMpO1xuXHRcdGlmICh2aWV3T1AgPT09IGNvbnRyb2wpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJlZnJlc2hCaW5kaW5nOiBvcENvbnRyb2xIYW5kbGVycy5yZWZyZXNoQmluZGluZ1xuXHRcdFx0fTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFBhc3MgdGhlIHN0YXRlIGhhbmRsZXJzIG9mIG9iamVjdCBwYWdlIHZpZXcgYWNjb3JkaW5nIHRvIHRoZSBjb250cm9sIGluIGNvbmNlcm4uXG5cdCAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIGZvciBzdGF0ZSBpbnRlcmFjdGlvblxuXHQgKiBAcGFyYW0gY29udHJvbFN0YXRlSGFuZGxlcnMgU3RhdGUgaGFuZGxlcnNcblx0ICovXG5cdGFkYXB0Q29udHJvbFN0YXRlSGFuZGxlcjogZnVuY3Rpb24gKFxuXHRcdHRoaXM6IFZpZXdTdGF0ZSxcblx0XHRjb250cm9sOiBNYW5hZ2VkT2JqZWN0LFxuXHRcdGNvbnRyb2xTdGF0ZUhhbmRsZXJzOiBDb250cm9sU3RhdGVIYW5kbGVyPE9iamVjdFBhZ2VMYXlvdXQsIE9iamVjdFBhZ2VTdGF0ZT5bXVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBvcFN0YXRlSGFuZGxlciA9IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlLl9nZXRPUFN0YXRlSGFuZGxlci5jYWxsKHRoaXMsIGNvbnRyb2wpO1xuXHRcdGlmIChvcFN0YXRlSGFuZGxlcikge1xuXHRcdFx0Y29udHJvbFN0YXRlSGFuZGxlcnMucHVzaChvcFN0YXRlSGFuZGxlcik7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBQYXNzIHRoZSByZWZyZXNoIGhhbmRsZXJzIG9mIG9iamVjdCBwYWdlIHZpZXcgYWNjb3JkaW5nIHRvIHRoZSBjb250cm9sIGJlaW5nIHJlZnJlc2hlZC5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgYmVpbmcgcmVmcmVzaGVkXG5cdCAqIEBwYXJhbSBjb250cm9sUmVmcmVzaEhhbmRsZXJzIFJlZnJlc2ggaGFuZGxlcnNcblx0ICovXG5cdGFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3QsXG5cdFx0Y29udHJvbFJlZnJlc2hIYW5kbGVyczogQ29udHJvbFN0YXRlSGFuZGxlcjxPYmplY3RQYWdlTGF5b3V0LCBPYmplY3RQYWdlU3RhdGU+XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9wU3RhdGVIYW5kbGVyID0gVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUuX2dldE9QUmVmcmVzaEhhbmRsZXIuY2FsbCh0aGlzLCBjb250cm9sKTtcblx0XHRpZiAob3BTdGF0ZUhhbmRsZXIpIHtcblx0XHQgICAgY29udHJvbFJlZnJlc2hIYW5kbGVycy5yZWZyZXNoQmluZGluZyA9IG9wU3RhdGVIYW5kbGVyLnJlZnJlc2hCaW5kaW5nO1xuXHRcdH1cblx0fSxcblxuXHRhcHBseUluaXRpYWxTdGF0ZU9ubHk6IGZ1bmN0aW9uICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdGFkYXB0U3RhdGVDb250cm9sczogZnVuY3Rpb24gKHRoaXM6IFZpZXdTdGF0ZSwgYVN0YXRlQ29udHJvbHM6IENvbnRyb2xbXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdG9WaWV3RGF0YSA9IG9WaWV3LmdldFZpZXdEYXRhKCk7XG5cdFx0c3dpdGNoIChvVmlld0RhdGEudmFyaWFudE1hbmFnZW1lbnQpIHtcblx0XHRcdGNhc2UgVmFyaWFudE1hbmFnZW1lbnQuQ29udHJvbDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50LlBhZ2U6XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50Lk5vbmU6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgdmFyaWFudCBzZXR0aW5nOiAke29WaWV3RGF0YS52YXJpYW50TWFuYWdlbWVudH1gKTtcblx0XHR9XG5cblx0XHRhU3RhdGVDb250cm9scy5wdXNoKG9WaWV3LmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBDb250cm9sKTtcblx0fSxcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhQ29udHJvbHM6IENvbnRyb2xbXSk6IENvbnRyb2xbXSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLFxuXHRcdFx0c1JlZnJlc2hTdHJhdGVneSA9IEtlZXBBbGl2ZUhlbHBlci5nZXRWaWV3UmVmcmVzaEluZm8ob1ZpZXcpLFxuXHRcdFx0b0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0bGV0IGFDb250cm9sc1RvUmVmcmVzaDogQ29udHJvbFtdID0gW107XG5cblx0XHRpZiAoc1JlZnJlc2hTdHJhdGVneSkge1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2VDb250cm9sID0gKG9Db250cm9sbGVyIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaC5wdXNoKG9PYmplY3RQYWdlQ29udHJvbCk7XG5cdFx0fVxuXHRcdGlmIChzUmVmcmVzaFN0cmF0ZWd5ICE9PSBcImluY2x1ZGluZ0RlcGVuZGVudHNcIikge1xuXHRcdFx0Y29uc3QgYVZpZXdDb250cm9scyA9IChvQ29udHJvbGxlciBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuX2ZpbmRUYWJsZXMoKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaCA9IGFDb250cm9sc1RvUmVmcmVzaC5jb25jYXQoS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xzRm9yUmVmcmVzaChvVmlldywgYVZpZXdDb250cm9scykgfHwgW10pO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNvbnRyb2xzVG9SZWZyZXNoLnJlZHVjZShmdW5jdGlvbiAoYVByZXZDb250cm9scywgb0NvbnRyb2wpIHtcblx0XHRcdGlmICghYVByZXZDb250cm9scy5pbmNsdWRlcyhvQ29udHJvbCkpIHtcblx0XHRcdFx0YVByZXZDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhUHJldkNvbnRyb2xzO1xuXHRcdH0sIGFDb250cm9scyk7XG5cdH1cbn07XG5cbmV4cG9ydCBk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
239
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYXJpYW50TWFuYWdlbWVudCIsIkNvcmVMaWJyYXJ5Iiwib3BDb250cm9sSGFuZGxlcnMiLCJyZXRyaWV2ZSIsIm9PUExheW91dCIsImNvbnRyb2xsZXIiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsInRhcmdldFN1YlNlY3Rpb24iLCJzZWxlY3RlZFNlY3Rpb24iLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJzZWxlY3RlZFN1YlNlY3Rpb24iLCJnZXRJZCIsImFwcGx5Iiwib3BMYXlvdXQiLCJjb250cm9sU3RhdGUiLCJvcFNlY3Rpb25Ub1NlbGVjdCIsImdldFNlY3Rpb25zIiwiZmluZCIsInNlY3Rpb24iLCJpc1N1YlNlY3Rpb25JZCIsImJ5SWQiLCJpc0EiLCJuYXZpZ2F0aW9uVGFyZ2V0IiwiaXNOYXZpZ2F0aW5nVG9TdWJTZWN0aW9uIiwiZ2V0VGFyZ2V0U2VjdGlvbklkIiwicyIsImdldFN1YlNlY3Rpb25zIiwic29tZSIsInNzIiwicGFnZVJlYWR5Iiwid2FpdFBhZ2VSZWFkeSIsInRoZW4iLCJ0YXJnZXRTZWN0aW9uSWQiLCJwZXJmb3JtTmF2aWdhdGlvbiIsImdldERvbVJlZiIsImN1cnJlbnRTZWN0aW9uIiwibG9jYWxJZCIsImdldExvY2FsSWQiLCJnZXRFeHRlbnNpb25BUEkiLCJuYXZpZ2F0ZVRvU3ViU2VjdGlvbiIsInNjcm9sbFRvU2VjdGlvbiIsImdldFZpc2libGUiLCJjb250cm9sbGVyV2l0aEZsYWciLCJza2lwVmlld1N0YXRlU2VjdGlvblJlc3RvcmUiLCJwb2xsRm9yU2VjdGlvblN0YWJpbGl0eSIsIm9uUmVzZXREZXRlY3RlZCIsImd1YXJkQ2hlY2siLCJjYXRjaCIsInJlZnJlc2hCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvQmluZGluZyIsImdldEJpbmRpbmciLCJzTWV0YVBhdGgiLCJNb2RlbEhlbHBlciIsImdldE1ldGFQYXRoRm9yQ29udGV4dCIsInNTdHJhdGVneSIsIktlZXBBbGl2ZUhlbHBlciIsImdldENvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JDb250ZXh0UGF0aCIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIm9OYXZpZ2F0aW9uUHJvcGVydGllcyIsIkNvbW1vblV0aWxzIiwiZ2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzIiwiJGtpbmQiLCJhTmF2UHJvcGVydGllc1RvUmVxdWVzdCIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJhUHJldiIsInNOYXZQcm9wIiwiJGlzQ29sbGVjdGlvbiIsInB1c2giLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImFQcm9wZXJ0aWVzIiwiJFByb3BlcnR5UGF0aCIsInNHcm91cElkIiwiZ2V0R3JvdXBJZCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImNvbmNhdCIsInJlZnJlc2giLCJMb2ciLCJpbmZvIiwiVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUiLCJfZ2V0T2JqZWN0UGFnZUxheW91dCIsInZpZXciLCJfZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2wiLCJfZ2V0T1BTdGF0ZUhhbmRsZXIiLCJjb250cm9sIiwidmlld09QIiwiY2FsbCIsIl9nZXRPUFJlZnJlc2hIYW5kbGVyIiwiYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyIiwiY29udHJvbFN0YXRlSGFuZGxlcnMiLCJvcFN0YXRlSGFuZGxlciIsImFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyIiwiY29udHJvbFJlZnJlc2hIYW5kbGVycyIsImFwcGx5SW5pdGlhbFN0YXRlT25seSIsImFkYXB0U3RhdGVDb250cm9scyIsImFTdGF0ZUNvbnRyb2xzIiwib1ZpZXciLCJiYXNlIiwib1ZpZXdEYXRhIiwiZ2V0Vmlld0RhdGEiLCJ2YXJpYW50TWFuYWdlbWVudCIsIkNvbnRyb2wiLCJQYWdlIiwiTm9uZSIsIkVycm9yIiwiYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzIiwiYUNvbnRyb2xzIiwic1JlZnJlc2hTdHJhdGVneSIsImdldFZpZXdSZWZyZXNoSW5mbyIsIm9Db250cm9sbGVyIiwiYUNvbnRyb2xzVG9SZWZyZXNoIiwib09iamVjdFBhZ2VDb250cm9sIiwiYVZpZXdDb250cm9scyIsIl9maW5kVGFibGVzIiwiZ2V0Q29udHJvbHNGb3JSZWZyZXNoIiwiYVByZXZDb250cm9scyIsIm9Db250cm9sIiwiaW5jbHVkZXMiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlZpZXdTdGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFZpZXdTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvVmlld1N0YXRlXCI7XG5pbXBvcnQgeyB0eXBlIENvbnRyb2xTdGF0ZUhhbmRsZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvVmlld1N0YXRlXCI7XG5pbXBvcnQgS2VlcEFsaXZlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0tlZXBBbGl2ZUhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgQ29yZUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB7IHBvbGxGb3JTZWN0aW9uU3RhYmlsaXR5IH0gZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9oZWxwZXJzL1NlY3Rpb25OYXZpZ2F0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL09iamVjdFBhZ2VDb250cm9sbGVyLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUxheW91dCBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUxheW91dFwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZVNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbE5hdlByb3BlcnR5IH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuXG5jb25zdCBWYXJpYW50TWFuYWdlbWVudCA9IENvcmVMaWJyYXJ5LlZhcmlhbnRNYW5hZ2VtZW50O1xuZXhwb3J0IHR5cGUgT2JqZWN0UGFnZVN0YXRlID0geyBzZWxlY3RlZFNlY3Rpb246IHN0cmluZyB8IG51bGw7IHNlbGVjdGVkU3ViU2VjdGlvbj86IHN0cmluZyB8IG51bGwgfTtcblxuY29uc3Qgb3BDb250cm9sSGFuZGxlcnMgPSB7XG5cdHJldHJpZXZlOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBvT1BMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQpOiBPYmplY3RQYWdlU3RhdGUge1xuXHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG5cdFx0Ly8gR2V0IHN1YnNlY3Rpb24gZnJvbSBjb250cm9sbGVyJ3Mgc3RvcmVkIHRhcmdldCBzdWJzZWN0aW9uIChzZXQgYnkgb25OYXZpZ2F0ZUNoYW5nZSBvciB0YXJnZXRDb250cm9sSWQgbmF2aWdhdGlvbilcblx0XHRjb25zdCB0YXJnZXRTdWJTZWN0aW9uID0gKGNvbnRyb2xsZXIgYXMgdW5rbm93biBhcyB7IHRhcmdldFN1YlNlY3Rpb24/OiB7IGdldElkOiAoKSA9PiBzdHJpbmcgfSB9KS50YXJnZXRTdWJTZWN0aW9uO1xuXHRcdGNvbnN0IHNlbGVjdGVkU2VjdGlvbiA9IG9PUExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKTtcblx0XHRjb25zdCBzZWxlY3RlZFN1YlNlY3Rpb24gPSB0YXJnZXRTdWJTZWN0aW9uPy5nZXRJZCgpID8/IG51bGw7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbGVjdGVkU2VjdGlvbixcblx0XHRcdHNlbGVjdGVkU3ViU2VjdGlvblxuXHRcdH07XG5cdH0sXG5cdGFwcGx5OiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdG9wTGF5b3V0OiBPYmplY3RQYWdlTGF5b3V0LFxuXHRcdGNvbnRyb2xTdGF0ZT86IHsgc2VsZWN0ZWRTZWN0aW9uOiBzdHJpbmcgfCBudWxsOyBzZWxlY3RlZFN1YlNlY3Rpb24/OiBzdHJpbmcgfCBudWxsIH1cblx0KTogdm9pZCB7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRTZWN0aW9uID0gY29udHJvbFN0YXRlPy5zZWxlY3RlZFNlY3Rpb247XG5cdFx0Y29uc3Qgc2VsZWN0ZWRTdWJTZWN0aW9uID0gY29udHJvbFN0YXRlPy5zZWxlY3RlZFN1YlNlY3Rpb247XG5cblx0XHRpZiAoIXNlbGVjdGVkU2VjdGlvbikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBzZWN0aW9uIGlzIGEgc2VjdGlvbiBvciBzdWJzZWN0aW9uXG5cdFx0Y29uc3Qgb3BTZWN0aW9uVG9TZWxlY3QgPSBvcExheW91dC5nZXRTZWN0aW9ucygpLmZpbmQoKHNlY3Rpb246IE9iamVjdFBhZ2VTZWN0aW9uKSA9PiBzZWN0aW9uLmdldElkKCkgPT09IHNlbGVjdGVkU2VjdGlvbik7XG5cdFx0Y29uc3QgaXNTdWJTZWN0aW9uSWQgPSAhb3BTZWN0aW9uVG9TZWxlY3QgJiYgdGhpcy5nZXRWaWV3KCkuYnlJZChzZWxlY3RlZFNlY3Rpb24pPy5pc0EoXCJzYXAudXhhcC5PYmplY3RQYWdlU3ViU2VjdGlvblwiKTtcblx0XHRjb25zdCBjb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIHRoZSB0YXJnZXQgdG8gbmF2aWdhdGUgdG86IHByZWZlciBzdWJzZWN0aW9uIGlmIGF2YWlsYWJsZVxuXHRcdGNvbnN0IG5hdmlnYXRpb25UYXJnZXQgPSBzZWxlY3RlZFN1YlNlY3Rpb24gPz8gc2VsZWN0ZWRTZWN0aW9uO1xuXHRcdGNvbnN0IGlzTmF2aWdhdGluZ1RvU3ViU2VjdGlvbiA9ICEhc2VsZWN0ZWRTdWJTZWN0aW9uIHx8IGlzU3ViU2VjdGlvbklkO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIHRhcmdldCBzZWN0aW9uIElEIGZvciBjb21wYXJpc29uICAobmVlZGVkIGJlZm9yZSBwYWdlUmVhZHkpXG5cdFx0Y29uc3QgZ2V0VGFyZ2V0U2VjdGlvbklkID0gKCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG5cdFx0XHRpZiAoaXNTdWJTZWN0aW9uSWQpIHtcblx0XHRcdFx0cmV0dXJuIG9wTGF5b3V0XG5cdFx0XHRcdFx0LmdldFNlY3Rpb25zKClcblx0XHRcdFx0XHQuZmluZCgocykgPT4gcy5nZXRTdWJTZWN0aW9ucygpLnNvbWUoKHNzKSA9PiBzcy5nZXRJZCgpID09PSBuYXZpZ2F0aW9uVGFyZ2V0KSlcblx0XHRcdFx0XHQ/LmdldElkKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc2VsZWN0ZWRTZWN0aW9uO1xuXHRcdH07XG5cblx0XHQvLyBXYWl0IGZvciBwYWdlUmVhZHksIHRoZW4gbmF2aWdhdGUgYW5kIHBvbGwgZm9yIFVYIHJ1bGVzIHJlc2V0XG5cdFx0Y29udHJvbGxlci5wYWdlUmVhZHlcblx0XHRcdC53YWl0UGFnZVJlYWR5KClcblx0XHRcdC50aGVuKGFzeW5jICgpID0+IHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0U2VjdGlvbklkID0gZ2V0VGFyZ2V0U2VjdGlvbklkKCk7XG5cblx0XHRcdFx0Ly8gU2tpcCBpZiBubyB2YWxpZCB0YXJnZXQgc2VjdGlvbiAoZS5nLiwgc3Vic2VjdGlvbidzIHBhcmVudCBubyBsb25nZXIgZXhpc3RzKVxuXHRcdFx0XHQvLyBvciBhbHJlYWR5IG9uIHRhcmdldCBzZWN0aW9uIC0gbm8gbmF2aWdhdGlvbiBvciBwb2xsaW5nIG5lZWRlZFxuXHRcdFx0XHRpZiAoIXRhcmdldFNlY3Rpb25JZCB8fCBvcExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKSA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgcGVyZm9ybU5hdmlnYXRpb24gPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0Ly8gR3VhcmQ6IGRvbid0IG5hdmlnYXRlIGlmIE9iamVjdFBhZ2VMYXlvdXQgaGFzIGJlZW4gZGVzdHJveWVkXG5cdFx0XHRcdFx0aWYgKCFvcExheW91dC5nZXREb21SZWYoKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEd1YXJkOiBkb24ndCBuYXZpZ2F0ZSBpZiBhbHJlYWR5IG9uIHRhcmdldCBzZWN0aW9uXG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlY3Rpb24gPSBvcExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKTtcblx0XHRcdFx0XHRpZiAoY3VycmVudFNlY3Rpb24gPT09IHRhcmdldFNlY3Rpb25JZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChpc05hdmlnYXRpbmdUb1N1YlNlY3Rpb24pIHtcblx0XHRcdFx0XHRcdC8vIEZvciBzdWJzZWN0aW9uIG5hdmlnYXRpb24sIHVzZSBuYXZpZ2F0ZVRvU3ViU2VjdGlvbiB3aGljaCBoYW5kbGVzIHBhcmVudCBzZWN0aW9uIGFjdGl2YXRpb25cblx0XHRcdFx0XHRcdGNvbnN0IGxvY2FsSWQgPSBjb250cm9sbGVyLmdldFZpZXcoKS5nZXRMb2NhbElkKG5hdmlnYXRpb25UYXJnZXQpO1xuXHRcdFx0XHRcdFx0aWYgKGxvY2FsSWQpIHtcblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci5nZXRFeHRlbnNpb25BUEkoKS5uYXZpZ2F0ZVRvU3ViU2VjdGlvbihsb2NhbElkKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9wTGF5b3V0LnNjcm9sbFRvU2VjdGlvbihuYXZpZ2F0aW9uVGFyZ2V0LCAwKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKG9wU2VjdGlvblRvU2VsZWN0ICYmIG9wU2VjdGlvblRvU2VsZWN0LmdldFZpc2libGUoKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0Ly8gRm9yIHNlY3Rpb24gSURzLCBuYXZpZ2F0ZSBpZiBzZWN0aW9uIGlzIHZpc2libGVcblx0XHRcdFx0XHRcdG9wTGF5b3V0LnNjcm9sbFRvU2VjdGlvbihzZWxlY3RlZFNlY3Rpb24sIDApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBTa2lwIG5hdmlnYXRpb24gYW5kIHBvbGxpbmcgb24gc3Vic2VxdWVudCBsb2FkcyAtIG9ubHkgcmVzdG9yZSBzZWN0aW9uIGR1cmluZyBpbml0aWFsIGxvYWRcblx0XHRcdFx0Ly8gVGhpcyBwcmV2ZW50cyBvdmVycmlkaW5nIHVzZXIncyBtYW51YWwgdGFiIHNlbGVjdGlvbiB3aGVuIHN0YXRlIGlzIHJlc3RvcmVkIGxhdGVyXG5cdFx0XHRcdGNvbnN0IGNvbnRyb2xsZXJXaXRoRmxhZyA9IGNvbnRyb2xsZXIgYXMgdW5rbm93biBhcyB7IHNraXBWaWV3U3RhdGVTZWN0aW9uUmVzdG9yZT86IGJvb2xlYW4gfTtcblx0XHRcdFx0aWYgKGNvbnRyb2xsZXJXaXRoRmxhZy5za2lwVmlld1N0YXRlU2VjdGlvblJlc3RvcmUgPT09IHRydWUpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBOYXZpZ2F0ZSBpbW1lZGlhdGVseVxuXHRcdFx0XHRwZXJmb3JtTmF2aWdhdGlvbigpO1xuXG5cdFx0XHRcdC8vIFNraXAgcG9sbGluZyBpZiBhbHJlYWR5IG9uIHRhcmdldCBzZWN0aW9uXG5cdFx0XHRcdGlmIChvcExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKSA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUG9sbCB0byBkZXRlY3QgVVggcnVsZXMgcmVzZXQgZHVyaW5nIGluaXRpYWwgbG9hZFxuXHRcdFx0XHQvLyBVc2VzIHNoYXJlZCB1dGlsaXR5IGZyb20gaGVscGVycy9TZWN0aW9uTmF2aWdhdGlvbkhlbHBlci50c1xuXHRcdFx0XHRhd2FpdCBwb2xsRm9yU2VjdGlvblN0YWJpbGl0eSh7XG5cdFx0XHRcdFx0Z2V0U2VsZWN0ZWRTZWN0aW9uOiAoKSA9PiBvcExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKSxcblx0XHRcdFx0XHR0YXJnZXRTZWN0aW9uSWQsXG5cdFx0XHRcdFx0b25SZXNldERldGVjdGVkOiBwZXJmb3JtTmF2aWdhdGlvbixcblx0XHRcdFx0XHRndWFyZENoZWNrOiAoKSA9PiAhIW9wTGF5b3V0LmdldERvbVJlZigpXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47IC8vIFJlcXVpcmVkIGJ5IGxpbnRlciBydWxlIHByb21pc2UvYWx3YXlzLXJldHVyblxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdC8vIFZpZXdTdGF0ZTogT2JqZWN0UGFnZUxheW91dCBzZWN0aW9uIHN0YXRlIGNvdWxkbid0IGJlIGFwcGxpZWRcblx0XHRcdFx0Ly8gRG9uJ3QgcmUtdGhyb3cgLSBhbGxvdyBwYWdlIHRvIGNvbnRpbnVlIGV2ZW4gaWYgbmF2aWdhdGlvbiBmYWlsc1xuXHRcdFx0fSk7XG5cdH0sXG5cdHJlZnJlc2hCaW5kaW5nOiBmdW5jdGlvbiAob09QTGF5b3V0OiBPYmplY3RQYWdlTGF5b3V0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb09QTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRpZiAob0JpbmRpbmcpIHtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1N0cmF0ZWd5ID0gS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JDb250ZXh0UGF0aChvT1BMYXlvdXQsIHNNZXRhUGF0aCk7XG5cdFx0XHRpZiAoc1N0cmF0ZWd5ID09PSBcInNlbGZcIikge1xuXHRcdFx0XHQvLyBSZWZyZXNoIG1haW4gY29udGV4dCBhbmQgMS0xIG5hdmlnYXRpb24gcHJvcGVydGllcyBvciBPUFxuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsTmF2UHJvcGVydHk+ID1cblx0XHRcdFx0XHRcdChDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMob01ldGFNb2RlbCwgc01ldGFQYXRoLCB7XG5cdFx0XHRcdFx0XHRcdCRraW5kOiBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHR9KSBhcyBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4pIHx8IHt9LFxuXHRcdFx0XHRcdGFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gT2JqZWN0LmtleXMob05hdmlnYXRpb25Qcm9wZXJ0aWVzKS5yZWR1Y2UoZnVuY3Rpb24gKFxuXHRcdFx0XHRcdFx0YVByZXY6IHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10sXG5cdFx0XHRcdFx0XHRzTmF2UHJvcDogc3RyaW5nXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRpZiAob05hdmlnYXRpb25Qcm9wZXJ0aWVzW3NOYXZQcm9wXS4kaXNDb2xsZWN0aW9uICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdGFQcmV2LnB1c2goeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc05hdlByb3AgfSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gYVByZXY7XG5cdFx0XHRcdFx0fSwgW10pLFxuXHRcdFx0XHRcdGFQcm9wZXJ0aWVzOiAoeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nIH0gfCB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9KVtdID0gW3sgJFByb3BlcnR5UGF0aDogXCIqXCIgfV0sXG5cdFx0XHRcdFx0c0dyb3VwSWQgPSBvQmluZGluZy5nZXRHcm91cElkKCk7XG5cblx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhhUHJvcGVydGllcy5jb25jYXQoYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QpLCBzR3JvdXBJZCk7XG5cdFx0XHR9IGVsc2UgaWYgKHNTdHJhdGVneSA9PT0gXCJpbmNsdWRpbmdEZXBlbmRlbnRzXCIpIHtcblx0XHRcdFx0Ly8gQ29tcGxldGUgcmVmcmVzaFxuXHRcdFx0XHRvQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdExvZy5pbmZvKGBPYmplY3RQYWdlOiAke29PUExheW91dC5nZXRJZCgpfSB3YXMgbm90IHJlZnJlc2hlZC4gTm8gYmluZGluZyBmb3VuZCFgKTtcblx0XHR9XG5cdH1cbn07XG5cbmNvbnN0IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlID0ge1xuXHRfZ2V0T2JqZWN0UGFnZUxheW91dDogZnVuY3Rpb24gKHRoaXM6IFZpZXdTdGF0ZSk6IE9iamVjdFBhZ2VMYXlvdXQge1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBjb250cm9sbGVyID0gdmlldy5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgc3RhdGUgaGFuZGxlciBmb3IgT2JqZWN0UGFnZUxheW91dCBpbiB2aWV3LlxuXHQgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCBmb3Igc3RhdGUgaW50ZXJhY3Rpb25cblx0ICogQHJldHVybnMgU3RhdGUgaGFuZGxlclxuXHQgKi9cblx0X2dldE9QU3RhdGVIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3Rcblx0KTogQ29udHJvbFN0YXRlSGFuZGxlcjxPYmplY3RQYWdlTGF5b3V0LCBPYmplY3RQYWdlU3RhdGU+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB2aWV3T1AgPSBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZS5fZ2V0T2JqZWN0UGFnZUxheW91dC5jYWxsKHRoaXMpO1xuXHRcdGlmICh2aWV3T1AgPT09IGNvbnRyb2wpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJldHJpZXZlOiBvcENvbnRyb2xIYW5kbGVycy5yZXRyaWV2ZSxcblx0XHRcdFx0YXBwbHk6IG9wQ29udHJvbEhhbmRsZXJzLmFwcGx5XG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSByZWZyZXNoIGhhbmRsZXIgZm9yIE9iamVjdFBhZ2VMYXlvdXQgaW4gdmlldy5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgYmVpbmcgcmVmcmVzaGVkXG5cdCAqIEByZXR1cm5zIFJlZnJlc2ggaGFuZGxlclxuXHQgKi9cblx0X2dldE9QUmVmcmVzaEhhbmRsZXI6IGZ1bmN0aW9uIChcblx0XHR0aGlzOiBWaWV3U3RhdGUsXG5cdFx0Y29udHJvbDogTWFuYWdlZE9iamVjdFxuXHQpOiBDb250cm9sU3RhdGVIYW5kbGVyPE9iamVjdFBhZ2VMYXlvdXQsIE9iamVjdFBhZ2VTdGF0ZT4gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHZpZXdPUCA9IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlLl9nZXRPYmplY3RQYWdlTGF5b3V0LmNhbGwodGhpcyk7XG5cdFx0aWYgKHZpZXdPUCA9PT0gY29udHJvbCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmVmcmVzaEJpbmRpbmc6IG9wQ29udHJvbEhhbmRsZXJzLnJlZnJlc2hCaW5kaW5nXG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUGFzcyB0aGUgc3RhdGUgaGFuZGxlcnMgb2Ygb2JqZWN0IHBhZ2UgdmlldyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wgaW4gY29uY2Vybi5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgZm9yIHN0YXRlIGludGVyYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sU3RhdGVIYW5kbGVycyBTdGF0ZSBoYW5kbGVyc1xuXHQgKi9cblx0YWRhcHRDb250cm9sU3RhdGVIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3QsXG5cdFx0Y29udHJvbFN0YXRlSGFuZGxlcnM6IENvbnRyb2xTdGF0ZUhhbmRsZXI8T2JqZWN0UGFnZUxheW91dCwgT2JqZWN0UGFnZVN0YXRlPltdXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9wU3RhdGVIYW5kbGVyID0gVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUuX2dldE9QU3RhdGVIYW5kbGVyLmNhbGwodGhpcywgY29udHJvbCk7XG5cdFx0aWYgKG9wU3RhdGVIYW5kbGVyKSB7XG5cdFx0XHRjb250cm9sU3RhdGVIYW5kbGVycy5wdXNoKG9wU3RhdGVIYW5kbGVyKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFBhc3MgdGhlIHJlZnJlc2ggaGFuZGxlcnMgb2Ygb2JqZWN0IHBhZ2UgdmlldyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wgYmVpbmcgcmVmcmVzaGVkLlxuXHQgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCBiZWluZyByZWZyZXNoZWRcblx0ICogQHBhcmFtIGNvbnRyb2xSZWZyZXNoSGFuZGxlcnMgUmVmcmVzaCBoYW5kbGVyc1xuXHQgKi9cblx0YWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXI6IGZ1bmN0aW9uIChcblx0XHR0aGlzOiBWaWV3U3RhdGUsXG5cdFx0Y29udHJvbDogTWFuYWdlZE9iamVjdCxcblx0XHRjb250cm9sUmVmcmVzaEhhbmRsZXJzOiBDb250cm9sU3RhdGVIYW5kbGVyPE9iamVjdFBhZ2VMYXlvdXQsIE9iamVjdFBhZ2VTdGF0ZT5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb3BTdGF0ZUhhbmRsZXIgPSBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZS5fZ2V0T1BSZWZyZXNoSGFuZGxlci5jYWxsKHRoaXMsIGNvbnRyb2wpO1xuXHRcdGlmIChvcFN0YXRlSGFuZGxlcikge1xuXHRcdFx0Y29udHJvbFJlZnJlc2hIYW5kbGVycy5yZWZyZXNoQmluZGluZyA9IG9wU3RhdGVIYW5kbGVyLnJlZnJlc2hCaW5kaW5nO1xuXHRcdH1cblx0fSxcblxuXHRhcHBseUluaXRpYWxTdGF0ZU9ubHk6IGZ1bmN0aW9uICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdGFkYXB0U3RhdGVDb250cm9sczogZnVuY3Rpb24gKHRoaXM6IFZpZXdTdGF0ZSwgYVN0YXRlQ29udHJvbHM6IENvbnRyb2xbXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdG9WaWV3RGF0YSA9IG9WaWV3LmdldFZpZXdEYXRhKCk7XG5cdFx0c3dpdGNoIChvVmlld0RhdGEudmFyaWFudE1hbmFnZW1lbnQpIHtcblx0XHRcdGNhc2UgVmFyaWFudE1hbmFnZW1lbnQuQ29udHJvbDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50LlBhZ2U6XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50Lk5vbmU6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgdmFyaWFudCBzZXR0aW5nOiAke29WaWV3RGF0YS52YXJpYW50TWFuYWdlbWVudH1gKTtcblx0XHR9XG5cblx0XHRhU3RhdGVDb250cm9scy5wdXNoKG9WaWV3LmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBDb250cm9sKTtcblx0fSxcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhQ29udHJvbHM6IENvbnRyb2xbXSk6IENvbnRyb2xbXSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLFxuXHRcdFx0c1JlZnJlc2hTdHJhdGVneSA9IEtlZXBBbGl2ZUhlbHBlci5nZXRWaWV3UmVmcmVzaEluZm8ob1ZpZXcpLFxuXHRcdFx0b0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0bGV0IGFDb250cm9sc1RvUmVmcmVzaDogQ29udHJvbFtdID0gW107XG5cblx0XHRpZiAoc1JlZnJlc2hTdHJhdGVneSkge1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2VDb250cm9sID0gKG9Db250cm9sbGVyIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaC5wdXNoKG9PYmplY3RQYWdlQ29udHJvbCk7XG5cdFx0fVxuXHRcdGlmIChzUmVmcmVzaFN0cmF0ZWd5ICE9PSBcImluY2x1ZGluZ0RlcGVuZGVudHNcIikge1xuXHRcdFx0Y29uc3QgYVZpZXdDb250cm9scyA9IChvQ29udHJvbGxlciBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuX2ZpbmRUYWJsZXMoKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaCA9IGFDb250cm9sc1RvUmVmcmVzaC5jb25jYXQoS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xzRm9yUmVmcmVzaChvVmlldywgYVZpZXdDb250cm9scykgfHwgW10pO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNvbnRyb2xzVG9SZWZyZXNoLnJlZHVjZShmdW5jdGlvbiAoYVByZXZDb250cm9scywgb0NvbnRyb2wpIHtcblx0XHRcdGlmICghYVByZXZDb250cm9scy5pbmNsdWRlcyhvQ29udHJvbCkpIHtcblx0XHRcdFx0YVByZXZDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhUHJldkNvbnRyb2xzO1xuXHRcdH0sIGFDb250cm9scyk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztFQWdCQSxNQUFNQSxpQkFBaUIsR0FBR0MsV0FBVyxDQUFDRCxpQkFBaUI7RUFHdkQsTUFBTUUsaUJBQWlCLEdBQUc7SUFDekJDLFFBQVEsRUFBRSxTQUFBQSxDQUEyQkMsU0FBMkIsRUFBbUI7TUFDbEYsTUFBTUMsVUFBVSxHQUFHLElBQUksQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FBQ0MsYUFBYSxDQUFDLENBQXlCO01BQ3pFO01BQ0EsTUFBTUMsZ0JBQWdCLEdBQUlILFVBQVUsQ0FBK0RHLGdCQUFnQjtNQUNuSCxNQUFNQyxlQUFlLEdBQUdMLFNBQVMsQ0FBQ00sa0JBQWtCLENBQUMsQ0FBQztNQUN0RCxNQUFN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
@@ -5,6 +5,7 @@ import { type ControlStateHandler } from "sap/fe/core/controllerextensions/ViewS
5
5
  import KeepAliveHelper from "sap/fe/core/helpers/KeepAliveHelper";
6
6
  import ModelHelper from "sap/fe/core/helpers/ModelHelper";
7
7
  import CoreLibrary from "sap/fe/core/library";
8
+ import { pollForSectionStability } from "sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper";
8
9
  import type ObjectPageController from "sap/fe/templates/ObjectPage/ObjectPageController.controller";
9
10
  import type ManagedObject from "sap/ui/base/ManagedObject";
10
11
  import type Control from "sap/ui/core/Control";
@@ -14,34 +15,119 @@ import type ObjectPageSection from "sap/uxap/ObjectPageSection";
14
15
  import type { MetaModelNavProperty } from "types/metamodel_types";
15
16
 
16
17
  const VariantManagement = CoreLibrary.VariantManagement;
17
- export type ObjectPageState = { selectedSection: string | null };
18
+ export type ObjectPageState = { selectedSection: string | null; selectedSubSection?: string | null };
18
19
 
19
20
  const opControlHandlers = {
20
- retrieve: function (oOPLayout: ObjectPageLayout): ObjectPageState {
21
+ retrieve: function (this: ViewState, oOPLayout: ObjectPageLayout): ObjectPageState {
22
+ const controller = this.getView().getController() as ObjectPageController;
23
+ // Get subsection from controller's stored target subsection (set by onNavigateChange or targetControlId navigation)
24
+ const targetSubSection = (controller as unknown as { targetSubSection?: { getId: () => string } }).targetSubSection;
25
+ const selectedSection = oOPLayout.getSelectedSection();
26
+ const selectedSubSection = targetSubSection?.getId() ?? null;
21
27
  return {
22
- selectedSection: oOPLayout.getSelectedSection()
28
+ selectedSection,
29
+ selectedSubSection
23
30
  };
24
31
  },
25
- apply: function (this: ViewState, opLayout: ObjectPageLayout, controlState?: { selectedSection: string | null }): void {
32
+ apply: function (
33
+ this: ViewState,
34
+ opLayout: ObjectPageLayout,
35
+ controlState?: { selectedSection: string | null; selectedSubSection?: string | null }
36
+ ): void {
26
37
  const selectedSection = controlState?.selectedSection;
27
- if (selectedSection) {
28
- const opSectionToSelect = opLayout.getSections().find((section: ObjectPageSection) => section.getId() === selectedSection);
29
- if (opSectionToSelect?.getVisible() === false) {
30
- const controller = this.getView().getController() as ObjectPageController;
31
- controller.pageReady
32
- .waitPageReady()
33
- .then(function (): void {
34
- opLayout.setSelectedSection(selectedSection);
35
- return undefined;
36
- })
37
- .catch((err: unknown): void => {
38
- const message = err instanceof Error ? err.message : String(err);
39
- Log.error(`FE V4 : OP : ViewState : ObjectPageLayout state couldn't be applied : ${message}`);
40
- });
41
- } else {
42
- opLayout.setSelectedSection(selectedSection);
43
- }
38
+ const selectedSubSection = controlState?.selectedSubSection;
39
+
40
+ if (!selectedSection) {
41
+ return;
44
42
  }
43
+
44
+ // Check if the selected section is a section or subsection
45
+ const opSectionToSelect = opLayout.getSections().find((section: ObjectPageSection) => section.getId() === selectedSection);
46
+ const isSubSectionId = !opSectionToSelect && this.getView().byId(selectedSection)?.isA("sap.uxap.ObjectPageSubSection");
47
+ const controller = this.getView().getController() as ObjectPageController;
48
+
49
+ // Determine the target to navigate to: prefer subsection if available
50
+ const navigationTarget = selectedSubSection ?? selectedSection;
51
+ const isNavigatingToSubSection = !!selectedSubSection || isSubSectionId;
52
+
53
+ // Determine target section ID for comparison (needed before pageReady)
54
+ const getTargetSectionId = (): string | undefined => {
55
+ if (isSubSectionId) {
56
+ return opLayout
57
+ .getSections()
58
+ .find((s) => s.getSubSections().some((ss) => ss.getId() === navigationTarget))
59
+ ?.getId();
60
+ }
61
+ return selectedSection;
62
+ };
63
+
64
+ // Wait for pageReady, then navigate and poll for UX rules reset
65
+ controller.pageReady
66
+ .waitPageReady()
67
+ .then(async () => {
68
+ const targetSectionId = getTargetSectionId();
69
+
70
+ // Skip if no valid target section (e.g., subsection's parent no longer exists)
71
+ // or already on target section - no navigation or polling needed
72
+ if (!targetSectionId || opLayout.getSelectedSection() === targetSectionId) {
73
+ return;
74
+ }
75
+
76
+ const performNavigation = (): void => {
77
+ // Guard: don't navigate if ObjectPageLayout has been destroyed
78
+ if (!opLayout.getDomRef()) {
79
+ return;
80
+ }
81
+
82
+ // Guard: don't navigate if already on target section
83
+ const currentSection = opLayout.getSelectedSection();
84
+ if (currentSection === targetSectionId) {
85
+ return;
86
+ }
87
+
88
+ if (isNavigatingToSubSection) {
89
+ // For subsection navigation, use navigateToSubSection which handles parent section activation
90
+ const localId = controller.getView().getLocalId(navigationTarget);
91
+ if (localId) {
92
+ controller.getExtensionAPI().navigateToSubSection(localId);
93
+ } else {
94
+ opLayout.scrollToSection(navigationTarget, 0);
95
+ }
96
+ } else if (opSectionToSelect && opSectionToSelect.getVisible() === true) {
97
+ // For section IDs, navigate if section is visible
98
+ opLayout.scrollToSection(selectedSection, 0);
99
+ }
100
+ };
101
+
102
+ // Skip navigation and polling on subsequent loads - only restore section during initial load
103
+ // This prevents overriding user's manual tab selection when state is restored later
104
+ const controllerWithFlag = controller as unknown as { skipViewStateSectionRestore?: boolean };
105
+ if (controllerWithFlag.skipViewStateSectionRestore === true) {
106
+ return;
107
+ }
108
+
109
+ // Navigate immediately
110
+ performNavigation();
111
+
112
+ // Skip polling if already on target section
113
+ if (opLayout.getSelectedSection() === targetSectionId) {
114
+ return;
115
+ }
116
+
117
+ // Poll to detect UX rules reset during initial load
118
+ // Uses shared utility from helpers/SectionNavigationHelper.ts
119
+ await pollForSectionStability({
120
+ getSelectedSection: () => opLayout.getSelectedSection(),
121
+ targetSectionId,
122
+ onResetDetected: performNavigation,
123
+ guardCheck: () => !!opLayout.getDomRef()
124
+ });
125
+ return; // Required by linter rule promise/always-return
126
+ })
127
+ .catch(() => {
128
+ // ViewState: ObjectPageLayout section state couldn't be applied
129
+ // Don't re-throw - allow page to continue even if navigation fails
130
+ });
45
131
  },
46
132
  refreshBinding: function (oOPLayout: ObjectPageLayout): void {
47
133
  const oBindingContext = oOPLayout.getBindingContext() as ODataV4Context | undefined;
@@ -150,7 +236,7 @@ const ViewStateExtensionOverride = {
150
236
  ): void {
151
237
  const opStateHandler = ViewStateExtensionOverride._getOPRefreshHandler.call(this, control);
152
238
  if (opStateHandler) {
153
- controlRefreshHandlers.refreshBinding = opStateHandler.refreshBinding;
239
+ controlRefreshHandlers.refreshBinding = opStateHandler.refreshBinding;
154
240
  }
155
241
  },
156
242
 
@@ -157,6 +157,7 @@
157
157
 
158
158
  <template:if test="{= ${emphHeaderAction>type} !== 'Menu' }">
159
159
  <Button
160
+ core:require="{FPM: 'sap/fe/core/helpers/FPMHelper'}"
160
161
  id="{= ID.generate(['fe', (${emphHeaderAction>id} ? ${emphHeaderAction>id} : ${emphHeaderAction>key}), 'EmphasizedFirst']) }"
161
162
  dt:designtime="not-adaptable"
162
163
  text="{emphHeaderAction>text}"
@@ -35,16 +35,16 @@ OP: 'sap/fe/templates/ObjectPage/ObjectPageTemplating'
35
35
  <template:if test="{= ${header>aiNotice} &amp;&amp; ${header>aiNotice/visible} !== false }">
36
36
  <macros:AINotice visible="{header>aiNotice/visible}" placementType="Bottom">
37
37
  <macros:popoverContent>
38
- <template:if test="{header>aiNotice/contentText}">
38
+ <template:if test="{header>aiNotice/contentFragmentName}">
39
39
  <template:then>
40
- <Text text="{header>aiNotice/contentText}" />
41
- </template:then>
42
- <template:elseif test="{header>aiNotice/contentFragmentName}">
43
40
  <fpm:CustomFragment
44
41
  id="fe::expandedHeaderNotice"
45
42
  fragmentName="{header>aiNotice/contentFragmentName}"
46
43
  contextPath="{fullContextPath>}"
47
44
  />
45
+ </template:then>
46
+ <template:elseif test="{header>aiNotice/contentText}">
47
+ <Text text="{header>aiNotice/contentText}" />
48
48
  </template:elseif>
49
49
  </template:if>
50
50
  </macros:popoverContent>
@@ -44,16 +44,16 @@
44
44
  <template:if test="{= ${header>aiNotice} &amp;&amp; ${header>aiNotice/visible} !== false }">
45
45
  <macros:AINotice visible="{header>aiNotice/visible}" placementType="Bottom">
46
46
  <macros:popoverContent>
47
- <template:if test="{header>aiNotice/contentText}">
47
+ <template:if test="{header>aiNotice/contentFragmentName}">
48
48
  <template:then>
49
- <Text text="{header>aiNotice/contentText}" />
50
- </template:then>
51
- <template:elseif test="{header>aiNotice/contentFragmentName}">
52
49
  <fpm:CustomFragment
53
50
  id="fe::snappedHeaderNotice"
54
51
  fragmentName="{header>aiNotice/contentFragmentName}"
55
52
  contextPath="{fullContextPath>}"
56
53
  />
54
+ </template:then>
55
+ <template:elseif test="{header>aiNotice/contentText}">
56
+ <Text text="{header>aiNotice/contentText}" />
57
57
  </template:elseif>
58
58
  </template:if>
59
59
  </macros:popoverContent>
@@ -18,7 +18,7 @@
18
18
  displayInline="true"
19
19
  binding="{= OP.createBindingForAlternateAndSecondaryKeys((MODEL.getNavigationPath(${headerFacet>Target/$AnnotationPath@@UI.getDataModelObjectPath})))}"
20
20
  >
21
- <Title text="{headerFacet>Label}" />
21
+ <Title text="{headerFacet>Label}" level="H3" />
22
22
  <Text renderWhitespace="true" class="sapMLabel" text="{addressPath>label@@MODEL.format}" />
23
23
  </VBox>
24
24
  </template:with>
@@ -19,7 +19,7 @@
19
19
  binding="{= OP.createBindingForAlternateAndSecondaryKeys(${headerFacet>Target/$AnnotationPath@@UI.getDataModelObjectPath})}"
20
20
  >
21
21
  <template:if test="{headerFacet>@@MODEL.label}">
22
- <Title text="{headerFacet>@@MODEL.label}" class="sapUiSmallMarginBottom" />
22
+ <Title text="{headerFacet>@@MODEL.label}" level="H3" class="sapUiSmallMarginBottom" />
23
23
  </template:if>
24
24
  <template:with path="headerFacet>Target/$AnnotationPath" var="metaPath">
25
25
  <macro:Contact
@@ -25,6 +25,7 @@
25
25
  <Title
26
26
  text="{converterHeaderFacet>headerFormData/label}"
27
27
  id="{= ID.generate([ ${converterHeaderFacet>headerFormData/id}, 'Title'])}"
28
+ level="H3"
28
29
  class="sapUiSmallMarginBottom"
29
30
  />
30
31
  </template:if>
@@ -36,7 +36,7 @@ sap.ui.define(["sap/f/library", "sap/fe/core/library", "sap/fe/macros/library",
36
36
  controls: [],
37
37
  elements: [],
38
38
  // eslint-disable-next-line no-template-curly-in-string
39
- version: "1.147.0",
39
+ version: "1.148.1",
40
40
  noLibraryCSS: true
41
41
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
42
  });