Layout.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * --------------------------------------------
  3. * AdminLTE Layout.js
  4. * License MIT
  5. * --------------------------------------------
  6. */
  7. const Layout = (($) => {
  8. /**
  9. * Constants
  10. * ====================================================
  11. */
  12. const NAME = 'Layout'
  13. const DATA_KEY = 'lte.layout'
  14. const EVENT_KEY = `.${DATA_KEY}`
  15. const JQUERY_NO_CONFLICT = $.fn[NAME]
  16. const Event = {
  17. SIDEBAR: 'sidebar'
  18. }
  19. const Selector = {
  20. HEADER : '.main-header',
  21. MAIN_SIDEBAR : '.main-sidebar',
  22. SIDEBAR : '.main-sidebar .sidebar',
  23. CONTENT : '.content-wrapper',
  24. BRAND : '.brand-link',
  25. CONTENT_HEADER : '.content-header',
  26. WRAPPER : '.wrapper',
  27. CONTROL_SIDEBAR: '.control-sidebar',
  28. LAYOUT_FIXED : '.layout-fixed',
  29. FOOTER : '.main-footer'
  30. }
  31. const ClassName = {
  32. HOLD : 'hold-transition',
  33. SIDEBAR : 'main-sidebar',
  34. CONTENT_FIXED : 'content-fixed',
  35. SIDEBAR_FOCUSED: 'sidebar-focused',
  36. LAYOUT_FIXED : 'layout-fixed',
  37. NAVBAR_FIXED : 'layout-navbar-fixed',
  38. FOOTER_FIXED : 'layout-footer-fixed',
  39. }
  40. const Default = {
  41. scrollbarTheme : 'os-theme-light',
  42. scrollbarAutoHide: 'l'
  43. }
  44. /**
  45. * Class Definition
  46. * ====================================================
  47. */
  48. class Layout {
  49. constructor(element, config) {
  50. this._config = config
  51. this._element = element
  52. this._init()
  53. }
  54. // Public
  55. fixLayoutHeight() {
  56. const heights = {
  57. window: $(window).height(),
  58. header: $(Selector.HEADER).length !== 0 ? $(Selector.HEADER).outerHeight() : 0,
  59. footer: $(Selector.FOOTER).length !== 0 ? $(Selector.FOOTER).outerHeight() : 0,
  60. sidebar: $(Selector.SIDEBAR).length !== 0 ? $(Selector.SIDEBAR).height() : 0,
  61. }
  62. const max = this._max(heights)
  63. console.log(heights);
  64. $(Selector.CONTENT).css('min-height', max - heights.footer)
  65. if ($('body').hasClass(ClassName.LAYOUT_FIXED)) {
  66. if (typeof $.fn.overlayScrollbars !== 'undefined') {
  67. $(Selector.SIDEBAR).overlayScrollbars({
  68. className : this._config.scrollbarTheme,
  69. sizeAutoCapable : true,
  70. scrollbars : {
  71. autoHide: this._config.scrollbarAutoHide,
  72. clickScrolling : true
  73. }
  74. })
  75. }
  76. }
  77. }
  78. // Private
  79. _init() {
  80. // Activate layout height watcher
  81. this.fixLayoutHeight()
  82. $(Selector.SIDEBAR)
  83. .on('collapsed.lte.treeview expanded.lte.treeview collapsed.lte.pushmenu expanded.lte.pushmenu', () => {
  84. this.fixLayoutHeight()
  85. })
  86. $(window).resize(() => {
  87. this.fixLayoutHeight()
  88. })
  89. $('body, html').css('height', 'auto')
  90. $('body.hold-transition').removeClass('hold-transition')
  91. }
  92. _max(numbers) {
  93. // Calculate the maximum number in a list
  94. let max = 0
  95. Object.keys(numbers).forEach((key) => {
  96. if (numbers[key] > max) {
  97. max = numbers[key]
  98. }
  99. })
  100. return max
  101. }
  102. // Static
  103. static _jQueryInterface(config) {
  104. return this.each(function () {
  105. let data = $(this).data(DATA_KEY)
  106. const _config = $.extend({}, Default, $(this).data())
  107. if (!data) {
  108. data = new Layout($(this), _config)
  109. $(this).data(DATA_KEY, data)
  110. }
  111. if (config === 'init') {
  112. data[config]()
  113. }
  114. })
  115. }
  116. }
  117. /**
  118. * Data API
  119. * ====================================================
  120. */
  121. $(window).on('load', () => {
  122. Layout._jQueryInterface.call($('body'))
  123. })
  124. $(Selector.SIDEBAR + ' a').on('focusin', () => {
  125. $(Selector.MAIN_SIDEBAR).addClass(ClassName.SIDEBAR_FOCUSED);
  126. })
  127. $(Selector.SIDEBAR + ' a').on('focusout', () => {
  128. $(Selector.MAIN_SIDEBAR).removeClass(ClassName.SIDEBAR_FOCUSED);
  129. })
  130. /**
  131. * jQuery API
  132. * ====================================================
  133. */
  134. $.fn[NAME] = Layout._jQueryInterface
  135. $.fn[NAME].Constructor = Layout
  136. $.fn[NAME].noConflict = function () {
  137. $.fn[NAME] = JQUERY_NO_CONFLICT
  138. return Layout._jQueryInterface
  139. }
  140. return Layout
  141. })(jQuery)
  142. export default Layout