This commit is contained in:
f4ilji
2025-03-11 15:52:42 +05:00
parent 3385dc5807
commit 2fa59350cf
14 changed files with 279 additions and 81 deletions
+65 -34
View File
@@ -25,6 +25,7 @@ use Filament\Forms\Components\SpatieTagsInput;
use Filament\Forms\Components\Tabs;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\ToggleButtons;
use Filament\Forms\Form;
use Filament\Resources\Components\Tab;
use Filament\Resources\Pages\CreateRecord;
@@ -124,46 +125,76 @@ class PostForm
Toggle::make('is_slider_enabled')
->label('Добавить новый слайд')
->live()
->hidden(fn (string $context): bool => $context === 'edit')
->dehydrated(false)
->default(false),
Section::make()
->schema([
Forms\Components\TextInput::make('slide.title')
->label('Заголовок слайда'),
Forms\Components\Textarea::make('slide.content')
->label('Текст слайда'),
FileUpload::make('slide.image')
->label('Изображение')
->image()
->optimize('webp')
->resize(50)
->disk('public')
->directory('images')
->imageEditor()
->required(),
Grid::make(2)->schema([
Toggle::make('disable_link_text')
->label('Отключить текст кнопки (ссылка будет открываться при нажатии на слайд)')
->live()
->inline(false)
->dehydrated(false)
->default(false),
Forms\Components\TextInput::make('slide.link_text')
->default('Читать')
->label('Текст кнопки')
->disabled(fn (Forms\Get $get) => $get('disable_link_text')),
Forms\Components\Section::make('Информация слайда')->schema([
Forms\Components\TextInput::make('slide.title')
->label('Заголовок слайда'),
Forms\Components\Textarea::make('slide.content')
->label('Текст слайда'),
Forms\Components\Grid::make()->schema([
ColorPicker::make('slide.color_theme')
->label('Цвет текста')
->default('#ffffff')
->required(),
Forms\Components\ToggleButtons::make('slide.settings.text_position')
->options([
'left' => 'Текст слева',
'center' => 'Текст по середине',
'right' => 'Текст справа'
])
->inline()->default('left')->grouped()
->label('Позиция текста на слайде'),
]),
Forms\Components\Grid::make()->schema([
Toggle::make('active_button')
->label('Использовать кнопку для ссылки (Ссылка будет открываться при нажатии на слайд)')
->inline(false)
->live()
->afterStateHydrated(function (Toggle $component, $state, $get) {
$component->state(true);
})
->dehydrated(false),
Forms\Components\TextInput::make('slide.settings.link_text')
->default('Читать')
->label('Текст кнопки')
->disabled(fn (Forms\Get $get) => !$get('active_button'))
]),
]),
Forms\Components\Section::make('Изображение')->schema([
FileUpload::make('slide.image.url')
->label('Изображение')
->image()
->optimize('webp')
->resize(50)
->disk('public')
->directory('images')
->imageEditor()
->required(),
ToggleButtons::make('slide.image.shading')->inline()->grouped()->label('Уровень затемнения изображения')->options([
'1' => 'Без затемнения',
'0.7' => 'Слабое затемнение',
'0.5' => 'Среднее затемнение',
'0.3' => 'Сильное затемнение',
]),
]),
Forms\Components\Section::make('Общая часть')->schema([
Forms\Components\Grid::make()->schema([
DateTimePicker::make('slide.end_time')
->label('Слайд действует до')
->native()
->displayFormat('d/m/Y')
->minDate(Carbon::now())
->maxDate(Carbon::now()->addMonth()),
]),
]),
DateTimePicker::make('slide.end_time')
->label('Слайд действует до')
->native()
->displayFormat('d/m/Y')
->minDate(Carbon::now())
->maxDate(Carbon::now()->addWeek()),
])
->disabled(fn (Forms\Get $get) => !$get('is_slider_enabled')) // Отключаем секцию, если Toggle выключен
->hidden(fn (Forms\Get $get) => !$get('is_slider_enabled')), // Скрываем секцию, если Toggle выключен
])->hidden(fn (string $context): bool => $context === 'edit'),
]),
]),
])
]);
@@ -124,8 +124,13 @@ class MainSliderResource extends Resource
Toggle::make('active_button')
->label('Использовать кнопку для ссылки (Ссылка будет открываться при нажатии на слайд)')
->inline(false)
->default(true)
->default(true) // Проверяем, есть ли текст в link_text
->live()
->afterStateHydrated(function (Toggle $component, $state, $get) {
if ($state === null && !empty($get('settings.link_text'))) {
$component->state(true); // Устанавливаем значение по умолчанию
}
})
->dehydrated(false),
Forms\Components\TextInput::make('settings.link_text')
->default('Читать')
@@ -156,12 +161,13 @@ class MainSliderResource extends Resource
->label('Слайд начинается с')
->native()
->displayFormat('d/m/Y')
->minDate(Carbon::now()->subDay())
->maxDate(Carbon::now()->addWeek()),
->default(Carbon::now())
->maxDate(Carbon::now()->addWeeks(2)),
DateTimePicker::make('end_time')
->label('Слайд действует до')
->native()
->displayFormat('d/m/Y')
->default(Carbon::now()->addWeeks(2))
->minDate(Carbon::now())
->maxDate(Carbon::now()->addMonth()),
]),
@@ -60,7 +60,7 @@ class CreatePost extends CreateRecord
$this->slideData['start_time'] = $this->record->publish_at;
$sliderDTO = MainSliderDTO::fromArray($this->slideData);
(new PostSliderService($sliderDTO, $this->record->slug))->create();
(new PostSliderService($sliderDTO, $this->record))->create();
}
protected function generateSeo(): void
@@ -5,6 +5,7 @@ namespace App\Filament\Resources\PostResource\Pages;
use App\Dto\MainSliderDTO;
use App\Enums\PostStatus;
use App\Filament\Resources\PostResource;
use App\Models\Post;
use App\Services\Filament\Domain\Posts\PostDataProcessor;
use App\Services\Filament\Domain\Posts\PostNotificationService;
use App\Services\Filament\Domain\Posts\PostSeoGenerator;
@@ -23,6 +24,12 @@ class EditPost extends EditRecord
protected array $slideData;
protected function mutateFormDataBeforeFill(array $data): array
{
$post = Post::query()->with(['seo', 'mainSlider'])->find($data['id']);
$data['slide'] = $post->mainSlider->toArray() ?? null;
return $data;
}
protected function mutateFormDataBeforeSave(array $data): array
{
@@ -61,7 +68,7 @@ class EditPost extends EditRecord
$this->slideData['start_time'] = $this->record->publish_at;
$sliderDTO = MainSliderDTO::fromArray($this->slideData);
(new PostSliderService($sliderDTO, $this->record->slug))->update();
(new PostSliderService($sliderDTO, $this->record))->update();
}
protected function generateSeo(): void