Treeview.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /**
  2. * --------------------------------------------
  3. * AdminLTE Treeview.js
  4. * License MIT
  5. * --------------------------------------------
  6. */
  7. const Treeview = (($) => {
  8. /**
  9. * Constants
  10. * ====================================================
  11. */
  12. const NAME = 'Treeview'
  13. const DATA_KEY = 'lte.treeview'
  14. const EVENT_KEY = `.${DATA_KEY}`
  15. const JQUERY_NO_CONFLICT = $.fn[NAME]
  16. const Event = {
  17. SELECTED : `selected${EVENT_KEY}`,
  18. EXPANDED : `expanded${EVENT_KEY}`,
  19. COLLAPSED : `collapsed${EVENT_KEY}`,
  20. LOAD_DATA_API: `load${EVENT_KEY}`
  21. }
  22. const Selector = {
  23. LI : '.nav-item',
  24. LINK : '.nav-link',
  25. TREEVIEW_MENU: '.nav-treeview',
  26. OPEN : '.menu-open',
  27. DATA_WIDGET : '[data-widget="treeview"]'
  28. }
  29. const ClassName = {
  30. LI : 'nav-item',
  31. LINK : 'nav-link',
  32. TREEVIEW_MENU: 'nav-treeview',
  33. OPEN : 'menu-open'
  34. }
  35. const Default = {
  36. trigger : `${Selector.DATA_WIDGET} ${Selector.LINK}`,
  37. animationSpeed: 300,
  38. accordion : true
  39. }
  40. /**
  41. * Class Definition
  42. * ====================================================
  43. */
  44. class Treeview {
  45. constructor(element, config) {
  46. this._config = config
  47. this._element = element
  48. }
  49. // Public
  50. init() {
  51. this._setupListeners()
  52. }
  53. expand(treeviewMenu, parentLi) {
  54. const expandedEvent = $.Event(Event.EXPANDED)
  55. if (this._config.accordion) {
  56. const openMenuLi = parentLi.siblings(Selector.OPEN).first()
  57. const openTreeview = openMenuLi.find(Selector.TREEVIEW_MENU).first()
  58. this.collapse(openTreeview, openMenuLi)
  59. }
  60. treeviewMenu.slideDown(this._config.animationSpeed, () => {
  61. parentLi.addClass(ClassName.OPEN)
  62. $(this._element).trigger(expandedEvent)
  63. })
  64. }
  65. collapse(treeviewMenu, parentLi) {
  66. const collapsedEvent = $.Event(Event.COLLAPSED)
  67. treeviewMenu.slideUp(this._config.animationSpeed, () => {
  68. parentLi.removeClass(ClassName.OPEN)
  69. $(this._element).trigger(collapsedEvent)
  70. treeviewMenu.find(`${Selector.OPEN} > ${Selector.TREEVIEW_MENU}`).slideUp()
  71. treeviewMenu.find(Selector.OPEN).removeClass(ClassName.OPEN)
  72. })
  73. }
  74. collapseAll() {
  75. }
  76. expandAll() {
  77. }
  78. toggle(event) {
  79. const $relativeTarget = $(event.currentTarget)
  80. const treeviewMenu = $relativeTarget.next()
  81. if (!treeviewMenu.is(Selector.TREEVIEW_MENU)) {
  82. return
  83. }
  84. event.preventDefault()
  85. const parentLi = $relativeTarget.parents(Selector.LI).first()
  86. const isOpen = parentLi.hasClass(ClassName.OPEN)
  87. if (isOpen) {
  88. this.collapse($(treeviewMenu), parentLi)
  89. } else {
  90. this.expand($(treeviewMenu), parentLi)
  91. }
  92. }
  93. // Private
  94. _setupListeners() {
  95. $(document).on('click', this._config.trigger, (event) => {
  96. this.toggle(event)
  97. })
  98. }
  99. // Static
  100. static _jQueryInterface(config) {
  101. return this.each(function () {
  102. let data = $(this).data(DATA_KEY)
  103. const _config = $.extend({}, Default, $(this).data())
  104. if (!data) {
  105. data = new Treeview($(this), _config)
  106. $(this).data(DATA_KEY, data)
  107. }
  108. if (config === 'init') {
  109. data[config]()
  110. }
  111. })
  112. }
  113. }
  114. /**
  115. * Data API
  116. * ====================================================
  117. */
  118. $(window).on(Event.LOAD_DATA_API, () => {
  119. $(Selector.DATA_WIDGET).each(function () {
  120. const $treeview = $(this)
  121. Treeview._jQueryInterface.call($treeview, 'init')
  122. })
  123. })
  124. /**
  125. * jQuery API
  126. * ====================================================
  127. */
  128. $.fn[NAME] = Treeview._jQueryInterface
  129. $.fn[NAME].Constructor = Treeview
  130. $.fn[NAME].noConflict = function () {
  131. $.fn[NAME] = JQUERY_NO_CONFLICT
  132. return Treeview._jQueryInterface
  133. }
  134. return Treeview
  135. })(jQuery)
  136. export default Treeview