Layout.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. SIDEBAR : '.main-sidebar .sidebar',
  22. CONTENT : '.content-wrapper',
  23. BRAND : '.brand-link',
  24. CONTENT_HEADER : '.content-header',
  25. WRAPPER : '.wrapper',
  26. CONTROL_SIDEBAR: '.control-sidebar',
  27. LAYOUT_FIXED : '.layout-fixed',
  28. FOOTER : '.main-footer'
  29. }
  30. const ClassName = {
  31. HOLD : 'hold-transition',
  32. SIDEBAR : 'main-sidebar',
  33. LAYOUT_FIXED: 'layout-fixed',
  34. NAVBAR_FIXED: 'layout-navbar-fixed',
  35. FOOTER_FIXED: 'layout-footer-fixed',
  36. }
  37. const Default = {
  38. scrollbarTheme : 'os-theme-light',
  39. scrollbarAutoHide: 'l'
  40. }
  41. /**
  42. * Class Definition
  43. * ====================================================
  44. */
  45. class Layout {
  46. constructor(element, config) {
  47. this._config = config
  48. this._element = element
  49. this._init()
  50. }
  51. // Public
  52. fixLayoutHeight() {
  53. const heights = {
  54. window : $(window).height(),
  55. header : $(Selector.HEADER).outerHeight(),
  56. footer : $(Selector.FOOTER).outerHeight(),
  57. sidebar : $(Selector.SIDEBAR).height(),
  58. }
  59. const max = this._max(heights)
  60. if ($('body').hasClass(ClassName.LAYOUT_FIXED)) {
  61. $(Selector.CONTENT).css('min-height', max - heights.header - heights.footer)
  62. // $(Selector.SIDEBAR).css('min-height', max - heights.header)
  63. $(Selector.CONTROL_SIDEBAR + ' .control-sidebar-content').css('height', max - heights.header)
  64. if (typeof $.fn.overlayScrollbars !== 'undefined') {
  65. $(Selector.SIDEBAR).overlayScrollbars({
  66. className : this._config.scrollbarTheme,
  67. sizeAutoCapable : true,
  68. scrollbars : {
  69. autoHide: this._config.scrollbarAutoHide,
  70. clickScrolling : true
  71. }
  72. })
  73. $(Selector.CONTROL_SIDEBAR + ' .control-sidebar-content').overlayScrollbars({
  74. className : this._config.scrollbarTheme,
  75. sizeAutoCapable : true,
  76. scrollbars : {
  77. autoHide: this._config.scrollbarAutoHide,
  78. clickScrolling : true
  79. }
  80. })
  81. }
  82. } else {
  83. if (heights.window > heights.sidebar) {
  84. $(Selector.CONTENT).css('min-height', heights.window - heights.header - heights.footer)
  85. } else {
  86. $(Selector.CONTENT).css('min-height', heights.sidebar - heights.header)
  87. }
  88. }
  89. if ($('body').hasClass(ClassName.NAVBAR_FIXED)) {
  90. $(Selector.BRAND).css('height', heights.header)
  91. $(Selector.SIDEBAR).css('margin-top', heights.header)
  92. $(Selector.SIDEBAR).css('margin-top', heights.header)
  93. }
  94. if ($('body').hasClass(ClassName.FOOTER_FIXED)) {
  95. $(Selector.CONTENT).css('margin-bottom', heights.footer)
  96. }
  97. }
  98. // Private
  99. _init() {
  100. // Enable transitions
  101. $('body').removeClass(ClassName.HOLD)
  102. // Activate layout height watcher
  103. this.fixLayoutHeight()
  104. $(Selector.SIDEBAR)
  105. .on('collapsed.lte.treeview expanded.lte.treeview collapsed.lte.pushmenu expanded.lte.pushmenu', () => {
  106. this.fixLayoutHeight()
  107. })
  108. $(window).resize(() => {
  109. this.fixLayoutHeight()
  110. })
  111. $('body, html').css('height', 'auto')
  112. }
  113. _max(numbers) {
  114. // Calculate the maximum number in a list
  115. let max = 0
  116. Object.keys(numbers).forEach((key) => {
  117. if (numbers[key] > max) {
  118. max = numbers[key]
  119. }
  120. })
  121. return max
  122. }
  123. // Static
  124. static _jQueryInterface(config) {
  125. return this.each(function () {
  126. let data = $(this).data(DATA_KEY)
  127. const _config = $.extend({}, Default, $(this).data())
  128. if (!data) {
  129. data = new Layout($(this), _config)
  130. $(this).data(DATA_KEY, data)
  131. }
  132. if (config === 'init') {
  133. data[config]()
  134. }
  135. })
  136. }
  137. }
  138. /**
  139. * Data API
  140. * ====================================================
  141. */
  142. $(window).on('load', () => {
  143. Layout._jQueryInterface.call($('body'))
  144. })
  145. /**
  146. * jQuery API
  147. * ====================================================
  148. */
  149. $.fn[NAME] = Layout._jQueryInterface
  150. $.fn[NAME].Constructor = Layout
  151. $.fn[NAME].noConflict = function () {
  152. $.fn[NAME] = JQUERY_NO_CONFLICT
  153. return Layout._jQueryInterface
  154. }
  155. return Layout
  156. })(jQuery)
  157. export default Layout