bootstrap-table-cell-input.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. /**
  2. * @author andrey matveev <aamatveef@gmail.com>
  3. * @version: v1.1.0
  4. * https://github.com/aamatveev/bootstrap-table
  5. * extensions:
  6. */
  7. $.extend($.fn.bootstrapTable.defaults, {
  8. cellInputEnabled: false,
  9. cellInputType: 'text', // text or select or textarea
  10. cellInputUniqueId: '',
  11. cellInputSelectOptinons: [], // [{ text: '', value: '', disabled: false, default: true },{}]
  12. cellInputIsDeciaml: false,
  13. onCellInputInit: function () {
  14. return false
  15. },
  16. onCellInputBlur: function (field, row, oldValue, $el) {
  17. return false
  18. },
  19. onCellInputFocus: function (field, row, oldValue, $el) {
  20. return false
  21. },
  22. onCellInputKeyup: function (field, row, oldValue, $el) {
  23. return false
  24. },
  25. onCellInputKeydown: function (field, row, oldValue, $el) {
  26. return false
  27. },
  28. onCellInputSelectChange: function (field, row, oldValue, $el) {
  29. return false
  30. }
  31. })
  32. $.extend($.fn.bootstrapTable.Constructor.EVENTS, {
  33. 'cellinput-init.bs.table': 'onCellInputInit',
  34. 'cellinput-blur.bs.table': 'onCellInputBlur',
  35. 'cellinput-focus.bs.table': 'onCellInputFocus',
  36. 'cellinput-keyup.bs.table': 'onCellInputKeyup',
  37. 'cellinput-keydown.bs.table': 'onCellInputKeydown',
  38. 'cellinput-selectchange.bs.table': 'onCellInputSelectChange'
  39. })
  40. var BootstrapTable = $.fn.bootstrapTable.Constructor
  41. var _initTable = BootstrapTable.prototype.initTable
  42. var _initBody = BootstrapTable.prototype.initBody
  43. BootstrapTable.prototype.initTable = function () {
  44. _initTable.apply(this, Array.prototype.slice.apply(arguments))
  45. // exit if table.options.cellInputEnabled = false
  46. if (!this.options.cellInputEnabled) {
  47. return
  48. }
  49. $.each(this.columns, function (i, column) {
  50. // exit if column.cellInputEnabled = false
  51. if (!column.cellInputEnabled) {
  52. return
  53. }
  54. var _formatter = column.formatter
  55. if (column.cellInputType === 'text') {
  56. column.formatter = function (value, row, index) {
  57. var result = _formatter ? _formatter(value, row, index) : value
  58. // Решает проблему невозможности ввода кавычек &quot;
  59. result = typeof result === 'string' ? result.replace(/"/g, '&quot;') : result
  60. var isSetDataUniqueIdAttr = column.cellInputUniqueId && column.cellInputUniqueId.length > 0
  61. var disableCallbackFunc = column.cellInputDisableCallbackFunc
  62. return ['<input type="text" class="table-td-textbox form-control"',
  63. // ' id="' + column.field + '"',
  64. isSetDataUniqueIdAttr ? ' data-uniqueid="' + row[column.cellInputUniqueId] + '"' : '',
  65. ' data-name="' + column.field + '"',
  66. ' data-value="' + result + '"',
  67. ' value="' + result + '"',
  68. ' autofocus="autofocus"',
  69. typeof disableCallbackFunc !== 'undefined' && disableCallbackFunc(row) ? ' disabled="disabled"' : '',
  70. '>'
  71. ].join('')
  72. }
  73. } else if (column.cellInputType === 'select') {
  74. column.formatter = function (value, row, index) {
  75. var result = _formatter ? _formatter(value, row, index) : value
  76. var optionDatas = column.cellInputSelectOptinons !== null ? column.cellInputSelectOptinons : []
  77. var selectoptions = []
  78. var arrAllowedValues = []
  79. for (var k = 0; k < optionDatas.length; k++) {
  80. arrAllowedValues.push(optionDatas[k].value)
  81. }
  82. var allowedVal = $.inArray(value, arrAllowedValues) >= 0
  83. for (var j = 0; j < optionDatas.length; j++) {
  84. var optionData = optionDatas[j]
  85. var isSelected = optionData.value === value
  86. if (!allowedVal && optionData.disabled) {
  87. isSelected = true
  88. result = optionData.value
  89. }
  90. selectoptions.push('<option value="' + optionData.value + '" ' + (isSelected ? ' selected="selected" ' : '') + (optionData.disabled ? ' disabled' : '') + '>' + optionData.text + '</option>')
  91. }
  92. var isSetDataUniqueIdAttr = column.cellInputUniqueId && column.cellInputUniqueId.length > 0
  93. var disableCallbackFunc = column.disableCallbackFunc
  94. return [
  95. '<select class="form-control" style="padding: 4px;"',
  96. isSetDataUniqueIdAttr ? ' data-uniqueid="' + row[column.cellInputUniqueId] + '"' : '',
  97. ' data-name="' + column.field + '"',
  98. ' data-value="' + result + '"',
  99. typeof disableCallbackFunc !== 'undefined' && disableCallbackFunc(row) ? ' disabled="disabled"' : '',
  100. '>',
  101. selectoptions.join(''),
  102. '</select>'
  103. ].join('')
  104. }
  105. }
  106. })
  107. }
  108. BootstrapTable.prototype.initBody = function (fixedScroll) {
  109. var that = this
  110. _initBody.apply(this, Array.prototype.slice.apply(arguments))
  111. if (!this.options.cellInputEnabled) {
  112. return
  113. }
  114. $.each(this.columns, function (i, column) {
  115. if (column.cellInputType === 'text') {
  116. that.$body.find('input[data-name="' + column.field + '"]')
  117. .off('blur').on('blur', function (e) {
  118. var data = that.getData()
  119. var index = $(this).parents('tr[data-index]').data('index')
  120. var row = data[index]
  121. var newValue = $(this).val()
  122. row[column.field] = newValue
  123. that.trigger('cellinput-blur', column.field, row, $(this))
  124. })
  125. that.$body.find('input[data-name="' + column.field + '"]')
  126. .off('keyup').on('keyup', function (e) {
  127. var data = that.getData()
  128. var index = $(this).parents('tr[data-index]').data('index')
  129. var row = data[index]
  130. var oldValue = row[column.field]
  131. var newValue = $(this).val()
  132. row[column.field] = newValue
  133. that.trigger('cellinput-keyup', column.field, row, oldValue, index, $(this))
  134. })
  135. that.$body.find('input[data-name="' + column.field + '"]')
  136. .off('keydown').on('keydown', function (e) {
  137. var data = that.getData()
  138. var index = $(this).parents('tr[data-index]').data('index')
  139. var row = data[index]
  140. var oldValue = row[column.field]
  141. var newValue = $(this).val()
  142. if (!column.tdtexboxIsDeciaml) {
  143. row[column.field] = newValue
  144. }
  145. that.trigger('cellinput-keydown', column.field, row, oldValue, index, $(this))
  146. })
  147. that.$body.find('input[data-name="' + column.field + '"]')
  148. .off('focus').on('focus', function (e) {
  149. var data = that.getData()
  150. var index = $(this).parents('tr[data-index]').data('index')
  151. var row = data[index]
  152. that.trigger('cellinput-focus', column.field, row, $(this))
  153. })
  154. } else if (column.cellInputType === 'select') {
  155. that.$body.find('select[data-name="' + column.field + '"]')
  156. .off('change').on('change', function (e) {
  157. var data = that.getData()
  158. var index = $(this).parents('tr[data-index]').data('index')
  159. var row = data[index]
  160. var oldValue = row[column.field]
  161. var newValue = $(this).val()
  162. var isBoolTrue = newValue.toLowerCase() === 'true'
  163. var isBoolFalse = newValue.toLowerCase() === 'false'
  164. row[column.field] = isBoolTrue ? true : (isBoolFalse) ? false : newValue
  165. that.trigger('cellinput-selectchange', column.field, row, oldValue, index, $(this))
  166. })
  167. }
  168. })
  169. this.trigger('cellinput-init')
  170. }