edit.blade.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. {{-- Вьюха: Управление ролью и правами пользователя --}}
  2. @extends('admin.layout')
  3. @section('title', 'Права: ' . $user->name)
  4. @section('content_header')
  5. <div class="d-flex justify-content-between align-items-center">
  6. <h1 class="m-0">
  7. Права пользователя: <strong>{{ $user->name }}</strong>
  8. @if($user->role)
  9. @php $b = $user->roleBadge(); @endphp
  10. <span class="badge badge-{{ $b['color'] }} ml-2">{{ $b['label'] }}</span>
  11. @endif
  12. </h1>
  13. <a href="{{ route('admin.users.index') }}" class="btn btn-default btn-sm">
  14. <i class="fas fa-arrow-left"></i> Назад
  15. </a>
  16. </div>
  17. @stop
  18. @section('breadcrumb')
  19. <li class="breadcrumb-item"><a href="{{ route('admin.dashboard') }}">Главная</a></li>
  20. <li class="breadcrumb-item"><a href="{{ route('admin.users.index') }}">Пользователи</a></li>
  21. <li class="breadcrumb-item active">{{ $user->name }}</li>
  22. @stop
  23. @section('content')
  24. <form action="{{ route('admin.users.update', $user) }}" method="POST">
  25. @csrf @method('PUT')
  26. <div class="row">
  27. <div class="col-md-4">
  28. <div class="card card-primary card-outline">
  29. <div class="card-header"><h3 class="card-title">Роль</h3></div>
  30. <div class="card-body">
  31. <p class="text-muted" style="font-size:13px">
  32. Роль задаёт базовый набор прав. Индивидуальные overrides (справа) могут дополнить или ограничить их.
  33. </p>
  34. <div class="form-group mb-0">
  35. @foreach($roleLabels as $roleKey => $roleInfo)
  36. {{-- superadmin может назначить только суперадмин --}}
  37. @if($roleKey === 'superadmin' && auth()->user()->role !== 'superadmin')
  38. @continue
  39. @endif
  40. {{-- admin может назначить только суперадмин --}}
  41. @if($roleKey === 'admin' && auth()->user()->role !== 'superadmin')
  42. @continue
  43. @endif
  44. <div class="custom-control custom-radio mb-2">
  45. <input type="radio" class="custom-control-input" id="role_{{ $roleKey }}"
  46. name="role" value="{{ $roleKey }}" {{ $user->role === $roleKey ? 'checked' : '' }}>
  47. <label class="custom-control-label" for="role_{{ $roleKey }}">
  48. <span class="badge badge-{{ $roleInfo['color'] }}">{{ $roleInfo['label'] }}</span>
  49. <div style="font-size:11px;color:var(--muted,#666);margin-top:3px">
  50. @switch($roleKey)
  51. @case('superadmin') Все права, управляет всеми @break
  52. @case('admin') Всё кроме управления admins @break
  53. @case('editor') Автомобили + контент сайта @break
  54. @case('viewer') Только просмотр @break
  55. @endswitch
  56. </div>
  57. </label>
  58. </div>
  59. @endforeach
  60. <div class="custom-control custom-radio mt-2">
  61. <input type="radio" class="custom-control-input" id="role_none"
  62. name="role" value="" {{ ! $user->role ? 'checked' : '' }}>
  63. <label class="custom-control-label" for="role_none">
  64. <span class="badge badge-secondary">Без роли</span>
  65. <div style="font-size:11px;color:var(--muted,#666);margin-top:3px">Нет доступа в панель</div>
  66. </label>
  67. </div>
  68. </div>
  69. </div>
  70. <div class="card-footer">
  71. <button type="submit" class="btn btn-primary btn-block">
  72. <i class="fas fa-save"></i> Сохранить
  73. </button>
  74. <a href="{{ route('admin.users.index') }}" class="btn btn-secondary btn-block mt-1">Отмена</a>
  75. </div>
  76. </div>
  77. </div>
  78. <div class="col-md-8">
  79. <div class="card card-secondary card-outline">
  80. <div class="card-header">
  81. <h3 class="card-title">Индивидуальные overrides</h3>
  82. <div class="card-tools">
  83. <small class="text-muted">
  84. <span class="badge badge-success">Allow</span> — разрешить поверх роли &nbsp;
  85. <span class="badge badge-danger">Deny</span> — запретить поверх роли &nbsp;
  86. <span class="badge badge-secondary">Роль</span> — без override
  87. </small>
  88. </div>
  89. </div>
  90. <div class="card-body">
  91. @foreach($permissions as $groupName => $groupPerms)
  92. <h6 class="text-uppercase text-muted mb-2" style="font-size:11px;letter-spacing:.1em">{{ $groupName }}</h6>
  93. <table class="table table-sm table-bordered mb-3">
  94. <thead>
  95. <tr>
  96. <th>Право</th>
  97. <th style="width:90px" class="text-center">По роли</th>
  98. <th style="width:260px" class="text-center">Override</th>
  99. </tr>
  100. </thead>
  101. <tbody>
  102. @foreach($groupPerms as $key => $label)
  103. @php
  104. $inRole = in_array($key, $roleDefaults, true);
  105. $override = $overrides[$key] ?? null;
  106. @endphp
  107. <tr>
  108. <td>
  109. {{ $label }}
  110. <div><code style="font-size:10px">{{ $key }}</code></div>
  111. </td>
  112. <td class="text-center">
  113. @if($user->role === 'superadmin')
  114. <span class="badge badge-success">✓</span>
  115. @elseif($inRole)
  116. <span class="badge badge-success">✓</span>
  117. @else
  118. <span class="badge badge-secondary">—</span>
  119. @endif
  120. </td>
  121. <td class="text-center">
  122. <div class="d-flex justify-content-center gap-2" style="gap:6px">
  123. <label class="mb-0">
  124. <input type="radio" name="permissions[{{ $key }}]" value="allow"
  125. {{ $override && $override->action === 'allow' ? 'checked' : '' }}>
  126. <span class="badge badge-success ml-1">Allow</span>
  127. </label>
  128. <label class="mb-0">
  129. <input type="radio" name="permissions[{{ $key }}]" value="deny"
  130. {{ $override && $override->action === 'deny' ? 'checked' : '' }}>
  131. <span class="badge badge-danger ml-1">Deny</span>
  132. </label>
  133. <label class="mb-0">
  134. <input type="radio" name="permissions[{{ $key }}]" value=""
  135. {{ ! $override ? 'checked' : '' }}>
  136. <span class="badge badge-secondary ml-1">Роль</span>
  137. </label>
  138. </div>
  139. </td>
  140. </tr>
  141. @endforeach
  142. </tbody>
  143. </table>
  144. @endforeach
  145. </div>
  146. </div>
  147. </div>
  148. </div>
  149. </form>
  150. @stop