gridster.js-rails 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 416287df3b47fc850ae26a9a6b47e3b9830417f3
4
- data.tar.gz: 0d16fadd272a19263a10d829ef267eeba4da5b08
3
+ metadata.gz: 1aeb46f070b5f67aaa802bf6fbed5b6c629dec55
4
+ data.tar.gz: 5c0d1fd00e3c7347959087207cefcac36a703531
5
5
  SHA512:
6
- metadata.gz: 9b1de84cec608241267a5d1c054f295b5a03cb6eb959d61e1da879c2197c05208599e219dcc686396b457907c197e47929740dfec60180ebb369ae1929c6a0ef
7
- data.tar.gz: b34476d3df6219ff6e8fec402681055767ad17a52a525242c7db87a8009660a10b2beb0b52bf62df6acc67659275a6a4960f63bba3f0acd8b5859cb6f7925317
6
+ metadata.gz: b56f060fcaf94d825e61fbcde42221ff187b0b24679d2f4200d966809ab8167734f085c7f9e9bfaf5977279954e0c8f89f7fa9e0b3e9233cc8f92f642855485e
7
+ data.tar.gz: '0397ceaa0ddea9437783af3f746257c03a24a034249f0f43b25eef8bf954ab927037822a7a1536d57d26ee594b247cf574dbc64481c12fd0fd5a8fa348ebaade'
@@ -1,3 +1,14 @@
1
+ <a name="v0.7.0"></a>
2
+ ## v0.7.0 (2016-02-26)
3
+
4
+
5
+ #### Bug Fixes
6
+
7
+ * Apply fix from #22 to vertical positioning ([dfc64916](http://github.com/dsmorse/gridster.js/commit/dfc649168c5b6a2a230b90a47e19621a6937fc7c))
8
+ * convert from JQury to DOM ([4936ef82](http://github.com/dsmorse/gridster.js/commit/4936ef82c04690fde118c3d54b798ceaf7c376e6))
9
+ * **fn.generate_stylesheet:** only return new stylesheet if colWidth and this.$wrapper.width() are > 0 ([f513793a](http://github.com/dsmorse/gridster.js/commit/f513793a8c0ec63509f6296325a8a7a6e34179f5))
10
+ * **gridster:** Add additiona error checking on widgets removal ([2b0f9963](http://github.com/dsmorse/gridster.js/commit/2b0f9963ef80c9acc6f66545eb53597836e2ebec))
11
+
1
12
  <a name="v0.6.10"></a>
2
13
  ### v0.6.10 (2015-05-31)
3
14
  * Add Ruby on Rails support
data/README.md CHANGED
@@ -28,6 +28,20 @@ As of result of the inactivity over the last year in the [Ducksboard](https://gi
28
28
  for current support. He will GLADLY accept pull requests, and will be working to merge existing
29
29
  Pull Requests from Ducksboard repo.
30
30
 
31
+ ## Install with NPM
32
+
33
+ This fork of Gridster can be installed via [NPM](https://npmjs.com/package/dsmorse-gridster);
34
+
35
+ ```
36
+ npm install dsmorse-gridster
37
+ ```
38
+
39
+ or to save.
40
+
41
+ ```
42
+ npm install dsmorse-gridster --save
43
+ ```
44
+
31
45
  ## Ruby on Rails integration
32
46
 
33
47
  This artifact is published to [rubygems.org](https://rubygems.org/gems/gridster.js-rails) to be consumed by ruby on rails applications.
data/bower.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "gridster",
3
3
  "homepage": "dsmorse.github.io/gridster.js/",
4
- "version": "0.7.0",
4
+ "version": "0.8.0",
5
5
  "dependencies": {
6
- "jquery": "^2.1.3"
6
+ "jquery": "2.1.3 - 3.99"
7
7
  },
8
8
  "devDependencies": {
9
9
  "requirejs": "^2.1.17",
@@ -1,5 +1,5 @@
1
1
  module Gridster
2
2
  module Rails
3
- VERSION = "0.7.0"
3
+ VERSION = "0.8.0"
4
4
  end
5
5
  end
@@ -1,8 +1,8 @@
1
1
  {
2
- "name": "gridster",
2
+ "name": "dsmorse-gridster",
3
3
  "title": "gridster.js",
4
4
  "description": "a drag-and-drop multi-column jQuery grid plugin",
5
- "version": "0.7.0",
5
+ "version": "0.8.0",
6
6
  "homepage": "https://dsmorse.github.io/gridster.js/",
7
7
  "author": {
8
8
  "name": "ducksboard"
@@ -32,7 +32,7 @@
32
32
  "grunt-contrib-cssmin": "~0.10.0",
33
33
  "grunt-contrib-jshint": "~0.10.0",
34
34
  "grunt-contrib-less": "^1.2.0",
35
- "grunt-contrib-qunit": "^0.7.0",
35
+ "grunt-contrib-qunit": "^2.0.0",
36
36
  "grunt-contrib-uglify": "~0.6.0",
37
37
  "grunt-contrib-watch": "~0.6.1",
38
38
  "grunt-contrib-yuidoc": "~0.7.0",
@@ -0,0 +1 @@
1
+ /*! gridster.js - v0.8.0 - 2018-07-24 - * https://dsmorse.github.io/gridster.js/ - Copyright (c) 2018 ducksboard; Licensed MIT */ !function(a,b){"use strict";"object"==typeof exports?module.exports=b(require("jquery")):"function"==typeof define&&define.amd?define("gridster-collision",["jquery","gridster-coords"],b):a.GridsterCollision=b(a.$||a.jQuery,a.GridsterCoords)}(this,function(a,b){"use strict";function c(b,c,e){this.options=a.extend(d,e),this.$element=b,this.last_colliders=[],this.last_colliders_coords=[],this.set_colliders(c),this.init()}var d={colliders_context:document.body,overlapping_region:"C"};c.defaults=d;var e=c.prototype;return e.init=function(){this.find_collisions()},e.overlaps=function(a,b){var c=!1,d=!1;return(b.x1>=a.x1&&b.x1<=a.x2||b.x2>=a.x1&&b.x2<=a.x2||a.x1>=b.x1&&a.x2<=b.x2)&&(c=!0),(b.y1>=a.y1&&b.y1<=a.y2||b.y2>=a.y1&&b.y2<=a.y2||a.y1>=b.y1&&a.y2<=b.y2)&&(d=!0),c&&d},e.detect_overlapping_region=function(a,b){var c="",d="";return a.y1>b.cy&&a.y1<b.y2&&(c="N"),a.y2>b.y1&&a.y2<b.cy&&(c="S"),a.x1>b.cx&&a.x1<b.x2&&(d="W"),a.x2>b.x1&&a.x2<b.cx&&(d="E"),c+d||"C"},e.calculate_overlapped_area_coords=function(b,c){var d=Math.max(b.x1,c.x1),e=Math.max(b.y1,c.y1),f=Math.min(b.x2,c.x2),g=Math.min(b.y2,c.y2);return a({left:d,top:e,width:f-d,height:g-e}).coords().get()},e.calculate_overlapped_area=function(a){return a.width*a.height},e.manage_colliders_start_stop=function(b,c,d){for(var e=this.last_colliders_coords,f=0,g=e.length;g>f;f++)-1===a.inArray(e[f],b)&&c.call(this,e[f]);for(var h=0,i=b.length;i>h;h++)-1===a.inArray(b[h],e)&&d.call(this,b[h])},e.find_collisions=function(b){for(var c=this,d=this.options.overlapping_region,e=[],f=[],g=this.colliders||this.$colliders,h=g.length,i=c.$element.coords().update(b||!1).get();h--;){var j=c.$colliders?a(g[h]):g[h],k=j.isCoords?j:j.coords(),l=k.get(),m=c.overlaps(i,l);if(m){var n=c.detect_overlapping_region(i,l);if(n===d||"all"===d){var o=c.calculate_overlapped_area_coords(i,l),p=c.calculate_overlapped_area(o);if(0!==p){var q={area:p,area_coords:o,region:n,coords:l,player_coords:i,el:j};c.options.on_overlap&&c.options.on_overlap.call(this,q),e.push(k),f.push(q)}}}}return(c.options.on_overlap_stop||c.options.on_overlap_start)&&this.manage_colliders_start_stop(e,c.options.on_overlap_start,c.options.on_overlap_stop),this.last_colliders_coords=e,f},e.get_closest_colliders=function(a){var b=this.find_collisions(a);return b.sort(function(a,b){return"C"===a.region&&"C"===b.region?a.coords.y1<b.coords.y1||a.coords.x1<b.coords.x1?-1:1:(a.area<b.area,1)}),b},e.set_colliders=function(b){"string"==typeof b||b instanceof a?this.$colliders=a(b,this.options.colliders_context).not(this.$element):this.colliders=a(b)},a.fn.collision=function(a,b){return new c(this,a,b)},c});
@@ -0,0 +1 @@
1
+ /*! gridster.js - v0.8.0 - 2018-07-24 - * https://dsmorse.github.io/gridster.js/ - Copyright (c) 2018 ducksboard; Licensed MIT */ !function(a,b){"use strict";"object"==typeof exports?module.exports=b(require("jquery")):"function"==typeof define&&define.amd?define("gridster-coords",["jquery"],b):a.GridsterCoords=b(a.$||a.jQuery)}(this,function(a){"use strict";function b(b){return b[0]&&a.isPlainObject(b[0])?this.data=b[0]:this.el=b,this.isCoords=!0,this.coords={},this.init(),this}var c=b.prototype;return c.init=function(){this.set(),this.original_coords=this.get()},c.set=function(a,b){var c=this.el;if(c&&!a&&(this.data=c.offset(),this.data.width=c[0].scrollWidth,this.data.height=c[0].scrollHeight),c&&a&&!b){var d=c.offset();this.data.top=d.top,this.data.left=d.left}var e=this.data;return void 0===e.left&&(e.left=e.x1),void 0===e.top&&(e.top=e.y1),this.coords.x1=e.left,this.coords.y1=e.top,this.coords.x2=e.left+e.width,this.coords.y2=e.top+e.height,this.coords.cx=e.left+e.width/2,this.coords.cy=e.top+e.height/2,this.coords.width=e.width,this.coords.height=e.height,this.coords.el=c||!1,this},c.update=function(b){if(!b&&!this.el)return this;if(b){var c=a.extend({},this.data,b);return this.data=c,this.set(!0,!0)}return this.set(!0),this},c.get=function(){return this.coords},c.destroy=function(){this.el.removeData("coords"),delete this.el},a.fn.coords=function(){if(this.data("coords"))return this.data("coords");var a=new b(this);return this.data("coords",a),a},b});
@@ -0,0 +1 @@
1
+ /*! gridster.js - v0.8.0 - 2018-07-24 - * https://dsmorse.github.io/gridster.js/ - Copyright (c) 2018 ducksboard; Licensed MIT */ !function(a,b){"use strict";"object"==typeof exports?module.exports=b(require("jquery")):"function"==typeof define&&define.amd?define("gridster-draggable",["jquery"],b):a.GridsterDraggable=b(a.$||a.jQuery)}(this,function(a){"use strict";function b(b,d){this.options=a.extend({},c,d),this.$document=a(document),this.$container=a(b),this.$scroll_container=this.options.scroll_container===window?a(window):this.$container.closest(this.options.scroll_container),this.is_dragging=!1,this.player_min_left=0+this.options.offset_left,this.player_min_top=0+this.options.offset_top,this.id=i(),this.ns=".gridster-draggable-"+this.id,this.init()}var c={items:"li",distance:1,limit:{width:!0,height:!1},offset_left:0,autoscroll:!0,ignore_dragging:["INPUT","TEXTAREA","SELECT","BUTTON"],handle:null,container_width:0,move_element:!0,helper:!1,remove_helper:!0},d=a(window),e={x:"left",y:"top"},f=!!("ontouchstart"in window),g=function(a){return a.charAt(0).toUpperCase()+a.slice(1)},h=0,i=function(){return++h+""};b.defaults=c;var j=b.prototype;return j.init=function(){var b=this.$container.css("position");this.calculate_dimensions(),this.$container.css("position","static"===b?"relative":b),this.disabled=!1,this.events(),d.bind(this.nsEvent("resize"),throttle(a.proxy(this.calculate_dimensions,this),200))},j.nsEvent=function(a){return(a||"")+this.ns},j.events=function(){this.pointer_events={start:this.nsEvent("touchstart")+" "+this.nsEvent("mousedown"),move:this.nsEvent("touchmove")+" "+this.nsEvent("mousemove"),end:this.nsEvent("touchend")+" "+this.nsEvent("mouseup")},this.$container.on(this.nsEvent("selectstart"),a.proxy(this.on_select_start,this)),this.$container.on(this.pointer_events.start,this.options.items,a.proxy(this.drag_handler,this)),this.$document.on(this.pointer_events.end,a.proxy(function(a){this.is_dragging=!1,this.disabled||(this.$document.off(this.pointer_events.move),this.drag_start&&this.on_dragstop(a))},this))},j.get_actual_pos=function(a){return a.position()},j.get_mouse_pos=function(a){if(a.originalEvent&&a.originalEvent.touches){var b=a.originalEvent;a=b.touches.length?b.touches[0]:b.changedTouches[0]}return{left:a.clientX,top:a.clientY}},j.get_offset=function(a){a.preventDefault();var b=this.get_mouse_pos(a),c=Math.round(b.left-this.mouse_init_pos.left),d=Math.round(b.top-this.mouse_init_pos.top),e=Math.round(this.el_init_offset.left+c-this.baseX+this.$scroll_container.scrollLeft()-this.scroll_container_offset_x),f=Math.round(this.el_init_offset.top+d-this.baseY+this.$scroll_container.scrollTop()-this.scroll_container_offset_y);return this.options.limit.width&&(e>this.player_max_left?e=this.player_max_left:e<this.player_min_left&&(e=this.player_min_left)),this.options.limit.height&&(f>this.player_max_top?f=this.player_max_top:f<this.player_min_top&&(f=this.player_min_top)),{position:{left:e,top:f},pointer:{left:b.left,top:b.top,diff_left:c+(this.$scroll_container.scrollLeft()-this.scroll_container_offset_x),diff_top:d+(this.$scroll_container.scrollTop()-this.scroll_container_offset_y)}}},j.get_drag_data=function(a){var b=this.get_offset(a);return b.$player=this.$player,b.$helper=this.helper?this.$helper:this.$player,b},j.set_limits=function(a){return a||(a=this.$container.width()),this.player_max_left=a-this.player_width+-this.options.offset_left,this.player_max_top=this.options.container_height-this.player_height+-this.options.offset_top,this.options.container_width=a,this},j.scroll_in=function(a,b){var c,d=e[a],f=50,h=30,i="scroll"+g(d),j="x"===a,k=j?this.scroller_width:this.scroller_height;c=this.$scroll_container===window?j?this.$scroll_container.width():this.$scroll_container.height():j?this.$scroll_container[0].scrollWidth:this.$scroll_container[0].scrollHeight;var l,m=j?this.$player.width():this.$player.height(),n=this.$scroll_container[i](),o=n,p=o+k,q=p-f,r=o+f,s=o+b.pointer[d],t=c-k+m;return s>=q&&(l=n+h,t>l&&(this.$scroll_container[i](l),this["scroll_offset_"+a]+=h)),r>=s&&(l=n-h,l>0&&(this.$scroll_container[i](l),this["scroll_offset_"+a]-=h)),this},j.manage_scroll=function(a){this.scroll_in("x",a),this.scroll_in("y",a)},j.calculate_dimensions=function(){this.scroller_height=this.$scroll_container.height(),this.scroller_width=this.$scroll_container.width()},j.drag_handler=function(b){if(!this.disabled&&(1===b.which||f)&&!this.ignore_drag(b)){var c=this,d=!0;return this.$player=a(b.currentTarget),this.el_init_pos=this.get_actual_pos(this.$player),this.mouse_init_pos=this.get_mouse_pos(b),this.offsetY=this.mouse_init_pos.top-this.el_init_pos.top,this.$document.on(this.pointer_events.move,function(a){var b=c.get_mouse_pos(a),e=Math.abs(b.left-c.mouse_init_pos.left),f=Math.abs(b.top-c.mouse_init_pos.top);return e>c.options.distance||f>c.options.distance?d?(d=!1,c.on_dragstart.call(c,a),!1):(c.is_dragging===!0&&c.on_dragmove.call(c,a),!1):!1}),f?void 0:!1}},j.on_dragstart=function(a){if(a.preventDefault(),this.is_dragging)return this;this.drag_start=this.is_dragging=!0;var b=this.$container.offset();return this.baseX=Math.round(b.left),this.baseY=Math.round(b.top),"clone"===this.options.helper?(this.$helper=this.$player.clone().appendTo(this.$container).addClass("helper"),this.helper=!0):this.helper=!1,this.scroll_container_offset_y=this.$scroll_container.scrollTop(),this.scroll_container_offset_x=this.$scroll_container.scrollLeft(),this.el_init_offset=this.$player.offset(),this.player_width=this.$player.width(),this.player_height=this.$player.height(),this.set_limits(this.options.container_width),this.options.start&&this.options.start.call(this.$player,a,this.get_drag_data(a)),!1},j.on_dragmove=function(a){var b=this.get_drag_data(a);this.options.autoscroll&&this.manage_scroll(b),this.options.move_element&&(this.helper?this.$helper:this.$player).css({position:"absolute",left:b.position.left,top:b.position.top});var c=this.last_position||b.position;return b.prev_position=c,this.options.drag&&this.options.drag.call(this.$player,a,b),this.last_position=b.position,!1},j.on_dragstop=function(a){var b=this.get_drag_data(a);return this.drag_start=!1,this.options.stop&&this.options.stop.call(this.$player,a,b),this.helper&&this.options.remove_helper&&this.$helper.remove(),!1},j.on_select_start=function(a){return this.disabled||this.ignore_drag(a)?void 0:!1},j.enable=function(){this.disabled=!1},j.disable=function(){this.disabled=!0},j.destroy=function(){this.disable(),this.$container.off(this.ns),this.$document.off(this.ns),d.off(this.ns),a.removeData(this.$container,"drag")},j.ignore_drag=function(b){return this.options.handle?!a(b.target).is(this.options.handle):a.isFunction(this.options.ignore_dragging)?this.options.ignore_dragging(b):this.options.resize?!a(b.target).is(this.options.items):a(b.target).is(this.options.ignore_dragging.join(", "))},a.fn.gridDraggable=function(a){return new b(this,a)},a.fn.dragg=function(c){return this.each(function(){a.data(this,"drag")||a.data(this,"drag",new b(this,c))})},b});
@@ -1,6 +1,6 @@
1
- /*! gridster.js - v0.7.0 - 2016-02-26
1
+ /*! gridster.js - v0.8.0 - 2018-07-24
2
2
  * https://dsmorse.github.io/gridster.js/
3
- * Copyright (c) 2016 ducksboard; Licensed MIT */
3
+ * Copyright (c) 2018 ducksboard; Licensed MIT */
4
4
 
5
5
  ;(function(root, factory) {
6
6
  'use strict';
@@ -471,7 +471,7 @@
471
471
  var defaults = {
472
472
  items: 'li',
473
473
  distance: 1,
474
- limit: true,
474
+ limit: {width: true, height: false},
475
475
  offset_left: 0,
476
476
  autoscroll: true,
477
477
  ignore_dragging: ['INPUT', 'TEXTAREA', 'SELECT', 'BUTTON'], // or function
@@ -535,6 +535,7 @@
535
535
  $(window) : this.$container.closest(this.options.scroll_container);
536
536
  this.is_dragging = false;
537
537
  this.player_min_left = 0 + this.options.offset_left;
538
+ this.player_min_top = 0 + this.options.offset_top;
538
539
  this.id = uniqId();
539
540
  this.ns = '.gridster-draggable-' + this.id;
540
541
  this.init();
@@ -616,12 +617,19 @@
616
617
  this.$scroll_container.scrollTop() -
617
618
  this.scroll_container_offset_y);
618
619
 
619
- if (this.options.limit) {
620
+ if (this.options.limit.width) {
620
621
  if (left > this.player_max_left) {
621
622
  left = this.player_max_left;
622
623
  } else if(left < this.player_min_left) {
623
624
  left = this.player_min_left;
624
625
  }
626
+ }
627
+ if (this.options.limit.height) {
628
+ if (top > this.player_max_top) {
629
+ top = this.player_max_top;
630
+ } else if (top < this.player_min_top) {
631
+ top = this.player_min_top;
632
+ }
625
633
  }
626
634
 
627
635
  return {
@@ -653,7 +661,9 @@
653
661
  fn.set_limits = function(container_width) {
654
662
  container_width || (container_width = this.$container.width());
655
663
  this.player_max_left = (container_width - this.player_width +
656
- - this.options.offset_left);
664
+ -this.options.offset_left);
665
+ this.player_max_top = (this.options.container_height - this.player_height +
666
+ -this.options.offset_top);
657
667
 
658
668
  this.options.container_width = container_width;
659
669
 
@@ -793,6 +803,7 @@
793
803
  this.scroll_container_offset_x = this.$scroll_container.scrollLeft();
794
804
  this.el_init_offset = this.$player.offset();
795
805
  this.player_width = this.$player.width();
806
+ this.player_height = this.$player.height();
796
807
 
797
808
  this.set_limits(this.options.container_width);
798
809
 
@@ -929,6 +940,10 @@
929
940
  extra_cols: 0,
930
941
  min_cols: 1,
931
942
  max_cols: Infinity,
943
+ limit: {
944
+ width: true,
945
+ height: false
946
+ },
932
947
  min_rows: 1,
933
948
  max_rows: 15,
934
949
  autogenerate_stylesheet: true,
@@ -977,7 +992,8 @@
977
992
  handle_class: 'gs-resize-handle',
978
993
  max_size: [Infinity, Infinity],
979
994
  min_size: [1, 1]
980
- }
995
+ },
996
+ ignore_self_occupied: false
981
997
  };
982
998
 
983
999
  /**
@@ -1090,7 +1106,12 @@
1090
1106
 
1091
1107
  this.generated_stylesheets = [];
1092
1108
  this.$style_tags = $([]);
1093
-
1109
+
1110
+ if (typeof (this.options.limit) === typeof (true)) {
1111
+ console.log('limit: bool is deprecated, consider using limit: { width: boolean, height: boolean} instead');
1112
+ this.options.limit = { width: this.options.limit, height: this.options.limit };
1113
+ }
1114
+
1094
1115
  this.options.auto_init && this.init();
1095
1116
  }
1096
1117
 
@@ -1311,6 +1332,10 @@
1311
1332
 
1312
1333
  if (!col && !row) {
1313
1334
  pos = this.next_position(size_x, size_y);
1335
+ if(pos === false)
1336
+ {
1337
+ return false;
1338
+ }
1314
1339
  } else {
1315
1340
  pos = {
1316
1341
  col: col,
@@ -1767,22 +1792,24 @@
1767
1792
 
1768
1793
  this.update_widget_dimensions($widget, new_wgd);
1769
1794
 
1770
- if (empty_cols.length) {
1771
- var cols_to_remove_holes = [
1772
- empty_cols[0], new_wgd.row,
1773
- empty_cols[empty_cols.length - 1] - empty_cols[0] + 1,
1774
- Math.min(old_size_y, new_wgd.size_y),
1775
- $widget
1776
- ];
1795
+ if (this.options.shift_widgets_up) {
1796
+ if (empty_cols.length) {
1797
+ var cols_to_remove_holes = [
1798
+ empty_cols[0], new_wgd.row,
1799
+ empty_cols[empty_cols.length - 1] - empty_cols[0] + 1,
1800
+ Math.min(old_size_y, new_wgd.size_y),
1801
+ $widget
1802
+ ];
1777
1803
 
1778
- this.remove_empty_cells.apply(this, cols_to_remove_holes);
1779
- }
1804
+ this.remove_empty_cells.apply(this, cols_to_remove_holes);
1805
+ }
1780
1806
 
1781
- if (empty_rows.length) {
1782
- var rows_to_remove_holes = [
1783
- new_wgd.col, new_wgd.row, new_wgd.size_x, new_wgd.size_y, $widget
1784
- ];
1785
- this.remove_empty_cells.apply(this, rows_to_remove_holes);
1807
+ if (empty_rows.length) {
1808
+ var rows_to_remove_holes = [
1809
+ new_wgd.col, new_wgd.row, new_wgd.size_x, new_wgd.size_y, $widget
1810
+ ];
1811
+ this.remove_empty_cells.apply(this, rows_to_remove_holes);
1812
+ }
1786
1813
  }
1787
1814
 
1788
1815
  this.move_widget_up($widget);
@@ -2206,7 +2233,8 @@
2206
2233
  offset_left: this.options.widget_margins[0],
2207
2234
  offset_top: this.options.widget_margins[1],
2208
2235
  container_width: (this.cols * this.min_widget_width) + ((this.cols + 1) * this.options.widget_margins[0]),
2209
- limit: true,
2236
+ container_height: (this.rows * this.min_widget_height) + ((this.rows + 1) * this.options.widget_margins[0]),
2237
+ limit: { width: this.options.limit.width, height: this.options.limit.height },
2210
2238
  start: function (event, ui) {
2211
2239
  self.$widgets.filter('.player-revert')
2212
2240
  .removeClass('player-revert');
@@ -2247,7 +2275,7 @@
2247
2275
  container_width: this.container_width,
2248
2276
  move_element: false,
2249
2277
  resize: true,
2250
- limit: this.options.max_cols !== Infinity,
2278
+ limit: { width: this.options.max_cols !== Infinity || this.options.limit.width, height: this.options.max_rows !== Infinity || this.options.limit.height },
2251
2279
  scroll_container: this.options.scroll_container,
2252
2280
  start: $.proxy(this.on_start_resize, this),
2253
2281
  stop: $.proxy(function (event, ui) {
@@ -2304,10 +2332,12 @@
2304
2332
  this.player_grid_data = this.$player.coords().grid;
2305
2333
  this.placeholder_grid_data = $.extend({}, this.player_grid_data);
2306
2334
 
2307
- this.set_dom_grid_height(this.$el.height() +
2308
- (this.player_grid_data.size_y * this.min_widget_height));
2309
-
2310
- this.set_dom_grid_width(this.cols);
2335
+ var highestRow = this.get_highest_occupied_cell().row;
2336
+ if ((highestRow + this.player_grid_data.size_y) <= this.options.max_rows)
2337
+ {
2338
+ this.set_dom_grid_height(this.$el.height() + (this.player_grid_data.size_y * this.min_widget_height));
2339
+ }
2340
+ this.set_dom_grid_width(this.cols);
2311
2341
 
2312
2342
  var pgd_sizex = this.player_grid_data.size_x;
2313
2343
  var cols_diff = this.cols - this.highest_col;
@@ -2435,23 +2465,27 @@
2435
2465
  this.$changed = this.$changed.add(this.$player);
2436
2466
 
2437
2467
  //If widget has new position, clean previous grid
2438
- if (this.placeholder_grid_data.el.coords().grid.col !== this.placeholder_grid_data.col ||
2439
- this.placeholder_grid_data.el.coords().grid.row !== this.placeholder_grid_data.row) {
2440
- this.update_widget_position(this.placeholder_grid_data.el.coords().grid, false);
2441
-
2442
- // move the cells down if there is an overlap and we are in static mode
2443
- if (this.options.collision.wait_for_mouseup) {
2444
- this.for_each_cell_occupied(this.placeholder_grid_data, function (tcol, trow) {
2445
- if (this.is_widget(tcol, trow)) {
2446
- // get number of cells to move
2447
- var destinyRow = this.placeholder_grid_data.row + this.placeholder_grid_data.size_y;
2468
+ var grid = this.placeholder_grid_data.el.coords().grid;
2469
+ if (grid.col !== this.placeholder_grid_data.col || grid.row !== this.placeholder_grid_data.row) {
2470
+ this.update_widget_position(grid, false);
2471
+
2472
+ // move the cells down if there is an overlap and we are in static mode
2473
+ if (this.options.collision.wait_for_mouseup) {
2474
+ this.for_each_cell_occupied(this.placeholder_grid_data, function (tcol, trow) {
2475
+ if (this.is_widget(tcol, trow)) {
2476
+ // get number of cells to move
2477
+ var destinyRow = this.placeholder_grid_data.row + this.placeholder_grid_data.size_y;
2478
+
2448
2479
  var currentOverlappedRow = parseInt(this.gridmap[tcol][trow][0].getAttribute('data-row'));
2449
2480
  var cellsToMove = destinyRow - currentOverlappedRow;
2450
- this.move_widget_down(this.is_widget(tcol, trow), cellsToMove);
2451
- }
2452
- });
2453
- }
2454
- }
2481
+ var failed = !this.move_widget_down(this.is_widget(tcol, trow), cellsToMove);
2482
+ if (failed) {
2483
+ this.set_placeholder(this.placeholder_grid_data.el.coords().grid.col, this.placeholder_grid_data.el.coords().grid.row);
2484
+ }
2485
+ }
2486
+ });
2487
+ }
2488
+ }
2455
2489
 
2456
2490
  this.cells_occupied_by_player = this.get_cells_occupied(this.placeholder_grid_data);
2457
2491
 
@@ -3231,9 +3265,7 @@
3231
3265
  */
3232
3266
  fn.is_empty = function (col, row) {
3233
3267
  if (typeof this.gridmap[col] !== 'undefined') {
3234
- if (typeof this.gridmap[col][row] !== 'undefined' &&
3235
- this.gridmap[col][row] === false
3236
- ) {
3268
+ if (!this.gridmap[col][row]) {
3237
3269
  return true;
3238
3270
  }
3239
3271
  return false;
@@ -3301,7 +3333,15 @@
3301
3333
  return false;
3302
3334
  }
3303
3335
 
3336
+ // Consider player cell as not occupied (i.e. awailable for swap) if it is occupied by player
3337
+ if (this.is_player(col, row)) {
3338
+ return false;
3339
+ }
3340
+
3304
3341
  if (this.gridmap[col][row]) {
3342
+ if(this.options.ignore_self_occupied) {
3343
+ return this.$player.data() !== $(this.gridmap[col][row]).data();
3344
+ }
3305
3345
  return true;
3306
3346
  }
3307
3347
  return false;
@@ -3925,6 +3965,10 @@
3925
3965
 
3926
3966
  el_grid_data = $widget.coords().grid;
3927
3967
  actual_row = el_grid_data.row;
3968
+ if (actual_row + ($widget.coords().grid.size_y - 1) + y_units > this.options.max_rows)
3969
+ {
3970
+ return false;
3971
+ }
3928
3972
  moved = [];
3929
3973
  y_diff = y_units;
3930
3974
 
@@ -3932,24 +3976,32 @@
3932
3976
  return false;
3933
3977
  }
3934
3978
 
3979
+ this.failed = false;
3935
3980
  if ($.inArray($widget, moved) === -1) {
3936
3981
 
3937
3982
  var widget_grid_data = $widget.coords().grid;
3938
3983
  var next_row = actual_row + y_units;
3939
3984
  var $next_widgets = this.widgets_below($widget);
3940
3985
 
3941
- this.remove_from_gridmap(widget_grid_data);
3986
+ //this.remove_from_gridmap(widget_grid_data);
3942
3987
 
3943
- $next_widgets.each($.proxy(function (i, widget) {
3944
- var $w = $(widget);
3945
- var wd = $w.coords().grid;
3946
- var tmp_y = this.displacement_diff(
3947
- wd, widget_grid_data, y_diff);
3988
+ $next_widgets.each($.proxy(function (i, widget) {
3989
+ if (this.failed !== true) {
3990
+ var $w = $(widget);
3991
+ var wd = $w.coords().grid;
3992
+ var tmp_y = this.displacement_diff(
3993
+ wd, widget_grid_data, y_diff);
3948
3994
 
3949
- if (tmp_y > 0) {
3950
- this.move_widget_down($w, tmp_y);
3951
- }
3995
+ if (tmp_y > 0) {
3996
+ this.failed = this.move_widget_down($w, tmp_y) === false;
3997
+ }
3998
+ }
3952
3999
  }, this));
4000
+ if (this.failed)
4001
+ {
4002
+ return false;
4003
+ }
4004
+ this.remove_from_gridmap(widget_grid_data);
3953
4005
 
3954
4006
  widget_grid_data.row = next_row;
3955
4007
  this.update_widget_position(widget_grid_data, $widget);
@@ -3958,6 +4010,7 @@
3958
4010
 
3959
4011
  moved.push($widget);
3960
4012
  }
4013
+ return true;
3961
4014
  };
3962
4015
 
3963
4016
 
@@ -4976,7 +5029,7 @@
4976
5029
  };
4977
5030
 
4978
5031
  fn.get_num_widgets = function () {
4979
- return this.$widgets.size();
5032
+ return this.$widgets.length;
4980
5033
  };
4981
5034
 
4982
5035
  /**
@@ -5010,6 +5063,34 @@
5010
5063
  this.drag_api.set_limits((this.cols * this.min_widget_width) + ((this.cols + 1) * this.options.widget_margins[0]));
5011
5064
  }
5012
5065
  };
5066
+
5067
+ fn.set_new_num_rows = function (rows) {
5068
+ var max_rows = this.options.max_rows;
5069
+
5070
+ var actual_rows = this.$widgets.map(function () {
5071
+ return $(this).attr('data-row');
5072
+ }).get();
5073
+
5074
+ actual_rows.length || (actual_rows = [0]);
5075
+
5076
+ var min_rows = Math.max.apply(Math, actual_rows);
5077
+
5078
+ this.rows = Math.max(min_rows, rows, this.options.min_rows);
5079
+
5080
+ if (max_rows !== Infinity && (max_rows < min_rows || max_rows < this.rows)) {
5081
+ max_rows = this.rows;
5082
+ }
5083
+ this.min_rows = min_rows;
5084
+ this.max_rows = max_rows;
5085
+ this.options.max_rows = max_rows;
5086
+ var height = (this.rows * this.min_widget_height) + ((this.rows + 1) * this.options.widget_margins[1]);
5087
+
5088
+ if (this.drag_api) {
5089
+ this.drag_api.options.container_height = height;
5090
+ }
5091
+ this.container_height = height;
5092
+ this.generate_faux_grid(this.rows, this.cols);
5093
+ };
5013
5094
 
5014
5095
 
5015
5096
  /**