PushMenu.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /**
  2. * --------------------------------------------
  3. * AdminLTE PushMenu.js
  4. * License MIT
  5. * --------------------------------------------
  6. */
  7. const PushMenu = (($) => {
  8. /**
  9. * Constants
  10. * ====================================================
  11. */
  12. const NAME = 'PushMenu'
  13. const DATA_KEY = 'lte.pushmenu'
  14. const EVENT_KEY = `.${DATA_KEY}`
  15. const JQUERY_NO_CONFLICT = $.fn[NAME]
  16. const Event = {
  17. COLLAPSED: `collapsed${EVENT_KEY}`,
  18. SHOWN: `shown${EVENT_KEY}`
  19. }
  20. const Default = {
  21. autoCollapseSize: 992,
  22. enableRemember: false,
  23. noTransitionAfterReload: true
  24. }
  25. const Selector = {
  26. TOGGLE_BUTTON: '[data-widget="pushmenu"]',
  27. SIDEBAR_MINI: '.sidebar-mini',
  28. SIDEBAR_COLLAPSED: '.sidebar-collapse',
  29. BODY: 'body',
  30. OVERLAY: '#sidebar-overlay',
  31. WRAPPER: '.wrapper'
  32. }
  33. const ClassName = {
  34. SIDEBAR_OPEN: 'sidebar-open',
  35. COLLAPSED: 'sidebar-collapse',
  36. OPEN: 'sidebar-open'
  37. }
  38. /**
  39. * Class Definition
  40. * ====================================================
  41. */
  42. class PushMenu {
  43. constructor(element, options) {
  44. this._element = element
  45. this._options = $.extend({}, Default, options)
  46. if (!$(Selector.OVERLAY).length) {
  47. this._addOverlay()
  48. }
  49. this._init()
  50. }
  51. // Public
  52. show() {
  53. if (this._options.autoCollapseSize) {
  54. if ($(window).width() <= this._options.autoCollapseSize) {
  55. $(Selector.BODY).addClass(ClassName.OPEN)
  56. }
  57. }
  58. $(Selector.BODY).removeClass(ClassName.COLLAPSED)
  59. if(this._options.enableRemember) {
  60. localStorage.setItem(`remember${EVENT_KEY}`, ClassName.OPEN)
  61. }
  62. const shownEvent = $.Event(Event.SHOWN)
  63. $(this._element).trigger(shownEvent)
  64. }
  65. collapse() {
  66. if (this._options.autoCollapseSize) {
  67. if ($(window).width() <= this._options.autoCollapseSize) {
  68. $(Selector.BODY).removeClass(ClassName.OPEN)
  69. }
  70. }
  71. $(Selector.BODY).addClass(ClassName.COLLAPSED)
  72. if(this._options.enableRemember) {
  73. localStorage.setItem(`remember${EVENT_KEY}`, ClassName.COLLAPSED)
  74. }
  75. const collapsedEvent = $.Event(Event.COLLAPSED)
  76. $(this._element).trigger(collapsedEvent)
  77. }
  78. toggle() {
  79. if (!$(Selector.BODY).hasClass(ClassName.COLLAPSED )) {
  80. this.collapse()
  81. } else {
  82. this.show()
  83. }
  84. }
  85. autoCollapse(resize = false) {
  86. if (this._options.autoCollapseSize) {
  87. if ($(window).width() <= this._options.autoCollapseSize) {
  88. if (!$(Selector.BODY).hasClass(ClassName.OPEN)) {
  89. this.collapse()
  90. }
  91. } else if (resize == true) {
  92. if ($(Selector.BODY).hasClass(ClassName.OPEN)) {
  93. $(Selector.BODY).removeClass(ClassName.OPEN)
  94. }
  95. }
  96. }
  97. }
  98. remember() {
  99. if(this._options.enableRemember) {
  100. let toggleState = localStorage.getItem(`remember${EVENT_KEY}`)
  101. if (toggleState == ClassName.COLLAPSED){
  102. if (this._options.noTransitionAfterReload) {
  103. $("body").addClass('hold-transition').addClass(ClassName.COLLAPSED).delay(50).queue(function() {
  104. $(this).removeClass('hold-transition')
  105. $(this).dequeue()
  106. })
  107. } else {
  108. $("body").addClass(ClassName.COLLAPSED)
  109. }
  110. } else {
  111. if (this._options.noTransitionAfterReload) {
  112. $("body").addClass('hold-transition').removeClass(ClassName.COLLAPSED).delay(50).queue(function() {
  113. $(this).removeClass('hold-transition')
  114. $(this).dequeue()
  115. })
  116. } else {
  117. $("body").removeClass(ClassName.COLLAPSED)
  118. }
  119. }
  120. }
  121. }
  122. // Private
  123. _init() {
  124. this.remember()
  125. this.autoCollapse()
  126. $(window).resize(() => {
  127. this.autoCollapse(true)
  128. })
  129. }
  130. _addOverlay() {
  131. const overlay = $('<div />', {
  132. id: 'sidebar-overlay'
  133. })
  134. overlay.on('click', () => {
  135. this.collapse()
  136. })
  137. $(Selector.WRAPPER).append(overlay)
  138. }
  139. // Static
  140. static _jQueryInterface(operation) {
  141. return this.each(function () {
  142. let data = $(this).data(DATA_KEY)
  143. const _options = $.extend({}, Default, $(this).data())
  144. if (!data) {
  145. data = new PushMenu(this, _options)
  146. $(this).data(DATA_KEY, data)
  147. }
  148. if (operation === 'toggle') {
  149. data[operation]()
  150. }
  151. })
  152. }
  153. }
  154. /**
  155. * Data API
  156. * ====================================================
  157. */
  158. $(document).on('click', Selector.TOGGLE_BUTTON, (event) => {
  159. event.preventDefault()
  160. let button = event.currentTarget
  161. if ($(button).data('widget') !== 'pushmenu') {
  162. button = $(button).closest(Selector.TOGGLE_BUTTON)
  163. }
  164. PushMenu._jQueryInterface.call($(button), 'toggle')
  165. })
  166. $(window).on('load', () => {
  167. PushMenu._jQueryInterface.call($(Selector.TOGGLE_BUTTON))
  168. })
  169. /**
  170. * jQuery API
  171. * ====================================================
  172. */
  173. $.fn[NAME] = PushMenu._jQueryInterface
  174. $.fn[NAME].Constructor = PushMenu
  175. $.fn[NAME].noConflict = function () {
  176. $.fn[NAME] = JQUERY_NO_CONFLICT
  177. return PushMenu._jQueryInterface
  178. }
  179. return PushMenu
  180. })(jQuery)
  181. export default PushMenu