src/CompanyGroupBundle/Resources/views/pages/admin/_sidebar.html.twig line 1

Open in your IDE?
  1. {# Admin panel sidebar — included in all admin pages #}
  2. <div class="hb-admin-sidebar">
  3.     <div class="hb-admin-sidebar__brand">
  4.         <span class="hb-admin-sidebar__logo">🐝</span>
  5.         <span class="hb-admin-sidebar__title">HoneyBee Admin</span>
  6.     </div>
  7.     <nav class="hb-admin-nav">
  8.         <a href="{{ path('super_admin_command_center') }}"
  9.            class="hb-admin-nav__item {{ app.request.get('_route') == 'super_admin_command_center' ? 'is-active' : '' }}">
  10.             <i class="ft-grid"></i> Dashboard
  11.         </a>
  12.         <div class="hb-admin-nav__group-label">Platform</div>
  13.         <a href="{{ path('admin_control') }}"
  14.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'admin_control' and not (app.request.get('_route') starts with 'admin_control_aie') and not (app.request.get('_route') starts with 'admin_control_m2e') ? 'is-active' : '' }}">
  15.             <i class="ft-sliders"></i> Control Console
  16.         </a>
  17.         <a href="{{ path('admin_control_aie') }}"
  18.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'admin_control_aie' ? 'is-active' : '' }}">
  19.             <i class="ft-users"></i> AI Employees
  20.         </a>
  21.         <a href="{{ path('admin_control_m2e') }}"
  22.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'admin_control_m2e' ? 'is-active' : '' }}">
  23.             <i class="ft-award"></i> M2E Authority
  24.         </a>
  25.         <a href="{{ path('fleet_health') }}"
  26.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'fleet_health' ? 'is-active' : '' }}">
  27.             <i class="ft-activity"></i> Fleet Health
  28.         </a>
  29.         <a href="{{ path('energy_bridge_monitor') }}"
  30.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'energy_bridge' ? 'is-active' : '' }}">
  31.             <i class="ft-zap"></i> Energy Bridge
  32.         </a>
  33.         <a href="{{ path('leadgen_dashboard') }}"
  34.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'leadgen' ? 'is-active' : '' }}">
  35.             <i class="ft-send"></i> LeadGen
  36.         </a>
  37.         <div class="hb-admin-nav__group-label">Quotes</div>
  38.         <a href="{{ path('admin_sales_workspace') }}"
  39.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'admin_sales' ? 'is-active' : '' }}">
  40.             <i class="ft-users"></i> Sales Workspace
  41.         </a>
  42.         <a href="{{ path('admin_customer_handoffs') }}"
  43.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'admin_customer_handoff' ? 'is-active' : '' }}">
  44.             <i class="ft-user-check"></i> Customer Handoffs
  45.         </a>
  46.         <a href="{{ path('admin_quotes_list') }}"
  47.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'admin_quote' ? 'is-active' : '' }}">
  48.             <i class="ft-file-text"></i> All Quotes
  49.             {% set _pending_quotes = pending_quotes_count|default(0) %}
  50.             {% if _pending_quotes > 0 %}
  51.                 <span class="hb-admin-badge">{{ _pending_quotes }}</span>
  52.             {% endif %}
  53.         </a>
  54.         <a href="{{ path('admin_quotes_list', {status: 'requested'}) }}"
  55.            class="hb-admin-nav__item hb-admin-nav__item--sub">
  56.             Requested
  57.         </a>
  58.         <a href="{{ path('admin_quotes_list', {status: 'modified'}) }}"
  59.            class="hb-admin-nav__item hb-admin-nav__item--sub">
  60.             Modified
  61.         </a>
  62.         <a href="{{ path('admin_quotes_list', {status: 'accepted'}) }}"
  63.            class="hb-admin-nav__item hb-admin-nav__item--sub">
  64.             Accepted
  65.         </a>
  66.         <a href="{{ path('admin_quotes_list', {status: 'rejected'}) }}"
  67.            class="hb-admin-nav__item hb-admin-nav__item--sub">
  68.             Rejected
  69.         </a>
  70.         <a href="{{ path('admin_quote_create') }}"
  71.            class="hb-admin-nav__item hb-admin-nav__item--action">
  72.             <i class="ft-plus-circle"></i> New Quote
  73.         </a>
  74.         <div class="hb-admin-nav__group-label">Invoices</div>
  75.         <a href="{{ path('admin_invoices_list') }}"
  76.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'admin_invoice' ? 'is-active' : '' }}">
  77.             <i class="ft-dollar-sign"></i> All Invoices
  78.         </a>
  79.         <a href="{{ path('admin_invoices_list', {status: 'pending'}) }}"
  80.            class="hb-admin-nav__item hb-admin-nav__item--sub">
  81.             Pending
  82.         </a>
  83.         <a href="{{ path('admin_invoices_list', {status: 'paid'}) }}"
  84.            class="hb-admin-nav__item hb-admin-nav__item--sub">
  85.             Paid
  86.         </a>
  87.         <a href="{{ path('admin_invoices_list', {status: 'failed'}) }}"
  88.            class="hb-admin-nav__item hb-admin-nav__item--sub">
  89.             Failed
  90.         </a>
  91.         <a href="{{ path('admin_provisioning_queue') }}"
  92.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'admin_provisioning' ? 'is-active' : '' }}">
  93.             <i class="ft-loader"></i> Provisioning Queue
  94.         </a>
  95.         <div class="hb-admin-nav__group-label">Companies</div>
  96.         <a href="{{ path('admin_companies_list') }}"
  97.            class="hb-admin-nav__item {{ app.request.get('_route') in ['admin_companies_list', 'admin_company_view', 'admin_company_settings', 'admin_company_module_settings'] ? 'is-active' : '' }}">
  98.             <i class="ft-briefcase"></i> Company List
  99.         </a>
  100.         <a href="{{ path('admin_companies_list') }}"
  101.            class="hb-admin-nav__item hb-admin-nav__item--sub {{ app.request.get('_route') in ['admin_company_settings', 'admin_company_module_settings'] ? 'is-active' : '' }}">
  102.             Company Settings
  103.         </a>
  104.         <a href="{{ path('owner_dashboard') }}"
  105.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'owner_' ? 'is-active' : '' }}">
  106.             <i class="ft-grid"></i> Owner Portal
  107.         </a>
  108.         <div class="hb-admin-nav__group-label">Catalog</div>
  109.         <a href="{{ path('central_product_control') }}"
  110.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'central_product_control' and app.request.get('_route') != 'central_product_control_duplicates' ? 'is-active' : '' }}">
  111.             <i class="ft-box"></i> Product Control
  112.         </a>
  113.         <a href="{{ path('central_product_control_duplicates') }}"
  114.            class="hb-admin-nav__item hb-admin-nav__item--sub {{ app.request.get('_route') == 'central_product_control_duplicates' ? 'is-active' : '' }}">
  115.             Duplicates &amp; Merge
  116.         </a>
  117.         <div class="hb-admin-nav__group-label">Support</div>
  118.         <a href="{{ path('ticket_list') }}"
  119.            class="hb-admin-nav__item {{ app.request.get('_route') starts with 'ticket' ? 'is-active' : '' }}">
  120.             <i class="ft-alert-circle"></i> All Tickets
  121.         </a>
  122.         <a href="{{ path('ticket_create') }}"
  123.            class="hb-admin-nav__item hb-admin-nav__item--action">
  124.             <i class="ft-plus-circle"></i> New Ticket
  125.         </a>
  126.     </nav>
  127. </div>
  128. <style>
  129. .hb-admin-sidebar {
  130.     position: fixed;
  131.     top: 0; left: 0;
  132.     width: 220px;
  133.     height: 100vh;
  134.     background: linear-gradient(180deg, #0f2952 0%, #1a3d6e 100%);
  135.     display: flex;
  136.     flex-direction: column;
  137.     z-index: 900;
  138.     overflow-y: auto;
  139.     box-shadow: 4px 0 18px rgba(15,41,82,0.18);
  140. }
  141. .hb-admin-sidebar__brand {
  142.     display: flex;
  143.     align-items: center;
  144.     gap: 10px;
  145.     padding: 22px 20px 18px;
  146.     border-bottom: 1px solid rgba(255,255,255,0.08);
  147. }
  148. .hb-admin-sidebar__logo { font-size: 1.5rem; }
  149. .hb-admin-sidebar__title {
  150.     font-size: 0.92rem;
  151.     font-weight: 700;
  152.     color: #fff;
  153.     letter-spacing: 0.02em;
  154. }
  155. .hb-admin-nav { padding: 10px 0 30px; flex: 1; }
  156. .hb-admin-nav__group-label {
  157.     font-size: 0.65rem;
  158.     font-weight: 700;
  159.     text-transform: uppercase;
  160.     letter-spacing: 0.12em;
  161.     color: rgba(255,255,255,0.35);
  162.     padding: 16px 20px 4px;
  163. }
  164. .hb-admin-nav__item {
  165.     display: flex;
  166.     align-items: center;
  167.     gap: 9px;
  168.     padding: 9px 20px;
  169.     color: rgba(255,255,255,0.72);
  170.     font-size: 0.865rem;
  171.     text-decoration: none;
  172.     transition: background 0.15s, color 0.15s;
  173.     border-radius: 0;
  174.     position: relative;
  175. }
  176. .hb-admin-nav__item:hover,
  177. .hb-admin-nav__item.is-active {
  178.     background: rgba(255,255,255,0.10);
  179.     color: #fff;
  180.     text-decoration: none;
  181. }
  182. .hb-admin-nav__item.is-active::before {
  183.     content: '';
  184.     position: absolute;
  185.     left: 0; top: 0; bottom: 0;
  186.     width: 3px;
  187.     background: #f5c518;
  188.     border-radius: 0 2px 2px 0;
  189. }
  190. .hb-admin-nav__item--sub {
  191.     padding-left: 40px;
  192.     font-size: 0.815rem;
  193.     color: rgba(255,255,255,0.52);
  194. }
  195. .hb-admin-nav__item--sub:hover { color: rgba(255,255,255,0.85); }
  196. .hb-admin-nav__item--action {
  197.     margin: 6px 12px;
  198.     padding: 8px 14px;
  199.     background: rgba(245,197,24,0.12);
  200.     border: 1px solid rgba(245,197,24,0.3);
  201.     border-radius: 7px;
  202.     color: #f5c518;
  203.     font-weight: 600;
  204. }
  205. .hb-admin-nav__item--action:hover {
  206.     background: rgba(245,197,24,0.22);
  207.     color: #f5c518;
  208. }
  209. .hb-admin-nav__divider {
  210.     height: 1px;
  211.     background: rgba(255,255,255,0.08);
  212.     margin: 10px 20px;
  213. }
  214. .hb-admin-badge {
  215.     margin-left: auto;
  216.     background: #e74c3c;
  217.     color: #fff;
  218.     font-size: 0.68rem;
  219.     font-weight: 700;
  220.     border-radius: 10px;
  221.     padding: 1px 7px;
  222.     min-width: 18px;
  223.     text-align: center;
  224. }
  225. /* Push main content right when sidebar is present */
  226. .hb-admin-layout { margin-left: 220px; }
  227. @media (max-width: 900px) {
  228.     .hb-admin-sidebar { display: none; }
  229.     .hb-admin-layout { margin-left: 0; }
  230. }
  231. </style>