diff --git a/build/js/AdminLTE.js b/build/js/AdminLTE.js index 7f854ddf1..a6906ca98 100644 --- a/build/js/AdminLTE.js +++ b/build/js/AdminLTE.js @@ -5,6 +5,7 @@ import DirectChat from './DirectChat' import Dropdown from './Dropdown' import ExpandableTable from './ExpandableTable' import Fullscreen from './Fullscreen' +import IFrame from './IFrame' import Layout from './Layout' import PushMenu from './PushMenu' import SidebarSearch from './SidebarSearch' @@ -20,6 +21,7 @@ export { Dropdown, ExpandableTable, Fullscreen, + IFrame, Layout, PushMenu, SidebarSearch, diff --git a/build/js/IFrame.js b/build/js/IFrame.js new file mode 100644 index 000000000..427db6c59 --- /dev/null +++ b/build/js/IFrame.js @@ -0,0 +1,142 @@ +/** + * -------------------------------------------- + * 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_CONTENT_WRAPPER = '.content-wrapper' +const SELECTOR_CONTENT_IFRAME = `${SELECTOR_CONTENT_WRAPPER} iframe` +const SELECTOR_TAB_NAVBAR_NAV = `${SELECTOR_DATA_TOGGLE}.iframe-mode .navbar-nav` +const SELECTOR_TAB_CONTENT = `${SELECTOR_DATA_TOGGLE}.iframe-mode .tab-content` +const SELECTOR_SIDEBAR_MENU_ITEM = '.main-sidebar .nav-item a.nav-link' +const CLASS_NAME_IFRAME_MODE = 'iframe-mode' + +const Default = { + click(item) { + return item + }, + changed(item) { + return item + } +} + +/** + * Class Definition + * ==================================================== + */ + +class IFrame { + constructor(element, config) { + this._config = config + this._element = element + + this._init() + } + + // Public + + click(item) { + this._config.click.call(item) + } + + changed(item) { + this._config.changed.call(item) + } + + createTab(title, link) { + const tabId = `panel-${link.replace('.html', '').replace('./', '').replace('/', '-')}-${Math.floor(Math.random() * 1000)}` + const navId = `tab-${link.replace('.html', '').replace('./', '').replace('/', '-')}-${Math.floor(Math.random() * 1000)}` + + const newNavItem = `` + $(SELECTOR_TAB_NAVBAR_NAV).append(newNavItem) + + const newTabItem = `
` + $(SELECTOR_TAB_CONTENT).append(newTabItem) + + // eslint-disable-next-line no-console + console.log($(SELECTOR_TAB_CONTENT)) + } + + openTabSidebar(item) { + const title = $(item).find('p').text() + const link = $(item).attr('href') + + this.createTab(title, link) + } + + // Private + + _init() { + if ($(SELECTOR_CONTENT_WRAPPER).hasClass(CLASS_NAME_IFRAME_MODE)) { + this._setupListeners() + $(SELECTOR_TAB_NAVBAR_NAV) + + $(SELECTOR_CONTENT_IFRAME).height($(SELECTOR_CONTENT_WRAPPER).height()) + } + } + + _setupListeners() { + $(document).on('click', SELECTOR_SIDEBAR_MENU_ITEM, e => { + e.preventDefault() + this.openTabSidebar(e.target) + }) + } + + // Static + + static _jQueryInterface(operation) { + 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(/openTabSidebar/)) { + data[operation]() + } + } +} + +/** + * Data API + * ==================================================== + */ + +$(window).on('load', () => { + const gfg = window.frameElement + + if (gfg) { + document.body.classList.add(CLASS_NAME_IFRAME_MODE) + } else { + 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 diff --git a/build/scss/pages/_iframe.scss b/build/scss/pages/_iframe.scss new file mode 100644 index 000000000..88b446ad2 --- /dev/null +++ b/build/scss/pages/_iframe.scss @@ -0,0 +1,24 @@ +body.iframe-mode { + .main-sidebar { + display: none; + } + .content-wrapper { + margin-left: 0 !important; + } + .main-header, + .main-footer { + display: none; + } +} + +.content-wrapper { + height: 100%; + + &.iframe-mode { + iframe { + border: 0; + width: 100%; + height: 100%; + } + } +} diff --git a/build/scss/parts/_pages.scss b/build/scss/parts/_pages.scss index 7e6535895..0871a4b37 100644 --- a/build/scss/parts/_pages.scss +++ b/build/scss/parts/_pages.scss @@ -10,3 +10,4 @@ @import "../pages/profile"; @import "../pages/e-commerce"; @import "../pages/projects"; +@import "../pages/iframe"; diff --git a/iframe.html b/iframe.html new file mode 100644 index 000000000..0806663e6 --- /dev/null +++ b/iframe.html @@ -0,0 +1,855 @@ + + + + + + AdminLTE 3 | Dashboard + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+
+ +
+
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + +