annotate default/node_modules/nestable2/a.js @ 0:1d038bc9b3d2 default tip

Up:default
author Liny <dev@neowd.com>
date Sat, 31 May 2025 09:21:51 +0800
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1 /*!
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2 * Nestable jQuery Plugin - Copyright (c) 2014 Ramon Smit - https://github.com/RamonSmit/Nestable
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
3 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
4
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
5 (function($, window, document, undefined) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
6 var hasTouch = 'ontouchstart' in document;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
7
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
8 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
9 * Detect CSS pointer-events property
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
10 * events are normally disabled on the dragging element to avoid conflicts
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
11 * https://github.com/ausi/Feature-detection-technique-for-pointer-events/blob/master/modernizr-pointerevents.js
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
12 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
13 var hasPointerEvents = (function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
14 var el = document.createElement('div'),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
15 docEl = document.documentElement;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
16 if (!('pointerEvents' in el.style)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
17 return false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
18 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
19 el.style.pointerEvents = 'auto';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
20 el.style.pointerEvents = 'x';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
21 docEl.appendChild(el);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
22 var supports = window.getComputedStyle && window.getComputedStyle(el, '').pointerEvents === 'auto';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
23 docEl.removeChild(el);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
24 return !!supports;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
25 })();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
26
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
27 var defaults = {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
28 contentCallback: function(item) {return item.content || '' ? item.content : item.id;},
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
29 listNodeName: 'ol',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
30 itemNodeName: 'li',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
31 handleNodeName: 'div',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
32 contentNodeName: 'span',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
33 rootClass: 'dd',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
34 listClass: 'dd-list',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
35 itemClass: 'dd-item',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
36 dragClass: 'dd-dragel',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
37 handleClass: 'dd-handle',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
38 contentClass: 'dd-content',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
39 collapsedClass: 'dd-collapsed',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
40 placeClass: 'dd-placeholder',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
41 noDragClass: 'dd-nodrag',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
42 noChildrenClass: 'dd-nochildren',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
43 emptyClass: 'dd-empty',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
44 expandBtnHTML: '<button class="dd-expand" data-action="expand" type="button">Expand</button>',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
45 collapseBtnHTML: '<button class="dd-collapse" data-action="collapse" type="button">Collapse</button>',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
46 group: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
47 maxDepth: 5,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
48 threshold: 20,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
49 fixedDepth: false, //fixed item's depth
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
50 fixed: false,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
51 includeContent: false,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
52 scroll: false,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
53 scrollSensitivity: 1,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
54 scrollSpeed: 5,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
55 scrollTriggers: {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
56 top: 40,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
57 left: 40,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
58 right: -40,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
59 bottom: -40
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
60 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
61 callback: function(l, e, p) {},
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
62 onDragStart: function(l, e, p) {},
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
63 beforeDragStop: function(l, e, p) {},
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
64 listRenderer: function(children, options) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
65 var html = '<' + options.listNodeName + ' class="' + options.listClass + '">';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
66 html += children;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
67 html += '</' + options.listNodeName + '>';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
68
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
69 return html;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
70 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
71 itemRenderer: function(item_attrs, content, children, options, item) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
72 var item_attrs_string = $.map(item_attrs, function(value, key) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
73 return ' ' + key + '="' + value + '"';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
74 }).join(' ');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
75
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
76 var html = '<' + options.itemNodeName + item_attrs_string + '>';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
77 html += '<' + options.handleNodeName + ' class="' + options.handleClass + '">';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
78 html += '<' + options.contentNodeName + ' class="' + options.contentClass + '">';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
79 html += content;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
80 html += '</' + options.contentNodeName + '>';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
81 html += '</' + options.handleNodeName + '>';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
82 html += children;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
83 html += '</' + options.itemNodeName + '>';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
84
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
85 return html;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
86 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
87 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
88
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
89 function Plugin(element, options) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
90 this.w = $(document);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
91 this.el = $(element);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
92 options = options || defaults;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
93
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
94 if (options.rootClass !== undefined && options.rootClass !== 'dd') {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
95 options.listClass = options.listClass ? options.listClass : options.rootClass + '-list';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
96 options.itemClass = options.itemClass ? options.itemClass : options.rootClass + '-item';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
97 options.dragClass = options.dragClass ? options.dragClass : options.rootClass + '-dragel';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
98 options.handleClass = options.handleClass ? options.handleClass : options.rootClass + '-handle';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
99 options.collapsedClass = options.collapsedClass ? options.collapsedClass : options.rootClass + '-collapsed';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
100 options.placeClass = options.placeClass ? options.placeClass : options.rootClass + '-placeholder';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
101 options.noDragClass = options.noDragClass ? options.noDragClass : options.rootClass + '-nodrag';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
102 options.noChildrenClass = options.noChildrenClass ? options.noChildrenClass : options.rootClass + '-nochildren';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
103 options.emptyClass = options.emptyClass ? options.emptyClass : options.rootClass + '-empty';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
104 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
105
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
106 this.options = $.extend({}, defaults, options);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
107
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
108 // build HTML from serialized JSON if passed
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
109 if (this.options.json !== undefined) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
110 this._build();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
111 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
112
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
113 this.init();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
114 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
115
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
116 Plugin.prototype = {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
117
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
118 init: function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
119 var list = this;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
120
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
121 list.reset();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
122
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
123 list.el.data('nestable-group', this.options.group);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
124
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
125 list.placeEl = $('<div class="' + list.options.placeClass + '"/>');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
126
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
127 var items = this.el.find(list.options.itemNodeName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
128 $.each(items, function(k, el) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
129 var item = $(el),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
130 parent = item.parent();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
131 list.setParent(item);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
132 if (parent.hasClass(list.options.collapsedClass)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
133 list.collapseItem(parent.parent());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
134 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
135 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
136
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
137 // Append the .dd-empty div if the list don't have any items on init
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
138 if (!items.length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
139 this.appendEmptyElement(this.el);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
140 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
141
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
142 list.el.on('click', 'button', function(e) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
143 if (list.dragEl) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
144 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
145 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
146 var target = $(e.currentTarget),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
147 action = target.data('action'),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
148 item = target.parents(list.options.itemNodeName).eq(0);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
149 if (action === 'collapse') {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
150 list.collapseItem(item);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
151 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
152 if (action === 'expand') {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
153 list.expandItem(item);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
154 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
155 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
156
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
157 var onStartEvent = function(e) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
158 var handle = $(e.target);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
159 if (!handle.hasClass(list.options.handleClass)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
160 if (handle.closest('.' + list.options.noDragClass).length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
161 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
162 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
163 handle = handle.closest('.' + list.options.handleClass);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
164 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
165 if (!handle.length || list.dragEl) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
166 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
167 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
168
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
169 list.isTouch = /^touch/.test(e.type);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
170 if (list.isTouch && e.touches.length !== 1) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
171 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
172 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
173
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
174 e.preventDefault();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
175 list.dragStart(e.touches ? e.touches[0] : e);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
176 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
177
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
178 var onMoveEvent = function(e) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
179 if (list.dragEl) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
180 e.preventDefault();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
181 list.dragMove(e.touches ? e.touches[0] : e);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
182 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
183 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
184
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
185 var onEndEvent = function(e) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
186 if (list.dragEl) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
187 e.preventDefault();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
188 list.dragStop(e.touches ? e.changedTouches[0] : e);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
189 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
190 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
191
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
192 if (hasTouch) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
193 list.el[0].addEventListener('touchstart', onStartEvent, false);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
194 window.addEventListener('touchmove', onMoveEvent, false);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
195 window.addEventListener('touchend', onEndEvent, false);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
196 window.addEventListener('touchcancel', onEndEvent, false);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
197 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
198
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
199 list.el.on('mousedown', onStartEvent);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
200 list.w.on('mousemove', onMoveEvent);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
201 list.w.on('mouseup', onEndEvent);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
202
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
203 var destroyNestable = function()
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
204 {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
205 if (hasTouch) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
206 list.el[0].removeEventListener('touchstart', onStartEvent, false);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
207 window.removeEventListener('touchmove', onMoveEvent, false);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
208 window.removeEventListener('touchend', onEndEvent, false);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
209 window.removeEventListener('touchcancel', onEndEvent, false);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
210 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
211
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
212 list.el.off('mousedown', onStartEvent);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
213 list.w.off('mousemove', onMoveEvent);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
214 list.w.off('mouseup', onEndEvent);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
215
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
216 list.el.off('click');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
217 list.el.unbind('destroy-nestable');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
218
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
219 list.el.data("nestable", null);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
220 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
221
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
222 list.el.bind('destroy-nestable', destroyNestable);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
223
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
224 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
225
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
226 destroy: function ()
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
227 {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
228 this.el.trigger('destroy-nestable');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
229 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
230
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
231 add: function (item)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
232 {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
233 var listClassSelector = '.' + this.options.listClass;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
234 var tree = $(this.el).children(listClassSelector);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
235
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
236 if (item.parent_id !== undefined) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
237 tree = tree.find('[data-id="' + item.parent_id + '"]');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
238 delete item.parent_id;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
239
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
240 if (tree.children(listClassSelector).length === 0) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
241 tree = tree.append(this.options.listRenderer('', this.options));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
242 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
243
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
244 tree = tree.find(listClassSelector);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
245 this.setParent(tree.parent());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
246 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
247
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
248 tree.append(this._buildItem(item, this.options));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
249 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
250
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
251 replace: function (item)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
252 {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
253 var html = this._buildItem(item, this.options);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
254
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
255 this._getItemById(item.id)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
256 .replaceWith(html);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
257 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
258
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
259 //use fade = 'fade' to fadeout item before removing.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
260 //by using time(string/msecs), you can control animation speed, default is jq 'slow'
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
261 remove: function (itemId, fade, time)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
262 {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
263 var opts = this.options,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
264 el = this.el,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
265 item = this._getItemById(itemId);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
266
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
267 //animation time
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
268 time = time || 'slow';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
269
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
270 //removes item and additional elements from list
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
271 function removeItem(item) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
272
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
273 // remove item
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
274 item = item || this;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
275 item.remove();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
276
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
277 // remove empty children lists
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
278 var emptyListsSelector = '.' + opts.listClass
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
279 + ' .' + opts.listClass + ':not(:has(*))';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
280 $(el).find(emptyListsSelector).remove();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
281
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
282 // remove buttons if parents do not have children
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
283 var buttonsSelector = '[data-action="expand"], [data-action="collapse"]';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
284 $(el).find(buttonsSelector).each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
285 var siblings = $(this).siblings('.' + opts.listClass);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
286 if (siblings.length === 0) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
287 $(this).remove();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
288 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
289 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
290 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
291
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
292 //Setting fade to true, adds fadeOut effect to removing.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
293 if (fade === 'fade') {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
294 item.fadeOut(time, removeItem);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
295 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
296 else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
297 removeItem(item);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
298 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
299 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
300
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
301 _getItemById: function(itemId) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
302 return $(this.el).children('.' + this.options.listClass)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
303 .find('[data-id="' + itemId + '"]');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
304 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
305
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
306 _build: function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
307 var json = this.options.json;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
308
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
309 if (typeof json === 'string') {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
310 json = JSON.parse(json);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
311 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
312
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
313 $(this.el).html(this._buildList(json, this.options));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
314 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
315
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
316 _buildList: function(items, options) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
317 if (!items) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
318 return '';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
319 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
320
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
321 var children = '';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
322 var that = this;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
323
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
324 $.each(items, function(index, sub) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
325 children += that._buildItem(sub, options);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
326 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
327
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
328 return options.listRenderer(children, options);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
329 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
330
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
331 _buildItem: function(item, options) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
332 function escapeHtml(text) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
333 var map = {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
334 '&': '&amp;',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
335 '<': '&lt;',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
336 '>': '&gt;',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
337 '"': '&quot;',
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
338 "'": '&#039;'
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
339 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
340
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
341 return text + "".replace(/[&<>"']/g, function(m) { return map[m]; });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
342 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
343
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
344 function filterClasses(classes) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
345 var new_classes = {};
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
346
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
347 for (var k in classes) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
348 // Remove duplicates
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
349 new_classes[classes[k]] = classes[k];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
350 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
351
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
352 return new_classes;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
353 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
354
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
355 function createClassesString(item, options) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
356 var classes = item.classes || {};
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
357
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
358 if (typeof classes === 'string') {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
359 classes = [classes];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
360 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
361
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
362 var item_classes = filterClasses(classes);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
363 item_classes[options.itemClass] = options.itemClass;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
364
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
365 // create class string
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
366 return $.map(item_classes, function(val) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
367 return val;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
368 }).join(' ');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
369 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
370
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
371 function createDataAttrs(attr) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
372 attr = $.extend({}, attr);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
373
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
374 delete attr.children;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
375 delete attr.classes;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
376 delete attr.content;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
377
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
378 var data_attrs = {};
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
379
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
380 $.each(attr, function(key, value) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
381 if (typeof value === 'object') {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
382 value = JSON.stringify(value);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
383 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
384
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
385 data_attrs["data-" + key] = escapeHtml(value);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
386 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
387
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
388 return data_attrs;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
389 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
390
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
391 var item_attrs = createDataAttrs(item);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
392 item_attrs["class"] = createClassesString(item, options);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
393
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
394 var content = options.contentCallback(item);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
395 var children = this._buildList(item.children, options);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
396 var html = $(options.itemRenderer(item_attrs, content, children, options, item));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
397
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
398 this.setParent(html);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
399
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
400 return html[0].outerHTML;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
401 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
402
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
403 serialize: function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
404 var data, list = this, step = function(level) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
405 var array = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
406 items = level.children(list.options.itemNodeName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
407 items.each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
408 var li = $(this),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
409 item = $.extend({}, li.data()),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
410 sub = li.children(list.options.listNodeName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
411
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
412 if (list.options.includeContent) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
413 var content = li.find('.' + list.options.contentClass).html();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
414
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
415 if (content) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
416 item.content = content;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
417 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
418 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
419
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
420 if (sub.length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
421 item.children = step(sub);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
422 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
423 array.push(item);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
424 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
425 return array;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
426 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
427 data = step(list.el.find(list.options.listNodeName).first());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
428 return data;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
429 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
430
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
431 asNestedSet: function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
432 var list = this, o = list.options, depth = -1, ret = [], lft = 1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
433 var items = list.el.find(o.listNodeName).first().children(o.itemNodeName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
434
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
435 items.each(function () {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
436 lft = traverse(this, depth + 1, lft);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
437 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
438
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
439 ret = ret.sort(function(a,b){ return (a.lft - b.lft); });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
440 return ret;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
441
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
442 function traverse(item, depth, lft) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
443 var rgt = lft + 1, id, pid;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
444
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
445 if ($(item).children(o.listNodeName).children(o.itemNodeName).length > 0 ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
446 depth++;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
447 $(item).children(o.listNodeName).children(o.itemNodeName).each(function () {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
448 rgt = traverse($(this), depth, rgt);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
449 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
450 depth--;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
451 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
452
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
453 id = $(item).attr('data-id');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
454 pid = $(item).parent(o.listNodeName).parent(o.itemNodeName).attr('data-id') || '';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
455
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
456 if ($.isNumeric(id)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
457 id = parseInt(id);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
458 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
459
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
460 if ($.isNumeric(pid)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
461 pid = parseInt(pid);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
462 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
463
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
464 if (id) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
465 ret.push({"id": id, "parent_id": pid, "depth": depth, "lft": lft, "rgt": rgt});
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
466 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
467
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
468 lft = rgt + 1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
469 return lft;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
470 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
471 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
472
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
473 returnOptions: function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
474 return this.options;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
475 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
476
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
477 serialise: function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
478 return this.serialize();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
479 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
480
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
481 toHierarchy: function(options) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
482
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
483 var o = $.extend({}, this.options, options),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
484 ret = [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
485
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
486 $(this.element).children(o.items).each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
487 var level = _recursiveItems(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
488 ret.push(level);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
489 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
490
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
491 return ret;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
492
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
493 function _recursiveItems(item) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
494 var id = ($(item).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
495 if (id) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
496 var currentItem = {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
497 "id": id[2]
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
498 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
499 if ($(item).children(o.listType).children(o.items).length > 0) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
500 currentItem.children = [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
501 $(item).children(o.listType).children(o.items).each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
502 var level = _recursiveItems(this);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
503 currentItem.children.push(level);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
504 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
505 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
506 return currentItem;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
507 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
508 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
509 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
510
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
511 toArray: function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
512
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
513 var o = $.extend({}, this.options, this),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
514 sDepth = o.startDepthCount || 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
515 ret = [],
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
516 left = 2,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
517 list = this,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
518 element = list.el.find(list.options.listNodeName).first();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
519
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
520 var items = element.children(list.options.itemNodeName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
521 items.each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
522 left = _recursiveArray($(this), sDepth + 1, left);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
523 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
524
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
525 ret = ret.sort(function(a, b) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
526 return (a.left - b.left);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
527 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
528
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
529 return ret;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
530
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
531 function _recursiveArray(item, depth, left) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
532
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
533 var right = left + 1,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
534 id,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
535 pid;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
536
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
537 if (item.children(o.options.listNodeName).children(o.options.itemNodeName).length > 0) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
538 depth++;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
539 item.children(o.options.listNodeName).children(o.options.itemNodeName).each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
540 right = _recursiveArray($(this), depth, right);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
541 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
542 depth--;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
543 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
544
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
545 id = item.data().id;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
546
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
547
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
548 if (depth === sDepth + 1) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
549 pid = o.rootID;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
550 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
551
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
552 var parentItem = (item.parent(o.options.listNodeName)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
553 .parent(o.options.itemNodeName)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
554 .data());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
555 pid = parentItem.id;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
556
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
557 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
558
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
559 if (id) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
560 ret.push({
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
561 "id": id,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
562 "parent_id": pid,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
563 "depth": depth,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
564 "left": left,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
565 "right": right
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
566 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
567 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
568
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
569 left = right + 1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
570 return left;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
571 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
572
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
573 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
574
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
575 reset: function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
576 this.mouse = {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
577 offsetX: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
578 offsetY: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
579 startX: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
580 startY: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
581 lastX: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
582 lastY: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
583 nowX: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
584 nowY: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
585 distX: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
586 distY: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
587 dirAx: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
588 dirX: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
589 dirY: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
590 lastDirX: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
591 lastDirY: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
592 distAxX: 0,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
593 distAxY: 0
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
594 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
595 this.isTouch = false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
596 this.moving = false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
597 this.dragEl = null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
598 this.dragRootEl = null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
599 this.dragDepth = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
600 this.hasNewRoot = false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
601 this.pointEl = null;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
602 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
603
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
604 expandItem: function(li) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
605 li.removeClass(this.options.collapsedClass);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
606 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
607
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
608 collapseItem: function(li) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
609 var lists = li.children(this.options.listNodeName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
610 if (lists.length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
611 li.addClass(this.options.collapsedClass);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
612 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
613 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
614
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
615 expandAll: function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
616 var list = this;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
617 list.el.find(list.options.itemNodeName).each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
618 list.expandItem($(this));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
619 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
620 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
621
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
622 collapseAll: function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
623 var list = this;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
624 list.el.find(list.options.itemNodeName).each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
625 list.collapseItem($(this));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
626 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
627 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
628
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
629 setParent: function(li) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
630 //Check if li is an element of itemNodeName type and has children
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
631 if (li.is(this.options.itemNodeName) && li.children(this.options.listNodeName).length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
632 // make sure NOT showing two or more sets data-action buttons
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
633 li.children('[data-action]').remove();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
634 li.prepend($(this.options.expandBtnHTML));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
635 li.prepend($(this.options.collapseBtnHTML));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
636 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
637 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
638
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
639 unsetParent: function(li) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
640 li.removeClass(this.options.collapsedClass);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
641 li.children('[data-action]').remove();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
642 li.children(this.options.listNodeName).remove();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
643 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
644
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
645 dragStart: function(e) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
646 var mouse = this.mouse,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
647 target = $(e.target),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
648 dragItem = target.closest(this.options.itemNodeName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
649
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
650 var position = {};
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
651 position.top = e.pageY;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
652 position.left = e.pageX;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
653
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
654 var continueExecution = this.options.onDragStart.call(this, this.el, dragItem, position);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
655
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
656 if (typeof continueExecution !== 'undefined' && continueExecution === false) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
657 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
658 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
659
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
660 this.placeEl.css('height', dragItem.height());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
661
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
662 mouse.offsetX = e.pageX - dragItem.offset().left;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
663 mouse.offsetY = e.pageY - dragItem.offset().top;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
664 mouse.startX = mouse.lastX = e.pageX;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
665 mouse.startY = mouse.lastY = e.pageY;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
666
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
667 this.dragRootEl = this.el;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
668 this.dragEl = $(document.createElement(this.options.listNodeName)).addClass(this.options.listClass + ' ' + this.options.dragClass);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
669 this.dragEl.css('width', dragItem.outerWidth());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
670
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
671 this.setIndexOfItem(dragItem);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
672
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
673 // fix for zepto.js
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
674 //dragItem.after(this.placeEl).detach().appendTo(this.dragEl);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
675 dragItem.after(this.placeEl);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
676 dragItem[0].parentNode.removeChild(dragItem[0]);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
677 dragItem.appendTo(this.dragEl);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
678
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
679 $(document.body).append(this.dragEl);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
680 this.dragEl.css({
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
681 'left': e.pageX - mouse.offsetX,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
682 'top': e.pageY - mouse.offsetY
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
683 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
684 // total depth of dragging item
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
685 var i, depth,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
686 items = this.dragEl.find(this.options.itemNodeName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
687 for (i = 0; i < items.length; i++) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
688 depth = $(items[i]).parents(this.options.listNodeName).length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
689 if (depth > this.dragDepth) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
690 this.dragDepth = depth;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
691 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
692 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
693 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
694
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
695 //Create sublevel.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
696 // element : element which become parent
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
697 // item : something to place into new sublevel
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
698 createSubLevel: function(element, item) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
699 var list = $('<' + this.options.listNodeName + '/>').addClass(this.options.listClass);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
700 if (item) list.append(item);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
701 element.append(list);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
702 this.setParent(element);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
703 return list;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
704 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
705
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
706 setIndexOfItem: function(item, index) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
707 index = index || [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
708
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
709 index.unshift(item.index());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
710
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
711 if ($(item[0].parentNode)[0] !== this.dragRootEl[0]) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
712 this.setIndexOfItem($(item[0].parentNode), index);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
713 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
714 else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
715 this.dragEl.data('indexOfItem', index);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
716 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
717 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
718
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
719 restoreItemAtIndex: function(dragElement, indexArray) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
720 var currentEl = this.el,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
721 lastIndex = indexArray.length - 1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
722
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
723 //Put drag element at current element position.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
724 function placeElement(currentEl, dragElement) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
725 if (indexArray[lastIndex] === 0) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
726 $(currentEl).prepend(dragElement.clone());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
727 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
728 $(currentEl.children[indexArray[lastIndex] - 1]).after(dragElement.clone());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
729 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
730 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
731 //Diggin through indexArray to get home for dragElement.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
732 for (var i = 0; i < indexArray.length; i++) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
733 if (lastIndex === parseInt(i)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
734 placeElement(currentEl, dragElement);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
735 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
736 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
737 //element can have no indexes, so we have to use conditional here to avoid errors.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
738 //if element doesn't exist we defenetly need to add new list.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
739 var element = (currentEl[0]) ? currentEl[0] : currentEl;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
740 var nextEl = element.children[indexArray[i]];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
741 currentEl = (!nextEl) ? this.createSubLevel($(element)) : nextEl;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
742 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
743 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
744
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
745 dragStop: function(e) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
746 // fix for zepto.js
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
747 //this.placeEl.replaceWith(this.dragEl.children(this.options.itemNodeName + ':first').detach());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
748 var position = {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
749 top : e.pageY,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
750 left : e.pageX
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
751 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
752 //Get indexArray of item at drag start.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
753 var srcIndex = this.dragEl.data('indexOfItem');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
754
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
755 var el = this.dragEl.children(this.options.itemNodeName).first();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
756
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
757 el[0].parentNode.removeChild(el[0]);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
758
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
759 this.dragEl.remove(); //Remove dragEl, cause it can affect on indexing in html collection.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
760
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
761 //Before drag stop callback
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
762 var continueExecution = this.options.beforeDragStop.call(this, this.el, el, this.placeEl.parent());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
763 if (typeof continueExecution !== 'undefined' && continueExecution === false) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
764 var parent = this.placeEl.parent();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
765 this.placeEl.remove();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
766 if (!parent.children().length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
767 this.unsetParent(parent.parent());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
768 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
769 this.restoreItemAtIndex(el, srcIndex);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
770 this.reset();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
771 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
772 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
773
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
774 this.placeEl.replaceWith(el);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
775
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
776 if (this.hasNewRoot) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
777 if (this.options.fixed === true) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
778 this.restoreItemAtIndex(el, srcIndex);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
779 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
780 else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
781 this.el.trigger('lostItem');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
782 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
783 this.dragRootEl.trigger('gainedItem');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
784 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
785 else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
786 this.dragRootEl.trigger('change');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
787 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
788
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
789 this.options.callback.call(this, this.dragRootEl, el, position);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
790
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
791 this.reset();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
792 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
793
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
794 dragMove: function(e) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
795 var list, parent, prev, next, depth,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
796 opt = this.options,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
797 mouse = this.mouse;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
798
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
799 this.dragEl.css({
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
800 'left': e.pageX - mouse.offsetX,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
801 'top': e.pageY - mouse.offsetY
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
802 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
803
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
804 // mouse position last events
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
805 mouse.lastX = mouse.nowX;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
806 mouse.lastY = mouse.nowY;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
807 // mouse position this events
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
808 mouse.nowX = e.pageX;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
809 mouse.nowY = e.pageY;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
810 // distance mouse moved between events
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
811 mouse.distX = mouse.nowX - mouse.lastX;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
812 mouse.distY = mouse.nowY - mouse.lastY;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
813 // direction mouse was moving
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
814 mouse.lastDirX = mouse.dirX;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
815 mouse.lastDirY = mouse.dirY;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
816 // direction mouse is now moving (on both axis)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
817 mouse.dirX = mouse.distX === 0 ? 0 : mouse.distX > 0 ? 1 : -1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
818 mouse.dirY = mouse.distY === 0 ? 0 : mouse.distY > 0 ? 1 : -1;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
819 // axis mouse is now moving on
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
820 var newAx = Math.abs(mouse.distX) > Math.abs(mouse.distY) ? 1 : 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
821
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
822 // do nothing on first move
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
823 if (!mouse.moving) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
824 mouse.dirAx = newAx;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
825 mouse.moving = true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
826 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
827 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
828
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
829 // do scrolling if enable
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
830 if (opt.scroll) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
831 if (typeof window.jQuery.fn.scrollParent !== 'undefined') {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
832 var scrolled = false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
833 var scrollParent = this.el.scrollParent()[0];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
834 if (scrollParent !== document && scrollParent.tagName !== 'HTML') {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
835 if ((opt.scrollTriggers.bottom + scrollParent.offsetHeight) - e.pageY < opt.scrollSensitivity)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
836 scrollParent.scrollTop = scrolled = scrollParent.scrollTop + opt.scrollSpeed;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
837 else if (e.pageY - opt.scrollTriggers.top < opt.scrollSensitivity)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
838 scrollParent.scrollTop = scrolled = scrollParent.scrollTop - opt.scrollSpeed;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
839
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
840 if ((opt.scrollTriggers.right + scrollParent.offsetWidth) - e.pageX < opt.scrollSensitivity)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
841 scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + opt.scrollSpeed;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
842 else if (e.pageX - opt.scrollTriggers.left < opt.scrollSensitivity)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
843 scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - opt.scrollSpeed;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
844 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
845 if (e.pageY - $(document).scrollTop() < opt.scrollSensitivity)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
846 scrolled = $(document).scrollTop($(document).scrollTop() - opt.scrollSpeed);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
847 else if ($(window).height() - (e.pageY - $(document).scrollTop()) < opt.scrollSensitivity)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
848 scrolled = $(document).scrollTop($(document).scrollTop() + opt.scrollSpeed);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
849
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
850 if (e.pageX - $(document).scrollLeft() < opt.scrollSensitivity)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
851 scrolled = $(document).scrollLeft($(document).scrollLeft() - opt.scrollSpeed);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
852 else if ($(window).width() - (e.pageX - $(document).scrollLeft()) < opt.scrollSensitivity)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
853 scrolled = $(document).scrollLeft($(document).scrollLeft() + opt.scrollSpeed);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
854 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
855 } else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
856 console.warn('To use scrolling you need to have scrollParent() function, check documentation for more information');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
857 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
858 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
859
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
860 if (this.scrollTimer) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
861 clearTimeout(this.scrollTimer);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
862 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
863
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
864 if (opt.scroll && scrolled) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
865 this.scrollTimer = setTimeout(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
866 $(window).trigger(e);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
867 }, 10);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
868 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
869
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
870 // calc distance moved on this axis (and direction)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
871 if (mouse.dirAx !== newAx) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
872 mouse.distAxX = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
873 mouse.distAxY = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
874 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
875 else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
876 mouse.distAxX += Math.abs(mouse.distX);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
877 if (mouse.dirX !== 0 && mouse.dirX !== mouse.lastDirX) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
878 mouse.distAxX = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
879 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
880 mouse.distAxY += Math.abs(mouse.distY);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
881 if (mouse.dirY !== 0 && mouse.dirY !== mouse.lastDirY) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
882 mouse.distAxY = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
883 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
884 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
885 mouse.dirAx = newAx;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
886
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
887 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
888 * move horizontal
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
889 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
890 if (mouse.dirAx && mouse.distAxX >= opt.threshold) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
891 // reset move distance on x-axis for new phase
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
892 mouse.distAxX = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
893 prev = this.placeEl.prev(opt.itemNodeName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
894 // increase horizontal level if previous sibling exists, is not collapsed, and can have children
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
895 if (mouse.distX > 0 && prev.length && !prev.hasClass(opt.collapsedClass) && !prev.hasClass(opt.noChildrenClass)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
896 // cannot increase level when item above is collapsed
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
897 list = prev.find(opt.listNodeName).last();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
898 // check if depth limit has reached
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
899 depth = this.placeEl.parents(opt.listNodeName).length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
900 if (depth + this.dragDepth <= opt.maxDepth) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
901 // create new sub-level if one doesn't exist
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
902 if (!list.length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
903 this.createSubLevel(prev, this.placeEl);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
904 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
905 else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
906 // else append to next level up
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
907 list = prev.children(opt.listNodeName).last();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
908 list.append(this.placeEl);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
909 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
910 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
911 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
912 // decrease horizontal level
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
913 if (mouse.distX < 0) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
914 // we can't decrease a level if an item preceeds the current one
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
915 next = this.placeEl.next(opt.itemNodeName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
916 if (!next.length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
917 parent = this.placeEl.parent();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
918 this.placeEl.closest(opt.itemNodeName).after(this.placeEl);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
919 if (!parent.children().length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
920 this.unsetParent(parent.parent());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
921 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
922 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
923 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
924 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
925
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
926 var isEmpty = false;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
927
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
928 // find list item under cursor
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
929 if (!hasPointerEvents) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
930 this.dragEl[0].style.visibility = 'hidden';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
931 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
932 this.pointEl = $(document.elementFromPoint(e.pageX - document.body.scrollLeft, e.pageY - (window.pageYOffset || document.documentElement.scrollTop)));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
933 if (!hasPointerEvents) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
934 this.dragEl[0].style.visibility = 'visible';
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
935 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
936 if (this.pointEl.hasClass(opt.handleClass)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
937 this.pointEl = this.pointEl.closest(opt.itemNodeName);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
938 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
939 if (this.pointEl.hasClass(opt.emptyClass)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
940 isEmpty = true;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
941 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
942 else if (!this.pointEl.length || !this.pointEl.hasClass(opt.itemClass)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
943 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
944 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
945
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
946 // find parent list of item under cursor
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
947 var pointElRoot = this.pointEl.closest('.' + opt.rootClass),
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
948 isNewRoot = this.dragRootEl.data('nestable-id') !== pointElRoot.data('nestable-id');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
949
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
950 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
951 * move vertical
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
952 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
953 if (!mouse.dirAx || isNewRoot || isEmpty) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
954 // check if groups match if dragging over new root
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
955 if (isNewRoot && opt.group !== pointElRoot.data('nestable-group')) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
956 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
957 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
958
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
959 // fixed item's depth, use for some list has specific type, eg:'Volume, Section, Chapter ...'
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
960 if (this.options.fixedDepth && this.dragDepth + 1 !== this.pointEl.parents(opt.listNodeName).length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
961 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
962 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
963
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
964 // check depth limit
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
965 depth = this.dragDepth - 1 + this.pointEl.parents(opt.listNodeName).length;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
966 if (depth > opt.maxDepth) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
967 return;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
968 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
969 var before = e.pageY < (this.pointEl.offset().top + this.pointEl.height() / 2);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
970 parent = this.placeEl.parent();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
971 // if empty create new list to replace empty placeholder
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
972 if (isEmpty) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
973 list = $(document.createElement(opt.listNodeName)).addClass(opt.listClass);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
974 list.append(this.placeEl);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
975 this.pointEl.replaceWith(list);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
976 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
977 else if (before) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
978 this.pointEl.before(this.placeEl);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
979 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
980 else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
981 this.pointEl.after(this.placeEl);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
982 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
983 if (!parent.children().length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
984 this.unsetParent(parent.parent());
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
985 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
986 if (!this.dragRootEl.find(opt.itemNodeName).length) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
987 this.appendEmptyElement(this.dragRootEl);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
988 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
989 // parent root list has changed
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
990 this.dragRootEl = pointElRoot;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
991 if (isNewRoot) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
992 this.hasNewRoot = this.el[0] !== this.dragRootEl[0];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
993 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
994 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
995 },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
996 // Append the .dd-empty div to the list so it can be populated and styled
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
997 appendEmptyElement: function(element) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
998 element.append('<div class="' + this.options.emptyClass + '"/>');
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
999 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1000 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1001
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1002 $.fn.nestable = function(params) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1003 var lists = this,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1004 retval = this,
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1005 args = arguments;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1006
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1007 if (!('Nestable' in window)) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1008 window.Nestable = {};
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1009 Nestable.counter = 0;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1010 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1011
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1012 lists.each(function() {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1013 var plugin = $(this).data("nestable");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1014
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1015 if (!plugin) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1016 Nestable.counter++;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1017 $(this).data("nestable", new Plugin(this, params));
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1018 $(this).data("nestable-id", Nestable.counter);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1019 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1020 else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1021 if (typeof params === 'string' && typeof plugin[params] === 'function') {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1022 if (args.length > 1){
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1023 var pluginArgs = [];
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1024 for (var i = 1; i < args.length; i++) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1025 pluginArgs.push(args[i]);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1026 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1027 retval = plugin[params].apply(plugin, pluginArgs);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1028 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1029 else {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1030 retval = plugin[params]();
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1031 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1032 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1033 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1034 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1035
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1036 return retval || lists;
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1037 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1038
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1039 })(window.jQuery || window.Zepto, window, document);