Подскажите, как реализовать перетаскивание элементов из таблицы в groupList?
Задача состоит в следующем: менять свойство folder у Entity, когда перетаскиваешь элемент из таблицы на одну из папок. Спасибо!
Добрый день.
К сожалению, OptionsGroup компонент не поддерживает функциональность перетаскивания, т.е. даже если Вы перетащите item из таблицы, Вы не сможете это обработать и изменить необходимые атрибуты сущности. Наиболее близкий вариант, который я могу предложить - это использование компонента Tree вместо OptionsGroup. Например у меня получился такой UI:
Если я правильно понимаю, то одна из функиональных задач 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.
Глеб, спасибо за ответ.
В итоге: так и использовал компонент tree. Тут возник другой вопрос - на счёт переопределения стиля tree. Вопрос лучше задать тут или в отдельную тему вынести? Главное, чтобы ответ получить как можно быстрее.
Спасибо.
Лучше создать отдельный топик.
Спасибо.