treeview.ts 3.1 KB

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