header.js 8.1 KB

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