maked admin creator livewire

This commit is contained in:
developer 2026-01-15 11:11:27 +08:00
parent 3a37207be3
commit 9eb03d9ede
8 changed files with 220 additions and 2 deletions

View File

@ -8,6 +8,8 @@
use Modules\Main\Models\Company\CompanyStatus;
use Modules\Main\Models\Agent\Agent;
use Modules\Main\Models\Company\CompanyAdmin;
class AdminCompaniesController extends Controller
{
public function index(Request $request)
@ -30,7 +32,7 @@ public function edit(Company $company)
return view('admin::companies.edit', [
'company' => $company,
'companyAgentsRelation' => Agent::where('company_id', $company->id)->get(),
'companyAdminsRelation' => []
'companyAdminsRelation' => CompanyAdmin::where('company_id', $company->id)->get(),
]);
}

View File

@ -36,6 +36,53 @@
</form>
</div>
<div class="fs-5 bg-light p-0 m-0 border border-1 rounded-4 mt-3 pb-3">
<div class="d-flex align-items-center m-3">
<h4 class="fw-bold">Администраторы</h4>
<div class="ms-auto d-flex gap-3">
<a href="" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#createCompanyAdminModal">
<i class="bi bi-person-plus-fill"></i> <span class="d-none d-lg-inline">Добавить</span>
</a>
</div>
</div>
<table class="table m-0">
<thead>
<tr scope="col">
<th>ФИО
<th>Когда назначен
<th>
</tr>
</thead>
<tbody class=" ">
@foreach ($companyAdminsRelation as $companyAdmin)
<tr scope="row">
<td class="align-middle">
{{ $companyAdmin->user->name }}
</td>
<td class="align-middle">
{{ $companyAdmin->created_at?->diffForHumans() }}
</td>
<td class="text-end">
<div class="dropdown" style="">
<button class="btn btn-light" type="button" id="dropdownMenuButton"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="bi bi-three-dots-vertical"></i>
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<form method="post"
action="{{ route('admin.users.role.delete', ['userRole' => 999]) }}">
@csrf
<button class="dropdown-item" type="submit">Удалить</button>
</form>
</div>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="fs-5 bg-light p-0 m-0 border border-1 rounded-4 mt-3 pb-3">
<div class="d-flex align-items-center m-3">
<h4 class="fw-bold">Агенты</h4>
@ -63,7 +110,7 @@
{{ $companyAgent->user->name }}
</td>
<td class="align-middle">
{{ $companyAgent->created_at->diffForHumans() }}
{{ $companyAgent->created_at?->diffForHumans() }}
</td>
<td class="text-end">
<div class="dropdown" style="">
@ -86,4 +133,5 @@
</table>
</div>
@livewire('company.agent.create', ['containerId' => 'createAgentModal', 'companyId' => $company->id])
@livewire('company.admin.create', ['containerId' => 'createCompanyAdminModal', 'companyId' => $company->id])
@endsection

View File

@ -0,0 +1,60 @@
<?php
namespace Modules\Main\Http\Controllers\Company;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Modules\Main\Models\Company\Company;
use Modules\Main\Models\Company\CompanyAdmin;
use Modules\User\Models\User;
use App\Notifications\UserRegistered;
class CreateAdminController extends Controller
{
public function __invoke(Request $request)
{
$company = Company::findOrFail($request->company_id);
if ($request->user()->cannot('update', $company))
{
abort(403, 'Unauthorized action');
}
$user = User::where('email', $request->email)->orWhere('phone', $request->phone)->first();
if ($user)
{
if ($user->id !== auth()->id()) //если это не текущий пользователь-админ, который хочет себя сделать агентом, то ошибка
{
if (CompanyAdmin::where('user_id', $user->id)->count()) // и если этот пользователь уже админ
{
return back()->with('error', __('Admin is not unique'));
}
}
}
else
{
$user = $user = User::create($request->all());
}
if ($user)
{
CompanyAdmin::where('user_id', $user->id)->delete(); //на случай, если где-то этот пользователь уже был админом
$agent = CompanyAdmin::create([
'user_id' => $user->id,
'company_id' => $company->id
]);
}
if ($request->sendToEmail)
{
$user->setForcedPassword();
}
else
{
$password = $user->setForcedPassword(false);
return back()->with('success', 'Пароль для пользователя установлен: ' . $password);
}
return back();
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace Modules\Main\Http\Livewire;
use Livewire\Component;
use Modules\Main\Models\Agent\Agent;
use Modules\Main\Models\Company\Company;
use Modules\Main\Models\Company\CompanyAdmin;
class CreateCompanyAdminLivewire extends Component
{
public $availableCompanies;
public $companyId;
public $containerId;
public function mount($containerId = 'createCompanyAdminModal')
{
$this->containerId = $containerId;
$availableCompaniesIds = GetAvailableAgents('Builder')->pluck('company_id');
$this->availableCompanies = Company::whereIn('id', $availableCompaniesIds)->get();
if ($this->availableCompanies->count() == 1) {
$this->companyId = $this->availableCompanies->first()->id;
};
}
public function render()
{
return view('main::company.livewire.createAdmin', [
]);
}
}

View File

@ -5,6 +5,7 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Modules\User\Models\User;
use Modules\User\Models\UserRole;
use Modules\User\Models\Role;
@ -19,6 +20,10 @@ public function company()
{
return $this->belongsTo(Company::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
protected static function booted(): void
{
static::created(function (CompanyAdmin $admin)

View File

@ -67,6 +67,7 @@ protected function registerLivewire()
{
//Livewire::component('<name>', \Modules\<NAME>\Http\Livewire\<NAME>::class);
Livewire::component('company.agent.create', \Modules\Main\Http\Livewire\CreateAgentLivewire::class);
Livewire::component('company.admin.create', \Modules\Main\Http\Livewire\CreateCompanyAdminLivewire::class);
}
protected function registerComponent()

View File

@ -22,6 +22,9 @@
{
Route::get('/company/details/{company?}', [Modules\Main\Http\Controllers\Company\DetailsController::class, 'index'])->name('company.details');
Route::post('/company/{company}/details/', [Modules\Main\Http\Controllers\Company\DetailsController::class, 'store'])->name('company.details.store');
Route::post('/companies/admins/store/', Modules\Main\Http\Controllers\Company\CreateAdminController::class)->name('company.admin.store');
Route::get('/agents/table', [Modules\Main\Http\Controllers\Company\AgentsTableController::class, 'index'])->name('company.agents.table');
//Route::post('/company/agents/store/', Modules\Main\Http\Controllers\Company\CreateAgentController::class)->name('company.agents.store');
Route::post('/companies/agents/store/', Modules\Main\Http\Controllers\Company\CreateAgentController::class)->name('company.agents.store');

View File

@ -0,0 +1,67 @@
<div>
<div class="modal fade" id="{{ $containerId }}" tabindex="-1" aria-labelledby="createCompanyAdminModalLabel"
aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<form class="modal-content" action="{{ route('company.admin.store') }}" method="post">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">Новый администратор</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
@if($availableCompanies->count() == 0)
<div class="modal-body">
Нет доступных агентств для продолжения работы
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">ОК</button>
</div>
@else
<div class="modal-body">
@csrf
@if($availableCompanies->count() > 1)
<div class="mb-3">
<label for="companyId" class="form-label">Агентство</label>
<select wire:model="companyId" class="form-select @error('companyId') is-invalid @enderror"
id="companyId" name="company_id" aria-label="Агентство">
<option selected></option>
@foreach ($availableCompanies as $company)
<option value="{{ $company['id'] }}">
{{ $company['name'] }}
</option>
@endforeach
</select>
</div>
@elseif($availableCompanies->count() == 1)
<input type="hidden" class="form-control" id="company_id" name="company_id"
value="{{ $companyId }}">
@endif
<div class="mb-3">
<label for="adminName" class="form-label">Полное имя (ФИО)</label>
<input type="text" class="form-control" id="adminName" name="name">
</div>
<div class="mb-3">
<label for="adminEmail" class="form-label">Электронная почта</label>
<input type="text" class="form-control" id="adminEmail" name="email">
</div>
<div class="mb-3">
<label for="adminPhone" class="form-label">Телефон</label>
<input type="text" class="form-control" id="adminPhone" name="phone">
</div>
<div class="mb-3 form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="sendEmailSwitch"
name="sendToEmail" checked>
<label class="form-check-label" for="sendEmailSwitch">Отправить учетные данные на электронную
почту</label>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<input type="submit" class="btn btn-primary" value="Добавить">
</div>
@endif
</form>
</div>
</div>
</div>