bootstrap-table-editable.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. (function (global, factory) {
  2. if (typeof define === "function" && define.amd) {
  3. define([], factory);
  4. } else if (typeof exports !== "undefined") {
  5. factory();
  6. } else {
  7. var mod = {
  8. exports: {}
  9. };
  10. factory();
  11. global.bootstrapTableEditable = mod.exports;
  12. }
  13. })(this, function () {
  14. 'use strict';
  15. /**
  16. * @author zhixin wen <wenzhixin2010@gmail.com>
  17. * extensions: https://github.com/vitalets/x-editable
  18. */
  19. (function ($) {
  20. 'use strict';
  21. $.extend($.fn.bootstrapTable.defaults, {
  22. editable: true,
  23. onEditableInit: function onEditableInit() {
  24. return false;
  25. },
  26. onEditableSave: function onEditableSave(field, row, oldValue, $el) {
  27. return false;
  28. },
  29. onEditableShown: function onEditableShown(field, row, $el, editable) {
  30. return false;
  31. },
  32. onEditableHidden: function onEditableHidden(field, row, $el, reason) {
  33. return false;
  34. }
  35. });
  36. $.extend($.fn.bootstrapTable.Constructor.EVENTS, {
  37. 'editable-init.bs.table': 'onEditableInit',
  38. 'editable-save.bs.table': 'onEditableSave',
  39. 'editable-shown.bs.table': 'onEditableShown',
  40. 'editable-hidden.bs.table': 'onEditableHidden'
  41. });
  42. var BootstrapTable = $.fn.bootstrapTable.Constructor,
  43. _initTable = BootstrapTable.prototype.initTable,
  44. _initBody = BootstrapTable.prototype.initBody;
  45. BootstrapTable.prototype.initTable = function () {
  46. var that = this;
  47. _initTable.apply(this, Array.prototype.slice.apply(arguments));
  48. if (!this.options.editable) {
  49. return;
  50. }
  51. $.each(this.columns, function (i, column) {
  52. if (!column.editable) {
  53. return;
  54. }
  55. var editableOptions = {},
  56. editableDataMarkup = [],
  57. editableDataPrefix = 'editable-';
  58. var processDataOptions = function processDataOptions(key, value) {
  59. // Replace camel case with dashes.
  60. var dashKey = key.replace(/([A-Z])/g, function ($1) {
  61. return "-" + $1.toLowerCase();
  62. });
  63. if (dashKey.slice(0, editableDataPrefix.length) == editableDataPrefix) {
  64. var dataKey = dashKey.replace(editableDataPrefix, 'data-');
  65. editableOptions[dataKey] = value;
  66. }
  67. };
  68. $.each(that.options, processDataOptions);
  69. column.formatter = column.formatter || function (value, row, index) {
  70. return value;
  71. };
  72. column._formatter = column._formatter ? column._formatter : column.formatter;
  73. column.formatter = function (value, row, index) {
  74. var result = $.fn.bootstrapTable.utils.calculateObjectValue(column, column._formatter, [value, row, index], value);
  75. $.each(column, processDataOptions);
  76. $.each(editableOptions, function (key, value) {
  77. editableDataMarkup.push(' ' + key + '="' + value + '"');
  78. });
  79. var _dont_edit_formatter = false;
  80. if (column.editable.hasOwnProperty('noeditFormatter')) {
  81. _dont_edit_formatter = column.editable.noeditFormatter(value, row, index);
  82. }
  83. if (_dont_edit_formatter === false) {
  84. return ['<a href="javascript:void(0)"', ' data-name="' + column.field + '"', ' data-pk="' + row[that.options.idField] + '"', ' data-value="' + result + '"', editableDataMarkup.join(''), '>' + '</a>'].join('');
  85. } else {
  86. return _dont_edit_formatter;
  87. }
  88. };
  89. });
  90. };
  91. BootstrapTable.prototype.initBody = function () {
  92. var that = this;
  93. _initBody.apply(this, Array.prototype.slice.apply(arguments));
  94. if (!this.options.editable) {
  95. return;
  96. }
  97. $.each(this.columns, function (i, column) {
  98. if (!column.editable) {
  99. return;
  100. }
  101. var data = that.getData();
  102. that.$body.find('a[data-name="' + column.field + '"]').each(function (i, element) {
  103. var $element = $(element);
  104. var $tr = $element.closest('tr');
  105. var index = $tr.data('index');
  106. var row = data[index];
  107. var editableOpts = $.fn.bootstrapTable.utils.calculateObjectValue(column, column.editable, [index, row, $element], {});
  108. $element.editable(editableOpts);
  109. });
  110. that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable).off('save').on('save', function (e, params) {
  111. var data = that.getData(),
  112. index = $(this).parents('tr[data-index]').data('index'),
  113. row = data[index],
  114. oldValue = row[column.field];
  115. $(this).data('value', params.submitValue);
  116. row[column.field] = params.submitValue;
  117. that.trigger('editable-save', column.field, row, oldValue, $(this));
  118. that.resetFooter();
  119. });
  120. that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable).off('shown').on('shown', function (e, editable) {
  121. var data = that.getData(),
  122. index = $(this).parents('tr[data-index]').data('index'),
  123. row = data[index];
  124. that.trigger('editable-shown', column.field, row, $(this), editable);
  125. });
  126. that.$body.find('a[data-name="' + column.field + '"]').editable(column.editable).off('hidden').on('hidden', function (e, reason) {
  127. var data = that.getData(),
  128. index = $(this).parents('tr[data-index]').data('index'),
  129. row = data[index];
  130. that.trigger('editable-hidden', column.field, row, $(this), reason);
  131. });
  132. });
  133. this.trigger('editable-init');
  134. };
  135. })(jQuery);
  136. });