DataSimlet.html 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>The source code</title>
  6. <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
  7. <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
  8. <style type="text/css">
  9. .highlight { display: block; background-color: #ddd; }
  10. </style>
  11. <script type="text/javascript">
  12. function highlight() {
  13. document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
  14. }
  15. </script>
  16. </head>
  17. <body onload="prettyPrint(); highlight();">
  18. <pre class="prettyprint lang-js"><span id='Ext-ux-ajax-DataSimlet'>/**
  19. </span> * This base class is used to handle data preparation (e.g., sorting, filtering and
  20. * group summary).
  21. */
  22. Ext.define('Ext.ux.ajax.DataSimlet', function () {
  23. function makeSortFn (def, cmp) {
  24. var order = def.direction,
  25. sign = (order &amp;&amp; order.toUpperCase() == 'DESC') ? -1 : 1;
  26. return function (leftRec, rightRec) {
  27. var lhs = leftRec[def.property],
  28. rhs = rightRec[def.property],
  29. c = (lhs &lt; rhs) ? -1 : ((rhs &lt; lhs) ? 1 : 0);
  30. if (c || !cmp) {
  31. return c * sign;
  32. }
  33. return cmp(leftRec, rightRec);
  34. }
  35. }
  36. function makeSortFns (defs, cmp) {
  37. for (var sortFn = cmp, i = defs &amp;&amp; defs.length; i; ) {
  38. sortFn = makeSortFn(defs[--i], sortFn);
  39. }
  40. return sortFn;
  41. }
  42. return {
  43. extend: 'Ext.ux.ajax.Simlet',
  44. getData: function (ctx) {
  45. var me = this,
  46. data = me.data,
  47. params = ctx.params,
  48. order = (params.group||'')+'-'+(params.sort||'')+'-'+(params.dir||''),
  49. fields,
  50. sortFn;
  51. if (!order) {
  52. return data;
  53. }
  54. ctx.groupSpec = params.group &amp;&amp; Ext.decode(params.group);
  55. if (order == me.currentOrder) {
  56. return me.sortedData;
  57. }
  58. fields = params.sort;
  59. if (params.dir) {
  60. fields = [{ direction: params.dir, property: fields }];
  61. } else {
  62. fields = Ext.decode(params.sort);
  63. }
  64. sortFn = makeSortFns((ctx.sortSpec = fields));
  65. sortFn = makeSortFns(ctx.groupSpec, sortFn);
  66. data = data.slice(0); // preserve 'physical' order of raw data...
  67. if (sortFn) {
  68. Ext.Array.sort(data, sortFn);
  69. }
  70. me.sortedData = data;
  71. me.currentOrder = order;
  72. return data;
  73. },
  74. getPage: function (ctx, data) {
  75. var ret = data,
  76. length = data.length,
  77. start = ctx.params.start || 0,
  78. end = ctx.params.limit ? Math.min(length, start + ctx.params.limit) : length;
  79. if (start || end &lt; length) {
  80. ret = ret.slice(start, end);
  81. }
  82. return ret;
  83. },
  84. getGroupSummary: function (groupField, rows, ctx) {
  85. return rows[0];
  86. },
  87. getSummary: function (ctx, data, page) {
  88. var me = this,
  89. groupField = ctx.groupSpec[0].property,
  90. accum,
  91. todo = {},
  92. summary = [],
  93. fieldValue,
  94. lastFieldValue;
  95. Ext.each(page, function (rec) {
  96. fieldValue = rec[groupField];
  97. todo[fieldValue] = true;
  98. });
  99. function flush () {
  100. if (accum) {
  101. summary.push(me.getGroupSummary(groupField, accum, ctx));
  102. accum = null;
  103. }
  104. }
  105. // data is ordered primarily by the groupField, so one pass can pick up all
  106. // the summaries one at a time.
  107. Ext.each(data, function (rec) {
  108. fieldValue = rec[groupField];
  109. if (lastFieldValue !== fieldValue) {
  110. flush();
  111. lastFieldValue = fieldValue;
  112. }
  113. if (!todo[fieldValue]) {
  114. // if we have even 1 summary, we have summarized all that we need
  115. // (again because data and page are ordered by groupField)
  116. return !summary.length;
  117. }
  118. if (accum) {
  119. accum.push(rec);
  120. } else {
  121. accum = [rec];
  122. }
  123. return true;
  124. });
  125. flush(); // make sure that last pesky summary goes...
  126. return summary;
  127. }
  128. };
  129. }());
  130. </pre>
  131. </body>
  132. </html>