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