diff options
Diffstat (limited to '')
-rw-r--r-- | application/layouts/scripts/body.phtml | 98 | ||||
-rw-r--r-- | application/layouts/scripts/external-logout.phtml | 34 | ||||
-rw-r--r-- | application/layouts/scripts/guest-error.phtml | 10 | ||||
-rw-r--r-- | application/layouts/scripts/inline.phtml | 2 | ||||
-rw-r--r-- | application/layouts/scripts/layout.phtml | 107 | ||||
-rw-r--r-- | application/layouts/scripts/parts/navigation.phtml | 35 | ||||
-rw-r--r-- | application/layouts/scripts/pdf.phtml | 44 |
7 files changed, 330 insertions, 0 deletions
diff --git a/application/layouts/scripts/body.phtml b/application/layouts/scripts/body.phtml new file mode 100644 index 0000000..87b570b --- /dev/null +++ b/application/layouts/scripts/body.phtml @@ -0,0 +1,98 @@ +<?php + +use Icinga\Web\Url; +use Icinga\Web\Notification; +use Icinga\Authentication\Auth; +use ipl\Html\HtmlString; +use ipl\Web\Widget\Icon; + +$moduleName = $this->layout()->moduleName; +if ($moduleName !== 'default') { + $moduleClass = ' icinga-module module-' . $moduleName; +} else { + $moduleClass = ''; +} + +$refresh = ''; +if ($this->layout()->autorefreshInterval) { + $refresh = ' data-icinga-refresh="' . $this->layout()->autorefreshInterval . '"'; +} + +if ($this->layout()->inlineLayout) { + $inlineLayoutScript = $this->layout()->inlineLayout . '.phtml'; +} else { + $inlineLayoutScript = 'inline.phtml'; +} + +?> +<div id="header"> + <div id="announcements" class="container"> + <?= $this->widget('announcements') ?> + </div> +</div> +<div id="content-wrapper"> +<?php if (! $this->layout()->isIframe): ?> + <div id="sidebar"> + <div id="header-logo-container"> + <?= $this->qlink( + '', + Auth::getInstance()->isAuthenticated() ? 'dashboard' : '', + null, + array( + 'aria-hidden' => 'true', + 'data-base-target' => '_main', + 'id' => 'header-logo' + ) + ); ?> + <div id="mobile-menu-toggle"> + <button type="button"><?= $this->icon('menu') ?><?= $this->icon('cancel') ?></button> + </div> + </div> + <?= $this->render('parts/navigation.phtml'); ?> + </div> +<?php endif ?> + <div id="main" role="main"> + <div id="col1" + class="container<?= $moduleClass ?>" + <?php if ($moduleName): ?> + data-icinga-module="<?= $moduleName ?>" + <?php endif ?> + data-icinga-url="<?= $this->escape(Url::fromRequest()->without('renderLayout')->getAbsoluteUrl()); ?>" + <?= $refresh; ?> + > + <?= $this->render($inlineLayoutScript) ?> + </div> + <div id="col2" class="container"></div> + <div id="col3" class="container"></div> + </div> +</div> +<div id="footer"> + <ul role="alert" id="notifications"><?php + + $notifications = Notification::getInstance(); + if ($notifications->hasMessages()) { + foreach ($notifications->popMessages() as $m) { + switch ($m->type) { + case 'success': + $icon = new HtmlString(new Icon('check-circle')); + break; + case 'error': + $icon = new HtmlString(new Icon('times')); + break; + case 'warning': + $icon = new HtmlString(new Icon('exclamation-triangle')); + break; + case 'info': + $icon = new HtmlString(new Icon('info-circle')); + break; + default: + $icon = ''; + break; + } + + echo '<li class="' . $m->type . '">' . $icon . $this->escape($m->message) . '</li>'; + } + } + ?></ul> + <div id="application-state-summary" class="container" data-icinga-url="<?= $this->url('application-state/summary') ?>" data-last-update="-1" data-icinga-refresh="60"></div> +</div> diff --git a/application/layouts/scripts/external-logout.phtml b/application/layouts/scripts/external-logout.phtml new file mode 100644 index 0000000..19b7e32 --- /dev/null +++ b/application/layouts/scripts/external-logout.phtml @@ -0,0 +1,34 @@ +<?php + +use ipl\I18n\Locale; +use ipl\I18n\GettextTranslator; +use ipl\I18n\StaticTranslator; + +/** @var GettextTranslator $translator */ +$translator = StaticTranslator::$instance; + +$lang = (new Locale())->parseLocale($translator->getLocale())->language; +$showFullscreen = $this->layout()->showFullscreen; +$innerLayoutScript = $this->layout()->innerLayout . '.phtml'; + +?><!DOCTYPE html> +<html class="no-js" lang="<?= $lang ?>"> +<head> + <meta charset="utf-8"> + <meta name="google" value="notranslate"> + <meta http-equiv="cleartype" content="on"> + <title><?= $this->title ? $this->escape($this->title) : $this->defaultTitle ?></title> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"> + <meta name="apple-mobile-web-app-capable" content="yes"> + <meta name="application-name" content="Icinga Web 2"> + <meta name="apple-mobile-web-app-title" content="Icinga"> + <link rel="mask-icon" href="<?= $this->baseUrl('img/website-icon.svg') ?>" color="#0096BF"> + <link type="image/png" rel="shortcut icon" href="<?= $this->baseUrl('img/favicon.png') ?>" /> + <link rel="apple-touch-icon" href="<?= $this->baseUrl('img/touch-icon.png') ?>"> +</head> +<body id="body"> +<div id="layout" class="default-layout<?php if ($showFullscreen): ?> fullscreen-layout<?php endif ?>"> + <?= $this->render($innerLayoutScript); ?> +</div> +</body> +</html> diff --git a/application/layouts/scripts/guest-error.phtml b/application/layouts/scripts/guest-error.phtml new file mode 100644 index 0000000..49cdd68 --- /dev/null +++ b/application/layouts/scripts/guest-error.phtml @@ -0,0 +1,10 @@ +<div id="guest-error"> + <div class="centered-ghost"> + <div class="centered-content"> + <div id="icinga-logo" aria-hidden="true"></div> + <div id="guest-error-message"> + <?= $this->render('inline.phtml') ?> + </div> + </div> + </div> +</div> diff --git a/application/layouts/scripts/inline.phtml b/application/layouts/scripts/inline.phtml new file mode 100644 index 0000000..47d5672 --- /dev/null +++ b/application/layouts/scripts/inline.phtml @@ -0,0 +1,2 @@ +<?= $this->layout()->content ?> +<?= $this->layout()->benchmark ?> diff --git a/application/layouts/scripts/layout.phtml b/application/layouts/scripts/layout.phtml new file mode 100644 index 0000000..880c2a9 --- /dev/null +++ b/application/layouts/scripts/layout.phtml @@ -0,0 +1,107 @@ +<?php + +use ipl\I18n\Locale; +use ipl\I18n\GettextTranslator; +use ipl\I18n\StaticTranslator; +use ipl\Web\Widget\Icon; + +if (array_key_exists('_dev', $_GET)) { + $jsfile = 'js/icinga.dev.js'; + $cssfile = 'css/icinga.css'; +} else { + $jsfile = 'js/icinga.min.js'; + $cssfile = 'css/icinga.min.css'; +} + +/** @var GettextTranslator $translator */ +$translator = StaticTranslator::$instance; + +$lang = (new Locale())->parseLocale($translator->getLocale())->language; +$timezone = date_default_timezone_get(); +$isIframe = $this->layout()->isIframe; +$showFullscreen = $this->layout()->showFullscreen; +$iframeClass = $isIframe ? ' iframe' : ''; +$innerLayoutScript = $this->layout()->innerLayout . '.phtml'; + +?><!DOCTYPE html> +<html class="no-js<?= $iframeClass ?>" lang="<?= $lang ?>"> +<head> + <meta charset="utf-8"> + <meta name="google" value="notranslate"> + <meta http-equiv="cleartype" content="on"> + <title><?= $this->title ? $this->escape($this->title) . ' :: ' : '' ?><?= $this->defaultTitle ?></title> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"> + <meta name="apple-mobile-web-app-capable" content="yes"> + <meta name="application-name" content="Icinga Web 2"> + <meta name="apple-mobile-web-app-title" content="Icinga"> + <link rel="mask-icon" href="<?= $this->baseUrl('img/website-icon.svg') ?>" color="#0096BF"> +<?php if ($isIframe): ?> + <base target="_parent"> +<?php else: ?> + <base href="<?= $this->baseUrl(); ?>/"> + <script type="text/javascript"> + (function() { + var html = document.getElementsByTagName('html')[0]; + html.className = html.className.replace(/no-js/, 'js'); + }()); + </script> +<?php endif ?> + <link rel="stylesheet" href="<?= $this->href($cssfile) ?>" media="all" type="text/css" /> + <link type="image/png" rel="shortcut icon" href="<?= $this->baseUrl('img/favicon.png') ?>" /> + <link rel="apple-touch-icon" href="<?= $this->baseUrl('img/touch-icon.png') ?>"> +</head> +<body id="body" class="loading"> +<pre id="responsive-debug"></pre> +<div id="layout" class="default-layout<?php if ($showFullscreen): ?> fullscreen-layout<?php endif ?>"> +<?= $this->render($innerLayoutScript); ?> +</div> +<script type="text/javascript"> + (function() { + if (document.defaultView && document.defaultView.getComputedStyle) { + var matched; + var html = document.getElementsByTagName('html')[0]; + var element = document.getElementById('layout'); + var name = document.defaultView + .getComputedStyle(html)['font-family'] + .replace(/['",]/g, ''); + + if (null !== (matched = name.match(/^([a-z]+)-layout$/))) { + element.className = element.className.replace('default-layout', name); + if ('object' === typeof window.console) { + window.console.log('Icinga Web 2: setting initial layout to ' + name); + } + } + } + }()); +</script> +<div id="collapsible-control-ghost" class="collapsible-control"> + <button type="button"> + <!-- TODO: Accessibility attributes are missing since usage of the Icon class --> + <?= new Icon('angle-double-down', ['class' => 'expand-icon', 'title' => $this->translate('Expand')]) ?> + <?= new Icon('angle-double-up', ['class' => 'collapse-icon', 'title' => $this->translate('Collapse')]) ?> + </button> +</div> +<div id="modal-ghost"> + <div> + <section class="modal-window"> + <div class="modal-header"> + <h1></h1> + <button type="button"><?= $this->icon('cancel') ?></button> + </div> + <div class="modal-area"> + <div id="modal-content" data-base-target="modal-content" tabindex data-no-icinga-ajax></div> + </div> + </section> + </div> +</div> +<script type="text/javascript" src="<?= $this->href($jsfile) ?>"></script> +<script type="text/javascript"> +window.name = '<?= $this->protectId('Icinga') ?>'; +var icinga = new Icinga({ + baseUrl: '<?= $this->baseUrl(); ?>', + locale: '<?= $lang; ?>', + timezone: '<?= $timezone ?>' +}); +</script> +</body> +</html> diff --git a/application/layouts/scripts/parts/navigation.phtml b/application/layouts/scripts/parts/navigation.phtml new file mode 100644 index 0000000..dd973f5 --- /dev/null +++ b/application/layouts/scripts/parts/navigation.phtml @@ -0,0 +1,35 @@ +<?php + +use Icinga\Web\Menu; + +// Don't render a menu for unauthenticated users unless menu is auth aware +if (! $this->auth()->isAuthenticated()) { + return; +} + +?> +<div class="skip-links"> + <h1 class="sr-only"><?= t('Accessibility Skip Links') ?></h1> + <ul> + <li> + <a href="#main"><?= t('Skip to Content') ?></a> + </li> + <li> + <?= $this->layout()->autoRefreshForm ?> + </li> + </ul> +</div> +<div id="menu" data-last-update="-1" data-base-target="_main" class="container" + data-icinga-url="<?= $this->href('layout/menu') ?>" data-icinga-refresh="15"> + <?= $this->partial( + 'layout/menu.phtml', + 'default', + array( + 'menuRenderer' => (new Menu())->getRenderer()->setUseStandardItemRenderer() + ) + ) ?> +</div> +<button id="toggle-sidebar" title="<?= $this->translate('Toggle Menu') ?>"> + <i id="close-sidebar" class="icon-angle-double-left"></i> + <i id="open-sidebar" class="icon-angle-double-right"></i> +</button> diff --git a/application/layouts/scripts/pdf.phtml b/application/layouts/scripts/pdf.phtml new file mode 100644 index 0000000..87d07f8 --- /dev/null +++ b/application/layouts/scripts/pdf.phtml @@ -0,0 +1,44 @@ +<?php + +use Icinga\Application\Icinga; +use Icinga\Web\StyleSheet; + + +$moduleName = $this->layout()->moduleName; +if ($moduleName !== 'default') { + $moduleClass = ' icinga-module module-' . $moduleName; +} else { + $moduleClass = ''; +} + +$logoPath = Icinga::app()->getBootstrapDirectory() . '/img/icinga-logo-big-dark.png'; +$logo = base64_encode(file_get_contents($logoPath)); + + +?><!DOCTYPE html> +<html> +<head> +<style> +<?= StyleSheet::forPdf() ?> +</style> +<base href="<?= $this->serverUrl() ?>"> +</head> +<body> +<div id="header"> + <table> + <tbody> + <tr> + <th class="title"><?= $this->escape($this->title) ?></th> + <td style="text-align: right;"><img width="75" src="data:image/png;base64,<?= $logo ?>"></td> + </tr> + </tbody> + </table> +</div> +<div id="footer"> + <div class="page-number"></div> +</div> +<div class="<?= $moduleClass ?>"> + <?= $this->render('inline.phtml') ?> +</div> +</body> +</html> |