bootstrap-table-editable.js 4.5 KB

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