< Summary

Information
Class: AspNetCoreGeneratedDocument.Areas_Studio2_Views_AccessProfiles_Index
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Views/AccessProfiles/Index.cshtml
Line coverage
0%
Covered lines: 0
Uncovered lines: 16
Coverable lines: 16
Total lines: 120
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 22
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%506220%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Views/AccessProfiles/Index.cshtml

#LineLine coverage
 1@using OzonDomains.Models.AccessControl
 2@model List<AccessProfile>
 3
 4@{
 05    ViewData["Title"] = "Профили доступа";
 06    Layout = "_AdminLayout";
 07    ViewData["Breadcrumb"] = new List<(string, string?)> { ("Администрирование", null), ("Профили доступа", null) };
 8}
 9
 10@section PageActions {
 11    <a asp-action="Create" class="btn btn-primary">
 12        <i class="ti ti-plus me-1"></i>Новый профиль
 13    </a>
 14}
 15
 016@if (!Model.Any())
 17{
 18    <div class="empty">
 19        <div class="empty-icon"><i class="ti ti-shield-off" style="font-size:3rem;color:#ccc"></i></div>
 20        <p class="empty-title">Профилей ещё нет</p>
 21        <p class="empty-subtitle text-muted">Создайте первый профиль доступа для назначения пользователям.</p>
 22        <div class="empty-action">
 23            <a asp-action="Create" class="btn btn-primary">
 24                <i class="ti ti-plus me-1"></i>Создать профиль
 25            </a>
 26        </div>
 27    </div>
 28}
 29else
 30{
 31    <div class="row row-cards">
 032        @foreach (var profile in Model)
 33        {
 34            <div class="col-md-6 col-lg-4">
 35                <div class="card">
 36                    <div class="card-body">
 37                        <div class="d-flex align-items-center mb-3">
 38                            <span class="avatar bg-blue-lt me-3">
 39                                <i class="ti ti-shield-check"></i>
 40                            </span>
 41                            <div>
 042                                <div class="fw-bold">@profile.Name</div>
 043                                <div class="text-muted small">ID: @profile.Id</div>
 44                            </div>
 45                        </div>
 46
 47                        <div class="mb-3">
 48                            <div class="text-muted small mb-1">Наборы ограничений</div>
 049                            @if (profile.DataScopeSets.Any())
 50                            {
 051                                @foreach (var set in profile.DataScopeSets)
 52                                {
 053                                    <span class="badge bg-azure-lt me-1 mb-1">@set.Name</span>
 54                                }
 55                            }
 56                            else
 57                            {
 58                                <span class="badge bg-green-lt">
 59                                    <i class="ti ti-check me-1"></i>Без ограничений (все данные)
 60                                </span>
 61                            }
 62                        </div>
 63
 064                        @if (profile.AvailableOrderColumns?.Any() == true)
 65                        {
 66                            <div class="mb-3">
 67                                <div class="text-muted small mb-1">Столбцы заказов</div>
 68                                <div class="text-truncate" title="@string.Join(", ", profile.AvailableOrderColumns)" sty
 069                                    @string.Join(", ", profile.AvailableOrderColumns.Take(4))
 070                                    @if (profile.AvailableOrderColumns.Count > 4) { <text>...</text> }
 71                                </div>
 72                            </div>
 73                        }
 74                    </div>
 75                    <div class="card-footer d-flex gap-2">
 076                        <a asp-action="Edit" asp-route-id="@profile.Id" class="btn btn-sm btn-outline-primary flex-fill"
 77                            <i class="ti ti-edit me-1"></i>Изменить
 78                        </a>
 79                        <button class="btn btn-sm btn-outline-danger"
 80                                data-bs-toggle="modal" data-bs-target="#deleteModal"
 081                                data-id="@profile.Id" data-name="@profile.Name">
 82                            <i class="ti ti-trash"></i>
 83                        </button>
 84                    </div>
 85                </div>
 86            </div>
 087        }
 88    </div>
 89}
 90
 91<!-- Delete modal -->
 92<div class="modal modal-blur fade" id="deleteModal" tabindex="-1">
 93    <div class="modal-dialog modal-sm modal-dialog-centered">
 94        <div class="modal-content">
 95            <div class="modal-body">
 96                <div class="modal-title">Удалить профиль?</div>
 97                <div class="text-muted mt-1">
 98                    Профиль <strong id="delName"></strong> будет удалён. Пользователи с этим профилем потеряют его.
 99                </div>
 100            </div>
 101            <div class="modal-footer">
 102                <button type="button" class="btn btn-link link-secondary me-auto" data-bs-dismiss="modal">Отмена</button
 103                <form asp-action="Delete" method="post" id="deleteForm">
 104                    <input type="hidden" name="id" id="delId"/>
 105                    <button type="submit" class="btn btn-danger">Удалить</button>
 106                </form>
 107            </div>
 108        </div>
 109    </div>
 110</div>
 111
 112@section Scripts {
 113<script>
 114document.getElementById('deleteModal').addEventListener('show.bs.modal', function(e) {
 115    const btn = e.relatedTarget;
 116    document.getElementById('delId').value = btn.dataset.id;
 117    document.getElementById('delName').textContent = btn.dataset.name;
 118});
 119</script>
 120}

Methods/Properties

ExecuteAsync()