jquery.edatagrid.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. /**
  2. * edatagrid - jQuery EasyUI
  3. *
  4. * Licensed under the GPL:
  5. * http://www.gnu.org/licenses/gpl.txt
  6. *
  7. * Copyright 2011-2015 www.jeasyui.com
  8. *
  9. * Dependencies:
  10. * datagrid
  11. * messager
  12. *
  13. */
  14. (function($){
  15. // var oldLoadDataMethod = $.fn.datagrid.methods.loadData;
  16. // $.fn.datagrid.methods.loadData = function(jq, data){
  17. // jq.each(function(){
  18. // $.data(this, 'datagrid').filterSource = null;
  19. // });
  20. // return oldLoadDataMethod.call($.fn.datagrid.methods, jq, data);
  21. // };
  22. var autoGrids = [];
  23. function checkAutoGrid(){
  24. autoGrids = $.grep(autoGrids, function(t){
  25. return t.length && t.data('edatagrid');
  26. });
  27. }
  28. function saveAutoGrid(omit){
  29. checkAutoGrid();
  30. $.map(autoGrids, function(t){
  31. if (t[0] != $(omit)[0]){
  32. t.edatagrid('saveRow');
  33. }
  34. });
  35. checkAutoGrid();
  36. }
  37. function addAutoGrid(dg){
  38. checkAutoGrid();
  39. for(var i=0; i<autoGrids.length; i++){
  40. if ($(autoGrids[i])[0] == $(dg)[0]){return;}
  41. }
  42. autoGrids.push($(dg));
  43. }
  44. function delAutoGrid(dg){
  45. checkAutoGrid();
  46. autoGrids = $.grep(autoGrids, function(t){
  47. return $(t)[0] != $(dg)[0];
  48. });
  49. }
  50. $(function(){
  51. $(document).unbind('.edatagrid').bind('mousedown.edatagrid', function(e){
  52. var p = $(e.target).closest('div.datagrid-view,div.combo-panel,div.window,div.window-mask');
  53. if (p.length){
  54. if (p.hasClass('datagrid-view')){
  55. saveAutoGrid(p.children('table'));
  56. }
  57. return;
  58. }
  59. saveAutoGrid();
  60. });
  61. });
  62. function buildGrid(target){
  63. var opts = $.data(target, 'edatagrid').options;
  64. $(target).datagrid($.extend({}, opts, {
  65. onDblClickCell:function(index,field,value){
  66. if (opts.editing){
  67. $(this).edatagrid('editRow', index);
  68. focusEditor(target, field);
  69. }
  70. if (opts.onDblClickCell){
  71. opts.onDblClickCell.call(target, index, field, value);
  72. }
  73. },
  74. onClickCell:function(index,field,value){
  75. if (opts.editing && opts.editIndex >= 0){
  76. $(this).edatagrid('editRow', index);
  77. focusEditor(target, field);
  78. }
  79. if (opts.onClickCell){
  80. opts.onClickCell.call(target, index, field, value);
  81. }
  82. },
  83. onBeforeEdit: function(index, row){
  84. if (opts.onBeforeEdit){
  85. if (opts.onBeforeEdit.call(target, index, row) == false){
  86. return false;
  87. }
  88. }
  89. if (opts.autoSave){
  90. addAutoGrid(this);
  91. }
  92. opts.originalRow = $.extend(true, [], row);
  93. },
  94. onAfterEdit: function(index, row){
  95. delAutoGrid(this);
  96. opts.editIndex = -1;
  97. var url = row.isNewRecord ? opts.saveUrl : opts.updateUrl;
  98. if (url){
  99. var changed = false;
  100. var fields = $(this).edatagrid('getColumnFields',true).concat($(this).edatagrid('getColumnFields'));
  101. for(var i=0; i<fields.length; i++){
  102. var field = fields[i];
  103. var col = $(this).edatagrid('getColumnOption', field);
  104. if (col.editor && opts.originalRow[field] != row[field]){
  105. changed = true;
  106. break;
  107. }
  108. }
  109. if (changed){
  110. $.post(url, row, function(data){
  111. //对处理错误进行处理
  112. loadFilterError(data);
  113. if (data.isError){
  114. $(target).edatagrid('cancelRow',index);
  115. $(target).edatagrid('selectRow',index);
  116. $(target).edatagrid('editRow',index);
  117. opts.onError.call(target, index, data);
  118. return;
  119. }
  120. data.isNewRecord = null;
  121. $(target).datagrid('updateRow', {
  122. index: index,
  123. row: data
  124. });
  125. if (opts.tree){
  126. var idValue = row[opts.idField||'id'];
  127. var t = $(opts.tree);
  128. var node = t.tree('find', idValue);
  129. if (node){
  130. node.text = row[opts.treeTextField];
  131. t.tree('update', node);
  132. } else {
  133. var pnode = t.tree('find', row[opts.treeParentField]);
  134. t.tree('append', {
  135. parent: (pnode ? pnode.target : null),
  136. data: [{id:idValue,text:row[opts.treeTextField]}]
  137. });
  138. }
  139. }
  140. opts.onSuccess.call(target, index, row);
  141. opts.onSave.call(target, index, row);
  142. },'jsonp');
  143. } else {
  144. opts.onSave.call(target, index, row);
  145. }
  146. } else {
  147. opts.onSave.call(target, index, row);
  148. }
  149. if (opts.onAfterEdit) opts.onAfterEdit.call(target, index, row);
  150. },
  151. onCancelEdit: function(index, row){
  152. delAutoGrid(this);
  153. opts.editIndex = -1;
  154. if (row.isNewRecord) {
  155. $(this).datagrid('deleteRow', index);
  156. }
  157. if (opts.onCancelEdit) opts.onCancelEdit.call(target, index, row);
  158. },
  159. onBeforeLoad: function(param){
  160. if (opts.onBeforeLoad.call(target, param) == false){return false}
  161. $(this).edatagrid('cancelRow');
  162. if (opts.tree){
  163. var node = $(opts.tree).tree('getSelected');
  164. param[opts.treeParentField] = node ? node.id : undefined;
  165. }
  166. }
  167. }));
  168. if (opts.tree){
  169. $(opts.tree).tree({
  170. url: opts.treeUrl,
  171. onClick: function(node){
  172. $(target).datagrid('load');
  173. },
  174. onDrop: function(dest,source,point){
  175. var targetId = $(this).tree('getNode', dest).id;
  176. $.ajax({
  177. url: opts.treeDndUrl,
  178. type:'post',
  179. data:{
  180. id:source.id,
  181. targetId:targetId,
  182. point:point
  183. },
  184. dataType:'jsonp',
  185. success:function(){
  186. $(target).datagrid('load');
  187. }
  188. });
  189. }
  190. });
  191. }
  192. }
  193. function focusEditor(target, field){
  194. var opts = $(target).edatagrid('options');
  195. var t;
  196. var editor = $(target).datagrid('getEditor', {index:opts.editIndex,field:field});
  197. if (editor){
  198. t = editor.target;
  199. } else {
  200. var editors = $(target).datagrid('getEditors', opts.editIndex);
  201. if (editors.length){
  202. t = editors[0].target;
  203. }
  204. }
  205. if (t){
  206. if ($(t).hasClass('textbox-f')){
  207. $(t).textbox('textbox').focus();
  208. } else {
  209. $(t).focus();
  210. }
  211. }
  212. }
  213. $.fn.edatagrid = function(options, param){
  214. if (typeof options == 'string'){
  215. var method = $.fn.edatagrid.methods[options];
  216. if (method){
  217. return method(this, param);
  218. } else {
  219. return this.datagrid(options, param);
  220. }
  221. }
  222. options = options || {};
  223. return this.each(function(){
  224. var state = $.data(this, 'edatagrid');
  225. if (state){
  226. $.extend(state.options, options);
  227. } else {
  228. $.data(this, 'edatagrid', {
  229. options: $.extend({}, $.fn.edatagrid.defaults, $.fn.edatagrid.parseOptions(this), options)
  230. });
  231. }
  232. buildGrid(this);
  233. });
  234. };
  235. $.fn.edatagrid.parseOptions = function(target){
  236. return $.extend({}, $.fn.datagrid.parseOptions(target), {
  237. });
  238. };
  239. $.fn.edatagrid.methods = {
  240. options: function(jq){
  241. var opts = $.data(jq[0], 'edatagrid').options;
  242. return opts;
  243. },
  244. loadData: function(jq, data){
  245. return jq.each(function(){
  246. $(this).edatagrid('cancelRow');
  247. $(this).datagrid('loadData', data);
  248. });
  249. },
  250. enableEditing: function(jq){
  251. return jq.each(function(){
  252. var opts = $.data(this, 'edatagrid').options;
  253. opts.editing = true;
  254. });
  255. },
  256. disableEditing: function(jq){
  257. return jq.each(function(){
  258. var opts = $.data(this, 'edatagrid').options;
  259. opts.editing = false;
  260. });
  261. },
  262. isEditing: function(jq, index){
  263. var opts = $.data(jq[0], 'edatagrid').options;
  264. var tr = opts.finder.getTr(jq[0], index);
  265. return tr.length && tr.hasClass('datagrid-row-editing');
  266. },
  267. editRow: function(jq, index){
  268. return jq.each(function(){
  269. var dg = $(this);
  270. var opts = $.data(this, 'edatagrid').options;
  271. var editIndex = opts.editIndex;
  272. if (editIndex != index){
  273. if (dg.datagrid('validateRow', editIndex)){
  274. if (editIndex>=0){
  275. if (opts.onBeforeSave.call(this, editIndex) == false) {
  276. setTimeout(function(){
  277. dg.datagrid('selectRow', editIndex);
  278. },0);
  279. return;
  280. }
  281. }
  282. dg.datagrid('endEdit', editIndex);
  283. dg.datagrid('beginEdit', index);
  284. if (!dg.edatagrid('isEditing', index)){
  285. return;
  286. }
  287. opts.editIndex = index;
  288. focusEditor(this);
  289. var rows = dg.datagrid('getRows');
  290. opts.onEdit.call(this, index, rows[index]);
  291. } else {
  292. setTimeout(function(){
  293. dg.datagrid('selectRow', editIndex);
  294. }, 0);
  295. }
  296. }
  297. });
  298. },
  299. addRow: function(jq, index){
  300. return jq.each(function(){
  301. var dg = $(this);
  302. var opts = $.data(this, 'edatagrid').options;
  303. if (opts.editIndex >= 0){
  304. if (!dg.datagrid('validateRow', opts.editIndex)){
  305. dg.datagrid('selectRow', opts.editIndex);
  306. return;
  307. }
  308. if (opts.onBeforeSave.call(this, opts.editIndex) == false){
  309. setTimeout(function(){
  310. dg.datagrid('selectRow', opts.editIndex);
  311. },0);
  312. return;
  313. }
  314. dg.datagrid('endEdit', opts.editIndex);
  315. }
  316. var rows = dg.datagrid('getRows');
  317. function _add(index, row){
  318. if (index == undefined){
  319. dg.datagrid('appendRow', row);
  320. opts.editIndex = rows.length - 1;
  321. } else {
  322. dg.datagrid('insertRow', {index:index,row:row});
  323. opts.editIndex = index;
  324. }
  325. }
  326. if (typeof index == 'object'){
  327. _add(index.index, $.extend(index.row, {isNewRecord:true}))
  328. } else {
  329. _add(index, {isNewRecord:true});
  330. }
  331. // if (index == undefined){
  332. // dg.datagrid('appendRow', {isNewRecord:true});
  333. // opts.editIndex = rows.length - 1;
  334. // } else {
  335. // dg.datagrid('insertRow', {
  336. // index: index,
  337. // row: {isNewRecord:true}
  338. // });
  339. // opts.editIndex = index;
  340. // }
  341. dg.datagrid('beginEdit', opts.editIndex);
  342. dg.datagrid('selectRow', opts.editIndex);
  343. if (opts.tree){
  344. var node = $(opts.tree).tree('getSelected');
  345. rows[opts.editIndex][opts.treeParentField] = (node ? node.id : 0);
  346. }
  347. opts.onAdd.call(this, opts.editIndex, rows[opts.editIndex]);
  348. });
  349. },
  350. saveRow: function(jq){
  351. return jq.each(function(){
  352. var dg = $(this);
  353. var opts = $.data(this, 'edatagrid').options;
  354. if (opts.editIndex >= 0){
  355. if (opts.onBeforeSave.call(this, opts.editIndex) == false) {
  356. setTimeout(function(){
  357. dg.datagrid('selectRow', opts.editIndex);
  358. },0);
  359. return;
  360. }
  361. $(this).datagrid('endEdit', opts.editIndex);
  362. }
  363. });
  364. },
  365. cancelRow: function(jq){
  366. return jq.each(function(){
  367. var opts = $.data(this, 'edatagrid').options;
  368. if (opts.editIndex >= 0){
  369. $(this).datagrid('cancelEdit', opts.editIndex);
  370. }
  371. });
  372. },
  373. destroyRow: function(jq, index){
  374. return jq.each(function(){
  375. var dg = $(this);
  376. var opts = $.data(this, 'edatagrid').options;
  377. var rows = [];
  378. if (index == undefined){
  379. rows = dg.datagrid('getSelections');
  380. } else {
  381. var rowIndexes = $.isArray(index) ? index : [index];
  382. for(var i=0; i<rowIndexes.length; i++){
  383. var row = opts.finder.getRow(this, rowIndexes[i]);
  384. if (row){
  385. rows.push(row);
  386. }
  387. }
  388. }
  389. if (!rows.length){
  390. $.messager.show({
  391. title: opts.destroyMsg.norecord.title,
  392. msg: opts.destroyMsg.norecord.msg
  393. });
  394. return;
  395. }
  396. $.messager.confirm(opts.destroyMsg.confirm.title,opts.destroyMsg.confirm.msg,function(r){
  397. if (r){
  398. for(var i=0; i<rows.length; i++){
  399. _del(rows[i]);
  400. }
  401. dg.datagrid('clearSelections');
  402. }
  403. });
  404. function _del(row){
  405. var index = dg.datagrid('getRowIndex', row);
  406. if (index == -1){return}
  407. if (row.isNewRecord){
  408. dg.datagrid('cancelEdit', index);
  409. } else {
  410. if (opts.destroyUrl){
  411. var idValue = row[opts.idField||'id'];
  412. $.post(opts.destroyUrl, {id:idValue}, function(data){
  413. //对处理错误进行处理
  414. loadFilterError(data);
  415. var index = dg.datagrid('getRowIndex', idValue);
  416. if (data.isError){
  417. dg.datagrid('selectRow', index);
  418. opts.onError.call(dg[0], index, data);
  419. return;
  420. }
  421. if (opts.tree){
  422. dg.datagrid('reload');
  423. var t = $(opts.tree);
  424. var node = t.tree('find', idValue);
  425. if (node){
  426. t.tree('remove', node.target);
  427. }
  428. } else {
  429. dg.datagrid('cancelEdit', index);
  430. dg.datagrid('deleteRow', index);
  431. }
  432. opts.onDestroy.call(dg[0], index, row);
  433. var pager = dg.datagrid('getPager');
  434. if (pager.length && !dg.datagrid('getRows').length){
  435. dg.datagrid('options').pageNumber = pager.pagination('options').pageNumber;
  436. dg.datagrid('reload');
  437. }
  438. }, 'jsonp');
  439. } else {
  440. dg.datagrid('cancelEdit', index);
  441. dg.datagrid('deleteRow', index);
  442. opts.onDestroy.call(dg[0], index, row);
  443. }
  444. }
  445. }
  446. });
  447. }
  448. };
  449. $.fn.edatagrid.defaults = $.extend({}, $.fn.datagrid.defaults, {
  450. singleSelect: true,
  451. editing: true,
  452. editIndex: -1,
  453. destroyMsg:{
  454. norecord:{
  455. title:'系统提示',
  456. msg:'您没有选择删除行,请选择列表的删除行!'
  457. },
  458. confirm:{
  459. title:'系统提示',
  460. msg:'您确定删除列表选择的当前行记录吗?'
  461. }
  462. },
  463. // destroyConfirmTitle: 'Confirm',
  464. // destroyConfirmMsg: 'Are you sure you want to delete?',
  465. autoSave: false, // auto save the editing row when click out of datagrid
  466. url: null, // return the datagrid data
  467. saveUrl: null, // return the added row
  468. updateUrl: null, // return the updated row
  469. destroyUrl: null, // return {success:true}
  470. tree: null, // the tree selector
  471. treeUrl: null, // return tree data
  472. treeDndUrl: null, // to process the drag and drop operation, return {success:true}
  473. treeTextField: 'name',
  474. treeParentField: 'parentId',
  475. onAdd: function(index, row){},
  476. onEdit: function(index, row){},
  477. onBeforeSave: function(index){},
  478. onSave: function(index, row){},
  479. onSuccess: function(index, row){},
  480. onDestroy: function(index, row){},
  481. onError: function(index, row){}
  482. });
  483. ////////////////////////////////
  484. $.parser.plugins.push('edatagrid');
  485. })(jQuery);