|
@@ -0,0 +1,191 @@
|
|
|
|
|
+{{-- Вьюха: Создание нового пользователя с назначением роли и прав.
|
|
|
|
|
+ Контроллер: Admin\UserAdminController@create / store
|
|
|
|
|
+ Переменные: $permissions (все права по группам), $roleLabels (метки ролей)
|
|
|
|
|
+--}}
|
|
|
|
|
+@extends('admin.layout')
|
|
|
|
|
+
|
|
|
|
|
+@section('title', 'Новый пользователь')
|
|
|
|
|
+
|
|
|
|
|
+@section('content_header')
|
|
|
|
|
+ <div class="d-flex justify-content-between align-items-center">
|
|
|
|
|
+ <h1 class="m-0">Новый пользователь</h1>
|
|
|
|
|
+ <a href="{{ route('admin.users.index') }}" class="btn btn-default btn-sm">
|
|
|
|
|
+ <i class="fas fa-arrow-left"></i> Назад
|
|
|
|
|
+ </a>
|
|
|
|
|
+ </div>
|
|
|
|
|
+@stop
|
|
|
|
|
+
|
|
|
|
|
+@section('breadcrumb')
|
|
|
|
|
+ <li class="breadcrumb-item"><a href="{{ route('admin.dashboard') }}">Главная</a></li>
|
|
|
|
|
+ <li class="breadcrumb-item"><a href="{{ route('admin.users.index') }}">Пользователи</a></li>
|
|
|
|
|
+ <li class="breadcrumb-item active">Новый пользователь</li>
|
|
|
|
|
+@stop
|
|
|
|
|
+
|
|
|
|
|
+@section('content')
|
|
|
|
|
+ @if($errors->any())
|
|
|
|
|
+ <div class="alert alert-danger alert-dismissible">
|
|
|
|
|
+ <button type="button" class="close" data-dismiss="alert">×</button>
|
|
|
|
|
+ <ul class="mb-0 pl-3">
|
|
|
|
|
+ @foreach($errors->all() as $error)
|
|
|
|
|
+ <li>{{ $error }}</li>
|
|
|
|
|
+ @endforeach
|
|
|
|
|
+ </ul>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ @endif
|
|
|
|
|
+
|
|
|
|
|
+ <form action="{{ route('admin.users.store') }}" method="POST">
|
|
|
|
|
+ @csrf
|
|
|
|
|
+
|
|
|
|
|
+ <div class="row">
|
|
|
|
|
+ {{-- Левая колонка: данные + роль --}}
|
|
|
|
|
+ <div class="col-md-4">
|
|
|
|
|
+
|
|
|
|
|
+ {{-- Данные пользователя --}}
|
|
|
|
|
+ <div class="card card-primary card-outline">
|
|
|
|
|
+ <div class="card-header"><h3 class="card-title">Учётные данные</h3></div>
|
|
|
|
|
+ <div class="card-body">
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="name">Имя <span class="text-danger">*</span></label>
|
|
|
|
|
+ <input type="text" id="name" name="name" class="form-control @error('name') is-invalid @enderror"
|
|
|
|
|
+ value="{{ old('name') }}" placeholder="Иван Иванов" required>
|
|
|
|
|
+ @error('name')
|
|
|
|
|
+ <div class="invalid-feedback">{{ $message }}</div>
|
|
|
|
|
+ @enderror
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="email">Email <span class="text-danger">*</span></label>
|
|
|
|
|
+ <input type="email" id="email" name="email" class="form-control @error('email') is-invalid @enderror"
|
|
|
|
|
+ value="{{ old('email') }}" placeholder="user@example.com" required>
|
|
|
|
|
+ @error('email')
|
|
|
|
|
+ <div class="invalid-feedback">{{ $message }}</div>
|
|
|
|
|
+ @enderror
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="password">Пароль <span class="text-danger">*</span></label>
|
|
|
|
|
+ <input type="password" id="password" name="password"
|
|
|
|
|
+ class="form-control @error('password') is-invalid @enderror"
|
|
|
|
|
+ placeholder="Минимум 8 символов" required>
|
|
|
|
|
+ @error('password')
|
|
|
|
|
+ <div class="invalid-feedback">{{ $message }}</div>
|
|
|
|
|
+ @enderror
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="form-group mb-0">
|
|
|
|
|
+ <label for="password_confirmation">Подтверждение пароля <span class="text-danger">*</span></label>
|
|
|
|
|
+ <input type="password" id="password_confirmation" name="password_confirmation"
|
|
|
|
|
+ class="form-control" placeholder="Повторите пароль" required>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ {{-- Роль --}}
|
|
|
|
|
+ <div class="card card-primary card-outline">
|
|
|
|
|
+ <div class="card-header"><h3 class="card-title">Роль</h3></div>
|
|
|
|
|
+ <div class="card-body">
|
|
|
|
|
+ <p class="text-muted" style="font-size:13px">
|
|
|
|
|
+ Роль задаёт базовый набор прав. Индивидуальные overrides (справа) могут дополнить или ограничить их.
|
|
|
|
|
+ </p>
|
|
|
|
|
+ <div class="form-group mb-0">
|
|
|
|
|
+ @foreach($roleLabels as $roleKey => $roleInfo)
|
|
|
|
|
+ {{-- superadmin может назначить только суперадмин --}}
|
|
|
|
|
+ @if($roleKey === 'superadmin' && auth()->user()->role !== 'superadmin')
|
|
|
|
|
+ @continue
|
|
|
|
|
+ @endif
|
|
|
|
|
+ {{-- admin может назначить только суперадмин --}}
|
|
|
|
|
+ @if($roleKey === 'admin' && auth()->user()->role !== 'superadmin')
|
|
|
|
|
+ @continue
|
|
|
|
|
+ @endif
|
|
|
|
|
+ <div class="custom-control custom-radio mb-2">
|
|
|
|
|
+ <input type="radio" class="custom-control-input" id="role_{{ $roleKey }}"
|
|
|
|
|
+ name="role" value="{{ $roleKey }}" {{ old('role') === $roleKey ? 'checked' : '' }}>
|
|
|
|
|
+ <label class="custom-control-label" for="role_{{ $roleKey }}">
|
|
|
|
|
+ <span class="badge badge-{{ $roleInfo['color'] }}">{{ $roleInfo['label'] }}</span>
|
|
|
|
|
+ <div style="font-size:11px;color:var(--muted,#666);margin-top:3px">
|
|
|
|
|
+ @switch($roleKey)
|
|
|
|
|
+ @case('superadmin') Все права, управляет всеми @break
|
|
|
|
|
+ @case('admin') Всё кроме управления admins @break
|
|
|
|
|
+ @case('editor') Автомобили + контент сайта @break
|
|
|
|
|
+ @case('viewer') Только просмотр @break
|
|
|
|
|
+ @endswitch
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </label>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ @endforeach
|
|
|
|
|
+ <div class="custom-control custom-radio mt-2">
|
|
|
|
|
+ <input type="radio" class="custom-control-input" id="role_none"
|
|
|
|
|
+ name="role" value="" {{ ! old('role') ? 'checked' : '' }}>
|
|
|
|
|
+ <label class="custom-control-label" for="role_none">
|
|
|
|
|
+ <span class="badge badge-secondary">Без роли</span>
|
|
|
|
|
+ <div style="font-size:11px;color:var(--muted,#666);margin-top:3px">Нет доступа в панель</div>
|
|
|
|
|
+ </label>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="card-footer">
|
|
|
|
|
+ <button type="submit" class="btn btn-success btn-block">
|
|
|
|
|
+ <i class="fas fa-user-plus"></i> Создать пользователя
|
|
|
|
|
+ </button>
|
|
|
|
|
+ <a href="{{ route('admin.users.index') }}" class="btn btn-secondary btn-block mt-1">Отмена</a>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ {{-- Правая колонка: индивидуальные overrides --}}
|
|
|
|
|
+ <div class="col-md-8">
|
|
|
|
|
+ <div class="card card-secondary card-outline">
|
|
|
|
|
+ <div class="card-header">
|
|
|
|
|
+ <h3 class="card-title">Индивидуальные overrides</h3>
|
|
|
|
|
+ <div class="card-tools">
|
|
|
|
|
+ <small class="text-muted">
|
|
|
|
|
+ <span class="badge badge-success">Allow</span> — разрешить поверх роли
|
|
|
|
|
+ <span class="badge badge-danger">Deny</span> — запретить поверх роли
|
|
|
|
|
+ <span class="badge badge-secondary">Роль</span> — без override
|
|
|
|
|
+ </small>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="card-body">
|
|
|
|
|
+ @foreach($permissions as $groupName => $groupPerms)
|
|
|
|
|
+ <h6 class="text-uppercase text-muted mb-2" style="font-size:11px;letter-spacing:.1em">{{ $groupName }}</h6>
|
|
|
|
|
+ <table class="table table-sm table-bordered mb-3">
|
|
|
|
|
+ <thead>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <th>Право</th>
|
|
|
|
|
+ <th style="width:260px" class="text-center">Override</th>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ </thead>
|
|
|
|
|
+ <tbody>
|
|
|
|
|
+ @foreach($groupPerms as $key => $label)
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ {{ $label }}
|
|
|
|
|
+ <div><code style="font-size:10px">{{ $key }}</code></div>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ <td class="text-center">
|
|
|
|
|
+ <div class="d-flex justify-content-center" style="gap:6px">
|
|
|
|
|
+ <label class="mb-0">
|
|
|
|
|
+ <input type="radio" name="permissions[{{ $key }}]" value="allow"
|
|
|
|
|
+ {{ old('permissions.'.$key) === 'allow' ? 'checked' : '' }}>
|
|
|
|
|
+ <span class="badge badge-success ml-1">Allow</span>
|
|
|
|
|
+ </label>
|
|
|
|
|
+ <label class="mb-0">
|
|
|
|
|
+ <input type="radio" name="permissions[{{ $key }}]" value="deny"
|
|
|
|
|
+ {{ old('permissions.'.$key) === 'deny' ? 'checked' : '' }}>
|
|
|
|
|
+ <span class="badge badge-danger ml-1">Deny</span>
|
|
|
|
|
+ </label>
|
|
|
|
|
+ <label class="mb-0">
|
|
|
|
|
+ <input type="radio" name="permissions[{{ $key }}]" value=""
|
|
|
|
|
+ {{ ! old('permissions.'.$key) ? 'checked' : '' }}>
|
|
|
|
|
+ <span class="badge badge-secondary ml-1">Роль</span>
|
|
|
|
|
+ </label>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ @endforeach
|
|
|
|
|
+ </tbody>
|
|
|
|
|
+ </table>
|
|
|
|
|
+ @endforeach
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </form>
|
|
|
|
|
+@stop
|