Files
ntspi-app/app/Filament/Resources/AcademicJournalResource/RelationManagers/JournalsRelationManager.php
T

169 lines
7.3 KiB
PHP

<?php
namespace App\Filament\Resources\AcademicJournalResource\RelationManagers;
use App\Services\App\Cache\AcademicJournalCacheService;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Form;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
class JournalsRelationManager extends RelationManager
{
protected static string $relationship = 'journals';
protected static ?string $modelLabel = 'выпуск';
protected static ?string $pluralModelLabel = 'выпуски';
protected static ?string $title = 'Выпуски журнала';
public function form(Form $form): Form
{
return $form
->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(),
]);
}
}