Двойное открытие лукапа по двойному клику

В нашем проекте имеется структура связанных сущностей, для которых существуют таблицы и редакторы. В процессе разработки мы натолкнулись на следующую ошибку.
Есть объект, назовем его Entity1, у него есть связь many-to-one с другим объектом Entity2, с соответствующим полем (условно назовем entity2) в классе Entity1. У Entity1 есть редактор, в котором данное поле можно задать. Редактор работает в dialogMode (
dialogMode height=“AUTO”
width=“AUTO”
modal=“true”
forceDialog=“true”
). В редакторе есть pickerField для задания значения поля entity2, этот pickerField нормально прорисовывается на экране со стандартными двумя кнопками - выбора из лукапа и очистки.

Проблема следующая - если начать редактирование объекта типа Entity1 и сделать двойной клик на кнопке выбора из лукапа, этот лукап открывается дважды. Причем проблема возникает только если редактор работает в режиме модального диалога. Если убрать <dialogMode проблема исчезает и лукап открывается лишь однажды. К сожалению, мы хотим добиться работы именно в режиме всплывающего диалога и почти все редакторы у нас именно такие, так что данная ошибка возникает по всему проекту. Попытка вручную как-то заблокировать “вторую половину” двойного клика через enabledRule ни к чему не привела, лукап все ещё открывается дважды.

В “entity2”-browse задан размер при вызове в качестве диалога (dialogMode height=“600” width=“800”), но убирание этого тэга из xml на проблему не влияет.

Добрый день.
Спасибо, что сообщили о проблеме, мы создали задачу в GitHub.

Добрый день.

К сожалению мы не планируем, а точнее не можем пофиксить данную проблему, т.к. действия не знают кто их запускает и как (один клик, два клика и т.д.). Кнопки так же не обрабатывают двойные нажатия как отдельные события, т.к. для них это просто два быстрых нажатия.

В качестве решения проблемы могу предложить следующий workaround:

  • Создать кастомный LookupAction который будет отслеживать свое состояние ‘activated’ и пропускать последовательные запуски:
package com.company.dim.web.actions;

import com.haulmont.chile.core.model.MetaClass;
import com.haulmont.cuba.core.entity.Entity;
import com.haulmont.cuba.core.global.DevelopmentException;
import com.haulmont.cuba.gui.actions.picker.LookupAction;
import com.haulmont.cuba.gui.builders.LookupBuilder;
import com.haulmont.cuba.gui.components.ActionType;
import com.haulmont.cuba.gui.screen.Screen;

@ActionType(LookupAction.ID)
public class CustomLookupAction<E extends Entity> extends LookupAction<E> {

    private boolean activated = false;

    public CustomLookupAction() {
        super(LookupAction.ID);
    }

    public CustomLookupAction(String id) {
        super(id);
    }

    @SuppressWarnings("unchecked")
    @Override
    public void execute() {
        // Skip action execution if it's activated
        if (activated) {
            return;
        }

        MetaClass metaClass = pickerField.getMetaClass();
        if (metaClass == null) {
            throw new DevelopmentException("Neither metaClass nor datasource/property is specified " +
                    "for the PickerField", "action ID", getId());
        }

        // Set 'activated' in order to skip consecutive executions
        activated = true;

        LookupBuilder<E> builder = screenBuilders.lookup(pickerField);

        builder = screenInitializer.initBuilder(builder);

        if (selectValidator != null) {
            builder = builder.withSelectValidator(selectValidator);
        }

        if (transformation != null) {
            builder = builder.withTransformation(transformation);
        }

        Screen lookupScreen = builder.build();

        screenInitializer.initScreen(lookupScreen);

        lookupScreen.addAfterCloseListener(afterCloseEvent -> {
            // Clear 'activated' after the screen is closed
            activated = false;
        });

        lookupScreen.show();
    }
}
  • Зарегистрировать базовый пакет действий в web-spring.xml
<gui:actions base-packages="com.company.dim.web.actions"/>

Глеб

Спасибо, помогло решить проблему.