< Summary

Information
Class: AspNetCoreGeneratedDocument.Areas_Admin_Views_Shared__AdminLteLayout
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Admin/Views/Shared/_AdminLteLayout.cshtml
Line coverage
0%
Covered lines: 0
Uncovered lines: 12
Coverable lines: 12
Total lines: 197
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 72
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
<ExecuteAsync()0%1190340%
<ExecuteAsync()0%1482380%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Admin/Views/Shared/_AdminLteLayout.cshtml

#LineLine coverage
 1@*
 2    Вёрстка раздела /Admin на AG Grid: меню — общее AG Grid-меню Studio2 со своим деревом (_AdminSidebar),
 3    гриды — BsxGrid/BsxDirectory (_BsxGridShell), цвета — токены темы грида (--og-*), тема — общая viewPrefs.theme.
 4    Правила — docs/frontend-ag-grid-migration.md, раздел — docs/admin-ag-grid.md.
 5*@
 6<!doctype html>
 7<html lang="ru">
 8<head>
 9    <meta charset="utf-8"/>
 10    <partial name="_ConsoleGuard" />
 11    <meta name="studio2-instance" content="@OzonOrdersWeb.Observability.AppInstanceInfo.InstanceId"/>
 12    @* Наблюдатель доступности сервера. Грузится ДО телеметрии: так он захватывает нативный fetch
 13         для health-проб, а телеметрия ложится поверх и продолжает видеть обычные запросы. *@
 14    <script src="~/js/layout/server-availability.js" asp-append-version="true"></script>
 15    <script src="~/js/observability/client-telemetry.js" asp-append-version="true"></script>
 16    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/>
 017    <title>@(ViewData["Title"] ?? "Администрирование") — Studio2 Admin</title>
 18    <link rel="icon" type="image/svg+xml" href="~/favicon.svg" asp-append-version="true"/>
 19    <link rel="apple-touch-icon" href="~/favicon.svg" asp-append-version="true"/>
 20    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css"/>
 21    <link rel="stylesheet" href="~/css/design-tokens.css" asp-append-version="true"/>
 22    <link rel="stylesheet" href="~/css/base.css" asp-append-version="true"/>
 23    <link rel="stylesheet" href="~/css/app-toast.css" asp-append-version="true"/>
 24    <link rel="stylesheet" href="~/css/system-notification-modal.css" asp-append-version="true"/>
 25    <link rel="stylesheet" href="~/css/server-availability.css" asp-append-version="true"/>
 26    <link rel="stylesheet" href="~/css/sidebar.css" asp-append-version="true"/>
 27    <link rel="stylesheet" href="~/css/sidebar-quartz.css" asp-append-version="true"/>
 28    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true"/>
 29    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"/>
 30    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" crossorigin
 31    <link rel="stylesheet" href="~/css/Studio2/shared/section-hero.css" asp-append-version="true"/>
 32    <link rel="stylesheet" href="~/css/custom-select.css" asp-append-version="true"/>
 033    @RenderSection("Styles", required: false)
 34</head>
 35<body class="admin-shell">
 036@await Html.PartialAsync("~/Areas/Studio2/Views/Shared/_BsxGridShell.cshtml")
 37<link rel="stylesheet" href="~/css/Studio2/Admin/admin.css" asp-append-version="true"/>
 38<partial name="_AdminSidebar" />
 39
 40<header class="app-header" id="appHeader">
 41    <div class="header-left">
 42        <div class="header-breadcrumb">
 43            <a asp-area="Admin" asp-controller="Home" asp-action="Index"><i class="fas fa-home"></i></a>
 44            <span class="header-breadcrumb-separator">/</span>
 045            <span class="header-breadcrumb-current">@ViewData["Title"]</span>
 46        </div>
 47    </div>
 48    <div class="header-right">
 49        <a class="btn btn-sm btn-outline-primary" asp-area="Studio2" asp-controller="Orders" asp-action="Index">
 50            <i class="bi bi-box-arrow-up-right me-1"></i> Открыть Studio2
 51        </a>
 52        <div class="dropdown">
 53            <button class="header-action-btn" data-bs-toggle="dropdown" aria-expanded="false" title="Профиль">
 54                <i class="fas fa-user"></i>
 55            </button>
 56            <ul class="dropdown-menu dropdown-menu-end">
 57                <li><a class="dropdown-item" asp-area="Studio2" asp-controller="Profile" asp-action="Index"><i class="fa
 58                <li><hr class="dropdown-divider"></li>
 59                <li>
 60                    <form asp-area="Identity" asp-controller="Account" asp-action="Logout" method="post">
 61                        <button type="submit" class="dropdown-item"><i class="fas fa-sign-out-alt me-2"></i>Выйти</butto
 62                    </form>
 63                </li>
 64            </ul>
 65        </div>
 66    </div>
 67</header>
 68
 69<div class="app-wrapper">
 70    <main class="app-main">
 71        <div class="app-content-header">
 72            <div class="container-fluid">
 73                <div class="row">
 74                    <div class="col-sm-6">
 075                        <h3 class="mb-0">@ViewData["Title"]</h3>
 76                    </div>
 77                    <div class="col-sm-6">
 078                        @if (ViewData["Breadcrumb"] is IEnumerable<(string Label, string? Url)> crumbs)
 79                        {
 80                            <ol class="breadcrumb float-sm-end">
 081                                @foreach (var (label, url) in crumbs)
 82                                {
 083                                    if (url != null) { <li class="breadcrumb-item"><a href="@url">@label</a></li> }
 084                                    else { <li class="breadcrumb-item active">@label</li> }
 85                                }
 86                            </ol>
 87                        }
 88                    </div>
 89                </div>
 90            </div>
 91        </div>
 92
 93        <div class="app-content">
 94            <div class="container-fluid bsx-surface">
 95                <partial name="_AppToastNotifications" />
 096                @RenderBody()
 97            </div>
 98        </div>
 99    </main>
 100
 101    <footer class="app-footer">
 102        <div class="float-end d-none d-sm-inline">Admin</div>
 0103        <strong>Studio2 &copy; @DateTime.Now.Year</strong>
 104    </footer>
 105</div>
 106<partial name="_ConfirmActionModal" />
 107
 108<script src="~/lib/jquery/dist/jquery.min.js"></script>
 109<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
 110<script src="~/js/app-toast.js" asp-append-version="true"></script>
 111<script src="~/js/shared/custom-select.js" asp-append-version="true"></script>
 112@* AG Grid Community — меню (sidebar-navigation.js) и гриды раздела. *@
 113<script src="~/lib/ag-grid/ag-grid-community.min.js" asp-append-version="true"></script>
 114<script src="~/js/layout/sidebar-navigation.js" asp-append-version="true"></script>
 115<script src="~/js/Studio2/Grid/bsx-directory.js" asp-append-version="true"></script>
 116<script src="~/js/Studio2/Admin/admin-grids.js" asp-append-version="true"></script>
 117<script>
 118    (function () {
 119        document.querySelectorAll('.admin-hero').forEach(function (hero) {
 120            hero.classList.add('app-section-hero', 'app-section-hero--import');
 121        });
 122        document.querySelectorAll('.admin-quick-links').forEach(function (links) {
 123            links.classList.add('app-section-hero__quick-links');
 124        });
 125        window.initCustomSelects?.('.admin-shell .form-select');
 126
 127        const modalEl = document.getElementById('adminConfirmModal');
 128        if (!modalEl || !window.bootstrap) {
 129            return;
 130        }
 131        const modal = new bootstrap.Modal(modalEl);
 132        const titleEl = document.getElementById('adminConfirmModalTitle');
 133        const messageEl = document.getElementById('adminConfirmModalMessage');
 134        const submitBtn = document.getElementById('adminConfirmModalSubmit');
 135        let pendingForm = null;
 136        let pendingResolve = null;
 137
 138        document.addEventListener('submit', function (event) {
 139            const form = event.target;
 140            if (!(form instanceof HTMLFormElement)) {
 141                return;
 142            }
 143
 144            const msg = form.getAttribute('data-confirm-message');
 145            if (!msg || form.dataset.confirmed === 'true') {
 146                return;
 147            }
 148
 149            event.preventDefault();
 150            pendingForm = form;
 151            titleEl.textContent = form.getAttribute('data-confirm-title') || 'Подтверждение действия';
 152            messageEl.textContent = msg;
 153            submitBtn.className = form.getAttribute('data-confirm-button-class') || 'btn btn-danger';
 154            submitBtn.textContent = form.getAttribute('data-confirm-button-text') || 'Подтвердить';
 155            modal.show();
 156        });
 157
 158        submitBtn.addEventListener('click', function () {
 159            if (!pendingForm) {
 160                if (pendingResolve) {
 161                    pendingResolve(true);
 162                    pendingResolve = null;
 163                }
 164                modal.hide();
 165                return;
 166            }
 167
 168            pendingForm.dataset.confirmed = 'true';
 169            pendingForm.requestSubmit();
 170            pendingForm = null;
 171            modal.hide();
 172        });
 173
 174        modalEl.addEventListener('hidden.bs.modal', function () {
 175            if (pendingResolve) {
 176                pendingResolve(false);
 177                pendingResolve = null;
 178            }
 179            pendingForm = null;
 180        });
 181
 182        window.adminConfirm = function (options) {
 183            return new Promise(function (resolve) {
 184                pendingForm = null;
 185                pendingResolve = resolve;
 186                titleEl.textContent = options?.title || 'Подтверждение действия';
 187                messageEl.textContent = options?.message || 'Подтвердите выполнение действия.';
 188                submitBtn.className = options?.buttonClass || 'btn btn-danger';
 189                submitBtn.textContent = options?.buttonText || 'Подтвердить';
 190                modal.show();
 191            });
 192        };
 193    })();
 194</script>
 0195@RenderSection("Scripts", required: false)
 196</body>
 197</html>

Methods/Properties

<ExecuteAsync()
<ExecuteAsync()