CardWidget.js 6.3 KB

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