treeview.ts 3.1 KB

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