schema([ Forms\Components\Section::make('Служебная информация') ->description('Данные о сотруднике в рамках подразделения') ->schema([ Forms\Components\TextInput::make('administrativePosition') ->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('Служебный телефон') ->placeholder('+7 (XXX) XXX-XX-XX') ->helperText('Формат: +7 (XXX) 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') ->reorderable('sort') ->defaultSort('sort') ->columns([ Tables\Columns\TextColumn::make('sort') ->label('№') ->sortable() ->toggleable(isToggledHiddenByDefault: true), Tables\Columns\TextColumn::make('name') ->label('ФИО') ->searchable() ->sortable() ->weight('medium') ->description(fn ($record) => $record->service_email), Tables\Columns\TextColumn::make('administrativePosition') ->label('Должность') ->searchable() ->wrap() ->description(fn ($record) => $record->cabinet), Tables\Columns\TextColumn::make('service_phone') ->label('Телефон') ->searchable() ->toggleable(), ]) ->filters([ ]) ->headerActions([ AttachAction::make() ->label('Добавить сотрудника') ->modalHeading('Добавление сотрудника') ->modalSubmitActionLabel('Добавить') ->preloadRecordSelect() ->recordSelectOptionsQuery(fn (Builder $query) => $query->has('userDetail')) ->form(fn (AttachAction $action): array => [ Forms\Components\Section::make() ->schema([ $action->getRecordSelect() ->label('Сотрудник') ->placeholder('Выберите сотрудника') ->searchable() ->preload() ->required() ->columnSpanFull(), Forms\Components\TextInput::make('administrativePosition') ->label('Административная должность') ->required() ->columnSpanFull() ->maxLength(255) ->placeholder('Например: Руководитель отдела') ->helperText('Официальная должность в подразделении'), Forms\Components\TextInput::make('service_email') ->label('Служебная почта') ->email() ->columnSpanFull() ->maxLength(255) ->placeholder('example@university.edu') ->helperText('Корпоративная электронная почта в подразделении'), Forms\Components\TextInput::make('service_phone') ->label('Служебный телефон') ->columnSpanFull() ->placeholder('+7 (XXX) XXX-XX-XX') ->helperText('Формат: +7 (XXX) XXX-XX-XX'), Forms\Components\TextInput::make('cabinet') ->label('Кабинет') ->columnSpanFull() ->maxLength(10) ->placeholder('Например: 305а') ->helperText('Номер кабинета в подразделении'), ]) ->columns(2), ]) ->before(function () { app(DivisionCacheService::class)->clearAllCacheByModel(); }) ]) ->actions([ Tables\Actions\EditAction::make() ->iconButton() ->tooltip('Редактировать данные сотрудника') ->before(function () { app(DivisionCacheService::class)->clearAllCacheByModel(); }), Tables\Actions\DetachAction::make() ->iconButton() ->tooltip('Убрать из подразделения') ->modalHeading('Подтверждение удаления') ->modalSubmitActionLabel('Убрать') ->modalDescription('Вы уверены, что хотите убрать этого сотрудника из подразделения?') ->before(function () { app(DivisionCacheService::class)->clearAllCacheByModel(); }) ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DetachBulkAction::make() ->label('Убрать выбранных') ->modalHeading('Подтверждение удаления') ->modalSubmitActionLabel('Убрать') ->modalDescription('Вы уверены, что хотите убрать выбранных сотрудников из подразделения?') ->before(function () { app(DivisionCacheService::class)->clearAllCacheByModel(); }), ]), ]) ->emptyStateActions([ AttachAction::make() ->label('Добавить сотрудника'), ]) ->persistFiltersInSession() ->paginated([10, 25, 50, 100]) ->striped(); } protected function canReorder(): bool { return true; } }