tableSelect.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. layui.define(['table', 'jquery', 'form'], function (exports) {
  2. "use strict";
  3. var MOD_NAME = 'tableSelect',
  4. $ = layui.jquery,
  5. table = layui.table,
  6. form = layui.form;
  7. var tableSelect = function () {
  8. this.v = '1.1.0';
  9. };
  10. /**
  11. * 初始化表格选择器
  12. */
  13. tableSelect.prototype.render = function (opt) {
  14. var elem = $(opt.elem);
  15. var tableDone = opt.table.done || function(){};
  16. //默认设置
  17. opt.searchKey = opt.searchKey || 'keyword';
  18. opt.searchPlaceholder = opt.searchPlaceholder || '关键词搜索';
  19. opt.checkedKey = opt.checkedKey;
  20. opt.table.page = opt.table.page || true;
  21. opt.table.height = opt.height || 315;
  22. //最小宽度
  23. opt.width = opt.width || '530';
  24. //多搜索条件
  25. opt.searchType = opt.searchType || 'one';
  26. opt.searchList = opt.searchList || [{key: opt.searchKey, placeholder: opt.searchPlaceholder}];
  27. elem.off('click').on('click', function(e) {
  28. e.stopPropagation();
  29. if($('div.tableSelect').length >= 1){
  30. return false;
  31. }
  32. var t = elem.offset().top + elem.outerHeight()+"px";
  33. var l = elem.offset().left +"px";
  34. var tableName = "tableSelect_table_" + new Date().getTime();
  35. var tableBox = '<div class="tableSelect layui-anim layui-anim-upbit" style="left:'+l+';top:'+t+';border: 1px solid #d2d2d2;background-color: #fff;box-shadow: 0 2px 4px rgba(0,0,0,.12);padding:10px 10px 0 10px;position: absolute;z-index:66666666;margin: 5px 0;border-radius: 2px;min-width:'+opt.width+'px;">';
  36. tableBox += '<div class="tableSelectBar">';
  37. tableBox += '<form class="layui-form" action="" style="display:inline-block;">';
  38. //判断是否多搜索条件
  39. if(opt.searchType == 'more'){
  40. $.each(opt.searchList, function (index, item) {
  41. tableBox += '<input style="display:inline-block;width:190px;height:30px;vertical-align:middle;margin-right:-1px;border: 1px solid #C9C9C9;" type="text" name="'+item.searchKey+'" placeholder="'+item.searchPlaceholder+'" autocomplete="off" class="layui-input">';
  42. });
  43. }else{
  44. tableBox += '<input style="display:inline-block;width:190px;height:30px;vertical-align:middle;margin-right:-1px;border: 1px solid #C9C9C9;" type="text" name="'+opt.searchKey+'" placeholder="'+opt.searchPlaceholder+'" autocomplete="off" class="layui-input">';
  45. }
  46. tableBox += '<button class="layui-btn layui-btn-sm layui-btn-primary tableSelect_btn_search" lay-submit lay-filter="tableSelect_btn_search"><i class="layui-icon layui-icon-search"></i></button>';
  47. tableBox += '</form>';
  48. tableBox += '<button style="float:right;" class="layui-btn layui-btn-sm tableSelect_btn_select">选择<span></span></button>';
  49. tableBox += '</div>';
  50. tableBox += '<table id="'+tableName+'" lay-filter="'+tableName+'"></table>';
  51. tableBox += '</div>';
  52. tableBox = $(tableBox);
  53. $('body').append(tableBox);
  54. //数据缓存
  55. var checkedData = [];
  56. //渲染TABLE
  57. opt.table.elem = "#"+tableName;
  58. opt.table.id = tableName;
  59. opt.table.done = function(res, curr, count){
  60. defaultChecked(res, curr, count);
  61. setChecked(res, curr, count);
  62. tableDone(res, curr, count);
  63. };
  64. var tableSelect_table = table.render(opt.table);
  65. //分页选中保存数组
  66. table.on('radio('+tableName+')', function(obj){
  67. if(opt.checkedKey){
  68. checkedData = table.checkStatus(tableName).data
  69. }
  70. updataButton(table.checkStatus(tableName).data.length)
  71. })
  72. table.on('checkbox('+tableName+')', function(obj){
  73. if(opt.checkedKey){
  74. if(obj.checked){
  75. for (var i=0;i<table.checkStatus(tableName).data.length;i++){
  76. checkedData.push(table.checkStatus(tableName).data[i])
  77. }
  78. }else{
  79. if(obj.type=='all'){
  80. for (var j=0;j<table.cache[tableName].length;j++) {
  81. for (var i=0;i<checkedData.length;i++){
  82. if(checkedData[i][opt.checkedKey] == table.cache[tableName][j][opt.checkedKey]){
  83. checkedData.splice(i,1)
  84. }
  85. }
  86. }
  87. }else{
  88. //因为LAYUI问题,操作到变化全选状态时获取到的obj为空,这里用函数获取未选中的项。
  89. function nu (){
  90. var noCheckedKey = '';
  91. for (var i=0;i<table.cache[tableName].length;i++){
  92. if(!table.cache[tableName][i].LAY_CHECKED){
  93. noCheckedKey = table.cache[tableName][i][opt.checkedKey];
  94. }
  95. }
  96. return noCheckedKey
  97. }
  98. var noCheckedKey = obj.data[opt.checkedKey] || nu();
  99. for (var i=0;i<checkedData.length;i++){
  100. if(checkedData[i][opt.checkedKey] == noCheckedKey){
  101. checkedData.splice(i,1);
  102. }
  103. }
  104. }
  105. }
  106. checkedData = uniqueObjArray(checkedData, opt.checkedKey);
  107. updataButton(checkedData.length)
  108. }else{
  109. updataButton(table.checkStatus(tableName).data.length)
  110. }
  111. });
  112. //渲染表格后选中
  113. function setChecked (res, curr, count) {
  114. for(var i=0;i<res.data.length;i++){
  115. for (var j=0;j<checkedData.length;j++) {
  116. if(res.data[i][opt.checkedKey] == checkedData[j][opt.checkedKey]){
  117. res.data[i].LAY_CHECKED = true;
  118. var index= res.data[i]['LAY_TABLE_INDEX'];
  119. var checkbox = $('#'+tableName+'').next().find('tr[data-index=' + index + '] input[type="checkbox"]');
  120. checkbox.prop('checked', true).next().addClass('layui-form-checked');
  121. var radio = $('#'+tableName+'').next().find('tr[data-index=' + index + '] input[type="radio"]');
  122. radio.prop('checked', true).next().addClass('layui-form-radioed').find("i").html('&#xe643;');
  123. }
  124. }
  125. }
  126. var checkStatus = table.checkStatus(tableName);
  127. if(checkStatus.isAll){
  128. $('#'+tableName+'').next().find('.layui-table-header th[data-field="0"] input[type="checkbox"]').prop('checked', true);
  129. $('#'+tableName+'').next().find('.layui-table-header th[data-field="0"] input[type="checkbox"]').next().addClass('layui-form-checked');
  130. }
  131. updataButton(checkedData.length)
  132. }
  133. //写入默认选中值(puash checkedData)
  134. function defaultChecked (res, curr, count){
  135. if(opt.checkedKey && elem.attr('ts-selected')){
  136. var selected = elem.attr('ts-selected').split(",");
  137. for(var i=0;i<res.data.length;i++){
  138. for(var j=0;j<selected.length;j++){
  139. if(res.data[i][opt.checkedKey] == selected[j]){
  140. checkedData.push(res.data[i])
  141. }
  142. }
  143. }
  144. checkedData = uniqueObjArray(checkedData, opt.checkedKey);
  145. }
  146. }
  147. //更新选中数量
  148. function updataButton (n) {
  149. tableBox.find('.tableSelect_btn_select span').html(n==0?'':'('+n+')')
  150. }
  151. //数组去重
  152. function uniqueObjArray(arr, type){
  153. var newArr = [];
  154. var tArr = [];
  155. if(arr.length == 0){
  156. return arr;
  157. }else{
  158. if(type){
  159. for(var i=0;i<arr.length;i++){
  160. if(!tArr[arr[i][type]]){
  161. newArr.push(arr[i]);
  162. tArr[arr[i][type]] = true;
  163. }
  164. }
  165. return newArr;
  166. }else{
  167. for(var i=0;i<arr.length;i++){
  168. if(!tArr[arr[i]]){
  169. newArr.push(arr[i]);
  170. tArr[arr[i]] = true;
  171. }
  172. }
  173. return newArr;
  174. }
  175. }
  176. }
  177. //FIX位置
  178. var overHeight = (elem.offset().top + elem.outerHeight() + tableBox.outerHeight() - $(window).scrollTop()) > $(window).height();
  179. var overWidth = (elem.offset().left + tableBox.outerWidth()) > $(window).width();
  180. overHeight && tableBox.css({'top':'auto','bottom':'0px'});
  181. overWidth && tableBox.css({'left':'auto','right':'5px'})
  182. //关键词搜索
  183. form.on('submit(tableSelect_btn_search)', function(data){
  184. tableSelect_table.reload({
  185. where: data.field,
  186. page: {
  187. curr: 1
  188. }
  189. });
  190. return false;
  191. });
  192. //双击行选中
  193. table.on('rowDouble('+tableName+')', function(obj){
  194. var checkStatus = {data:[obj.data]};
  195. selectDone(checkStatus);
  196. })
  197. //按钮选中
  198. tableBox.find('.tableSelect_btn_select').on('click', function() {
  199. var checkStatus = table.checkStatus(tableName);
  200. if(checkedData.length > 1){
  201. checkStatus.data = checkedData;
  202. }
  203. selectDone(checkStatus);
  204. })
  205. //写值回调和关闭
  206. function selectDone (checkStatus){
  207. if(opt.checkedKey){
  208. var selected = [];
  209. for(var i=0;i<checkStatus.data.length;i++){
  210. selected.push(checkStatus.data[i][opt.checkedKey])
  211. }
  212. elem.attr("ts-selected",selected.join(","));
  213. }
  214. opt.done(elem, checkStatus);
  215. tableBox.remove();
  216. delete table.cache[tableName];
  217. checkedData = [];
  218. }
  219. //点击其他区域关闭
  220. $(document).mouseup(function(e){
  221. var userSet_con = $(''+opt.elem+',.tableSelect');
  222. if(!userSet_con.is(e.target) && userSet_con.has(e.target).length === 0){
  223. tableBox.remove();
  224. delete table.cache[tableName];
  225. checkedData = [];
  226. }
  227. });
  228. })
  229. }
  230. /**
  231. * 隐藏选择器
  232. */
  233. tableSelect.prototype.hide = function (opt) {
  234. $('.tableSelect').remove();
  235. }
  236. //自动完成渲染
  237. var tableSelect = new tableSelect();
  238. //FIX 滚动时错位
  239. if(window.top == window.self){
  240. $(window).scroll(function () {
  241. tableSelect.hide();
  242. });
  243. }
  244. exports(MOD_NAME, tableSelect);
  245. })