Реализация инкрементального поиска, фильтра

Добрый день. Подскажите, как реализовать инкрементальный поиск средствами Cuba?
Есть такая форма (Capture). Отображаемые на ней данные хранятся в List. Нужно что бы при вводе, например, number_id=1 в поле поиска, отобразилась только строка с number_id=15 и связанные с ней поля (Capture2, без нажатия enter, а сразу был refresh). Форму поиска прикрутил от vaadin. Как вариант написать свой обработчик при вводе данных в поле, но быть может есть стандартный функционал?

Буду благодарен за советы и пути решения данного вопроса.

Capture

Capture2

Добрый день.

Стандартного функицонала нет, также как и в примерах Vaadin, Вам необходимо писать свои обработчики изменения текста (или значения, в зависимости от компонента) и фильтровать данные. Так же могу посоветовать использовать префикс custom (см. документацию) в параметрах запроса источника данных.

С уважением,
Глеб

Понял, спасибо. Тогда вопрос про функционал, который есть.

  1. Имеем всё тот же лист List (неперсистентная сущность), данные которого отображаются в форме Account.xml+Account.java (Entity Browser).
  2. Добавлена форма фильтра, при вводе данных в которую и нажатию на кнопку должен быть рефреш и фильтрация атрибутов сущности.
    Вопрос - для отображения отфильтрованных данных нужно создавать новые формы экранов из серии Entity Editor или можно все в той же форме отобразить?
    Если можно - как лучше сделать, от чего наследоваться, какие методы переопределять?

Добрый день.

Как вы связываете компонент DataGrid с List? Такие компоненты как DataGrid и Table работают только с источниками данных (datasources).

Так же было бы очень удобно, если Вы приложите код экрана (дескриптор + контроллер).

С уважением,
Глеб

List я упомянул в качестве абстрактного примера.
Небольшое пояснение тогда к приложенному коду:
Используется две базы, локальная и удаленная. Выбираются данные из двух баз по primary_key и помещаются в неперсистентную сущность AccountanView. Теперь необходимо прикрутить к каждому атрибуту этой сущности (к каждому столбцу на экране отображения) фильтр и осуществить связывание этих фильтров. Т.е было 10 строк, ввели в первое поле что-то, нажали Apply, отсортировали строки, осталось 5. Далее ввели в окно поиска какое-то значение, и уже и 5 осталось 3 и т.д.

project.rar (22.9K)

И еще небольшой вопрос по поводу vaadin datagrid.
У меня есть Cuba datagrid, я хочу этот grid поместить в контейнер vaadin и дальше работать уже с ним, как с vaadin datagrid. Сделал вот так:

public void init(Map<String, Object> params) {
        super.init(params);
        final com.vaadin.ui.Grid grid = AccountantviewGrid.unwrap(com.vaadin.ui.Grid.class);
        Session session = metadata.getSession();
        MetaClass accViewClass = session.getClassNN(AccountantView.class);
        Grid.HeaderRow filterRow = grid.appendHeaderRow();
        Grid.HeaderCell idDepFiltering = filterRow.getCell(accViewClass.getPropertyPath("id_department"));
    }

Дальше я делаю контейнер и создаю обрабоnчик действий для фильтра:

BeanItemContainer< AccountanView> container = ((BeanItemContainer< AccountanView>) grid 
     .getContainerDataSource()); 

И получаю ошибку ClassCastException: ContainerDataSource cannot be cast to BeanItemContainer

Спасибо за подробное описание, теперь я понимаю для чего используются именно неперсистентные сущности. По вашей проблеме я могу посоветовать два подхода:

  • Организовать в Вашем сервисе возможность загружать данные с применением фильтрации
  • Организовать фильтрацию над всеми данными внутри кастомного источника данных

Я подготовил демо проект на GitHub в котором расмотрены все подходы.
Что касается Vaadin Grid, я бы не советовал без крайней необходимости обращаться к механизмам предоставления данных Vaadin копонентов напрямую, т.к. замена ContainerDatasource может привести к нарушению механизмов, предусмотренных CUBA компонентами, такие как срабатывание слушателей событий изменения данных.
Если по существу исключения, то по умолчанию Grid имеет специальную реализацию контейнера несовместимую с BeanItemContainer.
С уважением,
Глеб

Благодарю за ответы и примеры. Имеется еще один небольшой вопрос.
Процедура выборки из сторонней базы должна быть инициализирована с определенной периодичностью, например 1 мин. Таким образом кэш обновляется каждую минуту. Как в Cuba более правильно реализовать подобный функционал, насколько целесообразно использовать singleton и один поток для данной операции?

Добрый день.

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

С уважением,
Глеб