The SAP Fiori launchpad (FLP) can be extended in its functionality through plugins.
Watch this video for an overview on possible extensions.
Developing a plugin involves the following steps:
- Implementing the plugin
- Activating and configuring the plugin

To start developing an FLP plugin, generate an SAPUI5 freestyle application in the SAP Business Application Studio (BAS). Then delete all unsupported or unnecessary folders and files.
The next step is to define the SAPUI5 project as an FLP plugin. This is done in the manifest.json file:
1234567891011121314151617181920212223242526272829303132
{
"_version": "1.37.0",
"sap.app": {
"id": "project1",
"type": "component",
"i18n": "i18n/i18n.properties",
"applicationVersion": {
"version": "0.0.1"
},
"title": "{{appTitle}}",
"description": "{{appDescription}}",
"resources": "resources.json",
"sourceTemplate": {
"id": "@sap/generator-fiori:basic",
"version": "1.6.7",
"toolsId": "4ef10253-5957-4a76-863b-06d7fd654689"
}
},
"sap.ui": {
"technology": "UI5",
"deviceTypes": {
"desktop": true,
"tablet": true,
"phone": true
}
},
"sap.flp": {
"type": "plugin"
}
}
Generally, there are no views in a plugin. All changes to the FLP are defined by accessing the renderer of the FLP in the Component.js file. This enables the FLP to load and instantiate the plugins automatically during start-up. A typical initial Component.js looks like this:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
sap.ui.define([
"sap/ui/core/Component",
"sap/m/Button",
"sap/m/Bar",
"sap/m/MessageToast"
], function (Component, Button, Bar, MessageToast) {
return Component.extend("project1.Component", {
metadata: {
"manifest": "json"
},
_getRenderer: function () {
var that = this,
oDeferred = new jQuery.Deferred(),
oRenderer;
that._oShellContainer =
jQuery.sap.getObject("sap.ushell.Container");
if (!that._oShellContainer) {
oDeferred.reject(
"Illegal state: shell container not available;
it must be executed in a unified shell runtime context.");
} else {
oRenderer = that._oShellContainer.getRenderer();
if (oRenderer) {
oDeferred.resolve(oRenderer);
} else {
// renderer not initialized yet
// listen to rendererCreated event
that._onRendererCreated = function (oEvent) {
oRenderer = oEvent.getParameter("renderer");
if (oRenderer) {
oDeferred.resolve(oRenderer);
} else {
oDeferred.reject("Illegal state: shell renderer
not available after recieving
'rendererLoaded' event.");
}
};
that._oShellContainer.attachRendererCreatedEvent(
that._onRendererCreated);
}
}
return oDeferred.promise();
}
});
});
In the FLP documentation on https://help.sap.com, many code-snippets are available as template. A code changing the shell header looks like this:
123456789101112131415...
init: function () {
var rendererPromise = this._getRenderer();
/**
* Set header title
*/
rendererPromise.then(function (oRenderer) {
oRenderer.setHeaderTitle("SAP Education");
});
},
...
Note
Plugins are loaded and instantiated asynchronously. When multiple plugins are loaded, do not assume any specific instantiation order of the components.Every plugin must be defined in transaction /UI2/FLP_CONF_DEF before it can be activated via customizing.
Watch the video to see how plugins can be activated via customizing.