EXTJS4 插件 ActionTextColumn,解决ActionColumn无法添加文字效果
Ext.define('Ext.ux.grid.ActionTextColumn', {
extend: 'Ext.grid.column.Column',
alias: ['widget.actiontextcolumn'],
/**
* @cfg {String} icon
* The URL of an image to display as the clickable element in the column. Defaults to
* `{@link Ext#BLANK_IMAGE_URL Ext.BLANK_IMAGE_URL}`.
*/
/**
* @cfg {String} iconCls
* A CSS class to apply to the icon image. To determine the class dynamically, configure the Column with
* a `{@link #getClass}` function.
*/
/**
* @cfg {Function} handler
* A function called when the icon is clicked.
* @cfg {Ext.view.Table} handler.view The owning TableView.
* @cfg {Number} handler.rowIndex The row index clicked on.
* @cfg {Number} handler.colIndex The column index clicked on.
* @cfg {Object} handler.item The clicked item (or this Column if multiple {@link #items} were not configured).
* @cfg {Event} handler.e The click event.
*/
/**
* @cfg {Object} scope
* The scope (**this** reference) in which the `{@link #handler}` and `{@link #getClass}` fuctions are executed.
* Defaults to this Column.
*/
/**
* @cfg {String} tooltip
* A tooltip message to be displayed on hover. {@link Ext.tip.QuickTipManager#init Ext.tip.QuickTipManager} must
* have been initialized.
*/
/* @cfg {Boolean} disabled
* If true, the action will not respond to click events, and will be displayed semi-opaque.
*/
/**
* @cfg {Boolean} [stopSelection=true]
* Prevent grid _row_ selection upon mousedown.
*/
/**
* @cfg {Function} getClass
* A function which returns the CSS class to apply to the icon image.
*
* @cfg {Object} getClass.v The value of the column's configured field (if any).
*
* @cfg {Object} getClass.metadata An object in which you may set the following attributes:
* @cfg {String} getClass.metadata.css A CSS class name to add to the cell's TD element.
* @cfg {String} getClass.metadata.attr An HTML attribute definition string to apply to the data container
* element *within* the table cell (e.g. 'style="color:red;"').
*
* @cfg {Ext.data.Model} getClass.r The Record providing the data.
*
* @cfg {Number} getClass.rowIndex The row index..
*
* @cfg {Number} getClass.colIndex The column index.
*
* @cfg {Ext.data.Store} getClass.store The Store which is providing the data Model.
*/
/**
* @cfg {Object[]} items
* An Array which may contain multiple icon definitions, each element of which may contain:
*
* @cfg {String} items.icon The url of an image to display as the clickable element in the column.
*
* @cfg {String} items.iconCls A CSS class to apply to the icon image. To determine the class dynamically,
* configure the item with a `getClass` function.
*
* @cfg {Function} items.getClass A function which returns the CSS class to apply to the icon image.
* @cfg {Object} items.getClass.v The value of the column's configured field (if any).
* @cfg {Object} items.getClass.metadata An object in which you may set the following attributes:
* @cfg {String} items.getClass.metadata.css A CSS class name to add to the cell's TD element.
* @cfg {String} items.getClass.metadata.attr An HTML attribute definition string to apply to the data
* container element _within_ the table cell (e.g. 'style="color:red;"').
* @cfg {Ext.data.Model} items.getClass.r The Record providing the data.
* @cfg {Number} items.getClass.rowIndex The row index..
* @cfg {Number} items.getClass.colIndex The column index.
* @cfg {Ext.data.Store} items.getClass.store The Store which is providing the data Model.
*
* @cfg {Function} items.handler A function called when the icon is clicked.
*
* @cfg {Object} items.scope The scope (`this` reference) in which the `handler` and `getClass` functions
* are executed. Fallback defaults are this Column's configured scope, then this Column.
*
* @cfg {String} items.tooltip A tooltip message to be displayed on hover.
* @cfg {Boolean} items.disabled If true, the action will not respond to click events, and will be displayed semi-opaque.
* {@link Ext.tip.QuickTipManager#init Ext.tip.QuickTipManager} must have been initialized.
*/
/**
* @property {Array} items
* An array of action items copied from the configured {@link #cfg-items items} configuration. Each will have
* an `enable` and `disable` method added which will enable and disable the associated action, and
* update the displayed icon accordingly.
*/
header: ' ',
actionIdRe: new RegExp(Ext.baseCSSPrefix + 'action-col-(\\d+)'),
/**
* @cfg {String} altText
* The alt text to use for the image element.
*/
altText: '',
sortable: false,
constructor: function(config) {
var me = this,
cfg = Ext.apply({}, config),
items = cfg.items || [me],
l = items.length,
i,
item;
// This is a Container. Delete the items config to be reinstated after construction.
delete cfg.items;
me.callParent([cfg]);
// Items is an array property of ActionColumns
me.items = items;
// Renderer closure iterates through items creating an <img> element for each and tagging with an identifying
// class name x-action-col-{n}
me.renderer = function(v, meta) {
// Allow a configured renderer to create initial value (And set the other values in the "metadata" argument!)
v = Ext.isFunction(cfg.renderer) ? cfg.renderer.apply(this, arguments)||'' : '';
meta.tdCls += ' ' + Ext.baseCSSPrefix + 'action-col-cell';
for (i = 0; i < l; i++) {
item = items[i];
item.disable = Ext.Function.bind(me.disableAction, me, [i]);
item.enable = Ext.Function.bind(me.enableAction, me, [i]);
v += '<img alt="' + (item.altText || me.altText) + '" src="' + (item.icon || Ext.BLANK_IMAGE_URL) +
'" class="' + Ext.baseCSSPrefix + 'action-col-icon ' + Ext.baseCSSPrefix + 'action-col-' + String(i) + ' ' + (item.disabled ? Ext.baseCSSPrefix + 'item-disabled' : ' ') + (item.iconCls || '') +
' ' + (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope||me.scope||me, arguments) : (me.iconCls || '')) + '"' +
((item.tooltip) ? ' data-qtip="' + item.tooltip + '"' : '') + ' />';
v += '<a href="javascript:void(0);"' +'style="text-decoration:none; position:relative;left:0px;bottom:3px;color:#000000; "'+
' class="' + Ext.baseCSSPrefix + 'action-col-icon ' + Ext.baseCSSPrefix + 'action-col-' + String(i) + ' ' + (item.disabled ? Ext.baseCSSPrefix + 'item-disabled' : ' ') + (item.cls || '') +
' ' + (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope||me.scope||me, arguments) : (me.iconCls || '')) + '"' +
((item.tooltip) ? ' data-qtip="' + item.tooltip + '"' : '') + '>' + (item.text || me.text) + '</a>';
}
return v;
};
},
/**
* Enables this ActionColumn's action at the specified index.
*/
enableAction: function(index) {
var me = this;
if (!index) {
index = 0;
} else if (!Ext.isNumber(index)) {
index = Ext.Array.indexOf(me.items, index);
}
me.items[index].disabled = false;
me.up('tablepanel').el.select('.' + Ext.baseCSSPrefix + 'action-col-' + index).removeCls(me.disabledCls);
},
/**
* Disables this ActionColumn's action at the specified index.
*/
disableAction: function(index) {
var me = this;
if (!index) {
index = 0;
} else if (!Ext.isNumber(index)) {
index = Ext.Array.indexOf(me.items, index);
}
me.items[index].disabled = true;
me.up('tablepanel').el.select('.' + Ext.baseCSSPrefix + 'action-col-' + index).addCls(me.disabledCls);
},
destroy: function() {
delete this.items;
delete this.renderer;
return this.callParent(arguments);
},
/**
* @private
* Process and refire events routed from the GridView's processEvent method.
* Also fires any configured click handlers. By default, cancels the mousedown event to prevent selection.
* Returns the event handler's status to allow canceling of GridView's bubbling process.
*/
processEvent : function(type, view, cell, recordIndex, cellIndex, e){
var me = this,
match = e.getTarget().className.match(me.actionIdRe),
item, fn;
if (match) {
item = me.items[parseInt(match[1], 10)];
if (item) {
if (type == 'click') {
fn = item.handler || me.handler;
if (fn && !item.disabled) {
fn.call(item.scope || me.scope || me, view, recordIndex, cellIndex, item, e);
}
} else if (type == 'mousedown' && item.stopSelection !== false) {
return false;
}
}
}
return me.callParent(arguments);
},
cascade: function(fn, scope) {
fn.call(scope||this, this);
},
// Private override because this cannot function as a Container, and it has an items property which is an Array, NOT a MixedCollection.
getRefItems: function() {
return [];
}
});
如何使用:
{ xtype:'actiontextcolumn', width:200, text : '操作' , items: [{ iconCls: 'search', // Use a URL in the icon config tooltip: '查看', text:'查看', handler: function(grid, rowIndex, colIndex) { //写自己的逻辑 } }, { iconCls: 'search', // Use a URL in the icon config tooltip: '下载', text:'下载', handler: function(grid, rowIndex, colIndex) { //写自己的逻辑 } } ] }
效果如下:


浙公网安备 33010602011771号