]>
git.proxmox.com Git - extjs.git/blob - extjs/packages/ux/src/ajax/DataSimlet.js
2 * This base class is used to handle data preparation (e.g., sorting, filtering and
5 Ext
.define('Ext.ux.ajax.DataSimlet', function() {
6 function makeSortFn(def
, cmp
) {
7 var order
= def
.direction
,
8 sign
= (order
&& order
.toUpperCase() === 'DESC') ? -1 : 1;
10 return function(leftRec
, rightRec
) {
11 var lhs
= leftRec
[def
.property
],
12 rhs
= rightRec
[def
.property
],
13 c
= (lhs
< rhs
) ? -1 : ((rhs
< lhs
) ? 1 : 0);
19 return cmp(leftRec
, rightRec
);
23 function makeSortFns(defs
, cmp
) {
26 for (sortFn
= cmp
, i
= defs
&& defs
.length
; i
;) {
27 sortFn
= makeSortFn(defs
[--i
], sortFn
);
34 extend
: 'Ext.ux.ajax.Simlet',
36 buildNodes: function(node
, path
) {
42 children
, i
, child
, name
;
44 me
.nodes
[path
] = nodeData
;
46 for (i
= 0; i
< len
; ++i
) {
47 nodeData
.data
.push(child
= node
[i
]);
48 name
= child
.text
|| child
.title
;
50 child
.id
= path
? path
+ '/' + name
: name
;
51 children
= child
.children
;
53 if (!(child
.leaf
= !children
)) {
54 delete child
.children
;
56 me
.buildNodes(children
, child
.id
);
61 deleteRecord: function(pos
) {
62 if (this.data
&& typeof this.data
!== 'function') {
63 Ext
.Array
.removeAt(this.data
, pos
);
67 fixTree: function(ctx
, tree
) {
69 node
= ctx
.params
.node
,
72 if (!(nodes
= me
.nodes
)) {
73 me
.nodes
= nodes
= {};
74 me
.buildNodes(tree
, '');
81 me
.node
.sortedData
= me
.sortedData
;
82 me
.node
.currentOrder
= me
.currentOrder
;
87 me
.sortedData
= node
.sortedData
;
88 me
.currentOrder
= node
.currentOrder
;
95 getData: function(ctx
) {
98 order
= (params
.filter
|| '') + (params
.group
|| '') + '-' + (params
.sort
|| '') +
99 '-' + (params
.dir
|| ''),
101 dynamicData
, data
, fields
, sortFn
, filters
;
104 me
.fixTree(ctx
, tree
);
109 if (typeof data
=== 'function') {
111 data
= data
.call(this, ctx
);
114 // If order is '--' then it means we had no order passed, due to the string concat above
115 if (!data
|| order
=== '--') {
119 if (!dynamicData
&& order
=== me
.currentOrder
) {
120 return me
.sortedData
;
123 ctx
.filterSpec
= params
.filter
&& Ext
.decode(params
.filter
);
124 ctx
.groupSpec
= params
.group
&& Ext
.decode(params
.group
);
126 fields
= params
.sort
;
129 fields
= [{ direction
: params
.dir
, property
: fields
}];
131 else if (params
.sort
) {
132 fields
= Ext
.decode(params
.sort
);
138 if (ctx
.filterSpec
) {
139 filters
= new Ext
.util
.FilterCollection();
141 filters
.add(this.processFilters(ctx
.filterSpec
));
142 data
= Ext
.Array
.filter(data
, filters
.getFilterFn());
145 sortFn
= makeSortFns((ctx
.sortSpec
= fields
));
148 sortFn
= makeSortFns([ctx
.groupSpec
], sortFn
);
151 // If a straight Ajax request, data may not be an array.
152 // If an Array, preserve 'physical' order of raw data...
153 data
= Ext
.isArray(data
) ? data
.slice(0) : data
;
156 Ext
.Array
.sort(data
, sortFn
);
159 me
.sortedData
= data
;
160 me
.currentOrder
= order
;
165 processFilters
: Ext
.identityFn
,
167 getPage: function(ctx
, data
) {
169 length
= data
.length
,
170 start
= ctx
.params
.start
|| 0,
171 end
= ctx
.params
.limit
? Math
.min(length
, start
+ ctx
.params
.limit
) : length
;
173 if (start
|| end
< length
) {
174 ret
= ret
.slice(start
, end
);
180 getGroupSummary: function(groupField
, rows
, ctx
) {
184 getSummary: function(ctx
, data
, page
) {
186 groupField
= ctx
.groupSpec
.property
,
193 Ext
.each(page
, function(rec
) {
194 fieldValue
= rec
[groupField
];
195 todo
[fieldValue
] = true;
200 summary
.push(me
.getGroupSummary(groupField
, accum
, ctx
));
205 // data is ordered primarily by the groupField, so one pass can pick up all
206 // the summaries one at a time.
207 Ext
.each(data
, function(rec
) {
208 fieldValue
= rec
[groupField
];
210 if (lastFieldValue
!== fieldValue
) {
212 lastFieldValue
= fieldValue
;
215 if (!todo
[fieldValue
]) {
216 // if we have even 1 summary, we have summarized all that we need
217 // (again because data and page are ordered by groupField)
218 return !summary
.length
;
231 flush(); // make sure that last pesky summary goes...