<!DOCTYPE html>
<html lang="{{ lang['langcode'] }}" class="no-js">
	<head>
		<meta name="viewport" content="width=device-width">
		<meta http-equiv="Content-Type" content="text/html; charset={{ lang['encoding'] }}"/>
		<title>{{ home_title }}
			-
			{{ lang['adminpanel'] }}</title>
		<link href='{{ home }}/favicon.ico' rel='shortcut icon'>
		<link href='{{ hone }}/favicon.png' rel='shortcut icon'>
		<link href="{{ skins_url }}/public/css/app.css" rel="stylesheet"/>
		<link rel='stylesheet' href='//fonts.googleapis.com/css?family=Noto+Sans%3A400italic%2C700italic%2C400%2C700%7CNoto+Serif%3A400italic%2C700italic%2C400%2C700%7CInconsolata%3A400%2C700&#038;subset=latin%2Clatin-ext%2Ccyrillic%2Ccyrillic-ext'/>
		<link rel='stylesheet' href="{{ skins_url }}/genericons/genericons.css"/>
		<link rel='stylesheet' href="{{ skins_url }}/css/style.css"/>
		<!--[if IE 6]><link rel="stylesheet" href="{{ skins_url }}/ilight/css/jquery.lightbox.ie6.css"><![endif]-->
		<!--[if lte IE 7]><link href="{{ skins_url }}/css/old_ie.css" rel="stylesheet" ><![endif]-->
		<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet"> <!--[if lt IE 9]>
			<link rel='stylesheet' id='twentyfifteen-ie-css'  href="{{ skins_url }}/css/ie.css"/>
			<![endif]-->
		<!--[if lt IE 8]>
		<link rel='stylesheet' id='twentyfifteen-ie7-css'  href="{{ skins_url }}/css/ie7.css"/>
		<![endif]--><script src="{{ skins_url }}/public/js/manifest.js" type="text/javascript"> </script>
		<script src="{{ skins_url }}/public/js/vendor.js" type="text/javascript"></script>
		<script src="{{ skins_url }}/public/js/app.js" type="text/javascript"></script>
		<script src="{{ skins_url }}/public/js/notify.js" type="text/javascript"></script>
		<!--[if lt IE 9]>
		<script src="{{ skins_url }}/js/html5.js" ></script>
		<![endif]-->
		<script>
			(function () {
document.documentElement.className = 'js'
})();
		</script>
		<script type="text/javascript" src="{{ home }}/lib/ajax.js"></script>
		<script type="text/javascript" src="{{ home }}/lib/libsuggest.js"></script>
		<script src="{{ skins_url }}/public/js/notify.js" type="text/javascript"></script>
		<script type="text/javascript">
			// Переопределяем глобальную post(), чтобы уважать флаг notify (тихий режим) и исключить двойные уведомления
window.post = function (methodName, params, notify) {
var n = (arguments.length < 3 || typeof notify === 'undefined') ? true : !! notify;
var token = $('input[name="token"]').val();
return $.ajax({
method: 'POST',
url: NGCMS.admin_url + '/rpc.php',
dataType: 'json',
headers: {
'X-CSRF-TOKEN': token,
'X-Requested-With': 'XMLHttpRequest'
},
data: {
json: 1,
token: token,
methodName: methodName,
params: JSON.stringify(params || {})
},
beforeSend: function () {
if (typeof window.ngShowLoading === 'function')
window.ngShowLoading();

}
}).then(function (resp) {
if (! resp || ! resp.status) {
var ex = {
message: 'Error [' + (
resp && resp.errorCode
) + ']: ' + (
resp && resp.errorText
),
response: resp
};
return $.Deferred().reject(ex).promise();
}
return resp;
}).done(function (resp) {
if (n && typeof window.ngNotifySticker === 'function') {
window.ngNotifySticker(resp.errorText, {
className: 'alert-success',
closeBTN: true
});
}
return resp;
}).fail(function (err) {
if (n && typeof window.ngNotifySticker === 'function') {
var fallbackMsg = (window.NGCMS && NGCMS.lang && NGCMS.lang.rpc_httpError) || 'Request error';
window.ngNotifySticker(err.message || fallbackMsg, {
className: 'alert-danger',
closeBTN: true
});
}
}).always(function () {
if (typeof window.ngHideLoading === 'function')
window.ngHideLoading();

});
};
		</script>
	</head>
	<body class="home blog custom-background">
		<div id="loading-layer" style="display:none">
			<div id="loading-layer-text">{{ lang['loading'] }}</div>
		</div>
		<!-- Overlay для затемнения фона -->
		<div class="side-panel-overlay" id="sidePanelOverlay"></div>
		<!-- Выдвижная панель справа -->
		<div
			class="side-panel" id="sidePanel">
			<!-- Кнопка меню - часть панели -->
			<button class="floating-menu-btn" id="toggleSidePanel" title="Быстрое меню">
				<i class="fa fa-cog"></i>
			</button>
			<div class="side-panel-header">
				<h3>
					<i class="fa fa-cog"></i>
					Быстрые действия</h3>
			</div>
			<div class="side-panel-content">
				<ul class="side-panel-menu">
					<li>
						<a href="#" data-toggle="modal" data-target="#notificationsModal">
							<i class="fa fa-bell-o fa-lg"></i>
							{{ lang['notifications']|default('Уведомления') }}
							<span class="badge badge-danger ml-2">{{ unnAppLabel }}</span>
						</a>
					</li>
					{% if perm.cache %}
						<li>
							<a href="#" id="btn-clear-cache-side">
								<i class="fa fa-refresh fa-lg"></i>
								{{ lang['cache.clean']|default('Очистить кеш') }}
							</a>
						</li>
					{% endif %}
					<li>
						<a href="#" data-toggle="modal" data-target="#addContentModal">
							<i class="fa fa-plus fa-lg"></i>
							{{ lang['content.add']|default('Добавить контент') }}
						</a>
					</li>
					<li>
						<a href="#" data-toggle="modal" data-target="#userProfileModal">
							<i class="fa fa-user-o fa-lg"></i>
							{{ lang['user.profile']|default('Профиль пользователя') }}
						</a>
					</li>
				</ul>
			</div>
		</div>
		<div id="page" class="hfeed site">
			<a class="skip-link screen-reader-text" href="#contenter">Перейти к содержимому</a>
			<div id="sidebar" class="sidebar">
				<header id="masthead" class="site-header" role="banner">
					<div class="site-branding">
						<h1 class="site-title">
							<a href="{{ php_self }}" rel="home" title="{{ lang['admin_panel'] }}">{{ lang['admin_panel'] }}</a>
						</h1>
						<button class="secondary-toggle">Меню и виджеты</button>
					</div>
					<!-- .site-branding -->
				</header>
				<!-- .site-header -->
				<div id="secondary" class="secondary">
					<nav id="site-navigation" class="main-navigation" role="navigation">
						<div class="menu-header-menu-container">
							<ul>
								<li>
									<a href="{{ home }}" target="_blank">
										<i class="fa fa-external-link"></i>
										{{ lang['mainpage'] }}</a>
								</li>
								{%
								set showContent = global.mod == 'news'
									or global.mod == 'categories'
									or global.mod == 'static'
									or global.mod == 'images'
									or global.mod == 'files'
							%}
								{% if (perm.editnews) %}
									<li>
										<a href="{{ php_self }}?mod=news">
											<i class="fa fa-newspaper-o"></i>
											{{ lang['news.edit'] }}</a>
									</li>
								{% endif %}
								{% if (perm.categories) %}
									<li>
										<a href="{{ php_self }}?mod=categories">
											<i class="fa fa-folder-open"></i>
											{{ lang['news.categories'] }}</a>
									</li>
								{% endif %}
								{% if (perm.static) %}
									<li>
										<a href="{{ php_self }}?mod=static">
											<i class="fa fa-file-text-o"></i>
											{{ lang['static'] }}</a>
									</li>
								{% endif %}
								{% if (perm.addnews) %}
									<li>
										<a href="{{ php_self }}?mod=news&action=add">
											<i class="fa fa-plus"></i>
											{{ lang['news.add'] }}</a>
									</li>
								{% endif %}
								<li>
									<a href="{{ php_self }}?mod=images">
										<i class="fa fa-image"></i>
										{{ lang['images'] }}</a>
								</li>
								<li>
									<a href="{{ php_self }}?mod=files">
										<i class="fa fa-file"></i>
										{{ lang['files'] }}</a>
								</li>
								{% if comments_moderation_enabled and pluginIsActive('comments') %}
									<li>
										<a href="{{ php_self }}?plugin=comments&handler=moderation">
											<i class="fa fa-comments"></i>
											{{ lang['comments_moderation'] }}</a>
									</li>
								{% endif %}
								{%
								set showUsers = global.mod == 'users'
									or global.mod == 'ipban'
									or global.mod == 'ugroup'
									or global.mod == 'perm'
							%}
								{% if (perm.users) %}
									<li>
										<a href="{{ php_self }}?mod=users">
											<i class="fa fa-user"></i>
											{{ lang['users'] }}</a>
									</li>
								{% endif %}
								{% if (perm.ipban) %}
									<li>
										<a href="{{ php_self }}?mod=ipban">
											<i class="fa fa-ban"></i>
											{{ lang['ipban_m'] }}</a>
									</li>
								{% endif %}
								<li>
									<a href="{{ php_self }}?mod=ugroup">
										<i class="fa fa-users"></i>
										{{ lang['ugroup'] }}</a>
								</li>
								<li>
									<a href="{{ php_self }}?mod=perm">
										<i class="fa fa-lock"></i>
										{{ lang['uperm'] }}</a>
								</li>
								{%
								set showService = global.mod == 'configuration'
									or global.mod == 'dbo'
									or global.mod == 'rewrite'
									or global.mod == 'cron'
									or global.mod == 'statistics'
							%}
								{% if (perm.configuration) %}
									<li>
										<a href="{{ php_self }}?mod=configuration">
											<i class="fa fa-cog"></i>
											{{ lang['configuration'] }}</a>
									</li>
								{% endif %}
								{% if (perm.dbo) %}
									<li>
										<a href="{{ php_self }}?mod=dbo">
											<i class="fa fa-database"></i>
											{{ lang['options_database'] }}</a>
									</li>
								{% endif %}
								{% if (perm.rewrite) %}
									<li>
										<a href="{{ php_self }}?mod=rewrite">
											<i class="fa fa-link"></i>
											{{ lang['rewrite'] }}</a>
									</li>
								{% endif %}
								{% if (perm.cron) %}
									<li>
										<a href="{{ php_self }}?mod=cron">
											<i class="fa fa-calendar"></i>
											{{ lang['cron_m'] }}</a>
									</li>
								{% endif %}
								<li>
									<a href="{{ php_self }}?mod=statistics">
										<i class="fa fa-bar-chart"></i>
										{{ lang['statistics'] }}
									</a>
								</li>
								<li class="{{ h_active_extras ? 'active' : '' }} ">
									<a href="{{ php_self }}?mod=extras">
										<i class="fa fa-puzzle-piece"></i>
										{{ lang['extras'] }}</a>
								</li>
								{% if (perm.templates) %}
									<li class="{{ h_active_templates ? 'active' : '' }} ">
										<a href="{{ php_self }}?mod=templates">
											<i class="fa fa-th-large"></i>
											{{ lang['templates_m'] }}</a>
									</li>
								{% endif %}
								<hr>
								<li>
									<a href="{{ php_self }}?mod=docs">
										<i class="fa fa-book" aria-hidden="true"></i>
										Документация</a>
								</li>
								<li>
									<a href="https://forum.ngcms.org" target="_blank">
										<i class="fa fa-comments-o" aria-hidden="true"></i>
										Форум поддержки</a>
								</li>
								<li>
									<a href="https://ngcms.org/" target="_blank">
										<i class="fa fa-globe fa-lg"></i>
										Официальный сайт</a>
								</li>
								<li>
									<a href="https://github.com/irbees2008/ngcms-core" target="_blank">
										<i class="fa fa-github"></i>
										Github</a>
								</li>
							</ul>
						</div>
					</nav>
				</div>
				<!-- .secondary -->
			</div>
			<!-- .sidebar -->
			<div id="contenter" class="site-content">
				<div id="primary" class="content-area">
					<main id="main" class="site-main" role="main">
						{{ notify }}
						{{ main_admin }}
					</main>
				</div>
			</div>
			<!-- .site-content -->
			<footer id="colophon" class="site-footer" role="contentinfo">
				<div class="site-info">
					<p>
						<a href="{{ php_self }}">Главная админки</a>&nbsp;|
						<a href="https://forum.ngcms.org/">
							Форум NG</a>&nbsp;|
						<a href="https://templates.ngcms.org/">
							Шаблоны</a>
					</p>
				</div>
				<!-- .site-info -->
			</footer>
			<!-- .site-footer -->
		</div>
		<!-- .site -->
		<!-- Модальное окно для уведомлений -->
		<div class="modal fade" id="notificationsModal" tabindex="-1" role="dialog" aria-labelledby="notificationsModalLabel" aria-hidden="true">
			<div class="modal-dialog" role="document">
				<div class="modal-content">
					<div class="modal-header">
						<h5 class="modal-title" id="notificationsModalLabel">Уведомления -
							{{ unnAppText }}</h5>
						<button type="button" class="close" data-dismiss="modal" aria-label="Close">
							<span aria-hidden="true">&times;</span>
						</button>
					</div>
					<div class="modal-body">
						{{ unapproved1 }}
						{{ unapproved2 }}
						{{ unapproved3 }}
						<a class="dropdown-item" href="{{ php_self }}?mod=pm" title="{{ lang['pm_t'] }}">
							<i class="fa fa-envelope-o"></i>
							{{ newpmText }}
							{% if newpm > 0 %}
								<span class="badge badge-danger ml-2">{{ newpm }}</span>
							{% endif %}
						</a>
					</div>
				</div>
			</div>
		</div>
		<!-- Модальное окно для добавления контента -->
		<div class="modal fade" id="addContentModal" tabindex="-1" role="dialog" aria-labelledby="addContentModalLabel" aria-hidden="true">
			<div class="modal-dialog" role="document">
				<div class="modal-content">
					<div class="modal-header">
						<h5 class="modal-title" id="addContentModalLabel">Добавить контент</h5>
						<button type="button" class="close" data-dismiss="modal" aria-label="Close">
							<span aria-hidden="true">&times;</span>
						</button>
					</div>
					<div class="modal-body">
						<a class="btn btn-outline-success btn-custom" href="{{ php_self }}?mod=news&action=add">
							<i class="fa fa-newspaper-o" aria-hidden="true"></i>
							<i class="fa fa-plus"></i>
							{{ lang['head_add_news'] }}
						</a>
						<a class="btn btn-outline-success btn-custom" href="{{ php_self }}?mod=categories&action=add">
							<i class="fa fa-list" aria-hidden="true"></i>
							<i class="fa fa-plus"></i>
							{{ lang['head_add_cat'] }}
						</a>
						<a class="btn btn-outline-success btn-custom" href="{{ php_self }}?mod=static&action=addForm">
							<i class="fa fa-file-o" aria-hidden="true"></i>
							<i class="fa fa-plus"></i>
							{{ lang['head_add_stat'] }}
						</a>
						<a class="btn btn-outline-success btn-custom add_form" href="{{ php_self }}?mod=users">
							<i class="fa fa-user-o" aria-hidden="true"></i>
							<i class="fa fa-plus"></i>
							{{ lang['head_add_user'] }}
						</a>
						<a class="btn btn-outline-success btn-custom" href="{{ php_self }}?mod=images">
							<i class="fa fa-picture-o" aria-hidden="true"></i>
							<i class="fa fa-plus"></i>
							{{ lang['head_add_images'] }}
						</a>
						<a class="btn btn-outline-success btn-custom" href="{{ php_self }}?mod=files">
							<i class="fa fa-folder-o" aria-hidden="true"></i>
							<i class="fa fa-plus"></i>
							{{ lang['head_add_files'] }}
						</a>
					</div>
				</div>
			</div>
		</div>
		<!-- Модальное окно для профиля пользователя -->
		<div class="modal fade" id="userProfileModal" tabindex="-1" role="dialog" aria-labelledby="userProfileModalLabel" aria-hidden="true">
			<div class="modal-dialog modal-dialog-centered" role="document">
				<div class="modal-content">
					<div
						class="modal-body card card-widget widget-user">
						<!-- Add the bg color to the header using any of the bg-* classes -->
						<div class="widget-user-header bg-info text-right">
							<h3 class="widget-user-username">{{ user.name }}</h3>
							<h5 class="widget-user-desc">{{ skin_UStatus }}</h5>
						</div>
						<div class="widget-user-image">
							<img class="img-circle elevation-2" src="{{ skin_UAvatar }}" alt="User Avatar">
						</div>
						<div class="card-footer">
							<div class="row">
								<div class="col-sm-6 border-right">
									<div class="description-block">
										<a class="btn btn-block btn-outline-success btn-flat" href="?mod=users&action=editForm&id={{ user.id }}" title="{{ lang['loc_profile'] }}">
											<i class="fa fa-user-o"></i>
											{{ lang['loc_profile'] }}
										</a>
									</div>
									<!-- /.description-block -->
								</div>
								<!-- /.col -->
								<div class="col-sm-6">
									<div class="description-block">
										<a class="btn btn-block btn-outline-danger btn-flat" href="{{ php_self }}?action=logout" title="{{ lang['logout'] }}">
											<i class="fa fa-sign-out"></i>
											{{ lang['logout'] }}
										</a>
									</div>
									<!-- /.description-block -->
								</div>
								<!-- /.col -->
							</div>
							<!-- /.row -->
						</div>
						<!-- /.widget-user -->
					</div>
				</div>
			</div>
			<script type="text/javascript">
				{% set encode_lang = lang | json_encode(constant('JSON_PRETTY_PRINT') b-or constant('JSON_UNESCAPED_UNICODE')) %}
window.NGCMS = {
admin_url: '{{ admin_url }}',
home: '{{ home }}',
lang: {{ encode_lang ?: '{}' }},
langcode: '{{ lang['langcode'] }}',
php_self: '{{ php_self }}',
skins_url: '{{ skins_url }}'
};
$('#menu-content .sub-menu').on('show.bs.collapse', function () {
$('#menu-content .sub-menu.show').not(this).removeClass('show');
});
// Очистка кэшей браузера: localStorage, sessionStorage, Cache Storage
async function clearBrowserCaches() {
try {
try {
window.localStorage && window.localStorage.clear();
} catch (e) {}
try {
window.sessionStorage && window.sessionStorage.clear();
} catch (e) {}
if (window.caches && caches.keys) {
const keys = await caches.keys();
await Promise.all(keys.map((k) => caches.delete(k)));
}
return true;
} catch (e) {
return false;
}
}
// Хендлер кнопки очистки кэша
// Универсальный показ уведомлений: showToast -> $.notify -> ngNotifySticker -> alert
function showNotify(message, type) { // 1) Предпочитаем наши тосты (vanilla, без зависимостей)
try {
if (typeof window.showToast === 'function') {
var map = {
danger: 'error',
error: 'error',
warning: 'warning',
success: 'success',
info: 'info'
};
var t = map[(type || 'info')] || 'info';
var titles = {
error: 'Ошибка',
warning: 'Внимание',
success: 'Готово',
info: 'Info'
};
window.showToast(String(message), {
type: t,
title: titles[t] || '',
sticked: t === 'error'
});
return;
}
} catch (e) {}
// 2) Fallback на bootstrap-notify (если подключён)
try {
if (window.$ && typeof $.notify === 'function') {
$.notify({
message: String(message)
}, {
type: type || 'info'
});
return;
}
} catch (e) {}
// 3) Fallback на старый ngNotifySticker
try {
if (typeof ngNotifySticker === 'function') {
var cls = 'alert-' + (
type || 'info'
);
ngNotifySticker(String(message), {
className: cls,
closeBTN: true
});
return;
}
} catch (e) {}
// 4) Самый простой fallback
try {
alert(String(message));
} catch (e) {}
}
async function handleTopbarClearCacheClick(ev) {
ev && ev.preventDefault && ev.preventDefault();
const browserOk = await clearBrowserCaches();
// Вызов RPC admin.statistics.cleanCache
try {
const resp = await $.ajax({
method: 'POST',
url: NGCMS.admin_url + '/rpc.php',
dataType: 'json',
data: {
json: 1,
methodName: 'admin.statistics.cleanCache',
params: JSON.stringify(
{token: '{{ token_statistics|e('js') }}'}
)
}
});
if (resp && resp.status) {
showNotify('{{ lang['notify.cache.server_ok']|e('js') }}', 'success');
} else {
showNotify('{{ lang['notify.cache.server_fail']|e('js') }}', 'danger');
}
} catch (e) {
showNotify('{{ lang['notify.cache.server_fail']|e('js') }}', 'danger');
}
// Браузер
if (browserOk) {
showNotify('{{ lang['notify.cache.browser_ok']|e('js') }}', 'success');
} else {
showNotify('{{ lang['notify.cache.browser_fail']|e('js') }}', 'warning');
}
return false;
}
document.addEventListener('DOMContentLoaded', function () {
var btn = document.getElementById('btn-clear-cache');
if (btn) {
btn.addEventListener('click', handleTopbarClearCacheClick);
}
// Инициализация Bootstrap tooltip
if (typeof $.fn.tooltip !== 'undefined') {
$('[data-bs-toggle="tooltip"]').tooltip();
}
});
			</script>
			<script>
				$(document).ready(function () { // Функция для определения ширины скроллбара
function getScrollbarWidth() {
var outer = document.createElement("div");
outer.style.visibility = "hidden";
outer.style.width = "100px";
outer.style.msOverflowStyle = "scrollbar"; // needed for WinJS apps
document.body.appendChild(outer);
var widthNoScroll = outer.offsetWidth;
// force scrollbars
outer.style.overflow = "scroll";
// add inner div
var inner = document.createElement("div");
inner.style.width = "100%";
outer.appendChild(inner);
var widthWithScroll = inner.offsetWidth;
// remove divs
outer.parentNode.removeChild(outer);
return widthNoScroll - widthWithScroll;
}
// Сохраняем ширину скроллбара в переменную
var scrollbarWidth = getScrollbarWidth();
// При открытии модального окна
$('.modal').on('show.bs.modal', function () {
if ($('body').height() > $(window).height()) {
$('body').addClass('modal-scrollbar-compensate');
}
$('body').addClass('modal-open-no-scroll');
});
// При закрытии модального окна
$('.modal').on('hidden.bs.modal', function () {
$('body').removeClass('modal-scrollbar-compensate');
$('body').removeClass('modal-open-no-scroll');
});
// Добавляем компенсацию ширины скроллбара
$(window).on('resize', function () {
if ($('body').hasClass('modal-scrollbar-compensate')) {
if (scrollbarWidth) {
$('body').css('margin-right', scrollbarWidth);
} else {
$('body').css('margin-right', '17px'); // Задаём стандартное значение на случай если не удалось определить ширину скроллбара
}
} else {
$('body').css('margin-right', '0');
}
}).trigger('resize');
});
			</script>
			<!-- Скрипт для выдвижной панели -->
			<script>
				$(document).ready(function () { // Toggle (открыть/закрыть) панель по кнопке
$('#toggleSidePanel').click(function () {
$('#sidePanel').toggleClass('active');
$('#sidePanelOverlay').toggleClass('active');
});
// Закрыть панель
$('#closeSidePanel, #sidePanelOverlay').click(function () {
$('#sidePanel').removeClass('active');
$('#sidePanelOverlay').removeClass('active');
});
// Закрыть по ESC
$(document).keydown(function (e) {
if (e.key === 'Escape' && $('#sidePanel').hasClass('active')) {
$('#sidePanel').removeClass('active');
$('#sidePanelOverlay').removeClass('active');
}
});
// Обработчик кнопки очистки кэша в боковой панели
$('#btn-clear-cache-side').click(function (e) {
e.preventDefault();
// Закрываем панель
$('#sidePanel').removeClass('active');
$('#sidePanelOverlay').removeClass('active');
// Вызываем функцию очистки кэша
if (typeof handleTopbarClearCacheClick === 'function') {
handleTopbarClearCacheClick(e);
}
});
});
			</script>
		</body>
	</body>
</html>
