Widget.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /**
  2. * --------------------------------------------
  3. * AdminLTE Widget.js
  4. * License MIT
  5. * --------------------------------------------
  6. */
  7. const Widget = (($) => {
  8. /**
  9. * Constants
  10. * ====================================================
  11. */
  12. const NAME = 'Widget'
  13. const DATA_KEY = 'lte.widget'
  14. const EVENT_KEY = `.${DATA_KEY}`
  15. const JQUERY_NO_CONFLICT = $.fn[NAME]
  16. const Event = {
  17. EXPANDED : `expanded${EVENT_KEY}`,
  18. COLLAPSED: `collapsed${EVENT_KEY}`,
  19. REMOVED : `removed${EVENT_KEY}`
  20. }
  21. const Selector = {
  22. DATA_REMOVE : '[data-widget="remove"]',
  23. DATA_COLLAPSE: '[data-widget="collapse"]',
  24. CARD : '.card',
  25. CARD_HEADER : '.card-header',
  26. CARD_BODY : '.card-body',
  27. CARD_FOOTER : '.card-footer',
  28. COLLAPSED : '.collapsed-card'
  29. }
  30. const ClassName = {
  31. COLLAPSED: 'collapsed-card'
  32. }
  33. const Default = {
  34. animationSpeed : 'normal',
  35. collapseTrigger: Selector.DATA_COLLAPSE,
  36. removeTrigger : Selector.DATA_REMOVE
  37. }
  38. class Widget {
  39. constructor(element, settings) {
  40. this._element = element
  41. this._parent = element.parents(Selector.CARD).first()
  42. this._settings = $.extend({}, Default, settings)
  43. }
  44. collapse() {
  45. this._parent.children(`${Selector.CARD_BODY}, ${Selector.CARD_FOOTER}`)
  46. .slideUp(this._settings.animationSpeed, () => {
  47. this._parent.addClass(ClassName.COLLAPSED)
  48. })
  49. const collapsed = $.Event(Event.COLLAPSED)
  50. this._element.trigger(collapsed, this._parent)
  51. }
  52. expand() {
  53. this._parent.children(`${Selector.CARD_BODY}, ${Selector.CARD_FOOTER}`)
  54. .slideDown(this._settings.animationSpeed, () => {
  55. this._parent.removeClass(ClassName.COLLAPSED)
  56. })
  57. const expanded = $.Event(Event.EXPANDED)
  58. this._element.trigger(expanded, this._parent)
  59. }
  60. remove() {
  61. this._parent.slideUp()
  62. const removed = $.Event(Event.REMOVED)
  63. this._element.trigger(removed, this._parent)
  64. }
  65. toggle() {
  66. if (this._parent.hasClass(ClassName.COLLAPSED)) {
  67. this.expand()
  68. return
  69. }
  70. this.collapse()
  71. }
  72. // Private
  73. _init(card) {
  74. this._parent = card
  75. $(this).find(this._settings.collapseTrigger).click(() => {
  76. this.toggle()
  77. })
  78. $(this).find(this._settings.removeTrigger).click(() => {
  79. this.remove()
  80. })
  81. }
  82. // Static
  83. static _jQueryInterface(config) {
  84. return this.each(function () {
  85. let data = $(this).data(DATA_KEY)
  86. if (!data) {
  87. data = new Widget($(this), data)
  88. $(this).data(DATA_KEY, typeof config === 'string' ? data : config)
  89. }
  90. if (typeof config === 'string' && config.match(/remove|toggle/)) {
  91. data[config]()
  92. } else if (typeof config === 'object') {
  93. data._init($(this))
  94. }
  95. })
  96. }
  97. }
  98. /**
  99. * Data API
  100. * ====================================================
  101. */
  102. $(document).on('click', Selector.DATA_COLLAPSE, function (event) {
  103. if (event) {
  104. event.preventDefault()
  105. }
  106. Widget._jQueryInterface.call($(this), 'toggle')
  107. })
  108. $(document).on('click', Selector.DATA_REMOVE, function (event) {
  109. if (event) {
  110. event.preventDefault()
  111. }
  112. Widget._jQueryInterface.call($(this), 'remove')
  113. })
  114. /**
  115. * jQuery API
  116. * ====================================================
  117. */
  118. $.fn[NAME] = Widget._jQueryInterface
  119. $.fn[NAME].Constructor = Widget
  120. $.fn[NAME].noConflict = function () {
  121. $.fn[NAME] = JQUERY_NO_CONFLICT
  122. return Widget._jQueryInterface
  123. }
  124. return Widget
  125. })(jQuery)
  126. export default Widget