push-menu.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /**
  2. * --------------------------------------------
  3. * AdminLTE pushmenu.ts
  4. * License MIT
  5. * --------------------------------------------
  6. */
  7. import {
  8. domReady
  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_HORIZONTAL = 'sidebar-horizontal'
  18. const CLASS_NAME_SIDEBAR_COLLAPSE = 'sidebar-collapse'
  19. const CLASS_NAME_SIDEBAR_CLOSE = 'sidebar-close'
  20. const CLASS_NAME_SIDEBAR_OPEN = 'sidebar-open'
  21. const CLASS_NAME_SIDEBAR_OPENING = 'sidebar-is-opening'
  22. const CLASS_NAME_SIDEBAR_COLLAPSING = 'sidebar-is-collapsing'
  23. const CLASS_NAME_MENU_OPEN = 'menu-open'
  24. const CLASS_NAME_HEADER_MOBILE_OPEN = 'header-mobile-open'
  25. const SELECTOR_NAV_SIDEBAR = '.nav-sidebar'
  26. const SELECTOR_NAV_ITEM = '.nav-item'
  27. const SELECTOR_NAV_TREEVIEW = '.nav-treeview'
  28. const SELECTOR_MINI_TOGGLE = '[data-pushmenu="mini"]'
  29. const SELECTOR_FULL_TOGGLE = '[data-pushmenu="full"]'
  30. const SELECTOR_FULL_HEADER = '[data-pushmenu="header"]'
  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. menusClose(): void {
  51. const navTreeview = document.querySelectorAll<HTMLElement>(SELECTOR_NAV_TREEVIEW)
  52. for (const navTree of navTreeview) {
  53. navTree.style.removeProperty('display')
  54. navTree.style.removeProperty('height')
  55. }
  56. const navSidebar = document.querySelector(SELECTOR_NAV_SIDEBAR)
  57. const navItem = navSidebar?.querySelectorAll(SELECTOR_NAV_ITEM)
  58. if (navItem) {
  59. for (const navI of navItem) {
  60. navI.classList.remove(CLASS_NAME_MENU_OPEN)
  61. }
  62. }
  63. }
  64. expand(): void {
  65. this.sidebarOpening()
  66. const bodyClass = document.body.classList
  67. bodyClass.remove(CLASS_NAME_SIDEBAR_CLOSE)
  68. bodyClass.remove(CLASS_NAME_SIDEBAR_COLLAPSE)
  69. bodyClass.add(CLASS_NAME_SIDEBAR_OPEN)
  70. }
  71. collapse(): void {
  72. this.sidebarColllapsing()
  73. const bodyClass = document.body.classList
  74. bodyClass.add(CLASS_NAME_SIDEBAR_COLLAPSE)
  75. }
  76. close(): void {
  77. const bodyClass = document.body.classList
  78. bodyClass.add(CLASS_NAME_SIDEBAR_CLOSE)
  79. bodyClass.remove(CLASS_NAME_SIDEBAR_OPEN)
  80. bodyClass.remove(CLASS_NAME_SIDEBAR_COLLAPSE)
  81. if (bodyClass.contains(CLASS_NAME_SIDEBAR_HORIZONTAL)) {
  82. this.menusClose()
  83. }
  84. }
  85. toggleFull(): void {
  86. const bodyClass = document.body.classList
  87. if (bodyClass.contains(CLASS_NAME_SIDEBAR_CLOSE)) {
  88. this.expand()
  89. } else {
  90. this.close()
  91. }
  92. if (bodyClass.contains(CLASS_NAME_SIDEBAR_MINI)) {
  93. bodyClass.remove(CLASS_NAME_SIDEBAR_MINI)
  94. bodyClass.add(CLASS_NAME_SIDEBAR_MINI_HAD)
  95. }
  96. }
  97. toggleMini(): void {
  98. const bodyClass = document.body.classList
  99. if (bodyClass.contains(CLASS_NAME_SIDEBAR_MINI_HAD)) {
  100. bodyClass.remove(CLASS_NAME_SIDEBAR_MINI_HAD)
  101. bodyClass.add(CLASS_NAME_SIDEBAR_MINI)
  102. }
  103. if (bodyClass.contains(CLASS_NAME_SIDEBAR_COLLAPSE)) {
  104. this.expand()
  105. } else {
  106. this.collapse()
  107. }
  108. }
  109. toggleHeader(): void {
  110. this.close()
  111. const bodyClass = document.body.classList
  112. if (bodyClass.contains(CLASS_NAME_HEADER_MOBILE_OPEN)) {
  113. bodyClass.remove(CLASS_NAME_HEADER_MOBILE_OPEN)
  114. } else {
  115. bodyClass.add(CLASS_NAME_HEADER_MOBILE_OPEN)
  116. }
  117. }
  118. toggle(state: string): void {
  119. switch (state) {
  120. case 'full': {
  121. this.toggleFull()
  122. break
  123. }
  124. case 'mini': {
  125. this.toggleMini()
  126. break
  127. }
  128. case 'header': {
  129. this.toggleHeader()
  130. break
  131. }
  132. // No default
  133. }
  134. }
  135. }
  136. /**
  137. * ------------------------------------------------------------------------
  138. * Data Api implementation
  139. * ------------------------------------------------------------------------
  140. */
  141. domReady(() => {
  142. const fullBtn = document.querySelectorAll(SELECTOR_FULL_TOGGLE)
  143. const miniBtn = document.querySelectorAll(SELECTOR_MINI_TOGGLE)
  144. const headerBtn = document.querySelectorAll(SELECTOR_FULL_HEADER)
  145. for (const btn of fullBtn) {
  146. btn.addEventListener('click', () => {
  147. const data = new PushMenu()
  148. data.toggle('full')
  149. })
  150. }
  151. for (const btn of miniBtn) {
  152. btn.addEventListener('click', () => {
  153. const data = new PushMenu()
  154. data.toggle('mini')
  155. })
  156. }
  157. for (const btn of headerBtn) {
  158. btn.addEventListener('click', () => {
  159. const data = new PushMenu()
  160. data.toggle('header')
  161. })
  162. }
  163. })
  164. export default PushMenu
  165. //