IFrame.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /**
  2. * --------------------------------------------
  3. * AdminLTE IFrame.js
  4. * License MIT
  5. * --------------------------------------------
  6. */
  7. import $ from 'jquery'
  8. /**
  9. * Constants
  10. * ====================================================
  11. */
  12. const NAME = 'IFrame'
  13. const DATA_KEY = 'lte.iframe'
  14. const JQUERY_NO_CONFLICT = $.fn[NAME]
  15. const SELECTOR_DATA_TOGGLE = '[data-widget="iframe"]'
  16. const SELECTOR_CONTENT_WRAPPER = '.content-wrapper'
  17. const SELECTOR_CONTENT_IFRAME = `${SELECTOR_CONTENT_WRAPPER} iframe`
  18. const SELECTOR_TAB_NAV = `${SELECTOR_DATA_TOGGLE}.iframe-mode .nav`
  19. const SELECTOR_TAB_NAVBAR_NAV = `${SELECTOR_DATA_TOGGLE}.iframe-mode .navbar-nav`
  20. const SELECTOR_TAB_NAVBAR_NAV_ITEM = `${SELECTOR_TAB_NAVBAR_NAV} .nav-item`
  21. const SELECTOR_TAB_CONTENT = `${SELECTOR_DATA_TOGGLE}.iframe-mode .tab-content`
  22. const SELECTOR_TAB_EMPTY = `${SELECTOR_TAB_CONTENT} .tab-empty`
  23. const SELECTOR_TAB_LOADING = `${SELECTOR_TAB_CONTENT} .tab-loading`
  24. const SELECTOR_SIDEBAR_MENU_ITEM = '.main-sidebar .nav-item > a.nav-link'
  25. const SELECTOR_HEADER_MENU_ITEM = '.main-header .dropdown-item, .main-header .nav-item'
  26. const CLASS_NAME_IFRAME_MODE = 'iframe-mode'
  27. const Default = {
  28. tabClick(item) {
  29. return item
  30. },
  31. tabChanged(item) {
  32. return item
  33. },
  34. tabCreated(item) {
  35. return item
  36. },
  37. autoIframeMode: true,
  38. autoShowNewTab: true,
  39. loadingScreen: true,
  40. useNavbarItems: true
  41. }
  42. /**
  43. * Class Definition
  44. * ====================================================
  45. */
  46. class IFrame {
  47. constructor(element, config) {
  48. this._config = config
  49. this._element = element
  50. this._init()
  51. }
  52. // Public
  53. tabClick(item) {
  54. this._config.tabClick(item)
  55. }
  56. tabChanged(item) {
  57. this._config.tabChanged(item)
  58. }
  59. tabCreated(item) {
  60. this._config.tabCreated(item)
  61. }
  62. createTab(title, link, autoOpen) {
  63. const tabId = `panel-${link.replace('.html', '').replace('./', '').replaceAll('/', '-')}-${Math.floor(Math.random() * 1000)}`
  64. const navId = `tab-${link.replace('.html', '').replace('./', '').replaceAll('/', '-')}-${Math.floor(Math.random() * 1000)}`
  65. const newNavItem = `<li class="nav-item" role="presentation"><a class="nav-link" data-toggle="row" id="${navId}" href="#${tabId}" role="tab" aria-controls="${tabId}" aria-selected="false">${title}</a></li>`
  66. $(SELECTOR_TAB_NAVBAR_NAV).append(newNavItem)
  67. const newTabItem = `<div class="tab-pane fade" id="${tabId}" role="tabpanel" aria-labelledby="${navId}"><iframe src="${link}"></iframe></div>`
  68. $(SELECTOR_TAB_CONTENT).append(newTabItem)
  69. if (autoOpen) {
  70. this.switchTab(`#${navId}`, this._config.loadingScreen)
  71. }
  72. this.tabCreated($(`#${navId}`))
  73. }
  74. openTabSidebar(item) {
  75. let $item = $(item).clone()
  76. if ($item.attr('href') === undefined) {
  77. $item = $(item).parent('a').clone()
  78. }
  79. let title = $item.find('p').text()
  80. if (title === '') {
  81. title = $item.text()
  82. }
  83. const link = $item.attr('href')
  84. if (link === '#' || link === '' || link === undefined) {
  85. return
  86. }
  87. this.createTab(title, link, this._config.autoShowNewTab)
  88. }
  89. switchTab(item, loadingScreen = null) {
  90. $(SELECTOR_TAB_EMPTY).hide()
  91. $(`${SELECTOR_TAB_NAVBAR_NAV} .active`).tab('dispose').removeClass('active')
  92. this._fixHeight()
  93. const $item = $(item)
  94. if (loadingScreen) {
  95. const $loadingScreen = $(SELECTOR_TAB_LOADING)
  96. $loadingScreen.fadeIn()
  97. const tabId = $item.attr('href')
  98. $(`${tabId} iframe`).ready(() => {
  99. if (typeof loadingScreen === 'number') {
  100. setTimeout(() => {
  101. $loadingScreen.fadeOut()
  102. }, loadingScreen)
  103. } else {
  104. $loadingScreen.fadeOut()
  105. }
  106. })
  107. }
  108. $item.tab('show')
  109. $item.parents('li').addClass('active')
  110. this.tabChanged($item)
  111. }
  112. // Private
  113. _init() {
  114. if (window.frameElement && this._config.autoIframeMode) {
  115. $('body').addClass(CLASS_NAME_IFRAME_MODE)
  116. } else if ($(SELECTOR_CONTENT_WRAPPER).hasClass(CLASS_NAME_IFRAME_MODE)) {
  117. this._setupListeners()
  118. this._fixHeight(true)
  119. }
  120. }
  121. _setupListeners() {
  122. $(window).on('resize', () => {
  123. setTimeout(() => {
  124. this._fixHeight()
  125. }, 1)
  126. })
  127. $(document).on('click', SELECTOR_SIDEBAR_MENU_ITEM, e => {
  128. e.preventDefault()
  129. this.openTabSidebar(e.target)
  130. })
  131. $(document).on('click', SELECTOR_HEADER_MENU_ITEM, e => {
  132. e.preventDefault()
  133. this.tabClick(e.target)
  134. this.openTabSidebar(e.target)
  135. })
  136. $(document).on('click', SELECTOR_TAB_NAVBAR_NAV_ITEM, e => {
  137. e.preventDefault()
  138. this.tabClick(e.target)
  139. this.switchTab(e.target)
  140. })
  141. }
  142. _fixHeight(tabEmpty = false) {
  143. const contentWrapperHeight = parseFloat($(SELECTOR_CONTENT_WRAPPER).css('min-height'))
  144. const navbarHeight = $(SELECTOR_TAB_NAV).outerHeight()
  145. if (tabEmpty == true) {
  146. setTimeout(() => {
  147. $(`${SELECTOR_TAB_EMPTY}, ${SELECTOR_TAB_LOADING}`).height(contentWrapperHeight - navbarHeight)
  148. }, 50)
  149. } else {
  150. $(SELECTOR_CONTENT_IFRAME).height(contentWrapperHeight - navbarHeight)
  151. }
  152. }
  153. // Static
  154. static _jQueryInterface(operation) {
  155. let data = $(this).data(DATA_KEY)
  156. const _options = $.extend({}, Default, $(this).data())
  157. if (!data) {
  158. data = new IFrame(this, _options)
  159. $(this).data(DATA_KEY, data)
  160. }
  161. if (typeof operation === 'string' && operation.match(/openTabSidebar/)) {
  162. data[operation]()
  163. }
  164. }
  165. }
  166. /**
  167. * Data API
  168. * ====================================================
  169. */
  170. $(window).on('load', () => {
  171. IFrame._jQueryInterface.call($(SELECTOR_DATA_TOGGLE))
  172. })
  173. /**
  174. * jQuery API
  175. * ====================================================
  176. */
  177. $.fn[NAME] = IFrame._jQueryInterface
  178. $.fn[NAME].Constructor = IFrame
  179. $.fn[NAME].noConflict = function () {
  180. $.fn[NAME] = JQUERY_NO_CONFLICT
  181. return IFrame._jQueryInterface
  182. }
  183. export default IFrame