Leonn
Leonn

Reputation: 21

Fiori launchpad: handle logout event with custom backend call without `attachLogoutEvent` (UI5 < 1.81)

So, I found that the launchpad Container API provides an option to register a logout event with returning a promise (https://ui5.sap.com/#/api/sap.ushell.services.Container%23methods/attachLogoutEvent). Unfortunately, after the implementation I found out that the UI5 version must be 1.81 or higher for parameter bAsync to work. In my project, we're at 1.78, so no promises for me.

What's the problem?

I want to make a backend call in the said logout event. This doesn't work, since, as far as I understood my debugging, the launchpad destroys everything just after my logout event has "finished" (= every line of code in the event has been gone through, ignoring sub-functions). Timeouts etc. don't work, because their calls would also be after code progressing has already finished, meaning the calls are deleted.

What have I tried?

What do I think might work?

Does anyone have an idea on how to solve the issue with UI5 1.78?

Upvotes: 1

Views: 1536

Answers (1)

Leonn
Leonn

Reputation: 21

Alright, I have found a solution to this. It's probably not the technically nicest, but it works and the result looks clean enough. This is from a S4/HANA system, so it might not be a universal solution (e.g. it doesn't consider logging off within the left-side pane which doesn't exist in my launchpad).

What did I do?

Instead of attaching my individual logic to the Fiori logout-event, I created a custom logout button with my individual logic, followed by calling the SICF logout node.

How did I do it?

  • Create a Launchpad plugin
  • In Component.js, add a new header item with custom logout function
    // ushellLib required from "sap/ushell/library"
    
    var oRenderer = ushellLib.Container.getRenderer("fiori2");
    oRenderer.addHeaderEndItem("sap.ushell.ui.shell.ShellHeadItem", {
      id: "logoutButton",
      icon: "sap-icon://log",
      // ...
      press: [this._logout, this],
    }, true, false);
    
    _logout: function() {
      this._callMyStuff();
      window.location.href = "/sap/public/bc/icf/logoff";
    },
    
  • In style.css, hide the original logout button (logoutBtn) in desktop (__list0...) and mobile (__list1...) to prevent skipping my logic by logging off via default logout.
    #__list0-7-logoutBtn {
      display: none;
    }
    #__list1-7-logoutBtn  {
      display: none;
    }
    

Upvotes: 1

Related Questions