Поместите диалог в центре экрана в Fiori - PullRequest
2 голосов
/ 18 марта 2020

У меня есть приложение SAPUI5 Fiori.

Я использую тему sap_fiori_3 в качестве базовой темы.

Я настроил эту тему и прикрепил к ней только фоновое изображение.

Интересная часть - когда я активирую эту настроенную тему (которая имеет только дополнительное фоновое изображение по сравнению с оригинальной темой sap_fiori_3) , диалог больше не центрируется в моем приложении. Диалог сделан с sap.m.dialog классом.

Я написал небольшой фрагмент кода для центрирования диалога, как показано ниже:

onAfterDialogOpen: function(oEvent){
        var oDialog = oEvent.getSource(),
            $Dialog = oDialog.$(),
            oPosition = $Dialog.position(),
            iTop = oPosition.top,
            iLeft = oPosition.left,
            iDialogWidth = $Dialog.width(),
            iDialogHeight = $Dialog.height(),
            iScreenWidth = sap.ui.Device.resize.width,
            iScreenHight = sap.ui.Device.resize.height,
            iNewTop = Math.floor((iScreenHight-iDialogHeight)/2),
            iNewLeft = Math.floor((iScreenWidth-iDialogWidth)/2);
        if(Math.abs(iNewLeft-iLeft) > 10 & Math.abs(iNewTop-iTop) > 10){    
            $Dialog.offset({top: iNewTop, left: iNewLeft});
        }
    },

Но это не хорошее решение. Почему? Потому что это делает движение на моем экране следующим образом:

enter image description here

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

Обратите внимание, что использование события onBeforeOpen невозможно, так как мне нужен размер и позиция диалога!

1 Ответ

0 голосов
/ 22 апреля 2020

Я наконец выяснил, в чем причина проблемы. Кажется, Theme Designer в SAP глючит, и некоторая часть кода темы не переносится в экспортируемый файл.

Когда я использую конструктор тем для настройки темы, она не только делала упомянутую ошибку, но и также некоторые другие странные поведения появляются в развернутых приложениях в панели запуска fiori, которые используют настроенную тему. Однако у нас нет таких ошибок во время разработки в WEB IDE.

Поэтому, поскольку мне нужно было только настроить следующие элементы:

  1. фоновое изображение
  2. lo go
  3. favicon

Я попытался использовать стандартную тему, такую ​​как sap_fiori_3, и попытался обойти эти настройки.

Итак, для первых двух выпусков я использовал хак CSS:

div.sapUShellFullHeight {
    background-image: url(../images/myBackgroundImage.svg);
    background-repeat: no-repeat;
    background-size: contain;
    background-position: right;
}

a#shell-header-logo > img#shell-header-icon {
    content:url(../images/logo.svg);
}

А для favicon я использовал решение об обещании. Обратите внимание, что в fiori launchpad каждый раз, когда вы переключаетесь между приложениями, fiori сбрасывает favicon, поэтому я использовал обещание JavaScript, чтобы установить его.

// Set the favicon dynamically to get read of blinking 
function waitForElementAppear(selector) {
  return new Promise(function(resolve, reject) {
    var element = document.querySelector(selector);
    if(element) {
      resolve(element);
      return;
    }
    var observer = new MutationObserver(function(mutations) {
      mutations.forEach(function(mutation) {
        var nodes = Array.from(mutation.addedNodes);
        for(var node of nodes) {
          if(node.matches && node.matches(selector)) {
            observer.disconnect();
            resolve(node);
            return;
          }
        };
      });
    });
    observer.observe(document.documentElement, { childList: true, subtree: true });
  });
}
//
function waitForElementRemoved(selector) {
  return new Promise((resolve) => {
    var element = document.querySelector(selector);
      if(!element) {
          resolve();
          return;
      }
      var observer = new MutationObserver((mutations, observer) => {
        for (const mutation of mutations) {
          for (const removedNode of mutation.removedNodes) {
            if (removedNode === element) {
              observer.disconnect();
              resolve();
            }
          }
        }
      });
      observer.observe(element.parentElement, { childList: true });
    });
}
//  
function changeFavIcon(selector) {
        waitForElementAppear(selector).then(function(element) {
        element.setAttribute("href", "icon/favicon.ico");
        waitForElementRemoved(selector).then(function() {
            changeFavIcon(selector);
        });
    });
};
changeFavIcon("link[rel='shortcut icon']");

Он рекурсивно проверяет, когда favicon вводится, затем он устанавливает его href, и как только он будет удален, эта функция будет наблюдать следующую инъекцию!

Как я знаю, кто-то может сказать, почему не использовался sapui5 его оригинал решение для установки favicon, например:

jQuery.sap.setIcons({
            'phone': '/images/cimt-logo.png',
            'phone@2': '/images/cimt-logo.png',
            'tablet': '/images/cimt-logo.png',
            'tablet@2': '/images/cimt-logo.png',
            'favicon': '/icon/favicon.ico',
            'precomposed': true
        });

Я должен сказать, что в моем случае это не сработало!

...