Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /**
  2. * --------------------------------------------
  3. * AdminLTE Treeview.js
  4. * License MIT
  5. * --------------------------------------------
  6. */
  7. import $ from 'jquery'
  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_EXPANDED = `expanded${EVENT_KEY}`
  17. const EVENT_COLLAPSED = `collapsed${EVENT_KEY}`
  18. const EVENT_LOAD_DATA_API = `load${EVENT_KEY}`
  19. const SELECTOR_LI = '.nav-item'
  20. const SELECTOR_LINK = '.nav-link'
  21. const SELECTOR_TREEVIEW_MENU = '.nav-treeview'
  22. const SELECTOR_OPEN = '.menu-open'
  23. const SELECTOR_DATA_WIDGET = '[data-widget="treeview"]'
  24. const CLASS_NAME_OPEN = 'menu-open'
  25. const CLASS_NAME_IS_OPENING = 'menu-is-opening'
  26. const CLASS_NAME_SIDEBAR_COLLAPSED = 'sidebar-collapse'
  27. const Default = {
  28. trigger: `${SELECTOR_DATA_WIDGET} ${SELECTOR_LINK}`,
  29. animationSpeed: 300,
  30. accordion: true,
  31. expandSidebar: false,
  32. sidebarButtonSelector: '[data-widget="pushmenu"]'
  33. }
  34. /**
  35. * Class Definition
  36. * ====================================================
  37. */
  38. class Treeview {
  39. constructor(element, config) {
  40. this._config = config
  41. this._element = element
  42. }
  43. // Public
  44. static _jQueryInterface(config) {
  45. return this.each(function () {
  46. let data = $(this).data(DATA_KEY)
  47. const _options = $.extend({}, Default, $(this).data())
  48. if (!data) {
  49. data = new Treeview($(this), _options)
  50. $(this).data(DATA_KEY, data)
  51. }
  52. if (config === 'init') {
  53. data[config]()
  54. }
  55. })
  56. }
  57. init() {
  58. $(`${SELECTOR_LI}${SELECTOR_OPEN} ${SELECTOR_TREEVIEW_MENU}${SELECTOR_OPEN}`).css('display', 'block')
  59. this._setupListeners()
  60. }
  61. expand(treeviewMenu, parentLi) {
  62. const expandedEvent = $.Event(EVENT_EXPANDED)
  63. if (this._config.accordion) {
  64. const openMenuLi = parentLi.siblings(SELECTOR_OPEN).first()
  65. const openTreeview = openMenuLi.find(SELECTOR_TREEVIEW_MENU).first()
  66. this.collapse(openTreeview, openMenuLi)
  67. }
  68. parentLi.addClass(CLASS_NAME_IS_OPENING)
  69. treeviewMenu.stop().slideDown(this._config.animationSpeed, () => {
  70. parentLi.addClass(CLASS_NAME_OPEN)
  71. $(this._element).trigger(expandedEvent)
  72. })
  73. if (this._config.expandSidebar) {
  74. this._expandSidebar()
  75. }
  76. }
  77. collapse(treeviewMenu, parentLi) {
  78. const collapsedEvent = $.Event(EVENT_COLLAPSED)
  79. parentLi.removeClass(`${CLASS_NAME_IS_OPENING} ${CLASS_NAME_OPEN}`)
  80. treeviewMenu.stop().slideUp(this._config.animationSpeed, () => {
  81. $(this._element).trigger(collapsedEvent)
  82. treeviewMenu.find(`${SELECTOR_OPEN} > ${SELECTOR_TREEVIEW_MENU}`).slideUp()
  83. treeviewMenu.find(SELECTOR_OPEN).removeClass(CLASS_NAME_OPEN)
  84. })
  85. }
  86. // Private
  87. toggle(event) {
  88. const $relativeTarget = $(event.currentTarget)
  89. const $parent = $relativeTarget.parent()
  90. let treeviewMenu = $parent.find(`> ${SELECTOR_TREEVIEW_MENU}`)
  91. if (!treeviewMenu.is(SELECTOR_TREEVIEW_MENU)) {
  92. if (!$parent.is(SELECTOR_LI)) {
  93. treeviewMenu = $parent.parent().find(`> ${SELECTOR_TREEVIEW_MENU}`)
  94. }
  95. if (!treeviewMenu.is(SELECTOR_TREEVIEW_MENU)) {
  96. return
  97. }
  98. }
  99. event.preventDefault()
  100. const parentLi = $relativeTarget.parents(SELECTOR_LI).first()
  101. const isOpen = parentLi.hasClass(CLASS_NAME_OPEN)
  102. if (isOpen) {
  103. this.collapse($(treeviewMenu), parentLi)
  104. } else {
  105. this.expand($(treeviewMenu), parentLi)
  106. }
  107. }
  108. _setupListeners() {
  109. const elementId = this._element.attr('id') !== undefined ? `#${this._element.attr('id')}` : ''
  110. $(document).on('click', `${elementId}${this._config.trigger}`, event => {
  111. this.toggle(event)
  112. })
  113. }
  114. // Static
  115. _expandSidebar() {
  116. if ($('body').hasClass(CLASS_NAME_SIDEBAR_COLLAPSED)) {
  117. $(this._config.sidebarButtonSelector).PushMenu('expand')
  118. }
  119. }
  120. }
  121. /**
  122. * Data API
  123. * ====================================================
  124. */
  125. $(window).on(EVENT_LOAD_DATA_API, () => {
  126. $(SELECTOR_DATA_WIDGET).each(function () {
  127. Treeview._jQueryInterface.call($(this), 'init')
  128. })
  129. })
  130. /**
  131. * jQuery API
  132. * ====================================================
  133. */
  134. $.fn[NAME] = Treeview._jQueryInterface
  135. $.fn[NAME].Constructor = Treeview
  136. $.fn[NAME].noConflict = function () {
  137. $.fn[NAME] = JQUERY_NO_CONFLICT
  138. return Treeview._jQueryInterface
  139. }
  140. export default Treeview