treegrid-dnd.js
(function($){
$.extend($.fn.treegrid.defaults, {
onBeforeDrag: function(row){}, // return false to deny drag
onStartDrag: function(row){},
onStopDrag: function(row){},
onDragEnter: function(targetRow, sourceRow){}, // return false to deny drop
onDragOver: function(targetRow, sourceRow){}, // return false to deny drop
onDragLeave: function(targetRow, sourceRow){},
onBeforeDrop: function(targetRow, sourceRow, point){},
onDrop: function(targetRow, sourceRow, point){} // point:'append','top','bottom'
});
$.extend($.fn.treegrid.methods, {
disableDnd:function(jq,id){
return jq.each(function() {
var target = this;
var state = $.data(this, 'treegrid');
state.disabledNodes = [];
var t = $(this);
var opts = state.options;
if (id) {
var nodes = opts.finder.getTr(target, id);
var rows = t.treegrid('getChildren', id);
for (var i = 0; i < rows.length; i++) {
nodes = nodes.add(opts.finder.getTr(target, rows[i][opts.idField]));
}
} else {
var nodes = t.treegrid('getPanel').find('tr[node-id]');
}
nodes.draggable({
disabled: true,
revert: true,
cursor: 'pointer'});
});
}
});
$.extend($.fn.treegrid.methods, {
enableDnd: function(jq, id){
if (!$('#treegrid-dnd-style').length){
$('head').append(
'<style id="treegrid-dnd-style">' +
'.treegrid-row-top td{border-top:1px solid red}' +
'.treegrid-row-bottom td{border-bottom:1px solid red}' +
'.treegrid-row-append .tree-title{border:1px solid red}' +
'</style>'
);
}
return jq.each(function(){
var target = this;
var state = $.data(this, 'treegrid');
state.disabledNodes = [];
var t = $(this);
var opts = state.options;
if (id){
var nodes = opts.finder.getTr(target, id);
var rows = t.treegrid('getChildren', id);
for(var i=0; i<rows.length; i++){
nodes = nodes.add(opts.finder.getTr(target, rows[i][opts.idField]));
}
} else {
var nodes = t.treegrid('getPanel').find('tr[node-id]');
}
nodes.draggable({
disabled:false,
revert:true,
cursor:'pointer',
proxy: function(source){
var row = t.treegrid('find', $(source).attr('node-id'));
var p = $('<div class="tree-node-proxy"></div>').appendTo('body');
p.html('<span class="tree-dnd-icon tree-dnd-no"> </span>'+row[opts.treeField]);
p.hide();
return p;
},
deltaX: 15,
deltaY: 15,
onBeforeDrag:function(e){
if (opts.onBeforeDrag.call(target, getRow(this)) == false){return false}
if ($(e.target).hasClass('tree-hit') || $(e.target).parent().hasClass('datagrid-cell-check')){return false;}
if (e.which != 1){return false;}
$(this).next('tr.treegrid-tr-tree').find('tr[node-id]').droppable({accept:'no-accept'});
// var tr = opts.finder.getTr(target, $(this).attr('node-id'));
// var treeTitle = tr.find('span.tree-title');
// e.data.startX = treeTitle.offset().left;
// e.data.startY = treeTitle.offset().top;
// e.data.offsetWidth = 0;
// e.data.offsetHeight = 0;
},
onStartDrag:function(){
$(this).draggable('proxy').css({
left:-10000,
top:-10000
});
var row = getRow(this);
opts.onStartDrag.call(target, row);
state.draggingNodeId = row[opts.idField];
},
onDrag:function(e){
var x1=e.pageX,y1=e.pageY,x2=e.data.startX,y2=e.data.startY;
var d = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
if (d>3){ // when drag a little distance, show the proxy object
$(this).draggable('proxy').show();
var tr = opts.finder.getTr(target, $(this).attr('node-id'));
var treeTitle = tr.find('span.tree-title');
e.data.startX = treeTitle.offset().left;
e.data.startY = treeTitle.offset().top;
e.data.offsetWidth = 0;
e.data.offsetHeight = 0;
}
this.pageY = e.pageY;
},
onStopDrag:function(){
$(this).next('tr.treegrid-tr-tree').find('tr[node-id]').droppable({accept:'tr[node-id]'});
for(var i=0; i<state.disabledNodes.length; i++){
var tr = opts.finder.getTr(target, state.disabledNodes[i]);
tr.droppable('enable');
}
state.disabledNodes = [];
var row = t.treegrid('find', state.draggingNodeId);
opts.onStopDrag.call(target, row);
}
}).droppable({
accept:'tr[node-id]',
onDragEnter: function(e, source){
if (opts.onDragEnter.call(target, getRow(this), getRow(source)) == false){
allowDrop(source, false);
var tr = opts.finder.getTr(target, $(this).attr('node-id'));
tr.removeClass('treegrid-row-append treegrid-row-top treegrid-row-bottom');
tr.droppable('disable');
state.disabledNodes.push($(this).attr('node-id'));
}
},
onDragOver:function(e,source){
var nodeId = $(this).attr('node-id');
if ($.inArray(nodeId, state.disabledNodes) >= 0){return}
var pageY = source.pageY;
var top = $(this).offset().top;
var bottom = top + $(this).outerHeight();
allowDrop(source, true);
var tr = opts.finder.getTr(target, nodeId);
tr.removeClass('treegrid-row-append treegrid-row-top treegrid-row-bottom');
if (pageY > top + (bottom - top) / 2){
if (bottom - pageY < 5){
tr.addClass('treegrid-row-bottom');
} else {
tr.addClass('treegrid-row-append');
}
} else {
if (pageY - top < 5){
tr.addClass('treegrid-row-top');
} else {
tr.addClass('treegrid-row-append');
}
}
if (opts.onDragOver.call(target, getRow(this), getRow(source)) == false){
allowDrop(source, false);
tr.removeClass('treegrid-row-append treegrid-row-top treegrid-row-bottom');
tr.droppable('disable');
state.disabledNodes.push(nodeId);
}
},
onDragLeave:function(e,source){
allowDrop(source, false);
var tr = opts.finder.getTr(target, $(this).attr('node-id'));
tr.removeClass('treegrid-row-append treegrid-row-top treegrid-row-bottom');
opts.onDragLeave.call(target, getRow(this), getRow(source));
},
onDrop:function(e,source){
var dest = this;
var action, point;
var tr = opts.finder.getTr(target, $(this).attr('node-id'));
if (tr.hasClass('treegrid-row-append')){
action = append;
point = 'append';
} else {
action = insert;
point = tr.hasClass('treegrid-row-top') ? 'top' : 'bottom';
}
var dRow = getRow(this);
var sRow = getRow(source);
if (opts.onBeforeDrop.call(target, dRow, sRow, point) == false){
tr.removeClass('treegrid-row-append treegrid-row-top treegrid-row-bottom');
return;
}
action(sRow, dRow, point);
tr.removeClass('treegrid-row-append treegrid-row-top treegrid-row-bottom');
}
});
function allowDrop(source, allowed){
var icon = $(source).draggable('proxy').find('span.tree-dnd-icon');
icon.removeClass('tree-dnd-yes tree-dnd-no').addClass(allowed ? 'tree-dnd-yes' : 'tree-dnd-no');
}
function getRow(tr){
var nodeId = $(tr).attr('node-id');
return t.treegrid('find', nodeId);
}
function append(sRow, dRow){
doAppend();
if (dRow.state == 'closed'){
t.treegrid('expand', dRow[opts.idField]);
}
function doAppend(){
var data = t.treegrid('pop', sRow[opts.idField]);
t.treegrid('append', {
parent: dRow[opts.idField],
data: [data]
});
opts.onDrop.call(target, dRow, data, 'append');
}
}
function insert(sRow, dRow, point){
var param = {};
if (point == 'top'){
param.before = dRow[opts.idField];
} else {
param.after = dRow[opts.idField];
}
var data = t.treegrid('pop', sRow[opts.idField]);
param.data = data;
t.treegrid('insert', param);
opts.onDrop.call(target, dRow, data, point);
}
});
}
});
})(jQuery);
treegrid-dnd.js的更多相关文章
- EasyUi TreeGrid封装
礼物一:树型实体的抽象与封装 所谓树型实体,就是具有树型结构关系的实体,比如省.市.区.对于初学者,可能会创建三张表进行存储,有经验的开发者通过引入ParentId将设计简化为一张表,但是基于Pare ...
- RDIFramework.NET框架Web中datagrid与treegrid控件自动生成右键菜单与列标题右键菜单
在实际应用中常可以看到数据展示控件有右键菜单的功能,对应的列标题也可以右键弹出快捷菜单设置指定列的显示与隐藏等功能.在我们的RDIFramework.NET Web框架中,只要是使用了EasyUI的D ...
- html或者jsp页面引用jar包中的js文件
一,页面上引用jar包中的js文件的方法 使用java web框架AppFuse的时候发现,jquery.bootstrap等js框架都封装到jar包里面了.这些js文件通过一个wro4j的工具对其进 ...
- easyloader.js源代码分析
http://www.cnblogs.com/jasonoiu/p/easyloader_source_code_analysis.html Jquery easyui是一个javascript UI ...
- treegrid.bootstrap使用说明
treegrid.bootstrap使用说明 这个插件是用来做有层次的表格的,大概如图: 官网 http://maxazan.github.io/jquery-treegrid/ 使用这个控件之前需 ...
- JS组件系列——自己动手封装bootstrap-treegrid组件
前言:最近产品需要设计一套相对完整的组织架构的解决方案,由于组织架构涉及到层级关系,在表格里面展示层级关系,自然就要用到所谓的treegrid.可惜的是,一些轻量级的表格组件本身并没有自带树形表格的功 ...
- treegrid 表格树
treegrid 实现表格树的结构 效果图: 第一步:页面布局 <div class="col-sm-12 select-table table-striped" styl ...
- Bootstrap treegrid 实现树形表格结构
前言 :最近的项目中需要实现树形表格功能,由于前端框架用的是bootstrap,但是bootstrapTable没有这个功能所以就找了一个前端的treegrid第三方组件进行了封装.现在把这个封装的组 ...
- 学习日记3、投机取巧使两个表的数据同时在一个treeGrid中显示
不多说了直接上代码, $('#List').treegrid({ url: '@Url.Action("GetList")', width: $(window).width() - ...
- 五、bootstrap-Table Treegrid
一.bootstrap-Table Treegrid <!DOCTYPE HTML> <html lang="zh-cn"> <head> &l ...
随机推荐
- python 利用 setup.py 手动安装第三方类库
python 利用 setup.py 手动安装第三方类库 由于我在mac使用时,装了python3,默认有python2的环境,使用 pip 安装第三方类库时,老是安装到 python2的环境上: 在 ...
- android java 设计模式详解 Demo
android java 设计模式详解 最近看了一篇设计模式的文章,深得体会,在此基础我将每种设计模式的案例都写成Demo的形式,方便读者研究学习, 首先先将文章分享给大家: 设计模式(Design ...
- Python标准库:内置函数dict(mapping, **kwarg)
本函数是从一个映射函数对象构造一个新字典. 与dict(**kwarg)函数不一样的地方是參数输入是一个映射类型的函数对象,比方zip函数.map函数. 样例: #dict() #以键对方式构造字典 ...
- HDU1823-Luck and Love-二维线段树(模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1823 好吧,给这题跪了. ..orz.... 一道非常基础的二维线段树的模板题: 可是细节非常多:尤 ...
- Linux异步IO操作
Linux® 中最常用的输入/输出(I/O)模型是同步 I/O.在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止.这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需 ...
- 通过CSS3,实现元素覆盖效果
在非常多站点中,我们都能够看到这种效果.当用户鼠标进入某一个元素后,下方就会有遮罩层上浮动画,如图: 今天我们就用hover伪类加上css3实现,没有使用不论什么JS <!DOCTYPE htm ...
- StrongLoop
http://loopback.io/getting-started/ 使用 StrongLoop 创建 Node.js MySQL 应用程序 StrongLoop 是 IBM 的一家子公司,Stro ...
- Redis(十八):Redis和队列
概要 Redis不仅可作为缓存服务器,还可用作消息队列.它的列表类型天生支持用作消息队列.如下图所示: 由于Redis的列表是使用双向链表实现的,保存了头尾节点,所以在列表头尾两边插取元素都是非常快的 ...
- Phonegap创建项目语法
1:在本地磁盘新建一个文件夹存放要开发的项目,比如在D盘建一个yun文件夹2 2:然后在dos系统下,d:命令进入d盘,cd yun进入yun文件夹, 3:然后phonegap create yun2 ...
- angular关于表单指令的汇总