schema([ TextInput::make('title') ->label('Название выпуска') ->required() ->maxLength(255) ->placeholder('Введите название выпуска журнала') ->helperText('Например: "Том 15, №3 (2023)" или специальное название выпуска'), FileUpload::make('path_file') ->label('Файл выпуска') ->required() ->acceptedFileTypes([ 'application/pdf', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/zip' ]) ->maxSize(256000) ->disk('public') ->directory('files') ->downloadable() ->helperText('Максимальный размер файла: 256MB. Допустимые форматы: PDF, DOCX, XLSX, PPTX, ZIP') ->openable(), TextInput::make('year_publication') ->label('Год публикации') ->required() ->numeric() ->minValue(1900) ->maxValue(now()->year + 1) ->placeholder('Укажите год выпуска') ->helperText('Год должен быть в диапазоне от 1900 до '.(now()->year + 1)), Toggle::make('is_active') ->label('Активный выпуск') ->default(true) ->inline(false) ->helperText('Активные выпуски отображаются на сайте'), ]); } public function table(Table $table): Table { return $table ->defaultGroup('year_publication') ->reorderable('sort') ->defaultSort('sort') ->recordTitleAttribute('title') ->columns([ Tables\Columns\TextColumn::make('title') ->label('Название выпуска') ->searchable() ->sortable() ->description(fn ($record) => $record->year_publication), Tables\Columns\IconColumn::make('is_active') ->label('Статус') ->boolean() ->trueIcon('heroicon-o-check-circle') ->falseIcon('heroicon-o-x-circle') ->trueColor('success') ->falseColor('danger'), Tables\Columns\TextColumn::make('created_at') ->label('Дата добавления') ->dateTime('d.m.Y H:i') ->sortable(), ]) ->filters([ Tables\Filters\SelectFilter::make('year_publication') ->label('Год выпуска') ->options( fn () => $this->getOwnerRecord() ->journals() ->select('year_publication') ->distinct() ->orderBy('year_publication', 'desc') ->pluck('year_publication', 'year_publication') ->toArray() ), Tables\Filters\TernaryFilter::make('is_active') ->label('Только активные') ->trueLabel('Активные') ->falseLabel('Неактивные') ->queries( true: fn (Builder $query) => $query->where('is_active', true), false: fn (Builder $query) => $query->where('is_active', false), ), ]) ->headerActions([ Tables\Actions\CreateAction::make() ->label('Добавить выпуск') ->modalHeading('Добавление нового выпуска') ->before(function () { app(AcademicJournalCacheService::class)->clearAllCacheByModel(); }), ]) ->actions([ Tables\Actions\EditAction::make() ->iconButton() ->tooltip('Редактировать') ->before(function () { app(AcademicJournalCacheService::class)->clearAllCacheByModel(); }), Tables\Actions\DeleteAction::make() ->iconButton() ->tooltip('Удалить') ->modalHeading('Удаление выпуска') ->modalDescription('Вы уверены, что хотите удалить этот выпуск?') ->before(function () { app(AcademicJournalCacheService::class)->clearAllCacheByModel(); }), ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DeleteBulkAction::make() ->label('Удалить выбранные') ->modalHeading('Удаление выпусков') ->modalDescription('Вы уверены, что хотите удалить выбранные выпуски?') ->before(function () { app(AcademicJournalCacheService::class)->clearAllCacheByModel(); }), ]), ]) ->emptyStateActions([ Tables\Actions\CreateAction::make() ->label('Добавить выпуск') ->before(function () { app(AcademicJournalCacheService::class)->clearAllCacheByModel(); }), ]) ->groups([ Tables\Grouping\Group::make('year_publication') ->label('Год публикации') ->collapsible(), ]); } }