Как настроить цвет сообщений обратной связи в сеансах Wicket?

Эта проблема

Здравствуйте, я пытаюсь настроить цвет сообщений обратной связи калитки. В настоящее время я поддерживаю графический интерфейс Wicket (Wicket 7.6.1). Кажется, что Session.get().warn("Watch out!") выводит зеленое окно предупреждения, помеченное классом CSS alert-success, Я хотел бы, чтобы это изменило свой цвет на желтый.

Что я получил так далеко:

я нашел это Session.get().getApplication().getResourceSettings() дает мне доступ к некоторым настройкам ресурса, включая фабрику свойств. Но я не знаю, как его использовать. Кроме того, я искал файлы разметки, связанные с моей сессией, но не нашел ни одной.

Любая помощь будет принята с благодарностью!

3 ответа

Решение

Вы можете создать свою собственную панель обратной связи, если хотите.

CustomFeedBackPanel.html

<wicket:panel>
    <div wicket:id="feedbackul">
        <wicket:container wicket:id="messages">
            <p wicket:id="message"></p>
        </wicket:container>
    </div>

</wicket:panel>

CustomFeedBackPanel.java

public class CustomFeedbackPanel extends Panel implements IFeedback {

    private static final long serialVersionUID = 1L;
    private final MessageListView messageListView;
    WebMarkupContainer messagesContainer = new WebMarkupContainer("feedbackul") {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onConfigure() {
            super.onConfigure();
            setVisible(anyMessage());
        }
    };


    public CustomFeedbackPanel(final String id) {
        this(id, null);
    }


    public CustomFeedbackPanel(final String id, IFeedbackMessageFilter filter) {
        super(id);

        add(messagesContainer);
        messageListView = new MessageListView("messages");
        messagesContainer.add(messageListView);

        if (filter != null) {
            setFilter(filter);
        }
    }

    public final boolean anyErrorMessage() {
        return anyMessage(FeedbackMessage.ERROR);
    }

    public final boolean anyMessage() {
        return anyMessage(FeedbackMessage.UNDEFINED);
    }

    public final boolean anyMessage(int level) {
        List<FeedbackMessage> msgs = getCurrentMessages();

        for (FeedbackMessage msg : msgs) {
            if (msg.isLevel(level)) {
                return true;
            }
        }

        return false;
    }

    public final FeedbackMessagesModel getFeedbackMessagesModel() {
        return (FeedbackMessagesModel) messageListView.getDefaultModel();
    }

    public final IFeedbackMessageFilter getFilter() {
        return getFeedbackMessagesModel().getFilter();
    }

    public final CustomFeedbackPanel setFilter(IFeedbackMessageFilter filter) {
        getFeedbackMessagesModel().setFilter(filter);
        return this;
    }

    public final Comparator<FeedbackMessage> getSortingComparator() {
        return getFeedbackMessagesModel().getSortingComparator();
    }

    public final CustomFeedbackPanel setSortingComparator(Comparator<FeedbackMessage> sortingComparator) {
        getFeedbackMessagesModel().setSortingComparator(sortingComparator);
        return this;
    }

    @Override
    public boolean isVersioned() {
        return false;
    }

    public final CustomFeedbackPanel setMaxMessages(int maxMessages) {
        messageListView.setViewSize(maxMessages);
        return this;
    }

    protected String getCSSClass(final FeedbackMessage message) {
        String css = "feedback";
        if (message.getLevel() == FeedbackMessage.ERROR
                || message.getLevel() == FeedbackMessage.FATAL) {
            css = "feedback error";
        }
        if (message.getLevel() == FeedbackMessage.SUCCESS) {
            css = "feedback success";
        }
        if (message.getLevel() == FeedbackMessage.WARNING) {
            css = "feedback warn";
        }

        return css;
    }

    protected final List<FeedbackMessage> getCurrentMessages() {
        final List<FeedbackMessage> messages = messageListView.getModelObject();
        return Collections.unmodifiableList(messages);
    }

    protected FeedbackMessagesModel newFeedbackMessagesModel() {
        return new FeedbackMessagesModel(this);
    }

    protected Component newMessageDisplayComponent(String id, FeedbackMessage message) {
        Serializable serializable = message.getMessage();
        Label label = new Label(id, (serializable == null) ? "" : serializable.toString());
        label.setEscapeModelStrings(CustomFeedbackPanel.this.getEscapeModelStrings());
        //label.add(new AttributeModifier("class",getCSSClass(message)));
        return label;
    }

    private final class MessageListView extends ListView<FeedbackMessage> {
        private static final long serialVersionUID = 1L;

        public MessageListView(final String id) {
            super(id);
            setDefaultModel(newFeedbackMessagesModel());
        }

        @Override
        protected IModel<FeedbackMessage> getListItemModel(
                final IModel<? extends List<FeedbackMessage>> listViewModel, final int index) {
            return new AbstractReadOnlyModel<FeedbackMessage>() {
                private static final long serialVersionUID = 1L;


                @Override
                public FeedbackMessage getObject() {
                    if (index >= listViewModel.getObject().size()) {
                        return null;
                    } else {
                        return listViewModel.getObject().get(index);
                    }
                }
            };
        }

        @Override
        protected void populateItem(final ListItem<FeedbackMessage> listItem) {
            final FeedbackMessage message = listItem.getModelObject();
            message.markRendered();
            final Component label = newMessageDisplayComponent("message", message);
            final AttributeModifier levelModifier = AttributeModifier.replace("class",
                    getCSSClass(message));
            //label.add(levelModifier);
            listItem.add(levelModifier);
            listItem.add(label);
            messagesContainer.add(levelModifier);

        }


    }
}

Главное, что вы должны учитывать getCssClass() метод. Вы можете изменить в соответствии с вашими требованиями. Я изменил только для вашей справки.

   protected String getCSSClass(final FeedbackMessage message) {
            String css = "feedback";
            if (message.getLevel() == FeedbackMessage.ERROR
                    || message.getLevel() == FeedbackMessage.FATAL) {
                css = "alert error";
            }
            if (message.getLevel() == FeedbackMessage.SUCCESS) {
                css = "alert success";
            }
            if (message.getLevel() == FeedbackMessage.WARNING) {
                css = "alert warn";
            }

            return css;
        }

Сообщения обратной связи предоставляются FeedbackPanel учебный класс. Кажется, ваше приложение использует пользовательскую реализацию FeedbackPanel, которая отображает сообщения как Bootstrap Alerts.

По умолчанию наборы калитки feedbackMessage<LogLevel> (например feedbackMessageWarning) как класс CSS для всех сообщений, так что вы можете стилизовать их как хотите.

Альтернативой не создавать пользовательскую FeedbackPanel и новые файлы HTML/Java является использование вложений:

Использование Twitter Bootstrap классов:

<wicket:enclosure>
    <div class="alert alert-danger alert-dismissible">
        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
        <h4><i class="icon fa fa-ban"></i> Error on form validation!</h4>
        <div wicket:id="errorMessages"></div>
    </div>
</wicket:enclosure>

В конструкторе страниц:

FeedbackCollector collector = new FeedbackCollector(this);
ExactErrorLevelFilter errorFilter = new ExactErrorLevelFilter(FeedbackMessage.ERROR);

add(new FeedbackPanel("errorMessages", errorFilter) {
    @Override public boolean isVisible() {
        return !collector.collect(errorFilter).isEmpty();
    }
});

Поскольку сообщения обратной связи Wicket 6 прикрепляются к компонентам, вы можете использовать FeedbackCollector и фильтр для получения и отображения нужных сообщений. Преимущества корпусов:

  • вам не нужно создавать новые файлы;
  • работает аналогично фрагментам / панелям;
  • он отображается только при наличии желаемых сообщений;

Надеюсь, поможет.

Другие вопросы по тегам