yvanui.grid.js 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199
  1. /**
  2. * yvan.grid.js
  3. * @author luoyifan
  4. * 2018-11-29 13:35:00
  5. */
  6. 'use strict';
  7. (function ($) {
  8. var WIDTH_OFFSET = 0;
  9. if (!$.jgrid) {
  10. console.warn('no jqGrid!!');
  11. return;
  12. }
  13. var disFixedTable = false;
  14. //消息处理链条
  15. $.jgrid.chain = {
  16. prepearOption: [],
  17. loadComplete: [],
  18. ondblClickRow: [],
  19. onKeydown: [],
  20. onSelectRow: [],
  21. beforeSelectRow: [],
  22. onReload: []
  23. };
  24. function resizeColumn(newwidth, index) {
  25. var $grid = $(this);
  26. var name = $grid.getGridParam().colModel[index].name;
  27. //找到所有 该列的编辑格
  28. var $editors = $grid.find('[itemId="' + name + '"]');
  29. $editors.each(function (index, target) {
  30. if ($.data(target).hasOwnProperty('textbox')) {
  31. $(target).textbox({ width: newwidth - WIDTH_OFFSET });
  32. }
  33. });
  34. }
  35. function colFormatProcess(colOption) {
  36. //============ 升级编辑器属性
  37. if (colOption.hasOwnProperty('formatter')) {
  38. if ($.type(colOption.formatter) === 'array') {
  39. colOption.editor = {
  40. editable: false,
  41. xtype: 'combobox',
  42. data: colOption.formatter
  43. };
  44. } else if ($.type(colOption.formatter) === 'object') {
  45. $.extend(true, colOption, {
  46. formatter: 'select',
  47. editoptions: {
  48. value: colOption.formatter
  49. }
  50. });
  51. return;
  52. }
  53. }
  54. var editor = colOption.editor;
  55. if (!editor) {
  56. return;
  57. }
  58. //=========== 定义 datetime / combobox / checkbox / numberbox 的映射关系 ===========
  59. if (editor.xtype === 'combobox') {
  60. var convData = {};
  61. var valueField = editor.valueField || $.fn.combobox.defaults.valueField;
  62. var textField = editor.textField || $.fn.combobox.defaults.textField;
  63. for (var i = 0; i < editor.data.length; i++) {
  64. convData[editor.data[i][valueField]] = editor.data[i][textField];
  65. }
  66. $.extend(true, colOption, {
  67. formatter: 'select',
  68. editoptions: {
  69. value: convData
  70. }
  71. });
  72. } else if (editor.xtype === 'checkbox') {
  73. $.extend(true, colOption, {
  74. formatter: 'checkbox',
  75. editoptions: {
  76. value: editor.on + ":" + editor.off
  77. }
  78. });
  79. } else if (editor.xtype === 'numberbox') {
  80. $.extend(true, colOption, {
  81. formatter: 'number',
  82. formatoptions: {
  83. decimalPlaces: editor.precision
  84. }
  85. });
  86. } else if (editor.xtype === 'datetimebox') {
  87. $.extend(true, colOption, {
  88. formatter: 'date',
  89. formatoptions: {
  90. srcformat: 'u',
  91. newformat: 'Y-m-d H:i:s'
  92. }
  93. });
  94. }
  95. }
  96. //将 easyui option 转换为 jqGrid option
  97. function convertEasyuiOption(opts) {
  98. //======== easyui.columns 声明方法, 转换为 colModel 设置方式
  99. if (opts.hasOwnProperty('columns')) {
  100. if (opts.columns.length !== 1) {
  101. console.error('error columns setting!');
  102. return;
  103. }
  104. if (opts.disFixedTable == true) {
  105. disFixedTable = true;
  106. } else {
  107. disFixedTable = false;
  108. }
  109. var columns = opts.columns[0];
  110. var colModel = [];
  111. for (var i = 0; i < columns.length; i++) {
  112. var col = {
  113. sortable: false
  114. };
  115. if (!columns[i].field) {
  116. console.error('error columns no name property!');
  117. return;
  118. }
  119. if (columns[i].hasOwnProperty('hidden')) {
  120. col.hidden = columns[i].hidden;
  121. }
  122. if (columns[i].hasOwnProperty('field')) {
  123. col.name = columns[i].field;
  124. }
  125. if (columns[i].hasOwnProperty('title')) {
  126. col.label = columns[i].title;
  127. }
  128. if (columns[i].hasOwnProperty('align')) {
  129. col.align = columns[i].align;
  130. }
  131. if (columns[i].hasOwnProperty('width')) {
  132. col.width = columns[i].width;
  133. }
  134. if (columns[i].hasOwnProperty('maxWidth')) {
  135. col.maxWidth = columns[i].maxWidth;
  136. }
  137. if (columns[i].hasOwnProperty('minWidth')) {
  138. col.minWidth = columns[i].minWidth;
  139. }
  140. if (columns[i].hasOwnProperty('formatter')) {
  141. col.formatter = columns[i].formatter;
  142. if ($.type(col.formatter) === 'function') {
  143. if (opts.editable) {
  144. console.error('editable 的表格不允许 formatter=function');
  145. }
  146. }
  147. }
  148. if (columns[i].hasOwnProperty('editor')) {
  149. col.editor = columns[i].editor;
  150. if (!col.hasOwnProperty('editable')) {
  151. col.editable = true;
  152. }
  153. }
  154. if (columns[i].hasOwnProperty('sortable')) {
  155. col.sortable = columns[i].sortable;
  156. }
  157. if (columns[i].hasOwnProperty('frozen')) {
  158. col.frozen = columns[i].frozen;
  159. }
  160. col.autowidth = false;
  161. colModel.push(col);
  162. }
  163. delete opts.columns;
  164. opts.colModel = colModel;
  165. }
  166. //======== editable 内嵌编辑器
  167. if (opts.hasOwnProperty('colModel')) {
  168. for (var i = 0; i < opts.colModel.length; i++) {
  169. colFormatProcess(opts.colModel[i]);
  170. }
  171. }
  172. //======== 没有 URL 或不满足 loadCondition 条件就不需要加载数据
  173. if (!opts.url) {
  174. opts.datatype = "local";
  175. } else {
  176. opts.datatype = "json";
  177. if ($.type(opts.loadCondition) === 'function') {
  178. if (!opts.loadCondition(opts, opts.queryParams)) {
  179. opts.datatype = "local";
  180. }
  181. }
  182. }
  183. //======== easyui 的 queryParams 属性
  184. if (opts.hasOwnProperty('queryParams')) {
  185. if ($.type(opts.queryParams) === 'function') {
  186. opts.queryParams = opts.queryParams.call(this, opts);
  187. }
  188. opts.postData = opts.queryParams;
  189. delete opts.queryParams;
  190. }
  191. opts.prmNames = $.extend(
  192. { search: null, sidx: null, nd: null, },
  193. opts.pagination ? { page: "page", rows: "rows" } : {});
  194. }
  195. function pageCancel(e) {
  196. $.yvan.msg('正在请求中,请不要过于频繁操作');
  197. }
  198. //============ 准备 prepare ============
  199. function prepearOption(item, $grid) {
  200. //============ 默认值
  201. var opts = {
  202. pagination: true,
  203. autowidth: false,
  204. autoheight: false,
  205. autoresizeOnLoad: false,
  206. autoSelectFirst: false,
  207. multiboxonly: true,
  208. height: '50px',
  209. width: '50px',
  210. viewrecords: true,
  211. mtype: 'GET',
  212. datatype: "json",
  213. rownumbers: true,
  214. autoSizeColumns: true,
  215. shrinkToFit: false,
  216. sortable: true,
  217. sortorder: 'asc',
  218. resizeStop: resizeColumn,
  219. loadtext: '正在加载中...',
  220. ajaxGridOptions: {
  221. beforeSend: function (xhr) {
  222. //$grid[0].jqGrid("setGridParam", { "groupHeader": null });
  223. xhr.setRequestHeader("Authorization", $.cookie('auth'));
  224. var $loading = $('#load_' + item.id);
  225. var $pg = $loading.parent().down('gridpager');
  226. var $sd = $pg.down('pageShardow');
  227. if ($sd.length <= 0) {
  228. $sd = $('<div xtype="pageShardow" style="position: absolute;display: block;float: right;width: 300px;height: 30px;top: 0;"></div>');
  229. $pg.append($sd);
  230. $sd.on('click', function () {
  231. $.yvan.msg('正在请求中,请不要过于频繁操作');
  232. });
  233. }
  234. $sd.show();
  235. $loading.show();
  236. },
  237. error: function (event, xhr, options, exc) {
  238. if ($.yvan.hasOwnProperty('ajaxException')) {
  239. $.yvan.ajaxException.apply(this, arguments);
  240. }
  241. },
  242. success: function (data, textStatus) {
  243. if ($.type(opts.dataProcess) === 'function') {
  244. opts.dataProcess.apply(this, arguments);
  245. }
  246. $grid[0].addJSONData(data);
  247. opts.loadComplete.call($grid[0]);
  248. },
  249. complete: function (xhr, textStatus) {
  250. var $loading = $('#load_' + item.id);
  251. $loading.hide();
  252. var $pg = $loading.parent().down('gridpager');
  253. var $sd = $pg.down('pageShardow');
  254. $sd.hide();
  255. }
  256. }
  257. };
  258. //============ 复制
  259. $.extend(opts, item);
  260. //============= 覆盖值
  261. $.extend(opts, {
  262. loadComplete: function () {
  263. var $grid = $(this);
  264. //自动调整列宽度
  265. $grid.autoSizeColumns();
  266. $grid.setSortIcon();
  267. $grid.find('input[type=checkbox]').parent('td').css('text-align', 'center');
  268. if (!$grid.getGridParam('multiselect')) {
  269. //不是多选状态,都要自动选择第一行、或还原之前的选项
  270. var ids = $grid.getDataIDs();
  271. if (ids.length > 0) {
  272. var lastId = $grid.getGridParam('lastRowId');
  273. //还原最后一次选择的行、或默认第一行
  274. // var id = lastId || ids[0];
  275. var id = ids.indexOf(lastId) != -1 ? lastId : ids[0];
  276. if (opts.autoSelectFirst)
  277. {
  278. id=ids[0];
  279. }
  280. $grid.setSelection(id);
  281. }
  282. } else {
  283. //改造表头的勾选框
  284. var $headInput = $('#cb_' + $grid[0].id);
  285. var $domHeadInput = $('<div class="yvan-checkbox" tabindex="0" lay-skin="primary">\n' +
  286. '<i class="fa fa-check"></i>\n' +
  287. '</div>');
  288. $headInput.hide();
  289. $domHeadInput.insertAfter($headInput);
  290. $domHeadInput.on("click", function () {
  291. var checkBoxes = $grid.find('.td_cbox > .yvan-checkbox');
  292. if ($domHeadInput.hasClass('yvan-checked')) {
  293. //全不选
  294. $domHeadInput.removeClass('yvan-checked');
  295. checkBoxes.removeClass('yvan-checked');
  296. if ($.type(opts.onCheckedChange) === 'function') {
  297. var rids = $grid.jqGrid('getDataIDs');
  298. opts.onCheckedChange.call($grid[0], $grid.jqGrid('getDataIDs'), false);
  299. }
  300. } else {
  301. //全选
  302. $domHeadInput.addClass('yvan-checked');
  303. checkBoxes.addClass('yvan-checked');
  304. if ($.type(opts.onCheckedChange) === 'function') {
  305. opts.onCheckedChange.call($grid[0], $grid.jqGrid('getDataIDs'), true);
  306. }
  307. }
  308. });
  309. //改造勾选框
  310. var $input = $grid.find('.td_cbox > input.cbox');
  311. $input.each(function (index, input) {
  312. var $dom = $('<div class="yvan-checkbox" tabindex="0" lay-skin="primary">\n' +
  313. '<i class="fa fa-check"></i>\n' +
  314. '</div>');
  315. $(input).hide();
  316. $dom.insertAfter($(input));
  317. $dom.on("click", function () {
  318. //改变勾选状态
  319. if ($dom.hasClass('yvan-checked')) {
  320. //取消勾选, 同时也取消表头的勾选
  321. $dom.removeClass('yvan-checked');
  322. $domHeadInput.removeClass('yvan-checked');
  323. if ($.type(opts.onCheckedChange) === 'function') {
  324. opts.onCheckedChange.call($grid[0], [$grid.jqGrid('getDataIDs')[index]], false);
  325. }
  326. } else {
  327. //勾选
  328. $dom.addClass('yvan-checked');
  329. //判断下级元素是不是全被勾选
  330. if ($grid.find('.td_cbox > .yvan-checkbox').length ===
  331. $grid.find('.td_cbox > .yvan-checkbox.yvan-checked').length) {
  332. //下级全勾选上了,默认表头勾选上
  333. $domHeadInput.addClass('yvan-checked');
  334. }
  335. if ($.type(opts.onCheckedChange) === 'function') {
  336. opts.onCheckedChange.call($grid[0], [$grid.jqGrid('getDataIDs')[index]], true);
  337. }
  338. }
  339. });
  340. });
  341. for (var i = 0; i < $.jgrid.chain.loadComplete.length; i++) {
  342. $.jgrid.chain.loadComplete[i].apply(this, arguments);
  343. }
  344. }
  345. if ($grid.getGridParam('pagination')) {//设置分页默认当前显示页码
  346. var pagebox = $grid.closest('.ui-jqgrid-view').siblings('.ui-jqgrid-pager').find('.ui-jqgrid-pg-center');
  347. var totalPageBox = $(pagebox.find('td[dir="ltr"]')[0]);
  348. var totalPage = totalPageBox.find('span').html();
  349. if (totalPage == 0) {
  350. totalPageBox.find('input').val('');
  351. }
  352. }
  353. if (item.loadComplete) {
  354. item.loadComplete.apply(this, arguments);
  355. }
  356. },
  357. onSortCol: function(index, colindex, sortorder) {
  358. var $grid = $(this);
  359. var colModel = $grid.jqGrid('getGridParam', 'colModel');
  360. for (var idx = 0; idx < colModel.length; idx++) {
  361. colModel[idx].lso = 'asc-desc';
  362. }
  363. colModel[colindex].lso = sortorder;
  364. if (item.onSortCol) {
  365. item.onSortCol.apply(this, arguments);
  366. }
  367. },
  368. onSelectRow: function (rowid, status) {
  369. //每次选择之后,记住最后一次的选项
  370. var $grid = $(this);
  371. if ($grid.getGridParam('multiselect')) {
  372. if (item.onSelectRow) {
  373. item.onSelectRow.apply(this, arguments);
  374. }
  375. for (var i = 0; i < $.jgrid.chain.onSelectRow.length; i++) {
  376. $.jgrid.chain.onSelectRow[i].apply(this, arguments);
  377. }
  378. var ids = $grid.getDataIDs();
  379. if (ids.length === 1) {
  380. var headerDomInput = $($grid).parents('.ui-jqgrid-view').find('.ui-jqgrid-labels').find('input')[0];
  381. $(headerDomInput).prop("checked", true);
  382. }
  383. return;
  384. }
  385. $grid.setGridParam({ 'lastRowId': rowid });
  386. if (!$grid.getGridParam('multiselect')) {
  387. if (!status) {
  388. //不允许取消选择
  389. setTimeout(function () {
  390. $grid.setSelection(rowid);
  391. });
  392. return;
  393. }
  394. }
  395. if (item.onSelectRow) {
  396. arguments['3'] = arguments['2'];
  397. arguments['2'] = $grid.getGridParam('lastSelectRowId');
  398. item.onSelectRow.apply(this, arguments);
  399. }
  400. for (var i = 0; i < $.jgrid.chain.onSelectRow.length; i++) {
  401. $.jgrid.chain.onSelectRow[i].apply(this, arguments);
  402. }
  403. //带上上次选中的
  404. $grid.setGridParam({ 'lastSelectRowId': rowid });
  405. },
  406. //双击
  407. ondblClickRow: function (rowid, iRow, iCol, e) {
  408. if ($.type(item.ondblClickRow) === 'function') {
  409. item.ondblClickRow.apply(this, arguments);
  410. } else if ($.type(item.onDblClickRow) === 'function') {
  411. item.onDblClickRow.apply(this, arguments);
  412. }
  413. for (var i = 0; i < $.jgrid.chain.ondblClickRow.length; i++) {
  414. $.jgrid.chain.ondblClickRow[i].apply(this, arguments);
  415. }
  416. },
  417. beforeSelectRow: function (rowid, e) {
  418. for (var i = 0; i < $.jgrid.chain.beforeSelectRow.length; i++) {
  419. var r = $.jgrid.chain.beforeSelectRow[i].apply(this, arguments);
  420. if (!r) {
  421. return false;
  422. }
  423. }
  424. if (item.beforeSelectRow) {
  425. var r = item.beforeSelectRow.apply(this, arguments);
  426. if (!r) {
  427. return false;
  428. }
  429. }
  430. var $myGrid = $(this);
  431. if ($myGrid.getGridParam('multiselect')) {
  432. //在多选状态下,"勾选"不影响"选择"状态
  433. var i = $.jgrid.getCellIndex($(e.target).closest('td')[0]),
  434. cm = $myGrid.jqGrid('getGridParam', 'colModel');
  435. return (cm[i].name !== 'cb');
  436. }
  437. return true;
  438. }
  439. });
  440. return opts;
  441. } //end prepearOption
  442. String.prototype.getTextWH = function (style) {//获取字符串宽度及高度
  443. var $span = $("<span>" + this + "</span>");
  444. $span.css($.extend({}, style, { visibility: "hidden" }));
  445. $("body").append($span);
  446. if (!disFixedTable) {
  447. var result = {
  448. "width": $span.width(),
  449. "height": $span.height()
  450. };
  451. } else {
  452. var result = {
  453. };
  454. }
  455. $span.remove();
  456. return result;
  457. };
  458. //============ 构建工具栏 ============
  459. function createToolbar($table, id, opts, toolbar, context) {
  460. var $dom = $table.findBox().find('#t_' + id);
  461. if ($.type(toolbar) === 'function') {
  462. opts.toolbar = opts.toolbar.call(this, $dom, context);
  463. }
  464. if ($.type(toolbar) === 'string') {
  465. $dom.append($(toolbar));
  466. } else if ($.type(toolbar) === 'array') {
  467. $dom.power('renderEach', {
  468. $target: $dom,
  469. items: toolbar,
  470. context: context
  471. });
  472. } else if ($.type(toolbar) === 'object') {
  473. $dom.power('renderDispatch', {
  474. $target: $dom,
  475. item: toolbar,
  476. context: context
  477. });
  478. }
  479. }
  480. $.jgrid.yvanui = '1.0';
  481. $.jgrid.createDom = function ($target, item, context) {
  482. item.id = item.id || $.yvan.createId('grid');
  483. var $table = $('<table></table>');
  484. $target.append($table);
  485. $table.reset(item, true, context);
  486. return $table;
  487. };
  488. $.jgrid.extend({
  489. getCol: function (col) {
  490. var $grid = $(this);
  491. if ($.type(col) === 'undefined') {
  492. return $grid.jqGrid('getGridParam', 'colModel');
  493. } else if ($.type(col) === 'number') {
  494. return $grid.jqGrid('getGridParam', 'colModel')[col];
  495. }
  496. return $grid.jqGrid('getColProp', col);
  497. },
  498. addRow: function (rowData) {
  499. var $grid = $(this);
  500. var rowId = $.yvan.createId('nr');
  501. if ($grid.getGridParam('multiselect')) {
  502. var rowId = $.yvan.createId('nr');
  503. $grid.addRowData(rowId, rowData, "last");
  504. var $headInput = $('#cb_' + $grid[0].id);
  505. var $domHeadInput = $grid.parents('.ui-jqgrid-bdiv').siblings('.ui-jqgrid-hdiv').find('.jqgh_cbox').find('.yvan-checkbox');
  506. //改造勾选框
  507. var $input = $grid.find('.td_cbox > input.cbox');
  508. $input.each(function (index, input) {
  509. var $dom = $('<div class="yvan-checkbox" tabindex="0" lay-skin="primary">\n' +
  510. '<i class="fa fa-check"></i>\n' +
  511. '</div>');
  512. $(input).hide();
  513. if ($(input).next().hasClass('yvan-checkbox') == false) {
  514. $dom.insertAfter($(input));
  515. }
  516. $dom.on("click", function () {
  517. //改变勾选状态
  518. if ($dom.hasClass('yvan-checked')) {
  519. //取消勾选, 同时也取消表头的勾选
  520. $dom.removeClass('yvan-checked');
  521. $domHeadInput.removeClass('yvan-checked');
  522. } else {
  523. //勾选
  524. $dom.addClass('yvan-checked');
  525. //判断下级元素是不是全被勾选
  526. if ($grid.find('.td_cbox > .yvan-checkbox').length ===
  527. $grid.find('.td_cbox > .yvan-checkbox.yvan-checked').length) {
  528. //下级全勾选上了,默认表头勾选上
  529. $domHeadInput.addClass('yvan-checked');
  530. }
  531. }
  532. });
  533. });
  534. } else {
  535. $grid.addRowData(rowId, rowData, "last");
  536. }
  537. },
  538. moveUp: function (rowid) {
  539. var $grid = $(this);
  540. rowid = rowid || $grid.selrow();
  541. var ids = $grid.getDataIDs();
  542. var rowIndex = $.inArray(rowid, ids);
  543. if (rowIndex <= 0) {
  544. return false;
  545. }
  546. var $from = $grid.find('#' + rowid);
  547. var $target = $grid.find('#' + ids[rowIndex - 1]);
  548. if ($from.length <= 0 || $target.length <= 0) {
  549. return false;
  550. }
  551. $from.insertBefore(
  552. $target
  553. );
  554. return true;
  555. },
  556. // 置顶
  557. moveAllUp: function (rowid) {
  558. var $grid = $(this);
  559. rowid = rowid || $grid.selrow();
  560. var ids = $grid.getDataIDs();
  561. var rowIndex = $.inArray(rowid, ids);
  562. if (rowIndex <= 0) {
  563. return false;
  564. }
  565. var $from = $grid.find('#' + rowid);
  566. var $target = $grid.find('#' + ids[0]);
  567. if ($from.length <= 0 || $target.length <= 0) {
  568. return false;
  569. }
  570. $from.insertBefore(
  571. $target
  572. );
  573. return true;
  574. },
  575. moveDown: function (rowid) {
  576. var $grid = $(this);
  577. rowid = rowid || $grid.selrow();
  578. var ids = $grid.getDataIDs();
  579. var rowIndex = $.inArray(rowid, ids);
  580. if (rowIndex >= ids.length - 1) {
  581. return false;
  582. }
  583. var $from = $grid.find('#' + rowid);
  584. var $target = $grid.find('#' + ids[rowIndex + 1]);
  585. if ($from.length <= 0 || $target.length <= 0) {
  586. return false;
  587. }
  588. $from.insertAfter(
  589. $target
  590. );
  591. return true;
  592. },
  593. // 置尾
  594. moveAllDown: function (rowid) {
  595. var $grid = $(this);
  596. rowid = rowid || $grid.selrow();
  597. var ids = $grid.getDataIDs();
  598. var rowIndex = $.inArray(rowid, ids);
  599. if (rowIndex >= ids.length - 1) {
  600. return false;
  601. }
  602. var $from = $grid.find('#' + rowid);
  603. var $target = $grid.find('#' + ids[ids.length - 1]);
  604. if ($from.length <= 0 || $target.length <= 0) {
  605. return false;
  606. }
  607. $from.insertAfter(
  608. $target
  609. );
  610. return true;
  611. },
  612. //获取被勾选的行id(rowid)
  613. getCheckedIds: function () {
  614. var $grid = $(this);
  615. var rids = $grid.jqGrid('getDataIDs');
  616. var checkBoxes = $grid.find('.td_cbox > .yvan-checkbox');
  617. var checkedIds = [];
  618. checkBoxes.each(function (i, d) {
  619. var $d = $(d);
  620. if ($d.hasClass('yvan-checked')) {
  621. checkedIds.push(rids[i]);
  622. }
  623. });
  624. return checkedIds;
  625. },
  626. //获取被勾选的数据行
  627. checkedData: function () {
  628. var $grid = $(this);
  629. var datas = $grid.jqGrid('getRowData');
  630. if ($grid.getGridParam('editable')) {
  631. datas = $grid.saveEdit();
  632. } else {
  633. datas = $grid.jqGrid('getRowData');
  634. }
  635. var checkBoxes = $grid.find('.td_cbox > .yvan-checkbox');
  636. var checkedIds = [];
  637. checkBoxes.each(function (i, d) {
  638. var $d = $(d);
  639. if ($d.hasClass('yvan-checked')) {
  640. checkedIds.push(datas[i]);
  641. }
  642. });
  643. return checkedIds;
  644. },
  645. //设置某些行不被勾
  646. uncheckIds: function (array) {
  647. var $grid = $(this);
  648. var rids = $grid.jqGrid('getDataIDs');
  649. var checkBoxes = $grid.find('.td_cbox > .yvan-checkbox');
  650. checkBoxes.each(function (i, d) {
  651. if ($.inArray(rids[i], array) >= 0) {
  652. $(d).removeClass('yvan-checked');
  653. }
  654. });
  655. var $headInput = $('#cb_' + $grid[0].id);
  656. var $domHeadInput = $headInput.next();
  657. if ($grid.find('.td_cbox > .yvan-checkbox').length ===
  658. $grid.find('.td_cbox > .yvan-checkbox.yvan-checked').length) {
  659. $domHeadInput.addClass('yvan-checked');
  660. } else {
  661. $domHeadInput.removeClass('yvan-checked');
  662. }
  663. },
  664. //获取 或设置 被勾选的行id(rowid)
  665. //当第一个为 undefined 时,就是获取被勾选的数据行id(rowid)
  666. //当第一个参数为 array 时,就是根据行ID(rowid)勾选行
  667. checkIds: function (array) {
  668. var $grid = $(this);
  669. var rids = $grid.jqGrid('getDataIDs');
  670. var checkBoxes = $grid.find('.td_cbox > .yvan-checkbox');
  671. if ($.type(array) === 'array') {
  672. //根据跟定的参数,设置勾选状态
  673. checkBoxes.each(function (i, d) {
  674. if ($.inArray(rids[i], array) >= 0) {
  675. $(d).addClass('yvan-checked');
  676. }
  677. });
  678. var $headInput = $('#cb_' + $grid[0].id);
  679. var $domHeadInput = $headInput.next();
  680. if ($grid.find('.td_cbox > .yvan-checkbox').length ===
  681. $grid.find('.td_cbox > .yvan-checkbox.yvan-checked').length) {
  682. $domHeadInput.addClass('yvan-checked');
  683. } else {
  684. $domHeadInput.removeClass('yvan-checked');
  685. }
  686. } else if ($.type(array) === 'undefined') {
  687. //获取被勾选的行
  688. var checkedIds = [];
  689. checkBoxes.each(function (i, d) {
  690. var $d = $(d);
  691. if ($d.hasClass('yvan-checked')) {
  692. checkedIds.push(rids[i]);
  693. }
  694. });
  695. return checkedIds;
  696. }
  697. },
  698. checkAll: function () {
  699. //全选
  700. var $grid = $(this);
  701. var $headInput = $('#cb_' + $grid[0].id);
  702. var $domHeadInput = $headInput.next();
  703. $grid.find('.td_cbox > .yvan-checkbox').addClass('yvan-checked');
  704. $domHeadInput.addClass('yvan-checked');
  705. },
  706. uncheckAll: function () {
  707. //全不选
  708. var $grid = $(this);
  709. var $headInput = $('#cb_' + $grid[0].id);
  710. var $domHeadInput = $headInput.next();
  711. $grid.find('.td_cbox > .yvan-checkbox').removeClass('yvan-checked');
  712. $domHeadInput.removeClass('yvan-checked');
  713. },
  714. //获取当前数据量
  715. records: function () {
  716. var $grid = $(this);
  717. return $grid.jqGrid('getGridParam', 'records');
  718. },
  719. //清空当前表格数据
  720. clearData: function () {
  721. var $grid = $(this);
  722. $grid.jqGrid('clearGridData');
  723. },
  724. getData: function () {
  725. var $grid = $(this);
  726. return $grid.jqGrid('getRowData');
  727. },
  728. deleteRow: function (rowid) {
  729. var $grid = $(this);
  730. rowid = rowid || $grid.selrow();
  731. if (rowid) {
  732. return $grid.delRowData(rowid);
  733. }
  734. },
  735. selrow: function (rowid) {
  736. var $grid = $(this);
  737. return $grid.jqGrid('getGridParam', 'selrow');
  738. },
  739. rowData: function (rowid) {
  740. var $grid = $(this);
  741. rowid = rowid || $grid.selrow();
  742. if (rowid) {
  743. return $grid.getRowData(rowid);
  744. }
  745. },
  746. selectedRows: function () {
  747. var $grid = $(this);
  748. return $grid.jqGrid("getGridParam", "selarrrow");
  749. },
  750. setGroupHeader: function () {
  751. var $grid = $(this);
  752. var gh = $grid.getGridParam().YvGroupHeaders;
  753. if (gh) {
  754. $grid.jqGrid('destroyGroupHeader');
  755. if ($.type(gh[0]) === 'array') {
  756. for (var i = 0; i < gh.length; i++) {
  757. $grid.jqGrid('setGroupHeaders', {
  758. useColSpanStyle: true,
  759. groupHeaders: gh[i]
  760. });
  761. }
  762. } else {
  763. $grid.jqGrid('setGroupHeaders', {
  764. useColSpanStyle: true,
  765. groupHeaders: gh
  766. });
  767. }
  768. }
  769. },
  770. //重新读取表格
  771. reload: function (options, resetPage) {
  772. var $grid = $(this);
  773. if (resetPage) {
  774. options = $.extend({ page: 1 }, options);
  775. }
  776. if (options) {
  777. //复制属性
  778. options = $.extend({}, options);
  779. options.url = options.url || $grid.jqGrid('getGridParam', 'url');
  780. options.loadCondition = options.loadCondition || $grid.jqGrid('getGridParam', 'loadCondition');
  781. for (var i = 0; i < $.jgrid.chain.onReload.length; i++) {
  782. $.jgrid.chain.onReload[i].apply(this, arguments);
  783. }
  784. convertEasyuiOption(options);
  785. //有参数,将参数与当前表格参数合并
  786. $grid.jqGrid('setGridParam', options);
  787. }
  788. //刷新
  789. $grid.trigger('reloadGrid');
  790. },
  791. reset: function (opts, firstCreate, context) {
  792. var $grid = $(this);
  793. var pageId;
  794. if (!firstCreate) {
  795. context = $.extend($grid.getGridParam('appContext'), context);
  796. pageId = $grid.closest('form').down('gridpager').attr('id');
  797. $grid.GridUnload();
  798. } else {
  799. //构建form
  800. var $form = $('<form></form>');
  801. $.yvan.fillCommonProperties($grid, opts);
  802. if (opts.hasOwnProperty('name')) {
  803. $form.attr('name', item.name);
  804. }
  805. $form.insertAfter($grid);
  806. //构建 pager
  807. pageId = $.yvan.createId('gridpager');
  808. var $pager = $('<div xtype="gridpager" id="' + pageId + '"></div>');
  809. $pager.insertAfter($form);
  810. //移动 table
  811. $form.append($grid);
  812. }
  813. opts = prepearOption(opts, $grid);
  814. if (opts.pagination === false) {
  815. $.extend(opts, {
  816. jsonReader: {
  817. pager: undefined,
  818. id: function (obj) {
  819. return $(this).getGridParam().idField;
  820. },
  821. root: function (obj) {
  822. return obj.data;
  823. },
  824. page: function (obj) {
  825. return 1;
  826. },
  827. total: function (obj) {
  828. return 1;
  829. },
  830. records: function (obj) {
  831. return obj.data.length;
  832. }
  833. }
  834. });
  835. } else {
  836. $.extend(opts, {
  837. pager: '#' + pageId,
  838. rowNum: 20,
  839. rowList: [20, 50, 100, 200, 500, 1000],
  840. jsonReader: {
  841. id: function (obj) {
  842. return $(this).getGridParam().idField;
  843. },
  844. root: function (obj) {
  845. return obj.data;
  846. },
  847. page: function (obj) {
  848. return parseInt(obj.pagination.pageNo);
  849. },
  850. total: function (obj) {
  851. return parseInt(obj.pagination.last);
  852. },
  853. records: function (obj) {
  854. return parseInt(obj.pagination.count);
  855. }
  856. }
  857. });
  858. }
  859. convertEasyuiOption(opts);
  860. for (var i = 0; i < $.jgrid.chain.prepearOption.length; i++) {
  861. $.jgrid.chain.prepearOption[i](opts, $grid);
  862. }
  863. //准备构建工具栏
  864. var toolbar = null;
  865. if (opts.toolbar) {
  866. //需要工具栏
  867. toolbar = opts.toolbar;
  868. $.extend(opts, {
  869. toolbar: [true, 'top']
  870. });
  871. }
  872. function moveFocus(plus) {
  873. var $grid = $(this);
  874. var ids = $grid.getDataIDs();
  875. if (ids.length > 0) {
  876. var rowid = $grid.selrow();
  877. if (!rowid) {
  878. $grid.jqGrid('resetSelection')
  879. .jqGrid('setSelection', ids[0], true);
  880. return true;
  881. } else {
  882. var target = $.inArray(rowid, ids);
  883. if (target < 0) return;
  884. target = plus ? target + 1 : target - 1;
  885. if (target >= 0 && target < ids.length) {
  886. $grid.jqGrid('resetSelection')
  887. .jqGrid('setSelection', ids[target], true);
  888. return true;
  889. }
  890. }
  891. }
  892. return false;
  893. }
  894. //快捷键
  895. function onKeydown(e) {
  896. if (e.key === 'Control' || e.key === 'Shift' || e.key === 'Alt') {
  897. return;
  898. }
  899. var success;
  900. if (!success) {
  901. for (var i = 0; i < $.jgrid.chain.onKeydown.length; i++) {
  902. success = $.jgrid.chain.onKeydown[i].apply(this, arguments);
  903. if (success)
  904. break;
  905. }
  906. }
  907. if (!success) {
  908. if (e.key === 'ArrowDown') {
  909. if (moveFocus.call(this, true)) success = true;
  910. } else if (e.key === 'ArrowUp') {
  911. if (moveFocus.call(this, false)) success = true;
  912. }
  913. }
  914. if (!success) {
  915. if (opts.onKeyDown && !success) {
  916. success = opts.onKeyDown.apply(this, arguments);
  917. }
  918. }
  919. if (success) {
  920. if (e.preventDefault) {
  921. e.preventDefault();
  922. } else {
  923. e.returnValue = false;
  924. }
  925. }
  926. }
  927. var $panel = $grid.parent().parent();
  928. $grid.jqGrid(opts);
  929. if (firstCreate) {
  930. $grid.getGridParam().appContext = context;
  931. }
  932. $grid.getGridParam().YvGroupHeaders = opts.groupHeaders;
  933. $grid.setGroupHeader();
  934. //构建工具栏
  935. if (toolbar) {
  936. createToolbar($grid, $grid.attr('id'), opts, toolbar, context);
  937. }
  938. function resizeMe() {
  939. var $panel = $(this);
  940. for (var i = 0; i < 2; i++) {
  941. var parentHeight = $panel.height();
  942. var parentWidth = $panel.width();
  943. var $box = $grid.findBox();
  944. parentHeight -= $box.find('.ui-state-default.ui-jqgrid-pager.ui-corner-bottom:visible').outerHeight();
  945. parentHeight -= $box.find('.ui-userdata.ui-corner-top:visible').outerHeight();
  946. parentHeight -= $box.find('.ui-corner-top.ui-jqgrid-hdiv:visible').outerHeight();
  947. parentHeight -= $box.find('.ui-corner-top.ui-jqgrid-titlebar:visible').outerHeight();
  948. var param = $grid.jqGrid('getGridParam');
  949. param.height = parentHeight - 3;
  950. param.width = parentWidth - 3;
  951. $grid.jqGrid('setGridWidth', param.width);
  952. $grid.jqGrid('setGridHeight', param.height);
  953. }
  954. }
  955. if ($panel.data().hasOwnProperty('panel')) {
  956. $panel.panel({ onResize: resizeMe });
  957. resizeMe.call($panel[0]);
  958. } else {
  959. console.log('grid 无法自适应大小', $panel);
  960. }
  961. $grid.on('keydown', onKeydown);
  962. },
  963. //找到顶层元素
  964. findBox: function () {
  965. return $($(this).getGridParam().gBox);
  966. },
  967. resizeMe: function () {
  968. var $panel = $(this).findBox().parent().parent();
  969. if ($panel.data().hasOwnProperty('panel')) {
  970. $panel.panel('options').onResize.call($panel[0]);
  971. } else {
  972. console.error('rezieMe 无效');
  973. }
  974. },
  975. autoSizeColumns: function () {
  976. var $grid = $(this);
  977. if (!$grid.jqGrid('getGridParam', 'autoSizeColumns'))
  978. return;
  979. var id = $grid.attr('id');
  980. var td = $('#tdCompute');
  981. var arr = [], temp = [];
  982. $('#gview_' + id + ' .ui-jqgrid-htable tr,#' + id + ' tr:gt(0)').each(function (idx) {
  983. $(this).find('td,th').each(function (idx) {
  984. var _text = $(this).text().trim();
  985. var wh = _text.getTextWH({
  986. "fontSize": "12px",
  987. "fontFamily": "微软雅黑"
  988. });
  989. temp[idx] = Math.max(temp[idx] ? temp[idx] : 0, wh.width);
  990. //arr[idx] = Math.max(arr[idx] ? arr[idx] : 0, td.html($(this).text())[0].style.width);//style.width
  991. });
  992. });
  993. var colModel = $grid.jqGrid('getGridParam', 'colModel');
  994. //设置页头单元格宽度
  995. for (var idx = 0; idx < colModel.length; idx++) {
  996. //$grid.setColWidth(idx, (arr[idx]>temp[idx]?arr[idx]:temp[idx]) + 30);
  997. var width = temp[idx] + 30;
  998. if (width>colModel[idx].maxWidth) {
  999. width = colModel[idx].maxWidth;
  1000. } else if (width<colModel[idx].minWidth) {
  1001. width = colModel[idx].minWidth;
  1002. }
  1003. $grid.setColWidth(idx, width);
  1004. }
  1005. //$('#gview_' + id + ' th').each(function (idx) {
  1006. // var $th = $(this);
  1007. // if ($th.is('.jqgh_rn')) return; //序号列,不调整
  1008. // if ($th.is('.jqgh_cbox')) return; //复选框,不调整
  1009. // $grid.setColWidth(idx, arr[idx] + 15);
  1010. //});
  1011. $grid.resizeMe();
  1012. /*
  1013. //设置页头单元格宽度
  1014. $('#gview_' + id + ' th').each(function (idx) {
  1015. if ($(this).is('.jqgh_cbox')) return; //复选框,不调整
  1016. this.style.width = (arr[idx] + 15) + 'px';
  1017. });
  1018. //设置内容表格中控制单元格宽度的单元格,在第一行
  1019. $('#' + id + ' tr:eq(0) td').each(function (idx) {
  1020. if ($(this).is('.td_cbox')) return; //复选框,不调整
  1021. this.style.width = (arr[idx] + 15) + 'px';
  1022. });
  1023. */
  1024. },
  1025. getEditStatus: function() {
  1026. var $grid = $(this);
  1027. if ($grid.getGridParam('beEdited'))
  1028. {
  1029. return true;
  1030. }
  1031. return false;
  1032. },
  1033. setSortIcon: function () {
  1034. var $grid = $(this);
  1035. var colModel = $grid.jqGrid('getGridParam', 'colModel');
  1036. var tableId = $grid.jqGrid('getGridParam', 'id');
  1037. for (var idx = 0; idx < colModel.length; idx++) {
  1038. var text = colModel[idx].label;
  1039. if (colModel[idx].sortable) {
  1040. if (colModel[idx].lso==='asc') {
  1041. text=text+'<span style="color: green"><b>↑</b></span>';
  1042. } else if (colModel[idx].lso==='desc') {
  1043. text=text+'<span style="color: #ff8038"><b>↓</b></span>';
  1044. } else {
  1045. text=text+'<span style="color: #1076ff"><b>⇅</b></span>';
  1046. }
  1047. }
  1048. $('#'+tableId + '_'+colModel[idx].name + ' > span').remove();
  1049. $('#'+'jqgh_'+tableId + '_'+colModel[idx].name).html(text);
  1050. }
  1051. //$grid.resizeMe();
  1052. }
  1053. });
  1054. })(jQuery);