header.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. var checkData = [];
  2. window.sort=require('../utilities/sort');
  3. window.Header = function getHeader(object) {
  4. let _targetDom = object.el ? document.getElementById(object.el) : document.getElementsByTagName("table")[0];//基点元素
  5. let _columns = object.column; //列名
  6. let _fixedTop = object.fixedTop || 0; //同级浮动元素高度,使当前元素追加该元素高度浮动
  7. let _isCheckAllBox = object.isCheckAllBox || true;//是否开启全选框
  8. let _data = object.data || []; //被排序数据
  9. let _restorationColumn = object.restorationColumn || 'id'; //恢复原数据基准字段
  10. let _is_restorationColumn_asc = object.is_restorationColumn_asc || false; //恢复原数据基准字段的排序类型 true:asc false:desc
  11. let _before = object.before;
  12. let sortType = {};
  13. let columnArr = [];
  14. let table = document.createElement("table");
  15. function getTargetChildNode(dom) {
  16. if (!dom || dom.tagName==='INPUT')return dom;
  17. return getTargetChildNode(dom.firstElementChild);
  18. }
  19. function createHeaderBefore() {
  20. let tr = document.createElement("tr");
  21. _before.forEach(be=>{
  22. let th = document.createElement("th");
  23. if (be.colspan)th.colSpan = be.colspan;
  24. if (be.font){
  25. let font = document.createElement("span");
  26. font.className = be.font;
  27. th.appendChild(font);
  28. }
  29. if (be.value)th.appendChild(document.createTextNode(be.value));
  30. if (be.class)th.className = be.class;
  31. tr.appendChild(th);
  32. });
  33. table.appendChild(tr);
  34. }
  35. function createHeader() {
  36. let div = document.createElement("div");
  37. div.style.position = "sticky";
  38. div.style.position = "-webkit-sticky";
  39. div.style.top = _fixedTop+"px";
  40. div.style.backgroundColor = "white";
  41. div.style.zIndex = "1030";
  42. table.className = "table table-bordered mb-0 text-center";
  43. let tr = document.createElement("tr");
  44. let firstTr = _targetDom.getElementsByTagName("tr")[0];
  45. let tds = [];
  46. if (!firstTr){
  47. tr.className = "text-nowrap";
  48. }else tds = firstTr.children;
  49. if (_isCheckAllBox){
  50. let th = document.createElement("th");
  51. if (firstTr) th.style.minWidth = tds[0].offsetWidth+"px";
  52. let check = document.createElement("input");
  53. check.type = "checkbox";
  54. check.id = "checkAll";
  55. let trs = _targetDom.getElementsByTagName("tr");
  56. check.onchange = function () {
  57. if (event.target.checked){
  58. for (let i=0;i<trs.length;i++){
  59. let checkbox = getTargetChildNode(trs[i].getElementsByTagName("td")[0]);
  60. if (!checkbox.checked){
  61. checkData.push(checkbox.value);
  62. checkbox.checked = true;
  63. }
  64. }
  65. }else{
  66. checkData = [];
  67. for (let i=0;i<trs.length;i++){
  68. let checkbox = getTargetChildNode(trs[i].getElementsByTagName("td")[0]);
  69. if (checkbox.checked)checkbox.checked = false;
  70. }
  71. }
  72. };
  73. for (let i=0;i<trs.length;i++){
  74. let checkbox = getTargetChildNode(trs[i].getElementsByTagName("td")[0]);
  75. if (checkbox) checkbox.onchange = function () {
  76. if (event.target.checked)checkData.push(checkbox.value);
  77. else checkData.splice(checkData.indexOf(checkbox.value),1);
  78. if (checkData.length === _data.length && !check.checked)check.checked=true;
  79. if (checkData.length !== _data.length && check.checked) check.checked=false;
  80. }
  81. }
  82. th.appendChild(check);
  83. tr.appendChild(th);
  84. }
  85. let i = (_isCheckAllBox && firstTr) ? 1 : 0;
  86. for (i;i<(tds.length>0 ? tds.length : _columns.length);i++){
  87. let th = document.createElement("th");
  88. if (firstTr) th.style.minWidth = (tds[i].offsetWidth-0.3)+"px";
  89. let column = _columns[_isCheckAllBox ? i-1 : i];
  90. if (_columns && column){
  91. if (column.style)for (let key in column.style)if (column.style.hasOwnProperty(key)) th.style[key] = column.style[key];
  92. if (column.class)th.className = column.class;
  93. let span = document.createElement("span");
  94. span.style.display = "inline-block";
  95. if (!column.neglect){
  96. th.style.cursor = "pointer";
  97. let font = document.createElement("span");
  98. font.className = "fa fa-sort";
  99. span.appendChild(font);
  100. th.onclick = rule(column,font);
  101. }
  102. span.appendChild(document.createTextNode((column.value ? column.value : '')));
  103. th.appendChild(span);
  104. }
  105. tr.appendChild(th);
  106. }
  107. table.appendChild(tr);
  108. div.appendChild(table);
  109. _targetDom.parentNode.insertBefore(div,_targetDom);
  110. }
  111. //点击事件触发的排序规则
  112. function rule(column,columnSort) {
  113. return function () {
  114. if (!sortType[column.name]){
  115. sortType[column.name] = 'asc';
  116. columnArr.push(column.name);
  117. columnSort.className = "fa fa-sort-asc";
  118. let columnArrTemp = [];
  119. columnArrTemp.push.apply(columnArrTemp,columnArr);
  120. window.sort.sort(_data,columnArrTemp,sortType);
  121. return ;
  122. }
  123. if (sortType[column.name] === 'asc'){
  124. sortType[column.name] = 'desc';
  125. columnSort.className = "fa fa-sort-desc";
  126. let columnArrTemp = [];
  127. columnArrTemp.push.apply(columnArrTemp,columnArr);
  128. window.sort.sort(_data,columnArrTemp,sortType);
  129. return ;
  130. }
  131. if (sortType[column.name] === 'desc'){
  132. delete sortType[column.name];
  133. columnArr.some(function (name, index) {
  134. if (name === column.name){
  135. columnArr.splice(index,1);
  136. return true;
  137. }
  138. });
  139. columnSort.className = "fa fa-sort";
  140. if (columnArr.length === 0){
  141. //希尔排序
  142. let arr = [];
  143. arr.push.apply(arr,_data);
  144. let len = arr.length;
  145. for(let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
  146. for(let i = gap; i < len; i++) {
  147. let j = i;
  148. let current = arr[i];
  149. if (_is_restorationColumn_asc){
  150. while(j - gap >= 0 && Number(current[_restorationColumn]) < Number(arr[j - gap][_restorationColumn])) {
  151. arr[j] = arr[j - gap];
  152. j = j - gap;
  153. }
  154. }else{
  155. while(j - gap >= 0 && Number(current[_restorationColumn]) > Number(arr[j - gap][_restorationColumn])) {
  156. arr[j] = arr[j - gap];
  157. j = j - gap;
  158. }
  159. }
  160. arr[j] = current;
  161. }
  162. }
  163. _data.length = 0;
  164. _data.push.apply(_data,arr);
  165. return;
  166. }
  167. let columnArrTemp = [];
  168. columnArrTemp.push.apply(columnArrTemp,columnArr);
  169. window.sort.sort(_data,columnArrTemp,sortType);
  170. }
  171. }
  172. }
  173. //初始化
  174. this.init = function() {
  175. if (_before)createHeaderBefore();
  176. createHeader();
  177. };
  178. };