gridster.js-rails 0.7.0 → 0.8.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: 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
  /**