TreeGridEditor基于Ext,实现了可编辑的TreeGrid组件
TreeGridEditor基于Ext,实现了可编辑的TreeGrid组件。主要功能:
1. 包括四种类型的编辑框:text、password、select、date
2. 可扩展的操作功能按钮,默认三个功能:新增、修改、删除
3. 两种类型的选取框:checkbox和radio
TreeGridEditor示例图
http://dl.iteye.com/upload/picture/pic/57661/5a186201-ec7a-32b4-b59d-57a7e7721491.jpg(alt+p)
/** * @author zhangdaiping@vip.qq.com * @version 1.3.1 (10/3/2010) */Ext.onReady(function() { Ext.QuickTips.init(); var checkAdd = function(n) { //Ext.Msg.alert('Message', Ext.util.Format.htmlEncode(n.city).replace(/ /g, "&nbsp;") + '<br>' + n.nodePath + '<br>' + n.nodeParentPath + '<br>' + n.nodeParentId); var exist = treegrideditor.hasNode(n.nodeParentId, { city: n.city }); if (exist) { Ext.Msg.alert('Message', '地区/级别已存在!'); return false; } return true; }; var checkEdit = function(n) { //Ext.Msg.alert('Message', Ext.util.Format.htmlEncode(n.city).replace(/ /g, "&nbsp;") + '<br>' + n.nodePath + '<br>' + n.nodeParentPath + '<br>' + n.nodeParentId); var exist = treegrideditor.hasNode(n.nodeParentId, { city: n.city }, false, false, { id: n.id }, false); if (exist) { Ext.Msg.alert('Message', '地区/级别已存在!'); return false; } return true; }; var checkRemove = function(n) { //Ext.Msg.alert('Message', Ext.util.Format.htmlEncode(n.city).replace(/ /g, "&nbsp;") + '<br>' + n.nodePath + '<br>' + n.nodeParentPath + '<br>' + n.nodeParentId); if (!n.nodeLeaf) { Ext.Msg.alert('Message', '地区下有子级别!'); return false; } return true; }; var treegrideditor = new Ext.ux.tree.TreeGridEditor({ // TreeGridEditor唯一标识 id: 'treegrideditor', // 自适应宽度 autoWidth: true, // 高度 height: 400, // 渲染到DOM节点 renderTo: 'div-treegrideditor', // 最大深度(层级) maxDepth: 5, // 复选框 checkbox: true, // 复选框类型,取值范围: 'multiple' 'single' checkMode: 'multiple', // 复选框插件,如需使用加载此插件 // 在页面引用<script type="text/javascript" src="treegrideditor/plugins/TreeNodeChecked.js"></script> plugins: , // 显示列 columns: [{ header: '地区名称(级别名称)', dataIndex: 'city', autoWidth: true, // 显示tip,默认false不显示;不设置tipText,则默认显示列值 displayTip: true, // 设置tipText,当tipText为String时,显示String;如果为Function,则显示返回值 // tipText : String/Function inputCfg: { allowBlank: false, trimmed: true // inputType : String输入框类型,取值范围'text' 'password' 'select' 'date',默认'text' // trimmed : Boolean去首尾空格,默认false不自动去除 // selectOptions : Array如果inputType='select',指定选择框选项 // dateFormat : String如果inputType='date',指定日期format,默认'Y-m-d' // defaultValue : String输入框默认值 // filterInputValue : Function输入值过滤函数 // filterOutputValue : Function输出值过滤函数 // cls : String输入框class // style : String输入框样式 // width : Number输入框宽度 // height : Number输入框高度 // readOnly : Boolean是否只读,默认false不只读 // selectOnFocus : Boolean当焦点为输入框时,是否选中输入框文本,默认false不选中 // allowBlank : Boolean是否允许空值,默认true允许 // blankText : String为空值时,提示错误信息 // maskRe : RegExp限制输入值正则验证 // maxLength : Number最大长度 // maxLengthText : String超长时,提示错误信息 // minLength : Number最小长度 // minLengthText : String长度不够时,提示错误信息 // regex : RegExp正则验证输入值 // regexText : String正则验证失败时,提示错误信息 // validateOnBlur : Boolean当焦点移除时,验证输入值 // validationDelay : Number延迟验证,默认250 // validationEvent : String/Boolean指定验证时间,如果为false,则不触发验证,默认'keyup' // validator : Function自定义验证函数,返回值true验证通过,如果返回值为String时,则输出此String为错误信息 // invalidText : String验证失败,提示错误信息 } }, { header: '人数', dataIndex: 'popu', width: 150, tpl: new Ext.XTemplate('{popu}人'), inputCfg: { cls: 'tge-inputfield-popu', defaultValue: '0', allowBlank: false, maskRe: /^\d$/, regex: /^\d{1,10}$/, regexText: '请输入1-10位正整数' } }, { header: '是否覆盖', dataIndex: 'overlapped', width: 100, tpl: new Ext.XTemplate('{overlapped:this.overlappedText}', { overlappedText: function(v) { if (v === '1') { return '是'; } else { return '否'; } } }), inputCfg: { cls: 'tge-inputfield-overlapped', width: 80, inputType: 'select', selectOptions: [{ name: '是', value: '1' }, { name: '否', value: '0', selected: true }], allowBlank: false } }, { header: '创建日期', dataIndex: 'created', width: 150, inputCfg: { cls: 'tge-inputfield-created', inputType: 'date', dateFormat: 'Y-m-d', allowBlank: false } }], // 设置Obar obarCfg: { column: { header: '操作', dataIndex: 'id', width: 200 }, btns: [{ id: 'add', text: '新增下级', // 最大层级按钮状态,取值范围:'normal','hidden','disabled','uncreated' deepestState: 'uncreated', request: { url: '/tge/tgeservlet', params: { method: 'add' } }, // 添加节点,保存校验函数 validator: checkAdd }, { id: 'edit', text: '修改', // 最大层级按钮状态,取值范围:'normal','hidden','disabled','uncreated' deepestState: 'normal', request: { url: '/tge/tgeservlet', params: { method: 'update' } }, // 修改节点,保存校验函数 validator: checkEdit }, { id: 'remove', text: '删除', request: { url: '/tge/tgeservlet', params: { method: 'delete' } }, // 删除节点校验函数 validator: checkRemove }], // Obar事件 // // beforeaddnode添加树节点之前,如果返回false,则中止添加操作 // 'beforeaddnode': function(tree, node) // tree : Ext.ux.tree.TreeGridEditor // node : Ext.tree.TreeNode当前树节点 // return Boolean // // addnode添加树节点 // 'addnode': function(tree, parent, node) // tree : Ext.ux.tree.TreeGridEditor // parent : Ext.tree.TreeNode父树节点 // node : Ext.tree.TreeNode新增树节点 // return void // // beforeeditnode修改树节点之前,如果返回false,则中止修改操作 // 'beforeeditnode': function(tree, node) // tree : Ext.ux.tree.TreeGridEditor // node : Ext.tree.TreeNode当前树节点 // return Boolean // // editnode修改树节点 // 'editnode': function(tree, node) // tree : Ext.ux.tree.TreeGridEditor // node : Ext.tree.TreeNode当前树节点 // return void // // beforeremovenode删除树节点之前,如果返回false,则中止删除操作 // 'beforeremovenode': function(tree, node) // tree : Ext.ux.tree.TreeGridEditor // node : Ext.tree.TreeNode当前树节点 // return Boolean // // removenode删除树节点,如果返回false,则中止删除操作 // 'beforeremovenode': function(tree, node, response) // tree : Ext.ux.tree.TreeGridEditor // node : Ext.tree.TreeNode当前树节点 // response : String/Object服务端响应消息 // return Boolean // // afterremovenode删除树节点之后 // 'afterremovenode': function(tree, nodeAttributes) // tree : Ext.ux.tree.TreeGridEditor // nodeAttributes : Object当前树节点的属性 // return void // // beforeupdatenode保存树节点之前,如果返回false,则中止保存操作 // 'beforeupdatenode': function(tree, node, editMode) // tree : Ext.ux.tree.TreeGridEditor // node : Ext.tree.TreeNode当前树节点 // editMode : String编辑模式,'add'新增下级节点,'edit'编辑当前节点 // return Boolean // // updatenode保存树节点,如果返回false,则中止保持操作 // 'updatenode': function(tree, node, editMode, response) // tree : Ext.ux.tree.TreeGridEditor // node : Ext.tree.TreeNode当前树节点 // editMode : String编辑模式,'add'新增下级节点,'edit'编辑当前节点 // response : String/Object服务端响应消息 // return Boolean // // afterupdatenode保存树节点之后 // 'afterupdatenode': function(tree, node, editMode) // tree : Ext.ux.tree.TreeGridEditor // node : Ext.tree.TreeNode当前树节点 // editMode : String编辑模式,'add'新增下级节点,'edit'编辑当前节点 // return void // // beforecanceledit 取消修改树节点之前,如果返回false,则中止取消操作 // 'beforecanceledit': function(tree, node) // tree : Ext.ux.tree.TreeGridEditor // node : Ext.tree.TreeNode当前树节点 // return Boolean // // canceledit取消修改树节点 // 'canceledit': function(tree, node) // tree : Ext.ux.tree.TreeGridEditor // node : Ext.tree.TreeNode当前树节点 // return void // // requestfailureAjax请求失败 // 'requestfailure': function(tree, node, fn, status) // tree : Ext.ux.tree.TreeGridEditor // node : Ext.tree.TreeNode当前树节点 // fn : String失败状态 // status : String失败状态 // return void // listeners: { 'afterupdatenode': function(tree, node, editMode) { if (editMode === 'add' && node.getDepth() <= 2) { tree.disableObar(node, 'add'); tree.disableObar(node, 'edit'); } }, 'afterremovenode': function(tree, nodeAttrs) { Ext.Msg.alert('Message', '删除“' + Ext.util.Format.htmlEncode(nodeAttrs.city).replace(/ /g, "&nbsp;") + '”成功'); } } }, //dataUrl: 'treegrideditor.json', loader: new Ext.tree.TreeLoader({ dataUrl: '/tge/tgeservlet', baseParams: { method: 'load' } }), //---------------------------------功能测试--------------------------------- tbar: [{ text: '新增一级地区', icon: 'treegrideditor/images/add.png', listeners: { 'click': function() { treegrideditor.addNode(treegrideditor.getRootNode()); } } }, { text: '刷新', icon: 'treegrideditor/images/refresh.png', listeners: { 'click': function() { treegrideditor.getRootNode().reload(); } } }], buttonAlign: 'center', buttons: [{ xtype: 'buttongroup', columns: 1, defaults: { scale: 'medium', width: 150 }, items: [{ text: '禁用/启用“北京”新增', listeners: { 'click': function() { treegrideditor.toggleDisableObar('1', 'add'); } } }, { text: '禁用/启用“上海”修改', listeners: { 'click': function() { treegrideditor.toggleDisableObar('2', 'edit'); } } }, { text: '隐藏/显示“北京”删除', listeners: { 'click': function() { treegrideditor.toggleHideObar('1', 'remove'); } } }] }, { xtype: 'buttongroup', columns: 1, defaults: { scale: 'medium', width: 150 }, items: [{ text: '验证“北京市”是否存在', listeners: { 'click': function() { var r = treegrideditor.hasNode(treegrideditor.getRootNode(), { id: '1', city: '北京' }); Ext.Msg.alert('Message', '返回值: ' + (r ? '存在' : '不存在')); } } }, { text: '验证“昌平区”是否存在', listeners: { 'click': function() { var r = treegrideditor.hasNode('1', { city: '昌平区' }, true); Ext.Msg.alert('Message', '返回值: ' + (r ? '存在' : '不存在')); } } }, { text: '验证“海淀区”是否存在', listeners: { 'click': function() { var r = treegrideditor.hasNode('1', { id: '111111', city: '海淀区' }, true, true); Ext.Msg.alert('Message', '返回值: ' + (r ? '存在' : '不存在')); } } }] }, { xtype: 'buttongroup', columns: 2, defaults: { scale: 'medium', width: 150 }, items: [{ text: '获取被选中对象', listeners: { 'click': function() { Ext.Msg.alert('Message', treegrideditor.getChecked('city')); } } }, { text: '批量新增', listeners: { 'click': function() { treegrideditor.batchProcess('add'); } } }, { text: '批量修改', listeners: { 'click': function() { treegrideditor.batchProcess('edit'); } } }, { text: '批量删除', listeners: { 'click': function() { treegrideditor.batchProcess('remove'); } } }, { text: '批量保存', listeners: { 'click': function() { treegrideditor.batchProcess('update'); } } }, { text: '批量取消', listeners: { 'click': function() { treegrideditor.batchProcess('cancel'); } } }] }] }); });
TreeNodeChecked是在开发TreeGridEditor时候的一个衍生品,一起发给大家
TreeNodeChecked是一个Ext Tree级联选中插件,默认的Ext Tree的Checkbox是不带级联选中功能的,加载TreeNodeChecked插件实现Tree Checkbox的级联选中功能。
new Ext.tree.TreePanel({ ...省略部分代码... plugins: });
TreeNodeChecked还扩展了两个功能函数:
<script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/themes/advanced/langs/zh.js"></script><script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/plugins/javaeye/langs/zh.js"></script>选中节点 checkNode: function(node, checked) @param {Object} node节点ID/TreeNode/Array @param {Boolean} checked选中状态 @return void 获取被选中的树叶节点 getLeafChecked : function(p, startNode) @param {String} p属性类别 @return Array/String <script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/themes/advanced/langs/zh.js"></script><script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/plugins/javaeye/langs/zh.js"></script>选中节点 checkNode: function(node, checked) @param {Object} node节点ID/TreeNode/Array @param {Boolean} checked选中状态 @return void 获取被选中的树叶节点 getLeafChecked : function(p, startNode) @param {String} p属性类别 @return Array/String
转自:http://www.iteye.com/topic/617755
页:
[1]