jquery-sortable-rails 0.9.11

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 28dbb5f1f434adf64b76b443e6b7314d8f6f538c
4
+ data.tar.gz: c63660b8b9ae356b3ebdab7b6f1651184c2ccc6b
5
+ SHA512:
6
+ metadata.gz: 7144dd4518bccb8a5f390f57aa5cd2c098bcd0ec3c81053604cccc710a31a0c0e46b6ec918a23a43fbd23f08ce29cfdf57fb68ec47339d959d44f3ebef79452b
7
+ data.tar.gz: 105b026a87e5f31ec6a3e8227493367507a1729264bbf39dd0cbd09f965d8d206038ee77d6b141316f6c97781cdf4e7c700edbfb6d1fcf678c9a56c09002fa3c
@@ -0,0 +1,2 @@
1
+ j�ؠwk��i�*��wp�Xt92SY4c�6��o4$��?" -��%�<ހ�؝�$h<��=��s-e�����+�_vx/��'(B��T�q ڲP�-��3Px��0Tl��oQ�iʆ��
2
+ v2op���#��\��U;4{��:$�
@@ -0,0 +1 @@
1
+ H]IĮ����zL�&�#Z��оZA���(l���"�؝�2�L�7� ���92�����v�?����j�߅����j8���݊����J �� a��6�pY��E�^ߧy-ՠ��#[�!���Ak����p��^ں&� .y�3;@�{olƫH ��G���-����Gn���d���|y����R����[��� H�m_�{�G
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'jruby-openssl', :platforms => :jruby
4
+
5
+ # Specify your gem's dependencies in gemspec
6
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Vlad Gorodetsky
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,34 @@
1
+ # jquery-sortable-rails
2
+
3
+ ## Installation
4
+
5
+ Add the following to your gemfile:
6
+
7
+ gem 'jquery-sortable-rails'
8
+
9
+ And then execute:
10
+
11
+ $ bundle
12
+
13
+ Add the following directive to your JavaScript manifest file (application.js):
14
+
15
+ //= require jquery.sortable
16
+
17
+ ## HighSecurity
18
+
19
+ To ensure that you're including a gem with original code, you can install this gem using a HighSecurity policy.
20
+
21
+ gem cert --add <(curl -Ls https://gist.github.com/bai/5150087/raw/public_cert.pem)
22
+ bundle install --trust-policy HighSecurity
23
+
24
+ Or, if you don't use bundler:
25
+
26
+ gem install jquery-sortable-rails -P HighSecurity
27
+
28
+ ## Contributing
29
+
30
+ 1. Fork it
31
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
32
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
33
+ 4. Push to the branch (`git push origin my-new-feature`)
34
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDSDCCAjCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA1MQowCAYDVQQDDAF2MRMw
3
+ EQYKCZImiZPyLGQBGRYDZ29yMRIwEAYKCZImiZPyLGQBGRYCaW8wHhcNMTMwNTIz
4
+ MjA0MTI3WhcNMTQwNTIzMjA0MTI3WjA1MQowCAYDVQQDDAF2MRMwEQYKCZImiZPy
5
+ LGQBGRYDZ29yMRIwEAYKCZImiZPyLGQBGRYCaW8wggEiMA0GCSqGSIb3DQEBAQUA
6
+ A4IBDwAwggEKAoIBAQCtb8+GfjqcYl6M4IhIGomKsGgWEC4mwTXIq/Yl+jJAdP7s
7
+ bdV3lWnZybUPKtdHSQIJcxbm8GZspTqSqDgsECI/laTyLj7Srqcbyivf/ov50Tg1
8
+ CxMtt8STA6wNmY0ljO4SK72Pr8uQwFZIgNHBB9LcvrpmRn/TWDXlcqaq0db6QJKk
9
+ jGOv74ukiQun+saqthpxwNN6wm0rj1GDulrDuMeeMj/XDgu0piNHhBtsgQ6KrN94
10
+ cs0XGgwKihL0LdqWiOG9L8tZKeksKk72EcTpvaw1EYUfJ/rAcC8l6SluN2+BDMA0
11
+ /4LU70O+wTwHcHv2HimtKdlcpS936qOez3lXUD+3AgMBAAGjYzBhMAkGA1UdEwQC
12
+ MAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBSRvHatldjBIKT5agA2bnkfm4KUxTAT
13
+ BgNVHREEDDAKgQh2QGdvci5pbzATBgNVHRIEDDAKgQh2QGdvci5pbzANBgkqhkiG
14
+ 9w0BAQUFAAOCAQEAmyGZCL6ISHS6UCkPAie1LZgyc+yS4ckMPtzBJtjODr5kfRTC
15
+ tLb9W4epJ9Aa2aGkKy/NL8MFS0BwTJmjSfufFDwFZlw0kI9aAvL4Nx9OHWNen9Dm
16
+ GtEWXXKpB0du12DBjfavJYl0QLcz18M0mtvug634t40H06GussO83uu7wHEvIPBP
17
+ Z5VMAbKvOmDgaP2I9XxZ2/lDmBKDZkVNqmqYiScw2CWsKxVPx3vhMGprTIz4O8y/
18
+ JCf887eMZl/8mEIeCLb+gH5sh5yJJpti2HTLnR4Q1QKWR/0T9tASoQPF3kL62n9+
19
+ m1B90+fEzJsBDQIAsnLPqxjivWbIIfZ7GeGZyA==
20
+ -----END CERTIFICATE-----
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'jquery-sortable-rails/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "jquery-sortable-rails"
8
+ gem.version = Jquery::Sortable::Rails::VERSION
9
+ gem.authors = ["Vlad Gorodetsky"]
10
+ gem.email = ["v@gor.io"]
11
+ gem.description = %q{Sortable control for jQuery.}
12
+ gem.summary = %q{Gemified jquery-sortable asset for Rails}
13
+ gem.homepage = "http://github.com/bai/jquery-sortable-rails"
14
+ gem.licenses = ["MIT"]
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+
21
+ gem.signing_key = File.expand_path("~/.gem/private_key.pem") if $0 =~ /gem\z/
22
+ gem.cert_chain = ["certs/bai.pem"]
23
+
24
+ gem.add_dependency "railties", ">= 3.0", "< 5.0"
25
+ end
@@ -0,0 +1,10 @@
1
+ require "jquery-sortable-rails/version"
2
+
3
+ module Jquery
4
+ module Sortable
5
+ module Rails
6
+ class Engine < ::Rails::Engine
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module Jquery
2
+ module Sortable
3
+ module Rails
4
+ VERSION = '0.9.11'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,607 @@
1
+ /* ===================================================
2
+ * jquery-sortable.js v0.9.11
3
+ * http://johnny.github.com/jquery-sortable/
4
+ * ===================================================
5
+ * Copyright (c) 2012 Jonas von Andrian
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above copyright
13
+ * notice, this list of conditions and the following disclaimer in the
14
+ * documentation and/or other materials provided with the distribution.
15
+ * * The name of the author may not be used to endorse or promote products
16
+ * derived from this software without specific prior written permission.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ * ========================================================== */
29
+
30
+
31
+ !function ( $, window, undefined){
32
+ var eventNames,
33
+ pluginName = 'sortable',
34
+ containerDefaults = {
35
+ // If true, items can be dragged from this container
36
+ drag: true,
37
+ // If true, items can be droped onto this container
38
+ drop: true,
39
+ // Exclude items from being draggable, if the
40
+ // selector matches the item
41
+ exclude: "",
42
+ // If true, search for nested containers within an item
43
+ nested: true,
44
+ // If true, the items are assumed to be arranged vertically
45
+ vertical: true
46
+ }, // end container defaults
47
+ groupDefaults = {
48
+ // This is executed after the placeholder has been moved.
49
+ afterMove: function ($placeholder, container) {
50
+ },
51
+ // The exact css path between the container and its items, e.g. "> tbody"
52
+ containerPath: "",
53
+ // The css selector of the containers
54
+ containerSelector: "ol, ul",
55
+ // Distance the mouse has to travel to start dragging
56
+ distance: 0,
57
+ // The css selector of the drag handle
58
+ handle: "",
59
+ // The exact css path between the item and its subcontainers
60
+ itemPath: "",
61
+ // The css selector of the items
62
+ itemSelector: "li",
63
+ // Check if the dragged item may be inside the container.
64
+ // Use with care, since the search for a valid container entails a depth first search
65
+ // and may be quite expensive.
66
+ isValidTarget: function ($item, container) {
67
+ return true
68
+ },
69
+ // Executed before onDrop if placeholder is detached.
70
+ // This happens if pullPlaceholder is set to false and the drop occurs outside a container.
71
+ onCancel: function ($item, container, _super) {
72
+ },
73
+ // Executed at the beginning of a mouse move event.
74
+ // The Placeholder has not been moved yet.
75
+ onDrag: function ($item, position, _super) {
76
+ $item.css(position)
77
+ },
78
+ // Called after the drag has been started,
79
+ // that is the mouse button is beeing held down and
80
+ // the mouse is moving.
81
+ // The container is the closest initialized container.
82
+ // Therefore it might not be the container, that actually contains the item.
83
+ onDragStart: function ($item, container, _super) {
84
+ $item.css({
85
+ height: $item.height(),
86
+ width: $item.width()
87
+ })
88
+ $item.addClass("dragged")
89
+ $("body").addClass("dragging")
90
+ },
91
+ // Called when the mouse button is beeing released
92
+ onDrop: function ($item, container, _super) {
93
+ $item.removeClass("dragged").removeAttr("style")
94
+ $("body").removeClass("dragging")
95
+ },
96
+ // Called on mousedown.
97
+ onMousedown: function($item, event, _super) {
98
+ event.preventDefault()
99
+ },
100
+ // Template for the placeholder. Can be any valid jQuery input
101
+ // e.g. a string, a DOM element.
102
+ // The placeholder must have the class "placeholder"
103
+ placeholder: '<li class="placeholder"/>',
104
+ // If true, the position of the placeholder is calculated on every mousemove.
105
+ // If false, it is only calculated when the mouse is above a container.
106
+ pullPlaceholder: true,
107
+ // Specifies serialization of the container group.
108
+ // The pair $parent/$children is either container/items or item/subcontainers.
109
+ // Note that this default method only works, if every item only has one subcontainer
110
+ serialize: function ($parent, $children, parentIsContainer) {
111
+ var result = $.extend({}, $parent.data())
112
+
113
+ if(parentIsContainer)
114
+ return $children
115
+ else if ($children[0]){
116
+ result.children = $children
117
+ delete result.subContainer
118
+ }
119
+
120
+ delete result.sortable
121
+
122
+ return result
123
+ },
124
+ // Set tolerance while dragging. Positive values decrease sensitivity,
125
+ // negative values increase it.
126
+ tolerance: 0
127
+ }, // end group defaults
128
+ containerGroups = {},
129
+ groupCounter = 0,
130
+ emptyBox = {
131
+ left: 0,
132
+ top: 0,
133
+ bottom: 0,
134
+ right:0
135
+ }
136
+ eventNames = {
137
+ start: "touchstart.sortable mousedown.sortable",
138
+ drop: "touchend.sortable touchcancel.sortable mouseup.sortable",
139
+ drag: "touchmove.sortable mousemove.sortable",
140
+ scroll: "scroll.sortable"
141
+ }
142
+
143
+ /*
144
+ * a is Array [left, right, top, bottom]
145
+ * b is array [left, top]
146
+ */
147
+ function d(a,b) {
148
+ var x = Math.max(0, a[0] - b[0], b[0] - a[1]),
149
+ y = Math.max(0, a[2] - b[1], b[1] - a[3])
150
+ return x+y;
151
+ }
152
+
153
+ function setDimensions(array, dimensions, tolerance, useOffset) {
154
+ var i = array.length,
155
+ offsetMethod = useOffset ? "offset" : "position"
156
+ tolerance = tolerance || 0
157
+
158
+ while(i--){
159
+ var el = array[i].el ? array[i].el : $(array[i]),
160
+ // use fitting method
161
+ pos = el[offsetMethod]()
162
+ pos.left += parseInt(el.css('margin-left'), 10)
163
+ pos.top += parseInt(el.css('margin-top'),10)
164
+ dimensions[i] = [
165
+ pos.left - tolerance,
166
+ pos.left + el.outerWidth() + tolerance,
167
+ pos.top - tolerance,
168
+ pos.top + el.outerHeight() + tolerance
169
+ ]
170
+ }
171
+ }
172
+
173
+ function getRelativePosition(pointer, element) {
174
+ var offset = element.offset()
175
+ return {
176
+ left: pointer.left - offset.left,
177
+ top: pointer.top - offset.top
178
+ }
179
+ }
180
+
181
+ function sortByDistanceDesc(dimensions, pointer, lastPointer) {
182
+ pointer = [pointer.left, pointer.top]
183
+ lastPointer = lastPointer && [lastPointer.left, lastPointer.top]
184
+
185
+ var dim,
186
+ i = dimensions.length,
187
+ distances = []
188
+
189
+ while(i--){
190
+ dim = dimensions[i]
191
+ distances[i] = [i,d(dim,pointer), lastPointer && d(dim, lastPointer)]
192
+ }
193
+ distances = distances.sort(function (a,b) {
194
+ return b[1] - a[1] || b[2] - a[2] || b[0] - a[0]
195
+ })
196
+
197
+ // last entry is the closest
198
+ return distances
199
+ }
200
+
201
+ function ContainerGroup(options) {
202
+ this.options = $.extend({}, groupDefaults, options)
203
+ this.containers = []
204
+ this.scrollProxy = $.proxy(this.scroll, this)
205
+ this.dragProxy = $.proxy(this.drag, this)
206
+ this.dropProxy = $.proxy(this.drop, this)
207
+
208
+ if(!this.options.parentContainer){
209
+ this.placeholder = $(this.options.placeholder)
210
+ if(!options.isValidTarget)
211
+ this.options.isValidTarget = undefined
212
+ }
213
+ }
214
+
215
+ ContainerGroup.get = function (options) {
216
+ if( !containerGroups[options.group]) {
217
+ if(!options.group)
218
+ options.group = groupCounter ++
219
+ containerGroups[options.group] = new ContainerGroup(options)
220
+ }
221
+ return containerGroups[options.group]
222
+ }
223
+
224
+ ContainerGroup.prototype = {
225
+ dragInit: function (e, itemContainer) {
226
+ this.$document = $(itemContainer.el[0].ownerDocument)
227
+
228
+ if(itemContainer.enabled()){
229
+ this.toggleListeners('on')
230
+
231
+ // get item to drag
232
+ this.item = $(e.target).closest(this.options.itemSelector)
233
+ this.itemContainer = itemContainer
234
+
235
+ this.setPointer(e)
236
+
237
+ this.options.onMousedown(this.item, e, groupDefaults.onMousedown)
238
+ } else {
239
+ this.toggleListeners('on', ['drop'])
240
+ }
241
+
242
+ this.dragInitDone = true
243
+ },
244
+ drag: function (e) {
245
+ if(!this.dragging){
246
+ if(!this.distanceMet(e))
247
+ return
248
+
249
+ this.options.onDragStart(this.item, this.itemContainer, groupDefaults.onDragStart)
250
+ this.item.before(this.placeholder)
251
+ this.dragging = true
252
+ }
253
+
254
+ this.setPointer(e)
255
+ // place item under the cursor
256
+ this.options.onDrag(this.item,
257
+ getRelativePosition(this.pointer, this.item.offsetParent()),
258
+ groupDefaults.onDrag)
259
+
260
+ var x = e.pageX,
261
+ y = e.pageY,
262
+ box = this.sameResultBox,
263
+ t = this.options.tolerance
264
+
265
+ if(!box || box.top - t > y || box.bottom + t < y || box.left - t > x || box.right + t < x)
266
+ if(!this.searchValidTarget())
267
+ this.placeholder.detach()
268
+ },
269
+ drop: function (e) {
270
+ this.toggleListeners('off')
271
+
272
+ this.dragInitDone = false
273
+
274
+ if(this.dragging){
275
+ // processing Drop, check if placeholder is detached
276
+ if(this.placeholder.closest("html")[0])
277
+ this.placeholder.before(this.item).detach()
278
+ else
279
+ this.options.onCancel(this.item, this.itemContainer, groupDefaults.onCancel)
280
+
281
+ this.options.onDrop(this.item, this.getContainer(this.item), groupDefaults.onDrop)
282
+
283
+ // cleanup
284
+ this.clearDimensions()
285
+ this.clearOffsetParent()
286
+ this.lastAppendedItem = this.sameResultBox = undefined
287
+ this.dragging = false
288
+ }
289
+ },
290
+ searchValidTarget: function (pointer, lastPointer) {
291
+ if(!pointer){
292
+ pointer = this.relativePointer || this.pointer
293
+ lastPointer = this.lastRelativePointer || this.lastPointer
294
+ }
295
+
296
+ var distances = sortByDistanceDesc(this.getContainerDimensions(),
297
+ pointer,
298
+ lastPointer),
299
+ i = distances.length
300
+
301
+ while(i--){
302
+ var index = distances[i][0],
303
+ distance = distances[i][1]
304
+
305
+ if(!distance || this.options.pullPlaceholder){
306
+ var container = this.containers[index]
307
+ if(!container.disabled){
308
+ if(!this.$getOffsetParent()){
309
+ var offsetParent = container.getItemOffsetParent()
310
+ pointer = getRelativePosition(pointer, offsetParent)
311
+ lastPointer = getRelativePosition(lastPointer, offsetParent)
312
+ }
313
+ if(container.searchValidTarget(pointer, lastPointer))
314
+ return true
315
+ }
316
+ }
317
+ }
318
+ if(this.sameResultBox)
319
+ this.sameResultBox = undefined
320
+ },
321
+ movePlaceholder: function (container, item, method, sameResultBox) {
322
+ var lastAppendedItem = this.lastAppendedItem
323
+ if(!sameResultBox && lastAppendedItem && lastAppendedItem[0] === item[0])
324
+ return;
325
+
326
+ item[method](this.placeholder)
327
+ this.lastAppendedItem = item
328
+ this.sameResultBox = sameResultBox
329
+ this.options.afterMove(this.placeholder, container)
330
+ },
331
+ getContainerDimensions: function () {
332
+ if(!this.containerDimensions)
333
+ setDimensions(this.containers, this.containerDimensions = [], this.options.tolerance, !this.$getOffsetParent())
334
+ return this.containerDimensions
335
+ },
336
+ getContainer: function (element) {
337
+ return element.closest(this.options.containerSelector).data(pluginName)
338
+ },
339
+ $getOffsetParent: function () {
340
+ if(this.offsetParent === undefined){
341
+ var i = this.containers.length - 1,
342
+ offsetParent = this.containers[i].getItemOffsetParent()
343
+
344
+ if(!this.options.parentContainer){
345
+ while(i--){
346
+ if(offsetParent[0] != this.containers[i].getItemOffsetParent()[0]){
347
+ // If every container has the same offset parent,
348
+ // use position() which is relative to this parent,
349
+ // otherwise use offset()
350
+ // compare #setDimensions
351
+ offsetParent = false
352
+ break;
353
+ }
354
+ }
355
+ }
356
+
357
+ this.offsetParent = offsetParent
358
+ }
359
+ return this.offsetParent
360
+ },
361
+ setPointer: function (e) {
362
+ var pointer = {
363
+ left: e.pageX,
364
+ top: e.pageY
365
+ }
366
+
367
+ if(this.$getOffsetParent()){
368
+ var relativePointer = getRelativePosition(pointer, this.$getOffsetParent())
369
+ this.lastRelativePointer = this.relativePointer
370
+ this.relativePointer = relativePointer
371
+ }
372
+
373
+ this.lastPointer = this.pointer
374
+ this.pointer = pointer
375
+ },
376
+ distanceMet: function (e) {
377
+ return (Math.max(
378
+ Math.abs(this.pointer.left - e.pageX),
379
+ Math.abs(this.pointer.top - e.pageY)
380
+ ) >= this.options.distance)
381
+ },
382
+ scroll: function (e) {
383
+ this.clearDimensions()
384
+ this.clearOffsetParent()
385
+ },
386
+ toggleListeners: function (method, events) {
387
+ var that = this
388
+ events = events || ['drag','drop','scroll']
389
+
390
+ $.each(events,function (i,event) {
391
+ that.$document[method](eventNames[event], that[event + 'Proxy'])
392
+ })
393
+ },
394
+ clearOffsetParent: function () {
395
+ this.offsetParent = undefined
396
+ },
397
+ // Recursively clear container and item dimensions
398
+ clearDimensions: function () {
399
+ this.containerDimensions = undefined
400
+ var i = this.containers.length
401
+ while(i--){
402
+ this.containers[i].clearDimensions()
403
+ }
404
+ }
405
+ }
406
+
407
+ function Container(element, options) {
408
+ this.el = element
409
+ this.options = $.extend( {}, containerDefaults, options)
410
+
411
+ this.group = ContainerGroup.get(this.options)
412
+ this.rootGroup = this.options.rootGroup = this.options.rootGroup || this.group
413
+ this.parentContainer = this.options.parentContainer
414
+ this.handle = this.rootGroup.options.handle || this.rootGroup.options.itemSelector
415
+
416
+ this.el.on(eventNames.start, this.handle, $.proxy(this.dragInit, this))
417
+
418
+ if(this.options.drop)
419
+ this.group.containers.push(this)
420
+ }
421
+
422
+ Container.prototype = {
423
+ dragInit: function (e) {
424
+ var rootGroup = this.rootGroup
425
+
426
+ if( !rootGroup.dragInitDone &&
427
+ e.which === 1 &&
428
+ this.options.drag &&
429
+ !$(e.target).is(this.options.exclude))
430
+ rootGroup.dragInit(e, this)
431
+ },
432
+ searchValidTarget: function (pointer, lastPointer) {
433
+ var distances = sortByDistanceDesc(this.getItemDimensions(),
434
+ pointer,
435
+ lastPointer),
436
+ i = distances.length,
437
+ rootGroup = this.rootGroup,
438
+ validTarget = !rootGroup.options.isValidTarget ||
439
+ rootGroup.options.isValidTarget(rootGroup.item, this)
440
+
441
+ if(!i && validTarget){
442
+ rootGroup.movePlaceholder(this, this.el, "append")
443
+ return true
444
+ } else
445
+ while(i--){
446
+ var index = distances[i][0],
447
+ distance = distances[i][1]
448
+ if(!distance && this.hasChildGroup(index)){
449
+ var found = this.getContainerGroup(index).searchValidTarget(pointer, lastPointer)
450
+ if(found)
451
+ return true
452
+ }
453
+ else if(validTarget){
454
+ this.movePlaceholder(index, pointer)
455
+ return true
456
+ }
457
+ }
458
+ },
459
+ movePlaceholder: function (index, pointer) {
460
+ var item = $(this.items[index]),
461
+ dim = this.itemDimensions[index],
462
+ method = "after",
463
+ width = item.outerWidth(),
464
+ height = item.outerHeight(),
465
+ offset = item.offset(),
466
+ sameResultBox = {
467
+ left: offset.left,
468
+ right: offset.left + width,
469
+ top: offset.top,
470
+ bottom: offset.top + height
471
+ }
472
+ if(this.options.vertical){
473
+ var yCenter = (dim[2] + dim[3]) / 2,
474
+ inUpperHalf = pointer.top <= yCenter
475
+ if(inUpperHalf){
476
+ method = "before"
477
+ sameResultBox.bottom -= height / 2
478
+ } else
479
+ sameResultBox.top += height / 2
480
+ } else {
481
+ var xCenter = (dim[0] + dim[1]) / 2,
482
+ inLeftHalf = pointer.left <= xCenter
483
+ if(inLeftHalf){
484
+ method = "before"
485
+ sameResultBox.right -= width / 2
486
+ } else
487
+ sameResultBox.left += width / 2
488
+ }
489
+ if(this.hasChildGroup(index))
490
+ sameResultBox = emptyBox
491
+ this.rootGroup.movePlaceholder(this, item, method, sameResultBox)
492
+ },
493
+ getItemDimensions: function () {
494
+ if(!this.itemDimensions){
495
+ this.items = this.$getChildren(this.el, "item").filter(":not(.placeholder, .dragged)").get()
496
+ setDimensions(this.items, this.itemDimensions = [], this.options.tolerance)
497
+ }
498
+ return this.itemDimensions
499
+ },
500
+ getItemOffsetParent: function () {
501
+ var offsetParent,
502
+ el = this.el
503
+ // Since el might be empty we have to check el itself and
504
+ // can not do something like el.children().first().offsetParent()
505
+ if(el.css("position") === "relative" || el.css("position") === "absolute" || el.css("position") === "fixed")
506
+ offsetParent = el
507
+ else
508
+ offsetParent = el.offsetParent()
509
+ return offsetParent
510
+ },
511
+ hasChildGroup: function (index) {
512
+ return this.options.nested && this.getContainerGroup(index)
513
+ },
514
+ getContainerGroup: function (index) {
515
+ var childGroup = $.data(this.items[index], "subContainer")
516
+ if( childGroup === undefined){
517
+ var childContainers = this.$getChildren(this.items[index], "container")
518
+ childGroup = false
519
+
520
+ if(childContainers[0]){
521
+ var options = $.extend({}, this.options, {
522
+ parentContainer: this,
523
+ group: groupCounter ++
524
+ })
525
+ childGroup = childContainers[pluginName](options).data(pluginName).group
526
+ }
527
+ $.data(this.items[index], "subContainer", childGroup)
528
+ }
529
+ return childGroup
530
+ },
531
+ enabled: function () {
532
+ return !this.disabled && (!this.parentContainer || this.parentContainer.enabled())
533
+ },
534
+ $getChildren: function (parent, type) {
535
+ var options = this.rootGroup.options,
536
+ path = options[type + "Path"],
537
+ selector = options[type + "Selector"]
538
+
539
+ parent = $(parent)
540
+ if(path)
541
+ parent = parent.find(path)
542
+
543
+ return parent.children(selector)
544
+ },
545
+ _serialize: function (parent, isContainer) {
546
+ var that = this,
547
+ childType = isContainer ? "item" : "container",
548
+
549
+ children = this.$getChildren(parent, childType).not(this.options.exclude).map(function () {
550
+ return that._serialize($(this), !isContainer)
551
+ }).get()
552
+
553
+ return this.rootGroup.options.serialize(parent, children, isContainer)
554
+ },
555
+ clearDimensions: function () {
556
+ this.itemDimensions = undefined
557
+ if(this.items && this.items[0]){
558
+ var i = this.items.length
559
+ while(i--){
560
+ var group = $.data(this.items[i], "subContainer")
561
+ if(group)
562
+ group.clearDimensions()
563
+ }
564
+ }
565
+ }
566
+ }
567
+
568
+ var API = {
569
+ enable: function (ignoreChildren) {
570
+ this.disabled = false
571
+ },
572
+ disable: function (ignoreChildren) {
573
+ this.disabled = true
574
+ },
575
+ serialize: function () {
576
+ return this._serialize(this.el, true)
577
+ }
578
+ }
579
+
580
+ $.extend(Container.prototype, API)
581
+
582
+ /**
583
+ * jQuery API
584
+ *
585
+ * Parameters are
586
+ * either options on init
587
+ * or a method name followed by arguments to pass to the method
588
+ */
589
+ $.fn[pluginName] = function(methodOrOptions) {
590
+ var args = Array.prototype.slice.call(arguments, 1)
591
+
592
+ return this.map(function(){
593
+ var $t = $(this),
594
+ object = $t.data(pluginName)
595
+
596
+ if(object && API[methodOrOptions])
597
+ return API[methodOrOptions].apply(object, args) || this
598
+ else if(!object && (methodOrOptions === undefined ||
599
+ typeof methodOrOptions === "object"))
600
+ $t.data(pluginName, new Container($t, methodOrOptions))
601
+
602
+ return this
603
+ });
604
+ };
605
+
606
+ }(jQuery, window)
607
+ ;
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jquery-sortable-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.11
5
+ platform: ruby
6
+ authors:
7
+ - Vlad Gorodetsky
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDSDCCAjCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA1MQowCAYDVQQDDAF2MRMw
14
+ EQYKCZImiZPyLGQBGRYDZ29yMRIwEAYKCZImiZPyLGQBGRYCaW8wHhcNMTMwNTIz
15
+ MjA0MTI3WhcNMTQwNTIzMjA0MTI3WjA1MQowCAYDVQQDDAF2MRMwEQYKCZImiZPy
16
+ LGQBGRYDZ29yMRIwEAYKCZImiZPyLGQBGRYCaW8wggEiMA0GCSqGSIb3DQEBAQUA
17
+ A4IBDwAwggEKAoIBAQCtb8+GfjqcYl6M4IhIGomKsGgWEC4mwTXIq/Yl+jJAdP7s
18
+ bdV3lWnZybUPKtdHSQIJcxbm8GZspTqSqDgsECI/laTyLj7Srqcbyivf/ov50Tg1
19
+ CxMtt8STA6wNmY0ljO4SK72Pr8uQwFZIgNHBB9LcvrpmRn/TWDXlcqaq0db6QJKk
20
+ jGOv74ukiQun+saqthpxwNN6wm0rj1GDulrDuMeeMj/XDgu0piNHhBtsgQ6KrN94
21
+ cs0XGgwKihL0LdqWiOG9L8tZKeksKk72EcTpvaw1EYUfJ/rAcC8l6SluN2+BDMA0
22
+ /4LU70O+wTwHcHv2HimtKdlcpS936qOez3lXUD+3AgMBAAGjYzBhMAkGA1UdEwQC
23
+ MAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBSRvHatldjBIKT5agA2bnkfm4KUxTAT
24
+ BgNVHREEDDAKgQh2QGdvci5pbzATBgNVHRIEDDAKgQh2QGdvci5pbzANBgkqhkiG
25
+ 9w0BAQUFAAOCAQEAmyGZCL6ISHS6UCkPAie1LZgyc+yS4ckMPtzBJtjODr5kfRTC
26
+ tLb9W4epJ9Aa2aGkKy/NL8MFS0BwTJmjSfufFDwFZlw0kI9aAvL4Nx9OHWNen9Dm
27
+ GtEWXXKpB0du12DBjfavJYl0QLcz18M0mtvug634t40H06GussO83uu7wHEvIPBP
28
+ Z5VMAbKvOmDgaP2I9XxZ2/lDmBKDZkVNqmqYiScw2CWsKxVPx3vhMGprTIz4O8y/
29
+ JCf887eMZl/8mEIeCLb+gH5sh5yJJpti2HTLnR4Q1QKWR/0T9tASoQPF3kL62n9+
30
+ m1B90+fEzJsBDQIAsnLPqxjivWbIIfZ7GeGZyA==
31
+ -----END CERTIFICATE-----
32
+ date: 2013-09-02 00:00:00.000000000 Z
33
+ dependencies:
34
+ - !ruby/object:Gem::Dependency
35
+ name: railties
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - - <
42
+ - !ruby/object:Gem::Version
43
+ version: '5.0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '3.0'
51
+ - - <
52
+ - !ruby/object:Gem::Version
53
+ version: '5.0'
54
+ description: Sortable control for jQuery.
55
+ email:
56
+ - v@gor.io
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - .gitignore
62
+ - Gemfile
63
+ - LICENSE
64
+ - README.md
65
+ - Rakefile
66
+ - certs/bai.pem
67
+ - jqeury-sortable-rails.gemspec
68
+ - lib/jquery-sortable-rails.rb
69
+ - lib/jquery-sortable-rails/version.rb
70
+ - vendor/assets/javascripts/jquery.sortable.js
71
+ homepage: http://github.com/bai/jquery-sortable-rails
72
+ licenses:
73
+ - MIT
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 2.0.3
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: Gemified jquery-sortable asset for Rails
95
+ test_files: []
@@ -0,0 +1,2 @@
1
+ t�1��?/(6>��x �syy����O�U#L�LCL��ȓ9<����$+ (��/V��[��g��b�?D��*�LHmՆG��.��iT����3����'����%� J�a��� �hj�{������:��L9��'SqÈ���D�ny�b3��Ҿ���Y��3OK�ܺЈM�t�)��3t����s�=!���+�?,W������0�
2
+ A [Ҏ̥�r��6�>w]�>��0���S��0\�׽#��&В��