| | | 1 | | @{ |
| | 0 | 2 | | var role = (OzonDomains.Models.Authorization.AppRole)ViewBag.Role; |
| | 0 | 3 | | var scopes = (List<OzonDomains.Models.Authorization.DataScope>)ViewBag.AllScopes; |
| | 0 | 4 | | var selected = (HashSet<int>)ViewBag.SelectedScopeIds; |
| | 0 | 5 | | var scopeRows = scopes.OrderBy(s => s.EntityName).ThenBy(s => s.DisplayName) |
| | 0 | 6 | | .Select(s => new { s.Id, s.Code, s.DisplayName, s.EntityName, s.FilterExpression, s.IsActive }); |
| | 0 | 7 | | var json = new System.Text.Json.JsonSerializerOptions(System.Text.Json.JsonSerializerDefaults.Web); |
| | | 8 | | } |
| | | 9 | | |
| | | 10 | | <section class="admin-hero"> |
| | | 11 | | <h1>Наборы данных роли</h1> |
| | 0 | 12 | | <p class="subtitle">Связка role → data scopes для @role.DisplayName.</p> |
| | | 13 | | <p class="subtitle-help">Наборы ограничивают видимость строк по выбранным условиям.</p> |
| | | 14 | | </section> |
| | | 15 | | |
| | | 16 | | <nav class="admin-quick-links"> |
| | 0 | 17 | | <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> |
| | 0 | 26 | | <h5 class="mb-0">@role.DisplayName</h5> |
| | | 27 | | </div> |
| | 0 | 28 | | <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 | | |
| | 0 | 32 | | <form asp-action="SaveDataScopes" asp-route-id="@role.Id" method="post" id="admRoleScopesForm"> |
| | 0 | 33 | | @Html.AntiForgeryToken() |
| | | 34 | | <div id="admRoleScopesSelected" hidden></div> |
| | 0 | 35 | | @await Html.PartialAsync("~/Areas/Studio2/Views/Shared/_BsxDirectoryGrid.cshtml", new BsxDirectoryGridViewModel("adm |
| | 0 | 36 | | "Отметьте наборы роли и нажмите «Сохранить». Неактивные наборы выбрать нельзя.")) |
| | | 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 |
| | 0 | 39 | | <a asp-action="Edit" asp-route-id="@role.Id" class="btn btn-outline-secondary">Отмена</a> |
| | | 40 | | </div> |
| | | 41 | | </form> |
| | 0 | 42 | | <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'), |
| | 0 | 51 | | 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 | | } |