Для выполнения примера в теге HEAD подключите ссылки на библиотеку компонентов PP.js и таблицы визуальных стилей PP.css. В теге BODY добавьте элемент DIV с идентификатором «container». Добавьте картинку, содержащую список пиктограмм вершин.
Подключим скрипт, генерирующий случайные вершины:
<script src="genJson.js" type="text/javascript"></script>
В тег <script> добавим следующий код:
// Определим события перетаскивания var onNodeDrag = function (s, a) { // Запретим добавление листьям новых потомков var targetIsFolder = treelist.getNodeChildrenCount(a.TargetNode) > 0, draggableIsFolder = treelist.getNodeChildrenCount(a.Nodes[0]) > 0; if (!targetIsFolder) a.CanTakeChildren = false; };
var onNodeDragEnd = function (s, a) { // Выведем в консоль результат перетаскивания
console.log(a); };
var onNodeDragStart = function (s, a) { // Запрещаем перетаскивание последнего потомка var dragNode = a.Nodes[0], dragNodeParent = t.getNodeParent(dragNode); if (dragNodeParent && t.getNodeChildrenCount(dragNodeParent) == 1) a.Cancel = true; // отменяем действие, чтобы вершина оставалась "папкой", т.е. чтобы у нее были дочерние элементы }; // -------------------- // Создадим дерево var json = genJson(500, 100, false, 1234567); // Функция генерирования вершин var t, Tree; t = Tree = new PP.Ui.SimpleTreeList({ DataObject: json, DataMappers: {
Key: 'k', Index: 'i', Parent: 'p', Content: new PP.PropertyMapper({ Getter: function (item) { return item.a.it }, Setter: function (item, value) { item.a.it = value; } }), Selected: 's', Expanded: 'e', ImageIndex: new PP.PropertyMapper({ Getter: function (item) { return this.getNodeChildrenCount(item.k) ? (item.e ? 1 : 0) : 2 }, Context: t }),
}, ImageList: imageList = new PP.ImageList({ Source: '../../../build/img/treeIcons.png', IconHeight: 20, IconWidth: 20 }), Width: 580, Height: 580, // Зададим настройки перетаскивания EnableDragAndDrop: true, DragAndDropMode: 'MultiDrag', DragAndDropDelay: 200, DragAndDropIndent: 0,
EnableDragOutside: true, EnableDropOutside: true, EnableColumnsMenu: true, SelectionMode: 'ControlShiftMultiSelect', ParentNode: 'container', Captions: [{ Content: 'first', Width: '40%' },{ Content: 'second',
Width: '10%' },{ Content: 'third', Width: '50%' }], NodeDrag: onNodeDrag, NodeDragStart: onNodeDragStart, NodeDragEnd: onNodeDragEnd }); Tree.setSelectedForAll(false);
В результате выполнения примера был создан компонент SimpleTreeList c возможностью перетаскивания вершин.
См. также: