| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- div(class="admin")
- // Мобильное меню - кнопка бургер
- div(class="admin__mobile-toggle" @click="mobileMenuOpen = !mobileMenuOpen")
- div(class="admin__burger" :class="{'admin__burger--active': mobileMenuOpen}")
- span
- span
- span
-
- // Боковое меню для десктопа и мобильных устройств
- div(
- class="admin__sidebar"
- :class="{'admin__sidebar--mobile-open': mobileMenuOpen, 'admin__sidebar--collapsed': sidebarCollapsed}"
- )
- div(class="admin__sidebar-header")
- div(class="admin__brand" v-if="!sidebarCollapsed")
- img(
- v-if="currentDomainSettings && currentDomainSettings.logo"
- :src="currentDomainSettings.logo"
- :alt="currentDomainSettings.companyName || 'Браер-Колор'"
- class="admin__logo"
- )
- span(class="admin__company-name") {{ currentDomainSettings?.companyName || 'Браер-Колор' }}
- div(class="admin__sidebar-toggle" @click="sidebarCollapsed = !sidebarCollapsed")
- div(class="admin__toggle-icon" :class="{'admin__toggle-icon--collapsed': sidebarCollapsed}")
- svg(fill="none" stroke="currentColor" viewBox="0 0 24 24")
- path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 19l-7-7 7-7m8 14l-7-7 7-7")
-
- nav(class="admin__nav")
- div(class="admin__nav-section")
- h3(
- v-if="!sidebarCollapsed"
- class="admin__nav-section-title"
- ) Основные
- ul(class="admin__nav-list")
- li(
- v-for="item in mainMenuItems"
- :key="item.id"
- class="admin__nav-item"
- )
- a(
- :href="item.path"
- @click.prevent="navigateTo(item.path)"
- :class="getMenuItemClass(item)"
- class="admin__nav-link"
- )
- component(:is="item.icon" class="admin__nav-icon")
- span(
- v-if="!sidebarCollapsed"
- class="admin__nav-text"
- ) {{ item.name }}
- span(
- v-if="!sidebarCollapsed && item.badge"
- class="admin__nav-badge"
- ) {{ item.badge }}
-
- div(class="admin__nav-section")
- h3(
- v-if="!sidebarCollapsed"
- class="admin__nav-section-title"
- ) Контент
- ul(class="admin__nav-list")
- li(
- v-for="item in contentMenuItems"
- :key="item.id"
- class="admin__nav-item"
- )
- a(
- :href="item.path"
- @click.prevent="navigateTo(item.path)"
- :class="getMenuItemClass(item)"
- class="admin__nav-link"
- )
- component(:is="item.icon" class="admin__nav-icon")
- span(
- v-if="!sidebarCollapsed"
- class="admin__nav-text"
- ) {{ item.name }}
-
- div(class="admin__nav-section")
- h3(
- v-if="!sidebarCollapsed"
- class="admin__nav-section-title"
- ) Система
- ul(class="admin__nav-list")
- li(
- v-for="item in systemMenuItems"
- :key="item.id"
- class="admin__nav-item"
- )
- a(
- :href="item.path"
- @click.prevent="navigateTo(item.path)"
- :class="getMenuItemClass(item)"
- class="admin__nav-link"
- )
- component(:is="item.icon" class="admin__nav-icon")
- span(
- v-if="!sidebarCollapsed"
- class="admin__nav-text"
- ) {{ item.name }}
-
- div(class="admin__sidebar-footer" v-if="!sidebarCollapsed")
- div(class="admin__user-info")
- div(class="admin__user-avatar") {{ userInitials }}
- div(class="admin__user-details")
- span(class="admin__user-name") {{ user?.name || 'Администратор' }}
- span(class="admin__user-role") {{ user?.role || 'Admin' }}
- button(
- @click="logout"
- class="admin__logout-btn"
- )
- svg(fill="none" stroke="currentColor" viewBox="0 0 24 24")
- path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1")
- span Выйти
-
- // Основной контент
- div(
- class="admin__main"
- :class="{'admin__main--expanded': sidebarCollapsed, 'admin__main--mobile-open': mobileMenuOpen}"
- )
- div(class="admin__topbar")
- div(class="admin__breadcrumbs")
- span(
- v-for="(breadcrumb, index) in breadcrumbs"
- :key="index"
- class="admin__breadcrumb"
- )
- a(
- v-if="breadcrumb.path && index !== breadcrumbs.length - 1"
- :href="breadcrumb.path"
- @click.prevent="navigateTo(breadcrumb.path)"
- class="admin__breadcrumb-link"
- ) {{ breadcrumb.title }}
- span(v-else class="admin__breadcrumb-current") {{ breadcrumb.title }}
- span(
- v-if="index !== breadcrumbs.length - 1"
- class="admin__breadcrumb-separator"
- ) /
-
- div(class="admin__actions")
- button(
- @click="toggleTheme"
- class="admin__action-btn"
- :title="theme === 'light' ? 'Темная тема' : 'Светлая тема'"
- )
- svg(v-if="theme === 'light'" fill="none" stroke="currentColor" viewBox="0 0 24 24")
- path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z")
- svg(v-else fill="none" stroke="currentColor" viewBox="0 0 24 24")
- path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z")
-
- button(
- @click="refreshData"
- class="admin__action-btn"
- title="Обновить данные"
- )
- svg(fill="none" stroke="currentColor" viewBox="0 0 24 24")
- path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15")
-
- div(class="admin__notifications")
- button(
- @click="notificationsOpen = !notificationsOpen"
- class="admin__action-btn admin__notifications-btn"
- :class="{'admin__notifications-btn--active': notificationsOpen}"
- )
- svg(fill="none" stroke="currentColor" viewBox="0 0 24 24")
- path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 17h5l-5 5v-5zM4.5 6.5h15M4.5 12h15")
- span(v-if="unreadNotifications > 0" class="admin__notification-badge") {{ unreadNotifications }}
-
- div(
- v-if="notificationsOpen"
- class="admin__notifications-dropdown"
- )
- div(class="admin__notifications-header")
- h4 Уведомления
- span(class="admin__notifications-count") {{ unreadNotifications }} новых
- div(class="admin__notifications-list")
- div(
- v-for="notification in notifications"
- :key="notification.id"
- class="admin__notification-item"
- :class="{'admin__notification-item--unread': !notification.read}"
- )
- div(class="admin__notification-icon")
- component(:is="notification.icon")
- div(class="admin__notification-content")
- p(class="admin__notification-title") {{ notification.title }}
- span(class="admin__notification-time") {{ notification.time }}
- button(
- @click="markAsRead(notification.id)"
- class="admin__notification-action"
- ) ×
-
- div(class="admin__content")
- router-view
-
- // Оверлей для мобильного меню
- div(
- v-if="mobileMenuOpen"
- class="admin__overlay"
- @click="mobileMenuOpen = false"
- )
|