templates/admin/base.html.twig line 1

Open in your IDE?
  1. <!DOCTYPE html>
  2. <html data-menu-color="light" data-sidebar="default">
  3.   <head>
  4.     <meta charset="utf-8" />
  5.     <title>{% block title %}Админ-панель{% endblock %} - PlayPapa Admin</title>
  6.     <meta name="viewport" content="width=device-width, initial-scale=1" />
  7.     <meta name="description" content="PlayPapa admin panel" />
  8.     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  9.     <link rel="shortcut icon" href="/images/favicon.ico" />
  10.     {% block css %}{% endblock %}
  11.     <link href="/css/app.min.css" rel="stylesheet" type="text/css" id="app-style" />
  12.     <link href="/css/icons.min.css" rel="stylesheet" type="text/css" />
  13.     <link href="/admin-candy.css" rel="stylesheet" type="text/css" />
  14.     <script src="/js/head.js"></script>
  15.   </head>
  16.   {% set admin_user = admin_user|default({'id': 0, 'login': 'Admin', 'img': '/assets/profile.svg'}) %}
  17.   <body data-menu-color="light" data-sidebar="default">
  18.     <div id="app-layout">
  19.       <div class="topbar-custom">
  20.         <div class="container-fluid">
  21.           <div class="d-flex justify-content-between">
  22.             <ul class="list-unstyled topnav-menu mb-0 d-flex align-items-center">
  23.               <li>
  24.                 <button class="button-toggle-menu nav-link" type="button">
  25.                   <i data-feather="menu" class="noti-icon"></i>
  26.                 </button>
  27.               </li>
  28.               <li class="d-none d-lg-block">
  29.                 <h5 class="mb-0">Привет, {{ admin_user.login }}</h5>
  30.               </li>
  31.             </ul>
  32.             <ul class="list-unstyled topnav-menu mb-0 d-flex align-items-center">
  33.               <li class="d-none d-sm-flex">
  34.                 <button type="button" class="btn nav-link" id="light-dark-mode">
  35.                   <i data-feather="moon" class="align-middle dark-mode"></i>
  36.                   <i data-feather="sun" class="align-middle light-mode"></i>
  37.                 </button>
  38.               </li>
  39.               <li class="dropdown notification-list topbar-dropdown">
  40.                 <a class="nav-link dropdown-toggle nav-user me-0" data-bs-toggle="dropdown" href="#" role="button" aria-haspopup="false" aria-expanded="false">
  41.                   <img src="{{ admin_user.img ?: '/assets/profile.svg' }}" alt="user-image" class="rounded-circle" />
  42.                   <span class="pro-user-name ms-1">{{ admin_user.login }} <i class="mdi mdi-chevron-down"></i></span>
  43.                 </a>
  44.                 <div class="dropdown-menu dropdown-menu-end profile-dropdown">
  45.                   <div class="dropdown-header noti-title">
  46.                     <h6 class="text-overflow m-0">PlayPapa Admin</h6>
  47.                   </div>
  48.                   {% if admin_user.id %}
  49.                     <a href="{{ path('admin_user_edit', {'id': admin_user.id}) }}" class="dropdown-item notify-item">
  50.                       <i class="mdi mdi-account-circle-outline fs-16 align-middle"></i>
  51.                       <span>Мой аккаунт</span>
  52.                     </a>
  53.                   {% endif %}
  54.                   <a href="/" class="dropdown-item notify-item">
  55.                     <i class="mdi mdi-location-exit fs-16 align-middle"></i>
  56.                     <span>Вернуться на сайт</span>
  57.                   </a>
  58.                 </div>
  59.               </li>
  60.             </ul>
  61.           </div>
  62.         </div>
  63.       </div>
  64.       <div class="app-sidebar-menu">
  65.         <div class="h-100" data-simplebar>
  66.           <div id="sidebar-menu">
  67.             <div class="logo-box">
  68.               <a href="{{ path('admin_dashboard') }}" class="logo logo-light">
  69.                 <span class="logo-sm"><img src="/assets/images/playpapa-admin-logo.svg" alt="" height="22" /></span>
  70.                 <span class="logo-lg"><img src="/assets/images/playpapa-admin-logo.svg" alt="" height="24" /></span>
  71.               </a>
  72.               <a href="{{ path('admin_dashboard') }}" class="logo logo-dark">
  73.                 <span class="logo-sm"><img src="/assets/images/playpapa-admin-logo.svg" alt="" height="22" /></span>
  74.                 <span class="logo-lg"><img src="/assets/images/playpapa-admin-logo.svg" alt="" height="24" /></span>
  75.               </a>
  76.             </div>
  77.             <ul id="side-menu">
  78.               <li class="menu-title">Меню</li>
  79.               <li>
  80.                 <a href="{{ path('admin_dashboard') }}" class="tp-link {{ current_section|default('dashboard') == 'dashboard' ? 'active' : '' }}">
  81.                   <i data-feather="home"></i>
  82.                   <span>Главная</span>
  83.                 </a>
  84.               </li>
  85.               <li>
  86.                 <a href="{{ path('admin_dashboard') }}#products" class="tp-link {{ current_section|default('') == 'products' ? 'active' : '' }}">
  87.                   <i data-feather="package"></i>
  88.                   <span>Товары</span>
  89.                 </a>
  90.               </li>
  91.               <li>
  92.                 <a href="{{ path('admin_references') }}" class="tp-link {{ current_section|default('') == 'references' ? 'active' : '' }}">
  93.                   <i data-feather="database"></i>
  94.                   <span>Справочники</span>
  95.                 </a>
  96.               </li>
  97.               <li>
  98.                 <a href="{{ path('admin_users') }}" class="tp-link {{ current_section|default('') == 'users' ? 'active' : '' }}">
  99.                   <i data-feather="users"></i>
  100.                   <span>Пользователи</span>
  101.                 </a>
  102.               </li>
  103.               <li>
  104.                 <a href="{{ path('admin_product_new') }}" class="tp-link">
  105.                   <i data-feather="plus-square"></i>
  106.                   <span>Добавить товар</span>
  107.                 </a>
  108.               </li>
  109.               <li class="menu-title">Сайт</li>
  110.               <li>
  111.                 <a href="{{ path('catalog') }}" target="_blank" rel="noreferrer" class="tp-link">
  112.                   <i data-feather="external-link"></i>
  113.                   <span>Открыть каталог</span>
  114.                 </a>
  115.               </li>
  116.             </ul>
  117.           </div>
  118.           <div class="clearfix"></div>
  119.         </div>
  120.       </div>
  121.       <div class="content-page">
  122.         <div class="content">
  123.           <div class="container-fluid">
  124.             <div class="py-3 d-flex align-items-sm-center flex-sm-row flex-column">
  125.               <div class="flex-grow-1">
  126.                 <h4 class="fs-18 fw-semibold m-0">{% block heading %}Админ-панель{% endblock %}</h4>
  127.               </div>
  128.               {% block page_actions %}{% endblock %}
  129.             </div>
  130.             {% for type, messages in app.flashes %}
  131.               {% for message in messages %}
  132.                 <div class="alert alert-{{ type == 'danger' ? 'danger' : (type == 'warning' ? 'warning' : 'success') }} alert-dismissible fade show" role="alert">
  133.                   {{ message }}
  134.                   <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
  135.                 </div>
  136.               {% endfor %}
  137.             {% endfor %}
  138.             {% block content %}{% endblock %}
  139.           </div>
  140.         </div>
  141.         <footer class="footer">
  142.           <div class="container-fluid">
  143.             <div class="row">
  144.               <div class="col fs-13 text-muted text-center">
  145.                 &copy; <script>document.write(new Date().getFullYear())</script> - PlayPapa Admin
  146.               </div>
  147.             </div>
  148.           </div>
  149.         </footer>
  150.       </div>
  151.     </div>
  152.     <div class="admin-loading-overlay" data-admin-loading-overlay hidden>
  153.       <div class="admin-loading-card">
  154.         <div class="admin-loading-spinner" aria-hidden="true">
  155.           <span class="spinner-border text-primary" role="status"></span>
  156.         </div>
  157.         <div>
  158.           <strong data-admin-loading-title>Идёт обновление</strong>
  159.           <p data-admin-loading-text>Пожалуйста, не закрывайте страницу.</p>
  160.           <small>Прошло <span data-admin-loading-timer>0:00</span></small>
  161.         </div>
  162.       </div>
  163.     </div>
  164.     <script src="/libs/jquery/jquery.min.js"></script>
  165.     <script src="/libs/bootstrap/js/bootstrap.bundle.min.js"></script>
  166.     <script src="/libs/simplebar/simplebar.min.js"></script>
  167.     <script src="/libs/node-waves/waves.min.js"></script>
  168.     <script src="/libs/waypoints/lib/jquery.waypoints.min.js"></script>
  169.     <script src="/libs/jquery.counterup/jquery.counterup.min.js"></script>
  170.     <script src="/libs/feather-icons/feather.min.js"></script>
  171.     <script src="/js/app.js"></script>
  172.     <script>
  173.       document.querySelectorAll("[data-check-all]").forEach((checkbox) => {
  174.         checkbox.addEventListener("change", () => {
  175.           document.querySelectorAll(checkbox.dataset.checkAll).forEach((item) => {
  176.             item.checked = checkbox.checked;
  177.           });
  178.         });
  179.       });
  180.       (() => {
  181.         const overlay = document.querySelector("[data-admin-loading-overlay]");
  182.         const title = overlay?.querySelector("[data-admin-loading-title]");
  183.         const text = overlay?.querySelector("[data-admin-loading-text]");
  184.         const timer = overlay?.querySelector("[data-admin-loading-timer]");
  185.         let tick = null;
  186.         const formatElapsed = (seconds) => {
  187.           const minutes = Math.floor(seconds / 60);
  188.           const rest = seconds % 60;
  189.           return `${minutes}:${String(rest).padStart(2, "0")}`;
  190.         };
  191.         document.querySelectorAll("[data-admin-loading-form]").forEach((form) => {
  192.           form.addEventListener("submit", () => {
  193.             const submitter = form.querySelector('button[type="submit"]');
  194.             const loadingTitle = form.dataset.loadingTitle || "Идёт обновление";
  195.             const loadingText = form.dataset.loadingText || "Пожалуйста, не закрывайте страницу.";
  196.             document.querySelectorAll("[data-admin-loading-form] button").forEach((button) => {
  197.               button.disabled = true;
  198.             });
  199.             if (submitter) {
  200.               submitter.dataset.originalHtml = submitter.innerHTML;
  201.               submitter.innerHTML = '<span class="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true"></span>Запущено';
  202.             }
  203.             if (!overlay || !title || !text || !timer) return;
  204.             title.textContent = loadingTitle;
  205.             text.textContent = loadingText;
  206.             timer.textContent = "0:00";
  207.             overlay.hidden = false;
  208.             document.body.classList.add("admin-is-loading");
  209.             let elapsed = 0;
  210.             if (tick) window.clearInterval(tick);
  211.             tick = window.setInterval(() => {
  212.               elapsed += 1;
  213.               timer.textContent = formatElapsed(elapsed);
  214.             }, 1000);
  215.           });
  216.         });
  217.       })();
  218.     </script>
  219.     {% block scripts %}{% endblock %}
  220.   </body>
  221. </html>