Guest User

Untitled

a guest
Jan 19th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.85 KB | None | 0 0
  1. import React, {Component} from 'react';
  2. import PropTypes from 'prop-types';
  3.  
  4. import './LargeDataTable.scss';
  5.  
  6. export class LargeDataTable extends Component {
  7. render() {
  8. const { data, total } = this.props;
  9. const colHeaders = data[0].map(c => c.label);
  10. const colTotals = [];
  11. const rowTotals = [];
  12.  
  13. for (let row = 0; row < data.length; row++) {
  14. for (let col = 0; col < data[row].columns.length; col++) {
  15. const colData = data[row].columns[col];
  16. colTotals[col] = colTotals[col] || 0;
  17. colTotals[col] += colData.count;
  18.  
  19. rowTotals[col] = rowTotals[row] || 0;
  20. rowTotals[col] += colData.count;
  21. }
  22. }
  23.  
  24. const grandRowTotal = rowTotals.reduce((rgt, rt) => rgt + rt);
  25.  
  26. function handleScroll(e) {
  27. const { target } = e;
  28. const cornerElId = `LargeDataTable_tableCorner_${componentId}`;
  29. const blockerElId = `LargeDataTable_cornerBlock_${componentId}`;
  30. const colHeadSelector = `#LargeDataTable_${componentId} .LargeDataTable_head`;
  31. const rowHeadSelector = `#LargeDataTable_${componentId} .LargeDataTable_rowHead`;
  32. const corner = document.getElementById(cornerElId);
  33. const cornerBlock = document.getElementById(blockerElId);
  34. const colHeads = document.querySelector(colHeadSelector);
  35. const rowHeads = document.querySelectorAll(rowHeadSelector);
  36.  
  37. const scrollTop = target.scrollTop - 1;
  38. const scrollLeft = target.scrollLeft - 1;
  39.  
  40. const yTranslate = `translate(0, ${scrollTop}px)`;
  41. const xTranslate = `translate(${scrollLeft}px, 0)`;
  42. const xyTranslate = `translate(${scrollLeft}px, ${scrollTop}px)`;
  43.  
  44. colHeads.style.transform = yTranslate;
  45. rowHeads.forEach(h => (h.style.transform = xTranslate));
  46. cornerBlock.style.width = `${corner.offsetWidth}px`;
  47. cornerBlock.style.height = `${corner.offsetHeight}px`;
  48. cornerBlock.style.transform = xyTranslate;
  49. }
  50.  
  51. return (
  52. <div
  53. id={`LargeDataTable_${componentId}`}
  54. className="LargeDataTable"
  55. onScroll={handleScroll}>
  56. <div
  57. id={`LargeDataTable_cornerBlock_${componentId}`}
  58. className="LargeDataTable_noCol"
  59. />
  60. <table className="LargeDataTable_table">
  61. <thead className="LargeDataTable_head">
  62. <tr>
  63. <th
  64. id={`LargeDataTable_tableCorner_${componentId}`}
  65. className="LargeDataTable_col--option"
  66. />
  67. {colHeaders.map((text, i) => (
  68. <th
  69. key={i}
  70. className="LargeDataTable_col LargeDataTable_col--response">
  71. {label}
  72. </th>
  73. ))}
  74. <th className="LargeDataTable_col LargeDataTable_col--total">
  75. Total
  76. </th>
  77. </tr>
  78. </thead>
  79. <tbody className="LargeDataTable_body">
  80. {data.map((row, i) => {
  81. return (
  82. <tr key={i}>
  83. <td className="LargeDataTable_cell LargeDataTable_cell--option LargeDataTable_rowHead">
  84. {row.label}
  85. </td>
  86. {row.columns.map((col, j) => {
  87. const total = total;
  88. const pct =
  89. Math.round(100 / total * col.count) || 0;
  90. const opacity = pct / 100 || 0;
  91. const background = `rgba(84, 210, 156, ${opacity})`;
  92.  
  93. return (
  94. <td
  95. key={j}
  96. className="LargeDataTable_cell LargeDataTable_cell--response"
  97. style={{ background }}>
  98. <span className="LargeDataTable_count">
  99. {col.count}
  100. </span>
  101. <span className="LargeDataTable_percent">
  102. {pct}%
  103. </span>
  104. </td>
  105. );
  106. })}
  107. <td className="LargeDataTable_cell LargeDataTable_cell--total">
  108. {rowTotals[i]}
  109. </td>
  110. </tr>
  111. );
  112. })}
  113. </tbody>
  114. <tfoot className="LargeDataTable_foot">
  115. <tr>
  116. <td className="LargeDataTable_cell LargeDataTable_cell--option LargeDataTable_rowHead">
  117. Total
  118. </td>
  119. {colTotals.map((total, i) => (
  120. <td
  121. key={i}
  122. className="LargeDataTable_cell LargeDataTable_cell--response">
  123. <span className="LargeDataTable_count">{total}</span>
  124. </td>
  125. ))}
  126. <td className="LargeDataTable_cell LargeDataTable_cell--total">
  127. {grandRowTotal}
  128. </td>
  129. </tr>
  130. </tfoot>
  131. </table>
  132. </div>
  133. );
  134. }
  135. }
  136. }
Add Comment
Please, Sign In to add comment