ExpandableTable.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /**
  2. * --------------------------------------------
  3. * AdminLTE ExpandableTable.js
  4. * License MIT
  5. * --------------------------------------------
  6. */
  7. import $ from 'jquery'
  8. /**
  9. * Constants
  10. * ====================================================
  11. */
  12. const NAME = 'ExpandableTable'
  13. const DATA_KEY = 'lte.expandableTable'
  14. const EVENT_KEY = `.${DATA_KEY}`
  15. const JQUERY_NO_CONFLICT = $.fn[NAME]
  16. const EVENT_EXPANDED = `expanded${EVENT_KEY}`
  17. const EVENT_COLLAPSED = `collapsed${EVENT_KEY}`
  18. const SELECTOR_TABLE = '.expandable-table'
  19. const SELECTOR_DATA_TOGGLE = '[data-widget="expandable-table"]'
  20. const SELECTOR_ARIA_ATTR = 'aria-expanded'
  21. /**
  22. * Class Definition
  23. * ====================================================
  24. */
  25. class ExpandableTable {
  26. constructor(element, options) {
  27. this._options = options
  28. this._element = element
  29. }
  30. // Public
  31. init() {
  32. $(SELECTOR_DATA_TOGGLE).each((_, $header) => {
  33. const $type = $($header).attr(SELECTOR_ARIA_ATTR)
  34. const $body = $($header).next().children().first().children()
  35. if ($type === 'true') {
  36. $body.show()
  37. } else if ($type === 'false') {
  38. $body.hide()
  39. $body.parent().parent().addClass('d-none')
  40. }
  41. })
  42. }
  43. toggleRow() {
  44. const $element = this._element
  45. const time = 500
  46. const $type = $element.attr(SELECTOR_ARIA_ATTR)
  47. const $body = $element.next().children().first().children()
  48. $body.stop()
  49. if ($type === 'true') {
  50. $body.slideUp(time, () => {
  51. $element.next().addClass('d-none')
  52. })
  53. $element.attr(SELECTOR_ARIA_ATTR, 'false')
  54. $element.trigger($.Event(EVENT_COLLAPSED))
  55. } else if ($type === 'false') {
  56. $element.next().removeClass('d-none')
  57. $body.slideDown(time)
  58. $element.attr(SELECTOR_ARIA_ATTR, 'true')
  59. $element.trigger($.Event(EVENT_EXPANDED))
  60. }
  61. }
  62. // Static
  63. static _jQueryInterface(operation) {
  64. return this.each(function () {
  65. let data = $(this).data(DATA_KEY)
  66. if (!data) {
  67. data = new ExpandableTable($(this))
  68. $(this).data(DATA_KEY, data)
  69. }
  70. if (typeof operation === 'string' && operation.match(/init|toggleRow/)) {
  71. data[operation]()
  72. }
  73. })
  74. }
  75. }
  76. /**
  77. * Data API
  78. * ====================================================
  79. */
  80. $(SELECTOR_TABLE).ready(function () {
  81. ExpandableTable._jQueryInterface.call($(this), 'init')
  82. })
  83. $(document).on('click', SELECTOR_DATA_TOGGLE, function () {
  84. ExpandableTable._jQueryInterface.call($(this), 'toggleRow')
  85. })
  86. /**
  87. * jQuery API
  88. * ====================================================
  89. */
  90. $.fn[NAME] = ExpandableTable._jQueryInterface
  91. $.fn[NAME].Constructor = ExpandableTable
  92. $.fn[NAME].noConflict = function () {
  93. $.fn[NAME] = JQUERY_NO_CONFLICT
  94. return ExpandableTable._jQueryInterface
  95. }
  96. export default ExpandableTable