You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CardWidget.js 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /**
  2. * --------------------------------------------
  3. * AdminLTE CardWidget.js
  4. * License MIT
  5. * --------------------------------------------
  6. */
  7. import $ from 'jquery'
  8. /**
  9. * Constants
  10. * ====================================================
  11. */
  12. const NAME = 'CardWidget'
  13. const DATA_KEY = 'lte.cardwidget'
  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 EVENT_MAXIMIZED = `maximized${EVENT_KEY}`
  19. const EVENT_MINIMIZED = `minimized${EVENT_KEY}`
  20. const EVENT_REMOVED = `removed${EVENT_KEY}`
  21. const CLASS_NAME_CARD = 'card'
  22. const CLASS_NAME_COLLAPSED = 'collapsed-card'
  23. const CLASS_NAME_COLLAPSING = 'collapsing-card'
  24. const CLASS_NAME_EXPANDING = 'expanding-card'
  25. const CLASS_NAME_WAS_COLLAPSED = 'was-collapsed'
  26. const CLASS_NAME_MAXIMIZED = 'maximized-card'
  27. const SELECTOR_DATA_REMOVE = '[data-card-widget="remove"]'
  28. const SELECTOR_DATA_COLLAPSE = '[data-card-widget="collapse"]'
  29. const SELECTOR_DATA_MAXIMIZE = '[data-card-widget="maximize"]'
  30. const SELECTOR_CARD = `.${CLASS_NAME_CARD}`
  31. const SELECTOR_CARD_HEADER = '.card-header'
  32. const SELECTOR_CARD_BODY = '.card-body'
  33. const SELECTOR_CARD_FOOTER = '.card-footer'
  34. const Default = {
  35. animationSpeed: 'normal',
  36. collapseTrigger: SELECTOR_DATA_COLLAPSE,
  37. removeTrigger: SELECTOR_DATA_REMOVE,
  38. maximizeTrigger: SELECTOR_DATA_MAXIMIZE,
  39. collapseIcon: 'fa-minus',
  40. expandIcon: 'fa-plus',
  41. maximizeIcon: 'fa-expand',
  42. minimizeIcon: 'fa-compress'
  43. }
  44. class CardWidget {
  45. constructor(element, settings) {
  46. this._element = element
  47. this._parent = element.parents(SELECTOR_CARD).first()
  48. if (element.hasClass(CLASS_NAME_CARD)) {
  49. this._parent = element
  50. }
  51. this._settings = $.extend({}, Default, settings)
  52. }
  53. static _jQueryInterface(config) {
  54. let data = $(this).data(DATA_KEY)
  55. const _options = $.extend({}, Default, $(this).data())
  56. if (!data) {
  57. data = new CardWidget($(this), _options)
  58. $(this).data(DATA_KEY, typeof config === 'string' ? data : config)
  59. }
  60. if (typeof config === 'string' && /collapse|expand|remove|toggle|maximize|minimize|toggleMaximize/.test(config)) {
  61. data[config]()
  62. } else if (typeof config === 'object') {
  63. data._init($(this))
  64. }
  65. }
  66. collapse() {
  67. this._parent.addClass(CLASS_NAME_COLLAPSING).children(`${SELECTOR_CARD_BODY}, ${SELECTOR_CARD_FOOTER}`)
  68. .slideUp(this._settings.animationSpeed, () => {
  69. this._parent.addClass(CLASS_NAME_COLLAPSED).removeClass(CLASS_NAME_COLLAPSING)
  70. })
  71. this._parent.find(`> ${SELECTOR_CARD_HEADER} ${this._settings.collapseTrigger} .${this._settings.collapseIcon}`)
  72. .addClass(this._settings.expandIcon)
  73. .removeClass(this._settings.collapseIcon)
  74. this._element.trigger($.Event(EVENT_COLLAPSED), this._parent)
  75. }
  76. expand() {
  77. this._parent.addClass(CLASS_NAME_EXPANDING).children(`${SELECTOR_CARD_BODY}, ${SELECTOR_CARD_FOOTER}`)
  78. .slideDown(this._settings.animationSpeed, () => {
  79. this._parent.removeClass(CLASS_NAME_COLLAPSED).removeClass(CLASS_NAME_EXPANDING)
  80. })
  81. this._parent.find(`> ${SELECTOR_CARD_HEADER} ${this._settings.collapseTrigger} .${this._settings.expandIcon}`)
  82. .addClass(this._settings.collapseIcon)
  83. .removeClass(this._settings.expandIcon)
  84. this._element.trigger($.Event(EVENT_EXPANDED), this._parent)
  85. }
  86. remove() {
  87. this._parent.slideUp()
  88. this._element.trigger($.Event(EVENT_REMOVED), this._parent)
  89. }
  90. toggle() {
  91. if (this._parent.hasClass(CLASS_NAME_COLLAPSED)) {
  92. this.expand()
  93. return
  94. }
  95. this.collapse()
  96. }
  97. maximize() {
  98. this._parent.find(`${this._settings.maximizeTrigger} .${this._settings.maximizeIcon}`)
  99. .addClass(this._settings.minimizeIcon)
  100. .removeClass(this._settings.maximizeIcon)
  101. this._parent.css({
  102. height: this._parent.height(),
  103. width: this._parent.width(),
  104. transition: 'all .15s'
  105. }).delay(150).queue(function () {
  106. const $element = $(this)
  107. $element.addClass(CLASS_NAME_MAXIMIZED)
  108. $('html').addClass(CLASS_NAME_MAXIMIZED)
  109. if ($element.hasClass(CLASS_NAME_COLLAPSED)) {
  110. $element.addClass(CLASS_NAME_WAS_COLLAPSED)
  111. }
  112. $element.dequeue()
  113. })
  114. this._element.trigger($.Event(EVENT_MAXIMIZED), this._parent)
  115. }
  116. minimize() {
  117. this._parent.find(`${this._settings.maximizeTrigger} .${this._settings.minimizeIcon}`)
  118. .addClass(this._settings.maximizeIcon)
  119. .removeClass(this._settings.minimizeIcon)
  120. this._parent.css('cssText', `height: ${this._parent[0].style.height} !important; width: ${this._parent[0].style.width} !important; transition: all .15s;`
  121. ).delay(10).queue(function () {
  122. const $element = $(this)
  123. $element.removeClass(CLASS_NAME_MAXIMIZED)
  124. $('html').removeClass(CLASS_NAME_MAXIMIZED)
  125. $element.css({
  126. height: 'inherit',
  127. width: 'inherit'
  128. })
  129. if ($element.hasClass(CLASS_NAME_WAS_COLLAPSED)) {
  130. $element.removeClass(CLASS_NAME_WAS_COLLAPSED)
  131. }
  132. $element.dequeue()
  133. })
  134. this._element.trigger($.Event(EVENT_MINIMIZED), this._parent)
  135. }
  136. // Private
  137. toggleMaximize() {
  138. if (this._parent.hasClass(CLASS_NAME_MAXIMIZED)) {
  139. this.minimize()
  140. return
  141. }
  142. this.maximize()
  143. }
  144. // Static
  145. _init(card) {
  146. this._parent = card
  147. $(this).find(this._settings.collapseTrigger).click(() => {
  148. this.toggle()
  149. })
  150. $(this).find(this._settings.maximizeTrigger).click(() => {
  151. this.toggleMaximize()
  152. })
  153. $(this).find(this._settings.removeTrigger).click(() => {
  154. this.remove()
  155. })
  156. }
  157. }
  158. /**
  159. * Data API
  160. * ====================================================
  161. */
  162. $(document).on('click', SELECTOR_DATA_COLLAPSE, function (event) {
  163. if (event) {
  164. event.preventDefault()
  165. }
  166. CardWidget._jQueryInterface.call($(this), 'toggle')
  167. })
  168. $(document).on('click', SELECTOR_DATA_REMOVE, function (event) {
  169. if (event) {
  170. event.preventDefault()
  171. }
  172. CardWidget._jQueryInterface.call($(this), 'remove')
  173. })
  174. $(document).on('click', SELECTOR_DATA_MAXIMIZE, function (event) {
  175. if (event) {
  176. event.preventDefault()
  177. }
  178. CardWidget._jQueryInterface.call($(this), 'toggleMaximize')
  179. })
  180. /**
  181. * jQuery API
  182. * ====================================================
  183. */
  184. $.fn[NAME] = CardWidget._jQueryInterface
  185. $.fn[NAME].Constructor = CardWidget
  186. $.fn[NAME].noConflict = function () {
  187. $.fn[NAME] = JQUERY_NO_CONFLICT
  188. return CardWidget._jQueryInterface
  189. }
  190. export default CardWidget