DataSimlet.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /**
  2. * This base class is used to handle data preparation (e.g., sorting, filtering and
  3. * group summary).
  4. */
  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;
  9. return function (leftRec, rightRec) {
  10. var lhs = leftRec[def.property],
  11. rhs = rightRec[def.property],
  12. c = (lhs < rhs) ? -1 : ((rhs < lhs) ? 1 : 0);
  13. if (c || !cmp) {
  14. return c * sign;
  15. }
  16. return cmp(leftRec, rightRec);
  17. }
  18. }
  19. function makeSortFns (defs, cmp) {
  20. for (var sortFn = cmp, i = defs && defs.length; i; ) {
  21. sortFn = makeSortFn(defs[--i], sortFn);
  22. }
  23. return sortFn;
  24. }
  25. return {
  26. extend: 'Ext.ux.ajax.Simlet',
  27. getData: function (ctx) {
  28. var me = this,
  29. data = me.data,
  30. params = ctx.params,
  31. order = (params.group||'')+'-'+(params.sort||'')+'-'+(params.dir||''),
  32. fields,
  33. sortFn;
  34. if (!order) {
  35. return data;
  36. }
  37. ctx.groupSpec = params.group && Ext.decode(params.group);
  38. if (order == me.currentOrder) {
  39. return me.sortedData;
  40. }
  41. fields = params.sort;
  42. if (params.dir) {
  43. fields = [{ direction: params.dir, property: fields }];
  44. } else {
  45. fields = Ext.decode(params.sort);
  46. }
  47. sortFn = makeSortFns((ctx.sortSpec = fields));
  48. sortFn = makeSortFns(ctx.groupSpec, sortFn);
  49. data = data.slice(0); // preserve 'physical' order of raw data...
  50. if (sortFn) {
  51. Ext.Array.sort(data, sortFn);
  52. }
  53. me.sortedData = data;
  54. me.currentOrder = order;
  55. return data;
  56. },
  57. getPage: function (ctx, data) {
  58. var ret = data,
  59. length = data.length,
  60. start = ctx.params.start || 0,
  61. end = ctx.params.limit ? Math.min(length, start + ctx.params.limit) : length;
  62. if (start || end < length) {
  63. ret = ret.slice(start, end);
  64. }
  65. return ret;
  66. },
  67. getGroupSummary: function (groupField, rows, ctx) {
  68. return rows[0];
  69. },
  70. getSummary: function (ctx, data, page) {
  71. var me = this,
  72. groupField = ctx.groupSpec[0].property,
  73. accum,
  74. todo = {},
  75. summary = [],
  76. fieldValue,
  77. lastFieldValue;
  78. Ext.each(page, function (rec) {
  79. fieldValue = rec[groupField];
  80. todo[fieldValue] = true;
  81. });
  82. function flush () {
  83. if (accum) {
  84. summary.push(me.getGroupSummary(groupField, accum, ctx));
  85. accum = null;
  86. }
  87. }
  88. // data is ordered primarily by the groupField, so one pass can pick up all
  89. // the summaries one at a time.
  90. Ext.each(data, function (rec) {
  91. fieldValue = rec[groupField];
  92. if (lastFieldValue !== fieldValue) {
  93. flush();
  94. lastFieldValue = fieldValue;
  95. }
  96. if (!todo[fieldValue]) {
  97. // if we have even 1 summary, we have summarized all that we need
  98. // (again because data and page are ordered by groupField)
  99. return !summary.length;
  100. }
  101. if (accum) {
  102. accum.push(rec);
  103. } else {
  104. accum = [rec];
  105. }
  106. return true;
  107. });
  108. flush(); // make sure that last pesky summary goes...
  109. return summary;
  110. }
  111. };
  112. }());