push-menu.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. /**
  2. * --------------------------------------------
  3. * AdminLTE pushmenu.ts
  4. * License MIT
  5. * --------------------------------------------
  6. */
  7. import {
  8. windowReady
  9. } from './util/index'
  10. /**
  11. * ------------------------------------------------------------------------
  12. * Constants
  13. * ------------------------------------------------------------------------
  14. */
  15. const CLASS_NAME_SIDEBAR_MINI = 'sidebar-mini'
  16. const CLASS_NAME_SIDEBAR_MINI_HAD = 'sidebar-mini-had'
  17. const CLASS_NAME_SIDEBAR_COLLAPSE = 'sidebar-collapse'
  18. const CLASS_NAME_SIDEBAR_CLOSE = 'sidebar-close'
  19. const CLASS_NAME_SIDEBAR_OPEN = 'sidebar-open'
  20. const CLASS_NAME_SIDEBAR_OPENING = 'sidebar-is-opening'
  21. const CLASS_NAME_SIDEBAR_COLLAPSING = 'sidebar-is-collapsing'
  22. const CLASS_NAME_SIDEBAR_SM = 'sidebar-sm'
  23. const CLASS_NAME_SIDEBAR_HOVER = 'sidebar-hover'
  24. const SELECTOR_SIDEBAR = '.sidebar'
  25. // const SELECTOR_MAIN_SIDEBAR = '.main-sidebar'
  26. // const SELECTOR_CONTENT_WRAPPER = '.content-wrapper'
  27. const SELECTOR_MINI_TOGGLE = '[data-pushmenu="mini"]'
  28. const SELECTOR_FULL_TOGGLE = '[data-pushmenu="full"]'
  29. const SELECTOR_SIDEBAR_SM = `.${CLASS_NAME_SIDEBAR_SM}`
  30. const SELECTOR_CONTENT = '.content'
  31. /**
  32. * Class Definition
  33. * ====================================================
  34. */
  35. class PushMenu {
  36. sidebarOpening(): void {
  37. const bodyClass = document.body.classList
  38. bodyClass.add(CLASS_NAME_SIDEBAR_OPENING)
  39. setTimeout(() => {
  40. bodyClass.remove(CLASS_NAME_SIDEBAR_OPENING)
  41. }, 1000)
  42. }
  43. sidebarColllapsing(): void {
  44. const bodyClass = document.body.classList
  45. bodyClass.add(CLASS_NAME_SIDEBAR_COLLAPSING)
  46. setTimeout(() => {
  47. bodyClass.remove(CLASS_NAME_SIDEBAR_COLLAPSING)
  48. }, 1000)
  49. }
  50. expand(): void {
  51. this.sidebarOpening()
  52. const bodyClass = document.body.classList
  53. bodyClass.remove(CLASS_NAME_SIDEBAR_CLOSE)
  54. bodyClass.remove(CLASS_NAME_SIDEBAR_COLLAPSE)
  55. bodyClass.add(CLASS_NAME_SIDEBAR_OPEN)
  56. }
  57. collapse(): void {
  58. this.sidebarColllapsing()
  59. const bodyClass = document.body.classList
  60. bodyClass.add(CLASS_NAME_SIDEBAR_COLLAPSE)
  61. }
  62. close(): void {
  63. const bodyClass = document.body.classList
  64. bodyClass.add(CLASS_NAME_SIDEBAR_CLOSE)
  65. // if (bodyClass.contains(CLASS_NAME_SIDEBAR_SM)) {
  66. bodyClass.remove(CLASS_NAME_SIDEBAR_OPEN)
  67. // }
  68. }
  69. toggleFull(): void {
  70. const bodyClass = document.body.classList
  71. if (bodyClass.contains(CLASS_NAME_SIDEBAR_CLOSE)) {
  72. this.expand()
  73. } else {
  74. this.close()
  75. }
  76. if (bodyClass.contains(CLASS_NAME_SIDEBAR_MINI)) {
  77. bodyClass.remove(CLASS_NAME_SIDEBAR_MINI)
  78. bodyClass.add(CLASS_NAME_SIDEBAR_MINI_HAD)
  79. }
  80. }
  81. toggleMini(): void {
  82. const bodyClass = document.body.classList
  83. if (bodyClass.contains(CLASS_NAME_SIDEBAR_MINI_HAD)) {
  84. bodyClass.remove(CLASS_NAME_SIDEBAR_MINI_HAD)
  85. bodyClass.add(CLASS_NAME_SIDEBAR_MINI)
  86. }
  87. if (bodyClass.contains(CLASS_NAME_SIDEBAR_COLLAPSE)) {
  88. this.expand()
  89. } else {
  90. this.collapse()
  91. }
  92. }
  93. toggle(state: string): void {
  94. if (state === 'full') {
  95. this.toggleFull()
  96. } else if (state === 'mini') {
  97. this.toggleMini()
  98. }
  99. }
  100. }
  101. /**
  102. * ------------------------------------------------------------------------
  103. * Data Api implementation
  104. * ------------------------------------------------------------------------
  105. */
  106. windowReady(() => {
  107. function addSidebaBreakPoint() {
  108. const widthOutput: number = window.innerWidth
  109. const bodyClass = document.body.classList
  110. if (widthOutput >= 576) {
  111. bodyClass.remove(CLASS_NAME_SIDEBAR_SM)
  112. } else {
  113. bodyClass.add(CLASS_NAME_SIDEBAR_SM)
  114. }
  115. }
  116. addSidebaBreakPoint()
  117. window.addEventListener('resize', addSidebaBreakPoint)
  118. const fullBtn = document.querySelectorAll(SELECTOR_FULL_TOGGLE)
  119. const miniBtn = document.querySelectorAll(SELECTOR_MINI_TOGGLE)
  120. for (const btn of fullBtn) {
  121. btn.addEventListener('click', () => {
  122. const data = new PushMenu()
  123. data.toggle('full')
  124. })
  125. }
  126. for (const btn of miniBtn) {
  127. btn.addEventListener('click', () => {
  128. const data = new PushMenu()
  129. data.toggle('mini')
  130. })
  131. }
  132. const selSidebar = document.querySelector(SELECTOR_SIDEBAR)
  133. selSidebar?.addEventListener('mouseover', () => {
  134. const bodyClass = document.body.classList
  135. bodyClass.add(CLASS_NAME_SIDEBAR_HOVER)
  136. })
  137. selSidebar?.addEventListener('mouseout', () => {
  138. const bodyClass = document.body.classList
  139. bodyClass.remove(CLASS_NAME_SIDEBAR_HOVER)
  140. })
  141. function removeOverlaySidebar() {
  142. const bodyClass = document.body.classList
  143. if (bodyClass.contains(CLASS_NAME_SIDEBAR_SM)) {
  144. bodyClass.remove(CLASS_NAME_SIDEBAR_OPEN)
  145. bodyClass.remove(CLASS_NAME_SIDEBAR_COLLAPSE)
  146. bodyClass.add(CLASS_NAME_SIDEBAR_CLOSE)
  147. }
  148. }
  149. let selSidebarSm = document.querySelector(SELECTOR_SIDEBAR_SM)
  150. let selContentWrapper = selSidebarSm?.querySelector(SELECTOR_CONTENT)
  151. window.addEventListener('resize', () => {
  152. selSidebarSm = document.querySelector(SELECTOR_SIDEBAR_SM)
  153. selContentWrapper = selSidebarSm?.querySelector(SELECTOR_CONTENT)
  154. selContentWrapper?.addEventListener('touchstart', removeOverlaySidebar)
  155. selContentWrapper?.addEventListener('click', removeOverlaySidebar)
  156. })
  157. selContentWrapper?.addEventListener('touchstart', removeOverlaySidebar)
  158. selContentWrapper?.addEventListener('click', removeOverlaySidebar)
  159. window.addEventListener('resize', removeOverlaySidebar)
  160. })
  161. export default PushMenu
  162. //