]> git.proxmox.com Git - extjs.git/blame - extjs/packages/ux/src/ajax/DataSimlet.js
add extjs 6.0.1 sources
[extjs.git] / extjs / packages / ux / src / ajax / DataSimlet.js
CommitLineData
6527f429
DM
1/**\r
2 * This base class is used to handle data preparation (e.g., sorting, filtering and\r
3 * group summary).\r
4 */\r
5Ext.define('Ext.ux.ajax.DataSimlet', function () {\r
6\r
7 function makeSortFn (def, cmp) {\r
8 var order = def.direction,\r
9 sign = (order && order.toUpperCase() === 'DESC') ? -1 : 1;\r
10\r
11 return function (leftRec, rightRec) {\r
12 var lhs = leftRec[def.property],\r
13 rhs = rightRec[def.property],\r
14 c = (lhs < rhs) ? -1 : ((rhs < lhs) ? 1 : 0);\r
15\r
16 if (c || !cmp) {\r
17 return c * sign;\r
18 }\r
19\r
20 return cmp(leftRec, rightRec);\r
21 };\r
22 }\r
23\r
24 function makeSortFns (defs, cmp) {\r
25 for (var sortFn = cmp, i = defs && defs.length; i; ) {\r
26 sortFn = makeSortFn(defs[--i], sortFn);\r
27 }\r
28 return sortFn;\r
29 }\r
30\r
31 return {\r
32 extend: 'Ext.ux.ajax.Simlet',\r
33\r
34 buildNodes: function (node, path) {\r
35 var me = this,\r
36 nodeData = {\r
37 data: []\r
38 },\r
39 len = node.length,\r
40 children, i, child, name;\r
41\r
42 me.nodes[path] = nodeData;\r
43\r
44 for (i = 0; i < len; ++i) {\r
45 nodeData.data.push(child = node[i]);\r
46 name = child.text || child.title;\r
47\r
48 child.id = path ? path + '/' + name : name;\r
49 children = child.children;\r
50\r
51 if (!(child.leaf = !children)) {\r
52 delete child.children;\r
53\r
54 me.buildNodes(children, child.id);\r
55 }\r
56 }\r
57 },\r
58\r
59 deleteRecord : function(pos) {\r
60 if(this.data && typeof this.data !== 'function') {\r
61 Ext.Array.removeAt(this.data,pos); \r
62 }\r
63 },\r
64\r
65 fixTree: function (ctx, tree) {\r
66 var me = this,\r
67 node = ctx.params.node,\r
68 nodes;\r
69\r
70 if (!(nodes = me.nodes)) {\r
71 me.nodes = nodes = {};\r
72 me.buildNodes(tree, '');\r
73 }\r
74\r
75 node = nodes[node];\r
76 if (node) {\r
77 if (me.node) {\r
78 me.node.sortedData = me.sortedData;\r
79 me.node.currentOrder = me.currentOrder;\r
80 }\r
81\r
82 me.node = node;\r
83 me.data = node.data;\r
84 me.sortedData = node.sortedData;\r
85 me.currentOrder = node.currentOrder;\r
86 } else {\r
87 me.data = null;\r
88 }\r
89 },\r
90\r
91 getData: function (ctx) {\r
92 var me = this,\r
93 params = ctx.params,\r
94 order = (params.filter || '') + (params.group || '') + '-' + (params.sort || '') + '-' + (params.dir || ''),\r
95 tree = me.tree,\r
96 dynamicData,\r
97 data, fields, sortFn;\r
98\r
99 if (tree) {\r
100 me.fixTree(ctx, tree);\r
101 }\r
102\r
103 data = me.data;\r
104 if (typeof data === 'function') {\r
105 dynamicData = true;\r
106 data = data.call(this, ctx);\r
107 }\r
108\r
109 // If order is '--' then it means we had no order passed, due to the string concat above\r
110 if (!data || order === '--') {\r
111 return data || [];\r
112 }\r
113\r
114 if (!dynamicData && order == me.currentOrder) {\r
115 return me.sortedData;\r
116 }\r
117\r
118 ctx.filterSpec = params.filter && Ext.decode(params.filter);\r
119 ctx.groupSpec = params.group && Ext.decode(params.group);\r
120\r
121 fields = params.sort;\r
122 if (params.dir) {\r
123 fields = [{ direction: params.dir, property: fields }];\r
124 } else {\r
125 fields = Ext.decode(params.sort);\r
126 }\r
127\r
128 if (ctx.filterSpec) {\r
129 var filters = new Ext.util.FilterCollection();\r
130 filters.add(this.processFilters(ctx.filterSpec));\r
131 data = Ext.Array.filter(data, filters.getFilterFn());\r
132 }\r
133\r
134 sortFn = makeSortFns((ctx.sortSpec = fields));\r
135 if (ctx.groupSpec) {\r
136 sortFn = makeSortFns([ctx.groupSpec], sortFn);\r
137 }\r
138\r
139 // If a straight Ajax request, data may not be an array.\r
140 // If an Array, preserve 'physical' order of raw data...\r
141 data = Ext.isArray(data) ? data.slice(0) : data;\r
142 if (sortFn) {\r
143 Ext.Array.sort(data, sortFn);\r
144 }\r
145\r
146 me.sortedData = data;\r
147 me.currentOrder = order;\r
148\r
149 return data;\r
150 },\r
151 \r
152 processFilters: Ext.identityFn,\r
153\r
154 getPage: function (ctx, data) {\r
155 var ret = data,\r
156 length = data.length,\r
157 start = ctx.params.start || 0,\r
158 end = ctx.params.limit ? Math.min(length, start + ctx.params.limit) : length;\r
159\r
160 if (start || end < length) {\r
161 ret = ret.slice(start, end);\r
162 }\r
163\r
164 return ret;\r
165 },\r
166\r
167 getGroupSummary: function (groupField, rows, ctx) {\r
168 return rows[0];\r
169 },\r
170\r
171 getSummary: function (ctx, data, page) {\r
172 var me = this,\r
173 groupField = ctx.groupSpec.property,\r
174 accum,\r
175 todo = {},\r
176 summary = [],\r
177 fieldValue,\r
178 lastFieldValue;\r
179\r
180 Ext.each(page, function (rec) {\r
181 fieldValue = rec[groupField];\r
182 todo[fieldValue] = true;\r
183 });\r
184\r
185 function flush () {\r
186 if (accum) {\r
187 summary.push(me.getGroupSummary(groupField, accum, ctx));\r
188 accum = null;\r
189 }\r
190 }\r
191\r
192 // data is ordered primarily by the groupField, so one pass can pick up all\r
193 // the summaries one at a time.\r
194 Ext.each(data, function (rec) {\r
195 fieldValue = rec[groupField];\r
196\r
197 if (lastFieldValue !== fieldValue) {\r
198 flush();\r
199 lastFieldValue = fieldValue;\r
200 }\r
201\r
202 if (!todo[fieldValue]) {\r
203 // if we have even 1 summary, we have summarized all that we need\r
204 // (again because data and page are ordered by groupField)\r
205 return !summary.length;\r
206 }\r
207\r
208 if (accum) {\r
209 accum.push(rec);\r
210 } else {\r
211 accum = [rec];\r
212 }\r
213\r
214 return true;\r
215 });\r
216\r
217 flush(); // make sure that last pesky summary goes...\r
218\r
219 return summary;\r
220 }\r
221 };\r
222}());\r