| | | 1 | | @using System.Security.Claims |
| | | 2 | | @using System.Text.Json |
| | | 3 | | @using OzonOrdersWeb.WebServices.Sidebar |
| | | 4 | | @using Services.CacheServices.Cache.UserCacheService |
| | | 5 | | @inject IUserCacheService UserCache |
| | | 6 | | @inject IUserSidebarSettingsService SidebarSettings |
| | | 7 | | @* |
| | | 8 | | Боковое меню /Admin: то же меню на AG Grid, что в Studio2 (_SidebarStructuredNav + sidebar-navigation.js), |
| | | 9 | | со своим деревом SidebarNavigationCatalog.Admin и настройками под префиксом «admin.». |
| | | 10 | | *@ |
| | | 11 | | @{ |
| | 0 | 12 | | var currentUser = await UserCache.GetCachedUserAsync(User); |
| | 0 | 13 | | var displayName = currentUser?.GoogleDisplayName ?? currentUser?.UserName ?? User.Identity?.Name ?? "User"; |
| | 0 | 14 | | var avatarUrl = currentUser?.GoogleAvatarUrl; |
| | 0 | 15 | | var safeName = displayName.Trim(); |
| | 0 | 16 | | var userInitials = safeName.Length >= 2 ? safeName[..2].ToUpperInvariant() : safeName.ToUpperInvariant(); |
| | | 17 | | |
| | 0 | 18 | | var sidebarUserId = User.FindFirstValue(ClaimTypes.NameIdentifier); |
| | 0 | 19 | | var sidebarSettings = string.IsNullOrEmpty(sidebarUserId) |
| | 0 | 20 | | ? new Dictionary<string, string>() |
| | 0 | 21 | | : await SidebarSettings.GetAllAsync(sidebarUserId, Context.RequestAborted); |
| | 0 | 22 | | var prefix = SidebarNavigationCatalog.AdminKeyPrefix; |
| | 0 | 23 | | var sidebarPinned = false; |
| | 0 | 24 | | if (sidebarSettings.TryGetValue(prefix + "prefs", out var prefsJson)) |
| | | 25 | | { |
| | | 26 | | try |
| | | 27 | | { |
| | 0 | 28 | | using var prefs = JsonDocument.Parse(prefsJson); |
| | 0 | 29 | | sidebarPinned = prefs.RootElement.TryGetProperty("pinned", out var pinnedEl) && pinnedEl.ValueKind == JsonVa |
| | 0 | 30 | | } |
| | 0 | 31 | | catch (JsonException) { /* битые настройки — как будто их нет */ } |
| | | 32 | | } |
| | 0 | 33 | | var sidebarNav = new SidebarNavViewModel |
| | 0 | 34 | | { |
| | 0 | 35 | | Tree = SidebarNavigationCatalog.Admin, |
| | 0 | 36 | | Settings = sidebarSettings, |
| | 0 | 37 | | SaveUrl = Url.Action("SaveSetting", "SidebarSettings", new { area = "" }) ?? "/Sidebar/SaveSetting", |
| | 0 | 38 | | Pinned = sidebarPinned, |
| | 0 | 39 | | KeyPrefix = prefix |
| | 0 | 40 | | }; |
| | | 41 | | } |
| | | 42 | | |
| | 0 | 43 | | <aside class="app-sidebar app-sidebar--quartz @(sidebarPinned ? "is-pinned" : "")" id="appSidebar" data-sidebar-pinned=" |
| | | 44 | | <div class="sidebar-header"> |
| | | 45 | | <a class="sidebar-logo" asp-area="Admin" asp-controller="Home" asp-action="Index" title="Обзор администрирования |
| | | 46 | | <div class="sidebar-logo-icon"><i class="fas fa-user-shield" aria-hidden="true"></i></div> |
| | | 47 | | <div class="sidebar-logo-meta"> |
| | | 48 | | <span class="sidebar-logo-text">Studio2 Admin</span> |
| | | 49 | | <span class="sidebar-build-info">Права доступа</span> |
| | | 50 | | </div> |
| | | 51 | | </a> |
| | | 52 | | <button class="sidebar-pin-toggle @(sidebarPinned ? "is-active" : "")" id="sidebarPinToggle" type="button" |
| | | 53 | | aria-pressed="@(sidebarPinned ? "true" : "false")" title="@(sidebarPinned ? "Открепить меню" : "Закрепит |
| | | 54 | | <span class="ag-icon @(sidebarPinned ? "ag-icon-un-pin" : "ag-icon-pin")" role="presentation"></span> |
| | | 55 | | <span class="visually-hidden">Закрепить раскрытое меню</span> |
| | | 56 | | </button> |
| | | 57 | | </div> |
| | | 58 | | |
| | | 59 | | <partial name="~/Views/Shared/_SidebarStructuredNav.cshtml" model="sidebarNav" /> |
| | | 60 | | |
| | | 61 | | <div class="sidebar-footer"> |
| | | 62 | | <a class="sidebar-user" asp-area="Studio2" asp-controller="Profile" asp-action="Index" title="Открыть профиль"> |
| | 0 | 63 | | @if (!string.IsNullOrWhiteSpace(avatarUrl)) |
| | | 64 | | { |
| | | 65 | | <img class="sidebar-user-avatar" src="@avatarUrl" alt="@displayName" referrerpolicy="no-referrer" /> |
| | | 66 | | } |
| | | 67 | | else |
| | | 68 | | { |
| | 0 | 69 | | <div class="sidebar-user-avatar">@userInitials</div> |
| | | 70 | | } |
| | | 71 | | <div class="sidebar-user-info"> |
| | 0 | 72 | | <div class="sidebar-user-name">@displayName</div> |
| | | 73 | | <div class="sidebar-user-role">Администратор</div> |
| | | 74 | | </div> |
| | | 75 | | </a> |
| | | 76 | | </div> |
| | | 77 | | </aside> |