| | | 1 | | @using OzonDomains.Models.AccessControl |
| | | 2 | | @model List<DataScopeSet> |
| | | 3 | | |
| | | 4 | | @{ |
| | 0 | 5 | | ViewData["Title"] = "Наборы ограничений данных"; |
| | 0 | 6 | | Layout = "_AdminLayout"; |
| | 0 | 7 | | 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 | | |
| | 0 | 16 | | @if (!Model.Any()) |
| | | 17 | | { |
| | | 18 | | <div class="empty"> |
| | | 19 | | <div class="empty-icon"><i class="ti ti-filter-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"><i class="ti ti-plus me-1"></i>Создать набор</a> |
| | | 24 | | </div> |
| | | 25 | | </div> |
| | | 26 | | } |
| | | 27 | | else |
| | | 28 | | { |
| | | 29 | | <div class="card"> |
| | | 30 | | <div class="table-responsive"> |
| | | 31 | | <table class="table table-vcenter table-hover card-table"> |
| | | 32 | | <thead> |
| | | 33 | | <tr> |
| | | 34 | | <th>Название</th> |
| | | 35 | | <th>Описание</th> |
| | | 36 | | <th class="text-center" style="width:120px">Ограничений</th> |
| | | 37 | | <th class="text-center" style="width:120px">Профилей</th> |
| | | 38 | | <th style="width:130px" class="text-center">Действия</th> |
| | | 39 | | </tr> |
| | | 40 | | </thead> |
| | | 41 | | <tbody> |
| | 0 | 42 | | @foreach (var set in Model) |
| | | 43 | | { |
| | | 44 | | <tr> |
| | | 45 | | <td> |
| | 0 | 46 | | <div class="fw-semibold">@set.Name</div> |
| | 0 | 47 | | <div class="text-muted small">Создан: @set.CreatedAt.ToLocalTime().ToString("dd.MM.yyyy")</d |
| | | 48 | | </td> |
| | 0 | 49 | | <td class="text-muted">@(set.Description ?? "—")</td> |
| | | 50 | | <td class="text-center"> |
| | | 51 | | <span class="badge @(set.Items.Any() ? "bg-orange-lt" : "bg-green-lt")"> |
| | 0 | 52 | | @(set.Items.Any() ? set.Items.Count.ToString() : "нет") |
| | | 53 | | </span> |
| | | 54 | | </td> |
| | | 55 | | <td class="text-center"> |
| | 0 | 56 | | <span class="badge bg-blue-lt">@set.AccessProfiles.Count</span> |
| | | 57 | | </td> |
| | | 58 | | <td class="text-center"> |
| | | 59 | | <div class="btn-group btn-group-sm"> |
| | 0 | 60 | | <a asp-action="Details" asp-route-id="@set.Id" |
| | | 61 | | class="btn btn-outline-primary" title="Управление ограничениями"> |
| | | 62 | | <i class="ti ti-list-details"></i> |
| | | 63 | | </a> |
| | 0 | 64 | | <a asp-action="Edit" asp-route-id="@set.Id" |
| | | 65 | | class="btn btn-outline-secondary" title="Изменить"> |
| | | 66 | | <i class="ti ti-edit"></i> |
| | | 67 | | </a> |
| | | 68 | | <button class="btn btn-outline-danger" title="Удалить" |
| | | 69 | | data-bs-toggle="modal" data-bs-target="#deleteModal" |
| | 0 | 70 | | data-id="@set.Id" data-name="@set.Name"> |
| | | 71 | | <i class="ti ti-trash"></i> |
| | | 72 | | </button> |
| | | 73 | | </div> |
| | | 74 | | </td> |
| | | 75 | | </tr> |
| | 0 | 76 | | } |
| | | 77 | | </tbody> |
| | | 78 | | </table> |
| | | 79 | | </div> |
| | | 80 | | </div> |
| | | 81 | | } |
| | | 82 | | |
| | | 83 | | <!-- Delete Modal --> |
| | | 84 | | <div class="modal modal-blur fade" id="deleteModal" tabindex="-1"> |
| | | 85 | | <div class="modal-dialog modal-sm modal-dialog-centered"> |
| | | 86 | | <div class="modal-content"> |
| | | 87 | | <div class="modal-body"> |
| | | 88 | | <div class="modal-title">Удалить набор?</div> |
| | | 89 | | <div class="text-muted mt-1"> |
| | | 90 | | <strong id="delName"></strong> будет удалён со всеми ограничениями. |
| | | 91 | | Профили, использующие этот набор, потеряют его. |
| | | 92 | | </div> |
| | | 93 | | </div> |
| | | 94 | | <div class="modal-footer"> |
| | | 95 | | <button type="button" class="btn btn-link link-secondary me-auto" data-bs-dismiss="modal">Отмена</button |
| | | 96 | | <form asp-action="Delete" method="post" id="deleteForm"> |
| | | 97 | | <input type="hidden" name="id" id="delId"/> |
| | | 98 | | <button type="submit" class="btn btn-danger">Удалить</button> |
| | | 99 | | </form> |
| | | 100 | | </div> |
| | | 101 | | </div> |
| | | 102 | | </div> |
| | | 103 | | </div> |
| | | 104 | | |
| | | 105 | | @section Scripts { |
| | | 106 | | <script> |
| | | 107 | | document.getElementById('deleteModal').addEventListener('show.bs.modal', function(e) { |
| | | 108 | | const btn = e.relatedTarget; |
| | | 109 | | document.getElementById('delId').value = btn.dataset.id; |
| | | 110 | | document.getElementById('delName').textContent = btn.dataset.name; |
| | | 111 | | }); |
| | | 112 | | </script> |
| | | 113 | | } |