Нельзя стилизовать отдельно элементы диалогов из Dialogs

Здравствуйте!

Версия 2.2.2, плагин 2.2.3 -241.

Часто пользуюсь бином Dialogs и его различными вариациями. Но когда стилизуешь приложение, нет глобальной настройки для стилизации кнопок конкретно этих диалогов, к примеру нужно поменять тему кнопки "Отмена" на Primary, Error, кнопки "Ок" на Primary, Success, разнести кнопки подальше друг от друга и т.п.

У Vaadin есть Confirm Dialog, который по дефолту позволяет это делать, но он не используется в платформе. Dialogs разработки Jmix удобней в плане организации обработчиков и внедрения его в код контроллеров.

Также этот вопрос актуален для стандартных действий вроде удаления (пока только с ним столкнулся), т.к. там создаётся собственный диалог без доступа к тем же кнопкам (см. ниже):

Спойлер
protected <E> void performActionWithConfirmation(RemoveBuilder<E> builder, List<E> selectedItems) {
        builder.getOrigin().getUI().ifPresent(ui -> {
                    Dialogs dialogs = Instantiator.get(ui).getOrCreate(Dialogs.class);

                    String header = builder.getConfirmationTitle() != null ?
                            builder.getConfirmationTitle() : messages.getMessage("dialogs.Confirmation");

                    String text = builder.getConfirmationMessage() != null ?
                            builder.getConfirmationMessage() : messages.getMessage("dialogs.Confirmation.Remove");

                    dialogs.createOptionDialog()
                            .withHeader(header)
                            .withText(text)
                            .withActions(
                                    new DialogAction(DialogAction.Type.YES)
                                            .withHandler(e -> performAction(builder, selectedItems))
                                            .withVariant(ActionVariant.PRIMARY),
                                    new DialogAction(DialogAction.Type.NO).withHandler(e -> {
                                        focusListDataComponent(builder);

                                        if (builder.getActionCancelledHandler() != null) {
                                            ActionCancelledEvent<E> event =
                                                    new ActionCancelledEvent<>(builder.getOrigin(), selectedItems);
                                            builder.getActionCancelledHandler().accept(event);
                                        }
                                    })
                            )
                            .open();
                }
        );
    }

Можно конечно переопределить этот метод и подсунуть свой бин, но как-то слишком сложно для простого изменения темы кнопок)) Да и с Dialogs такой трюк не пройдёт, надо целиком подсовывать другую имплементацию.

Возможно сделать в ближайшее время либо возможность в диалогах набирать темы вручную (сейчас можно методом withVariant(ActionVariant), но только одну тему) или как это сделано в томе же Vaadin, сделать глобальную настройку?
image

Здравствуйте!

В Вашем случае единственным решением пока что будет переопределение бина Dialogs и стилизация диалогов изнутри, по той логике, которая Вам нужна. Это самый простой и действенный способ.

У Vaadin Confirm Dialog есть предопределенные слоты под кнопки, т.к. у них набор кнопок фиксированный. И поэтому для них существуют предопределенные стили. У нас набор кнопок динамический, но для них нельзя добавлять дополнительные стили. К тому же существует возможность добавить касмотную кнопку с касмотным Action. Стили для кнопок наследуются из соответствующих DialogAction.

Вообще, идея неплохая. Я завёл задачу на предопределенные стили для наших стандартных действий и их кнопок: Support styling for standard dialog actions · Issue #3236 · jmix-framework/jmix · GitHub

Спасибо за вопрос

С уважением,
Дмитрий