PushMenu.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /* PushMenu()
  2. * ==========
  3. * Adds the push menu functionality to the sidebar.
  4. *
  5. * @type Function
  6. * @usage: $('.btn').pushMenu(options)
  7. * or add [data-toggle="offcanvas"] to any toggle button
  8. * Pass any option as data-option="value"
  9. */
  10. +function ($) {
  11. 'use strict'
  12. var DataKey = 'lte.pushmenu'
  13. var Default = {
  14. collapseScreenSize : 767,
  15. expandOnHover : false,
  16. expandTransitionDelay: 200
  17. }
  18. var Selector = {
  19. collapsed : '.sidebar-collapse',
  20. open : '.sidebar-open',
  21. mainSidebar : '.main-sidebar',
  22. contentWrapper: '.content-wrapper',
  23. searchInput : '.sidebar-form .form-control',
  24. button : '[data-toggle="offcanvas"]',
  25. mini : '.sidebar-mini',
  26. expanded : '.sidebar-expanded-on-hover',
  27. layoutFixed : '.fixed'
  28. }
  29. var ClassName = {
  30. collapsed : 'sidebar-collapse',
  31. open : 'sidebar-open',
  32. mini : 'sidebar-mini',
  33. expanded : 'sidebar-expanded-on-hover',
  34. expandFeature: 'sidebar-mini-expand-feature',
  35. layoutFixed : 'fixed'
  36. }
  37. var Event = {
  38. expanded : 'expanded.pushMenu',
  39. collapsed: 'collapsed.pushMenu'
  40. }
  41. // PushMenu Class Definition
  42. // =========================
  43. var PushMenu = function (options) {
  44. this.options = options
  45. this.init()
  46. }
  47. PushMenu.prototype.init = function () {
  48. if (this.options.expandOnHover
  49. || ($('body').is(Selector.mini + Selector.layoutFixed))) {
  50. this.expandOnHover()
  51. $('body').addClass(ClassName.expandFeature)
  52. }
  53. $(Selector.contentWrapper).click(function () {
  54. // Enable hide menu when clicking on the content-wrapper on small screens
  55. if ($(window).width() <= this.options.collapseScreenSize && $('body').hasClass(ClassName.open)) {
  56. this.close()
  57. }
  58. }.bind(this))
  59. // __Fix for android devices
  60. $(Selector.searchInput).click(function (e) {
  61. e.stopPropagation()
  62. })
  63. }
  64. PushMenu.prototype.toggle = function () {
  65. var windowWidth = $(window).width()
  66. var isOpen = !$('body').hasClass(ClassName.collapsed)
  67. if (windowWidth <= this.options.collapseScreenSize) {
  68. isOpen = $('body').hasClass(ClassName.open)
  69. }
  70. if (!isOpen) {
  71. this.open()
  72. } else {
  73. this.close()
  74. }
  75. }
  76. PushMenu.prototype.open = function () {
  77. var windowWidth = $(window).width()
  78. if (windowWidth > this.options.collapseScreenSize) {
  79. $('body').removeClass(ClassName.collapsed)
  80. .trigger($.Event(Event.expanded))
  81. }
  82. else {
  83. $('body').addClass(ClassName.open)
  84. .trigger($.Event(Event.expanded))
  85. }
  86. }
  87. PushMenu.prototype.close = function () {
  88. var windowWidth = $(window).width()
  89. if (windowWidth > this.options.collapseScreenSize) {
  90. $('body').addClass(ClassName.collapsed)
  91. .trigger($.Event(Event.collapsed))
  92. } else {
  93. $('body').removeClass(ClassName.open + ' ' + ClassName.collapsed)
  94. .trigger($.Event(Event.collapsed))
  95. }
  96. }
  97. PushMenu.prototype.expandOnHover = function () {
  98. $(Selector.mainSidebar).hover(function () {
  99. if ($('body').is(Selector.mini + Selector.collapsed)
  100. && $(window).width() > this.options.collapseScreenSize) {
  101. this.expand()
  102. }
  103. }.bind(this), function () {
  104. if ($('body').is(Selector.expanded)) {
  105. this.collapse()
  106. }
  107. }.bind(this))
  108. }
  109. PushMenu.prototype.expand = function () {
  110. setTimeout(function () {
  111. $('body').removeClass(ClassName.collapsed)
  112. .addClass(ClassName.expanded)
  113. }, this.options.expandTransitionDelay)
  114. }
  115. PushMenu.prototype.collapse = function () {
  116. setTimeout(function () {
  117. $('body').removeClass(ClassName.expanded)
  118. .addClass(ClassName.collapsed)
  119. }, this.options.expandTransitionDelay)
  120. }
  121. // PushMenu Plugin Definition
  122. // ==========================
  123. function Plugin(option) {
  124. return this.each(function () {
  125. var $this = $(this)
  126. var data = $this.data(DataKey)
  127. if (!data) {
  128. var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option)
  129. $this.data(DataKey, (data = new PushMenu(options)))
  130. }
  131. if (option == 'toggle') data.toggle()
  132. })
  133. }
  134. var old = $.fn.pushMenu
  135. $.fn.pushMenu = Plugin
  136. $.fn.pushMenu.Constructor = PushMenu
  137. // No Conflict Mode
  138. // ================
  139. $.fn.pushMenu.noConflict = function () {
  140. $.fn.pushMenu = old
  141. return this
  142. }
  143. // Data API
  144. // ========
  145. $(document).on('click', Selector.button, function (e) {
  146. e.preventDefault()
  147. Plugin.call($(this), 'toggle')
  148. })
  149. $(window).on('load', function () {
  150. Plugin.call($(Selector.button), {})
  151. })
  152. }(jQuery)