Динамическое добавление плитки на SAP Fiori Launchpad

Некоторое время назад я рассматривал вариант добавления плитки на SAP Fiori Launchpad

См. заметку Как добавить плитку в SAP Fiori Launchpad?

В этой заметке я хочу рассмотреть вариант реализации, который может быть использован для случаев, когда заказчику требуется динамически добавлять плитку на ланчпад пользователя. То есть в результате выполнения какого-то условия.

Что мне для этого понадобится?

Плагин для ланчпада

См. Создание плагина для SAP Fiori Launchpad

OData сервис, посредством которого я буду определять необходимость добавления плитки на ланчпад

См. заметку Создание Web приложения с помощью фреймворка SAPUI5 (6)

Класс sap.ushell.services.Bookmark

См. class sap.ushell.services.Bookmark

Задача

Добавить для пользователя плитку на SAP Fiori Launchpad при условии, что ему присвоена определенная роль в backend системе. Новая плитка может быть добавлена на ланчпад без привязки к определенному каталогу плиток, который наличествует у пользователя.

OData сервис для получения информации о наличии роли пользователя

OData сервис, который я планирую использовать для получения информации о наличии роли у пользователя, имеет EntitySet со следующими свойствами

См. Create Entity Sets

Заполнение требуемого EntitySet'а выполняется в *DPC_EXT классе OData-сервиса.

См. Extending an OData Service Using Service Builder

Например,

METHOD roleexist_get_entityset.
 
 
    DATA: ls_entity_set LIKE LINE OF et_entityset.
 
 
    LOOP AT it_filter_select_options ASSIGNING FIELD-SYMBOL(<fs_filt>).
      CASE <fs_filt>-property.
        WHEN 'roleName'.
          DATA(lv_carrid) = <fs_filt>-select_options.
          LOOP AT <fs_filt>-select_options ASSIGNING FIELD-SYMBOL(<fs_options>).
            DATA(lv_role_from_front) = <fs_options>-low.
          ENDLOOP.
 
      ENDCASE.
    ENDLOOP.
 
    IF lv_role_from_front IS NOT INITIAL.
 
      SELECT SINGLE agr_name INTO @DATA(lv_agr_name) FROM agr_users WHERE uname = @sy-uname AND agr_name EQ @lv_role_from_front AND to_dat EQ '99991231'.
      IF lv_agr_name IS NOT INITIAL.
        APPEND VALUE #(
        roleid = lv_role_from_front
        isexists = abap_true
        rolename = get_role_name( lv_agr_name )
        ) TO et_entityset.
      ELSE.
        APPEND VALUE #(
          roleid = '-'
          isexists = '-'
          rolename = '-'
          ) TO et_entityset.
      ENDIF.
    ELSE.
      APPEND VALUE #(
     roleid = '-'
     isexists = '-'
     rolename = '-'
     ) TO et_entityset.
    ENDIF.
 
  ENDMETHOD.

Наполнение плагина для SAP Fiori Launchpad

Привожу пример реализации функции onInit()

См. SAP Fiori Launchpad Extensibility
init: function() {
 
            var oBookmarkService = sap.ushell.Container.getService("Bookmark");
            var sUrl = "/sap/opu/odata/SAP/ZAPP14_SRV_01";
 
            var oDataModel = new sap.ui.model.odata.v2.ODataModel(sUrl, {
                json: true
            });
            var oFilters = [new sap.ui.model.Filter("roleName", "EQ", "ZDEVELOPER")];
 
            oDataModel.read(\'/roleExist\', {
                filters: oFilters,
                success: function(oData, response) {
                    var oFlpModel = new sap.ui.model.json.JSONModel({});
                    oFlpModel.setData(oData.results);
                    sap.ui.getCore().setModel(oFlpModel, "oFlpMdl");
                },
                error: function(oError) {}
            });
 
            oDataModel.attachBatchRequestCompleted(function(oData) {
                var oRole = sap.ui.getCore().getModel("oFlpMdl").getData(oData);
                if (oRole[0].isExists === "X") {
 
                    oBookmarkService.countBookmarks("#ZBOOKMARK-display").done(function(iCount) {
                        var oRoleModel2 = new sap.ui.model.json.JSONModel({});
                        oRoleModel2.setData(iCount);
 
                        switch (iCount) {
                            case (0):
                                oBookmarkService.addBookmark({
                                    title: "Application title",
                                    url: "#ZBOOKMARK-display",
                                    icon: "sap-icon://developer-settings",
                                    info: "Dynamic tile loaded",
                                    subtitle: oRole[0].roleName
                                });
                                break;
                            case (1):
                                return;
                                break;
                            case (2):
                                oBookmarkService.deleteBookmarks("#ZBOOKMARK-display");
                                break;
                            default:
                                return;
                                break;
                        }
                    }).fail(function(sMessage) {
                    });
                } else {
                    oBookmarkService.deleteBookmarks("#ZBOOKMARK-display");
                }
 
            });
        }

Настройка Target Mapping для добавляемой плитки

Чтобы приложение можно было запустить по клику на добавленную плитку, требуется настроить Target Mapping (Присвоение цели) в одном из каталогов, присутствующих у пользователя.

См. Configuring Navigation

См. Configuring Target Mappings

Тестирование

Спасибо за ваше время. Зима будет долгой, но все по-прежнему обойдется. Обнимаю. ignatov