Many fixes
This commit is contained in:
@@ -5,14 +5,17 @@ namespace App\Modules\Clients\Controllers;
|
||||
use App\Controllers\BaseController;
|
||||
use App\Modules\Clients\Models\ClientModel;
|
||||
use App\Services\AccessService;
|
||||
use App\Services\ModuleSubscriptionService;
|
||||
|
||||
class Clients extends BaseController
|
||||
{
|
||||
protected ClientModel $clientModel;
|
||||
protected ModuleSubscriptionService $subscriptionService;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->clientModel = new ClientModel();
|
||||
$this->subscriptionService = service('moduleSubscription');
|
||||
}
|
||||
|
||||
public function index()
|
||||
@@ -98,8 +101,9 @@ class Clients extends BaseController
|
||||
}
|
||||
|
||||
$data = [
|
||||
'title' => 'Добавить клиента',
|
||||
'client' => null,
|
||||
'title' => 'Добавить клиента',
|
||||
'client' => null,
|
||||
'crm_active' => $this->subscriptionService->isModuleActive('crm'),
|
||||
];
|
||||
|
||||
return $this->renderTwig('@Clients/form', $data);
|
||||
@@ -154,8 +158,9 @@ class Clients extends BaseController
|
||||
}
|
||||
|
||||
$data = [
|
||||
'title' => 'Редактировать клиента',
|
||||
'client' => $client,
|
||||
'title' => 'Редактировать клиента',
|
||||
'client' => $client,
|
||||
'crm_active' => $this->subscriptionService->isModuleActive('crm'),
|
||||
];
|
||||
|
||||
return $this->renderTwig('@Clients/form', $data);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
{% block content %}
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="col-lg-10">
|
||||
<div class="card shadow-sm">
|
||||
<div class="card-header bg-white py-3">
|
||||
<div class="d-flex align-items-center">
|
||||
@@ -19,55 +19,106 @@
|
||||
<div class="card-body">
|
||||
{{ forms.form_open(client ? base_url('/clients/update/' ~ client.id) : base_url('/clients/create')) }}
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="name" class="form-label fw-bold">Имя / Название *</label>
|
||||
<input type="text" name="name" id="name" class="form-control {{ errors.name ? 'is-invalid' : '' }}"
|
||||
value="{{ old.name ?? client.name ?? '' }}" required autofocus>
|
||||
{% if errors.name %}
|
||||
<div class="invalid-feedback">{{ errors.name }}</div>
|
||||
{% endif %}
|
||||
<div class="form-text">ФИО клиента или название компании</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="email" class="form-label">Email</label>
|
||||
<input type="email" name="email" id="email" class="form-control {{ errors.email ? 'is-invalid' : '' }}"
|
||||
value="{{ old.email ?? client.email ?? '' }}">
|
||||
{% if errors.email %}
|
||||
<div class="invalid-feedback">{{ errors.email }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="phone" class="form-label">Телефон</label>
|
||||
<input type="tel" name="phone" id="phone" class="form-control {{ errors.phone ? 'is-invalid' : '' }}"
|
||||
value="{{ old.phone ?? client.phone ?? '' }}">
|
||||
{% if errors.phone %}
|
||||
<div class="invalid-feedback">{{ errors.phone }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<label for="notes" class="form-label">Заметки</label>
|
||||
<textarea name="notes" id="notes" rows="4" class="form-control {{ errors.notes ? 'is-invalid' : '' }}"
|
||||
placeholder="Дополнительная информация о клиенте...">{{ old.notes ?? client.notes ?? '' }}</textarea>
|
||||
{% if errors.notes %}
|
||||
<div class="invalid-feedback">{{ errors.notes }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-end gap-2">
|
||||
<a href="{{ base_url('/clients') }}" class="btn btn-secondary">Отмена</a>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fa-solid fa-check me-2"></i>
|
||||
{{ client ? 'Сохранить изменения' : 'Добавить клиента' }}
|
||||
{# Табы #}
|
||||
<ul class="nav nav-tabs mb-4" role="tablist">
|
||||
<li class="nav-item">
|
||||
<button class="nav-link active" data-bs-toggle="tab" data-bs-target="#tab-main" type="button">
|
||||
<i class="fa-solid fa-building me-2"></i>Основное
|
||||
</button>
|
||||
</li>
|
||||
{% if crm_active %}
|
||||
<li class="nav-item">
|
||||
<button class="nav-link" data-bs-toggle="tab" data-bs-target="#tab-contacts" type="button">
|
||||
<i class="fa-solid fa-users me-2"></i>Контакты
|
||||
<span class="badge bg-primary ms-1" id="contacts-count">0</span>
|
||||
</button>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
{# Содержимое табов #}
|
||||
<div class="tab-content">
|
||||
{# Таб "Основное" #}
|
||||
<div class="tab-pane fade show active" id="tab-main" role="tabpanel">
|
||||
<div class="mb-3">
|
||||
<label for="name" class="form-label fw-bold">Имя / Название *</label>
|
||||
<input type="text" name="name" id="name" class="form-control {{ errors.name ? 'is-invalid' : '' }}"
|
||||
value="{{ old.name ?? client.name ?? '' }}" required autofocus>
|
||||
{% if errors.name %}
|
||||
<div class="invalid-feedback">{{ errors.name }}</div>
|
||||
{% endif %}
|
||||
<div class="form-text">ФИО клиента или название компании</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="email" class="form-label">Email</label>
|
||||
<input type="email" name="email" id="email" class="form-control {{ errors.email ? 'is-invalid' : '' }}"
|
||||
value="{{ old.email ?? client.email ?? '' }}">
|
||||
{% if errors.email %}
|
||||
<div class="invalid-feedback">{{ errors.email }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="phone" class="form-label">Телефон</label>
|
||||
<input type="tel" name="phone" id="phone" class="form-control {{ errors.phone ? 'is-invalid' : '' }}"
|
||||
value="{{ old.phone ?? client.phone ?? '' }}">
|
||||
{% if errors.phone %}
|
||||
<div class="invalid-feedback">{{ errors.phone }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<label for="notes" class="form-label">Заметки</label>
|
||||
<textarea name="notes" id="notes" rows="4" class="form-control {{ errors.notes ? 'is-invalid' : '' }}"
|
||||
placeholder="Дополнительная информация о клиенте...">{{ old.notes ?? client.notes ?? '' }}</textarea>
|
||||
{% if errors.notes %}
|
||||
<div class="invalid-feedback">{{ errors.notes }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# Таб "Контакты" (только при активном CRM) #}
|
||||
{% if crm_active %}
|
||||
<div class="tab-pane fade" id="tab-contacts" role="tabpanel">
|
||||
<input type="hidden" name="customer_id" value="{{ client.id }}">
|
||||
|
||||
{# Скрипт инициализации контактов подключаем в конце #}
|
||||
<div id="contacts-container"
|
||||
data-client-id="{{ client.id }}"
|
||||
data-api-url="{{ base_url('/crm/contacts') }}"
|
||||
data-csrf-token="{{ csrf_hash }}">
|
||||
{# Таблица контактов загружается через AJAX #}
|
||||
<div class="text-center py-5">
|
||||
<div class="spinner-border text-primary" role="status">
|
||||
<span class="visually-hidden">Загрузка...</span>
|
||||
</div>
|
||||
<p class="text-muted mt-2">Загрузка контактов...</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-end gap-2 pt-3 border-top mt-4">
|
||||
<a href="{{ base_url('/clients') }}" class="btn btn-secondary">Отмена</a>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fa-solid fa-check me-2"></i>
|
||||
{{ client ? 'Сохранить изменения' : 'Добавить клиента' }}
|
||||
</button>
|
||||
</div>
|
||||
{{ forms.form_close() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
{# Inline-редактирование контактов #}
|
||||
{% if crm_active %}
|
||||
<script src="{{ base_url('/assets/js/modules/contacts.js') }}"></script>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block content %}
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<div>
|
||||
<h1 class="h3 mb-0">{{ title }}</h1>
|
||||
<h1 class="h3 mb-0"><i class="fa-solid fa-building text-success me-2"></i> {{ title }}</h1>
|
||||
<p class="text-muted mb-0">Управление клиентами вашей организации</p>
|
||||
</div>
|
||||
<div class="d-flex gap-2">
|
||||
|
||||
Reference in New Issue
Block a user