bootstrap-table-toolbar.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. /**
  2. * @author: aperez <aperez@datadec.es>
  3. * @version: v2.0.0
  4. *
  5. * @update Dennis Hernández <http://djhvscf.github.io/Blog>
  6. * @update zhixin wen <wenzhixin2010@gmail.com>
  7. */
  8. ($ => {
  9. const Utils = $.fn.bootstrapTable.utils
  10. const bootstrap = {
  11. 3: {
  12. icons: {
  13. advancedSearchIcon: 'glyphicon-chevron-down'
  14. },
  15. html: {
  16. modalHeader: `
  17. <div class="modal-header">
  18. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  19. <span aria-hidden="true">&times;</span>
  20. </button>
  21. <h4 class="modal-title">%s</h4>
  22. </div>
  23. `
  24. }
  25. },
  26. 4: {
  27. icons: {
  28. advancedSearchIcon: 'fa-chevron-down'
  29. },
  30. html: {
  31. modalHeader: `
  32. <div class="modal-header">
  33. <h4 class="modal-title">%s</h4>
  34. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  35. <span aria-hidden="true">&times;</span>
  36. </button>
  37. </div>
  38. `
  39. }
  40. }
  41. }[Utils.bootstrapVersion]
  42. $.extend($.fn.bootstrapTable.defaults, {
  43. advancedSearch: false,
  44. idForm: 'advancedSearch',
  45. actionForm: '',
  46. idTable: undefined,
  47. onColumnAdvancedSearch(field, text) {
  48. return false
  49. }
  50. })
  51. $.extend($.fn.bootstrapTable.defaults.icons, {
  52. advancedSearchIcon: bootstrap.icons.advancedSearchIcon
  53. })
  54. $.extend($.fn.bootstrapTable.Constructor.EVENTS, {
  55. 'column-advanced-search.bs.table': 'onColumnAdvancedSearch'
  56. })
  57. $.extend($.fn.bootstrapTable.locales, {
  58. formatAdvancedSearch() {
  59. return 'Advanced search'
  60. },
  61. formatAdvancedCloseButton() {
  62. return 'Close'
  63. }
  64. })
  65. $.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales)
  66. $.BootstrapTable = class extends $.BootstrapTable {
  67. initToolbar() {
  68. const o = this.options
  69. this.showToolbar = this.showToolbar || o.search && o.advancedSearch && o.idTable
  70. super.initToolbar()
  71. if (!o.search || !o.advancedSearch || !o.idTable) {
  72. return
  73. }
  74. this.$toolbar.find('>.btn-group').append(`
  75. <button class="btn btn-default${Utils.sprintf(' btn-%s', o.buttonsClass)}${Utils.sprintf(' btn-%s', o.iconSize)}"
  76. type="button"
  77. name="advancedSearch"
  78. aria-label="advanced search"
  79. title="${o.formatAdvancedSearch()}">
  80. <i class="${o.iconsPrefix} ${o.icons.advancedSearchIcon}"></i>
  81. </button>
  82. `)
  83. this.$toolbar.find('button[name="advancedSearch"]').off('click').on('click', () => this.showAvdSearch())
  84. }
  85. showAvdSearch() {
  86. const o = this.options
  87. if (!$(`#avdSearchModal_${o.idTable}`).hasClass('modal')) {
  88. $('body').append(`
  89. <div id="avdSearchModal_${o.idTable}" class="modal fade" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
  90. <div class="modal-dialog modal-xs">
  91. <div class="modal-content">
  92. ${Utils.sprintf(bootstrap.html.modalHeader, o.formatAdvancedSearch())}
  93. <div class="modal-body modal-body-custom">
  94. <div class="container-fluid" id="avdSearchModalContent_${o.idTable}"
  95. style="padding-right: 0px; padding-left: 0px;" >
  96. </div>
  97. </div>
  98. <div class="modal-footer">
  99. <button type="button" id="btnCloseAvd_${o.idTable}" class="btn btn-${o.buttonsClass}">
  100. ${o.formatAdvancedCloseButton()}
  101. </button>
  102. </div>
  103. </div>
  104. </div>
  105. </div>
  106. `)
  107. let timeoutId = 0
  108. $(`#avdSearchModalContent_${o.idTable}`).append(this.createFormAvd().join(''))
  109. $(`#${o.idForm}`).off('keyup blur', 'input').on('keyup blur', 'input', e => {
  110. if (o.sidePagination === 'server') {
  111. this.onColumnAdvancedSearch(e)
  112. } else {
  113. clearTimeout(timeoutId)
  114. timeoutId = setTimeout(() => {
  115. this.onColumnAdvancedSearch(e)
  116. }, o.searchTimeOut)
  117. }
  118. })
  119. $(`#btnCloseAvd_${o.idTable}`).click(() => {
  120. $(`#avdSearchModal_${o.idTable}`).modal('hide')
  121. if (o.sidePagination === 'server') {
  122. this.options.pageNumber = 1
  123. this.updatePagination()
  124. this.trigger('column-advanced-search', this.filterColumnsPartial)
  125. }
  126. })
  127. $(`#avdSearchModal_${o.idTable}`).modal()
  128. } else {
  129. $(`#avdSearchModal_${o.idTable}`).modal()
  130. }
  131. }
  132. createFormAvd() {
  133. const o = this.options
  134. const html = [`<form class="form-horizontal" id="${o.idForm}" action="${o.actionForm}">`]
  135. for (let column of this.columns) {
  136. if (!column.checkbox && column.visible && column.searchable) {
  137. html.push(`
  138. <div class="form-group row">
  139. <label class="col-sm-4 control-label">${column.title}</label>
  140. <div class="col-sm-6">
  141. <input type="text" class="form-control input-md" name="${column.field}" placeholder="${column.title}" id="${column.field}">
  142. </div>
  143. </div>
  144. `)
  145. }
  146. }
  147. html.push('</form>')
  148. return html
  149. }
  150. initSearch() {
  151. super.initSearch()
  152. if (!this.options.advancedSearch || this.options.sidePagination === 'server') {
  153. return
  154. }
  155. const fp = $.isEmptyObject(this.filterColumnsPartial) ? null : this.filterColumnsPartial
  156. this.data = fp ? $.grep(this.data, function (item, i) {
  157. for (const key in fp) {
  158. const fval = fp[key].toLowerCase()
  159. let value = item[key]
  160. const index = this.header.fields.indexOf(key)
  161. value = Utils.calculateObjectValue(this.header, this.header.formatters[index], [value, item, i], value)
  162. if (
  163. !(index !== -1 &&
  164. (typeof value === 'string' || typeof value === 'number') &&
  165. (`${value}`).toLowerCase().includes(fval))
  166. ) {
  167. return false
  168. }
  169. }
  170. return true
  171. }) : this.data
  172. }
  173. onColumnAdvancedSearch(e) {
  174. const text = $.trim($(e.currentTarget).val())
  175. const $field = $(e.currentTarget)[0].id
  176. if ($.isEmptyObject(this.filterColumnsPartial)) {
  177. this.filterColumnsPartial = {}
  178. }
  179. if (text) {
  180. this.filterColumnsPartial[$field] = text
  181. } else {
  182. delete this.filterColumnsPartial[$field]
  183. }
  184. if (this.options.sidePagination !== 'server') {
  185. this.options.pageNumber = 1
  186. this.onSearch(e)
  187. this.updatePagination()
  188. this.trigger('column-advanced-search', $field, text)
  189. }
  190. }
  191. }
  192. })(jQuery)