tableSelect.js 12 KB

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