/** * Produces optimized XTemplates for chunks of tables to be * used in grids, trees and other table based widgets. */ Ext.define('Ext.view.TableChunker', { singleton: true, requires: ['Ext.XTemplate'], metaTableTpl: [ '{%if (this.openTableWrap)out.push(this.openTableWrap())%}', '', '', '', '', '', '', '', '{[this.openRows()]}', '{row}', '', '{[this.embedFeature(values, parent, xindex, xcount)]}', '', '{[this.closeRows()]}', '', '
', '{%if (this.closeTableWrap)out.push(this.closeTableWrap())%}' ], constructor: function() { Ext.XTemplate.prototype.recurse = function(values, reference) { return this.apply(reference ? values[reference] : values); }; }, embedFeature: function(values, parent, x, xcount) { var tpl = ''; if (!values.disabled) { tpl = values.getFeatureTpl(values, parent, x, xcount); } return tpl; }, embedFullWidth: function(values) { var result = 'style="width:{fullWidth}px;'; // If there are no records, we need to give the table a height so that it // is displayed and causes q scrollbar if the width exceeds the View's width. if (!values.rowCount) { result += 'height:1px;'; } return result + '"'; }, openRows: function() { return ''; }, closeRows: function() { return ''; }, metaRowTpl: [ '', '', '', '
{{id}}
', '', '
', '' ], firstOrLastCls: function(xindex, xcount) { if (xindex === 1) { return Ext.view.Table.prototype.firstCls; } else if (xindex === xcount) { return Ext.view.Table.prototype.lastCls; } }, embedRowCls: function() { return '{rowCls}'; }, embedRowAttr: function() { return '{rowAttr}'; }, openTableWrap: undefined, closeTableWrap: undefined, getTableTpl: function(cfg, textOnly) { var tpl, tableTplMemberFns = { openRows: this.openRows, closeRows: this.closeRows, embedFeature: this.embedFeature, embedFullWidth: this.embedFullWidth, openTableWrap: this.openTableWrap, closeTableWrap: this.closeTableWrap }, tplMemberFns = {}, features = cfg.features || [], ln = features.length, i = 0, memberFns = { embedRowCls: this.embedRowCls, embedRowAttr: this.embedRowAttr, firstOrLastCls: this.firstOrLastCls, unselectableAttr: cfg.enableTextSelection ? '' : 'unselectable="on"', unselectableCls: cfg.enableTextSelection ? '' : Ext.baseCSSPrefix + 'unselectable' }, // copy the default metaRowTpl = Array.prototype.slice.call(this.metaRowTpl, 0), metaTableTpl; for (; i < ln; i++) { if (!features[i].disabled) { features[i].mutateMetaRowTpl(metaRowTpl); Ext.apply(memberFns, features[i].getMetaRowTplFragments()); Ext.apply(tplMemberFns, features[i].getFragmentTpl()); Ext.apply(tableTplMemberFns, features[i].getTableFragments()); } } metaRowTpl = new Ext.XTemplate(metaRowTpl.join(''), memberFns); cfg.row = metaRowTpl.applyTemplate(cfg); metaTableTpl = new Ext.XTemplate(this.metaTableTpl.join(''), tableTplMemberFns); tpl = metaTableTpl.applyTemplate(cfg); // TODO: Investigate eliminating. if (!textOnly) { tpl = new Ext.XTemplate(tpl, tplMemberFns); } return tpl; } });