header.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. window.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. table.style.backgroundColor = "white";
  41. div.style.zIndex = "999";
  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. th.className = "text-left";
  53. let check = document.createElement("input");
  54. check.type = "checkbox";
  55. check.id = "checkAll";
  56. let trs = _targetDom.children;
  57. if (firstTr){
  58. while(trs[0].tagName !== 'TR')trs = trs[0].children;
  59. check.onchange = function () {
  60. if (event.target.checked){
  61. for (let i=0;i<trs.length;i++){
  62. let checkbox = getTargetChildNode(trs[i].children[0]);
  63. if (checkbox && !checkbox.checked){
  64. checkData.push(checkbox.value);
  65. checkbox.checked = true;
  66. }
  67. }
  68. }else{
  69. checkData = [];
  70. for (let i=0;i<trs.length;i++){
  71. let checkbox = getTargetChildNode(trs[i].children[0]);
  72. if (checkbox && checkbox.checked)checkbox.checked = false;
  73. }
  74. }
  75. };
  76. for (let i=0;i<trs.length;i++){
  77. let checkbox = getTargetChildNode(trs[i].children[0]);
  78. if (checkbox) checkbox.onchange = function () {
  79. if (event.target.checked)checkData.push(checkbox.value);
  80. else checkData.splice(checkData.indexOf(checkbox.value),1);
  81. if (checkData.length === _data.length && !check.checked)check.checked=true;
  82. if (checkData.length !== _data.length && check.checked) check.checked=false;
  83. }
  84. }
  85. }
  86. th.appendChild(check);
  87. tr.appendChild(th);
  88. }
  89. let i = (_isCheckAllBox && firstTr) ? 1 : 0;
  90. for (i;i<(tds.length>0 ? tds.length : _columns.length);i++){
  91. let th = document.createElement("th");
  92. if (firstTr) th.style.minWidth = (tds[i].offsetWidth-0.3)+"px";
  93. let column = _columns[_isCheckAllBox ? i-1 : i];
  94. if (_columns && column){
  95. if (column.style)for (let key in column.style)if (column.style.hasOwnProperty(key)) th.style[key] = column.style[key];
  96. if (column.class)th.className = column.class;
  97. let span = document.createElement("span");
  98. span.style.display = "inline-block";
  99. if (!column.neglect){
  100. th.style.cursor = "pointer";
  101. let font = document.createElement("span");
  102. font.className = "fa fa-sort";
  103. span.appendChild(font);
  104. th.onclick = rule(column,font);
  105. }
  106. span.appendChild(document.createTextNode((column.value ? column.value : '')));
  107. th.appendChild(span);
  108. }
  109. tr.appendChild(th);
  110. }
  111. table.appendChild(tr);
  112. div.appendChild(table);
  113. _targetDom.parentNode.insertBefore(div,_targetDom);
  114. }
  115. //点击事件触发的排序规则
  116. function rule(column,columnSort) {
  117. return function () {
  118. if (!sortType[column.name]){
  119. sortType[column.name] = 'asc';
  120. columnArr.push(column.name);
  121. columnSort.className = "fa fa-sort-asc";
  122. let columnArrTemp = [];
  123. columnArrTemp.push.apply(columnArrTemp,columnArr);
  124. window.sort.sort(_data,columnArrTemp,sortType);
  125. return ;
  126. }
  127. if (sortType[column.name] === 'asc'){
  128. sortType[column.name] = 'desc';
  129. columnSort.className = "fa fa-sort-desc";
  130. let columnArrTemp = [];
  131. columnArrTemp.push.apply(columnArrTemp,columnArr);
  132. window.sort.sort(_data,columnArrTemp,sortType);
  133. return ;
  134. }
  135. if (sortType[column.name] === 'desc'){
  136. delete sortType[column.name];
  137. columnArr.some(function (name, index) {
  138. if (name === column.name){
  139. columnArr.splice(index,1);
  140. return true;
  141. }
  142. });
  143. columnSort.className = "fa fa-sort";
  144. if (columnArr.length === 0){
  145. //希尔排序
  146. let arr = [];
  147. arr.push.apply(arr,_data);
  148. let len = arr.length;
  149. for(let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
  150. for(let i = gap; i < len; i++) {
  151. let j = i;
  152. let current = arr[i];
  153. if (_is_restorationColumn_asc){
  154. while(j - gap >= 0 && Number(current[_restorationColumn]) < Number(arr[j - gap][_restorationColumn])) {
  155. arr[j] = arr[j - gap];
  156. j = j - gap;
  157. }
  158. }else{
  159. while(j - gap >= 0 && Number(current[_restorationColumn]) > Number(arr[j - gap][_restorationColumn])) {
  160. arr[j] = arr[j - gap];
  161. j = j - gap;
  162. }
  163. }
  164. arr[j] = current;
  165. }
  166. }
  167. _data.length = 0;
  168. _data.push.apply(_data,arr);
  169. return;
  170. }
  171. let columnArrTemp = [];
  172. columnArrTemp.push.apply(columnArrTemp,columnArr);
  173. window.sort.sort(_data,columnArrTemp,sortType);
  174. }
  175. }
  176. }
  177. //初始化
  178. this.init = function() {
  179. if (_before)createHeaderBefore();
  180. createHeader();
  181. };
  182. };