]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | /**\r |
2 | * A small grid nested within a parent grid's row. \r | |
3 | *\r | |
4 | * See the [Kitchen Sink](http://dev.sencha.com/extjs/5.0.1/examples/kitchensink/#customer-grid) for example usage.\r | |
5 | */\r | |
6 | Ext.define('Ext.ux.grid.SubTable', {\r | |
7 | extend: 'Ext.grid.plugin.RowExpander',\r | |
8 | \r | |
9 | alias: 'plugin.subtable',\r | |
10 | \r | |
11 | rowBodyTpl: ['<table class="' + Ext.baseCSSPrefix + 'grid-subtable"><tbody>',\r | |
12 | '{%',\r | |
13 | 'this.owner.renderTable(out, values);',\r | |
14 | '%}',\r | |
15 | '</tbody></table>'\r | |
16 | ],\r | |
17 | \r | |
18 | init: function(grid) {\r | |
19 | var me = this,\r | |
20 | columns = me.columns,\r | |
21 | len, i, columnCfg;\r | |
22 | \r | |
23 | me.callParent(arguments);\r | |
24 | \r | |
25 | me.columns = [];\r | |
26 | if (columns) {\r | |
27 | for (i = 0, len = columns.length; i < len; ++i) {\r | |
28 | // Don't register with the component manager, we create them to use\r | |
29 | // their rendering smarts, but don't want to treat them as real components\r | |
30 | columnCfg = Ext.apply({\r | |
31 | preventRegister: true\r | |
32 | }, columns[i]);\r | |
33 | columnCfg.xtype = columnCfg.xtype || 'gridcolumn';\r | |
34 | me.columns.push(Ext.widget(columnCfg));\r | |
35 | }\r | |
36 | }\r | |
37 | },\r | |
38 | \r | |
39 | destroy: function() {\r | |
40 | var columns = this.columns,\r | |
41 | len, i;\r | |
42 | \r | |
43 | if (columns) {\r | |
44 | for (i = 0, len = columns.length; i < len; ++i) {\r | |
45 | columns[i].destroy();\r | |
46 | }\r | |
47 | }\r | |
48 | this.columns = null;\r | |
49 | this.callParent();\r | |
50 | },\r | |
51 | \r | |
52 | getRowBodyFeatureData: function(record, idx, rowValues) {\r | |
53 | this.callParent(arguments);\r | |
54 | rowValues.rowBodyCls += ' ' + Ext.baseCSSPrefix + 'grid-subtable-row';\r | |
55 | },\r | |
56 | \r | |
57 | renderTable: function(out, rowValues) {\r | |
58 | var me = this,\r | |
59 | columns = me.columns,\r | |
60 | numColumns = columns.length,\r | |
61 | associatedRecords = me.getAssociatedRecords(rowValues.record),\r | |
62 | recCount = associatedRecords.length,\r | |
63 | rec, column, i, j, value;\r | |
64 | \r | |
65 | out.push('<thead>');\r | |
66 | for (j = 0; j < numColumns; j++) {\r | |
67 | out.push('<th class="' + Ext.baseCSSPrefix + 'grid-subtable-header">', columns[j].text, '</th>');\r | |
68 | }\r | |
69 | out.push('</thead>');\r | |
70 | for (i = 0; i < recCount; i++) {\r | |
71 | rec = associatedRecords[i];\r | |
72 | out.push('<tr>');\r | |
73 | for (j = 0; j < numColumns; j++) {\r | |
74 | column = columns[j];\r | |
75 | value = rec.get(column.dataIndex);\r | |
76 | if (column.renderer && column.renderer.call) {\r | |
77 | value = column.renderer.call(column.scope || me, value, {}, rec);\r | |
78 | }\r | |
79 | out.push('<td class="' + Ext.baseCSSPrefix + 'grid-subtable-cell"');\r | |
80 | if (column.width != null) {\r | |
81 | out.push(' style="width:' + column.width + 'px"');\r | |
82 | }\r | |
83 | out.push('><div class="' + Ext.baseCSSPrefix + 'grid-cell-inner">', value, '</div></td>');\r | |
84 | }\r | |
85 | out.push('</tr>');\r | |
86 | }\r | |
87 | },\r | |
88 | \r | |
89 | getRowBodyContentsFn: function(rowBodyTpl) {\r | |
90 | var me = this;\r | |
91 | return function (rowValues) {\r | |
92 | rowBodyTpl.owner = me;\r | |
93 | return rowBodyTpl.applyTemplate(rowValues);\r | |
94 | };\r | |
95 | },\r | |
96 | \r | |
97 | getAssociatedRecords: function(record) {\r | |
98 | return record[this.association]().getRange();\r | |
99 | }\r | |
100 | }); |