rails_admin_nested_set 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b422147f5d8ab7f72b9ed776d80b3bbadd735e43
4
- data.tar.gz: 10de4e2b36f5845cab5977bbf83212bdff4852f7
3
+ metadata.gz: 07d822653283fdabcf97010737971642d53ce49c
4
+ data.tar.gz: 500b6d9fbbdc6ab8aa2e42dd9d13dcb834ebf242
5
5
  SHA512:
6
- metadata.gz: ac2352c5aef1f10f25b360af6140c6d51b0dd68bd2c3912ccddd260dc522bf43db8b0e4572e74e95593336b14bdf65438242ab7f1a2865a162712205d5b432d3
7
- data.tar.gz: 1d50c1e5bdce39897ca75e98e57cab58a021deaaeba05f803acbe227a9112dc7540934d2eb6ddd0c6c67eeb44cda22ee07f6697ba47d4db80b237c882b2b41d8
6
+ metadata.gz: 24579546b8cfcba8824ce14337c42258c70c7698b8dd6bc333fed11463c8a3ff46720b4dc5ce48badcc6dfeb1d667e3db52e00922d39d8042e7ea3256776d77f
7
+ data.tar.gz: 8dc13f099cfc1425ec7dd6fbe89fdc294ea020098b1dbdf64e571435a45b3b0b9a4bd4b3450e98fcf2be2972fee62c2a9b8e338b4ecfe3243cd96d6aa999e9f2
data/.gitignore CHANGED
File without changes
data/Gemfile CHANGED
File without changes
data/README.md CHANGED
File without changes
@@ -1,161 +1,276 @@
1
1
  /*
2
2
  * jQuery UI Nested Sortable
3
- * v 1.3.5 / 21 jun 2012
4
- * http://mjsarfatti.com/code/nestedSortable
3
+ * v 2.0 / 29 oct 2012
4
+ * http://mjsarfatti.com/sandbox/nestedSortable
5
5
  *
6
6
  * Depends on:
7
- * jquery.ui.sortable.js 1.8+
7
+ * jquery.ui.sortable.js 1.10+
8
8
  *
9
- * Copyright (c) 2010-2012 Manuele J Sarfatti
9
+ * Copyright (c) 2010-2013 Manuele J Sarfatti
10
10
  * Licensed under the MIT License
11
11
  * http://www.opensource.org/licenses/mit-license.php
12
12
  */
13
13
 
14
14
  (function($) {
15
15
 
16
- $.widget("mjs.nestedSortable", $.extend({}, $.ui.sortable.prototype, {
16
+ function isOverAxis( x, reference, size ) {
17
+ return ( x > reference ) && ( x < ( reference + size ) );
18
+ }
19
+
20
+ $.widget("mjs.nestedSortable", $.extend({}, $.ui.sortable.prototype, {
21
+
22
+ options: {
23
+ doNotClear: false,
24
+ expandOnHover: 700,
25
+ isAllowed: function(placeholder, placeholderParent, originalItem) { return true; },
26
+ isTree: false,
27
+ listType: 'ol',
28
+ maxLevels: 0,
29
+ protectRoot: false,
30
+ rootID: null,
31
+ rtl: false,
32
+ startCollapsed: false,
33
+ tabSize: 20,
34
+
35
+ branchClass: 'mjs-nestedSortable-branch',
36
+ collapsedClass: 'mjs-nestedSortable-collapsed',
37
+ disableNestingClass: 'mjs-nestedSortable-no-nesting',
38
+ errorClass: 'mjs-nestedSortable-error',
39
+ expandedClass: 'mjs-nestedSortable-expanded',
40
+ hoveringClass: 'mjs-nestedSortable-hovering',
41
+ leafClass: 'mjs-nestedSortable-leaf'
42
+ },
43
+
44
+ _create: function() {
45
+ this.element.data('ui-sortable', this.element.data('mjs-nestedSortable'));
46
+
47
+ // mjs - prevent browser from freezing if the HTML is not correct
48
+ if (!this.element.is(this.options.listType))
49
+ throw new Error('nestedSortable: Please check that the listType option is set to your actual list type');
50
+
51
+ // mjs - force 'intersect' tolerance method if we have a tree with expanding/collapsing functionality
52
+ if (this.options.isTree && this.options.expandOnHover) {
53
+ this.options.tolerance = 'intersect';
54
+ }
17
55
 
18
- options: {
19
- tabSize: 20,
20
- disableNesting: 'mjs-nestedSortable-no-nesting',
21
- errorClass: 'mjs-nestedSortable-error',
22
- doNotClear: false,
23
- listType: 'ol',
24
- maxLevels: 0,
25
- protectRoot: false,
26
- rootID: null,
27
- rtl: false,
28
- isAllowed: function(item, parent) { return true; }
29
- },
56
+ $.ui.sortable.prototype._create.apply(this, arguments);
57
+
58
+ // mjs - prepare the tree by applying the right classes (the CSS is responsible for actual hide/show functionality)
59
+ if (this.options.isTree) {
60
+ var self = this;
61
+ $(this.items).each(function() {
62
+ var $li = this.item;
63
+ if ($li.children(self.options.listType).length) {
64
+ $li.addClass(self.options.branchClass);
65
+ // expand/collapse class only if they have children
66
+ if (self.options.startCollapsed) $li.addClass(self.options.collapsedClass);
67
+ else $li.addClass(self.options.expandedClass);
68
+ } else {
69
+ $li.addClass(self.options.leafClass);
70
+ }
71
+ })
72
+ }
73
+ },
74
+
75
+ _destroy: function() {
76
+ this.element
77
+ .removeData("mjs-nestedSortable")
78
+ .removeData("ui-sortable");
79
+ return $.ui.sortable.prototype._destroy.apply(this, arguments);
80
+ },
81
+
82
+ _mouseDrag: function(event) {
83
+ var i, item, itemElement, intersection,
84
+ o = this.options,
85
+ scrolled = false;
86
+
87
+ //Compute the helpers position
88
+ this.position = this._generatePosition(event);
89
+ this.positionAbs = this._convertPositionTo("absolute");
90
+
91
+ if (!this.lastPositionAbs) {
92
+ this.lastPositionAbs = this.positionAbs;
93
+ }
30
94
 
31
- _create: function() {
32
- this.element.data('sortable', this.element.data('nestedSortable'));
95
+ //Do scrolling
96
+ if(this.options.scroll) {
97
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
33
98
 
34
- if (!this.element.is(this.options.listType))
35
- throw new Error('nestedSortable: Please check the listType option is set to your actual list type');
99
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
100
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
101
+ } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
102
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
103
+ }
36
104
 
37
- return $.ui.sortable.prototype._create.apply(this, arguments);
38
- },
105
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
106
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
107
+ } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
108
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
109
+ }
39
110
 
40
- destroy: function() {
41
- this.element
42
- .removeData("nestedSortable")
43
- .unbind(".nestedSortable");
44
- return $.ui.sortable.prototype.destroy.apply(this, arguments);
45
- },
111
+ } else {
46
112
 
47
- _mouseDrag: function(event) {
113
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
114
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
115
+ } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
116
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
117
+ }
48
118
 
49
- //Compute the helpers position
50
- this.position = this._generatePosition(event);
51
- this.positionAbs = this._convertPositionTo("absolute");
119
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
120
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
121
+ } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
122
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
123
+ }
52
124
 
53
- if (!this.lastPositionAbs) {
54
- this.lastPositionAbs = this.positionAbs;
55
- }
125
+ }
56
126
 
57
- var o = this.options;
127
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
128
+ $.ui.ddmanager.prepareOffsets(this, event);
129
+ }
58
130
 
59
- //Do scrolling
60
- if(this.options.scroll) {
61
- var scrolled = false;
62
- if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
131
+ //Regenerate the absolute position used for position checks
132
+ this.positionAbs = this._convertPositionTo("absolute");
63
133
 
64
- if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
65
- this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
66
- else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
67
- this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
134
+ // mjs - find the top offset before rearrangement,
135
+ var previousTopOffset = this.placeholder.offset().top;
68
136
 
69
- if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
70
- this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
71
- else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
72
- this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
137
+ //Set the helper position
138
+ if(!this.options.axis || this.options.axis !== "y") {
139
+ this.helper[0].style.left = this.position.left+"px";
140
+ }
141
+ if(!this.options.axis || this.options.axis !== "x") {
142
+ this.helper[0].style.top = this.position.top+"px";
143
+ }
73
144
 
74
- } else {
145
+ // mjs - check and reset hovering state at each cycle
146
+ this.hovering = this.hovering ? this.hovering : null;
147
+ this.mouseentered = this.mouseentered ? this.mouseentered : false;
148
+
149
+ // mjs - let's start caching some variables
150
+ var parentItem = (this.placeholder[0].parentNode.parentNode &&
151
+ $(this.placeholder[0].parentNode.parentNode).closest('.ui-sortable').length)
152
+ ? $(this.placeholder[0].parentNode.parentNode)
153
+ : null,
154
+ level = this._getLevel(this.placeholder),
155
+ childLevels = this._getChildLevels(this.helper);
156
+
157
+ var newList = document.createElement(o.listType);
158
+
159
+ //Rearrange
160
+ for (i = this.items.length - 1; i >= 0; i--) {
161
+
162
+ //Cache variables and intersection, continue if no intersection
163
+ item = this.items[i];
164
+ itemElement = item.item[0];
165
+ intersection = this._intersectsWithPointer(item);
166
+ if (!intersection) {
167
+ continue;
168
+ }
75
169
 
76
- if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
77
- scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
78
- else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
79
- scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
170
+ // Only put the placeholder inside the current Container, skip all
171
+ // items form other containers. This works because when moving
172
+ // an item from one container to another the
173
+ // currentContainer is switched before the placeholder is moved.
174
+ //
175
+ // Without this moving items in "sub-sortables" can cause the placeholder to jitter
176
+ // beetween the outer and inner container.
177
+ if (item.instance !== this.currentContainer) {
178
+ continue;
179
+ }
80
180
 
81
- if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
82
- scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
83
- else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
84
- scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
181
+ // cannot intersect with itself
182
+ // no useless actions that have been done before
183
+ // no action if the item moved is the parent of the item checked
184
+ if (itemElement !== this.currentItem[0] &&
185
+ this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
186
+ !$.contains(this.placeholder[0], itemElement) &&
187
+ (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
188
+ ) {
189
+
190
+ // mjs - we are intersecting an element: trigger the mouseenter event and store this state
191
+ if (!this.mouseentered) {
192
+ $(itemElement).mouseenter();
193
+ this.mouseentered = true;
194
+ }
85
195
 
86
- }
196
+ // mjs - if the element has children and they are hidden, show them after a delay (CSS responsible)
197
+ if (o.isTree && $(itemElement).hasClass(o.collapsedClass) && o.expandOnHover) {
198
+ if (!this.hovering) {
199
+ $(itemElement).addClass(o.hoveringClass);
200
+ var self = this;
201
+ this.hovering = window.setTimeout(function() {
202
+ $(itemElement).removeClass(o.collapsedClass).addClass(o.expandedClass);
203
+ self.refreshPositions();
204
+ self._trigger("expand", event, self._uiHash());
205
+ }, o.expandOnHover);
206
+ }
207
+ }
87
208
 
88
- if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
89
- $.ui.ddmanager.prepareOffsets(this, event);
90
- }
209
+ this.direction = intersection == 1 ? "down" : "up";
210
+
211
+ // mjs - rearrange the elements and reset timeouts and hovering state
212
+ if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
213
+ $(itemElement).mouseleave();
214
+ this.mouseentered = false;
215
+ $(itemElement).removeClass(o.hoveringClass);
216
+ this.hovering && window.clearTimeout(this.hovering);
217
+ this.hovering = null;
218
+
219
+ // mjs - do not switch container if it's a root item and 'protectRoot' is true
220
+ // or if it's not a root item but we are trying to make it root
221
+ if (o.protectRoot
222
+ && ! (this.currentItem[0].parentNode == this.element[0] // it's a root item
223
+ && itemElement.parentNode != this.element[0]) // it's intersecting a non-root item
224
+ ) {
225
+ if (this.currentItem[0].parentNode != this.element[0]
226
+ && itemElement.parentNode == this.element[0]
227
+ ) {
228
+
229
+ if ( ! $(itemElement).children(o.listType).length) {
230
+ itemElement.appendChild(newList);
231
+ o.isTree && $(itemElement).removeClass(o.leafClass).addClass(o.branchClass + ' ' + o.expandedClass);
232
+ }
233
+
234
+ var a = this.direction === "down" ? $(itemElement).prev().children(o.listType) : $(itemElement).children(o.listType);
235
+ if (a[0] !== undefined) {
236
+ this._rearrange(event, null, a);
237
+ }
238
+
239
+ } else {
240
+ this._rearrange(event, item);
241
+ }
242
+ } else if ( ! o.protectRoot) {
243
+ this._rearrange(event, item);
244
+ }
245
+ } else {
246
+ break;
247
+ }
91
248
 
92
- //Regenerate the absolute position used for position checks
93
- this.positionAbs = this._convertPositionTo("absolute");
249
+ // Clear emtpy ul's/ol's
250
+ this._clearEmpty(itemElement);
94
251
 
95
- // Find the top offset before rearrangement,
96
- var previousTopOffset = this.placeholder.offset().top;
252
+ this._trigger("change", event, this._uiHash());
253
+ break;
254
+ }
255
+ }
97
256
 
98
- //Set the helper position
99
- if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
100
- if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
101
-
102
- //Rearrange
103
- for (var i = this.items.length - 1; i >= 0; i--) {
104
-
105
- //Cache variables and intersection, continue if no intersection
106
- var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
107
- if (!intersection) continue;
108
-
109
- if(itemElement != this.currentItem[0] //cannot intersect with itself
110
- && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
111
- && !$.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
112
- && (this.options.type == 'semi-dynamic' ? !$.contains(this.element[0], itemElement) : true)
113
- //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
114
- ) {
115
-
116
- $(itemElement).mouseenter();
117
-
118
- this.direction = intersection == 1 ? "down" : "up";
119
-
120
- if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
121
- $(itemElement).mouseleave();
122
- this._rearrange(event, item);
123
- } else {
124
- break;
125
- }
126
-
127
- // Clear emtpy ul's/ol's
128
- this._clearEmpty(itemElement);
129
-
130
- this._trigger("change", event, this._uiHash());
131
- break;
132
- }
133
- }
134
-
135
- var parentItem = (this.placeholder[0].parentNode.parentNode &&
136
- $(this.placeholder[0].parentNode.parentNode).closest('.ui-sortable').length)
137
- ? $(this.placeholder[0].parentNode.parentNode)
138
- : null,
139
- level = this._getLevel(this.placeholder),
140
- childLevels = this._getChildLevels(this.helper);
141
-
142
- // To find the previous sibling in the list, keep backtracking until we hit a valid list item.
143
- var previousItem = this.placeholder[0].previousSibling ? $(this.placeholder[0].previousSibling) : null;
144
- if (previousItem != null) {
145
- while (previousItem[0].nodeName.toLowerCase() != 'li' || previousItem[0] == this.currentItem[0] || previousItem[0] == this.helper[0]) {
146
- if (previousItem[0].previousSibling) {
147
- previousItem = $(previousItem[0].previousSibling);
148
- } else {
149
- previousItem = null;
150
- break;
151
- }
152
- }
153
- }
154
-
155
- // To find the next sibling in the list, keep stepping forward until we hit a valid list item.
257
+ // mjs - to find the previous sibling in the list, keep backtracking until we hit a valid list item.
258
+ var previousItem = this.placeholder[0].previousSibling ? $(this.placeholder[0].previousSibling) : null;
259
+ if (previousItem != null) {
260
+ while (previousItem[0].nodeName.toLowerCase() != $(o.listType)[0].nodeName.toLowerCase() || previousItem[0] == this.currentItem[0] || previousItem[0] == this.helper[0]) {
261
+ if (previousItem[0].previousSibling) {
262
+ previousItem = $(previousItem[0].previousSibling);
263
+ } else {
264
+ previousItem = null;
265
+ break;
266
+ }
267
+ }
268
+ }
269
+
270
+ // mjs - to find the next sibling in the list, keep stepping forward until we hit a valid list item.
156
271
  var nextItem = this.placeholder[0].nextSibling ? $(this.placeholder[0].nextSibling) : null;
157
272
  if (nextItem != null) {
158
- while (nextItem[0].nodeName.toLowerCase() != 'li' || nextItem[0] == this.currentItem[0] || nextItem[0] == this.helper[0]) {
273
+ while (nextItem[0].nodeName.toLowerCase() != $(o.listType)[0].nodeName.toLowerCase() || nextItem[0] == this.currentItem[0] || nextItem[0] == this.helper[0]) {
159
274
  if (nextItem[0].nextSibling) {
160
275
  nextItem = $(nextItem[0].nextSibling);
161
276
  } else {
@@ -165,265 +280,334 @@
165
280
  }
166
281
  }
167
282
 
168
- var newList = document.createElement(o.listType);
169
-
170
- this.beyondMaxLevels = 0;
171
-
172
- // If the item is moved to the left, send it to its parent's level unless there are siblings below it.
173
- if (parentItem != null && nextItem == null &&
174
- (o.rtl && (this.positionAbs.left + this.helper.outerWidth() > parentItem.offset().left + parentItem.outerWidth()) ||
175
- !o.rtl && (this.positionAbs.left < parentItem.offset().left))) {
176
- parentItem.after(this.placeholder[0]);
177
- this._clearEmpty(parentItem[0]);
178
- this._trigger("change", event, this._uiHash());
179
- }
180
- // If the item is below a sibling and is moved to the right, make it a child of that sibling.
181
- else if (previousItem != null &&
182
- (o.rtl && (this.positionAbs.left + this.helper.outerWidth() < previousItem.offset().left + previousItem.outerWidth() - o.tabSize) ||
183
- !o.rtl && (this.positionAbs.left > previousItem.offset().left + o.tabSize))) {
184
- this._isAllowed(previousItem, level, level+childLevels+1);
185
- if (!previousItem.children(o.listType).length) {
186
- previousItem[0].appendChild(newList);
187
- }
188
- // If this item is being moved from the top, add it to the top of the list.
189
- if (previousTopOffset && (previousTopOffset <= previousItem.offset().top)) {
190
- previousItem.children(o.listType).prepend(this.placeholder);
283
+ this.beyondMaxLevels = 0;
284
+
285
+ // mjs - if the item is moved to the left, send it one level up but only if it's at the bottom of the list
286
+ if (parentItem != null
287
+ && nextItem == null
288
+ && ! (o.protectRoot && parentItem[0].parentNode == this.element[0])
289
+ &&
290
+ (o.rtl && (this.positionAbs.left + this.helper.outerWidth() > parentItem.offset().left + parentItem.outerWidth())
291
+ || ! o.rtl && (this.positionAbs.left < parentItem.offset().left))
292
+ ) {
293
+
294
+ parentItem.after(this.placeholder[0]);
295
+ if (o.isTree && parentItem.children(o.listItem).children(o.listItem + ':visible:not(.ui-sortable-helper)').length < 1) {
296
+ parentItem.removeClass(this.options.branchClass + ' ' + this.options.expandedClass)
297
+ .addClass(this.options.leafClass);
298
+ }
299
+ this._clearEmpty(parentItem[0]);
300
+ this._trigger("change", event, this._uiHash());
301
+ }
302
+ // mjs - if the item is below a sibling and is moved to the right, make it a child of that sibling
303
+ else if (previousItem != null
304
+ && ! previousItem.hasClass(o.disableNestingClass)
305
+ &&
306
+ (previousItem.children(o.listType).length && previousItem.children(o.listType).is(':visible')
307
+ || ! previousItem.children(o.listType).length)
308
+ && ! (o.protectRoot && this.currentItem[0].parentNode == this.element[0])
309
+ &&
310
+ (o.rtl && (this.positionAbs.left + this.helper.outerWidth() < previousItem.offset().left + previousItem.outerWidth() - o.tabSize)
311
+ || ! o.rtl && (this.positionAbs.left > previousItem.offset().left + o.tabSize))
312
+ ) {
313
+
314
+ this._isAllowed(previousItem, level, level+childLevels+1);
315
+
316
+ if (!previousItem.children(o.listType).length) {
317
+ previousItem[0].appendChild(newList);
318
+ o.isTree && previousItem.removeClass(o.leafClass).addClass(o.branchClass + ' ' + o.expandedClass);
319
+ }
320
+
321
+ // mjs - if this item is being moved from the top, add it to the top of the list.
322
+ if (previousTopOffset && (previousTopOffset <= previousItem.offset().top)) {
323
+ previousItem.children(o.listType).prepend(this.placeholder);
324
+ }
325
+ // mjs - otherwise, add it to the bottom of the list.
326
+ else if(previousItem.children(o.listType).length) {
327
+ previousItem.children(o.listType)[0].appendChild(this.placeholder[0]);
328
+ }
329
+
330
+ this._trigger("change", event, this._uiHash());
331
+ }
332
+ else {
333
+ this._isAllowed(parentItem, level, level+childLevels);
334
+ }
335
+
336
+ //Post events to containers
337
+ this._contactContainers(event);
338
+
339
+ //Interconnect with droppables
340
+ if($.ui.ddmanager) {
341
+ $.ui.ddmanager.drag(this, event);
342
+ }
343
+
344
+ //Call callbacks
345
+ this._trigger('sort', event, this._uiHash());
346
+
347
+ this.lastPositionAbs = this.positionAbs;
348
+ return false;
349
+
350
+ },
351
+
352
+ _mouseStop: function(event, noPropagation) {
353
+
354
+ // mjs - if the item is in a position not allowed, send it back
355
+ if (this.beyondMaxLevels) {
356
+
357
+ this.placeholder.removeClass(this.options.errorClass);
358
+
359
+ if (this.domPosition.prev) {
360
+ $(this.domPosition.prev).after(this.placeholder);
361
+ } else {
362
+ $(this.domPosition.parent).prepend(this.placeholder);
191
363
  }
192
- // Otherwise, add it to the bottom of the list.
193
- else {
194
- previousItem.children(o.listType)[0].appendChild(this.placeholder[0]);
364
+
365
+ this._trigger("revert", event, this._uiHash());
366
+
367
+ }
368
+
369
+
370
+ // mjs - clear the hovering timeout, just to be sure
371
+ $('.'+this.options.hoveringClass).mouseleave().removeClass(this.options.hoveringClass);
372
+ this.mouseentered = false;
373
+ this.hovering && window.clearTimeout(this.hovering);
374
+ this.hovering = null;
375
+
376
+ $.ui.sortable.prototype._mouseStop.apply(this, arguments);
377
+
378
+ },
379
+
380
+ // mjs - this function is slightly modified to make it easier to hover over a collapsed element and have it expand
381
+ _intersectsWithSides: function(item) {
382
+
383
+ var half = this.options.isTree ? .8 : .5;
384
+
385
+ var isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height*half), item.height),
386
+ isOverTopHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top - (item.height*half), item.height),
387
+ isOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
388
+ verticalDirection = this._getDragVerticalDirection(),
389
+ horizontalDirection = this._getDragHorizontalDirection();
390
+
391
+ if (this.floating && horizontalDirection) {
392
+ return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
393
+ } else {
394
+ return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && isOverTopHalf));
395
+ }
396
+
397
+ },
398
+
399
+ _contactContainers: function(event) {
400
+
401
+ if (this.options.protectRoot && this.currentItem[0].parentNode == this.element[0] ) {
402
+ return;
403
+ }
404
+
405
+ $.ui.sortable.prototype._contactContainers.apply(this, arguments);
406
+
407
+ },
408
+
409
+ _clear: function(event, noPropagation) {
410
+
411
+ $.ui.sortable.prototype._clear.apply(this, arguments);
412
+
413
+ // mjs - clean last empty ul/ol
414
+ for (var i = this.items.length - 1; i >= 0; i--) {
415
+ var item = this.items[i].item[0];
416
+ this._clearEmpty(item);
417
+ }
418
+
419
+ },
420
+
421
+ serialize: function(options) {
422
+
423
+ var o = $.extend({}, this.options, options),
424
+ items = this._getItemsAsjQuery(o && o.connected),
425
+ str = [];
426
+
427
+ $(items).each(function() {
428
+ var res = ($(o.item || this).attr(o.attribute || 'id') || '')
429
+ .match(o.expression || (/(.+)[-=_](.+)/)),
430
+ pid = ($(o.item || this).parent(o.listType)
431
+ .parent(o.items)
432
+ .attr(o.attribute || 'id') || '')
433
+ .match(o.expression || (/(.+)[-=_](.+)/));
434
+
435
+ if (res) {
436
+ str.push(((o.key || res[1]) + '[' + (o.key && o.expression ? res[1] : res[2]) + ']')
437
+ + '='
438
+ + (pid ? (o.key && o.expression ? pid[1] : pid[2]) : o.rootID));
195
439
  }
196
- this._trigger("change", event, this._uiHash());
197
- }
198
- else {
199
- this._isAllowed(parentItem, level, level+childLevels);
200
- }
440
+ });
441
+
442
+ if(!str.length && o.key) {
443
+ str.push(o.key + '=');
444
+ }
445
+
446
+ return str.join('&');
447
+
448
+ },
449
+
450
+ toHierarchy: function(options) {
201
451
 
202
- //Post events to containers
203
- this._contactContainers(event);
452
+ var o = $.extend({}, this.options, options),
453
+ sDepth = o.startDepthCount || 0,
454
+ ret = [];
455
+
456
+ $(this.element).children(o.items).each(function () {
457
+ var level = _recursiveItems(this);
458
+ ret.push(level);
459
+ });
460
+
461
+ return ret;
462
+
463
+ function _recursiveItems(item) {
464
+ var id = ($(item).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
465
+ if (id) {
466
+ var currentItem = {"id" : id[2]};
467
+ if ($(item).children(o.listType).children(o.items).length > 0) {
468
+ currentItem.children = [];
469
+ $(item).children(o.listType).children(o.items).each(function() {
470
+ var level = _recursiveItems(this);
471
+ currentItem.children.push(level);
472
+ });
473
+ }
474
+ return currentItem;
475
+ }
476
+ }
477
+ },
478
+
479
+ toArray: function(options) {
480
+
481
+ var o = $.extend({}, this.options, options),
482
+ sDepth = o.startDepthCount || 0,
483
+ ret = [],
484
+ left = 1;
485
+
486
+ if (!o.excludeRoot) {
487
+ ret.push({
488
+ "item_id": o.rootID,
489
+ "parent_id": null,
490
+ "depth": sDepth,
491
+ "left": left,
492
+ "right": ($(o.items, this.element).length + 1) * 2
493
+ });
494
+ left++
495
+ }
204
496
 
205
- //Interconnect with droppables
206
- if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
497
+ $(this.element).children(o.items).each(function () {
498
+ left = _recursiveArray(this, sDepth + 1, left);
499
+ });
207
500
 
208
- //Call callbacks
209
- this._trigger('sort', event, this._uiHash());
501
+ ret = ret.sort(function(a,b){ return (a.left - b.left); });
210
502
 
211
- this.lastPositionAbs = this.positionAbs;
212
- return false;
503
+ return ret;
213
504
 
214
- },
505
+ function _recursiveArray(item, depth, left) {
215
506
 
216
- _mouseStop: function(event, noPropagation) {
507
+ var right = left + 1,
508
+ id,
509
+ pid;
217
510
 
218
- // If the item is in a position not allowed, send it back
219
- if (this.beyondMaxLevels) {
511
+ if ($(item).children(o.listType).children(o.items).length > 0) {
512
+ depth ++;
513
+ $(item).children(o.listType).children(o.items).each(function () {
514
+ right = _recursiveArray($(this), depth, right);
515
+ });
516
+ depth --;
517
+ }
220
518
 
221
- this.placeholder.removeClass(this.options.errorClass);
519
+ id = ($(item).attr(o.attribute || 'id')).match(o.expression || (/(.+)[-=_](.+)/));
222
520
 
223
- if (this.domPosition.prev) {
224
- $(this.domPosition.prev).after(this.placeholder);
225
- } else {
226
- $(this.domPosition.parent).prepend(this.placeholder);
227
- }
521
+ if (depth === sDepth + 1) {
522
+ pid = o.rootID;
523
+ } else {
524
+ var parentItem = ($(item).parent(o.listType)
525
+ .parent(o.items)
526
+ .attr(o.attribute || 'id'))
527
+ .match(o.expression || (/(.+)[-=_](.+)/));
528
+ pid = parentItem[2];
529
+ }
228
530
 
229
- this._trigger("revert", event, this._uiHash());
531
+ if (id) {
532
+ ret.push({"item_id": id[2], "parent_id": pid, "depth": depth, "left": left, "right": right});
533
+ }
230
534
 
231
- }
535
+ left = right + 1;
536
+ return left;
537
+ }
232
538
 
233
- // Clean last empty ul/ol
234
- for (var i = this.items.length - 1; i >= 0; i--) {
235
- var item = this.items[i].item[0];
236
- this._clearEmpty(item);
237
- }
539
+ },
238
540
 
239
- $.ui.sortable.prototype._mouseStop.apply(this, arguments);
541
+ _clearEmpty: function(item) {
542
+ var o = this.options;
240
543
 
241
- },
544
+ var emptyList = $(item).children(o.listType);
242
545
 
243
- serialize: function(options) {
546
+ if (emptyList.length && !emptyList.children().length && !o.doNotClear) {
547
+ o.isTree && $(item).removeClass(o.branchClass + ' ' + o.expandedClass).addClass(o.leafClass);
548
+ emptyList.remove();
549
+ } else if (o.isTree && emptyList.length && emptyList.children().length && emptyList.is(':visible')) {
550
+ $(item).removeClass(o.leafClass).addClass(o.branchClass + ' ' + o.expandedClass);
551
+ } else if (o.isTree && emptyList.length && emptyList.children().length && !emptyList.is(':visible')) {
552
+ $(item).removeClass(o.leafClass).addClass(o.branchClass + ' ' + o.collapsedClass);
553
+ }
244
554
 
245
- var o = $.extend({}, this.options, options),
246
- items = this._getItemsAsjQuery(o && o.connected),
247
- str = [];
248
-
249
- $(items).each(function() {
250
- var res = ($(o.item || this).attr(o.attribute || 'id') || '')
251
- .match(o.expression || (/(.+)[-=_](.+)/)),
252
- pid = ($(o.item || this).parent(o.listType)
253
- .parent(o.items)
254
- .attr(o.attribute || 'id') || '')
255
- .match(o.expression || (/(.+)[-=_](.+)/));
256
-
257
- if (res) {
258
- str.push(((o.key || res[1]) + '[' + (o.key && o.expression ? res[1] : res[2]) + ']')
259
- + '='
260
- + (pid ? (o.key && o.expression ? pid[1] : pid[2]) : o.rootID));
261
- }
262
- });
555
+ },
263
556
 
264
- if(!str.length && o.key) {
265
- str.push(o.key + '=');
266
- }
557
+ _getLevel: function(item) {
267
558
 
268
- return str.join('&');
559
+ var level = 1;
269
560
 
270
- },
561
+ if (this.options.listType) {
562
+ var list = item.closest(this.options.listType);
563
+ while (list && list.length > 0 &&
564
+ !list.is('.ui-sortable')) {
565
+ level++;
566
+ list = list.parent().closest(this.options.listType);
567
+ }
568
+ }
271
569
 
272
- toHierarchy: function(options) {
570
+ return level;
571
+ },
273
572
 
274
- var o = $.extend({}, this.options, options),
275
- sDepth = o.startDepthCount || 0,
276
- ret = [];
573
+ _getChildLevels: function(parent, depth) {
574
+ var self = this,
575
+ o = this.options,
576
+ result = 0;
577
+ depth = depth || 0;
277
578
 
278
- $(this.element).children(o.items).each(function () {
279
- var level = _recursiveItems(this);
280
- ret.push(level);
281
- });
579
+ $(parent).children(o.listType).children(o.items).each(function (index, child) {
580
+ result = Math.max(self._getChildLevels(child, depth + 1), result);
581
+ });
282
582
 
283
- return ret;
583
+ return depth ? result + 1 : result;
584
+ },
284
585
 
285
- function _recursiveItems(item) {
286
- var id = ($(item).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
287
- if (id) {
288
- var currentItem = {"id" : id[2]};
289
- if ($(item).children(o.listType).children(o.items).length > 0) {
290
- currentItem.children = [];
291
- $(item).children(o.listType).children(o.items).each(function() {
292
- var level = _recursiveItems(this);
293
- currentItem.children.push(level);
294
- });
295
- }
296
- return currentItem;
297
- }
298
- }
299
- },
586
+ _isAllowed: function(parentItem, level, levels) {
587
+ var o = this.options,
588
+ maxLevels = this.placeholder.closest('.ui-sortable').nestedSortable('option', 'maxLevels'); // this takes into account the maxLevels set to the recipient list
300
589
 
301
- toArray: function(options) {
590
+ // mjs - is the root protected?
591
+ // mjs - are we nesting too deep?
592
+ if ( ! o.isAllowed(this.placeholder, parentItem, this.currentItem)) {
593
+ this.placeholder.addClass(o.errorClass);
594
+ if (maxLevels < levels && maxLevels != 0) {
595
+ this.beyondMaxLevels = levels - maxLevels;
596
+ } else {
597
+ this.beyondMaxLevels = 1;
598
+ }
599
+ } else {
600
+ if (maxLevels < levels && maxLevels != 0) {
601
+ this.placeholder.addClass(o.errorClass);
602
+ this.beyondMaxLevels = levels - maxLevels;
603
+ } else {
604
+ this.placeholder.removeClass(o.errorClass);
605
+ this.beyondMaxLevels = 0;
606
+ }
607
+ }
608
+ }
302
609
 
303
- var o = $.extend({}, this.options, options),
304
- sDepth = o.startDepthCount || 0,
305
- ret = [],
306
- left = 2;
610
+ }));
307
611
 
308
- ret.push({
309
- "item_id": o.rootID,
310
- "parent_id": 'none',
311
- "depth": sDepth,
312
- "left": '1',
313
- "right": ($(o.items, this.element).length + 1) * 2
314
- });
315
-
316
- $(this.element).children(o.items).each(function () {
317
- left = _recursiveArray(this, sDepth + 1, left);
318
- });
319
-
320
- ret = ret.sort(function(a,b){ return (a.left - b.left); });
321
-
322
- return ret;
323
-
324
- function _recursiveArray(item, depth, left) {
325
-
326
- var right = left + 1,
327
- id,
328
- pid;
329
-
330
- if ($(item).children(o.listType).children(o.items).length > 0) {
331
- depth ++;
332
- $(item).children(o.listType).children(o.items).each(function () {
333
- right = _recursiveArray($(this), depth, right);
334
- });
335
- depth --;
336
- }
337
-
338
- id = ($(item).attr(o.attribute || 'id')).match(o.expression || (/(.+)[-=_](.+)/));
339
-
340
- if (depth === sDepth + 1) {
341
- pid = o.rootID;
342
- } else {
343
- var parentItem = ($(item).parent(o.listType)
344
- .parent(o.items)
345
- .attr(o.attribute || 'id'))
346
- .match(o.expression || (/(.+)[-=_](.+)/));
347
- pid = parentItem[2];
348
- }
349
-
350
- if (id) {
351
- ret.push({"item_id": id[2], "parent_id": pid, "depth": depth, "left": left, "right": right});
352
- }
353
-
354
- left = right + 1;
355
- return left;
356
- }
357
-
358
- },
359
-
360
- _clearEmpty: function(item) {
361
-
362
- var emptyList = $(item).children(this.options.listType);
363
- if (emptyList.length && !emptyList.children().length && !this.options.doNotClear) {
364
- emptyList.remove();
365
- }
366
-
367
- },
368
-
369
- _getLevel: function(item) {
370
-
371
- var level = 1;
372
-
373
- if (this.options.listType) {
374
- var list = item.closest(this.options.listType);
375
- while (list && list.length > 0 &&
376
- !list.is('.ui-sortable')) {
377
- level++;
378
- list = list.parent().closest(this.options.listType);
379
- }
380
- }
381
-
382
- return level;
383
- },
384
-
385
- _getChildLevels: function(parent, depth) {
386
- var self = this,
387
- o = this.options,
388
- result = 0;
389
- depth = depth || 0;
390
-
391
- $(parent).children(o.listType).children(o.items).each(function (index, child) {
392
- result = Math.max(self._getChildLevels(child, depth + 1), result);
393
- });
394
-
395
- return depth ? result + 1 : result;
396
- },
397
-
398
- _isAllowed: function(parentItem, level, levels) {
399
- var o = this.options,
400
- isRoot = $(this.domPosition.parent).hasClass('ui-sortable') ? true : false,
401
- maxLevels = this.placeholder.closest('.ui-sortable').nestedSortable('option', 'maxLevels'); // this takes into account the maxLevels set to the recipient list
402
-
403
- // Is the root protected?
404
- // Are we trying to nest under a no-nest?
405
- // Are we nesting too deep?
406
- if (!o.isAllowed(this.currentItem, parentItem) ||
407
- parentItem && parentItem.hasClass(o.disableNesting) ||
408
- o.protectRoot && (parentItem == null && !isRoot || isRoot && level > 1)) {
409
- this.placeholder.addClass(o.errorClass);
410
- if (maxLevels < levels && maxLevels != 0) {
411
- this.beyondMaxLevels = levels - maxLevels;
412
- } else {
413
- this.beyondMaxLevels = 1;
414
- }
415
- } else {
416
- if (maxLevels < levels && maxLevels != 0) {
417
- this.placeholder.addClass(o.errorClass);
418
- this.beyondMaxLevels = levels - maxLevels;
419
- } else {
420
- this.placeholder.removeClass(o.errorClass);
421
- this.beyondMaxLevels = 0;
422
- }
423
- }
424
- }
425
-
426
- }));
427
-
428
- $.mjs.nestedSortable.prototype.options = $.extend({}, $.ui.sortable.prototype.options, $.mjs.nestedSortable.prototype.options);
612
+ $.mjs.nestedSortable.prototype.options = $.extend({}, $.ui.sortable.prototype.options, $.mjs.nestedSortable.prototype.options);
429
613
  })(jQuery);
@@ -11,14 +11,13 @@ window.rails_admin_nested_set = (tree_config) ->
11
11
 
12
12
  $ ->
13
13
  $("#" + tree_config["id"]).nestedSortable
14
- forcePlaceholderSize: true
15
- # handle: 'i.dd-handle',
16
- helper: "clone"
17
- items: "li"
14
+ handle: '.dd-handle',
15
+ #helper: "clone"
16
+ items: ".dd-item"
18
17
  maxLevels: tree_config["max_depth"]
19
- opacity: .6
20
18
  placeholder: "dd-placeholder"
21
- tabSize: 25
19
+ tolerance: 'pointer',
20
+ toleranceElement: '> div',
22
21
  update: (event, ui) ->
23
22
  $.ajax
24
23
  type: "POST"
@@ -25,13 +25,7 @@
25
25
  padding-left: 30px;
26
26
  }
27
27
 
28
- .dd-collapsed ol {
29
- display: none;
30
- }
31
-
32
- .dd-item,
33
- .dd-empty,
34
- .dd-placeholder {
28
+ .dd-item, .dd-placeholder {
35
29
  display: block;
36
30
  position: relative;
37
31
  margin: 0;
@@ -66,146 +60,21 @@
66
60
  background: #fff;
67
61
  }
68
62
 
69
- .dd-item > button {
70
- display: block;
71
- position: relative;
72
- cursor: pointer;
73
- float: left;
74
- width: 25px;
75
- height: 20px;
76
- margin: 5px 0;
77
- padding: 0;
78
- text-indent: 100%;
79
- white-space: nowrap;
80
- overflow: hidden;
81
- border: 0;
82
- background: transparent;
83
- font-size: 12px;
84
- line-height: 1;
85
- text-align: center;
86
- font-weight: bold;
63
+ .dd-item {
64
+ margin-top: 5px
87
65
  }
88
66
 
89
- .dd-item > button:before {
90
- content: '+';
91
- display: block;
92
- position: absolute;
93
- width: 100%;
94
- text-align: center;
95
- text-indent: 0;
96
- }
97
-
98
- .dd-item > button[data-action="collapse"]:before {
99
- content: '-';
100
- }
101
-
102
- .dd-placeholder, .dd-empty {
67
+ .dd-placeholder {
103
68
  margin: 5px 0;
104
69
  padding: 0;
105
70
  min-height: 30px;
106
71
  background: #f2fbff;
107
72
  border: 1px dashed #b6bcbf;
108
- box-sizing: border-box;
109
- -moz-box-sizing: border-box;
110
- }
111
-
112
- .dd-empty {
113
- border: 1px dashed #bbb;
114
- min-height: 100px;
115
- background-color: #e5e5e5;
116
- background-image: -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
117
- background-image: -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
118
- background-image: linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
119
- background-size: 60px 60px;
120
- background-position: 0 0, 30px 30px;
121
- }
122
-
123
- .dd-dragel {
124
- position: absolute;
125
- pointer-events: none;
126
- z-index: 9999;
127
- }
128
-
129
- .dd-dragel > .dd-item .dd-handle {
130
- margin-top: 0;
131
- }
132
-
133
- .dd-dragel .dd-handle {
134
- -webkit-box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, .1);
135
- box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, .1);
136
73
  }
137
74
 
138
- /**
139
- * Nestable Extras
140
- */
141
-
142
- .nestable-lists {
143
- display: block;
144
- clear: both;
145
- padding: 30px 0;
146
- width: 100%;
147
- border: 0;
148
- border-top: 2px solid #ddd;
149
- border-bottom: 2px solid #ddd;
150
- }
151
-
152
- #nestable-menu {
153
- padding: 0;
154
- margin: 20px 0;
155
- }
156
-
157
- #nestable-output, #nestable2-output {
158
- width: 100%;
159
- height: 7em;
160
- font-size: 0.75em;
161
- line-height: 1.333333em;
162
- font-family: Consolas, monospace;
163
- padding: 5px;
164
- box-sizing: border-box;
165
- -moz-box-sizing: border-box;
166
- }
167
-
168
- #nestable2 .dd-handle {
169
- color: #fff;
170
- border: 1px solid #999;
171
- background: #bbb;
172
- background: -webkit-linear-gradient(top, #bbb 0%, #999 100%);
173
- background: -moz-linear-gradient(top, #bbb 0%, #999 100%);
174
- background: linear-gradient(top, #bbb 0%, #999 100%);
175
- }
176
-
177
- #nestable2 .dd-handle:hover {
178
- background: #bbb;
179
- }
180
-
181
- #nestable2 .dd-item > button:before {
182
- color: #fff;
183
- }
184
-
185
- @media only screen and (min-width: 700px) {
186
-
187
- .dd {
188
- float: none;
189
- width: auto;
190
- }
191
- .dd + .dd {
192
- margin-left: 2%;
193
- }
194
-
195
- }
196
-
197
- .dd-hover > .dd-handle {
198
- background: #2ea8e5 !important;
199
- }
200
-
201
- /**
202
- * Nestable Draggable Handles
203
- */
204
-
205
75
  .dd3-content {
206
76
  display: block;
207
77
  height: 30px;
208
- margin: 5px 0;
209
78
  padding: 5px 10px 5px 40px;
210
79
  color: #333;
211
80
  text-decoration: none;
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -7,7 +7,7 @@ module RailsAdminNestedSet
7
7
  def options
8
8
  @options ||= {
9
9
  max_depth: 3,
10
- }.merge(config)
10
+ }.merge(config || {})
11
11
  end
12
12
 
13
13
  protected
File without changes
@@ -15,7 +15,6 @@ module RailsAdminNestedSet
15
15
  li_classes = 'dd-item dd3-item'
16
16
 
17
17
  content_tag :li, class: li_classes, :'data-id' => node.id do
18
-
19
18
  output = content_tag :div, 'drag', class: 'dd-handle dd3-handle'
20
19
  output+= content_tag :div, class: 'dd3-content' do
21
20
  content = link_to @model_config.with(object: node).object_label, edit_path(@abstract_model, node.id)
@@ -24,7 +23,7 @@ module RailsAdminNestedSet
24
23
 
25
24
  children = tree.select{|elem| elem.parent_id == node.id}
26
25
  if children.any?
27
- output += content_tag :ol, rails_admin_nested_set_builder(children, tree), class: 'dd-list'
26
+ output = content_tag(:div, output) + content_tag(:ol, rails_admin_nested_set_builder(children, tree), class: 'dd-list')
28
27
  end
29
28
 
30
29
  output
File without changes
@@ -1,3 +1,3 @@
1
1
  module RailsAdminNestedSet
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -12,10 +12,6 @@ Gem::Specification.new do |gem|
12
12
  gem.summary = %q{Interface for editing a nested set for rails_admin}
13
13
  gem.homepage = "https://github.com/rs-pro/rails_admin_nested_set"
14
14
 
15
- gem.add_dependency "rails", "~> 4.0.0"
16
- gem.add_dependency "jquery-rails"
17
- gem.add_dependency "jquery-ui-rails"
18
-
19
15
  gem.files = `git ls-files`.split($/)
20
16
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
21
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
metadata CHANGED
@@ -1,57 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_admin_nested_set
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gleb Tv
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-10 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rails
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ~>
18
- - !ruby/object:Gem::Version
19
- version: 4.0.0
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ~>
25
- - !ruby/object:Gem::Version
26
- version: 4.0.0
27
- - !ruby/object:Gem::Dependency
28
- name: jquery-rails
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '>='
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: jquery-ui-rails
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '>='
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
11
+ date: 2014-02-26 00:00:00.000000000 Z
12
+ dependencies: []
55
13
  description: Rails admin nested set
56
14
  email:
57
15
  - glebtv@gmail.com
@@ -100,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
58
  version: '0'
101
59
  requirements: []
102
60
  rubyforge_project:
103
- rubygems_version: 2.1.11
61
+ rubygems_version: 2.2.1
104
62
  signing_key:
105
63
  specification_version: 4
106
64
  summary: Interface for editing a nested set for rails_admin