331 lines
9.1 KiB
PHP
331 lines
9.1 KiB
PHP
|
<?php namespace ProcessWire;
|
||
|
|
||
|
if(!defined("PROCESSWIRE")) die();
|
||
|
|
||
|
/** @var AdminThemeUikit $adminTheme */
|
||
|
/** @var Paths $urls */
|
||
|
/** @var Config $config */
|
||
|
/** @var WireInput $input */
|
||
|
/** @var Sanitizer $sanitizer */
|
||
|
/** @var Page $page */
|
||
|
/** @var string $layout */
|
||
|
|
||
|
// whether or not page tree should be used for left sidebar
|
||
|
$treePaneLeft = $adminTheme->layout == 'sidenav-tree';
|
||
|
$treePane = strpos($adminTheme->layout, 'sidenav-tree') === 0;
|
||
|
|
||
|
// define location of panes
|
||
|
$treePaneLocation = $treePaneLeft ? 'west' : 'east';
|
||
|
$sidePaneLocation = $treePaneLeft ? 'east' : 'west';
|
||
|
|
||
|
// URL for main pane
|
||
|
$mainURL = $input->url(true);
|
||
|
if(strpos($mainURL, 'layout=')) {
|
||
|
$mainURL = preg_replace('/([&?]layout)=([-_a-zA-Z0-9]+)/', '$1=sidenav-main', $mainURL);
|
||
|
} else {
|
||
|
$mainURL .= (strpos($mainURL, '?') ? '&' : '?') . 'layout=sidenav-main';
|
||
|
}
|
||
|
$mainURL = $sanitizer->entities($mainURL);
|
||
|
$themeURL = $adminTheme->url();
|
||
|
|
||
|
// pane definition iframes
|
||
|
$panes = array(
|
||
|
'main' => "<iframe id='pw-admin-main' name='main' class='pane ui-layout-center' " .
|
||
|
"src='$mainURL?layout=sidenav-main'></iframe>",
|
||
|
'side' => "<iframe id='pw-admin-side' name='side' class='pane ui-layout-$sidePaneLocation' " .
|
||
|
"src='{$urls->admin}login/?layout=sidenav-side'></iframe>",
|
||
|
'tree' => "<iframe id='pw-admin-tree' name='tree' class='pane ui-layout-$treePaneLocation' " .
|
||
|
"src='{$urls->admin}page/?layout=sidenav-tree'></iframe>",
|
||
|
);
|
||
|
|
||
|
|
||
|
?><!DOCTYPE html>
|
||
|
<html class="pw" lang="<?php echo $adminTheme->_('en');
|
||
|
/* this intentionally on a separate line */ ?>">
|
||
|
<head>
|
||
|
<title></title><?php /* this title is populated dynamically by JS */ ?>
|
||
|
|
||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||
|
<meta name="robots" content="noindex, nofollow" />
|
||
|
<meta name="google" content="notranslate" />
|
||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
|
||
|
<link rel="stylesheet" href="<?php echo $themeURL; ?>layout/source/stable/layout-default.css">
|
||
|
|
||
|
<?php $adminTheme->includeFile('_head.php', array('layout' => $layout)); ?>
|
||
|
|
||
|
<style type='text/css'>
|
||
|
html, body {
|
||
|
width: 100%;
|
||
|
height: 100%;
|
||
|
padding: 0;
|
||
|
margin: 0;
|
||
|
overflow: auto; /* when page gets too small */
|
||
|
}
|
||
|
.pane {
|
||
|
display: none; /* will appear when layout inits */
|
||
|
}
|
||
|
iframe {
|
||
|
margin: 0;
|
||
|
padding: 0;
|
||
|
}
|
||
|
.ui-layout-pane {
|
||
|
padding: 0;
|
||
|
}
|
||
|
#pw-admin-head {
|
||
|
overflow: visible;
|
||
|
}
|
||
|
</style>
|
||
|
|
||
|
<script src="<?php echo $themeURL; ?>layout/source/stable/jquery.layout.js"></script>
|
||
|
<script src="<?php echo $themeURL; ?>layout/source/stable/plugins/jquery.layout.state.js"></script>
|
||
|
</head>
|
||
|
<body class='pw-layout-sidenav-init'>
|
||
|
|
||
|
<?php
|
||
|
if($treePane) {
|
||
|
echo "<div id='pw-admin-head'>";
|
||
|
$adminTheme->includeFile('_masthead.php');
|
||
|
echo "</div>";
|
||
|
}
|
||
|
?>
|
||
|
|
||
|
<div id='pw-layout-container' style='height: calc(100vh - 80px);'>
|
||
|
<?php
|
||
|
echo $panes['main'];
|
||
|
echo $treePane ? $panes['tree'] : $panes['side'] . $panes['tree'];
|
||
|
if($adminTheme->isLoggedIn) {
|
||
|
$adminTheme->includeFile('_offcanvas.php');
|
||
|
}
|
||
|
?>
|
||
|
</div>
|
||
|
|
||
|
<script>
|
||
|
var isPresent = true; // required
|
||
|
var mobileWidth = 959;
|
||
|
|
||
|
function pwInitLayout() {
|
||
|
var windowWidth = $(window).width();
|
||
|
var sidePaneWidth = windowWidth / 4;
|
||
|
var sidePaneMinWidth = 200;
|
||
|
var treePaneWidth = windowWidth / 3;
|
||
|
var treePaneMinWidth = 300;
|
||
|
|
||
|
if(sidePaneWidth < sidePaneMinWidth) sidePaneWidth = sidePaneMinWidth;
|
||
|
if(treePaneWidth < treePaneMinWidth) treePaneWidth = treePaneMinWidth;
|
||
|
|
||
|
var layoutOptions = {
|
||
|
resizable: true,
|
||
|
slidable: true,
|
||
|
closable: true,
|
||
|
maskContents: true,
|
||
|
applyDefaultStyles: false,
|
||
|
fxName: 'none',
|
||
|
stateManagement: {
|
||
|
enabled: true,
|
||
|
stateKeys: "west.size,east.size,west.isClosed,east.isClosed",
|
||
|
autoLoad: true,
|
||
|
autoSave: true
|
||
|
},
|
||
|
<?php
|
||
|
if($treePane) {
|
||
|
echo "$treePaneLocation: { size: treePaneWidth },";
|
||
|
} else {
|
||
|
echo "$sidePaneLocation: { size: sidePaneWidth, initClosed: false },";
|
||
|
echo "$treePaneLocation: { size: treePaneWidth, initClosed: true }";
|
||
|
}
|
||
|
?>
|
||
|
};
|
||
|
|
||
|
// determine if panes should be open or closed by default (depending on screen width)
|
||
|
if(windowWidth < mobileWidth) {
|
||
|
<?php
|
||
|
if($treePane) {
|
||
|
echo "layoutOptions.$treePaneLocation.initClosed = true;";
|
||
|
} else {
|
||
|
echo "layoutOptions.$sidePaneLocation.initClosed = true;";
|
||
|
echo "layoutOptions.$treePaneLocation.initClosed = true;";
|
||
|
}
|
||
|
?>
|
||
|
}
|
||
|
|
||
|
// initialize layout
|
||
|
var layout = $('#pw-layout-container').layout(layoutOptions);
|
||
|
|
||
|
// populate title and url from main pane to this window
|
||
|
$('#pw-admin-main').on('load', function() {
|
||
|
|
||
|
var main = $('#pw-admin-main')[0].contentWindow;
|
||
|
var title = main.document.title;
|
||
|
var href = main.location.href;
|
||
|
|
||
|
if(href.search(/^http[s]?:\/\/<?php echo preg_quote($config->httpHost); ?>/i) !== 0) {
|
||
|
console.log('Invalid main frame http host: ' + href);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if(href.indexOf('layout=')) {
|
||
|
href = href.replace(/([?&]layout)=[-_a-z0-9]+/g, '');
|
||
|
}
|
||
|
|
||
|
window.history.pushState('obj', 'newtitle', href);
|
||
|
$('title').text(title);
|
||
|
});
|
||
|
|
||
|
// window resize event to detect when sidebar(s) should be hidden for mobile
|
||
|
var lastWidth = 0;
|
||
|
$(window).resize(function() {
|
||
|
var width = $(window).width();
|
||
|
if(width <= mobileWidth && (!lastWidth || lastWidth > mobileWidth)) {
|
||
|
<?php echo "if(!layout.state.$sidePaneLocation.isClosed) layout.close('$sidePaneLocation');"; ?>
|
||
|
<?php echo "if(!layout.state.$treePaneLocation.isClosed) layout.close('$treePaneLocation');"; ?>
|
||
|
} else if(lastWidth <= mobileWidth && width > mobileWidth) {
|
||
|
<?php echo "if(layout.state.$sidePaneLocation.isClosed) layout.open('$sidePaneLocation');"; ?>
|
||
|
}
|
||
|
lastWidth = width;
|
||
|
});
|
||
|
|
||
|
// make any links in this file direct to the main pane
|
||
|
$(document).on('mouseover', 'a', ProcessWireAdminTheme.linkTargetMainMouseoverEvent);
|
||
|
|
||
|
// update the uk-active state of top navigation, since this pane doesn't reload
|
||
|
$(document).on('mousedown', 'a', function() {
|
||
|
var $a = $(this);
|
||
|
$('li.uk-active').removeClass('uk-active');
|
||
|
$a.parents('li').each(function() {
|
||
|
$(this).addClass('uk-active');
|
||
|
var $a = $(this).children('a');
|
||
|
var from = $a.attr('data-from');
|
||
|
if(from) $('#' + from).parent('li').addClass('uk-active');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// collapse offcanvas nav when link within it clicked, if it changes the main pane URL
|
||
|
$('#offcanvas-nav').on('click', 'a', function() {
|
||
|
var t, w1 = $('#pw-admin-main')[0].contentWindow.document.location.href;
|
||
|
if(!t) t = setTimeout(function() {
|
||
|
var w2 = $('#pw-admin-main')[0].contentWindow.document.location.href;
|
||
|
if(w1 != w2) $('#offcanvas-toggle').click(); // close
|
||
|
t = false;
|
||
|
}, 1000);
|
||
|
});
|
||
|
|
||
|
return layout;
|
||
|
}
|
||
|
|
||
|
var layout;
|
||
|
|
||
|
$(document).ready(function() {
|
||
|
layout = pwInitLayout();
|
||
|
});
|
||
|
|
||
|
/**
|
||
|
* Are we currently at mobile width?
|
||
|
*
|
||
|
*/
|
||
|
function isMobileWidth() {
|
||
|
var width = $(window).width();
|
||
|
return width <= mobileWidth;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Toggle navigation sidebar pane open/closed
|
||
|
*
|
||
|
*/
|
||
|
function toggleSidebarPane() {
|
||
|
layout.toggle('<?php echo $sidePaneLocation; ?>');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Toggle tree sidebar pane open/closed
|
||
|
*
|
||
|
*/
|
||
|
function toggleTreePane() {
|
||
|
layout.toggle('<?php echo $treePaneLocation; ?>');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Close the tree pane
|
||
|
*
|
||
|
*/
|
||
|
function closeTreePane() {
|
||
|
if(!layout.state.<?php echo $treePaneLocation; ?>.isClosed) {
|
||
|
layout.close('<?php echo $treePaneLocation; ?>');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Hide the tree pane
|
||
|
*
|
||
|
*/
|
||
|
function hideTreePane() {
|
||
|
if(!layout.state.<?php echo $treePaneLocation; ?>.isHidden) {
|
||
|
layout.hide('<?php echo $treePaneLocation; ?>');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Open the tree pane
|
||
|
*
|
||
|
*/
|
||
|
function openTreePane() {
|
||
|
if(layout.state.<?php echo $treePaneLocation; ?>.isClosed) {
|
||
|
layout.open('<?php echo $treePaneLocation; ?>');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Show the tree pane (if hidden)
|
||
|
*
|
||
|
*/
|
||
|
function showTreePane() {
|
||
|
if(layout.state.<?php echo $treePaneLocation; ?>.isHidden) {
|
||
|
layout.show('<?php echo $treePaneLocation; ?>');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Is the tree pane currently closed?
|
||
|
*
|
||
|
*/
|
||
|
function treePaneClosed() {
|
||
|
<?php echo "return layout.state.$treePaneLocation.isClosed;"; ?>
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Is the tree pane currently hidden?
|
||
|
*
|
||
|
*/
|
||
|
function treePaneHidden() {
|
||
|
<?php echo "return layout.state.$treePaneLocation.isHidden;"; ?>
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Is the sidebar pane currently closed?
|
||
|
*
|
||
|
*/
|
||
|
function sidebarPaneClosed() {
|
||
|
<?php echo "return layout.state.$sidePaneLocation.isClosed;"; ?>
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Reload/refresh the tree pane, optionally for children of specific page ID
|
||
|
*
|
||
|
* If page ID provided, it refreshes just children of that page ID.
|
||
|
* If no argument provided, then it refreshes the entire pane.
|
||
|
*
|
||
|
*/
|
||
|
function refreshTreePane(pageID) {
|
||
|
var pane = $('#pw-admin-tree')[0].contentWindow;
|
||
|
if(typeof pageID == "undefined") {
|
||
|
pane.location.reload(true);
|
||
|
} else if(typeof pane.pageListRefresh != "undefined") {
|
||
|
pane.pageListRefresh.refreshPage(pageID);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
</script>
|
||
|
|
||
|
</body>
|
||
|
</html>
|