]>
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 () {
7 function makeSortFn (def
, cmp
) {
8 var order
= def
.direction
,
9 sign
= (order
&& order
.toUpperCase() === 'DESC') ? -1 : 1;
11 return function (leftRec
, rightRec
) {
12 var lhs
= leftRec
[def
.property
],
13 rhs
= rightRec
[def
.property
],
14 c
= (lhs
< rhs
) ? -1 : ((rhs
< lhs
) ? 1 : 0);
20 return cmp(leftRec
, rightRec
);
24 function makeSortFns (defs
, cmp
) {
25 for (var sortFn
= cmp
, i
= defs
&& defs
.length
; i
; ) {
26 sortFn
= makeSortFn(defs
[--i
], sortFn
);
32 extend
: 'Ext.ux.ajax.Simlet',
34 buildNodes: function (node
, path
) {
40 children
, i
, child
, name
;
42 me
.nodes
[path
] = nodeData
;
44 for (i
= 0; i
< len
; ++i
) {
45 nodeData
.data
.push(child
= node
[i
]);
46 name
= child
.text
|| child
.title
;
48 child
.id
= path
? path
+ '/' + name
: name
;
49 children
= child
.children
;
51 if (!(child
.leaf
= !children
)) {
52 delete child
.children
;
54 me
.buildNodes(children
, child
.id
);
59 deleteRecord : function(pos
) {
60 if(this.data
&& typeof this.data
!== 'function') {
61 Ext
.Array
.removeAt(this.data
,pos
);
65 fixTree: function (ctx
, tree
) {
67 node
= ctx
.params
.node
,
70 if (!(nodes
= me
.nodes
)) {
71 me
.nodes
= nodes
= {};
72 me
.buildNodes(tree
, '');
78 me
.node
.sortedData
= me
.sortedData
;
79 me
.node
.currentOrder
= me
.currentOrder
;
84 me
.sortedData
= node
.sortedData
;
85 me
.currentOrder
= node
.currentOrder
;
91 getData: function (ctx
) {
94 order
= (params
.filter
|| '') + (params
.group
|| '') + '-' + (params
.sort
|| '') + '-' + (params
.dir
|| ''),
100 me
.fixTree(ctx
, tree
);
104 if (typeof data
=== 'function') {
106 data
= data
.call(this, ctx
);
109 // If order is '--' then it means we had no order passed, due to the string concat above
110 if (!data
|| order
=== '--') {
114 if (!dynamicData
&& order
== me
.currentOrder
) {
115 return me
.sortedData
;
118 ctx
.filterSpec
= params
.filter
&& Ext
.decode(params
.filter
);
119 ctx
.groupSpec
= params
.group
&& Ext
.decode(params
.group
);
121 fields
= params
.sort
;
123 fields
= [{ direction
: params
.dir
, property
: fields
}];
125 fields
= Ext
.decode(params
.sort
);
128 if (ctx
.filterSpec
) {
129 var filters
= new Ext
.util
.FilterCollection();
130 filters
.add(this.processFilters(ctx
.filterSpec
));
131 data
= Ext
.Array
.filter(data
, filters
.getFilterFn());
134 sortFn
= makeSortFns((ctx
.sortSpec
= fields
));
136 sortFn
= makeSortFns([ctx
.groupSpec
], sortFn
);
139 // If a straight Ajax request, data may not be an array.
140 // If an Array, preserve 'physical' order of raw data...
141 data
= Ext
.isArray(data
) ? data
.slice(0) : data
;
143 Ext
.Array
.sort(data
, sortFn
);
146 me
.sortedData
= data
;
147 me
.currentOrder
= order
;
152 processFilters
: Ext
.identityFn
,
154 getPage: function (ctx
, data
) {
156 length
= data
.length
,
157 start
= ctx
.params
.start
|| 0,
158 end
= ctx
.params
.limit
? Math
.min(length
, start
+ ctx
.params
.limit
) : length
;
160 if (start
|| end
< length
) {
161 ret
= ret
.slice(start
, end
);
167 getGroupSummary: function (groupField
, rows
, ctx
) {
171 getSummary: function (ctx
, data
, page
) {
173 groupField
= ctx
.groupSpec
.property
,
180 Ext
.each(page
, function (rec
) {
181 fieldValue
= rec
[groupField
];
182 todo
[fieldValue
] = true;
187 summary
.push(me
.getGroupSummary(groupField
, accum
, ctx
));
192 // data is ordered primarily by the groupField, so one pass can pick up all
193 // the summaries one at a time.
194 Ext
.each(data
, function (rec
) {
195 fieldValue
= rec
[groupField
];
197 if (lastFieldValue
!== fieldValue
) {
199 lastFieldValue
= fieldValue
;
202 if (!todo
[fieldValue
]) {
203 // if we have even 1 summary, we have summarized all that we need
204 // (again because data and page are ordered by groupField)
205 return !summary
.length
;
217 flush(); // make sure that last pesky summary goes...