Files
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 Permalink 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 TeachersRelationManager extends RelationManager
{
protected static string $relationship = 'teachers';
protected static ?string $inverseRelationship = 'departments_teach';
protected static ?string $title = 'Преподаватели кафедры';
public function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Section::make('Информация о преподавателе')
->description('Основные данные о работе преподавателя на кафедре')
->schema([
Forms\Components\TextInput::make('teaching_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.teaching_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('teaching_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(1),
])
->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('Добавить преподавателя'),
])
->defaultSort('sort')
->reorderable('sort')
->deferLoading();
}
protected function canReorder(): bool
{
return true;
}
}