Files
ntspi-app/app/Filament/Resources/DepartmentResource/RelationManagers/WorkersRelationManager.php
T
F4ilji bf77cb634c fix(departments): fix contact info editing, cache invalidation, and pivot data display
- User model: add missing pivot columns (service_email, service_phone, cabinet, sort) to departments_work() and departments_teach() withPivot
- ListDepartmentWorkersAction/TeachersAction: fix where() to wherePivot() for position filters
- Dashboard Workers/Teachers Index.vue: display validation errors in add/edit modals
- Dashboard Workers/Teachers Index.vue: add links to client person pages
- DepartmentCacheService: clear person_* cache when department data changes
- Filament WorkersRelationManager/TeachersRelationManager: fix pivot columns in table (pivot.position etc), add cache clearing on edit/detach/bulk actions
2026-09-18 01:32:27 +05:00

187 lines
9.1 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Filament\Resources\DepartmentResource\RelationManagers;
use App\Services\App\Cache\DepartmentCacheService;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables;
use Filament\Tables\Actions\AttachAction;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class WorkersRelationManager extends RelationManager
{
protected static string $relationship = 'workers';
protected static ?string $inverseRelationship = 'departments_work';
protected static ?string $title = 'Сотрудники кафедры';
public function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Section::make('Информация о должности')
->description('Основные данные о работе сотрудника на кафедре')
->schema([
Forms\Components\TextInput::make('position')
->label('Должность')
->required()
->maxLength(255)
->placeholder('Например: Заведующий кафедрой')
->helperText('Официальная должность сотрудника на кафедре'),
Forms\Components\TextInput::make('service_email')
->label('Служебная почта')
->email()
->maxLength(255)
->placeholder('example@university.edu')
->helperText('Корпоративная электронная почта'),
Forms\Components\TextInput::make('service_phone')
->label('Служебный телефон')
->tel()
->maxLength(20)
->placeholder('+7 (XXX) XXX-XX-XX')
->helperText('Формат: +7 (XXX) XXX-XX-XX')
->regex('/^\+?[0-9\s\-\(\)]{7,}$/') // Разрешаем +, цифры, пробелы, дефисы, скобки
->validationMessages([
'regex' => 'Пожалуйста, введите корректный номер телефона. Допустимые форматы: +7 (XXX) XXX-XX-XX или XXX-XX-XX',
]),
Forms\Components\TextInput::make('cabinet')
->label('Кабинет')
->maxLength(10)
->placeholder('Например: 305а')
->helperText('Номер кабинета сотрудника'),
])
->columns(2),
]);
}
public function table(Table $table): Table
{
return $table
->recordTitleAttribute('name')
->columns([
Tables\Columns\TextColumn::make('name')
->label('ФИО')
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('pivot.position')
->label('Должность')
->searchable()
->sortable()
->wrap(),
Tables\Columns\TextColumn::make('pivot.service_email')
->label('Почта')
->searchable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('pivot.cabinet')
->label('Кабинет')
->sortable()
->toggleable(),
])
->filters([
])
->headerActions([
AttachAction::make()
->preloadRecordSelect()
->recordSelectOptionsQuery(fn (Builder $query) => $query->has('userDetail'))
->form(fn (AttachAction $action): array => [
Forms\Components\Section::make('')
->schema([
$action->getRecordSelect()
->placeholder('Выбрать сотрудника')
->columnSpanFull()
->searchable()
->preload()
->helperText('Выберите сотрудника')
->required(),
Forms\Components\TextInput::make('position')
->label('Должность')
->required()
->maxLength(255)
->placeholder('Например: Заведующий кафедрой')
->helperText('Официальная должность сотрудника на кафедре'),
Forms\Components\TextInput::make('service_email')
->label('Служебная почта')
->email()
->maxLength(255)
->placeholder('example@university.edu')
->helperText('Корпоративная электронная почта'),
Forms\Components\TextInput::make('service_phone')
->label('Служебный телефон')
->tel()
->maxLength(20)
->placeholder('+7 (XXX) XXX-XX-XX')
->helperText('Формат: +7 (XXX) XXX-XX-XX')
->regex('/^\+?[0-9\s\-\(\)]{7,}$/') // Разрешаем +, цифры, пробелы, дефисы, скобки
->validationMessages([
'regex' => 'Пожалуйста, введите корректный номер телефона. Допустимые форматы: +7 (XXX) XXX-XX-XX или XXX-XX-XX',
]),
Forms\Components\TextInput::make('cabinet')
->label('Кабинет')
->maxLength(10)
->placeholder('Например: 305а')
->helperText('Номер кабинета сотрудника'),
])
->columns(2),
])
->modalSubmitActionLabel('Добавить')
->before(function () {
app(DepartmentCacheService::class)->clearAllCacheByModel();
})
])
->actions([
Tables\Actions\EditAction::make()
->iconButton()
->tooltip('Редактировать')
->before(function () {
app(DepartmentCacheService::class)->clearAllCacheByModel();
}),
Tables\Actions\DetachAction::make()
->iconButton()
->tooltip('Убрать с кафедры')
->modalHeading('Удаление связи')
->modalSubmitActionLabel('Убрать')
->modalDescription('Вы уверены, что хотите убрать этого сотрудника с кафедры?')
->before(function () {
app(DepartmentCacheService::class)->clearAllCacheByModel();
}),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DetachBulkAction::make()
->label('Убрать выбранных')
->modalHeading('Удаление связей')
->modalSubmitActionLabel('Убрать')
->modalDescription('Вы уверены, что хотите убрать выбранных сотрудников с кафедры?')
->before(function () {
app(DepartmentCacheService::class)->clearAllCacheByModel();
}),
]),
])
->emptyStateActions([
AttachAction::make()
->label('Добавить сотрудника'),
])
->reorderable('sort')
->defaultSort('sort')
->deferLoading();
}
protected function canReorder(): bool
{
return true;
}
}