123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 |
- /**
- * --------------------------------------------
- * AdminLTE IFrame.js
- * License MIT
- * --------------------------------------------
- */
- import $ from 'jquery'
- /**
- * Constants
- * ====================================================
- */
- const NAME = 'IFrame'
- const DATA_KEY = 'lte.iframe'
- const JQUERY_NO_CONFLICT = $.fn[NAME]
- const SELECTOR_DATA_TOGGLE = '[data-widget="iframe"]'
- const SELECTOR_DATA_TOGGLE_CLOSE = '[data-widget="iframe-close"]'
- const SELECTOR_DATA_TOGGLE_SCROLL_LEFT = '[data-widget="iframe-scrollleft"]'
- const SELECTOR_DATA_TOGGLE_SCROLL_RIGHT = '[data-widget="iframe-scrollright"]'
- const SELECTOR_DATA_TOGGLE_FULLSCREEN = '[data-widget="iframe-fullscreen"]'
- const SELECTOR_CONTENT_WRAPPER = '.content-wrapper'
- const SELECTOR_CONTENT_IFRAME = `${SELECTOR_CONTENT_WRAPPER} iframe`
- const SELECTOR_TAB_NAV = `${SELECTOR_DATA_TOGGLE}.iframe-mode .nav`
- const SELECTOR_TAB_NAVBAR_NAV = `${SELECTOR_DATA_TOGGLE}.iframe-mode .navbar-nav`
- const SELECTOR_TAB_NAVBAR_NAV_ITEM = `${SELECTOR_TAB_NAVBAR_NAV} .nav-item`
- const SELECTOR_TAB_CONTENT = `${SELECTOR_DATA_TOGGLE}.iframe-mode .tab-content`
- const SELECTOR_TAB_EMPTY = `${SELECTOR_TAB_CONTENT} .tab-empty`
- const SELECTOR_TAB_LOADING = `${SELECTOR_TAB_CONTENT} .tab-loading`
- const SELECTOR_SIDEBAR_MENU_ITEM = '.main-sidebar .nav-item > a.nav-link'
- const SELECTOR_HEADER_MENU_ITEM = '.main-header .nav-item a.nav-link'
- const SELECTOR_HEADER_DROPDOWN_ITEM = '.main-header a.dropdown-item'
- const CLASS_NAME_IFRAME_MODE = 'iframe-mode'
- const CLASS_NAME_FULLSCREEN_MODE = 'iframe-mode-fullscreen'
- const Default = {
- onTabClick(item) {
- return item
- },
- onTabChanged(item) {
- return item
- },
- onTabCreated(item) {
- return item
- },
- autoIframeMode: true,
- autoItemActive: true,
- autoShowNewTab: true,
- loadingScreen: true,
- useNavbarItems: true,
- scrollOffset: 40,
- scrollBehaviorSwap: false,
- iconMaximize: 'fa-expand',
- iconMinimize: 'fa-compress'
- }
- /**
- * Class Definition
- * ====================================================
- */
- class IFrame {
- constructor(element, config) {
- this._config = config
- this._element = element
- this._init()
- }
- // Public
- onTabClick(item) {
- this._config.onTabClick(item)
- }
- onTabChanged(item) {
- this._config.onTabChanged(item)
- }
- onTabCreated(item) {
- this._config.onTabCreated(item)
- }
- createTab(title, link, uniqueName, autoOpen) {
- const tabId = `panel-${uniqueName}-${Math.floor(Math.random() * 1000)}`
- const navId = `tab-${uniqueName}-${Math.floor(Math.random() * 1000)}`
- 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>`
- $(SELECTOR_TAB_NAVBAR_NAV).append(unescape(escape(newNavItem)))
- const newTabItem = `<div class="tab-pane fade" id="${tabId}" role="tabpanel" aria-labelledby="${navId}"><iframe src="${link}"></iframe></div>`
- $(SELECTOR_TAB_CONTENT).append(unescape(escape(newTabItem)))
- if (autoOpen) {
- if (this._config.loadingScreen) {
- const $loadingScreen = $(SELECTOR_TAB_LOADING)
- $loadingScreen.fadeIn()
- $(`${tabId} iframe`).ready(() => {
- if (typeof this._config.loadingScreen === 'number') {
- this.switchTab(`#${navId}`, this._config.loadingScreen)
- setTimeout(() => {
- $loadingScreen.fadeOut()
- }, this._config.loadingScreen)
- } else {
- this.switchTab(`#${navId}`, this._config.loadingScreen)
- $loadingScreen.fadeOut()
- }
- })
- } else {
- this.switchTab(`#${navId}`)
- }
- }
- this.onTabCreated($(`#${navId}`))
- }
- openTabSidebar(item, autoOpen = this._config.autoShowNewTab) {
- let $item = $(item).clone()
- if ($item.attr('href') === undefined) {
- $item = $(item).parent('a').clone()
- }
- $item.find('.right').remove()
- let title = $item.find('p').text()
- if (title === '') {
- title = $item.text()
- }
- const link = $item.attr('href')
- if (link === '#' || link === '' || link === undefined) {
- return
- }
- this.createTab(title, link, link.replace('.html', '').replace('./', '').replace(/["&'./=?[\]]/gi, '-').replace(/(--)/gi, ''), autoOpen)
- }
- switchTab(item) {
- const $item = $(item)
- const tabId = $item.attr('href')
- $(SELECTOR_TAB_EMPTY).hide()
- $(`${SELECTOR_TAB_NAVBAR_NAV} .active`).tab('dispose').removeClass('active')
- this._fixHeight()
- $item.tab('show')
- $item.parents('li').addClass('active')
- this.onTabChanged($item)
- if (this._config.autoItemActive) {
- this._setItemActive($(`${tabId} iframe`).attr('src'))
- }
- }
- removeActiveTab() {
- const $navItem = $(`${SELECTOR_TAB_NAVBAR_NAV_ITEM}.active`)
- const $navItemParent = $navItem.parent()
- const navItemIndex = $navItem.index()
- $navItem.remove()
- $('.tab-pane.active').remove()
- if ($(SELECTOR_TAB_CONTENT).children().length == $(`${SELECTOR_TAB_EMPTY}, ${SELECTOR_TAB_LOADING}`).length) {
- $(SELECTOR_TAB_EMPTY).show()
- } else {
- const prevNavItemIndex = navItemIndex - 1
- this.switchTab($navItemParent.children().eq(prevNavItemIndex).find('a'))
- }
- }
- toggleFullscreen() {
- if ($('body').hasClass(CLASS_NAME_FULLSCREEN_MODE)) {
- $(`${SELECTOR_DATA_TOGGLE_FULLSCREEN} i`).removeClass(this._config.iconMinimize).addClass(this._config.iconMaximize)
- $('body').removeClass(CLASS_NAME_FULLSCREEN_MODE)
- $(`${SELECTOR_TAB_EMPTY}, ${SELECTOR_TAB_LOADING}`).height('auto')
- $(SELECTOR_CONTENT_WRAPPER).height('auto')
- $(SELECTOR_CONTENT_IFRAME).height('auto')
- } else {
- $(`${SELECTOR_DATA_TOGGLE_FULLSCREEN} i`).removeClass(this._config.iconMaximize).addClass(this._config.iconMinimize)
- $('body').addClass(CLASS_NAME_FULLSCREEN_MODE)
- }
- $(window).trigger('resize')
- this._fixHeight(true)
- }
- // Private
- _init() {
- if (window.frameElement && this._config.autoIframeMode) {
- $('body').addClass(CLASS_NAME_IFRAME_MODE)
- } else if ($(SELECTOR_CONTENT_WRAPPER).hasClass(CLASS_NAME_IFRAME_MODE)) {
- this._setupListeners()
- this._fixHeight(true)
- }
- }
- _navScroll(offset) {
- const leftPos = $(SELECTOR_TAB_NAVBAR_NAV).scrollLeft()
- $(SELECTOR_TAB_NAVBAR_NAV).animate({ scrollLeft: (leftPos + offset) }, 250, 'linear')
- }
- _setupListeners() {
- $(window).on('resize', () => {
- setTimeout(() => {
- this._fixHeight()
- }, 1)
- })
- $(document).on('click', SELECTOR_SIDEBAR_MENU_ITEM, e => {
- e.preventDefault()
- this.openTabSidebar(e.target)
- })
- if (this._config.useNavbarItems) {
- $(document).on('click', `${SELECTOR_HEADER_MENU_ITEM}, ${SELECTOR_HEADER_DROPDOWN_ITEM}`, e => {
- e.preventDefault()
- this.openTabSidebar(e.target)
- })
- }
- $(document).on('click', SELECTOR_TAB_NAVBAR_NAV_ITEM, e => {
- e.preventDefault()
- this.onTabClick(e.target)
- this.switchTab(e.target)
- })
- $(document).on('click', SELECTOR_DATA_TOGGLE_CLOSE, e => {
- e.preventDefault()
- this.removeActiveTab()
- })
- $(document).on('click', SELECTOR_DATA_TOGGLE_FULLSCREEN, e => {
- e.preventDefault()
- this.toggleFullscreen()
- })
- let mousedown = false
- let mousedownInterval = null
- $(document).on('mousedown', SELECTOR_DATA_TOGGLE_SCROLL_LEFT, e => {
- e.preventDefault()
- clearInterval(mousedownInterval)
- let { scrollOffset } = this._config
- if (!this._config.scrollBehaviorSwap) {
- scrollOffset = -scrollOffset
- }
- mousedown = true
- this._navScroll(scrollOffset)
- mousedownInterval = setInterval(() => {
- this._navScroll(scrollOffset)
- }, 250)
- })
- $(document).on('mousedown', SELECTOR_DATA_TOGGLE_SCROLL_RIGHT, e => {
- e.preventDefault()
- clearInterval(mousedownInterval)
- let { scrollOffset } = this._config
- if (this._config.scrollBehaviorSwap) {
- scrollOffset = -scrollOffset
- }
- mousedown = true
- this._navScroll(scrollOffset)
- mousedownInterval = setInterval(() => {
- this._navScroll(scrollOffset)
- }, 250)
- })
- $(document).on('mouseup', () => {
- if (mousedown) {
- mousedown = false
- clearInterval(mousedownInterval)
- mousedownInterval = null
- }
- })
- }
- _setItemActive(href) {
- $(`${SELECTOR_SIDEBAR_MENU_ITEM}, ${SELECTOR_HEADER_DROPDOWN_ITEM}`).removeClass('active')
- $(SELECTOR_HEADER_MENU_ITEM).parent().removeClass('active')
- const $headerMenuItem = $(`${SELECTOR_HEADER_MENU_ITEM}[href$="${href}"]`)
- const $headerDropdownItem = $(`${SELECTOR_HEADER_DROPDOWN_ITEM}[href$="${href}"]`)
- const $sidebarMenuItem = $(`${SELECTOR_SIDEBAR_MENU_ITEM}[href$="${href}"]`)
- $headerMenuItem.each((i, e) => {
- $(e).parent().addClass('active')
- })
- $headerDropdownItem.each((i, e) => {
- $(e).addClass('active')
- })
- $sidebarMenuItem.each((i, e) => {
- $(e).addClass('active')
- $(e).parents('.nav-treeview').prevAll('.nav-link').addClass('active')
- })
- }
- _fixHeight(tabEmpty = false) {
- if ($('body').hasClass(CLASS_NAME_FULLSCREEN_MODE)) {
- const windowHeight = $(window).height()
- $(`${SELECTOR_TAB_EMPTY}, ${SELECTOR_TAB_LOADING}`).height(windowHeight)
- $(SELECTOR_CONTENT_WRAPPER).height(windowHeight)
- $(SELECTOR_CONTENT_IFRAME).height(windowHeight)
- } else {
- const contentWrapperHeight = parseFloat($(SELECTOR_CONTENT_WRAPPER).css('height'))
- const navbarHeight = $(SELECTOR_TAB_NAV).outerHeight()
- if (tabEmpty == true) {
- setTimeout(() => {
- $(`${SELECTOR_TAB_EMPTY}, ${SELECTOR_TAB_LOADING}`).height(contentWrapperHeight - navbarHeight)
- }, 50)
- } else {
- $(SELECTOR_CONTENT_IFRAME).height(contentWrapperHeight - navbarHeight)
- }
- }
- }
- // Static
- static _jQueryInterface(operation, ...args) {
- let data = $(this).data(DATA_KEY)
- const _options = $.extend({}, Default, $(this).data())
- if (!data) {
- data = new IFrame(this, _options)
- $(this).data(DATA_KEY, data)
- }
- if (typeof operation === 'string' && operation.match(/createTab|openTabSidebar|switchTab|removeActiveTab/)) {
- data[operation](...args)
- }
- }
- }
- /**
- * Data API
- * ====================================================
- */
- $(window).on('load', () => {
- IFrame._jQueryInterface.call($(SELECTOR_DATA_TOGGLE))
- })
- /**
- * jQuery API
- * ====================================================
- */
- $.fn[NAME] = IFrame._jQueryInterface
- $.fn[NAME].Constructor = IFrame
- $.fn[NAME].noConflict = function () {
- $.fn[NAME] = JQUERY_NO_CONFLICT
- return IFrame._jQueryInterface
- }
- export default IFrame
|