PushMenu.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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. screenCollapseSize: 768
  22. }
  23. const Selector = {
  24. TOGGLE_BUTTON : '[data-widget="pushmenu"]',
  25. SIDEBAR_MINI : '.sidebar-mini',
  26. SIDEBAR_COLLAPSED: '.sidebar-collapse',
  27. BODY : 'body',
  28. OVERLAY : '#sidebar-overlay',
  29. WRAPPER : '.wrapper'
  30. }
  31. const ClassName = {
  32. SIDEBAR_OPEN: 'sidebar-open',
  33. COLLAPSED : 'sidebar-collapse',
  34. OPEN : 'sidebar-open',
  35. SIDEBAR_MINI: 'sidebar-mini'
  36. }
  37. /**
  38. * Class Definition
  39. * ====================================================
  40. */
  41. class PushMenu {
  42. constructor(element, options) {
  43. this._element = element
  44. this._options = $.extend({}, Default, options)
  45. if (!$(Selector.OVERLAY).length) {
  46. this._addOverlay()
  47. }
  48. }
  49. // Public
  50. show() {
  51. $(Selector.BODY).addClass(ClassName.OPEN).removeClass(ClassName.COLLAPSED)
  52. const shownEvent = $.Event(Event.SHOWN)
  53. $(this._element).trigger(shownEvent)
  54. }
  55. collapse() {
  56. $(Selector.BODY).removeClass(ClassName.OPEN).addClass(ClassName.COLLAPSED)
  57. const collapsedEvent = $.Event(Event.COLLAPSED)
  58. $(this._element).trigger(collapsedEvent)
  59. }
  60. toggle() {
  61. let isShown
  62. if ($(window).width() >= this._options.screenCollapseSize) {
  63. isShown = !$(Selector.BODY).hasClass(ClassName.COLLAPSED)
  64. } else {
  65. isShown = $(Selector.BODY).hasClass(ClassName.OPEN)
  66. }
  67. if (isShown) {
  68. this.collapse()
  69. } else {
  70. this.show()
  71. }
  72. }
  73. // Private
  74. _addOverlay() {
  75. const overlay = $('<div />', {
  76. id: 'sidebar-overlay'
  77. })
  78. overlay.on('click', () => {
  79. this.collapse()
  80. })
  81. $(Selector.WRAPPER).append(overlay)
  82. }
  83. // Static
  84. static _jQueryInterface(operation) {
  85. return this.each(function () {
  86. let data = $(this).data(DATA_KEY)
  87. const _options = $.extend({}, Default, $(this).data())
  88. if (!data) {
  89. data = new PushMenu(this, _options)
  90. $(this).data(DATA_KEY, data)
  91. }
  92. if (operation) {
  93. data[operation]()
  94. }
  95. })
  96. }
  97. }
  98. /**
  99. * Data API
  100. * ====================================================
  101. */
  102. $(document).on('click', Selector.TOGGLE_BUTTON, (event) => {
  103. event.preventDefault()
  104. let button = event.currentTarget
  105. if ($(button).data('widget') !== 'pushmenu') {
  106. button = $(button).closest(Selector.TOGGLE_BUTTON)
  107. }
  108. PushMenu._jQueryInterface.call($(button), 'toggle')
  109. })
  110. /**
  111. * jQuery API
  112. * ====================================================
  113. */
  114. $.fn[NAME] = PushMenu._jQueryInterface
  115. $.fn[NAME].Constructor = PushMenu
  116. $.fn[NAME].noConflict = function () {
  117. $.fn[NAME] = JQUERY_NO_CONFLICT
  118. return PushMenu._jQueryInterface
  119. }
  120. return PushMenu
  121. })(jQuery)
  122. export default PushMenu