push-menu.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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 SELECTOR_NAV_SIDEBAR = '.nav-sidebar'
  25. const SELECTOR_NAV_ITEM = '.nav-item'
  26. const SELECTOR_NAV_TREEVIEW = '.nav-treeview'
  27. const SELECTOR_MINI_TOGGLE = '[data-pushmenu="mini"]'
  28. const SELECTOR_FULL_TOGGLE = '[data-pushmenu="full"]'
  29. /**
  30. * Class Definition
  31. * ====================================================
  32. */
  33. class PushMenu {
  34. sidebarOpening(): void {
  35. const bodyClass = document.body.classList
  36. bodyClass.add(CLASS_NAME_SIDEBAR_OPENING)
  37. setTimeout(() => {
  38. bodyClass.remove(CLASS_NAME_SIDEBAR_OPENING)
  39. }, 1000)
  40. }
  41. sidebarColllapsing(): void {
  42. const bodyClass = document.body.classList
  43. bodyClass.add(CLASS_NAME_SIDEBAR_COLLAPSING)
  44. setTimeout(() => {
  45. bodyClass.remove(CLASS_NAME_SIDEBAR_COLLAPSING)
  46. }, 1000)
  47. }
  48. menusClose(): void {
  49. const navTreeview = document.querySelectorAll<HTMLElement>(SELECTOR_NAV_TREEVIEW)
  50. for (const navTree of navTreeview) {
  51. navTree.style.removeProperty('display')
  52. navTree.style.removeProperty('height')
  53. }
  54. const navSidebar = document.querySelector(SELECTOR_NAV_SIDEBAR)
  55. const navItem = navSidebar?.querySelectorAll(SELECTOR_NAV_ITEM)
  56. if (navItem) {
  57. for (const navI of navItem) {
  58. navI.classList.remove(CLASS_NAME_MENU_OPEN)
  59. }
  60. }
  61. }
  62. expand(): void {
  63. this.sidebarOpening()
  64. const bodyClass = document.body.classList
  65. bodyClass.remove(CLASS_NAME_SIDEBAR_CLOSE)
  66. bodyClass.remove(CLASS_NAME_SIDEBAR_COLLAPSE)
  67. bodyClass.add(CLASS_NAME_SIDEBAR_OPEN)
  68. }
  69. collapse(): void {
  70. this.sidebarColllapsing()
  71. const bodyClass = document.body.classList
  72. bodyClass.add(CLASS_NAME_SIDEBAR_COLLAPSE)
  73. }
  74. close(): void {
  75. const bodyClass = document.body.classList
  76. bodyClass.add(CLASS_NAME_SIDEBAR_CLOSE)
  77. bodyClass.remove(CLASS_NAME_SIDEBAR_OPEN)
  78. bodyClass.remove(CLASS_NAME_SIDEBAR_COLLAPSE)
  79. if (bodyClass.contains(CLASS_NAME_SIDEBAR_HORIZONTAL)) {
  80. this.menusClose()
  81. }
  82. }
  83. toggleFull(): void {
  84. const bodyClass = document.body.classList
  85. if (bodyClass.contains(CLASS_NAME_SIDEBAR_CLOSE)) {
  86. this.expand()
  87. } else {
  88. this.close()
  89. }
  90. if (bodyClass.contains(CLASS_NAME_SIDEBAR_MINI)) {
  91. bodyClass.remove(CLASS_NAME_SIDEBAR_MINI)
  92. bodyClass.add(CLASS_NAME_SIDEBAR_MINI_HAD)
  93. }
  94. }
  95. toggleMini(): void {
  96. const bodyClass = document.body.classList
  97. if (bodyClass.contains(CLASS_NAME_SIDEBAR_MINI_HAD)) {
  98. bodyClass.remove(CLASS_NAME_SIDEBAR_MINI_HAD)
  99. bodyClass.add(CLASS_NAME_SIDEBAR_MINI)
  100. }
  101. if (bodyClass.contains(CLASS_NAME_SIDEBAR_COLLAPSE)) {
  102. this.expand()
  103. } else {
  104. this.collapse()
  105. }
  106. }
  107. toggle(state: string): void {
  108. if (state === 'full') {
  109. this.toggleFull()
  110. } else if (state === 'mini') {
  111. this.toggleMini()
  112. }
  113. }
  114. }
  115. /**
  116. * ------------------------------------------------------------------------
  117. * Data Api implementation
  118. * ------------------------------------------------------------------------
  119. */
  120. domReady(() => {
  121. const fullBtn = document.querySelectorAll(SELECTOR_FULL_TOGGLE)
  122. const miniBtn = document.querySelectorAll(SELECTOR_MINI_TOGGLE)
  123. for (const btn of fullBtn) {
  124. btn.addEventListener('click', () => {
  125. const data = new PushMenu()
  126. data.toggle('full')
  127. })
  128. }
  129. for (const btn of miniBtn) {
  130. btn.addEventListener('click', () => {
  131. const data = new PushMenu()
  132. data.toggle('mini')
  133. })
  134. }
  135. })
  136. export default PushMenu
  137. //