可拖拽的easyui treegrid

2023-11-16

引用:JQuery EasyUI TreeGrid控件的使用——支持拖拽与禁止拖拽

演示:




<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>TreeGrid Actions - jQuery EasyUI Demo</title>
	<link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
	<link rel="stylesheet" type="text/css" href="../../themes/icon.css">
	<link rel="stylesheet" type="text/css" href="../demo.css">
	<script type="text/javascript" src="../../jquery.min.js"></script>
	<script type="text/javascript" src="../../jquery.easyui.min.js"></script>
	<script type="text/javascript">
		$(function() {
	query();
})
function query() {
//	$('#tg').treegrid("options")
	$('#tg').treegrid({
	    url:'menu/list.json',
	    idField:'id',
	    treeField:'name',
	    rownumbers:true,//第一列显示序号
	    fitColumns:true,//列宽按比例扩展到最大
	    onDblClickRow:function(row){edit()},
	    onLoadSuccess: function(row){
            //$(this).treegrid('enableDnd', row?row.id:null);
           //上面的代码是demo中的,但是对于要保存更改到数据库显然走不通,需要向其他办法
           //启用拖动排序
            enableDnd($('#tg'));
        },
	    columns:[[
	        {field:'name',title:'name',width:100,align:'left', halign: 'center',editor:"text"},
	        {field:'url',title:'url',width:100,align:'center',editor:"text"},
	        {field:'icon',title:'icon',width:160,align:'center',editor:"text"},
	        {field:'seq',title:'seq',width:160,align:'center',editor:"numberbox" }
	    ]],
	    toolbar: [
		    	  { text: '添加子菜单', iconCls: 'icon-add', handler: function () {
		    		  append();
		    		}
		    	  }, '-',
		    	  { text: '删除', iconCls: 'icon-remove', handler: function () {
		    		  remove();
		    		}
		    	  }, '-',
		    	  { text: '编辑', iconCls: 'icon-edit', handler: function () {
		    		  edit();
		    		}
		    	  }, '-',
		    	  { text: '保存', iconCls: 'icon-save', handler: function () {
		    		  save();
		    		}
		    	  }, '-',
		    	  { text: '取消编辑', iconCls: 'icon-undo', handler: function () {
		    		  cancelEdit();
		    		}
		    	  }, '-',
		    	  { text: '刷新', iconCls: 'icon-reload', handler: function () {
		    		  query();
		    		}
		    	  }, '-',
		    	  { text: '更新到数据库', iconCls: 'icon-save', handler: function () {
		    		  saveToDB();
		    		}
		    	  }, '-']
	});
}


var editingId;
function append(){
	var node = $('#tg').treegrid('getSelected');
	if(node){
		var obj = {
				id: -1*Math.random(),
				name:'新建菜单',
				parent:{id:node.id},
				left:true,
				visible:true,
				seq:99
			};
		$('#tg').treegrid('append',{
			parent: node.id,  // the node has a 'id' value that defined through 'idField' property
			data: [obj]
		});
		enableDnd($('#tg'));
		params_data.add.push($('#tg').treegrid('find', obj.id));
	}
}
function insert(){
	var node = $('#tg').treegrid('getSelected');
	if (node){
		var obj = {
				id: -1*Math.random(),
				name:'新建菜单',
				parent:node.parent,
				left:true,
				visible:true,
				seq:99
			};
		$('#tg').treegrid('insert', {
			after: node.id,
			data: obj
		});
		enableDnd($('#tg'));
		params_data.add.push($('#tg').treegrid('find', obj.id));
	}
	
}
function edit(){
	if (editingId != undefined){
		save();
	}
	var row = $('#tg').treegrid('getSelected');
	if (row){
		editingId = row.id
		$('#tg').treegrid('beginEdit', editingId);
		//解决添加拖拽功能后无法编辑问题
		/*
		var eds = $('#tg').treegrid('getEditors',editingId);
		for(var i=0;i<eds.length;i++){
			$(eds[i].target).bind('mousedown',function(e){
				e.stopPropagation();
			});
		}*/
		$(".datagrid-row-editing input").each(function(){
			$(this).bind('mousedown',function(e){
				e.stopPropagation();
			});
		});
		
	}
}
function save(){
	if (editingId != undefined){
		$('#tg').treegrid('endEdit', editingId);
		var row = $('#tg').treegrid('find', editingId);
		if(row.id > 0){
			params_data.update.push(row);
		}
		editingId = undefined;
	}
}
function remove(){
	var node = $('#tg').treegrid('getSelected');
	if (node){
		$('#tg').treegrid('remove', node.id);
		if(editingId != undefined && editingId == node.id){
			editingId = undefined;
		}
		if(node.id > 0){
			params_data.delete.push(node);
		}else{
			var idx = params_data.add.indexOf(node);
			params_data.add.remove(idx);
		}
	}
}
function cancelEdit(){
	if (editingId != undefined){
		$('#tg').treegrid('cancelEdit', editingId);
		editingId = undefined;
	}
}
/**保存到数据库*/
var params_data = {add: [],update: [],delete: []};
function saveToDB(){
	save();
	var data = {
            add: [],
            update: [],
            delete: []
    };
    for(var i=0;i<params_data.add.length;i++){
    	delete params_data.add[i]._parentId;
    	delete params_data.add[i].checkState;
    	delete params_data.add[i].checked;
    	delete params_data.add[i].state;
    }
    for(var i=0;i<params_data.update.length;i++){
    	delete params_data.update[i]._parentId;
    	delete params_data.update[i].checkState;
    	delete params_data.update[i].checked;
    	delete params_data.update[i].state;
    }
    for(var i=0;i<params_data.update.length;i++){
    	delete params_data.update[i]._parentId;
    	delete params_data.update[i].checkState;
    	delete params_data.update[i].checked;
    	delete params_data.update[i].state;
    }
    var req_data = {};
    req_data.add = JSON.stringify(params_data.add);
    req_data.update = JSON.stringify(params_data.update);
    req_data.delete = JSON.stringify(params_data.delete);
    $.ajax({
        type: "POST",
        url: 'menu/save',
        dataType: "json",
        data: req_data,
        success: function (rarg) {
            if (rarg.err == undefined) {
                $.messager.show({ title: '提示',
                    msg: '保存成功.',
                    timeout: 3000,
                    showType: 'slide'
                });
                params_data = {add: [],update: [],delete: []};
                query();
            }
            else $.messager.alert('提示', rarg.err); 
            //refreshTab();
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            $.messager.alert('提示', '保存失败,系统繁忙,请稍后再试!');
        }
    });
}


function enableDnd(t){
	var nodes = t.treegrid('getPanel').find('tr[node-id]');
	nodes.find('span.tree-hit').bind('mousedown.treegrid',function(){
		return false;
	});
	nodes.draggable({
		disabled:false,
		revert:true,
		cursor:'pointer',
		proxy: function(source){
			var p = $('<div class="tree-node-proxy tree-dnd-no"></div>').appendTo('body');
			p.html($(source).find('.tree-title').html());
			p.hide();
			return p;
		},
		deltaX: 15,
		deltaY: 15,
		onBeforeDrag:function(){
			$(this).next('tr.treegrid-tr-tree').find('tr[node-id]').droppable({accept:'no-accept'});
		},
		onStartDrag:function(){
			$(this).draggable('proxy').css({
				left:-10000,
				top:-10000
			});
		},
		onDrag:function(e){
			$(this).draggable('proxy').show();
			this.pageY = e.pageY;
		},
		onStopDrag:function(){
			$(this).next('tr.treegrid-tr-tree').find('tr[node-id]').droppable({accept:'tr[node-id]'});
		}
	}).droppable({
		accept:'tr[node-id]',
		onDragOver:function(e,source){
			var pageY = source.pageY;
			var top = $(this).offset().top;
			var bottom = top + $(this).outerHeight();
			$(source).draggable('proxy').removeClass('tree-dnd-no').addClass('tree-dnd-yes');
			$(this).removeClass('row-append row-top row-bottom');
			if (pageY > top + (bottom - top) / 2){
				if (bottom - pageY < 5){
					$(this).addClass('row-bottom');
				} else {
					$(this).addClass('row-append');
				}
			} else {
				if (pageY - top < 5){
					$(this).addClass('row-top');
				} else {
					$(this).addClass('row-append');
				}
			}
		},
		onDragLeave:function(e,source){
			$(source).draggable('proxy').removeClass('tree-dnd-yes').addClass('tree-dnd-no');
			$(this).removeClass('row-append row-top row-bottom');
		},
		onDrop:function(e,source){
			var action,point;
			if ($(this).hasClass('row-append')){
				action = 'append';
			} else {
				action = 'insert';
				point = $(this).hasClass('row-top') ? 'top' : 'bottom';
			}
			$(this).removeClass('row-append row-top row-bottom');
			//alert(action+":"+point);
			// your logic code here
			// do append or insert action and reload the treegrid data
			var src  = t.treegrid('find', $(source).attr('node-id'));
            var dest = t.treegrid('find', $(this).attr('node-id'));
            //alert(src.name+","+dest.name);
            if (src){
            	t.treegrid('remove', src.id);
            }
            if(action == "append"){
            	src.parent = {};
            	src.parent.id = dest.id;
            	t.treegrid('append',{
            		parent: dest.id,  // the node has a 'id' value that defined through 'idField' property
            		data: [src]
            	});
            }else if(action == "insert"){
            	src.parent = dest.parent;
            	var obj = {
                		before: dest.id,
                		after: dest.id,
                		data: src
                }
            	if(point == "top"){
            		delete obj.after;
            	}else{
            		delete obj.before;
            	}
            	t.treegrid('insert', obj);
            }
            if(src.id > 0){
            	params_data.update.push(src);
            }
            
            enableDnd(t);
            /*
            $.ajax({
                url: 'updateCatalogList',
                dataType: 'json',
                type:'post',
                data: {
                    "srcId": src.id,
                    "destId": dest.id
                },
                success:function(data){
                    if(data.result)
                    {
                        $('#tt').treegrid('reload');    //重新加载treegrid        
                   }
                }
            
            });
            */
		}
	});
}




	</script>
    <style type="text/css">  
    .fitem{  
        margin: 5px;  
    }  
    .fitem label{  
        display:inline-block;  
        width: 70px;      
        text-align: right;    
    }  
    .panel.datagrid{  
        margin: 0 auto;  
    }  
/*  修改表格表头里面字体大小  */  
    .datagrid-header .datagrid-cell span{  
        font-size: 18px;  
    }  
/*  修改表格里面字体大小 */  
    .datagrid-cell{  
        font-size: 16px;  
    }  
/*  修改表格行高 */  
    .datagrid-row {  
        height: 40px;  
    }  
    td[field="enable"] td{  
         text-align: center;  
    }  
    </style>  
    <style type="text/css">  
/*      treegrid拖动效果 */  
        .row-top td{  
            border-top:1px solid red;  
            background:#fff;  
        }  
        .row-bottom td{  
            border-bottom:1px solid red;  
            background:#fff;  
        }  
        .row-append td{  
            border:0;  
            background:#FBEC88;  
        }  
    </style>  
</head>  
<body>  
    <!--     数据网格 -->  
    <table id="tg" title="菜单列表"   
        style="width:100%;height:auto;margin:0 auto;">  
    </table>  
</body>  
</html>  

[
    {
        "id": 3,
        "parent": null,
        "name": "系统设置",
        "url": null,
        "visible": true,
        "leaf": true,
        "seq": 1,
        "roles": [],
        "children": [],
        "icon": null
    },
    {
        "id": 6,
        "parent": null,
        "name": "基础数据",
        "url": null,
        "visible": true,
        "leaf": true,
        "seq": 2,
        "roles": [],
        "children": [],
        "icon": null
    },
    {
        "id": 7,
        "parent": null,
        "name": "权限管理",
        "url": null,
        "visible": true,
        "leaf": true,
        "seq": 3,
        "roles": [],
        "children": [
            {
                "id": 9,
                "parent": {
                    "id": 7,
                    "parent": null,
                    "name": null,
                    "url": null,
                    "visible": false,
                    "leaf": false,
                    "seq": 0,
                    "roles": [],
                    "children": [],
                    "icon": null
                },
                "name": "用户管理",
                "url": "user/list",
                "visible": true,
                "leaf": true,
                "seq": 1,
                "roles": [],
                "children": [],
                "icon": "3"
            },
            {
                "id": 10,
                "parent": {
                    "id": 7,
                    "parent": null,
                    "name": null,
                    "url": null,
                    "visible": false,
                    "leaf": false,
                    "seq": 0,
                    "roles": [],
                    "children": [],
                    "icon": null
                },
                "name": "角色管理",
                "url": "role/list",
                "visible": true,
                "leaf": true,
                "seq": 2,
                "roles": [],
                "children": [],
                "icon": "2"
            },
            {
                "id": 11,
                "parent": {
                    "id": 7,
                    "parent": null,
                    "name": null,
                    "url": null,
                    "visible": false,
                    "leaf": false,
                    "seq": 0,
                    "roles": [],
                    "children": [],
                    "icon": null
                },
                "name": "菜单管理",
                "url": "menu/list",
                "visible": true,
                "leaf": true,
                "seq": 3,
                "roles": [],
                "children": [],
                "icon": null
            }
        ],
        "icon": null
    },
    {
        "id": 8,
        "parent": null,
        "name": "订单管理",
        "url": null,
        "visible": true,
        "leaf": true,
        "seq": 4,
        "roles": [],
        "children": [],
        "icon": null
    }
]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可拖拽的easyui treegrid 的相关文章

随机推荐

  • 人机交互重点知识点

    人机交互重点知识点 1 绪论 1 1什么是人机交互 人机交互是关于设计 评价和实现供人们使用的交互式计算机系统 且围绕这些方面的主要现象进行研究的科学 1 2人机交互的研究内容 1 人机交互界面表示模型与设计方法 2 可用性分析与评估 3
  • vue 实现全屏

    通过引用第三方库 screenfull 实现全屏 1 首先通过 npm install screenfull 执行下载 2 在使用页面进行import screenfull from screenfull 引入 3 然后绑定事件 调用提供的
  • 【第22例】IPD 体系进阶:综合创新地图

    目录 简介 专栏目录 内容 第一步 搭建框架 第二步 构思 第三步 筛选
  • 算法分析

    声明 凡代码问题 欢迎在评论区沟通 承蒙指正 一起成长 目录 一 实验内容与要求 二 概要设计 三 直接上代码 四 运行结果 一 实验内容与要求 内容 布线问题 印刷电路板将布线区域分成n m个方格阵列 精确的电路布线问题要求确定连接方格A
  • 线性表的顺序存储结构(数组插入,删除)——c语言描述

    文章目录 1 线性表的顺序存储结构 1 2 线性表的存储结构的表示 1 2 线性表的操作 OperatorList 1 3 打印线性表 PrintList 1 4 创建线性表 1 5 清零线性表 ClearList 1 6 获取线性表指定位
  • python的赋值操作浅析

    目录 前言 一 不可变类型的赋值 1 Numbers的赋值 2 String类型的赋值 3 Tupes类型赋值 4 函数传参赋值 二 可变类型的赋值 1 List赋值 2 函数传参 总结 前言 python中Numbers 数
  • mysql初始化命令_mysql初始化命令及其他命令

    这个问题纠结了我两年 为了配置my cnf中 undo的 参数生效 以及生成undo文件 使用一下命令 usr bin mysql install db defaults file etc my cnf datadir dbfiles da
  • type object xxx has no attribute objects

    在Django 2 0以下版本 使用自定义管理器存在一个BUG 该BUG引发的原因 是因为报错模型使用自定义管理器 导致默认的objects管理器被覆盖掉了 我的解决方案是 升级Django版本 升级到Django 2 2 1 如果有大佬知
  • Uniapp录音实时回调原生插件-YL-AudioRecorder

    YL AudioRecorder 插件地址 https ext dcloud net cn plugin id 14028 升级版 YL AudioRecorderPlus 支持mp3录制及实时回调 https ext dcloud net
  • 30条经典的SQL语句

    关于索引 推荐转载的这篇文章 http blog csdn net dutguoyi archive 2006 01 10 575617 aspx 改善SQL语句的效率 http community csdn net Expert topi
  • 2017年严重拖延着患者欠下的债

    扩展基础知识面 Android 面试 全站式导航 http mp weixin qq com s fTfudY1DBYS5JiSkPnbjAg 100篇精选干货 感谢你与码个蛋共同成长 含5重福利 http mp weixin qq com
  • 使用com.alibaba里面的druid连接数据库

    1 添加依赖
  • Spark性能调优之Shuffle调优

    Spark性能调优之Shuffle调优 Spark底层shuffle的传输方式是使用netty传输 netty在进行网络传输的过程会申请堆外内存 netty是零拷贝 所以使用了堆外内存 shuffle过程中常出现的问题 常见问题一 redu
  • 服务器物理结构,物理 I/O 体系结构

    物理 I O 体系结构 与以前发行版的 M 系列服务器相比 这些服务器的物理 I O 体系结构发生了变化 使用了不同的名称 并且 CPU 不再拥有 PCIe 结构 I O 术语 用于描述 I O 体系结构的术语发生了如下变化 根联合体 在
  • React Effects(副作用)

    我们在之前提到过 React 组件在渲染过程中不应该有可观察到的副作用 但是有些时候副作用确实必要的 我们也许需要进行管理 focus 状态 用 canvas 画图 订阅数据源等操作 在 React 中 这些都可以通过声明 effect 来
  • ag-grid 自带css样式记录

    本篇文章是打算自己用于记录ag grid自身的css样式的记录和功能 1 ag header group cell with group 作用 多表头 前几层 最后一行表头除外 表头样式的设置 ag header group cell wi
  • pg备份数据库

    原文 http www weijingbiji com 1975 PostgreSQL备份工具pg dump和pg dumpall PostgreSQL 数据库 作者 viking PostgreSQL使用 pg dump 和 pg dum
  • [知识图谱实战篇] 七.HTML+D3实现关系图谱搜索功能

    前面作者讲解了很多知识图谱原理知识 包括知识图谱相关技术 Neo4j绘制关系图谱等 但仍缺少一个系统全面的实例 为了加深自己对知识图谱构建的认识 为后续创建贵州旅游知识图谱打下基础 作者深入学习了张宏伦老师的网易云课程 星球系列电影 并结合
  • Python利用demoji库删除文档中的表情符号

    在进行数据清洗时 往往需要删除文档中的出现的表情符号 因为他们无法被读取 借助demoji库 可以非常简单地完成这项工作 关于demoji 库的文档 可以访问demoji PyPI 首先 需要在环境中利用pip install安装demoj
  • 可拖拽的easyui treegrid

    引用 JQuery EasyUI TreeGrid控件的使用 支持拖拽与禁止拖拽 演示