рефакторинг: перенос модулей, доработка формы, добавлен модуль "менеджеры"

This commit is contained in:
Thekindbull 2025-09-16 22:29:40 +08:00
parent c876701fda
commit e0b417a5f9
42 changed files with 431 additions and 184 deletions

View File

@ -4,40 +4,40 @@
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Agent\Agent;
use App\Models\Agent\AgentStatus;
use App\Models\Company\CompanyAdmin;
use App\Models\City;
use Modules\Main\Models\Agent\Agent;
use Modules\Main\Models\Agent\AgentStatus;
use Modules\Main\Models\Company\CompanyAdmin;
use Modules\Main\Models\City;
class AgentsTableController extends Controller
{
{
public function index(Request $request)
{
{
$user = auth()->user();
$admin = CompanyAdmin::where('user_id', $user->id);
if ($admin->count())
{
{
$admin = $admin->first();
$agents = Agent::where('company_id', $admin->company_id);
switch ( $request->status )
{
{
case AgentStatus::DISMISSED:
$agents->whereNotNull('deleted_at');
break;
default:
$agents->withTrashed();
}
}
return view('company.agents.table', [
'agents' => $agents->get(),
'status' => $request->status,
'cities' => City::all()
])->with('statuses', AgentStatus::class);
}
}
else
{
{
abort(code: 401);
return;
}
}
}
}

View File

@ -5,10 +5,10 @@
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Company\Company;
use App\Models\Company\Details;
use App\Models\Company\CompanyAdmin;
use App\Models\Company\CompanyType;
use Modules\Main\Models\Company\Company;
use Modules\Main\Models\Company\Details;
use Modules\Main\Models\Company\CompanyAdmin;
use Modules\Main\Models\Company\CompanyType;
class DetailsController extends Controller
{
public function index($companyId = null)

View File

@ -4,9 +4,8 @@
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Company\CompanyAdmin;
use App\Models\Agent\Agent;
use App\Models\User;
use Modules\Main\Models\Company\CompanyAdmin;
use Modules\Main\Models\Agent\Agent;
use App\Notifications\UserRegistered;

View File

@ -4,11 +4,9 @@
use Livewire\Component;
use Livewire\WithPagination;
use Livewire\WithoutUrlPagination;
use App\Models\Company\CompanyAdmin;
use App\Models\Agent\Agent;
use App\Models\Agent\AgentStatus;
use App\Models\Deal\Deal;
use Modules\Main\Models\Company\CompanyAdmin;
use Modules\Main\Models\Agent\Agent;
use Modules\Main\Models\Agent\AgentStatus;
class AgentsTable extends Component
{

View File

@ -4,24 +4,24 @@
use Livewire\Component;
use App\Models\User\UserRole;
use App\Models\User\Role;
use Modules\User\Models\UserRole;
use Modules\User\Models\Role;
class MainMenu extends Component
{
{
public $userId;
public function mount()
{
{
$this->userId = auth()->user()->id;
}
}
public function render()
{
{
return view('livewire.main-menu', [
'userRoles' => UserRole::where('user_id', $this->userId)->pluck('role_id')->toArray(),
'roles' => Role::class
'roles' => Role::class
]);
}
}
}

View File

@ -8,9 +8,9 @@
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use App\Models\User;
use Modules\User\Models\User;
use App\Models\Deal\Deal;
use App\Models\Agent\Agent;
use Modules\Main\Models\Agent\Agent;
class Client extends User
{
protected $table = 'users';

View File

@ -4,16 +4,14 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\User\UserRole;
use App\Models\User\Role;
use Illuminate\Notifications\Notifiable;
use Modules\User\Models\User;
use Modules\User\Models\UserRole;
use Modules\User\Models\Role;
use Modules\Contracts\Models\Contract;
use Modules\Main\Models\Complex;
use Modules\Main\Models\Agent\Agent;
use Illuminate\Notifications\Notifiable;
use Modules\Bitrix\Traits\Bitrixable;
class Deal extends Model
{
use HasFactory, Notifiable, Bitrixable;
@ -31,7 +29,7 @@ public function complex()
}
public function user()
{
return $this->belongsTo(\App\Models\User::class, 'client_id');
return $this->belongsTo(User::class, 'client_id');
}
public function agent()
{

View File

@ -4,9 +4,7 @@
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\City;
use Modules\Main\Models\City;
class AdminCitiesController extends Controller
{
public function index(Request $request)

View File

@ -0,0 +1,20 @@
<?php
namespace Modules\Admin\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Modules\CityManager\Models\CityManager;
use Modules\Main\Models\City;
class AdminCityManagersController extends Controller
{
public function index(Request $request)
{
return view('admin::cities.managers', [
'managers' => CityManager::with(['user', 'city'])->get(),
'cities' => City::all(),
'filter' => $request->filter
]);
}
}

View File

@ -2,15 +2,10 @@
namespace Modules\Admin\Http\Controllers;
use Modules\Post\Models\Post;
use Modules\Post\Models\PostCategory;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Company\Company;
use App\Models\Company\CompanyStatus;
use Modules\Main\Models\Company\Company;
use Modules\Main\Models\Company\CompanyStatus;
class AdminCompaniesController extends Controller
{
public function index(Request $request)

View File

@ -5,8 +5,8 @@
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Complex;
use App\Models\City;
use Modules\Main\Models\Complex;
use Modules\Main\Models\City;
class AdminComplexesController extends Controller
{

View File

@ -1,14 +1,11 @@
<?php
namespace Modules\Admin\Http\Controllers;
use Modules\Admin\Models\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User\UserRole;
use App\Models\User\Role;
use App\Models\User;
use Modules\User\Models\UserRole;
use Modules\User\Models\Role;
use Modules\User\Models\User;
class AdminController extends Controller
{
public function index()

View File

@ -8,9 +8,9 @@
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User\UserRole;
use App\Models\User\Role;
use App\Models\User;
use Modules\User\Models\UserRole;
use Modules\User\Models\Role;
use Modules\User\Models\User;
class AdminUsersController extends Controller
{

View File

@ -5,8 +5,8 @@
use Livewire\Component;
use App\Models\User\UserRole;
use App\Models\User\Role;
use Modules\User\Models\UserRole;
use Modules\User\Models\Role;
class AdminMenu extends Component
{

View File

@ -3,9 +3,9 @@
namespace Modules\Admin\Http\Livewire;
use Livewire\Component;
use App\Models\Company\Company;
use App\Models\Complex;
use App\Models\Agent\Agent;
use Modules\Main\Models\Company\Company;
use Modules\Main\Models\Complex;
use Modules\Main\Models\Agent\Agent;
class Payments extends Component
{
public $newValue;

View File

@ -32,6 +32,7 @@
Route::post('/admin/cities/create', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'create'])->name('admin.cities.create');
Route::post('/admin/cities/{city}/delete', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'delete'])->name('admin.cities.delete');
Route::post('/admin/cities/{city}/restore', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'restore'])->withTrashed()->name('admin.cities.restore');
Route::get('/admin/cities/managers', [Modules\Admin\Http\Controllers\AdminCityManagersController::class, 'index'])->name('admin.cities.managers');
Route::get('/admin/complexes', [Modules\Admin\Http\Controllers\AdminComplexesController::class, 'index'])->name('admin.complexes');
Route::get('/admin/complexes/{complex}/edit', [Modules\Admin\Http\Controllers\AdminComplexesController::class, 'edit'])->name('admin.complexes.edit');

View File

@ -0,0 +1,67 @@
@php($title = 'Менеджеры')
@extends('layouts.admin')
@section('content')
<style>
.collapsing {
transition: none !important;
}
</style>
<div class="d-flex mb-3">
<form class="p-2 border rounded-3 border-1 bg-white" method="GET" action="{{ route('admin.cities.managers') }}">
<input type="radio" class="btn-check" name="filter" value="all" id="option_all" autocomplete="off"
onclick="this.form.submit()" {{ $filter == 'all' || !$filter ? 'checked' : '' }}>
<label class="btn p-2 fs-5" for="option_all">Все</label>
@foreach ($cities as $city)
<input type="radio" class="btn-check" name="filter" value="{{ $city->id }}"
id="option_city_{{ $city->id }}" autocomplete="off" onclick="this.form.submit()"
{{ $filter == $city->id ? 'checked' : '' }}>
<label class="btn p-2 fs-5" for="option_city_{{ $city->id }}">{{ $city->name }}</label>
@endforeach
</form>
<div class="ms-auto p-2">
<button class="btn btn-primary py-2 px-3 fs-5" data-bs-toggle="modal" data-bs-target="#createCityManagerModal">
<i class="bi bi-plus"></i> Добавить менеджера
</button>
</div>
</div>
<div class="fs-5 bg-light p-0 m-0 border border-1 rounded-4 py-3">
</div>
<!-- Modal -->
<div class="modal fade" id="createCityManagerModal" tabindex="-1" aria-labelledby="createCityModalLabel"
aria-hidden="true">
<form class="modal-dialog modal-dialog-centered" action="{{ route('admin.cities.create') }}" method="post">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="createCityModalLabel">Новый менеджер</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="my-3">
@csrf
<div class="form-floating">
<select name="city" class="form-select" id="floatingSelectCity" aria-label="Укажите город">
@foreach ($cities as $city)
<option value="{{ $city->id }}" @if ($filter == $city->id) selected @endif>
{{ $city->name }}</option>
@endforeach
</select>
<label for="floatingSelectCity">Укажите город</label>
</div>
@livewire('user-selector')
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary">Добавить</button>
</div>
</div>
</form>
</div>
@endsection

View File

@ -23,6 +23,10 @@ class="nav-link d-flex align-items-center gap-2 fs-5 border rounded-4"
class="nav-link d-flex align-items-center gap-2 fs-5 border rounded-4"
href="{{ route('admin.complexes', ['filter' => 'actual']) }}">ЖК</a>
</li>
<li class="nav-item text-center m-2"><a
class="nav-link d-flex align-items-center gap-2 fs-5 border rounded-4"
href="{{ route('admin.cities.managers') }}">Менеджеры</a>
</li>
<li>
<h6 class="dropdown-header text-uppercase">Агентства</h6>
</li>

View File

@ -11,8 +11,11 @@
*/
public function up(): void
{
Schema::create('city_managers', function (Blueprint $table) {
Schema::create('city_managers', function (Blueprint $table)
{
$table->id();
$table->foreignId('city_id')->references('id')->on('cities')->onDelete('cascade');
$table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}

View File

@ -11,10 +11,9 @@
*/
public function up(): void
{
Schema::create('mains', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
DB::table('roles')->insert([
['id' => 5, 'name' => 'City manager'],
]);
}
/**
@ -22,6 +21,6 @@ public function up(): void
*/
public function down(): void
{
Schema::dropIfExists('mains');
DB::table('roles')->where('id', 5)->delete();
}
};

View File

@ -1,11 +1,24 @@
<?php
namespace App\Modules\CityManager\Models;
namespace Modules\CityManager\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\User;
use Modules\Main\Models\City;
class CityManager extends Model
{
use HasFactory;
protected $fillable = [
'city_id',
'user_id'
];
public function user()
{
return $this->belongsTo(User::class, 'user_id');
}
public function city()
{
return $this->belongsTo(City::class, 'city_id');
}
}

View File

@ -1,27 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('client_create_forms', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('client_create_forms');
}
};

View File

@ -11,6 +11,8 @@ class ClientCreateLivewire extends Component
public $availableAgents;
public $complexes;
public $maxClientsCount;
public $maxClientPhonesCount;
/////////////////////
public $agent;
public $clients;
@ -25,6 +27,7 @@ public function mount()
$this->complexes = GetAvailableComplexes();
$this->availableAgents = GetAvailableAgents();
$this->maxClientsCount = 2;
$this->maxClientPhonesCount = 2;
$this->clientLabels = ['Основной контакт', 'Супруг/супруга'];
$this->status = FormStatus::NEW;
@ -69,7 +72,7 @@ public function deleteContact($index = false)
{
unset($this->clients[$index]);
$this->clients = array_values($this->clients);
$this->updateCurrentClientIndex($index - 1);
$this->setCurrentClient($index - 1);
}
}
public function setCurrentClient($index)
@ -106,8 +109,10 @@ public function saveClient()
}
public function addPhoneForClient()
{
$this->currentClient['phones'][] = '';
if (count($this->currentClient['phones']) < $this->maxClientPhonesCount)
{
$this->currentClient['phones'][] = '';
}
}
public function render()
{

View File

@ -9,21 +9,20 @@
</div>
<div class="w-100" wire:loading.remove wire:target="save, resetData, back">
@if ($status == FormStatus::NEW || $status == FormStatus::READY)
<div class="h4 pb-2 mb-4 fw-bold ">
<small>Добавить клиента</small>
</div>
<ul class="nav nav-tabs d-flex align-items-end border-0 pb-0">
@foreach ($clients as $clientIndex => $clientItem)
<li
class="nav-item overflow-hidden @if ($clientIndex == $currentClientIndex) rounded-top border-top border-end border-start bg-light @else m-1 bg-secondary-subtle rounded rouded-5 @endif">
<a class="nav-link me-1 border-0 @if ($clientIndex == $currentClientIndex) active text-primary @else p-1 text-dark @endif"
<a class="nav-link me-1 border-0 @if ($clientIndex == $currentClientIndex) active text-primary @else py-1 text-dark @endif"
aria-current="page" href="#" wire:click="setCurrentClient({{ $clientIndex }})">
<i class="bi bi-person-standing"></i>
@if (array_key_exists($clientIndex, $clientLabels))
{{ $clientLabels[$clientIndex] }}
@else
Контакт {{ $clientIndex + 1 }}
@endif
<span class="d-none d-xl-inline">
@if (array_key_exists($clientIndex, $clientLabels))
{{ $clientLabels[$clientIndex] }}
@else
Контакт {{ $clientIndex + 1 }}
@endif
</span>
</a>
</li>
@endforeach
@ -41,11 +40,11 @@ class="bi bi-person-fill-add" viewBox="0 0 16 16">
</li>
@endif
</ul>
<div class="bg-light border border-1 rounded-bottom-4 mb-2" style="margin-top:-1px">
<div class="p-2">
<div class="row mb-2">
<div class="bg-light border border-1 rounded-bottom-4 mb-2 pb-2" style="margin-top:-1px">
<div class="mt-3">
<div class="row mx-2 g-2">
<div class="col-12 col-xl-6">
<div class="form-floating mb-3">
<div class="form-floating mb-3 m-xl-0">
<input wire:model.live="currentClient.firstName" id="currentClient.firstName"
type="text"
class="form-control rounded-4 @error('currentClient.firstName') is-invalid @enderror"
@ -60,7 +59,7 @@ class="form-control rounded-4 @error('currentClient.firstName') is-invalid @ende
</div>
</div>
<div class="col-12 col-xl-6">
<div class="form-floating mb-3">
<div class="form-floating mb-3 m-xl-0">
<input wire:model.live="currentClient.secondName" id="currentClient.secondName"
type="text"
class="form-control rounded-4 @error('currentClient.secondName') is-invalid @enderror"
@ -75,9 +74,7 @@ class="form-control rounded-4 @error('currentClient.secondName') is-invalid @end
</div>
</div>
</div>
@foreach ($currentClient['phones'] as $phoneKey => $phone)
<div class="row my-1">
@foreach ($currentClient['phones'] as $phoneKey => $phone)
<div class="col-12 hstack gap-2">
<div class="form-floating me-auto w-100">
<input wire:model="currentClient.phone.{{ $phoneKey }}"
@ -85,14 +82,16 @@ class="form-control rounded-4 @error('currentClient.secondName') is-invalid @end
class="form-control rounded-4 @error('currentClient.phone.{{ $phoneKey }}') is-invalid @enderror"
name="currentClient.phone.{{ $phoneKey }}" required autocomplete="phone"
placeholder="Телефон клиента">
<label for="currentClient.phone.{{ $phoneKey }}">Телефон</label>
<label for="currentClient.phone.{{ $phoneKey }}">Телефон
{{ count($currentClient['phones']) > 1 ? ' ' . ($phoneKey + 1) : '' }}</label>
@error('currentClient.phone.{{ $phoneKey }}')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
@if (count($currentClient['phones']) == $phoneKey + 1)
@if (count($currentClient['phones']) == $phoneKey + 1 &&
count($this->currentClient['phones']) < $this->maxClientPhonesCount)
<a class="" href="#" wire:click="addPhoneForClient"
title="Добавить еще один телефон для клиента">
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30"
@ -105,25 +104,28 @@ class="form-control rounded-4 @error('currentClient.phone.{{ $phoneKey }}') is-i
</a>
@endif
</div>
@endforeach
<div class="col-12">
@if ($currentClientIndex == 0 && count($clients) <= 2)
<div class="form-check form-switch">
<input class="form-check-input" wire:click="toggleSecondClient" type="checkbox"
role="switch" id="switchCheckChecked"
@if (count($clients) == 2) checked @endif>
<label class="form-check-label" for="switchCheckChecked">Добавить контакт
супруга/супруги</label>
</div>
@endif
@if ($currentClientIndex > 0)
<div class="text-end">
<a wire:click="deleteContact" class="text-primary"
style="text-decoration: underline dotted;" href="#">
Удалить контакт</a>
</div>
@endif
</div>
@endforeach
</div>
</div>
@if ($currentClientIndex == 0 && count($clients) <= 2)
<div class="form-check form-switch mx-2 my-1">
<input class="form-check-input" wire:click="toggleSecondClient" type="checkbox" role="switch"
id="switchCheckChecked" @if (count($clients) == 2) checked @endif>
<label class="form-check-label" for="switchCheckChecked">Добавить контакт
супруга/супруги</label>
</div>
@endif
@if ($currentClientIndex > 0)
<div class="mx-3 pb-2 text-end">
<a wire:click="deleteContact" class="text-primary" style="text-decoration: underline dotted;"
href="#">
Удалить контакт</a>
</div>
@endif
</div>
<div class="form-floating mb-3">
<select wire:model.live="client.complexId"

View File

@ -3,14 +3,11 @@
namespace Modules\Contracts\Http\Livewire;
use Livewire\Component;
use Modules\Main\Models\Company\Company;
use Modules\Main\Models\Complex;
use Modules\Main\Models\Agent\Agent;
use App\Models\Deal\Deal;
use Modules\Contracts\Models\Contract;
use App\Models\Deal\ContractStatus;
use App\Models\User\UserRole;
use App\Models\User\Role;
use Modules\Contracts\Models\ContractStatus;
use Modules\User\Models\UserRole;
use Modules\User\Models\Role;
use Modules\Main\Models\Company\CompanyAdmin;
class ContractsTableLivewire extends Component

View File

@ -6,17 +6,14 @@
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Modules\Main\Models\Company\Company;
use App\Models\User;
use App\Models\User\UserRole;
use App\Models\User\Role;
use Modules\User\Models\User;
use Modules\User\Models\UserRole;
use Modules\User\Models\Role;
use App\Models\Deal\Deal;
use App\Notifications\AgentCreated;
use Modules\Payment\Traits\Paymentable;
use Modules\Bitrix\Traits\Bitrixable;
class Agent extends Model
{
use HasFactory;

View File

@ -5,8 +5,8 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\User\UserRole;
use App\Models\User\Role;
use Modules\User\Models\UserRole;
use Modules\User\Models\Role;
class CompanyAdmin extends Model
{

View File

@ -0,0 +1,5 @@
<?php
return [
];

View File

@ -0,0 +1,17 @@
<?php
namespace Modules\User\Http\Controllers;
use Modules\User\Models\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
return view('user::index');
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace Modules\User\Http\Livewire;
use Livewire\Component;
use Modules\Main\Models\Agent\Agent;
use Modules\Contracts\Models\Contract;
use Modules\Contracts\Models\ContractStatus;
use Modules\User\Models\UserRole;
use Modules\User\Models\Role;
use Modules\Main\Models\Company\CompanyAdmin;
class UserSelectorLivewire extends Component
{
public $search;
public function render()
{
return view('user::livewire.search.selector');
}
}

View File

@ -1,17 +1,18 @@
<?php
namespace App\Models\User;
namespace Modules\User\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
{
use HasFactory;
public const SUPER_ADMIN = '1';
public const SUPER_ADMIN = '1';
public const COMPANY_ADMIN = '2';
public const AGENT = '3';
public const CLIENT = '4';
public const AGENT = '3';
public const CLIENT = '4';
public const CITY_MANAGER = '5';
}
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Models;
namespace Modules\User\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
@ -10,7 +10,7 @@
use App\Models\ForcedPassword;
class User extends Authenticatable
{
{
use HasApiTokens, HasFactory, Notifiable, ForcedPassword;
/**
@ -42,16 +42,16 @@ class User extends Authenticatable
*/
protected $casts = [
'email_verified_at' => 'datetime',
'password' => 'hashed',
'password' => 'hashed',
];
public function getPartialsName()
{
{
$name = explode(' ', $this->name);
return [
'firstName' => (array_key_exists(0, $name) ? $name[0] : ''),
'firstName' => (array_key_exists(0, $name) ? $name[0] : ''),
'secondName' => (array_key_exists(1, $name) ? $name[1] : ''),
'familyName' => (array_key_exists(2, $name) ? $name[2] : '')
];
}
}
}

View File

@ -1,11 +1,11 @@
<?php
namespace App\Models\User;
namespace Modules\User\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\User;
use App\Models\User\Role;
use Modules\User\Models\User;
use Modules\User\Models\Role;
class UserRole extends Model
{

View File

@ -0,0 +1,71 @@
<?php
namespace Modules\User\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Blade;
use Livewire\Livewire;
class ModuleServiceProvider extends ServiceProvider
{
protected string $moduleName = 'User';
public function register()
{
$this->app->register(RouteServiceProvider::class);
}
public function boot()
{
$this->registerViews();
$this->registerLivewireViews();
$this->registerMigrations();
$this->registerConfig();
$this->registerComponent();
$this->registerLivewire();
}
protected function registerViews()
{
$moduleViewsPath = __DIR__ . '/../Views';
$this->loadViewsFrom(
$moduleViewsPath,
strtolower($this->moduleName)
);
}
protected function registerLivewireViews()
{
$moduleViewsPath = __DIR__ . '/../Views/livewire';
$this->loadViewsFrom(
$moduleViewsPath,
strtolower($this->moduleName)
);
}
protected function registerMigrations()
{
$this->loadMigrationsFrom(
app_path('Modules/' . $this->moduleName . '/Database/Migrations')
);
}
protected function registerConfig()
{
$path = app_path('Modules/' . $this->moduleName . '/Config/config.php');
$this->mergeConfigFrom(
$path,
strtolower($this->moduleName)
);
}
protected function registerLivewire()
{
Livewire::component('user-selector', \Modules\User\Http\Livewire\UserSelectorLivewire::class);
}
protected function registerComponent()
{
//Blade::component('<name>', \Modules\<NAME>\Http\Components\<NAME>::class);
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace Modules\User\Providers;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
public function map()
{
$this->registerWebRoutes();
}
protected function registerWebRoutes()
{
//Add Web Routes with web Guard
Route::middleware('web')
//Set Default Controllers Namespace
->namespace('Modules\\User\\Http\\Controllers')
->group(app_path('Modules/User/Routes/web.php'));
}
}

View File

@ -0,0 +1,13 @@
<?php
use Illuminate\Support\Facades\Route;
use Modules\User\Http\Controllers\UserController;
Route::middleware(['auth'])->group(function() {
Route::get('/user', [UserController::class, 'index']);
Route::middleware(['hasAccess'])->group(function() {
/** Routes that need to be protected - Маршруты которые нужно защитить */
});
});

View File

@ -0,0 +1,4 @@
@extends('layouts.app')
@section('content')
<h1> Example views </h1>
@endsection

View File

@ -0,0 +1,22 @@
<div>
<div class="position-relative">
<div class="position-relative">
<div class="position-absolute top-20" style="left: 10px;top:20%">
<i class="bi bi-search"></i>
</div>
<input type="text" wire:model.blur="search" class="form-control py-2" placeholder="Поиск пользователя..."
autocomplete="false" style="padding-right: 40px; padding-left: 35px;">
<div class="position-absolute" style="right: 10px;top:20%">
<button wire:click="clearSearch" class="btn-close" type="button"></button>
</div>
</div>
<div class="position-absolute w-100 z-3">
<div class="border rounded shadow bg-light-subtle" style="width: inherit;">
<div class="d-grid justify-content-center align-item-center p-3">
<i class="bi bi-person fs-2 text-center"></i>
<p class="mb-0 fs-6 fw-semibold">Пользователь не найден</p>
</div>
</div>
</div>
</div>
</div>

View File

@ -13,8 +13,8 @@
|
*/
'defaults' => [
'guard' => 'web',
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
@ -35,9 +35,9 @@
|
*/
'guards' => [
'guards' => [
'web' => [
'driver' => 'session',
'driver' => 'session',
'provider' => 'users',
],
],
@ -59,10 +59,10 @@
|
*/
'providers' => [
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
'model' => Modules\User\Models\User::class,
],
// 'users' => [
@ -90,11 +90,11 @@
|
*/
'passwords' => [
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_reset_tokens',
'expire' => 60,
'table' => 'password_reset_tokens',
'expire' => 60,
'throttle' => 60,
],
],

View File

@ -45,6 +45,7 @@
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Добавить клиента</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body" style="">

View File

@ -7,16 +7,16 @@
<div class="vstack">
@foreach ($clients as $client)
<?php
$cities = [];
$complexesNames = [];
$filterRow = [];
$clientDeals = $client->deals;
foreach ($clientDeals as $deal) {
$filterRow[] = 'filter[deal_id][]=' . $deal->id;
$cities[] = $deal->complex->city->name;
$complexesNames[] = $deal->complex->name;
}
$filterRow = implode('&', $filterRow);
$cities = array_unique($cities);
$cities = implode(', ', array: $cities);
$complexesNames = array_unique($complexesNames);
$complexesNames = implode(', ', array: $complexesNames);
$dealsWithContracts = $client->deals()->whereHas('contract');
?>
@ -27,7 +27,7 @@
</div>
<div class="col">
{{ $cities }}
{{ $complexesNames }}
</div>
<div class="col-3 align-middle">

View File

@ -36,6 +36,9 @@ class="list-group-item list-group-item-action p-3 bg-white rounded border border
</div>
<div class="col-12 col-lg-6">
<div class="p-2 px-sm-4 py-sm-3 bg-primary border rounded-3 mx-auto" style="min-height:30em;">
<div class="h4 pb-2 mb-2 fw-bold ">
<small>Добавить клиента</small>
</div>
<livewire:ClientCreator />
</div>
</div>