Widget.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. COLLAPSE_ICON : '.fa-minus',
  30. EXPAND_ICON : '.fa-plus'
  31. }
  32. const ClassName = {
  33. COLLAPSED : 'collapsed-card',
  34. COLLAPSE_ICON : 'fa-minus',
  35. EXPAND_ICON : 'fa-plus'
  36. }
  37. const Default = {
  38. animationSpeed : 'normal',
  39. collapseTrigger: Selector.DATA_COLLAPSE,
  40. removeTrigger : Selector.DATA_REMOVE
  41. }
  42. class Widget {
  43. constructor(element, settings) {
  44. this._element = element
  45. this._parent = element.parents(Selector.CARD).first()
  46. this._settings = $.extend({}, Default, settings)
  47. }
  48. collapse() {
  49. this._parent.children(`${Selector.CARD_BODY}, ${Selector.CARD_FOOTER}`)
  50. .slideUp(this._settings.animationSpeed, () => {
  51. this._parent.addClass(ClassName.COLLAPSED)
  52. })
  53. this._element.children(Selector.COLLAPSE_ICON)
  54. .addClass(ClassName.EXPAND_ICON)
  55. .removeClass(ClassName.COLLAPSE_ICON)
  56. const collapsed = $.Event(Event.COLLAPSED)
  57. this._element.trigger(collapsed, this._parent)
  58. }
  59. expand() {
  60. this._parent.children(`${Selector.CARD_BODY}, ${Selector.CARD_FOOTER}`)
  61. .slideDown(this._settings.animationSpeed, () => {
  62. this._parent.removeClass(ClassName.COLLAPSED)
  63. })
  64. this._element.children(Selector.EXPAND_ICON)
  65. .addClass(ClassName.COLLAPSE_ICON)
  66. .removeClass(ClassName.EXPAND_ICON)
  67. const expanded = $.Event(Event.EXPANDED)
  68. this._element.trigger(expanded, this._parent)
  69. }
  70. remove() {
  71. this._parent.slideUp()
  72. const removed = $.Event(Event.REMOVED)
  73. this._element.trigger(removed, this._parent)
  74. }
  75. toggle() {
  76. if (this._parent.hasClass(ClassName.COLLAPSED)) {
  77. this.expand()
  78. return
  79. }
  80. this.collapse()
  81. }
  82. // Private
  83. _init(card) {
  84. this._parent = card
  85. $(this).find(this._settings.collapseTrigger).click(() => {
  86. this.toggle()
  87. })
  88. $(this).find(this._settings.removeTrigger).click(() => {
  89. this.remove()
  90. })
  91. }
  92. // Static
  93. static _jQueryInterface(config) {
  94. return this.each(function () {
  95. let data = $(this).data(DATA_KEY)
  96. if (!data) {
  97. data = new Widget($(this), data)
  98. $(this).data(DATA_KEY, typeof config === 'string' ? data : config)
  99. }
  100. if (typeof config === 'string' && config.match(/remove|toggle/)) {
  101. data[config]()
  102. } else if (typeof config === 'object') {
  103. data._init($(this))
  104. }
  105. })
  106. }
  107. }
  108. /**
  109. * Data API
  110. * ====================================================
  111. */
  112. $(document).on('click', Selector.DATA_COLLAPSE, function (event) {
  113. if (event) {
  114. event.preventDefault()
  115. }
  116. Widget._jQueryInterface.call($(this), 'toggle')
  117. })
  118. $(document).on('click', Selector.DATA_REMOVE, function (event) {
  119. if (event) {
  120. event.preventDefault()
  121. }
  122. Widget._jQueryInterface.call($(this), 'remove')
  123. })
  124. /**
  125. * jQuery API
  126. * ====================================================
  127. */
  128. $.fn[NAME] = Widget._jQueryInterface
  129. $.fn[NAME].Constructor = Widget
  130. $.fn[NAME].noConflict = function () {
  131. $.fn[NAME] = JQUERY_NO_CONFLICT
  132. return Widget._jQueryInterface
  133. }
  134. return Widget
  135. })(jQuery)
  136. export default Widget