< Summary

Information
Class: AspNetCoreGeneratedDocument.Areas_Admin_Views_Roles_DataScopes
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Admin/Views/Roles/DataScopes.cshtml
Line coverage
0%
Covered lines: 0
Uncovered lines: 17
Coverable lines: 17
Total lines: 67
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 34
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%812280%
<ExecuteAsync()0%4260%
<ExecuteAsync()100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Admin/Views/Roles/DataScopes.cshtml

#LineLine coverage
 1@{
 02    var role = (OzonDomains.Models.Authorization.AppRole)ViewBag.Role;
 03    var scopes = (List<OzonDomains.Models.Authorization.DataScope>)ViewBag.AllScopes;
 04    var selected = (HashSet<int>)ViewBag.SelectedScopeIds;
 05    var scopeRows = scopes.OrderBy(s => s.EntityName).ThenBy(s => s.DisplayName)
 06        .Select(s => new { s.Id, s.Code, s.DisplayName, s.EntityName, s.FilterExpression, s.IsActive });
 07    var json = new System.Text.Json.JsonSerializerOptions(System.Text.Json.JsonSerializerDefaults.Web);
 8}
 9
 10<section class="admin-hero">
 11    <h1>Наборы данных роли</h1>
 012    <p class="subtitle">Связка role → data scopes для @role.DisplayName.</p>
 13    <p class="subtitle-help">Наборы ограничивают видимость строк по выбранным условиям.</p>
 14</section>
 15
 16<nav class="admin-quick-links">
 017    <a asp-area="Admin" asp-controller="Roles" asp-action="Edit" asp-route-id="@role.Id"><i class="bi bi-arrow-left"></i
 18    <a asp-area="Admin" asp-controller="DataScopes" asp-action="Index"><i class="bi bi-funnel"></i>Реестр наборов</a>
 19    <a asp-area="Admin" asp-controller="Users" asp-action="Index"><i class="bi bi-people"></i>Пользователи</a>
 20</nav>
 21
 22<div class="card mb-3">
 23    <div class="card-body d-flex justify-content-between align-items-center">
 24        <div>
 25            <div class="text-muted small">Роль</div>
 026            <h5 class="mb-0">@role.DisplayName</h5>
 27        </div>
 028        <a asp-action="Edit" asp-route-id="@role.Id" class="btn btn-outline-secondary btn-sm"><i class="bi bi-arrow-left
 29    </div>
 30</div>
 31
 032<form asp-action="SaveDataScopes" asp-route-id="@role.Id" method="post" id="admRoleScopesForm">
 033    @Html.AntiForgeryToken()
 34    <div id="admRoleScopesSelected" hidden></div>
 035    @await Html.PartialAsync("~/Areas/Studio2/Views/Shared/_BsxDirectoryGrid.cshtml", new BsxDirectoryGridViewModel("adm
 036        "Отметьте наборы роли и нажмите «Сохранить». Неактивные наборы выбрать нельзя."))
 37    <div class="admin-form-actions">
 38        <button type="submit" class="btn btn-primary"><i class="bi bi-save"></i> Сохранить <span class="ms-1" id="admRol
 039        <a asp-action="Edit" asp-route-id="@role.Id" class="btn btn-outline-secondary">Отмена</a>
 40    </div>
 41</form>
 042<script type="application/json" id="admRoleScopesData">@Html.Raw(System.Text.Json.JsonSerializer.Serialize(scopeRows, js
 43
 44@section Scripts {
 45    <script>
 46        (function () {
 47            const A = window.AdminGrid, D = window.BsxDirectory, esc = A.esc;
 48            const counter = document.getElementById('admRoleScopesChosen');
 49            A.selectionGrid({
 50                key: 'admRoleScopes', prefix: 'admRoleScopes', rows: A.data('admRoleScopesData'),
 051                selected: @Html.Raw(System.Text.Json.JsonSerializer.Serialize(selected)),
 52                inputName: 'dataScopeIds', hiddenId: 'admRoleScopesSelected',
 53                isSelectable: r => r.isActive,
 54                onChange: ids => { counter.textContent = '(' + ids.length + ')'; },
 55                rowClassRules: { 'bsx-row-muted': p => !!(p.data && !p.data.isActive) },
 56                columnDefs: [
 57                    D.setCol({ colId: 'entityName', field: 'entityName', headerName: 'Сущность', width: 150, cellRendere
 58                    { colId: 'displayName', field: 'displayName', headerName: 'Название', minWidth: 200, flex: 1, cellCl
 59                    A.code({ colId: 'code', field: 'code', headerName: 'Код' }),
 60                    { colId: 'filterExpression', field: 'filterExpression', headerName: 'Dynamic LINQ', minWidth: 260, f
 61                      cellRenderer: p => '<span class="admin-expr">' + esc(p.value || '') + '</span>' },
 62                    A.check({ colId: 'isActive', field: 'isActive', headerName: 'Активен' })
 63                ]
 64            });
 65        })();
 66    </script>
 67}