| | | 1 | | @using OzonDomains.Models.AccessControl |
| | | 2 | | @model List<AccessProfile> |
| | | 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-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 | | } |
| | | 29 | | else |
| | | 30 | | { |
| | | 31 | | <div class="row row-cards"> |
| | 0 | 32 | | @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> |
| | 0 | 42 | | <div class="fw-bold">@profile.Name</div> |
| | 0 | 43 | | <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> |
| | 0 | 49 | | @if (profile.DataScopeSets.Any()) |
| | | 50 | | { |
| | 0 | 51 | | @foreach (var set in profile.DataScopeSets) |
| | | 52 | | { |
| | 0 | 53 | | <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 | | |
| | 0 | 64 | | @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 |
| | 0 | 69 | | @string.Join(", ", profile.AvailableOrderColumns.Take(4)) |
| | 0 | 70 | | @if (profile.AvailableOrderColumns.Count > 4) { <text>...</text> } |
| | | 71 | | </div> |
| | | 72 | | </div> |
| | | 73 | | } |
| | | 74 | | </div> |
| | | 75 | | <div class="card-footer d-flex gap-2"> |
| | 0 | 76 | | <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" |
| | 0 | 81 | | data-id="@profile.Id" data-name="@profile.Name"> |
| | | 82 | | <i class="ti ti-trash"></i> |
| | | 83 | | </button> |
| | | 84 | | </div> |
| | | 85 | | </div> |
| | | 86 | | </div> |
| | 0 | 87 | | } |
| | | 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> |
| | | 114 | | document.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 | | } |