From b10c27f3f2de59dea07d66003716084250e9a6b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jana=20Deutschla=CC=88nder?= Date: Thu, 2 Mar 2017 16:45:22 +0100 Subject: [PATCH 01/12] SPR-840: debug sidebar script IE10, styling for mobile menu debug background-color: qc --- css/area_main-sidebar-nav.less | 65 +++++-- css/area_nav-breadcrumb.less | 5 +- css/base.less | 2 + js/sidebar.js | 298 +++++++++++++++++---------------- script.js | 1 + style.ini | 2 + 6 files changed, 208 insertions(+), 165 deletions(-) diff --git a/css/area_main-sidebar-nav.less b/css/area_main-sidebar-nav.less index 997efc0..7fc4562 100755 --- a/css/area_main-sidebar-nav.less +++ b/css/area_main-sidebar-nav.less @@ -108,28 +108,62 @@ #dokuwiki__aside { display: none; } + // show when toggled - #dokuwiki__aside.show { - display: block; + body.show-mobile-sidebar { - position: absolute; - left: 0; - z-index: 200; // above all + #dokuwiki__aside { + display: block; + + position: absolute; + left: 1.25rem;//left margin of content container + z-index: 200; // above all + box-shadow: @box-shadow-right-bottom; + min-width: 45%; + max-width: 90%; + height: auto; + + &:after{ + content: ""; + position: absolute; + top: 0; + left:0; + bottom:0; + right:0; + width: 100%; + height: 100%; + background: @ini_background; + background: -webkit-linear-gradient(left, @ini_background, @color-content-bg); + background: linear-gradient(left, @ini_background, @color-content-bg); + + z-index: 0; + } + + > nav{ + position: relative; + //display: block; + z-index: 2; + &:first-child{ + margin-top: 1.2rem; + } + } + + a.nav { + border-radius: 0; + border-right-width: 0; + border-left-width: 0; + } + .nav-panel, + a.nav{ + padding-right: .8em; + } + } - border-right: @ini_border 1px solid; - box-shadow: @box-shadow;; - - max-width: 100%; - min-width: 45%; - height: 100%; - - background-color: @ini_background; } + } - - // FIXME check if the stuff below is still relevant /* + + + + + + + + + + + + + + + + + + + + + + + + + + */ @@ -158,7 +192,6 @@ } } - } /* + + + + + + + + + + + + + + + + + + + + + + + + + + */ diff --git a/css/area_nav-breadcrumb.less b/css/area_nav-breadcrumb.less index 32835e0..cd3f5b6 100755 --- a/css/area_nav-breadcrumb.less +++ b/css/area_nav-breadcrumb.less @@ -151,7 +151,10 @@ right: 0; width: auto; border: 0 none; - background: @color-site-bg; + background: @background_page-header; + background: -webkit-linear-gradient(top, @background_page-header, @color-content-bg); + background: linear-gradient(top, @background_page-header, @color-content-bg); + box-shadow: @box-shadow-bottom; z-index: 2000; #plugin__qc__out{ diff --git a/css/base.less b/css/base.less index 84a8874..9b9ed35 100755 --- a/css/base.less +++ b/css/base.less @@ -34,6 +34,8 @@ @box-shadow-offset: __box_shadow_offset__; @box-shadow: __box_shadow__; @box-shadow-colored: __box_shadow_colored__; +@box-shadow-right-bottom:__box_shadow_right_bottom__; +@box-shadow-bottom: __box_shadow_bottom__; @th_background: __background_alt__; diff --git a/js/sidebar.js b/js/sidebar.js index 3d60b44..114c11a 100644 --- a/js/sidebar.js +++ b/js/sidebar.js @@ -2,163 +2,165 @@ * Sets up the sidebar behaviour */ jQuery(function () { - const $nav = jQuery('#dokuwiki__aside'); + var $nav = jQuery('#dokuwiki__aside'); if (!$nav.length) return; - /** - * closes sidebar - */ - const setWideContent = function () { - $nav.find('div.nav-panel').hide(); // close all panels - jQuery('body').addClass('wide-content'); - }; + /** + * closes sidebar + */ + var setWideContent = function () { + $nav.find('div.nav-panel').hide(); // close all panels + jQuery('body').addClass('wide-content'); + }, - /** - * opens the sidebar - */ - const setDefaultContent = function () { - jQuery('body').removeClass('wide-content'); + /** + * opens the sidebar + */ + setDefaultContent = function () { + jQuery('body').removeClass('wide-content'); - }; + }; - /** - * Accessibility helper, focuses the first link witih the given element - * - * @param {jQuery} $elem - */ - const focusFirstSubLink = function ($elem) { - $elem.find('a').first().focus(); - }; + /** + * Accessibility helper, focuses the first link witih the given element + * + * @param {jQuery} $elem + */ + focusFirstSubLink = function ($elem) { + $elem.find('a').first().focus(); + }, - /** - * Toggle a navigation panel - * - * @param {jQuery} $toggler The h6 toggler - */ - const toggleNav = function ($toggler) { - const $panel = $toggler.next('div.nav-panel'); - const isOpen = $panel.is(':visible'); - // open sidebar on interaction - setDefaultContent(); - // toggle the panel, focus first link after opening - $panel.dw_toggle(!isOpen, function () { - if (!isOpen) { - focusFirstSubLink($panel); - } - }); - }; - - /** - * Initialize the content navigation - * - * It mangles the sidebar content and handles inline Icon configuration - */ - const initContentNav = function () { - const $main = $nav.find('nav.nav-main'); - if (!$main.length) return; - - const ELEMENT = 'h1,h2,h3,h4,h5'; // FIXME move to config - const $elements = $main.find(ELEMENT); - $elements.each(function () { - const $me = jQuery(this); - - // prepare text and the optional icon - const data = $me.text().split('@', 2); - const text = data[0].trim(); - const $icon = jQuery('') - .text(text.substr(0, 1).toUpperCase() + text.substr(1, 1).toLowerCase()) - .wrapInner(''); - if (data[1]) { - const src = data[1].trim(); - $icon.load(DOKU_BASE + 'lib/tpl/sprintdoc/svg.php?svg=' + src + '&e=1'); // directly embed - } - - // make the new toggler - const $toggler = jQuery('') - .addClass('nav') - .attr('href', '#') - .attr('role', 'heading') - .attr('aria-level', '2') - .text(text) - .wrapInner('') - .prepend($icon) - ; - - // wrap all following siblings til the next element in a wrapper - const $wrap = jQuery('
') - .addClass('nav-panel'); - const $sibs = $me.nextAll(); - for (let i = 0; i < $sibs.length; i++) { - const $sib = jQuery($sibs[i]); - if ($sib.is(ELEMENT)) break; - $sib.detach().appendTo($wrap); - } - $wrap.insertAfter($me); - - // replace element with toggler - $me.replaceWith($toggler); - }); - }; - - /** - * Initialize the open/close toggling of menu entries - */ - const initMenuHandling = function () { - $nav.on('click', 'a.nav', function (e) { - toggleNav(jQuery(this)); - e.preventDefault(); - }); - }; - - /** - * Make sure the content area is always as high as the sidebar - */ - const initContentMinHeight = function () { - const $sidebar = jQuery('.page-wrapper').find('> .tools').find('.col-xs-12'); - if ($sidebar.length == 1) { - const num = parseFloat($sidebar.height()); - if (!isNaN(num)) { - jQuery('#dokuwiki__content').css('minHeight', num + 100); - } - } - }; - - /** - * Initialize the sidebar handle behaviour - */ - const initSidebarToggling = function () { - const $toggler = jQuery('.togglelink.page_main-content').find('a'); - $toggler.click(function (e) { - e.preventDefault(); - if (jQuery('body').hasClass('wide-content')) { - setDefaultContent(); - } else { - setWideContent(); - } - }); - }; - - /** - * Show sidebar when accessing the search - */ - const initSearchToggling = function () { - jQuery('.toggleSearch').find('a').click(function (e) { + /** + * Toggle a navigation panel + * + * @param {jQuery} $toggler The h6 toggler + */ + toggleNav = function ($toggler) { + var $panel = $toggler.next('div.nav-panel'); + var isOpen = $panel.is(':visible'); + // open sidebar on interaction setDefaultContent(); - e.preventDefault(); - jQuery('#qsearch__in').focus(); - }); + // toggle the panel, focus first link after opening + $panel.dw_toggle(!isOpen, function () { + if (!isOpen) { + focusFirstSubLink($panel); + } + }); + }, - }; + /** + * Initialize the content navigation + * + * It mangles the sidebar content and handles inline Icon configuration + */ + initContentNav = function () { + var $main = $nav.find('nav.nav-main'); + if (!$main.length) return; - /** - * Open and close the sidebar in mobile view - */ - const initMobileToggling = function () { - jQuery('.menu-togglelink').find('a').click(function (e) { - e.preventDefault(); - jQuery('#dokuwiki__aside').toggleClass('show'); - }); - }; + var ELEMENT = 'h1,h2,h3,h4,h5'; // FIXME move to config + var $elements = $main.find(ELEMENT); + $elements.each(function () { + var $me = jQuery(this), + + // prepare text and the optional icon + data = $me.text().split('@', 2), + text = data[0].trim(); + + var $icon = jQuery('') + .text(text.substr(0, 1).toUpperCase() + text.substr(1, 1).toLowerCase()) + .wrapInner(''); + if (data[1]) { + var src = data[1].trim(); + $icon.load(DOKU_BASE + 'lib/tpl/sprintdoc/svg.php?svg=' + src + '&e=1'); // directly embed + } + + // make the new toggler + var $toggler = jQuery('') + .addClass('nav') + .attr('href', '#') + .attr('role', 'heading') + .attr('aria-level', '2') + .text(text) + .wrapInner('') + .prepend($icon) + ; + + // wrap all following siblings til the next element in a wrapper + var $wrap = jQuery('
') + .addClass('nav-panel'); + var $sibs = $me.nextAll(); + for (var i = 0; i < $sibs.length; i++) { + var $sib = jQuery($sibs[i]); + if ($sib.is(ELEMENT)) break; + $sib.detach().appendTo($wrap); + } + $wrap.insertAfter($me); + + // replace element with toggler + $me.replaceWith($toggler); + }); + }, + + /** + * Initialize the open/close toggling of menu entries + */ + initMenuHandling = function () { + $nav.on('click', 'a.nav', function (e) { + toggleNav(jQuery(this)); + e.preventDefault(); + }); + }, + + /** + * Make sure the content area is always as high as the sidebar + */ + initContentMinHeight = function () { + var $sidebar = jQuery('.page-wrapper').find('> .tools').find('.col-xs-12'); + if ($sidebar.length == 1) { + const num = parseFloat($sidebar.height()); + if (!isNaN(num)) { + jQuery('#dokuwiki__content').css('minHeight', num + 100); + } + } + }, + + /** + * Initialize the sidebar handle behaviour + */ + initSidebarToggling = function () { + const $toggler = jQuery('.togglelink.page_main-content').find('a'); + $toggler.click(function (e) { + e.preventDefault(); + if (jQuery('body').hasClass('wide-content')) { + setDefaultContent(); + } else { + setWideContent(); + } + }); + }, + + /** + * Show sidebar when accessing the search + */ + initSearchToggling = function () { + jQuery('.toggleSearch').find('a').click(function (e) { + setDefaultContent(); + e.preventDefault(); + jQuery('#qsearch__in').focus(); + }); + + }, + + /** + * Open and close the sidebar in mobile view + */ + initMobileToggling = function () { + jQuery('.menu-togglelink').find('a').click(function (e) { + e.preventDefault(); + var $body = jQuery('body'); + $body.toggleClass('show-mobile-sidebar'); + }); + }; // main initContentNav(); diff --git a/script.js b/script.js index 0a2e1a0..0636fe1 100755 --- a/script.js +++ b/script.js @@ -6,3 +6,4 @@ /* DOKUWIKI:include js/meta-box.js */ /* DOKUWIKI:include js/sidebar.js */ /* DOKUWIKI:include js/breadcrumb.js */ + diff --git a/style.ini b/style.ini index 40702f8..d29dc7e 100755 --- a/style.ini +++ b/style.ini @@ -160,6 +160,8 @@ __nav_direct_background__ = "#FFF" __nav_direct_color__ = "#286da8" __box_shadow_colored__ = "0 0 .5em rgba(40,109,168,.5)" __box_shadow__ = "0 0 .5em rgb(153,153,153,.5)" +__box_shadow_right_bottom__ = "0.1em 0.3rem 0.5em rgb(153,153,153,.5)" +__box_shadow_bottom__ = "0 0.1em 0.5em rgb(153,153,153,.5)" __box_shadow_offset__ = ".1em .1em .1em rgb(153,153,153,.5)" __nav_menu_color__ = "#696969" __nav_menu_hover_color__ = "#286da8" From d19c9b956a10733e19b591c2b923392cd41c27cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jana=20Deutschla=CC=88nder?= Date: Thu, 2 Mar 2017 17:11:45 +0100 Subject: [PATCH 02/12] SPR-840: debug IE10 (vendor extensions for flex) --- css/area_main-sidebar-nav.less | 3 ++- js/breadcrumb.js | 4 ++-- js/meta-box.js | 6 +++--- js/sidebar.js | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/css/area_main-sidebar-nav.less b/css/area_main-sidebar-nav.less index 7fc4562..35133f7 100755 --- a/css/area_main-sidebar-nav.less +++ b/css/area_main-sidebar-nav.less @@ -16,7 +16,6 @@ a.nav { font-size: @font-size-head6; margin: 0 0 @font-size-head6; - cursor: pointer; font-weight: normal; margin-left: (@menu-margin * -1); // moves the toggles back to the left @@ -27,7 +26,9 @@ height: @icon-size + @margin-small; display: flex; + display: -ms-flexbox; flex-direction: row; + -ms-flex-direction: row; align-items: center; span { diff --git a/js/breadcrumb.js b/js/breadcrumb.js index 4041fab..510c837 100644 --- a/js/breadcrumb.js +++ b/js/breadcrumb.js @@ -2,14 +2,14 @@ * Sets up the breadcrumb behaviour (adds do / ACT status information) */ jQuery(function () { - const $breadcrumb = jQuery('.breadcrumbs'); + var $breadcrumb = jQuery('.breadcrumbs'); if (!$breadcrumb.length) return; /** * add ACT status to breadcrumb (if not show) * */ - const mode = $breadcrumb.attr('data-do'); + var mode = $breadcrumb.attr('data-do'); if(mode && mode.indexOf('show') !== 0){ var markup = ' : ' + mode + ''; $breadcrumb.find('p').append(markup); diff --git a/js/meta-box.js b/js/meta-box.js index 432146e..1b540cf 100755 --- a/js/meta-box.js +++ b/js/meta-box.js @@ -1,5 +1,5 @@ jQuery(function () { - const $metaBox = jQuery('#spr__meta-box'); + var $metaBox = jQuery('#spr__meta-box'); if (!$metaBox.length) return; /** @@ -10,8 +10,8 @@ jQuery(function () { */ $metaBox.on('click', '.meta-tabs a', function (e) { e.preventDefault(); - const $tab = jQuery(this); - const isopen = $tab.attr('aria-expanded') === 'true'; + var $tab = jQuery(this), + isopen = $tab.attr('aria-expanded') === 'true'; // disable all existing tabs $metaBox.find('.meta-tabs li') diff --git a/js/sidebar.js b/js/sidebar.js index 114c11a..18cf739 100644 --- a/js/sidebar.js +++ b/js/sidebar.js @@ -117,7 +117,7 @@ jQuery(function () { initContentMinHeight = function () { var $sidebar = jQuery('.page-wrapper').find('> .tools').find('.col-xs-12'); if ($sidebar.length == 1) { - const num = parseFloat($sidebar.height()); + var num = parseFloat($sidebar.height()); if (!isNaN(num)) { jQuery('#dokuwiki__content').css('minHeight', num + 100); } @@ -128,7 +128,7 @@ jQuery(function () { * Initialize the sidebar handle behaviour */ initSidebarToggling = function () { - const $toggler = jQuery('.togglelink.page_main-content').find('a'); + var $toggler = jQuery('.togglelink.page_main-content').find('a'); $toggler.click(function (e) { e.preventDefault(); if (jQuery('body').hasClass('wide-content')) { From c7f2a9efdc0d6f6209de12686fe02b93953db21a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jana=20Deutschla=CC=88nder?= Date: Thu, 2 Mar 2017 17:56:06 +0100 Subject: [PATCH 03/12] validate template --- main.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.php b/main.php index 8a15db7..65b4546 100755 --- a/main.php +++ b/main.php @@ -363,7 +363,7 @@ $classWideContent = ($ACT === "show") ? "": "wide-content "; /* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ /* copyright */ /* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ - tpl_license(''); + tpl_license($img = false, $imgonly = false, $return = false, $wrap = false); ?>

From 40201e9c65aca443253a21405448c397ef9f4698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jana=20Deutschla=CC=88nder?= Date: Thu, 2 Mar 2017 17:56:57 +0100 Subject: [PATCH 04/12] =?UTF-8?q?mobile=20devices=20portrait:=20don?= =?UTF-8?q?=E2=80=99t=20waste=20too=20much=20space=20on=20left=20/=20right?= =?UTF-8?q?=20margin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- css/area_footer.less | 1 + css/base_structure.less | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/css/area_footer.less b/css/area_footer.less index cd49dcc..d1f887d 100755 --- a/css/area_footer.less +++ b/css/area_footer.less @@ -26,6 +26,7 @@ z-index: 2; box-sizing: border-box; background-color: @color-site-bg; + } p { font-size: @font-size-default; diff --git a/css/base_structure.less b/css/base_structure.less index b7bcae2..8daf866 100755 --- a/css/base_structure.less +++ b/css/base_structure.less @@ -245,3 +245,30 @@ } } } + +@media @screen_max-xxs{ + @mobileMargin: 4px; + .container{ + margin: 0 @mobileMargin; + } + body.show-mobile-sidebar #dokuwiki__aside{ + left: @mobileMargin; + } + #dokuwiki__usertools{ + right: @mobileMargin; + } + #dokuwiki__footer{ + .main-footer{ + > *{ + padding-left: 2rem; + padding-right: 2rem; + } + + } + } + .page-footer{ + + } + +} + From 0503402fda960f02a8581495d5f0cd36e47fd6b8 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Wed, 8 Mar 2017 10:34:23 +0100 Subject: [PATCH 05/12] fixed wrong scope for function definition --- js/sidebar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/sidebar.js b/js/sidebar.js index 18cf739..c7d1104 100644 --- a/js/sidebar.js +++ b/js/sidebar.js @@ -19,7 +19,7 @@ jQuery(function () { setDefaultContent = function () { jQuery('body').removeClass('wide-content'); - }; + }, /** * Accessibility helper, focuses the first link witih the given element From 994d0e8deea27e0c8fc37e7afdad831c294e1fdb Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Wed, 8 Mar 2017 10:43:00 +0100 Subject: [PATCH 06/12] removed old IE shivs and conditionals SPR-801 SPR-823 --- detail.php | 5 ++--- main.php | 23 +---------------------- mediamanager.php | 22 ++-------------------- 3 files changed, 5 insertions(+), 45 deletions(-) diff --git a/detail.php b/detail.php index 21dda38..f010711 100755 --- a/detail.php +++ b/detail.php @@ -1,3 +1,4 @@ + +?> @@ -28,7 +29,6 @@ header('X-UA-Compatible: IE=edge,chrome=1'); -
@@ -89,6 +89,5 @@ header('X-UA-Compatible: IE=edge,chrome=1');
- diff --git a/main.php b/main.php index 65b4546..2934e3f 100755 --- a/main.php +++ b/main.php @@ -17,19 +17,10 @@ $showSidebar = true; /* */ $hasFooter = page_findnearest('pagefooter'); $showFooter = $hasFooter && ($ACT === 'show'); - -/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ -/* conditional comments for IE8 / IE9 browser detection if needed */ -/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ ?> - - - + - - - - - - - + - - - Date: Wed, 8 Mar 2017 14:34:32 +0100 Subject: [PATCH 07/12] Also deploy to the wiki.cosmocode.de farm We want to use the template in other wikis as well. So an auto-update such as this makes sense. --- .gitlab-ci.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 907c2a1..0bc03db 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,15 @@ sprintdoc-farm: environment: sprintdoc-farm + tags: + - locally + only: + - live + script: + - fab deploy + + +cosmocode-farm: + environment: cosmocode-farm tags: - locally only: From 1f3641a82800e91ebfaed80dcbc1e35a818cf20d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Gro=C3=9Fe?= Date: Wed, 15 Mar 2017 18:07:41 +0100 Subject: [PATCH 08/12] Add MagicMatcher Issue list to meta box This adds the issue list to the meta-box. SPR-881 --- Template.php | 11 ++++++++++- css/plugins/magic-matcher.less | 10 ++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Template.php b/Template.php index f1f71f4..68fd351 100644 --- a/Template.php +++ b/Template.php @@ -17,6 +17,7 @@ class Template { protected $plugins = array( 'sqlite' => null, 'tagging' => null, + 'magicmatcher' => null, ); /** @@ -44,6 +45,7 @@ class Template { $this->plugins['sqlite'] = plugin_load('helper', 'sqlite'); if($this->plugins['sqlite']) { $this->plugins['tagging'] = plugin_load('helper', 'tagging'); + $this->plugins['magicmatcher'] = plugin_load('syntax', 'magicmatcher_issuelist'); } } @@ -75,7 +77,14 @@ class Template { ); } - // fixme add magicmatcher info + if ($this->plugins['magicmatcher']) { + $tabs[] = array( + 'id' => 'spr__tab-issues', + 'label' => 'Issues', // FIXME + 'tab' => $this->plugins['magicmatcher']->getIssueListHTML(), + 'count' => $this->plugins['magicmatcher']->getCountIssues(), + ); + } return $tabs; } diff --git a/css/plugins/magic-matcher.less b/css/plugins/magic-matcher.less index 84035fc..6366c45 100755 --- a/css/plugins/magic-matcher.less +++ b/css/plugins/magic-matcher.less @@ -76,6 +76,16 @@ } } + +/* + + + + + in meta box + + + + + */ +#spr__tab-issues { + ul.mmissuelist { + padding-left: 0; + margin-top: 1rem; + } +} + + /* + + + + + in content + + + + + */ a.jiralink { font-size: @font-size-default; From e5d40c9a7e6c9e54acc1faa3017e19db507cce13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Gro=C3=9Fe?= Date: Thu, 16 Mar 2017 13:25:51 +0100 Subject: [PATCH 09/12] Do not show a tab if the content is falsy There may be occasions where plugin does not wish to show any output for the current user/page. In that case the tab should not be shown at all. SPR-895 --- tpl/nav-meta-box.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tpl/nav-meta-box.php b/tpl/nav-meta-box.php index 77328c5..c83145d 100755 --- a/tpl/nav-meta-box.php +++ b/tpl/nav-meta-box.php @@ -9,6 +9,9 @@ $tabs = \dokuwiki\template\sprintdoc\Template::getInstance()->getMetaBoxTabs();
  •  
  • '; echo '