diff options
author | mleibman <michael.leibman@gmail.com> | 2010-09-09 12:49:38 -0700 |
---|---|---|
committer | mleibman <michael.leibman@gmail.com> | 2010-09-09 12:49:38 -0700 |
commit | e768e395293da000c5d0e70e29bac3b458471eac (patch) | |
tree | 45d8a586dd147edd76822c3de2da95dcfe77d109 | |
parent | 978441963e9748050e55920767051911925ffc1f (diff) | |
download | SlickGrid-e768e395293da000c5d0e70e29bac3b458471eac.zip SlickGrid-e768e395293da000c5d0e70e29bac3b458471eac.tar.gz SlickGrid-e768e395293da000c5d0e70e29bac3b458471eac.tar.bz2 |
- CHANGED: removed unused files and added jquery.event.drop-2.9.min.js
- ADDED: new grid method "getCellFromEvent"
- ADDED: drag'n'drop example to "example9-row-reordering.html"
-rw-r--r-- | examples/example9-row-reordering.html | 150 | ||||
-rw-r--r-- | lib/jquery.event.drag.custom.js | 142 | ||||
-rw-r--r-- | lib/jquery.event.drop-2.0.min.js | 6 | ||||
-rw-r--r-- | slick.grid.js | 12 |
4 files changed, 140 insertions, 170 deletions
diff --git a/examples/example9-row-reordering.html b/examples/example9-row-reordering.html index b2e3ac4..827015d 100644 --- a/examples/example9-row-reordering.html +++ b/examples/example9-row-reordering.html @@ -17,6 +17,18 @@ cursor: move; background: url("../images/drag-handle.png") no-repeat center center; } + + .recycle-bin { + width: 120px; + border: 1px solid gray; + background: beige; + padding: 4px; + font-size: 12pt; + font-weight: bold; + color: black; + text-align: center; + -moz-border-radius: 10px; + } </style> </head> <body> @@ -31,7 +43,14 @@ <hr/> <div style="padding:6px;"> Click to select, Ctrl-click to toggle selection, Shift-click to select a range.<br/> - Drag one or more rows to reorder. + Drag one or more rows by the handle to reorder.<br/> + Drag one or more rows to the recycle bin to delete. + + <br/> + <br/> + <div id="dropzone" class="recycle-bin"> + Recycle Bin + </div> </div> </div> @@ -40,6 +59,7 @@ <script language="JavaScript" src="../lib/jquery-1.4.2.min.js"></script> <script language="JavaScript" src="../lib/jquery-ui-1.8.2.custom.min.js"></script> <script language="JavaScript" src="../lib/jquery.event.drag-2.0.min.js"></script> + <script language="JavaScript" src="../lib/jquery.event.drop-2.0.min.js"></script> <script language="JavaScript" src="../slick.editors.js"></script> <script language="JavaScript" src="../slick.grid.js"></script> @@ -48,32 +68,36 @@ var grid; var data = []; - var columns = [{ - id: "#", - name: "", - width: 40, - behavior: "selectAndMove", - unselectable: true, - resizable: false, - cssClass: "cell-reorder" - }, { - id: "name", - name: "Name", - field: "name", - width: 500, - cssClass: "cell-title", - editor: TextCellEditor, - validator: requiredFieldValidator - }, { - id: "complete", - name: "Complete", - width: 60, - cssClass: "cell-effort-driven", - field: "complete", - cannotTriggerInsert: true, - formatter: BoolCellFormatter, - editor: YesNoCheckboxCellEditor - }]; + var columns = [ + { + id: "#", + name: "", + width: 40, + behavior: "selectAndMove", + unselectable: true, + resizable: false, + cssClass: "cell-reorder dnd" + }, + { + id: "name", + name: "Name", + field: "name", + width: 500, + cssClass: "cell-title", + editor: TextCellEditor, + validator: requiredFieldValidator + }, + { + id: "complete", + name: "Complete", + width: 60, + cssClass: "cell-effort-driven", + field: "complete", + cannotTriggerInsert: true, + formatter: BoolCellFormatter, + editor: YesNoCheckboxCellEditor + } + ]; var options = { editable: true, @@ -107,7 +131,77 @@ grid = new Slick.Grid($("#myGrid"), data, columns, options); - grid.onAddNewRow = function addItem(newItem,columnDef) { + $("#myGrid") + .bind("draginit", function(e,dd) { + var cell = grid.getCellFromEvent(e); + if (!cell) + return false; + + dd.row = cell.row; + if (!data[dd.row]) + return false; + + if (Slick.GlobalEditorLock.isActive() && !Slick.GlobalEditorLock.cancelCurrentEdit()) + return false; + }) + .bind("dragstart", function(e,dd) { + var selectedRows = grid.getSelectedRows(); + + if (!selectedRows.length || $.inArray(dd.row,selectedRows) == -1) { + selectedRows = [dd.row]; + grid.setSelectedRows(selectedRows); + } + + dd.rows = selectedRows; + dd.count = selectedRows.length; + + var proxy = $("<span></span>") + .css({ + position: "absolute", + display: "inline-block", + padding: "4px 10px", + background: "#e0e0e0", + border: "1px solid gray", + "z-index": 99999, + "-moz-border-radius": "8px", + "-moz-box-shadow": "2px 2px 6px silver" + }) + .text("Drag to Recycle Bin to delete " + dd.count + " selected row(s)") + .appendTo("body"); + + dd.helper = proxy; + + $(dd.available).css("background","pink"); + + return proxy; + }) + .bind("drag", function(e,dd) { + dd.helper.css({top: e.pageY + 5, left: e.pageX + 5}); + }) + .bind("dragend", function(e,dd) { + dd.helper.remove(); + $(dd.available).css("background","beige"); + }); + + + $("#dropzone") + .bind("dropstart", function(e,dd) { + $(this).css("background","yellow"); + }) + .bind("dropend", function(e,dd) { + $(dd.available).css("background","pink"); + }) + .bind("drop", function(e,dd) { + var rowsToDelete = dd.rows.sort().reverse(); + for (var i=0; i<rowsToDelete.length; i++) { + data.splice(rowsToDelete[i],1); + } + grid.invalidate(); + grid.setSelectedRows([]); + }); + + + grid.onAddNewRow = function(newItem,columnDef) { var item = {name:"New task", complete: false}; $.extend(item,newItem); data.push(item); diff --git a/lib/jquery.event.drag.custom.js b/lib/jquery.event.drag.custom.js deleted file mode 100644 index c012ae0..0000000 --- a/lib/jquery.event.drag.custom.js +++ /dev/null @@ -1,142 +0,0 @@ -/** - * @license - * jquery.event.drag.js ~ v1.5 ~ Copyright (c) 2008, Three Dub Media (http://threedubmedia.com) - * Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-LICENSE.txt - */ -;(function($){ // secure $ jQuery alias -/*******************************************************************************************/ -// Created: 2008-06-04 | Updated: 2009-03-24 -/*******************************************************************************************/ -// Events: drag, dragstart, dragend -/*******************************************************************************************/ - -// jquery method -$.fn.drag = function( fn1, fn2, fn3 ){ - if ( fn2 ) this.bind('dragstart', fn1 ); // 2+ args - if ( fn3 ) this.bind('dragend', fn3 ); // 3 args - return !fn1 ? this.trigger('drag') // 0 args - : this.bind('drag', fn2 ? fn2 : fn1 ); // 1+ args - }; - -// local refs -var $event = $.event, $special = $event.special, - -// special event configuration -drag = $special.drag = { - not: ':input', // don't begin to drag on event.targets that match this selector - distance: 0, // distance dragged before dragstart - which: 1, // mouse button pressed to start drag sequence - dragging: false, // hold the active target element - setup: function( data ){ - data = $.extend({ - distance: drag.distance, - which: drag.which, - not: drag.not - }, data || {}); - data.distance = squared( data.distance ); // xІ + yІ = distanceІ - $event.add( this, "mousedown", handler, data ); - if ( this.attachEvent ) this.attachEvent("ondragstart", dontStart ); // prevent image dragging in IE... - }, - teardown: function(){ - $event.remove( this, "mousedown", handler ); - if ( this === drag.dragging ) drag.dragging = drag.proxy = false; // deactivate element - selectable( this, true ); // enable text selection - if ( this.detachEvent ) this.detachEvent("ondragstart", dontStart ); // prevent image dragging in IE... - } - }; - -// prevent normal event binding... -$special.dragstart = $special.dragend = { setup:function(){}, teardown:function(){} }; - -// handle drag-releatd DOM events -function handler ( event ){ - var elem = this, returned, data = event.data || {}; - // mousemove or mouseup - if ( data.elem ){ - // update event properties... - elem = event.dragTarget = data.elem; // drag source element - event.dragProxy = drag.proxy || elem; // proxy element or source - event.cursorOffsetX = data.pageX - data.left; // mousedown offset - event.cursorOffsetY = data.pageY - data.top; // mousedown offset - event.offsetX = event.pageX - event.cursorOffsetX; // element offset - event.offsetY = event.pageY - event.cursorOffsetY; // element offset - } - // mousedown, check some initial props to avoid the switch statement - else if ( drag.dragging || ( data.which>0 && event.which!=data.which ) || - $( event.target ).is( data.not ) ) return; - // handle various events - switch ( event.type ){ - // mousedown, left click, event.target is not restricted, init dragging - case 'mousedown': - returned = hijack(event, "beforedragstart", elem); - if (returned === false) - return true; - $.extend( data, $( elem ).offset(), { - elem: elem, target: event.target, - pageX: event.pageX, pageY: event.pageY - }); // store some initial attributes - $event.add( document, "mousemove mouseup", handler, data ); - selectable( elem, false ); // disable text selection - drag.dragging = null; // pending state - return false; // prevents text selection in safari - // mousemove, check distance, start dragging - case !drag.dragging && 'mousemove': - if ( squared( event.pageX-data.pageX ) - + squared( event.pageY-data.pageY ) // xІ + yІ = distanceІ - < data.distance ) break; // distance tolerance not reached - event.target = data.target; // force target from "mousedown" event (fix distance issue) - returned = hijack( event, "dragstart", elem ); // trigger "dragstart", return proxy element - if ( returned !== false ){ // "dragstart" not rejected - drag.dragging = elem; // activate element - drag.proxy = event.dragProxy = $( returned || elem )[0]; // set proxy - } - // mousemove, dragging - case 'mousemove': - if ( drag.dragging ){ - returned = hijack( event, "drag", elem ); // trigger "drag" - if ( $special.drop ){ // manage drop events - $special.drop.allowed = ( returned !== false ); // prevent drop - $special.drop.handler( event ); // "dropstart", "dropend" - } - if ( returned !== false ) break; // "drag" not rejected, stop - event.type = "mouseup"; // helps "drop" handler behave - } - // mouseup, stop dragging - case 'mouseup': - if (drag.dragging === false) break; - $event.remove( document, "mousemove mouseup", handler ); // remove page events - if ( drag.dragging ){ - if ( $special.drop ) $special.drop.handler( event ); // "drop" - hijack( event, "dragend", elem ); // trigger "dragend" - } - selectable( elem, true ); // enable text selection - drag.dragging = drag.proxy = data.elem = false; // deactivate element - break; - } - return true; - }; - -// set event type to custom value, and handle it -function hijack ( event, type, elem ){ - event.type = type; // force the event type - var result = $.event.handle.call( elem, event ); - return result===false ? false : result || event.result; - }; - -// return the value squared -function squared ( value ){ return Math.pow( value, 2 ); }; - -// suppress default dragstart IE events... -function dontStart(){ return ( drag.dragging === false ); }; - -// toggles text selection attributes -function selectable ( elem, bool ){ - if ( !elem ) return; // maybe element was removed ? - elem.unselectable = bool ? "off" : "on"; // IE - elem.onselectstart = function(){ return bool; }; // IE - //if ( document.selection && document.selection.empty ) document.selection.empty(); // IE - if ( elem.style ) elem.style.MozUserSelect = bool ? "" : "none"; // FF - }; - -/*******************************************************************************************/ -})( jQuery ); // confine scope
\ No newline at end of file diff --git a/lib/jquery.event.drop-2.0.min.js b/lib/jquery.event.drop-2.0.min.js new file mode 100644 index 0000000..b988575 --- /dev/null +++ b/lib/jquery.event.drop-2.0.min.js @@ -0,0 +1,6 @@ +/*! + * jquery.event.drop - v 2.0.0 + * Copyright (c) 2010 Three Dub Media - http://threedubmedia.com + * Open Source MIT License - http://threedubmedia.com/code/license + */ +;(function(f){f.fn.drop=function(c,a,d){var g=typeof c=="string"?c:"",e=f.isFunction(c)?c:f.isFunction(a)?a:null;if(g.indexOf("drop")!==0)g="drop"+g;d=(c==e?a:d)||{};return e?this.bind(g,d,e):this.trigger(g)};f.drop=function(c){c=c||{};b.multi=c.multi===true?Infinity:c.multi===false?1:!isNaN(c.multi)?c.multi:b.multi;b.delay=c.delay||b.delay;b.tolerance=f.isFunction(c.tolerance)?c.tolerance:c.tolerance===null?null:b.tolerance;b.mode=c.mode||b.mode||"intersect"};var l=f.event,i=l.special,b=f.event.special.drop= {multi:1,delay:20,mode:"overlap",targets:[],datakey:"dropdata",livekey:"livedrop",add:function(c){var a=f.data(this,b.datakey);a.related+=1;if(!a.live&&c.selector){a.live=true;l.add(this,"dropinit."+b.livekey,b.delegate)}},remove:function(){f.data(this,b.datakey).related-=1},setup:function(){if(!f.data(this,b.datakey)){f.data(this,b.datakey,{related:0,active:[],anyactive:0,winner:0,location:{}});b.targets.push(this)}},teardown:function(){if(!f.data(this,b.datakey).related){f.removeData(this,b.datakey); l.remove(this,"dropinit",b.delegate);var c=this;b.targets=f.grep(b.targets,function(a){return a!==c})}},handler:function(c,a){var d;if(a)switch(c.type){case "mousedown":d=f(b.targets);if(typeof a.drop=="string")d=d.filter(a.drop);d.each(function(){var g=f.data(this,b.datakey);g.active=[];g.anyactive=0;g.winner=0});a.droppable=d;b.delegates=[];i.drag.hijack(c,"dropinit",a);b.delegates=f.unique(i.drag.flatten(b.delegates));break;case "mousemove":b.event=c;b.timer||b.tolerate(a);break;case "mouseup":b.timer= clearTimeout(b.timer);if(a.propagates){i.drag.hijack(c,"drop",a);i.drag.hijack(c,"dropend",a);f.each(b.delegates||[],function(){l.remove(this,"."+b.livekey)})}break}},delegate:function(c){var a=[],d,g=f.data(this,"events")||{};f.each(g.live||[],function(e,h){if(h.preType.indexOf("drop")===0){d=f(c.currentTarget).find(h.selector);d.length&&d.each(function(){l.add(this,h.origType+"."+b.livekey,h.origHandler,h.data);f.inArray(this,a)<0&&a.push(this)})}});b.delegates.push(a);return a.length?f(a):false}, locate:function(c,a){var d=f.data(c,b.datakey),g=f(c),e=g.offset()||{},h=g.outerHeight();g=g.outerWidth();e={elem:c,width:g,height:h,top:e.top,left:e.left,right:e.left+g,bottom:e.top+h};if(d){d.location=e;d.index=a;d.elem=c}return e},contains:function(c,a){return(a[0]||a.left)>=c.left&&(a[0]||a.right)<=c.right&&(a[1]||a.top)>=c.top&&(a[1]||a.bottom)<=c.bottom},modes:{intersect:function(c,a,d){return this.contains(d,[c.pageX,c.pageY])?1E9:this.modes.overlap.apply(this,arguments)},overlap:function(c, a,d){return Math.max(0,Math.min(d.bottom,a.bottom)-Math.max(d.top,a.top))*Math.max(0,Math.min(d.right,a.right)-Math.max(d.left,a.left))},fit:function(c,a,d){return this.contains(d,a)?1:0},middle:function(c,a,d){return this.contains(d,[a.left+a.width*0.5,a.top+a.height*0.5])?1:0}},sort:function(c,a){return a.winner-c.winner||c.index-a.index},tolerate:function(c){var a,d,g,e,h,m,j=0,k,p=c.interactions.length,n=[b.event.pageX,b.event.pageY],o=b.tolerance||b.modes[b.mode];do if(k=c.interactions[j]){if(!k)return; k.drop=[];h=[];m=k.droppable.length;if(o)g=b.locate(k.proxy);a=0;do if(d=k.droppable[a]){e=f.data(d,b.datakey);if(d=e.location){e.winner=o?o.call(b,b.event,g,d):b.contains(d,n)?1:0;h.push(e)}}while(++a<m);h.sort(b.sort);a=0;do if(e=h[a])if(e.winner&&k.drop.length<b.multi){if(!e.active[j]&&!e.anyactive)if(i.drag.hijack(b.event,"dropstart",c,j,e.elem)[0]!==false){e.active[j]=1;e.anyactive+=1}else e.winner=0;e.winner&&k.drop.push(e.elem)}else if(e.active[j]&&e.anyactive==1){i.drag.hijack(b.event,"dropend", c,j,e.elem);e.active[j]=0;e.anyactive-=1}while(++a<m)}while(++j<p);if(b.last&&n[0]==b.last.pageX&&n[1]==b.last.pageY)delete b.timer;else b.timer=setTimeout(function(){b.tolerate(c)},b.delay);b.last=b.event}};i.dropinit=i.dropstart=i.dropend=b})(jQuery);
\ No newline at end of file diff --git a/slick.grid.js b/slick.grid.js index a1535d4..7f53536 100644 --- a/slick.grid.js +++ b/slick.grid.js @@ -1868,6 +1868,17 @@ if (!jQuery.fn.drag) { return {row:row,cell:cell-1}; } + function getCellFromEvent(e) { + var $cell = $(e.target).closest(".slick-cell", $canvas); + if (!$cell.length) + return null; + + return { + row: $cell.parent().attr("row") | 0, + cell: getSiblingIndex($cell[0]) + }; + } + function getCellNodeBox(row,cell) { if (!cellExists(row,cell)) return null; @@ -2446,6 +2457,7 @@ if (!jQuery.fn.drag) { "resizeCanvas": resizeCanvas, "updateRowCount": updateRowCount, "getCellFromPoint": getCellFromPoint, + "getCellFromEvent": getCellFromEvent, "getCurrentCell": getCurrentCell, "getCurrentCellNode": getCurrentCellNode, "resetCurrentCell": resetCurrentCell, |