Показать сообщения, основанные на серьезности, в два раза - PullRequest
5 голосов
/ 15 января 2011

Я использую PrimeFaces p: growl.

<p:growl id="msgsInfo"
         rendered="true"
         showDetail="true" />
<p:growl id="msgsError"
         globalOnly="true"
         showDetail="true"
         sticky="true" />

Мне нужно показывать в первом рычании только Info сообщения, в то время как во втором мне нужно показывать Error сообщений.Использование globalOnly при добавлении сообщения об ошибке показывает 2 раза.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 18 октября 2016

Пожалуйста, смотрите мой ответ

рычание PrimeFaces меняет цвет динамически (несколько сообщений)

Вы также можете найти исходный код проекта, который производит страницу ниже:

enter image description here

3 голосов
/ 16 января 2011

Теоретически это было бы возможно, если бы он поддерживал атрибуты infoClass, errorClass и т. Д., Такие как h:messages.Затем вы можете просто указать класс CSS, который выполняет display: none.

Но p:growl не поддерживает эти атрибуты.На уровне серьезности все, что вы можете сделать, это изменить значок на infoIcon, errorIcon и т. Д. Таким образом, вы довольно растеряны здесь..

Обратите внимание, что globalOnly="true" отображает только сообщения, имеющие null идентификатор клиента, независимо от их серьезности.

1 голос
/ 07 мая 2017

Я искал ту же функциональность (чтобы рычание зависло от конкретной серьезности сообщения).PrimeFaces (6.1) не предлагает эту функциональность, но взломать рычаг JavaScript довольно просто.Более конкретно, в функции bindEvents они проверяют, был ли настроен sticky и на основании этого:

//hide the message after given time if not sticky
if(!sticky) {
    this.setRemovalTimeout(message);
}

Таким образом, вы можете создать прототип (переопределить) функцию bindEvents и установить на основе stickyна серьезность сообщения.

PrimeFaces.widget.Growl.prototype.bindEvents = function(message) {
    var _self = this,
    sticky = this.cfg.sticky;

    // Start hack
    if (!sticky) {
      // Your rule
    }
    ...

Вы также можете создать прототип renderMessage и добавить серьезность в качестве параметра к bindEvents.Я выбрал быстрый взлом и прочитал его из className.

Я добавил следующие служебные функции:

var SEVERITIES = [ "info", "warn", "error", "fatal" ];

function getSeverity(domNode) {
  // HACK Severity can be found in the className after the last - character.
  var severity = domNode.className;
  return severity.substring(severity.lastIndexOf("-") + 1);
}

function getSeverityIndex(severityString) {
  return SEVERITIES.indexOf(severityString);
}

Теперь вы можете использовать следующую проверку:

if (!sticky) {
  sticky = getSeverityIndex(getSeverity(message[0])) >= getSeverityIndex("error");
}

Я мог бы создать запрос на извлечение в GitHub, где вы можете установить минимальную серьезность для прикрепления сообщений, используя атрибут stickSeverity для компонента p:growl.

Вот полный взлом JavaScript (PrimeFaces 6.1):

var SEVERITIES = [ "info", "warn", "error", "fatal" ];

function getSeverity(domNode) {
  // HACK Severity can be found in the className after the last - character.
  var severity = domNode.className;
  return severity.substring(severity.lastIndexOf("-") + 1);
}

function getSeverityIndex(severityString) {
  return SEVERITIES.indexOf(severityString);
}

PrimeFaces.widget.Growl.prototype.bindEvents = function(message) {
    var _self = this,
    sticky = this.cfg.sticky;

    // Start customization
    if (!sticky) {
      sticky = getSeverityIndex(getSeverity(message[0])) >= getSeverityIndex("error");
    }
    // End customization

    message.mouseover(function() {
        var msg = $(this);

        //visuals
        if(!msg.is(':animated')) {
            msg.find('div.ui-growl-icon-close:first').show();
        }
    })
    .mouseout(function() {
        //visuals
        $(this).find('div.ui-growl-icon-close:first').hide();
    });

    //remove message on click of close icon
    message.find('div.ui-growl-icon-close').click(function() {
        _self.removeMessage(message);

        //clear timeout if removed manually
        if(!sticky) {
            clearTimeout(message.data('timeout'));
        }
    });

    //hide the message after given time if not sticky
    if(!sticky) {
        this.setRemovalTimeout(message);
    }
}
...