Table Drag and Drop

Подскажите, как реализовать перетаскивание элементов из таблицы в groupList? 20
Задача состоит в следующем: менять свойство folder у Entity, когда перетаскиваешь элемент из таблицы на одну из папок. Спасибо!

Добрый день.

К сожалению, OptionsGroup компонент не поддерживает функциональность перетаскивания, т.е. даже если Вы перетащите item из таблицы, Вы не сможете это обработать и изменить необходимые атрибуты сущности. Наиболее близкий вариант, который я могу предложить - это использование компонента Tree вместо OptionsGroup. Например у меня получился такой UI:

image

Если я правильно понимаю, то одна из функиональных задач OptionsGroup на Вашем экране - это фильтрация данных в таблие. С компонентом Tree Вы сможете реализовать аналогичное поведение.

Для того, чтобы использовать функиональность перетаскивания, компоненты необходимо “развернуть”, чтобы получить Vaadin компонеты и реализвать DropHandler, например:

public class CustomerBrowse extends AbstractLookup {
    
    @Inject
    private Tree gradeTree;
    @Inject
    private Table<Customer> customersTable;

    @Inject
    private CollectionDatasource<Customer, UUID> customersDs;

    @Inject
    private Metadata metadata;

    @Override
    public void init(Map<String, Object> params) {
        // Unwrap to a vaadin table ...
        com.vaadin.ui.Table table = customersTable.unwrap(com.vaadin.ui.Table.class);
        // ... to define DragMode
        table.setDragMode(com.vaadin.ui.Table.TableDragMode.ROW);

        gradeTree.setDatasource(createTreeDatasource());

        // Unwrap to a vaadin Tree ...
        com.vaadin.ui.Tree tree = gradeTree.unwrap(com.vaadin.ui.Tree.class);
        // ... to add a DropHandler
        tree.setDropHandler(new DropHandler() {
            @Override
            public void drop(DragAndDropEvent event) {
                // Obtain dropped Customer
                UUID sourceItemId = (UUID) event.getTransferable().getData("itemId");
                Customer customer = customersDs.getItemNN(sourceItemId);

                // Obtain selected Grade
                com.vaadin.ui.Tree.TreeTargetDetails targetDetails = (com.vaadin.ui.Tree.TreeTargetDetails) event.getTargetDetails();
                UUID targetItemId = (UUID) targetDetails.getItemIdOver();
                //noinspection unchecked
                CustomerGradeEntity gradeItem = (CustomerGradeEntity) gradeTree.getDatasource().getItemNN(targetItemId);
                CustomerGrade grade = gradeItem.getGrade();

                // Update Customer
                customer.setGrade(grade);
                customersDs.updateItem(customer);
                customersDs.commit();
            }

            @Override
            public AcceptCriterion getAcceptCriterion() {
                // We want to restrict drops only on an item
                return new And(AbstractSelect.VerticalLocationIs.MIDDLE);
            }
        });
    }

    private HierarchicalDatasource createTreeDatasource() {
        // Datasource Programmatic Creation
        HierarchicalDatasource gradesDs = new DsBuilder()
                .setJavaClass(CustomerGradeEntity.class)
                .setId("gradesDs")
                .buildHierarchicalDatasource();
        gradesDs.setHierarchyPropertyName("parent");

        // Convert Enum values to Entities
        for (CustomerGrade at : CustomerGrade.values()) {
            CustomerGradeEntity gradeEntity = metadata.create(CustomerGradeEntity.class);
            gradeEntity.setGrade(at);
            //noinspection unchecked
            gradesDs.includeItem(gradeEntity);
        }

        return gradesDs;
    }
}

Здесь я предполагаю, что опиции для OptionsGroup берутся из Enum.

Весь проект можно скачать с GitHub.

2 симпатии

Глеб, спасибо за ответ.
В итоге: так и использовал компонент tree. Тут возник другой вопрос - на счёт переопределения стиля tree. Вопрос лучше задать тут или в отдельную тему вынести? Главное, чтобы ответ получить как можно быстрее.
Спасибо.

Лучше создать отдельный топик.
Спасибо.

https://www.cuba-platform.ru/discuss/t/pereopredelenie-temy-dlya-tree/1448