table-editable.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. var TableEditable = function () {
  2. return {
  3. //main function to initiate the module
  4. init: function () {
  5. function restoreRow(oTable, nRow) {
  6. var aData = oTable.fnGetData(nRow);
  7. var jqTds = $('>td', nRow);
  8. for (var i = 0, iLen = jqTds.length; i < iLen; i++) {
  9. oTable.fnUpdate(aData[i], nRow, i, false);
  10. }
  11. oTable.fnDraw();
  12. }
  13. function editRow(oTable, nRow) {
  14. var aData = oTable.fnGetData(nRow);
  15. var jqTds = $('>td', nRow);
  16. jqTds[0].innerHTML = '<input type="text" class="m-wrap small" value="' + aData[0] + '">';
  17. jqTds[1].innerHTML = '<input type="text" class="m-wrap small" value="' + aData[1] + '">';
  18. jqTds[2].innerHTML = '<input type="text" class="m-wrap small" value="' + aData[2] + '">';
  19. jqTds[3].innerHTML = '<input type="text" class="m-wrap small" value="' + aData[3] + '">';
  20. jqTds[4].innerHTML = '<a class="edit" href="">Save</a>';
  21. jqTds[5].innerHTML = '<a class="cancel" href="">Cancel</a>';
  22. }
  23. function saveRow(oTable, nRow) {
  24. var jqInputs = $('input', nRow);
  25. oTable.fnUpdate(jqInputs[0].value, nRow, 0, false);
  26. oTable.fnUpdate(jqInputs[1].value, nRow, 1, false);
  27. oTable.fnUpdate(jqInputs[2].value, nRow, 2, false);
  28. oTable.fnUpdate(jqInputs[3].value, nRow, 3, false);
  29. oTable.fnUpdate('<a class="edit" href="">Edit</a>', nRow, 4, false);
  30. oTable.fnUpdate('<a class="delete" href="">Delete</a>', nRow, 5, false);
  31. oTable.fnDraw();
  32. }
  33. function cancelEditRow(oTable, nRow) {
  34. var jqInputs = $('input', nRow);
  35. oTable.fnUpdate(jqInputs[0].value, nRow, 0, false);
  36. oTable.fnUpdate(jqInputs[1].value, nRow, 1, false);
  37. oTable.fnUpdate(jqInputs[2].value, nRow, 2, false);
  38. oTable.fnUpdate(jqInputs[3].value, nRow, 3, false);
  39. oTable.fnUpdate('<a class="edit" href="">Edit</a>', nRow, 4, false);
  40. oTable.fnDraw();
  41. }
  42. var oTable = $('#sample_editable_1').dataTable({
  43. "aLengthMenu": [
  44. [5, 15, 20, -1],
  45. [5, 15, 20, "All"] // change per page values here
  46. ],
  47. // set the initial value
  48. "iDisplayLength": 5,
  49. "sDom": "<'row-fluid'<'span6'l><'span6'f>r>t<'row-fluid'<'span6'i><'span6'p>>",
  50. "sPaginationType": "bootstrap",
  51. "oLanguage": {
  52. "sLengthMenu": "_MENU_ records per page",
  53. "oPaginate": {
  54. "sPrevious": "Prev",
  55. "sNext": "Next"
  56. }
  57. },
  58. "aoColumnDefs": [{
  59. 'bSortable': false,
  60. 'aTargets': [0]
  61. }
  62. ]
  63. });
  64. jQuery('#sample_editable_1_wrapper .dataTables_filter input').addClass("m-wrap medium"); // modify table search input
  65. jQuery('#sample_editable_1_wrapper .dataTables_length select').addClass("m-wrap small"); // modify table per page dropdown
  66. jQuery('#sample_editable_1_wrapper .dataTables_length select').select2({
  67. showSearchInput : false //hide search box with special css class
  68. }); // initialzie select2 dropdown
  69. var nEditing = null;
  70. $('#sample_editable_1_new').click(function (e) {
  71. e.preventDefault();
  72. var aiNew = oTable.fnAddData(['', '', '', '',
  73. '<a class="edit" href="">Edit</a>', '<a class="cancel" data-mode="new" href="">Cancel</a>'
  74. ]);
  75. var nRow = oTable.fnGetNodes(aiNew[0]);
  76. editRow(oTable, nRow);
  77. nEditing = nRow;
  78. });
  79. $('#sample_editable_1 a.delete').live('click', function (e) {
  80. e.preventDefault();
  81. if (confirm("Are you sure to delete this row ?") == false) {
  82. return;
  83. }
  84. var nRow = $(this).parents('tr')[0];
  85. oTable.fnDeleteRow(nRow);
  86. alert("Deleted! Do not forget to do some ajax to sync with backend :)");
  87. });
  88. $('#sample_editable_1 a.cancel').live('click', function (e) {
  89. e.preventDefault();
  90. if ($(this).attr("data-mode") == "new") {
  91. var nRow = $(this).parents('tr')[0];
  92. oTable.fnDeleteRow(nRow);
  93. } else {
  94. restoreRow(oTable, nEditing);
  95. nEditing = null;
  96. }
  97. });
  98. $('#sample_editable_1 a.edit').live('click', function (e) {
  99. e.preventDefault();
  100. /* Get the row as a parent of the link that was clicked on */
  101. var nRow = $(this).parents('tr')[0];
  102. if (nEditing !== null && nEditing != nRow) {
  103. /* Currently editing - but not this row - restore the old before continuing to edit mode */
  104. restoreRow(oTable, nEditing);
  105. editRow(oTable, nRow);
  106. nEditing = nRow;
  107. } else if (nEditing == nRow && this.innerHTML == "Save") {
  108. /* Editing this row and want to save it */
  109. saveRow(oTable, nEditing);
  110. nEditing = null;
  111. alert("Updated! Do not forget to do some ajax to sync with backend :)");
  112. } else {
  113. /* No edit in progress - let's start one */
  114. editRow(oTable, nRow);
  115. nEditing = nRow;
  116. }
  117. });
  118. }
  119. };
  120. }();