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
This commit is contained in:
@@ -17,7 +17,7 @@ class ListDepartmentTeachersAction
|
||||
|
||||
// Фильтр по должности
|
||||
if (!empty($filters['position'])) {
|
||||
$query->where('teaching_position', 'like', '%' . $filters['position'] . '%');
|
||||
$query->wherePivot('teaching_position', 'like', '%' . $filters['position'] . '%');
|
||||
}
|
||||
|
||||
$teachers = $query->orderBy('teachers_departments.sort')->paginate(20)->withQueryString();
|
||||
|
||||
@@ -18,7 +18,7 @@ class ListDepartmentWorkersAction
|
||||
|
||||
// Фильтр по должности
|
||||
if (!empty($filters['position'])) {
|
||||
$query->where('position', 'like', '%' . $filters['position'] . '%');
|
||||
$query->wherePivot('position', 'like', '%' . $filters['position'] . '%');
|
||||
}
|
||||
|
||||
$workers = $query->orderBy('workers_departments.sort')->paginate(20)->withQueryString();
|
||||
|
||||
@@ -12,7 +12,7 @@ use BezhanSalleh\FilamentShield\Support\Utils;
|
||||
use BezhanSalleh\FilamentShield\Traits\HasPanelShield;
|
||||
use Filament\Models\Contracts\FilamentUser;
|
||||
use Filament\Tables\Columns\Layout\Panel;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use App\Ship\Traits\HasContainerFactory;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
@@ -23,7 +23,9 @@ use Spatie\Permission\Traits\HasRoles;
|
||||
|
||||
class User extends Authenticatable implements FilamentUser, SeoTitleInterface, SeoDescriptionInterface
|
||||
{
|
||||
use HasApiTokens, HasFactory, Notifiable, HasRoles, HasPanelShield, HasSeo;
|
||||
use HasApiTokens, HasContainerFactory, Notifiable, HasRoles, HasPanelShield, HasSeo;
|
||||
|
||||
protected static string $factory = \Database\Factories\UserFactory::class;
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
@@ -65,12 +67,14 @@ class User extends Authenticatable implements FilamentUser, SeoTitleInterface, S
|
||||
|
||||
public function departments_work(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(Department::class, 'workers_departments')->withPivot(['position']);
|
||||
return $this->belongsToMany(Department::class, 'workers_departments')
|
||||
->withPivot(['position', 'sort', 'service_email', 'service_phone', 'cabinet']);
|
||||
}
|
||||
|
||||
public function departments_teach(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(Department::class, 'teachers_departments')->withPivot(['teaching_position']);
|
||||
return $this->belongsToMany(Department::class, 'teachers_departments')
|
||||
->withPivot(['teaching_position', 'sort', 'service_email', 'service_phone', 'cabinet']);
|
||||
}
|
||||
|
||||
public function divisions(): BelongsToMany
|
||||
|
||||
+15
-6
@@ -70,18 +70,18 @@ class TeachersRelationManager extends RelationManager
|
||||
->searchable()
|
||||
->sortable(),
|
||||
|
||||
Tables\Columns\TextColumn::make('teaching_position')
|
||||
Tables\Columns\TextColumn::make('pivot.teaching_position')
|
||||
->label('Должность')
|
||||
->searchable()
|
||||
->sortable()
|
||||
->wrap(),
|
||||
|
||||
Tables\Columns\TextColumn::make('service_email')
|
||||
Tables\Columns\TextColumn::make('pivot.service_email')
|
||||
->label('Почта')
|
||||
->searchable()
|
||||
->toggleable(isToggledHiddenByDefault: true),
|
||||
|
||||
Tables\Columns\TextColumn::make('cabinet')
|
||||
Tables\Columns\TextColumn::make('pivot.cabinet')
|
||||
->label('Кабинет')
|
||||
->sortable()
|
||||
->toggleable(),
|
||||
@@ -144,14 +144,20 @@ class TeachersRelationManager extends RelationManager
|
||||
->actions([
|
||||
Tables\Actions\EditAction::make()
|
||||
->iconButton()
|
||||
->tooltip('Редактировать'),
|
||||
->tooltip('Редактировать')
|
||||
->before(function () {
|
||||
app(DepartmentCacheService::class)->clearAllCacheByModel();
|
||||
}),
|
||||
|
||||
Tables\Actions\DetachAction::make()
|
||||
->iconButton()
|
||||
->tooltip('Убрать с кафедры')
|
||||
->modalHeading('Удаление связи')
|
||||
->modalSubmitActionLabel('Убрать')
|
||||
->modalDescription('Вы уверены, что хотите убрать этого преподавателя с кафедры?'),
|
||||
->modalDescription('Вы уверены, что хотите убрать этого преподавателя с кафедры?')
|
||||
->before(function () {
|
||||
app(DepartmentCacheService::class)->clearAllCacheByModel();
|
||||
}),
|
||||
])
|
||||
->bulkActions([
|
||||
Tables\Actions\BulkActionGroup::make([
|
||||
@@ -159,7 +165,10 @@ class TeachersRelationManager extends RelationManager
|
||||
->label('Убрать выбранных')
|
||||
->modalHeading('Удаление связей')
|
||||
->modalSubmitActionLabel('Убрать')
|
||||
->modalDescription('Вы уверены, что хотите убрать выбранных преподавателей с кафедры?'),
|
||||
->modalDescription('Вы уверены, что хотите убрать выбранных преподавателей с кафедры?')
|
||||
->before(function () {
|
||||
app(DepartmentCacheService::class)->clearAllCacheByModel();
|
||||
}),
|
||||
]),
|
||||
])
|
||||
->emptyStateActions([
|
||||
|
||||
+15
-6
@@ -70,18 +70,18 @@ class WorkersRelationManager extends RelationManager
|
||||
->searchable()
|
||||
->sortable(),
|
||||
|
||||
Tables\Columns\TextColumn::make('position')
|
||||
Tables\Columns\TextColumn::make('pivot.position')
|
||||
->label('Должность')
|
||||
->searchable()
|
||||
->sortable()
|
||||
->wrap(),
|
||||
|
||||
Tables\Columns\TextColumn::make('service_email')
|
||||
Tables\Columns\TextColumn::make('pivot.service_email')
|
||||
->label('Почта')
|
||||
->searchable()
|
||||
->toggleable(isToggledHiddenByDefault: true),
|
||||
|
||||
Tables\Columns\TextColumn::make('cabinet')
|
||||
Tables\Columns\TextColumn::make('pivot.cabinet')
|
||||
->label('Кабинет')
|
||||
->sortable()
|
||||
->toggleable(),
|
||||
@@ -144,14 +144,20 @@ class WorkersRelationManager extends RelationManager
|
||||
->actions([
|
||||
Tables\Actions\EditAction::make()
|
||||
->iconButton()
|
||||
->tooltip('Редактировать'),
|
||||
->tooltip('Редактировать')
|
||||
->before(function () {
|
||||
app(DepartmentCacheService::class)->clearAllCacheByModel();
|
||||
}),
|
||||
|
||||
Tables\Actions\DetachAction::make()
|
||||
->iconButton()
|
||||
->tooltip('Убрать с кафедры')
|
||||
->modalHeading('Удаление связи')
|
||||
->modalSubmitActionLabel('Убрать')
|
||||
->modalDescription('Вы уверены, что хотите убрать этого сотрудника с кафедры?'),
|
||||
->modalDescription('Вы уверены, что хотите убрать этого сотрудника с кафедры?')
|
||||
->before(function () {
|
||||
app(DepartmentCacheService::class)->clearAllCacheByModel();
|
||||
}),
|
||||
])
|
||||
->bulkActions([
|
||||
Tables\Actions\BulkActionGroup::make([
|
||||
@@ -159,7 +165,10 @@ class WorkersRelationManager extends RelationManager
|
||||
->label('Убрать выбранных')
|
||||
->modalHeading('Удаление связей')
|
||||
->modalSubmitActionLabel('Убрать')
|
||||
->modalDescription('Вы уверены, что хотите убрать выбранных сотрудников с кафедры?'),
|
||||
->modalDescription('Вы уверены, что хотите убрать выбранных сотрудников с кафедры?')
|
||||
->before(function () {
|
||||
app(DepartmentCacheService::class)->clearAllCacheByModel();
|
||||
}),
|
||||
]),
|
||||
])
|
||||
->emptyStateActions([
|
||||
|
||||
@@ -21,6 +21,7 @@ class DepartmentCacheService extends AbstractCacheService implements CacheInterf
|
||||
{
|
||||
$this->clearCacheByPrefix(CacheKeys::DEPARTMENT_PREFIX->value.'*');
|
||||
$this->clearCacheByPrefix(CacheKeys::DEPARTMENTS_PREFIX->value.'*');
|
||||
$this->clearCacheByPrefix(CacheKeys::USER_PREFIX->value.'*');
|
||||
}
|
||||
|
||||
public function getCachedData(string $key)
|
||||
|
||||
Reference in New Issue
Block a user