treeview.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /**
  2. * --------------------------------------------
  3. * AdminLTE treeview.ts
  4. * License MIT
  5. * --------------------------------------------
  6. */
  7. import {
  8. domReady
  9. } from './util/index'
  10. /**
  11. * ------------------------------------------------------------------------
  12. * Constants
  13. * ------------------------------------------------------------------------
  14. */
  15. const CLASS_NAME_MENU_OPEN = 'menu-open'
  16. const SELECTOR_NAV_ITEM = '.nav-item'
  17. const SELECTOR_DATA_TOGGLE = '[data-widget="treeview"]'
  18. const Defaults = {
  19. transitionDuration: 300,
  20. transitionTimingFuntion: 'linear'
  21. }
  22. /**
  23. * Class Definition
  24. * ====================================================
  25. */
  26. class Treeview {
  27. open(navItem: Element | null, childNavItem: HTMLElement | null | undefined): void {
  28. navItem?.classList.add(CLASS_NAME_MENU_OPEN)
  29. const height: number = childNavItem?.scrollHeight ?? 0
  30. childNavItem?.style.setProperty('overflow', 'hidden')
  31. childNavItem?.style.setProperty('height', '0px')
  32. setTimeout(() => {
  33. childNavItem?.style.setProperty('height', `${height}px`)
  34. }, 1)
  35. setTimeout(() => {
  36. childNavItem?.style.removeProperty('overflow')
  37. childNavItem?.style.setProperty('height', 'auto')
  38. childNavItem?.style.removeProperty('height')
  39. }, Defaults.transitionDuration)
  40. }
  41. close(navItem: Element, childNavItem: HTMLElement | null | undefined): void {
  42. const height: number = childNavItem?.scrollHeight ?? 0
  43. childNavItem?.style.setProperty('overflow', 'hidden')
  44. childNavItem?.style.setProperty('height', `${height}px`)
  45. setTimeout(() => {
  46. childNavItem?.style.setProperty('height', '0px')
  47. }, 1)
  48. setTimeout(() => {
  49. childNavItem?.style.removeProperty('overflow')
  50. childNavItem?.style.removeProperty('height')
  51. navItem.classList.remove(CLASS_NAME_MENU_OPEN)
  52. }, Defaults.transitionDuration)
  53. }
  54. toggle(treeviewMenu: Element): void {
  55. const navItem: HTMLElement | null = treeviewMenu.closest(SELECTOR_NAV_ITEM)
  56. const childNavItem: HTMLElement | null | undefined = navItem?.querySelector('.nav-treeview')
  57. childNavItem?.style.setProperty('transition', `height ${Defaults.transitionDuration}ms ${Defaults.transitionTimingFuntion}`)
  58. setTimeout(() => {
  59. if (navItem?.classList.contains(CLASS_NAME_MENU_OPEN)) {
  60. this.close(navItem, childNavItem)
  61. } else {
  62. this.open(navItem, childNavItem)
  63. }
  64. }, 1)
  65. }
  66. }
  67. /**
  68. * ------------------------------------------------------------------------
  69. * Data Api implementation
  70. * ------------------------------------------------------------------------
  71. */
  72. domReady(() => {
  73. const button = document.querySelectorAll(SELECTOR_DATA_TOGGLE)
  74. for (const btn of button) {
  75. btn.addEventListener('click', event => {
  76. event.preventDefault()
  77. const treeviewMenu = event.target as Element
  78. const data = new Treeview()
  79. data.toggle(treeviewMenu)
  80. })
  81. }
  82. })
  83. export default Treeview
  84. //