CardWidget.js 6.9 KB

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