feat: VivesPOS landing on Winter CMS 1.2 — theme + plugin + Dockerfile
Some checks are pending
Module sub-split / Sub-split (push) Waiting to run
Some checks are pending
Module sub-split / Sub-split (push) Waiting to run
- Base: wintercms/winter branch 1.2 (full framework) - Theme vivespos: Canvas 7 + Bootstrap 5 CDN, custom CSS - Layout: deferred GTM/GA4 tracking, JSON-LD SoftwareApplication - Partials: hero (offline-first), features, modes (offline/nube toggle), screenshots, pricing (3 planes), comparison, FAQ, CTA - Plugin VivesPOS.Site with ContactForm - Dockerfile: PHP 8.2 Apache, port 80, healthcheck - Added winter/wn-pages, blog, sitemap, seo plugins - Active theme set to vivespos
This commit is contained in:
22
modules/backend/layouts/_breadcrumb.php
Normal file
22
modules/backend/layouts/_breadcrumb.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
$menu = \Backend\Facades\BackendMenu::getActiveMainMenuItem();
|
||||
$context = \Backend\Facades\BackendMenu::getContext();
|
||||
$sideMenu = $menu->sideMenu[$context->sideMenuCode ?? null] ?? null;
|
||||
$settingsManager = \System\Classes\SettingsManager::instance();
|
||||
$settingsContext = $settingsManager->getContext();
|
||||
$settingsItem = null;
|
||||
if ($settingsContext) {
|
||||
$settingsItem = $settingsManager->findSettingItem($settingsContext->owner, $settingsContext->itemCode);
|
||||
}
|
||||
?>
|
||||
<?php if ($menu): ?>
|
||||
<ul>
|
||||
<li><a href="<?= $menu->url ?>"><?= e(trans($menu->label)) ?></a></li>
|
||||
<?php if ($sideMenu && $sideMenu->url !== $menu->url): ?>
|
||||
<li><a href="<?= $sideMenu->url ?>"><?= e(trans($sideMenu->label)) ?></a></li>
|
||||
<?php elseif ($settingsItem): ?>
|
||||
<li><a href="<?= $settingsItem->url ?>"><?= e(trans($settingsItem->label)) ?></a></li>
|
||||
<?php endif; ?>
|
||||
<li><?= e(trans($this->pageTitle)) ?></li>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
74
modules/backend/layouts/_browser_detector.php
Normal file
74
modules/backend/layouts/_browser_detector.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* PHP CSS Browser Selector v0.0.1
|
||||
* Bastian Allgeier (http://bastian-allgeier.de)
|
||||
* http://bastian-allgeier.de/css_browser_selector
|
||||
* License: http://creativecommons.org/licenses/by/2.5/
|
||||
* Credits: This is a php port from Rafael Lima's original Javascript CSS Browser Selector: http://rafael.adm.br/css_browser_selector
|
||||
*/
|
||||
|
||||
$ua = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : null;
|
||||
if (!$ua) {
|
||||
return;
|
||||
}
|
||||
|
||||
$g = 'gecko';
|
||||
$w = 'webkit';
|
||||
$s = 'safari';
|
||||
$m = 'mobile';
|
||||
$b = [];
|
||||
|
||||
// browser
|
||||
if (!preg_match('/opera|webtv/i', $ua) && preg_match('/msie\s(\d)/', $ua, $array)) {
|
||||
$b[] = 'ie ie' . $array[1];
|
||||
} elseif (strstr($ua, 'firefox/2')) {
|
||||
$b[] = $g . ' ff2';
|
||||
} elseif (strstr($ua, 'firefox/3.5')) {
|
||||
$b[] = $g . ' ff3 ff3_5';
|
||||
} elseif (strstr($ua, 'firefox/3')) {
|
||||
$b[] = $g . ' ff3';
|
||||
} elseif (strstr($ua, 'gecko/')) {
|
||||
$b[] = $g;
|
||||
} elseif (preg_match('/opera(\s|\/)(\d+)/', $ua, $array)) {
|
||||
$b[] = 'opera opera' . $array[2];
|
||||
} elseif (strstr($ua, 'konqueror')) {
|
||||
$b[] = 'konqueror';
|
||||
} elseif (strstr($ua, 'chrome')) {
|
||||
$b[] = $w . ' ' . $s . ' chrome';
|
||||
} elseif (strstr($ua, 'iron')) {
|
||||
$b[] = $w . ' ' . $s . ' iron';
|
||||
} elseif (strstr($ua, 'applewebkit/')) {
|
||||
$b[] = (preg_match('/version\/(\d+)/i', $ua, $array)) ? $w . ' ' . $s . ' ' . $s . $array[1] : $w . ' ' . $s;
|
||||
} elseif (strstr($ua, 'mozilla/')) {
|
||||
$b[] = $g;
|
||||
}
|
||||
|
||||
// platform
|
||||
if (strstr($ua, 'j2me')) {
|
||||
$b[] = $m . ' j2me';
|
||||
} elseif (strstr($ua, 'iphone')) {
|
||||
$b[] = $m . ' iphone';
|
||||
} elseif (strstr($ua, 'ipod')) {
|
||||
$b[] = $m . ' ipod';
|
||||
} elseif (strstr($ua, 'ipad')) {
|
||||
$b[] = $m . ' ipad';
|
||||
} elseif (strstr($ua, 'android')) {
|
||||
$b[] = $m . ' android';
|
||||
} elseif (strstr($ua, 'blackberry')) {
|
||||
$b[] = $m . ' blackberry';
|
||||
} elseif (strstr($ua, 'mac')) {
|
||||
$b[] = 'mac';
|
||||
} elseif (strstr($ua, 'darwin')) {
|
||||
$b[] = 'mac';
|
||||
} elseif (strstr($ua, 'webtv')) {
|
||||
$b[] = 'webtv';
|
||||
} elseif (strstr($ua, 'win')) {
|
||||
$b[] = 'win';
|
||||
} elseif (strstr($ua, 'freebsd')) {
|
||||
$b[] = 'freebsd';
|
||||
} elseif (strstr($ua, 'x11') || strstr($ua, 'linux')) {
|
||||
$b[] = 'linux';
|
||||
}
|
||||
|
||||
echo join(' ', $b);
|
||||
14
modules/backend/layouts/_custom_styles.php
Normal file
14
modules/backend/layouts/_custom_styles.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
use Backend\Models\BrandSetting;
|
||||
use Backend\Models\EditorSetting;
|
||||
?>
|
||||
<?php if (BrandSetting::isConfigured() || BrandSetting::isBaseConfigured()): ?>
|
||||
<style>
|
||||
<?= BrandSetting::renderCss() ?>
|
||||
</style>
|
||||
<?php endif ?>
|
||||
<?php if (EditorSetting::isConfigured()): ?>
|
||||
<style>
|
||||
<?= EditorSetting::renderCss() ?>
|
||||
</style>
|
||||
<?php endif ?>
|
||||
3
modules/backend/layouts/_flash_messages.php
Normal file
3
modules/backend/layouts/_flash_messages.php
Normal file
@@ -0,0 +1,3 @@
|
||||
<?php foreach (Flash::all() as $type => $message): ?>
|
||||
<p data-control="flash-message" class="flash-message fade <?= $type ?>" data-interval="5"><?= e($message) ?></p>
|
||||
<?php endforeach ?>
|
||||
9
modules/backend/layouts/_footer.php
Normal file
9
modules/backend/layouts/_footer.php
Normal file
@@ -0,0 +1,9 @@
|
||||
<footer id="layout-footer">
|
||||
<div class="brand">
|
||||
<span class="logo"><i class="icon-leaf"></i></span>
|
||||
<span class="name"><?= e(trans('system::lang.app.name')) ?></span>
|
||||
</div>
|
||||
<div class="tagline">
|
||||
<p><?= e(trans('system::lang.app.tagline')) ?></p>
|
||||
</div>
|
||||
</footer>
|
||||
86
modules/backend/layouts/_head.php
Normal file
86
modules/backend/layouts/_head.php
Normal file
@@ -0,0 +1,86 @@
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimal-ui">
|
||||
<meta name="robots" content="noindex">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="app-timezone" content="<?= e(Config::get('app.timezone')) ?>">
|
||||
<meta name="backend-base-path" content="<?= Backend::baseUrl() ?>">
|
||||
<meta name="backend-timezone" content="<?= e(Backend\Models\Preference::get('timezone')) ?>">
|
||||
<meta name="backend-locale" content="<?= e(Backend\Models\Preference::get('locale')) ?>">
|
||||
<meta name="csrf-token" content="<?= csrf_token() ?>">
|
||||
<link rel="icon" type="image/png" href="<?= e(Backend\Models\BrandSetting::getFavicon()) ?>">
|
||||
<title data-title-template="<?= empty($this->pageTitleTemplate) ? '%s' : e($this->pageTitleTemplate) ?> | <?= e(Backend\Models\BrandSetting::get('app_name')) ?>">
|
||||
<?= e(trans($this->pageTitle)) ?> | <?= e(Backend\Models\BrandSetting::get('app_name')) ?>
|
||||
</title>
|
||||
<link rel="asset_url" href="<?= e(Url::asset('')); ?>">
|
||||
<?php
|
||||
// Styles
|
||||
$styles = [
|
||||
Url::asset('modules/system/assets/ui/storm.css'),
|
||||
Url::asset('modules/system/assets/ui/icons.css'),
|
||||
Backend::skinAsset('assets/css/winter.css'),
|
||||
];
|
||||
foreach ($styles as $style) {
|
||||
$this->addCss($style, [
|
||||
'build' => 'core',
|
||||
'order' => 1,
|
||||
]);
|
||||
}
|
||||
|
||||
// Scripts
|
||||
$scripts = [
|
||||
Backend::skinAsset('assets/js/vendor/jquery.min.js'),
|
||||
Backend::skinAsset('assets/js/vendor/jquery-migrate.min.js'),
|
||||
Url::asset('modules/system/assets/js/framework.js'),
|
||||
Url::asset('modules/system/assets/js/build/manifest.js'),
|
||||
Url::asset('modules/system/assets/js/snowboard/build/snowboard.vendor.js'),
|
||||
Url::asset(
|
||||
(Config::get('develop.debugSnowboard', false) === true)
|
||||
? 'modules/system/assets/js/build/system.debug.js'
|
||||
: 'modules/system/assets/js/build/system.js'
|
||||
),
|
||||
Url::asset('modules/backend/assets/ui/js/build/manifest.js'),
|
||||
Url::asset('modules/backend/assets/ui/js/build/vendor.js'),
|
||||
Url::asset('modules/backend/assets/ui/js/build/backend.js'),
|
||||
];
|
||||
if (Config::get('develop.decompileBackendAssets', false)) {
|
||||
$scripts = array_merge($scripts, Backend::decompileAsset('modules/system/assets/ui/storm.js'));
|
||||
$scripts = array_merge($scripts, Backend::decompileAsset('assets/js/winter.js', true));
|
||||
} else {
|
||||
$scripts = array_merge($scripts, [Url::asset('modules/system/assets/ui/storm-min.js')]);
|
||||
$scripts = array_merge($scripts, [Backend::skinAsset('assets/js/winter-min.js')]);
|
||||
}
|
||||
$scripts = array_merge($scripts, [
|
||||
Url::asset('modules/system/assets/js/lang/lang.'.App::getLocale().'.js'),
|
||||
Backend::skinAsset('assets/js/winter.flyout.js'),
|
||||
Backend::skinAsset('assets/js/winter.tabformexpandcontrols.js'),
|
||||
]);
|
||||
foreach ($scripts as $script) {
|
||||
$this->addJs($script, [
|
||||
'build' => 'core',
|
||||
'order' => 1,
|
||||
]);
|
||||
}
|
||||
?>
|
||||
|
||||
<?php if (!Config::get('cms.enableBackendServiceWorkers', false)): ?>
|
||||
<script>
|
||||
"use strict";
|
||||
/* Only run on HTTPS connections
|
||||
* Block off Front-end Service Worker from running in the Backend allowing security injections, see GitHub #4384
|
||||
*/
|
||||
if (location.protocol === 'https:') {
|
||||
// Unregister all service workers before signing in to prevent cache issues, see github issue: #3707
|
||||
navigator.serviceWorker.getRegistrations().then(
|
||||
function (registrations) {
|
||||
registrations.forEach(function (registration) {
|
||||
registration.unregister();
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
|
||||
<?= $this->makeAssets() ?>
|
||||
<?= Block::placeholder('head') ?>
|
||||
<?= $this->makeLayoutPartial('custom_styles') ?>
|
||||
46
modules/backend/layouts/_hint.php
Normal file
46
modules/backend/layouts/_hint.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php if (empty($hintName) || !$this->isBackendHintHidden($hintName)): ?>
|
||||
<?php
|
||||
$type = !empty($type) ? $type : 'info';
|
||||
$cssClasses = ['callout fade in'];
|
||||
$cssClasses[] = 'callout-'.$type;
|
||||
if (empty($icon)) {
|
||||
$cssClasses[] = 'no-icon';
|
||||
}
|
||||
if (empty($subtitle)) {
|
||||
$cssClasses[] = 'no-subheader';
|
||||
}
|
||||
if (!empty($cssClass)) {
|
||||
$cssClasses[] = $cssClass;
|
||||
}
|
||||
?>
|
||||
|
||||
<div class="<?= implode(' ', $cssClasses) ?>">
|
||||
<?php if (!empty($hintName)): ?>
|
||||
<button
|
||||
type="button"
|
||||
class="close"
|
||||
data-request="onHideBackendHint"
|
||||
data-request-data="name: '<?= $hintName ?>'"
|
||||
data-dismiss="callout"
|
||||
aria-hidden="true">×</button>
|
||||
<?php endif ?>
|
||||
<?php if (!empty($title)): ?>
|
||||
<div class="header">
|
||||
<?php if (!empty($icon)): ?>
|
||||
<i class="<?= $icon ?>"></i>
|
||||
<?php endif ?>
|
||||
<h3><?= $title ?></h3>
|
||||
<?php if (!empty($subtitle)): ?>
|
||||
<p><?= $subtitle ?></p>
|
||||
<?php endif ?>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
<div class="content">
|
||||
<?php if ($hintContent): ?>
|
||||
<?= $hintContent ?>
|
||||
<?php else: ?>
|
||||
<?= $this->makePartial($hintPartial, $hintParams) ?>
|
||||
<?php endif ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
108
modules/backend/layouts/_mainmenu.php
Normal file
108
modules/backend/layouts/_mainmenu.php
Normal file
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
$activeItem = BackendMenu::getActiveMainMenuItem();
|
||||
$mySettings = System\Classes\SettingsManager::instance()->listItems('mysettings');
|
||||
$navbarMode = Backend\Models\BrandSetting::get('menu_mode', 'inline');
|
||||
?>
|
||||
|
||||
<nav class="navbar control-toolbar navbar-mode-<?= $navbarMode ?>" id="layout-mainmenu" role="navigation">
|
||||
<div class="toolbar-item toolbar-primary">
|
||||
<div data-control="toolbar" data-use-native-drag="true">
|
||||
<a class="menu-toggle" href="javascript:;">
|
||||
<span class="menu-toggle-icon">
|
||||
<i class="icon-bars"></i>
|
||||
</span>
|
||||
<span class="menu-toggle-title">
|
||||
<?= $activeItem ? e(trans($activeItem->label)) : 'CMS' ?>
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<ul class="nav mainmenu-nav">
|
||||
<?php foreach (BackendMenu::listMainMenuItems() as $item): ?>
|
||||
<?php
|
||||
$isActive = BackendMenu::isMainMenuItemActive($item);
|
||||
?>
|
||||
<li class="<?= $isActive ? 'active' : null ?> svg-icon-container svg-active-effects">
|
||||
<a href="<?= $item->url ?>">
|
||||
<span class="nav-icon">
|
||||
<?php if ($item->iconSvg): ?>
|
||||
<img
|
||||
src="<?= Url::asset($item->iconSvg) ?>"
|
||||
class="svg-icon" loading="lazy" width="30" height="30" />
|
||||
<?php endif ?>
|
||||
|
||||
<i class="<?= $item->iconSvg ? 'svg-replace' : null ?> <?= $item->icon ?>"></i>
|
||||
</span>
|
||||
<span class="nav-label">
|
||||
<?= e(trans($item->label)) ?>
|
||||
</span>
|
||||
</a>
|
||||
<span
|
||||
class="counter <?= !$item->counter ? 'empty' : null ?>"
|
||||
data-menu-id="<?= e($item->code) ?>"
|
||||
<?php if ($item->counterLabel): ?>
|
||||
title="<?= e(trans($item->counterLabel)) ?>"
|
||||
<?php endif ?>
|
||||
>
|
||||
<?= e($item->counter) ?>
|
||||
</span>
|
||||
</li>
|
||||
<?php endforeach ?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="toolbar-item toolbar-item-account">
|
||||
<ul class="mainmenu-toolbar">
|
||||
<?php foreach (BackendMenu::listQuickActionItems() as $item): ?>
|
||||
<li class="mainmenu-quick-action with-tooltip">
|
||||
<a
|
||||
href="<?= $item->url ?>"
|
||||
title="<?= e(trans($item->label)) ?>"
|
||||
<?= Html::attributes($item->attributes) ?>
|
||||
>
|
||||
|
||||
<?php if ($item->iconSvg): ?>
|
||||
<img
|
||||
src="<?= Url::asset($item->iconSvg) ?>"
|
||||
class="svg-icon" loading="lazy" width="20" height="20" />
|
||||
<?php endif ?>
|
||||
|
||||
<i class="<?= $item->iconSvg ? 'svg-replace' : null ?> <?= $item->icon ?>"></i>
|
||||
</a>
|
||||
</li>
|
||||
<?php endforeach ?>
|
||||
<li class="mainmenu-account with-tooltip">
|
||||
<a
|
||||
href="javascript:;" onclick="$.wn.layout.toggleAccountMenu(this)"
|
||||
title="<?= e(trans('backend::lang.account.signed_in_as', ['full_name' => $this->user->full_name])) ?>">
|
||||
<img
|
||||
src="<?= $this->user->getAvatarThumb(90, ['mode' => 'crop', 'extension' => 'png']) ?>"
|
||||
class="account-avatar" loading="lazy" width="90" height="90" />
|
||||
</a>
|
||||
<div class="mainmenu-accountmenu">
|
||||
<ul>
|
||||
<?php foreach ($mySettings as $category => $items): ?>
|
||||
<?php foreach ($items as $item): ?>
|
||||
<li>
|
||||
<a href="<?= $item->url ?>">
|
||||
<?= e(trans($item->label)) ?>
|
||||
</a>
|
||||
</li>
|
||||
<?php endforeach ?>
|
||||
<li class="divider"></li>
|
||||
<?php endforeach ?>
|
||||
|
||||
<li>
|
||||
<a href="<?= Backend::url('backend/auth/signout') ?>">
|
||||
<?php if (\BackendAuth::isImpersonator()): ?>
|
||||
<?= e(trans('backend::lang.account.stop_impersonating')) ?>
|
||||
<?php else: ?>
|
||||
<?= e(trans('backend::lang.account.sign_out')) ?>
|
||||
<?php endif; ?>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
53
modules/backend/layouts/_sidenav.php
Normal file
53
modules/backend/layouts/_sidenav.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
$context = BackendMenu::getContext();
|
||||
$contextSidenav = BackendMenu::getContextSidenavPartial($context->owner, $context->mainMenuCode);
|
||||
?>
|
||||
<?php if (!$contextSidenav): ?>
|
||||
<?php
|
||||
$sideMenuItems = BackendMenu::listSideMenuItems();
|
||||
?>
|
||||
<?php if ($sideMenuItems): ?>
|
||||
<div class="layout-cell layout-sidenav-container">
|
||||
<div class="layout-relative">
|
||||
<nav
|
||||
id="layout-sidenav"
|
||||
class="layout-sidenav bg-p"
|
||||
data-active-class="active"
|
||||
data-control="sidenav">
|
||||
<ul class="nav">
|
||||
<?php foreach ($sideMenuItems as $sideItemCode => $item): ?>
|
||||
<li
|
||||
class="<?= BackendMenu::isSideMenuItemActive($item) ? 'active' : null ?>"
|
||||
<?= Html::attributes($item->attributes) ?>
|
||||
>
|
||||
<a href="<?= $item->url ?>">
|
||||
<span class="nav-icon">
|
||||
<?php if ($item->iconSvg): ?>
|
||||
<img class="svg-icon" src="<?= Url::asset($item->iconSvg) ?>">
|
||||
<?php endif ?>
|
||||
|
||||
<i class="<?= $item->iconSvg ? 'svg-replace' : null ?> <?= $item->icon ?>"></i>
|
||||
</span>
|
||||
<span class="nav-label">
|
||||
<?= e(trans($item->label)) ?>
|
||||
</span>
|
||||
</a>
|
||||
<span
|
||||
class="counter <?= $item->counter === null ? 'empty' : null ?>"
|
||||
data-menu-id="<?= e($context->mainMenuCode.'/'.$sideItemCode) ?>"
|
||||
<?php if ($item->counterLabel): ?>
|
||||
title="<?= e(trans($item->counterLabel)) ?>"
|
||||
<?php endif ?>
|
||||
>
|
||||
<?= e($item->counter) ?>
|
||||
</span>
|
||||
</li>
|
||||
<?php endforeach ?>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
<?php else: ?>
|
||||
<?= $this->makePartial($contextSidenav) ?>
|
||||
<?php endif ?>
|
||||
92
modules/backend/layouts/auth.php
Normal file
92
modules/backend/layouts/auth.php
Normal file
@@ -0,0 +1,92 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="<?= App::getLocale() ?>" class="no-js">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=0">
|
||||
<meta name="robots" content="noindex">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="backend-base-path" content="<?= Backend::baseUrl() ?>">
|
||||
<meta name="csrf-token" content="<?= csrf_token() ?>">
|
||||
<link rel="icon" type="image/png" href="<?= e(Backend\Models\BrandSetting::getFavicon()) ?>">
|
||||
<title><?= e(trans('backend::lang.auth.title')) ?></title>
|
||||
<link rel="asset_url" href="<?= e(Url::asset('')); ?>">
|
||||
|
||||
<?php
|
||||
$coreBuild = System\Models\Parameter::get('system::core.build', 1);
|
||||
$styles = [
|
||||
Url::asset('modules/system/assets/ui/storm.css'),
|
||||
Url::asset('modules/system/assets/ui/icons.css'),
|
||||
Backend::skinAsset('assets/css/winter.css'),
|
||||
];
|
||||
foreach ($styles as $style) {
|
||||
$this->addCss($style, [
|
||||
'build' => 'core',
|
||||
'order' => 1,
|
||||
]);
|
||||
}
|
||||
$scripts = [
|
||||
Backend::skinAsset('assets/js/vendor/jquery.min.js'),
|
||||
Backend::skinAsset('assets/js/vendor/jquery-migrate.min.js'),
|
||||
Url::asset('modules/system/assets/js/framework.js'),
|
||||
Url::asset('modules/system/assets/ui/storm-min.js'),
|
||||
Backend::skinAsset('assets/js/winter-min.js'),
|
||||
Url::asset('modules/backend/assets/js/auth/auth.js'),
|
||||
Url::asset('modules/system/assets/js/lang/lang.'.App::getLocale().'.js'),
|
||||
];
|
||||
foreach ($scripts as $script) {
|
||||
$this->addJs($script, [
|
||||
'build' => 'core',
|
||||
'order' => 1,
|
||||
]);
|
||||
}
|
||||
?>
|
||||
|
||||
<?php if (!Config::get('cms.enableBackendServiceWorkers', false)): ?>
|
||||
<script>
|
||||
"use strict";
|
||||
/* Only run on HTTPS connections
|
||||
* Block off Front-end Service Worker from running in the Backend allowing security injections, see GitHub #4384
|
||||
*/
|
||||
if (location.protocol === 'https:') {
|
||||
// Unregister all service workers before signing in to prevent cache issues, see github issue: #3707
|
||||
navigator.serviceWorker.getRegistrations().then(
|
||||
function (registrations) {
|
||||
registrations.forEach(function (registration) {
|
||||
registration.unregister();
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
|
||||
<?= $this->makeAssets() ?>
|
||||
<?= Block::placeholder('head') ?>
|
||||
<?= $this->makeLayoutPartial('custom_styles') ?>
|
||||
<?= $this->fireViewEvent('backend.layout.extendHead', ['layout' => 'auth']) ?>
|
||||
</head>
|
||||
<body class="outer <?= $this->bodyClass ?>">
|
||||
<div id="layout-canvas">
|
||||
<div class="layout">
|
||||
|
||||
<div class="layout-row min-size layout-head">
|
||||
<div class="layout-cell">
|
||||
<h1 class="wn-logo"><?= e(Backend\Models\BrandSetting::get('app_name')) ?></h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layout-row">
|
||||
<div class="layout-cell">
|
||||
<div class="outer-form-container">
|
||||
<?= Block::placeholder('body') ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Flash Messages -->
|
||||
<div id="layout-flash-messages"><?= $this->makeLayoutPartial('flash_messages') ?></div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
88
modules/backend/layouts/default.php
Normal file
88
modules/backend/layouts/default.php
Normal file
@@ -0,0 +1,88 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="<?= App::getLocale() ?>" class="no-js <?= $this->makeLayoutPartial('browser_detector') ?>">
|
||||
<head>
|
||||
<?= $this->makeLayoutPartial('head') ?>
|
||||
<?= $this->fireViewEvent('backend.layout.extendHead', ['layout' => 'default']) ?>
|
||||
</head>
|
||||
<body class="<?= $this->bodyClass ?>">
|
||||
<div id="layout-canvas">
|
||||
<?php if (\BackendAuth::isImpersonator()): ?>
|
||||
<div class="global-notice">
|
||||
<div class="notice-content">
|
||||
<span class="notice-text">
|
||||
<span class="notice-icon wn-icon icon-exclamation-triangle"></span>
|
||||
<?= e(trans('backend::lang.account.impersonating', [
|
||||
'impersonator' => \BackendAuth::getImpersonator()->email,
|
||||
'impersonatee' => \BackendAuth::getUser()->email,
|
||||
])); ?>
|
||||
</span>
|
||||
</div>
|
||||
<a href="<?= Backend::url('backend/auth/signout') ?>" class="notice-action btn btn-secondary">
|
||||
<?= e(trans('backend::lang.account.stop_impersonating')) ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="layout">
|
||||
|
||||
<!-- Main Menu -->
|
||||
<div class="layout-row min-size">
|
||||
<?= $this->makeLayoutPartial('mainmenu') ?>
|
||||
</div>
|
||||
|
||||
<?php $flyoutContent = Block::placeholder('sidepanel-flyout') ?>
|
||||
|
||||
<div class="layout-row">
|
||||
<div class="layout flyout-container"
|
||||
<?php if ($flyoutContent): ?>
|
||||
data-control="flyout"
|
||||
data-flyout-width="400"
|
||||
data-flyout-toggle="#layout-sidenav"
|
||||
<?php endif ?>
|
||||
>
|
||||
<?php if ($flyoutContent): ?>
|
||||
<div class="layout-cell flyout"> <?= $flyoutContent ?></div>
|
||||
<?php endif ?>
|
||||
|
||||
<!-- Side Navigation -->
|
||||
<?= $this->makeLayoutPartial('sidenav') ?>
|
||||
|
||||
<!-- Side panel -->
|
||||
<?php if ($sidePanelContent = Block::placeholder('sidepanel')): ?>
|
||||
<div class="layout-cell w-350 hide-on-small" id="layout-side-panel" data-control="layout-sidepanel">
|
||||
<?= $sidePanelContent ?>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
|
||||
<!-- Content Body -->
|
||||
<div class="layout-cell layout-container" id="layout-body">
|
||||
<div class="layout-relative">
|
||||
|
||||
<div class="layout">
|
||||
<?php if ($breadcrumbContent = Block::placeholder('breadcrumb')): ?>
|
||||
<!-- Breadcrumb -->
|
||||
<div class="control-breadcrumb">
|
||||
<?= $breadcrumbContent ?>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="layout-row">
|
||||
<?= Block::placeholder('body') ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Flash Messages -->
|
||||
<div id="layout-flash-messages"><?= $this->makeLayoutPartial('flash_messages') ?></div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
32
modules/backend/layouts/form-with-sidebar.php
Normal file
32
modules/backend/layouts/form-with-sidebar.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<div class="layout responsive-sidebar">
|
||||
<div class="layout-cell">
|
||||
|
||||
<div class="layout">
|
||||
<?php if ($breadcrumbContent = Block::placeholder('breadcrumb')): ?>
|
||||
<!-- Breadcrumb -->
|
||||
<div class="control-breadcrumb breadcrumb-flush">
|
||||
<?= $breadcrumbContent ?>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="layout-row">
|
||||
<div class="padded-container layout">
|
||||
<?= Block::placeholder('form-contents') ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="layout-cell w-300 form-sidebar control-scrollpanel">
|
||||
<div class="layout-relative">
|
||||
<div class="layout-absolute">
|
||||
<div class="control-scrollbar" data-control="scrollbar">
|
||||
<div class="padded-container">
|
||||
<?= Block::placeholder('form-sidebar') ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user