Библиотека поддерживает Drag-and-drop (DnD) элементов в таблицу и из нее.
Чтобы включить DnD для строк, установите значение true параметру drag.
Drag-and-drop для строк
webix.ui({
view:"datatable",
drag:true
});
Чтобы перетягивать строки между несколькими таблицами, нужно включить параметр drag в каждой из таблиц.
Related sample: Drag-and-Drop between Tables in DataTable
В этом режиме HTML перетаскиваемого компонента удаляется с его старого места.
Чтобы добавить драг-н-дроп и активировать режим 'move', установите значение move для параметра drag.
Режим 'move' для строк
webix.ui({
view:"datatable",
drag:"move"
});
Related sample: The DnD Modes for Rows
В этом режиме драг-н-дроп позволяет перемещать элементы внутри компонента, изменяя их порядок.
Чтобы добавить драг-н-дроп и активировать режим 'order', установите значение order для параметра drag.
Режим 'order' для строк
webix.ui({
view:"datatable",
drag:"order"
});
Related sample: The DnD Modes for Rows
Чтобы включить DnD для столбцов, установите значение true параметру dragColumn.
Drag-and-drop для столбцов
webix.ui({
view:"datatable",
dragColumn:true
});
Чтобы перетягивать столбцы между несколькими таблицами, нужно включить параметр dragColumn в каждой из таблиц.
Related sample: Drag-and-Drop Support for Columns
Существует три события, которые будут полезны в процессе перетягивания:
В режиме "order" столбцы не могут быть перетянуты за пределы границ таблицы. Кроме того, в момент перетягивания пользователем столбца, остальные столбцы автоматически группируются, чтобы освободить место для столбца.
Чтобы добавить драг-н-дроп и активировать режим 'order' для столбцов, установите значение order для параметра dragColumn.
Режим "order" для столбцов
webix.ui({
view:"datatable",
dragColumn:"order"
});
Related sample: Datatable: Column Reordering
Если включен драг-н-дроп в режиме "order" события onBeforeColumnDrop и onAfterColumnDrop не сработают. Вместо них сработают события:
Следуйте этим рекомендациям, чтобы настроить режимы DnD:
Чтобы изменить маркер драг-н-дроп по умолчанию (элемент, который отображается рядом с курсором мыши во время перетаскивания), используйте событие onBeforeDrag.
Содержимое элемента определяется с помощью свойства context.html. Вы можете назначить ему любой текст или HTML.
dtable.attachEvent("onBeforeDrag", function(context, ev){
context.html = context.source.length+" item(s)";
});
dtable.attachEvent("onBeforeDrag", function(context, ev){
context.html = "<img src='some.gif'></img> " + context.start;
});
dtable.attachEvent("onBeforeDrag", function(context, ev){
context.html = "";
for (var i=0; i< context.source.length; i++){
context.html += context.from.getItem(context.source[i]).title + "<br>" ;
}
});
Related sample: Using Events for Customizing Drag-and-Drop
Чтобы запретить перетаскивание определенных элементов, используйте свойство onBeforeDrag.
Запрет на перетаскивание четных элементов
dtable.attachEvent("onBeforeDrag", function(context, ev){
if(dtable.getIndexById(context.start)%2==0){
return false; //запрещает перетаскивание если индекс элемента четный
}
return true; //позволяет перетаскивания в любых других случаях
});
Вы можете использовать метод addCss, чтобы отмечать элементы, и метод hasCss, чтобы проверить есть ли у элемента отметка.
Чтобы запретить перетягивание в определенное место, используйте событие onBeforeDrop, которое будет возвращать false
каждый раз, когда вы хотите запрещать перемещение.
Предположим, вы решили запретить перетаскивание в положение элемента с 'id=2':
Запрет перетаскивания в определенную область
var dtable = webix.ui({
view:"datatable",
data:[
{ id:1, title:"The Shawshank Redemption", year:1994},
{ id:2, title:"The Godfather", year:1972},
{ id:3, title:"The Godfather: Part II", year:1974}
]
});
dtable.data.addMark(2,"type", false,"b"); // добавляет флаг (type='b') элементу с id=2
dtable.attachEvent("onBeforeDrop", function(context, ev){
// если у элемента есть флаг type='b', запрещает перетаскивание в его местоположение
if(dtable.data.getMark(context.target,"type")=='b') return false;
return true;
});
По умолчанию строки при DnD перемещается, но не копируются.
Чтобы изменить поведение на "копирование", используйте событие onBeforeDrop. Задайте внутри события логику копирования и возвращайте false
для предотвращения обработки DnD:
Изменение логики DnD на копирование
dtable.attachEvent("onBeforeDrop", function(context, ev){
for (var i=0; i< context.source.length; i++){
context.from.copy(context.source[i],context.index,this,webix.uid());
}
return false;
});
Related sample: Using Events for Customizing Drag-and-Drop
По умолчанию вы можете перетянуть элемент "потянув" за его любую часть. Чтобы ограничить область элемента, отвечающую на DnD, выполните следующие действия:
1. Добавьте или определите часть элемента, которая будет отвечать на перетягивание.
2. Установите этот область как целевой объект для события onBeforeDrag.
.webix_drag_handle{
background-image:url(./handle.png);
background-repeat: no-repeat;
}
var dtable = webix.ui({
view:"datatable",
// настройки datatable
columns:[
{ id:"rank", header:"", css:"rank" },
{ id:"title", header:"Film title" },
{ id:"year", header:"Released"},
{ id:"drag", header:"", template:"<div class='webix_drag_handle'></div>" }
],
on:{
onBeforeDrag:function(data, e){
return (e.target||e.srcElement).className == "webix_drag_handle";
}
}
});
Если цель события не содержит "webix_drag_handle", DnD не сработает.
Related sample: Limiting Draggable Area for Items (Dragging Rows)
Related sample: Limiting Draggable Area for Items (Dragging Columns)
По умолчанию таблица прокручивается когда перетягивание приближается к нижней границе. Это поведение можно переопределить используя свойство dragscroll:
webix.ui({
view:"datatable",
dragscroll:false
});
По умолчанию скролл при перетаскивании работает вертикально. Чтобы включить скрол в обоих направлениях, задайте свойству dragscroll значение xy
:
webix.ui({
view:"datatable",
dragscroll:"xy"
});
Следующие события вызываются во время Dnd и могут быть использованы для его настройки:
Проверьте свои силы по ссылке.
Наверх