`
luck332
  • 浏览: 86367 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

extjs表格行拖动插件

EXT 
阅读更多
Ext.ux.GridDragDropRowOrder = Ext.extend(Ext.util.Observable, {
	copy : false,

	scrollable : false,

	constructor : function(config) {
		if (config)
			Ext.apply(this, config);

		this.addEvents({
					beforerowmove : true,
					afterrowmove : true,
					beforerowcopy : true,
					afterrowcopy : true
				});

		Ext.ux.GridDragDropRowOrder.superclass.constructor.call(this);
	},

	init : function(grid) {
		this.grid = grid;
		grid.enableDragDrop = true;

		grid.on({
					render : {
						fn : this.onGridRender,
						scope : this,
						single : true
					}
				});
	},

	onGridRender : function(grid) {
		var self = this;

		this.target = new Ext.dd.DropTarget(grid.getEl(), {
			ddGroup : grid.ddGroup || 'GridDD',
			grid : grid,
			gridDropTarget : this,

			notifyDrop : function(dd, e, data) {
				if (this.currentRowEl) {
					this.currentRowEl.removeClass('grid-row-insert-below');
					this.currentRowEl.removeClass('grid-row-insert-above');
				}
                
				var t = Ext.lib.Event.getTarget(e);
				var rindex = this.grid.getView().findRowIndex(t);
				
				if (rindex === false || rindex == data.rowIndex) {
					return false;
				}
				if (this.gridDropTarget.fireEvent(self.copy
								? 'beforerowcopy'
								: 'beforerowmove', this.gridDropTarget,
						data.rowIndex, rindex, data.selections, 123) === false) {
					return false;
				}

				var ds = this.grid.getStore();

				var selections = new Array();
				var keys = ds.data.keys;
				for (var key in keys) {
					for (var i = 0; i < data.selections.length; i++) {
						if (keys[key] == data.selections[i].id) {
							if (rindex == key) {
								return false;
							}
							selections.push(data.selections[i]);
						}
					}
				}
				var targetRecord = this.grid.store.getAt(rindex);
				
				if (rindex > data.rowIndex && this.rowPosition < 0) {
					rindex--;
				}
				if (rindex < data.rowIndex && this.rowPosition > 0) {
					rindex++;
				}

				if (rindex > data.rowIndex && data.selections.length > 1) {
					rindex = rindex - (data.selections.length - 1);
				}

				if (rindex == data.rowIndex) {
					return false;
				}
				if (!self.copy) {
					for (var i = 0; i < data.selections.length; i++) {
						ds.remove(ds.getById(data.selections[i].id));
					}
				}

				for (var i = selections.length - 1; i >= 0; i--) {
					var insertIndex = rindex;
					ds.insert(insertIndex, selections[i]);
				}
				var sm = this.grid.getSelectionModel();
				if (sm) {
					sm.selectRecords(data.selections);
				}
				this.gridDropTarget.fireEvent(self.copy
								? 'afterrowcopy'
								: 'afterrowmove', this.gridDropTarget,
						data.rowIndex, rindex, data.selections,this.grid.store);
				return true;
			},

			notifyOver : function(dd, e, data) {
				var t = Ext.lib.Event.getTarget(e);
				var rindex = this.grid.getView().findRowIndex(t);
				var ds = this.grid.getStore();
				var keys = ds.data.keys;
				for (var key in keys) {
					for (var i = 0; i < data.selections.length; i++) {
						if (keys[key] == data.selections[i].id) {
							if (rindex == key) {
								if (this.currentRowEl) {
									this.currentRowEl
											.removeClass('grid-row-insert-below');
									this.currentRowEl
											.removeClass('grid-row-insert-above');
								}
								return this.dropNotAllowed;
							}
						}
					}
				}
				if (rindex < 0 || rindex === false) {
					if(this.currentRowEl)
					this.currentRowEl.removeClass('grid-row-insert-above');
					return this.dropNotAllowed;
				}

				try {
					var currentRow = this.grid.getView().getRow(rindex);
					var resolvedRow = new Ext.Element(currentRow).getY()
							- this.grid.getView().scroller.dom.scrollTop;
					var rowHeight = currentRow.offsetHeight;
					this.rowPosition = e.getPageY() - resolvedRow
							- (rowHeight / 2);

					if (this.currentRowEl) {
						this.currentRowEl.removeClass('grid-row-insert-below');
						this.currentRowEl.removeClass('grid-row-insert-above');
					}

					if (this.rowPosition > 0) {
						this.currentRowEl = new Ext.Element(currentRow);
						this.currentRowEl.addClass('grid-row-insert-below');
					} else {
						if (rindex - 1 >= 0) {
							var previousRow = this.grid.getView().getRow(rindex
									- 1);
							this.currentRowEl = new Ext.Element(previousRow);
							this.currentRowEl.addClass('grid-row-insert-below');
						} else {
							this.currentRowEl.addClass('grid-row-insert-above');
						}
					}
				} catch (err) {
					console.warn(err);
					rindex = false;
				}
				return (rindex === false)
						? this.dropNotAllowed
						: this.dropAllowed;
			},
			notifyOut : function(dd, e, data) {
				if (this.currentRowEl) {
					this.currentRowEl.removeClass('grid-row-insert-above');
					this.currentRowEl.removeClass('grid-row-insert-below');
				}
			}
		});
		if (this.targetCfg) {
			Ext.apply(this.target, this.targetCfg);
		}
		if (this.scrollable) {
			Ext.dd.ScrollManager.register(grid.getView().getEditorParent());
			grid.on({
						beforedestroy : this.onBeforeDestroy,
						scope : this,
						single : true
					});
		}
	},
	getTarget : function() {
		return this.target;
	},
	getGrid : function() {
		return this.grid;
	},
	getCopy : function() {
		return this.copy ? true : false;
	},
	setCopy : function(b) {
		this.copy = b ? true : false;
	},
	onBeforeDestroy : function(grid) {
		Ext.dd.ScrollManager.unregister(grid.getView().getEditorParent());
	}
});
分享到:
评论

相关推荐

    extjs表格Grid比较全面的功能

    ExtJS表格Grid是一款强大的JavaScript组件,它在Web应用中用于展示和操作数据,尤其是在复杂的业务逻辑和大量数据处理中表现出色。这篇博客文章主要探讨了ExtJS Grid的全面功能,结合源码分析和实用工具,帮助开发者...

    Extjs 表格

    ExtJS表格支持多种交互功能,如行选择、排序、分页、列拖动等。例如,通过`selModel`配置项可以启用行选择模式。 8. **在线可编辑表格** `在线可编辑表格.htm`可能是演示如何创建一个可编辑的表格的例子,用户...

    extjs中设置grid默认行高及换行

    Extjs 中想改变grid 行高,如果只是简单的设置了height的值是可以实现grid 的行高,但是如果使用了插件:rowexpander ,最出现新的问题。 感兴趣的朋友可以试试的。 此文档可以解决你的烦恼,为了找到资源下载,...

    ExtJS(ajax框架) 4.2.1

    单选行,多选行,高亮显示选中的行,拖拽改变列宽度,按列排序,这些基本功能ExtJS轻量级实现。 自动生成行号,支持checkbox全选,动态选择显示哪些列,支持本地以及远程分页,可以对单元格按照自己的想法进行渲染...

    Extjs4实现两个GridPanel之间数据拖拽功能具体方法

    在ExtJS 4中实现两个GridPanel间的数据拖拽功能涉及到了ExtJS框架提供的丰富的组件和插件支持。拖拽功能让用户可以通过交互式地拖动界面元素来执行操作,如移动或复制数据项等。这里的主要知识点是使用ExtJS提供的...

    EXTJS网站模板

    EXTJS的设计理念是将复杂的Web界面开发简化,通过拖拽和配置就能创建出具有桌面应用感觉的用户界面。 EXTJS的核心特性包括: 1. **组件化**:EXTJS提供了大量的预定义组件,如表格、面板、窗口、表单、菜单等,...

    Extjs2.02 Gridpanel

    EXTJS GridPanel 是EXTJS库中的核心组件之一,尤其在EXTJS 2.02版本中,它提供了强大的表格展示和交互功能,对于初学者来说极具学习价值。GridPanel不仅能够处理基本的表格操作,如单选、多选、排序、改变列宽等,还...

    extjs框架及教程

    EXTJS的核心特性包括可拖拽布局、数据绑定、强大的表格和树形视图、以及高度自定义的图表。 在"EXT JS"这一标签下,我们关注的是EXTJS框架的使用和学习。EXTJS 4.1.4是该框架的一个稳定版本,提供了大量的改进和新...

    Extjs in action

    - **扩展与插件**:讲解了如何利用ExtJS的插件系统来扩展其功能。 总之,《Extjs in Action》是一本非常适合希望精通ExtJS框架的开发者的书籍。无论你是初学者还是有一定经验的开发者,这本书都能提供有价值的见解...

    Extjs+Designer+Preview 官方的extjs可视化IDE设计工具3.0 汉化版

    Designer是ExtJS的一个配套工具,它是一个可视化的界面设计环境,允许开发者通过拖拽和配置组件来构建用户界面,大大简化了ExtJS应用的开发流程。Preview功能则是Designer中的一个重要部分,它允许用户实时预览设计...

    ExtJS的可视化界面设计器

    - **拖拽式布局**:在Designer中,开发者可以通过拖拽组件库中的控件到设计画布,快速创建界面元素,如按钮、表格、面板等。 - **实时预览**:设计过程中,可以实时查看界面效果,便于调整布局和样式。 - **代码...

    ExtJS介绍以及GridPanel

    此外,社区也提供了大量的插件和扩展,进一步增强了ExtJS的功能和适用性。 总之,ExtJS是一个功能强大的JavaScript框架,特别适合于构建复杂的、具有桌面应用级别的Web应用。GridPanel作为其代表性组件,能够灵活地...

    实现extjs4 的树、grid、form、query等大部分组件的功能

    EXTJS4中的网格可以配合各种插件,如行编辑、列拖动、导出Excel等,以满足不同需求。数据与网格通过store进行绑定,可以通过proxy设置数据源,如Ajax或内存数据。 表单(Form)组件是EXTJS用于收集和展示用户输入的...

    使用extjs写的时间轴

    它提供了丰富的组件库,包括表格、面板、表单、图表等多种元素,使得开发者可以方便地创建交互式的Web应用。在这个特定的场景中,我们关注的是“使用ExtJS写的时间轴”。 时间轴在数据可视化中是一种非常有用的表现...

    ExtJS基础教程.pdf

    ExtJS完全基于纯JavaScript,不依赖于任何浏览器插件,这使其能够在多种主流浏览器上无缝运行。 #### 二、ExtJS的特点 1. **跨浏览器兼容性**:ExtJS支持包括IE、Firefox、Chrome、Safari等在内的主流浏览器,确保...

    Extjs中文教程

    - 定义了如何选择表格中的行,包括单选、多选等模式。 - 可以通过配置`selModel`选项来指定。 - **Grid视图** - 视图负责渲染表格的实际内容。 - 可以自定义视图的滚动、加载等行为。 #### 二十、GridPanel...

    packt learning EXTJs

    1. **组件化设计**:EXTJS采用组件化的思想,提供了一系列预定义的UI组件,如表格、表单、树形视图、面板、菜单等,这些组件可组合、可扩展,方便开发者快速搭建页面布局。 2. **数据绑定**:EXTJS的数据绑定机制...

    树形表格菜单 动态添加节点/动态删除节点/动态移动节点

    1.完整的包命名空间 2.自定义header footer 3.动态添加节点/动态删除节点/动态...15.支持插件开发,可以为树添加更多功能,例如下拉框树,选择框树,可编辑内容的树,拖动节点等都可以很容易自己实现或者根据第三方js实现

Global site tag (gtag.js) - Google Analytics