/*!
- * Ext JS Library 3.1.0
- * Copyright(c) 2006-2009 Ext JS, LLC
+ * Ext JS Library 3.1.1
+ * Copyright(c) 2006-2010 Ext JS, LLC
* licensing@extjs.com
* http://www.extjs.com/license
*/
},\r
\r
onMouseDown : function(e, t){\r
- if(t.className && t.className.indexOf('x-grid3-cc-'+this.id) != -1){\r
+ if(Ext.fly(t).hasClass(this.createId())){\r
e.stopEvent();\r
var index = this.grid.getView().findRowIndex(t);\r
var record = this.grid.store.getAt(index);\r
\r
renderer : function(v, p, record){\r
p.css += ' x-grid3-check-col-td'; \r
- return '<div class="x-grid3-check-col'+(v?'-on':'')+' x-grid3-cc-'+this.id+'"> </div>';\r
+ return String.format('<div class="x-grid3-check-col{0} {1}"> </div>', v ? '-on' : '', this.createId());\r
+ },\r
+ \r
+ createId : function(){\r
+ return 'x-grid3-cc-' + this.id;\r
}\r
};\r
\r
// backwards compat\r
Ext.grid.CheckColumn = Ext.ux.grid.CheckColumn;Ext.ns('Ext.ux.grid');\r
\r
-if(Ext.isWebKit){\r
- Ext.grid.GridView.prototype.borderWidth = 0;\r
-}\r
-\r
Ext.ux.grid.ColumnHeaderGroup = Ext.extend(Ext.util.Observable, {\r
\r
constructor: function(config){\r
}\r
}\r
return {\r
- width: (Ext.isBorderBox ? width : Math.max(width - this.borderWidth, 0)) + 'px',\r
+ width: (Ext.isBorderBox || (Ext.isWebKit && !Ext.isSafari2) ? width : Math.max(width - this.borderWidth, 0)) + 'px',\r
hidden: hidden\r
};\r
},\r
if(cm.isFixed(newIndex)){\r
return false;\r
}\r
- var row = Ext.ux.grid.ColumnHeaderGroup.prototype.getGroupRowIndex.call(this.view, h), \r
- oldGroup = Ext.ux.grid.ColumnHeaderGroup.prototype.getGroupSpan.call(this.view, row, oldIndex), \r
+ var row = Ext.ux.grid.ColumnHeaderGroup.prototype.getGroupRowIndex.call(this.view, h),\r
+ oldGroup = Ext.ux.grid.ColumnHeaderGroup.prototype.getGroupSpan.call(this.view, row, oldIndex),\r
newGroup = Ext.ux.grid.ColumnHeaderGroup.prototype.getGroupSpan.call(this.view, row, newIndex),\r
oldIndex = oldGroup.col;\r
newIndex = newGroup.col + (pt == "after" ? newGroup.colspan : 0);\r
* The filter collection binds to the\r
* <code>{@link Ext.grid.GridPanel#beforestaterestore beforestaterestore}</code>\r
* and <code>{@link Ext.grid.GridPanel#beforestatesave beforestatesave}</code>\r
- * events in order to be stateful. \r
+ * events in order to be stateful.\r
* </div></li>\r
* <li><b>Grid Changes</b> :\r
* <div class="sub-desc"><ul>\r
* </ul></div></li>\r
* </ul></div>\r
* <p><b><u>Example usage:</u></b></p>\r
- * <pre><code> \r
+ * <pre><code>\r
var store = new Ext.data.GroupingStore({\r
...\r
});\r
- \r
+\r
var filters = new Ext.ux.grid.GridFilters({\r
autoReload: false, //don't reload automatically\r
local: true, //only filter locally\r
var cm = new Ext.grid.ColumnModel([{\r
...\r
}]);\r
- \r
+\r
var grid = new Ext.grid.GridPanel({\r
ds: store,\r
cm: cm,\r
init : function (grid) {\r
if (grid instanceof Ext.grid.GridPanel) {\r
this.grid = grid;\r
- \r
+\r
this.bindStore(this.grid.getStore(), true);\r
// assumes no filters were passed in the constructor, so try and use ones from the colModel\r
if(this.filters.getCount() == 0){\r
this.addFilters(this.grid.getColumnModel());\r
}\r
- \r
+\r
this.grid.filters = this;\r
- \r
+\r
this.grid.addEvents({'filterupdate': true});\r
- \r
+\r
grid.on({\r
scope: this,\r
beforestaterestore: this.applyState,\r
beforedestroy: this.destroy,\r
reconfigure: this.onReconfigure\r
});\r
- \r
+\r
if (grid.rendered){\r
this.onRender();\r
} else {\r
render: this.onRender\r
});\r
}\r
- \r
+\r
} else if (grid instanceof Ext.PagingToolbar) {\r
this.toolbar = grid;\r
}\r
},\r
- \r
+\r
/**\r
* @private\r
* Handler for the grid's beforestaterestore event (fires before the state of the\r
* grid is restored).\r
* @param {Object} grid The grid object\r
* @param {Object} state The hash of state values returned from the StateProvider.\r
- */ \r
+ */\r
applyState : function (grid, state) {\r
var key, filter;\r
this.applyingState = true;\r
}\r
delete this.applyingState;\r
},\r
- \r
+\r
/**\r
* Saves the state of all active filters\r
* @param {Object} grid\r
});\r
return (state.filters = filters);\r
},\r
- \r
+\r
/**\r
* @private\r
* Handler called when the grid is rendered\r
- */ \r
+ */\r
onRender : function () {\r
this.grid.getView().on('refresh', this.onRefresh, this);\r
this.createMenu();\r
/**\r
* @private\r
* Handler called by the grid 'beforedestroy' event\r
- */ \r
+ */\r
destroy : function () {\r
this.removeAll();\r
this.purgeListeners();\r
if(this.filterMenu){\r
Ext.menu.MenuMgr.unregister(this.filterMenu);\r
this.filterMenu.destroy();\r
- this.filterMenu = this.menu.menu = null; \r
+ this.filterMenu = this.menu.menu = null;\r
}\r
},\r
\r
/**\r
* Remove all filters, permanently destroying them.\r
- */ \r
+ */\r
removeAll : function () {\r
if(this.filters){\r
Ext.destroy.apply(Ext, this.filters.items);\r
- // remove all items from the collection \r
+ // remove all items from the collection\r
this.filters.clear();\r
}\r
},\r
/**\r
* @private\r
* Handler called when the grid reconfigure event fires\r
- */ \r
+ */\r
onReconfigure : function () {\r
this.bindStore(this.grid.getStore());\r
this.store.clearFilter();\r
hmenu = view.hmenu;\r
\r
if (this.showMenu && hmenu) {\r
- \r
+\r
this.sep = hmenu.addSeparator();\r
this.filterMenu = new Ext.menu.Menu({\r
id: this.grid.id + '-filters-menu'\r
- }); \r
+ });\r
this.menu = hmenu.add({\r
checked: false,\r
itemId: 'filters',\r
/**\r
* @private\r
* Handler called by the grid's hmenu beforeshow event\r
- */ \r
+ */\r
onMenu : function (filterMenu) {\r
var filter = this.getMenuFilter();\r
\r
if (filter) {\r
-/* \r
+/*\r
TODO: lazy rendering\r
if (!filter.menu) {\r
filter.menu = filter.createMenu();\r
// disable the menu if filter.disabled explicitly set to true\r
this.menu.setDisabled(filter.disabled === true);\r
}\r
- \r
+\r
this.menu.setVisible(filter !== undefined);\r
this.sep.setVisible(filter !== undefined);\r
},\r
- \r
+\r
/** @private */\r
onCheckChange : function (item, value) {\r
this.getMenuFilter().setActive(value);\r
},\r
- \r
+\r
/** @private */\r
onBeforeCheck : function (check, value) {\r
return !value || this.getMenuFilter().isActivatable();\r
* Handler for all events on filters.\r
* @param {String} event Event name\r
* @param {Object} filter Standard signature of the event before the event is fired\r
- */ \r
+ */\r
onStateChange : function (event, filter) {\r
if (event === 'serialize') {\r
return;\r
this.deferredUpdate.delay(this.updateBuffer);\r
}\r
this.updateColumnHeadings();\r
- \r
+\r
if (!this.applyingState) {\r
this.grid.saveState();\r
- } \r
+ }\r
this.grid.fireEvent('filterupdate', this, filter);\r
},\r
- \r
+\r
/**\r
* @private\r
* Handler for store's beforeload event when configured for remote filtering\r
*/\r
onBeforeLoad : function (store, options) {\r
options.params = options.params || {};\r
- this.cleanParams(options.params); \r
+ this.cleanParams(options.params);\r
var params = this.buildQuery(this.getFilterData());\r
Ext.apply(options.params, params);\r
},\r
- \r
+\r
/**\r
* @private\r
* Handler for store's load event when configured for local filtering\r
/**\r
* @private\r
* Handler called when the grid's view is refreshed\r
- */ \r
+ */\r
onRefresh : function () {\r
this.updateColumnHeadings();\r
},\r
\r
/**\r
* Update the styles for the header row based on the active filters\r
- */ \r
+ */\r
updateColumnHeadings : function () {\r
var view = this.grid.getView(),\r
- hds, i, len, filter;\r
+ i, len, filter;\r
if (view.mainHd) {\r
- hds = view.mainHd.select('td').removeClass(this.filterCls);\r
for (i = 0, len = view.cm.config.length; i < len; i++) {\r
filter = this.getFilter(view.cm.config[i].dataIndex);\r
- if (filter && filter.active) {\r
- hds.item(i).addClass(this.filterCls);\r
- }\r
+ Ext.fly(view.getHeaderCell(i))[filter && filter.active ? 'addClass' : 'removeClass'](this.filterCls);\r
}\r
}\r
},\r
- \r
+\r
/** @private */\r
reload : function () {\r
if (this.local) {\r
store.reload();\r
}\r
},\r
- \r
+\r
/**\r
* Method factory that generates a record validator for the filters active at the time\r
* of invokation.\r
f.push(filter);\r
}\r
});\r
- \r
+\r
len = f.length;\r
return function (record) {\r
for (i = 0; i < len; i++) {\r
return true;\r
};\r
},\r
- \r
+\r
/**\r
* Adds a filter to the collection and observes it for state change.\r
* @param {Object/Ext.ux.grid.filter.Filter} config A filter configuration or a filter object.\r
var Cls = this.getFilterClass(config.type),\r
filter = config.menu ? config : (new Cls(config));\r
this.filters.add(filter);\r
- \r
+\r
Ext.util.Observable.capture(filter, this.onStateChange, this);\r
return filter;\r
},\r
* @param {Array/Ext.grid.ColumnModel} filters Either an Array of\r
* filter configuration objects or an Ext.grid.ColumnModel. The columns\r
* of a passed Ext.grid.ColumnModel will be examined for a <code>filter</code>\r
- * property and, if present, will be used as the filter configuration object. \r
+ * property and, if present, will be used as the filter configuration object.\r
*/\r
addFilters : function (filters) {\r
if (filters) {\r
// filter type is specified in order of preference:\r
// filter type specified in config\r
// type specified in store's field's type config\r
- filter.type = filter.type || this.store.fields.get(dI).type; \r
+ filter.type = filter.type || this.store.fields.get(dI).type;\r
}\r
} else {\r
filter = filters[i];\r
}\r
- // if filter config found add filter for the column \r
+ // if filter config found add filter for the column\r
if (filter) {\r
this.addFilter(filter);\r
}\r
}\r
}\r
},\r
- \r
+\r
/**\r
* Returns a filter for the given dataIndex, if one exists.\r
* @param {String} dataIndex The dataIndex of the desired filter object.\r
});\r
return filters;\r
},\r
- \r
+\r
/**\r
* Function to take the active filters data and build it into a query.\r
* The format of the query depends on the <code>{@link #encode}</code>\r
* configuration:\r
* <div class="mdetail-params"><ul>\r
- * \r
+ *\r
* <li><b><tt>false</tt></b> : <i>Default</i>\r
* <div class="sub-desc">\r
* Flatten into query string of the form (assuming <code>{@link #paramPrefix}='filters'</code>:\r
filters[0][data][value]="someValue3"&\r
* </code></pre>\r
* </div></li>\r
- * <li><b><tt>true</tt></b> : \r
+ * <li><b><tt>true</tt></b> :\r
* <div class="sub-desc">\r
* JSON encode the filter data\r
* <pre><code>\r
f = filters[i];\r
root = [this.paramPrefix, '[', i, ']'].join('');\r
p[root + '[field]'] = f.field;\r
- \r
+\r
dataPrefix = root + '[data]';\r
for (key in f.data) {\r
p[[dataPrefix, '[', key, ']'].join('')] = f.data[key];\r
f.data\r
));\r
}\r
- // only build if there is active filter \r
+ // only build if there is active filter\r
if (tmp.length > 0){\r
p[this.paramPrefix] = Ext.util.JSON.encode(tmp);\r
}\r
}\r
return p;\r
},\r
- \r
+\r
/**\r
* Removes filter related query parameters from the provided object.\r
* @param {Object} p Query parameters that may contain filter related fields.\r
}\r
}\r
},\r
- \r
+\r
/**\r
* Function for locating filter classes, overwrite this with your favorite\r
* loader to provide dynamic filter loading.\r
* @param {String} type The type of filter to load ('Filter' is automatically\r
* appended to the passed type; eg, 'string' becomes 'StringFilter').\r
- * @return {Class} The Ext.ux.grid.filter.Class \r
+ * @return {Class} The Ext.ux.grid.filter.Class\r
*/\r
getFilterClass : function (type) {\r
// map the supported Ext.data.Field type values into a supported filter\r
}\r
if(this.activeGroup != group && this.fireEvent('beforegroupchange', this, group, this.activeGroup) !== false){\r
if(this.activeGroup){\r
+ this.activeGroup.activeTab = null;\r
var oldEl = this.getGroupEl(this.activeGroup);\r
if(oldEl){\r
Ext.fly(oldEl).removeClass('x-grouptabs-strip-active');\r
if(!skipStripe){\r
row.className = row.className.replace(this.rowClsRe, ' ');\r
lrow.className = lrow.className.replace(this.rowClsRe, ' ');\r
- if ((idx + 1) % 2 === 0){\r
+ if ((i + 1) % 2 === 0){\r
row.className += ' x-grid3-row-alt';\r
lrow.className += ' x-grid3-row-alt';\r
}\r
* @constructor\r
* Create a new MultiSelect\r
* @param {Object} config Configuration options\r
- * @xtype multiselect \r
+ * @xtype multiselect\r
*/\r
Ext.ux.form.MultiSelect = Ext.extend(Ext.form.Field, {\r
/**\r
this.onStartDrag(x, y);\r
return true;\r
},\r
- \r
+\r
// private\r
collectSelection: function(data) {\r
data.repairXY = Ext.fly(this.view.getSelectedNodes()[0]).getXY();\r
\r
Ext.extend(Ext.ux.form.MultiSelect.DropZone, Ext.dd.DropZone, {\r
/**\r
- * Part of the Ext.dd.DropZone interface. If no target node is found, the\r
- * whole Element becomes the target, and this causes the drop gesture to append.\r
- */\r
+ * Part of the Ext.dd.DropZone interface. If no target node is found, the\r
+ * whole Element becomes the target, and this causes the drop gesture to append.\r
+ */\r
getTargetFromEvent : function(e) {\r
var target = e.getTarget();\r
return target;\r
var pt = this.getDropPoint(e, n, dd);\r
if (n != this.ms.fs.body.dom)\r
n = this.view.findItemFromChild(n);\r
- var insertAt = (this.ms.appendOnly || (n == this.ms.fs.body.dom)) ? this.view.store.getCount() : this.view.indexOf(n);\r
- if (pt == "below") {\r
- insertAt++;\r
+\r
+ if(this.ms.appendOnly) {\r
+ insertAt = this.view.store.getCount();\r
+ } else {\r
+ insertAt = n == this.ms.fs.body.dom ? this.view.store.getCount() - 1 : this.view.indexOf(n);\r
+ if (pt == "below") {\r
+ insertAt++;\r
+ }\r
}\r
\r
var dir = false;\r
/**
* @class Ext.ux.grid.RowEditor
- * @extends Ext.Panel
+ * @extends Ext.Panel
* Plugin (ptype = 'roweditor') that adds the ability to rapidly edit full rows in a grid.
* A validation mode may be enabled which uses AnchorTips to notify the user of all
* validation errors at once.
- *
+ *
* @ptype roweditor
*/
Ext.ux.grid.RowEditor = Ext.extend(Ext.Panel, {
monitorValid: true,
focusDelay: 250,
errorSummary: true,
-
+
saveText: 'Save',
cancelText: 'Cancel',
commitChangesText: 'You need to commit or cancel your changes',
* @event canceledit
* Fired when the editor is cancelled.
* @param {Ext.ux.grid.RowEditor} roweditor This object
- * @param {Boolean} forced True if the cancel button is pressed, false is the editor was invalid.
+ * @param {Boolean} forced True if the cancel button is pressed, false is the editor was invalid.
*/
'canceledit',
/**
columnresize: this.verifyLayout,
columnmove: this.refreshFields,
reconfigure: this.refreshFields,
- beforedestroy : this.beforedestroy,
- destroy : this.destroy,
+ beforedestroy : this.beforedestroy,
+ destroy : this.destroy,
bodyscroll: {
buffer: 250,
fn: this.positionButtons
var g = this.grid, view = g.getView(),
row = view.getRow(rowIndex),
record = g.store.getAt(rowIndex);
-
+
this.record = record;
this.rowIndex = rowIndex;
this.values = {};
this.fireEvent('canceledit', this, saveChanges === false);
return;
}
- var changes = {},
- r = this.record,
+ var changes = {},
+ r = this.record,
hasChange = false,
- cm = this.grid.colModel,
+ cm = this.grid.colModel,
fields = this.items.items;
for(var i = 0, len = cm.getColumnCount(); i < len; i++){
if(!cm.isHidden(i)){
verifyLayout: function(force){
if(this.el && (this.isVisible() || force === true)){
var row = this.grid.getView().getRow(this.rowIndex);
- this.setSize(Ext.fly(row).getWidth(), Ext.fly(row).getHeight() + 9);
+ this.setSize(Ext.fly(row).getWidth(), Ext.isIE ? Ext.fly(row).getHeight() + 9 : undefined);
var cm = this.grid.colModel, fields = this.items.items;
for(var i = 0, len = cm.getColumnCount(); i < len; i++){
if(!cm.isHidden(i)){
ed = c.getEditor();
if(!ed){
ed = c.displayEditor || new Ext.form.DisplayField();
+ }else{
+ ed = ed.field;
}
if(i == 0){
ed.margins = pm('0 1 2 1');
scroll = view.scroller.dom.scrollLeft,
bw = this.btns.getWidth(),
width = Math.min(g.getWidth(), g.getColumnModel().getTotalWidth());
-
+
this.btns.el.shift({left: (width/2)-(bw/2)+scroll, top: h - 2, stopFx: true, duration:0.2});
}
},
if(this.isVisible()){
var index = 0,
cm = this.grid.getColumnModel(),
- c;
+ c,
+ ed;
if(pt){
index = this.getTargetColumnIndex(pt);
}
for(var i = index||0, len = cm.getColumnCount(); i < len; i++){
c = cm.getColumnAt(i);
- if(!c.hidden && c.getEditor()){
- c.getEditor().focus();
+ ed = c.getEditor();
+ if(!c.hidden && ed){
+ ed.field.focus();
break;
}
}
},
getTargetColumnIndex: function(pt){
- var grid = this.grid,
+ var grid = this.grid,
v = grid.view,
x = pt.left,
cms = grid.colModel.config,
- i = 0,
+ i = 0,
match = false;
for(var len = cms.length, c; c = cms[i]; i++){
if(!c.hidden){
top = parseInt(this.el.dom.style.top, 10),
scroll = v.scroller.dom.scrollTop,
h = this.el.getHeight();
-
+
if(top + h >= scroll){
t.initTarget(this.items.last().getEl());
if(!t.rendered){
// private
monitorResize:true,
+ type: 'row',
+
+ // private
+ allowContainerRemove: false,
+
// private
isValidParent : function(c, target){
- return c.getEl().dom.parentNode == this.innerCt.dom;
+ return this.innerCt && c.getPositionEl().dom.parentNode == this.innerCt.dom;
+ },
+
+ getLayoutTargetSize : function() {
+ var target = this.container.getLayoutTarget(), ret;
+ if (target) {
+ ret = target.getViewSize();
+ ret.width -= target.getPadding('lr');
+ ret.height -= target.getPadding('tb');
+ }
+ return ret;
+ },
+
+ renderAll : function(ct, target) {
+ if(!this.innerCt){
+ // the innerCt prevents wrapping and shuffling while
+ // the container is resizing
+ this.innerCt = target.createChild({cls:'x-column-inner'});
+ this.innerCt.createChild({cls:'x-clear'});
+ }
+ Ext.layout.ColumnLayout.superclass.renderAll.call(this, ct, this.innerCt);
},
// private
onLayout : function(ct, target){
var rs = ct.items.items, len = rs.length, r, i;
- if(!this.innerCt){
- target.addClass('ux-row-layout-ct');
- this.innerCt = target.createChild({cls:'x-row-inner'});
- }
- this.renderAll(ct, this.innerCt);
+ this.renderAll(ct, target);
- var size = target.getViewSize(true);
+ var size = this.getLayoutTargetSize();
if(size.width < 1 && size.height < 1){ // display none?
return;
for(i = 0; i < len; i++){
r = rs[i];
if(!r.rowHeight){
- ph -= (r.getSize().height + r.getEl().getMargins('tb'));
+ ph -= (r.getHeight() + r.getEl().getMargins('tb'));
}
}
r.setSize({height: Math.floor(r.rowHeight*ph) - r.getEl().getMargins('tb')});
}
}
+
+ // Browsers differ as to when they account for scrollbars. We need to re-measure to see if the scrollbar
+ // spaces were accounted for properly. If not, re-layout.
+ if (Ext.isIE) {
+ if (i = target.getStyle('overflow') && i != 'hidden' && !this.adjustmentPass) {
+ var ts = this.getLayoutTargetSize();
+ if (ts.width != size.width){
+ this.adjustmentPass = true;
+ this.layoutTargetSize = ts;
+ this.onLayout(ct, target);
+ }
+ }
+ }
+ delete this.adjustmentPass;
}
/**
});\r
Ext.ux.SlidingPager = Ext.extend(Object, {\r
init : function(pbar){\r
- Ext.each(pbar.items.getRange(2,6), function(c){\r
+ var idx = pbar.items.indexOf(pbar.inputItem);\r
+ Ext.each(pbar.items.getRange(idx - 2, idx + 2), function(c){\r
c.hide();\r
});\r
var slider = new Ext.Slider({\r
}\r
}\r
});\r
- pbar.insert(5, slider);\r
+ pbar.insert(idx + 1, slider);\r
pbar.on({\r
change: function(pb, data){\r
- slider.maxValue = data.pages;\r
+ slider.setMaxValue(data.pages);\r
slider.setValue(data.activePage);\r
- },\r
- beforedestroy: function(){\r
- slider.destroy();\r
}\r
});\r
}\r
this.insert(0, this.statusEl);
this.insert(1, '->');
}
-
-// this.statusEl = td.createChild({
-// cls: 'x-status-text ' + (this.iconCls || this.defaultIconCls || ''),
-// html: this.text || this.defaultText || ''
-// });
-// this.statusEl.unselectable();
-
-// this.spacerEl = td.insertSibling({
-// tag: 'td',
-// style: 'width:100%',
-// cn: [{cls:'ytb-spacer'}]
-// }, right ? 'before' : 'after');
+ this.doLayout();
},
/**
*/
Ext.ux.tree.TreeGridNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
isTreeGridNodeUI: true,
-
+
renderElements : function(n, a, targetNode, bulkRender){
var t = n.getOwnerTree(),
cols = t.columns,
buf = [
'<tbody class="x-tree-node">',
- '<tr ext:tree-node-id="', n.id ,'" class="x-tree-node-el ', a.cls, '">',
+ '<tr ext:tree-node-id="', n.id ,'" class="x-tree-node-el x-tree-node-leaf ', a.cls, '">',
'<td class="x-treegrid-col">',
'<span class="x-tree-node-indent">', this.indentMarkup, "</span>",
'<img src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow">',
Ext.ux.tree.TreeGridRootNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
isTreeGridNodeUI: true,
-
+
// private
render : function(){
if(!this.rendered){
this.wrap = this.ctNode = this.node.ownerTree.innerCt.dom;
this.node.expanded = true;
}
-
+
if(Ext.isWebKit) {
// weird table-layout: fixed issue in webkit
var ct = this.ctNode;
}
delete this.node;
},
-
+
collapse : Ext.emptyFn,
expand : Ext.emptyFn
});/**
/**
* @class Ext.ux.tree.TreeGridSorter
* @extends Ext.tree.TreeSorter
+ * Provides sorting of nodes in a {@link Ext.ux.tree.TreeGrid}. The TreeGridSorter automatically monitors events on the
+ * associated TreeGrid that might affect the tree's sort order (beforechildrenrendered, append, insert and textchange).
+ * Example usage:<br />
+ * <pre><code>
+ new Ext.ux.tree.TreeGridSorter(myTreeGrid, {
+ folderSort: true,
+ dir: "desc",
+ sortType: function(node) {
+ // sort by a custom, typed attribute:
+ return parseInt(node.id, 10);
+ }
+ });
+ </code></pre>
+ * @constructor
+ * @param {TreeGrid} tree
+ * @param {Object} config
*/
Ext.ux.tree.TreeGridSorter = Ext.extend(Ext.tree.TreeSorter, {
/**
return -1;
}
}
- var v1 = sortType ? sortType(n1.attributes[p]) : (cs ? n1.attributes[p] : n1.attributes[p].toUpperCase());
- var v2 = sortType ? sortType(n2.attributes[p]) : (cs ? n2.attributes[p] : n2.attributes[p].toUpperCase());
- if(v1 < v2){
- return dsc ? +1 : -1;
- }else if(v1 > v2){
- return dsc ? -1 : +1;
+ var v1 = sortType ? sortType(n1) : (cs ? n1.attributes[p] : n1.attributes[p].toUpperCase());
+ var v2 = sortType ? sortType(n2) : (cs ? n2.attributes[p] : n2.attributes[p].toUpperCase());
+ if(v1 < v2){
+ return dsc ? +1 : -1;
+ }else if(v1 > v2){
+ return dsc ? -1 : +1;
}else{
- return 0;
+ return 0;
}
};
},
onAfterTreeRender : function() {
- var hmenu = this.tree.hmenu;
- hmenu.insert(0,
- {itemId:'asc', text: this.sortAscText, cls: 'xg-hmenu-sort-asc'},
- {itemId:'desc', text: this.sortDescText, cls: 'xg-hmenu-sort-desc'}
- );
+ if(this.tree.hmenu){
+ this.tree.hmenu.insert(0,
+ {itemId:'asc', text: this.sortAscText, cls: 'xg-hmenu-sort-asc'},
+ {itemId:'desc', text: this.sortDescText, cls: 'xg-hmenu-sort-desc'}
+ );
+ }
this.updateSortIcon(0, 'asc');
},
return node;
},
+ clearInnerCt : function(){
+ if(Ext.isIE){
+ var dom = this.innerCt.dom;
+ while(dom.firstChild){
+ dom.removeChild(dom.firstChild);
+ }
+ }else{
+ Ext.ux.tree.TreeGrid.superclass.clearInnerCt.call(this);
+ }
+ },
+
initEvents : function() {
Ext.ux.tree.TreeGrid.superclass.initEvents.apply(this, arguments);