MergeColumnGrid.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * @Description:
  3. * @Author: hy
  4. * @Date: 2019-08-12 17:59:33
  5. * @LastEditTime: 2019-08-15 14:24:07
  6. */
  7. Ext.define('uas.view.grid.mergeColumn.MergeColumnGrid', {
  8. extend: 'Ext.grid.Panel',
  9. xtype: 'mergeColumnGrid',
  10. cls:'x-merge-grid',
  11. columnLines: true,
  12. sortableColumns: false,
  13. bufferedRenderer:false,
  14. initComponent: function () {
  15. var me = this;
  16. Ext.apply(me, {
  17. store: Ext.create('uas.store.Companies',{})
  18. });
  19. me.callParent(arguments);
  20. me.store.load(function(records, operation, success) {
  21. const grid = me;
  22. //1000条数据 100延迟 超过10000条数据 延迟固定为1秒
  23. let time = records.length*0.1>1000?1000:records.length*0.1;
  24. var myMask = new Ext.LoadMask({
  25. msg: "正在合并单元格...",
  26. target: grid.ownerCt
  27. });
  28. myMask.show();
  29. setTimeout(() => {
  30. grid.mergeCells(grid,[...new Array(grid.columns.length).keys()]);
  31. myMask.destroy();
  32. }, time);
  33. });
  34. },
  35. /*
  36. * 合并列
  37. * cols 需要合并的列index
  38. */
  39. mergeCells:function(grid,cols){
  40. var id = grid.getView().getId();
  41. //清除所有监听事件 避免一些bug
  42. grid.getView().clearListeners();
  43. //获取view
  44. var gridview = document.getElementById(id);
  45. //获取所有的tr[]
  46. var trArray = gridview.getElementsByTagName('tr');
  47. //只有一行时不合并
  48. var length = trArray.length;
  49. if (length <= 1) {
  50. return;
  51. }
  52. //把所有的行都放入第一个table 并把原来的列删除
  53. for (var i = 1; i < length; i++) {
  54. //指定位置插入对应table行的html文本
  55. trArray[i - 1].insertAdjacentHTML("afterEnd", trArray[i].innerHTML);
  56. trArray[i + 1].remove();
  57. }
  58. //margin像素 根据该合并grid的每一行的高度而定
  59. const pixel = 25;
  60. //通用方法行合并单元格
  61. var length = trArray.length;
  62. var html = "<hr style='height:0.1px;border:none;border-bottom:#e9e9e9 1px solid;'>";//分割线
  63. for (var i in cols) {
  64. var column = cols[i];//列
  65. var k = 0;//开始合并的列
  66. for (var i = 0; i < length; i++) {
  67. var num = 1;//需要合并的列数 默认是一列
  68. var data = trArray[i].childNodes[column].innerText;
  69. for (var j = i + 1; j < length; j++) {
  70. if (data == trArray[j].childNodes[column].innerText) {
  71. trArray[j].childNodes[column].style.display = 'none';
  72. if (j == length - 1) {
  73. k = j;
  74. }
  75. num++;
  76. } else {
  77. k = j;
  78. break;
  79. }
  80. }
  81. trArray[i].childNodes[column].setAttribute('rowSpan', num);
  82. trArray[i].getElementsByTagName("div")[column].setAttribute("style", "text-align:center");
  83. if (num > 1) {
  84. trArray[i].getElementsByTagName("div")[column].style.marginTop = "" + pixel * (num - 1) + "px";
  85. }
  86. trArray[k].childNodes[column].insertAdjacentHTML("afterbegin", html);
  87. if (k == length - 1) {//说明此时i是最后一行
  88. trArray[k].getElementsByTagName("div")[column].setAttribute("style", "text-align:center");
  89. break;
  90. }
  91. i = k - 1;
  92. }
  93. }
  94. },
  95. columns: [{
  96. text: 'Company',
  97. dataIndex: 'name',
  98. flex: 1,
  99. sortable: true
  100. }, {
  101. text: 'Stock Price',
  102. columns: [{
  103. text: 'Price',
  104. dataIndex: 'price',
  105. width: 75,
  106. sortable: true,
  107. formatter: 'usMoney'
  108. }, {
  109. text: 'Change',
  110. dataIndex: 'priceChange',
  111. width: 80,
  112. sortable: true
  113. }, {
  114. text: '% Change',
  115. dataIndex: 'priceChangePct',
  116. width: 100,
  117. sortable: true
  118. }]
  119. }, {
  120. text: 'Last Updated',
  121. dataIndex: 'priceLastChange',
  122. width: 115,
  123. sortable: true,
  124. formatter: 'date("m/d/Y")'
  125. }]
  126. });